diff -r 02c04d2c8fd8 -r ac1eacb3aa33 src/js/model.js --- a/src/js/model.js Sun Nov 12 22:07:33 2017 +0100 +++ b/src/js/model.js Wed Sep 04 17:32:50 2024 +0200 @@ -1,837 +1,943 @@ - /* js is where data is stored in a standard form, whatever the serializer */ //TODO: Separate Project-specific data from Source +import _ from "lodash"; +import jQuery from "jquery"; -IriSP.Model = (function (ns) { - - function pad(n, x, b) { - b = b || 10; - var s = (x).toString(b); - while (s.length < n) { - s = "0" + s; - } - return s; - } - - function rand16(n) { - return pad(n, Math.floor(Math.random()*Math.pow(16,n)), 16); +const Model = function (ns) { + function pad(n, x, b) { + b = b || 10; + var s = x.toString(b); + while (s.length < n) { + s = "0" + s; } - - var uidbase = rand16(8) + "-" + rand16(4) + "-", uidincrement = Math.floor(Math.random()*0x10000); - - var charsub = [ - '[aáàâä]', - '[cç]', - '[eéèêë]', - '[iíìîï]', - '[oóòôö]', - '[uùûü]' - ]; - - var removeChars = [ - String.fromCharCode(768), String.fromCharCode(769), String.fromCharCode(770), String.fromCharCode(771), String.fromCharCode(807), - "{", "}", "(", ")", "[", "]", "【", "】", "、", "・", "‥", "。", "「", "」", "『", "』", "〜", ":", "!", "?", " ", - ",", " ", ";", "(", ")", ".", "*", "+", "\\", "?", "|", "{", "}", "[", "]", "^", "#", "/" - ]; - -var Model = {}, - _SOURCE_STATUS_EMPTY = Model._SOURCE_STATUS_EMPTY = 0, - _SOURCE_STATUS_WAITING = Model._SOURCE_STATUS_WAITING = 1, - _SOURCE_STATUS_READY = Model._SOURCE_STATUS_READY = 2, - extendPrototype = Model.extendPrototype = function(toClass, fromClass) { - var fromP = fromClass.prototype, - toP = toClass.prototype; - for (var k in fromP) { - if (fromP.hasOwnProperty(k)) { - toP[k] = fromP[k]; - } + return s; + } + + function rand16(n) { + return pad(n, Math.floor(Math.random() * Math.pow(16, n)), 16); + } + + var uidbase = rand16(8) + "-" + rand16(4) + "-", + uidincrement = Math.floor(Math.random() * 0x10000); + + var charsub = ["[aáàâä]", "[cç]", "[eéèêë]", "[iíìîï]", "[oóòôö]", "[uùûü]"]; + + var removeChars = [ + String.fromCharCode(768), + String.fromCharCode(769), + String.fromCharCode(770), + String.fromCharCode(771), + String.fromCharCode(807), + "{", + "}", + "(", + ")", + "[", + "]", + "【", + "】", + "、", + "・", + "‥", + "。", + "「", + "」", + "『", + "』", + "〜", + ":", + "!", + "?", + " ", + ",", + " ", + ";", + "(", + ")", + ".", + "*", + "+", + "\\", + "?", + "|", + "{", + "}", + "[", + "]", + "^", + "#", + "/", + ]; + + var Model = {}, + _SOURCE_STATUS_EMPTY = (Model._SOURCE_STATUS_EMPTY = 0), + _SOURCE_STATUS_WAITING = (Model._SOURCE_STATUS_WAITING = 1), + _SOURCE_STATUS_READY = (Model._SOURCE_STATUS_READY = 2), + extendPrototype = (Model.extendPrototype = function (toClass, fromClass) { + var fromP = fromClass.prototype, + toP = toClass.prototype; + for (var k in fromP) { + if (fromP.hasOwnProperty(k)) { + toP[k] = fromP[k]; } - }, - getUID = Model.getUID = function() { - return uidbase + pad(4, (++uidincrement % 0x10000), 16) + "-" + rand16(4) + "-" + rand16(6) + rand16(6); - }, - isLocalURL = Model.isLocalURL = function(url) { - var matches = url.match(/^(\w+:)\/\/([^/]+)/); - if (matches) { - return(matches[1] === document.location.protocol && matches[2] === document.location.host); - } - return true; - }, - regexpFromTextOrArray = Model.regexpFromTextOrArray = function(_textOrArray, _testOnly, _iexact) { - var _testOnly = _testOnly || false, - _iexact = _iexact || false; - function escapeText(_text) { - return _text.replace(/([\\\*\+\?\|\{\[\}\]\(\)\^\$\.\#\/])/gm, '\\$1'); - } - var _source = - typeof _textOrArray === "string" + } + }), + getUID = (Model.getUID = function () { + return ( + uidbase + + pad(4, ++uidincrement % 0x10000, 16) + + "-" + + rand16(4) + + "-" + + rand16(6) + + rand16(6) + ); + }), + isLocalURL = (Model.isLocalURL = function (url) { + var matches = url.match(/^(\w+:)\/\/([^/]+)/); + if (matches) { + return ( + matches[1] === document.location.protocol && + matches[2] === document.location.host + ); + } + return true; + }), + regexpFromTextOrArray = (Model.regexpFromTextOrArray = function ( + _textOrArray, + _testOnly, + _iexact + ) { + var _testOnly = _testOnly || false, + _iexact = _iexact || false; + function escapeText(_text) { + return _text.replace(/([\\\*\+\?\|\{\[\}\]\(\)\^\$\.\#\/])/gm, "\\$1"); + } + var _source = + typeof _textOrArray === "string" ? escapeText(_textOrArray) - : ns._(_textOrArray).map(escapeText).join("|"), - _flags = 'im'; - if (!_testOnly) { - _source = '(' + _source + ')'; - _flags += 'g'; - } - if (_iexact) { - _source = '^' + _source + '$'; - } - return new RegExp( _source, _flags); - }, - fullTextRegexps = Model.fullTextRegexps = function(_text) { - var remsrc = "[\\" + removeChars.join("\\") + "]", - remrx = new RegExp(remsrc,"gm"), - txt = _text.toLowerCase().replace(remrx,""), - res = [], - charsrx = ns._(charsub).map(function(c) { - return new RegExp(c); - }), - src = ""; - for (var j = 0; j < txt.length; j++) { - if (j) { - src += remsrc + "*"; - } - var l = txt[j]; - ns._(charsub).each(function(v, k) { - l = l.replace(charsrx[k], v); - }); - src += l; + : _(_textOrArray).map(escapeText).join("|"), + _flags = "im"; + if (!_testOnly) { + _source = "(" + _source + ")"; + _flags += "g"; + } + if (_iexact) { + _source = "^" + _source + "$"; + } + return new RegExp(_source, _flags); + }), + fullTextRegexps = (Model.fullTextRegexps = function (_text) { + var remsrc = "[\\" + removeChars.join("\\") + "]", + remrx = new RegExp(remsrc, "gm"), + txt = _text.toLowerCase().replace(remrx, ""), + res = [], + charsrx = _(charsub).map(function (c) { + return new RegExp(c); + }), + src = ""; + for (var j = 0; j < txt.length; j++) { + if (j) { + src += remsrc + "*"; } - return "(" + src + ")"; - }, - isoToDate = Model.isoToDate = function(_str) { - // http://delete.me.uk/2005/03/iso8601.html - var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; - var d = _str.match(new RegExp(regexp)); - - var offset = 0; - var date = new Date(d[1], 0, 1); - - if (d[3]) { date.setMonth(d[3] - 1); } - if (d[5]) { date.setDate(d[5]); } - if (d[7]) { date.setHours(d[7]); } - if (d[8]) { date.setMinutes(d[8]); } - if (d[10]) { date.setSeconds(d[10]); } - if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); } - if (d[14]) { - offset = (Number(d[16]) * 60) + Number(d[17]); - offset *= ((d[15] == '-') ? 1 : -1); - } - - offset -= date.getTimezoneOffset(); - time = (Number(date) + (offset * 60 * 1000)); - var _res = new Date(); - _res.setTime(Number(time)); - return _res; - }, - dateToIso = Model.dateToIso = function(_d) { - var d = _d ? new Date(_d) : new Date(); - return d.getUTCFullYear()+'-' - + pad(2, d.getUTCMonth()+1)+'-' - + pad(2, d.getUTCDate())+'T' - + pad(2, d.getUTCHours())+':' - + pad(2, d.getUTCMinutes())+':' - + pad(2, d.getUTCSeconds())+'Z' ; - }; + var l = txt[j]; + _(charsub).each(function (v, k) { + l = l.replace(charsrx[k], v); + }); + src += l; + } + return "(" + src + ")"; + }), + isoToDate = (Model.isoToDate = function (_str) { + // http://delete.me.uk/2005/03/iso8601.html + var regexp = + "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; + var d = _str.match(new RegExp(regexp)); + + var offset = 0; + var date = new Date(d[1], 0, 1); -/* - * List is a class for a list of elements (e.g. annotations, medias, etc. that each have a distinct ID) - */ -var List = Model.List = function(_directory) { + if (d[3]) { + date.setMonth(d[3] - 1); + } + if (d[5]) { + date.setDate(d[5]); + } + if (d[7]) { + date.setHours(d[7]); + } + if (d[8]) { + date.setMinutes(d[8]); + } + if (d[10]) { + date.setSeconds(d[10]); + } + if (d[12]) { + date.setMilliseconds(Number("0." + d[12]) * 1000); + } + if (d[14]) { + offset = Number(d[16]) * 60 + Number(d[17]); + offset *= d[15] == "-" ? 1 : -1; + } + + offset -= date.getTimezoneOffset(); + const time = Number(date) + offset * 60 * 1000; + var _res = new Date(); + _res.setTime(Number(time)); + return _res; + }), + dateToIso = (Model.dateToIso = function (_d) { + var d = _d ? new Date(_d) : new Date(); + return ( + d.getUTCFullYear() + + "-" + + pad(2, d.getUTCMonth() + 1) + + "-" + + pad(2, d.getUTCDate()) + + "T" + + pad(2, d.getUTCHours()) + + ":" + + pad(2, d.getUTCMinutes()) + + ":" + + pad(2, d.getUTCSeconds()) + + "Z" + ); + }); + + /* + * List is a class for a list of elements (e.g. annotations, medias, etc. that each have a distinct ID) + */ + var List = (Model.List = function (_directory) { Array.call(this); this.directory = _directory; this.idIndex = []; this.__events = {}; if (typeof _directory == "undefined") { - console.trace(); - throw "Error : new List(directory): directory is undefined"; + console.trace(); + throw "Error : new List(directory): directory is undefined"; } - var _this = this; - this.on("clear-search", function() { - _this.searching = false; - _this.regexp = undefined; - _this.forEach(function(_element) { - _element.found = undefined; - }); - _this.trigger("search-cleared"); + var _this = this; + this.on("clear-search", function () { + _this.searching = false; + _this.regexp = undefined; + _this.forEach(function (_element) { + _element.found = undefined; + }); + _this.trigger("search-cleared"); }); -}; + }); -List.prototype = new Array(); + List.prototype = new Array(); -List.prototype.hasId = function(_id) { - return ns._(this.idIndex).include(_id); -}; + List.prototype.hasId = function (_id) { + return _(this.idIndex).includes(_id); + }; -/* On recent browsers, forEach and map are defined and do what we want. - * Otherwise, we'll use the Underscore.js functions - */ -if (typeof Array.prototype.forEach === "undefined") { - List.prototype.forEach = function(_callback) { - var _this = this; - ns._(this).forEach(function(_value, _key) { - _callback(_value, _key, _this); - }); + /* On recent browsers, forEach and map are defined and do what we want. + * Otherwise, we'll use the Underscore.js functions + */ + if (typeof Array.prototype.forEach === "undefined") { + List.prototype.forEach = function (_callback) { + var _this = this; + _(this).forEach(function (_value, _key) { + _callback(_value, _key, _this); + }); }; -}; + } -if (typeof Array.prototype.map === "undefined") { - List.prototype.map = function(_callback) { - var _this = this; - return ns._(this).map(function(_value, _key) { - return _callback(_value, _key, _this); - }); + if (typeof Array.prototype.map === "undefined") { + List.prototype.map = function (_callback) { + var _this = this; + return _(this).map(function (_value, _key) { + return _callback(_value, _key, _this); + }); }; -}; + } -List.prototype.pluck = function(_key) { - return this.map(function(_value) { - return _value[_key]; + List.prototype.pluck = function (_key) { + return this.map(function (_value) { + return _value[_key]; }); -}; + }; -/* We override Array's filter function because it doesn't return an List - */ -List.prototype.filter = function(_callback) { + /* We override Array's filter function because it doesn't return an List + */ + List.prototype.filter = function (_callback) { var _this = this, - _res = new List(this.directory); - _res.addElements(ns._(this).filter(function(_value, _key) { + _res = new List(this.directory); + _res.addElements( + _(this).filter(function (_value, _key) { return _callback(_value, _key, _this); - })); + }) + ); return _res; -}; + }; -List.prototype.slice = function(_start, _end) { + List.prototype.slice = function (_start, _end) { var _res = new List(this.directory); _res.addElements(Array.prototype.slice.call(this, _start, _end)); return _res; -}; + }; -List.prototype.splice = function(_start, _end) { + List.prototype.splice = function (_start, _end) { var _res = new List(this.directory); _res.addElements(Array.prototype.splice.call(this, _start, _end)); this.idIndex.splice(_start, _end); return _res; -}; + }; -/* Array has a sort function, but it's not as interesting as Underscore.js's sortBy - * and won't return a new List - */ -List.prototype.sortBy = function(_callback) { + /* Array has a sort function, but it's not as interesting as Underscore.js's sortBy + * and won't return a new List + */ + List.prototype.sortBy = function (_callback) { var _this = this, - _res = new List(this.directory); - _res.addElements(ns._(this).sortBy(function(_value, _key) { + _res = new List(this.directory); + _res.addElements( + _(this).sortBy(function (_value, _key) { return _callback(_value, _key, _this); - })); + }) + ); return _res; -}; + }; -/* Title and Description are basic information for (almost) all element types, - * here we can search by these criteria - */ -List.prototype.searchByTitle = function(_text, _iexact) { + /* Title and Description are basic information for (almost) all element types, + * here we can search by these criteria + */ + List.prototype.searchByTitle = function (_text, _iexact) { var _iexact = _iexact || false, - _rgxp = regexpFromTextOrArray(_text, true, _iexact); - return this.filter(function(_element) { - return _rgxp.test(_element.title); + _rgxp = regexpFromTextOrArray(_text, true, _iexact); + return this.filter(function (_element) { + return _rgxp.test(_element.title); }); -}; + }; -List.prototype.searchByDescription = function(_text, _iexact) { + List.prototype.searchByDescription = function (_text, _iexact) { var _iexact = _iexact || false, - _rgxp = regexpFromTextOrArray(_text, true, _iexact); - return this.filter(function(_element) { - return _rgxp.test(_element.description); + _rgxp = regexpFromTextOrArray(_text, true, _iexact); + return this.filter(function (_element) { + return _rgxp.test(_element.description); }); -}; + }; -List.prototype.searchByTextFields = function(_text, _iexact) { + List.prototype.searchByTextFields = function (_text, _iexact) { var _iexact = _iexact || false, - _rgxp = regexpFromTextOrArray(_text, true, _iexact); - return this.filter(function(_element) { - var keywords = (_element.keywords || _element.getTagTexts() || []).join(", "); - return _rgxp.test(_element.description) || _rgxp.test(_element.title) || _rgxp.test(keywords); + _rgxp = regexpFromTextOrArray(_text, true, _iexact); + return this.filter(function (_element) { + var keywords = (_element.keywords || _element.getTagTexts() || []).join( + ", " + ); + return ( + _rgxp.test(_element.description) || + _rgxp.test(_element.title) || + _rgxp.test(keywords) + ); }); -}; + }; -List.prototype.search = function(_text) { + List.prototype.search = function (_text) { if (!_text) { - this.trigger("clear-search"); - return this; + this.trigger("clear-search"); + return this; } this.searching = true; this.trigger("search", _text); var rxsource = fullTextRegexps(_text), - rgxp = new RegExp(rxsource,"im"); - this.regexp = new RegExp(rxsource,"gim"); - var res = this.filter(function(_element, _k) { - var titlematch = rgxp.test(_element.title), - descmatch = rgxp.test(_element.description), - _isfound = !!(titlematch || descmatch); - _element.found = _isfound; - _element.trigger(_isfound ? "found" : "not-found"); - return _isfound; + rgxp = new RegExp(rxsource, "im"); + this.regexp = new RegExp(rxsource, "gim"); + var res = this.filter(function (_element, _k) { + var titlematch = rgxp.test(_element.title), + descmatch = rgxp.test(_element.description), + _isfound = !!(titlematch || descmatch); + _element.found = _isfound; + _element.trigger(_isfound ? "found" : "not-found"); + return _isfound; }); - this.trigger(res.length ? "found" : "not-found",res); + this.trigger(res.length ? "found" : "not-found", res); return res; -}; + }; -List.prototype.searchByTags = function(_text) { + List.prototype.searchByTags = function (_text) { if (!_text) { - this.trigger("clear-search"); - return this; + this.trigger("clear-search"); + return this; } this.searching = true; this.trigger("search", _text); var rxsource = fullTextRegexps(_text), - rgxp = new RegExp(rxsource,"im"); - this.regexp = new RegExp(rxsource,"gim"); - var res = this.filter(function(_element, _k) { - var _isfound = rgxp.test(_element.getTagTexts()); - _element.found = _isfound; - _element.trigger(_isfound ? "found" : "not-found"); - return _isfound; + rgxp = new RegExp(rxsource, "im"); + this.regexp = new RegExp(rxsource, "gim"); + var res = this.filter(function (_element, _k) { + var _isfound = rgxp.test(_element.getTagTexts()); + _element.found = _isfound; + _element.trigger(_isfound ? "found" : "not-found"); + return _isfound; }); - this.trigger(res.length ? "found" : "not-found",res); + this.trigger(res.length ? "found" : "not-found", res); return res; -}; + }; -List.prototype.getTitles = function() { - return this.map(function(_el) { - return _el.title; + List.prototype.getTitles = function () { + return this.map(function (_el) { + return _el.title; }); -}; + }; -List.prototype.addId = function(_id) { + List.prototype.addId = function (_id) { var _el = this.directory.getElement(_id); if (!this.hasId(_id) && typeof _el !== "undefined") { - this.idIndex.push(_id); - Array.prototype.push.call(this, _el); + this.idIndex.push(_id); + Array.prototype.push.call(this, _el); } -}; + }; -List.prototype.push = function(_el) { + List.prototype.push = function (_el) { if (typeof _el === "undefined") { - return; + return; } - var _index = (ns._(this.idIndex).indexOf(_el.id)); + var _index = _(this.idIndex).indexOf(_el.id); if (_index === -1) { - this.idIndex.push(_el.id); - Array.prototype.push.call(this, _el); + this.idIndex.push(_el.id); + Array.prototype.push.call(this, _el); } else { - this[_index] = _el; + this[_index] = _el; } -}; + }; -List.prototype.addIds = function(_array) { + List.prototype.addIds = function (_array) { var _l = _array.length, - _this = this; - ns._(_array).forEach(function(_id) { - _this.addId(_id); + _this = this; + _(_array).forEach(function (_id) { + _this.addId(_id); }); -}; + }; -List.prototype.addElements = function(_array) { + List.prototype.addElements = function (_array) { var _this = this; - ns._(_array).forEach(function(_el) { - _this.push(_el); + _(_array).forEach(function (_el) { + _this.push(_el); }); -}; + }; -List.prototype.removeId = function(_id, _deleteFromDirectory) { + List.prototype.removeId = function (_id, _deleteFromDirectory) { var _deleteFromDirectory = _deleteFromDirectory || false, - _index = (ns._(this.idIndex).indexOf(_id)); + _index = _(this.idIndex).indexOf(_id); if (_index !== -1) { - this.splice(_index,1); + this.splice(_index, 1); } if (_deleteFromDirectory) { - delete this.directory.elements[_id]; + delete this.directory.elements[_id]; } -}; + }; -List.prototype.removeElement = function(_el, _deleteFromDirectory) { + List.prototype.removeElement = function (_el, _deleteFromDirectory) { var _deleteFromDirectory = _deleteFromDirectory || false; this.removeId(_el.id); -}; + }; -List.prototype.removeIds = function(_list, _deleteFromDirectory) { + List.prototype.removeIds = function (_list, _deleteFromDirectory) { var _deleteFromDirectory = _deleteFromDirectory || false, - _this = this; - ns._(_list).forEach(function(_id) { - _this.removeId(_id); + _this = this; + _(_list).forEach(function (_id) { + _this.removeId(_id); }); -}; + }; -List.prototype.removeElements = function(_list, _deleteFromDirectory) { + List.prototype.removeElements = function (_list, _deleteFromDirectory) { var _deleteFromDirectory = _deleteFromDirectory || false, - _this = this; - ns._(_list).forEach(function(_el) { - _this.removeElement(_el); + _this = this; + _(_list).forEach(function (_el) { + _this.removeElement(_el); }); -}; + }; -List.prototype.on = function(_event, _callback) { + List.prototype.on = function (_event, _callback) { if (typeof this.__events[_event] === "undefined") { - this.__events[_event] = []; + this.__events[_event] = []; } this.__events[_event].push(_callback); -}; + }; -List.prototype.off = function(_event, _callback) { + List.prototype.off = function (_event, _callback) { if (typeof this.__events[_event] !== "undefined") { - this.__events[_event] = ns._(this.__events[_event]).reject(function(_fn) { - return _fn === _callback; + this.__events[_event] = ns + ._(this.__events[_event]) + .reject(function (_fn) { + return _fn === _callback; }); } -}; + }; -List.prototype.trigger = function(_event, _data) { + List.prototype.trigger = function (_event, _data) { var _list = this; - ns._(this.__events[_event]).each(function(_callback) { - _callback.call(_list, _data); + _(this.__events[_event]).each(function (_callback) { + _callback.call(_list, _data); }); -}; + }; -/* A simple time management object, that helps converting millisecs to seconds and strings, - * without the clumsiness of the original Date object. - */ + /* A simple time management object, that helps converting millisecs to seconds and strings, + * without the clumsiness of the original Date object. + */ -var Time = Model.Time = function(_milliseconds) { + var Time = (Model.Time = function (_milliseconds) { this.milliseconds = 0; this.setMilliseconds(_milliseconds); -}; + }); -Time.prototype.setMilliseconds = function(_milliseconds) { + Time.prototype.setMilliseconds = function (_milliseconds) { var _ante = this.milliseconds; - switch(typeof _milliseconds) { - case "string": - this.milliseconds = parseInt(_milliseconds); - break; - case "number": - this.milliseconds = Math.floor(_milliseconds); - break; - case "object": - this.milliseconds = parseInt(_milliseconds.valueOf()); - break; - default: - this.milliseconds = 0; + switch (typeof _milliseconds) { + case "string": + this.milliseconds = parseInt(_milliseconds); + break; + case "number": + this.milliseconds = Math.floor(_milliseconds); + break; + case "object": + this.milliseconds = parseInt(_milliseconds.valueOf()); + break; + default: + this.milliseconds = 0; } if (this.milliseconds === NaN) { - this.milliseconds = _ante; + this.milliseconds = _ante; } -}; + }; -Time.prototype.setSeconds = function(_seconds) { + Time.prototype.setSeconds = function (_seconds) { this.milliseconds = 1000 * _seconds; -}; + }; -Time.prototype.getSeconds = function() { + Time.prototype.getSeconds = function () { return this.milliseconds / 1000; -}; + }; -Time.prototype.getHMS = function() { + Time.prototype.getHMS = function () { var _totalSeconds = Math.abs(Math.floor(this.getSeconds())); return { - hours : Math.floor(_totalSeconds / 3600), - minutes : (Math.floor(_totalSeconds / 60) % 60), - seconds : _totalSeconds % 60, - milliseconds: this.milliseconds % 1000 + hours: Math.floor(_totalSeconds / 3600), + minutes: Math.floor(_totalSeconds / 60) % 60, + seconds: _totalSeconds % 60, + milliseconds: this.milliseconds % 1000, }; -}; + }; -Time.prototype.add = function(_milliseconds) { + Time.prototype.add = function (_milliseconds) { this.milliseconds += new Time(_milliseconds).milliseconds; -}; + }; -Time.prototype.valueOf = function() { + Time.prototype.valueOf = function () { return this.milliseconds; -}; + }; -Time.prototype.toString = function(showCs) { + Time.prototype.toString = function (showCs) { var _hms = this.getHMS(), - _res = ''; + _res = ""; if (_hms.hours) { - _res += _hms.hours + ':'; + _res += _hms.hours + ":"; } - _res += pad(2, _hms.minutes) + ':' + pad(2, _hms.seconds); + _res += pad(2, _hms.minutes) + ":" + pad(2, _hms.seconds); if (showCs) { - _res += "." + Math.floor(_hms.milliseconds / 100); + _res += "." + Math.floor(_hms.milliseconds / 100); } return _res; -}; + }; -/* Reference handles references between elements - */ + /* Reference handles references between elements + */ -var Reference = Model.Reference = function(_source, _idRef) { + var Reference = (Model.Reference = function (_source, _idRef) { this.source = _source; this.id = _idRef; if (typeof _idRef === "object") { - this.isList = true; + this.isList = true; } else { - this.isList = false; + this.isList = false; } this.refresh(); -}; + }); -Reference.prototype.refresh = function() { + Reference.prototype.refresh = function () { if (this.isList) { - this.contents = new List(this.source.directory); - this.contents.addIds(this.id); + this.contents = new List(this.source.directory); + this.contents.addIds(this.id); } else { - this.contents = this.source.getElement(this.id); + this.contents = this.source.getElement(this.id); } - -}; + }; -Reference.prototype.getContents = function() { - if (typeof this.contents === "undefined" || (this.isList && this.contents.length != this.id.length)) { - this.refresh(); + Reference.prototype.getContents = function () { + if ( + typeof this.contents === "undefined" || + (this.isList && this.contents.length != this.id.length) + ) { + this.refresh(); } return this.contents; -}; + }; -Reference.prototype.isOrHasId = function(_idRef) { + Reference.prototype.isOrHasId = function (_idRef) { if (this.isList) { - return (ns._(this.id).indexOf(_idRef) !== -1); + return _(this.id).indexOf(_idRef) !== -1; } else { - return (this.id == _idRef); + return this.id == _idRef; } -}; + }; -/* */ + /* */ -var BaseElement = Model.Element = function(_id, _source) { - this.elementType = 'element'; + var BaseElement = (Model.Element = function (_id, _source) { + this.elementType = "element"; this.title = ""; this.description = ""; this.__events = {}; if (typeof _source === "undefined") { - return; + return; } if (typeof _id === "undefined" || !_id) { - _id = getUID(); + _id = getUID(); } this.id = _id; this.source = _source; if (_source !== this) { - this.source.directory.addElement(this); + this.source.directory.addElement(this); } -}; + }); -BaseElement.prototype.toString = function() { - return this.elementType + (this.elementType !== 'element' ? ', id=' + this.id + ', title="' + this.title + '"' : ''); -}; + BaseElement.prototype.toString = function () { + return ( + this.elementType + + (this.elementType !== "element" + ? ", id=" + this.id + ', title="' + this.title + '"' + : "") + ); + }; -BaseElement.prototype.setReference = function(_elementType, _idRef) { + BaseElement.prototype.setReference = function (_elementType, _idRef) { this[_elementType] = new Reference(this.source, _idRef); -}; + }; -BaseElement.prototype.getReference = function(_elementType) { + BaseElement.prototype.getReference = function (_elementType) { if (typeof this[_elementType] !== "undefined") { - return this[_elementType].getContents(); + return this[_elementType].getContents(); } -}; + }; -BaseElement.prototype.getRelated = function(_elementType, _global) { - _global = (typeof _global !== "undefined" && _global); + BaseElement.prototype.getRelated = function (_elementType, _global) { + _global = typeof _global !== "undefined" && _global; var _this = this; - return this.source.getList(_elementType, _global).filter(function(_el) { - var _ref = _el[_this.elementType]; - return _ref && _ref.isOrHasId(_this.id); + return this.source.getList(_elementType, _global).filter(function (_el) { + var _ref = _el[_this.elementType]; + return _ref && _ref.isOrHasId(_this.id); }); -}; + }; -BaseElement.prototype.on = function(_event, _callback) { + BaseElement.prototype.on = function (_event, _callback) { if (typeof this.__events[_event] === "undefined") { - this.__events[_event] = []; + this.__events[_event] = []; } this.__events[_event].push(_callback); -}; + }; -BaseElement.prototype.off = function(_event, _callback) { + BaseElement.prototype.off = function (_event, _callback) { if (typeof this.__events[_event] !== "undefined") { - this.__events[_event] = ns._(this.__events[_event]).reject(function(_fn) { - return _fn === _callback; - }); + this.__events[_event] = _(this.__events[_event]).reject(function (_fn) { + return _fn === _callback; + }); } -}; + }; -BaseElement.prototype.trigger = function(_event, _data) { + BaseElement.prototype.trigger = function (_event, _data) { var _element = this; - ns._(this.__events[_event]).each(function(_callback) { - _callback.call(_element, _data); + _(this.__events[_event]).each(function (_callback) { + _callback.call(_element, _data); }); -}; + }; -/* */ + /* */ -var Playable = Model.Playable = function(_id, _source) { + var Playable = (Model.Playable = function (_id, _source) { BaseElement.call(this, _id, _source); if (typeof _source === "undefined") { - return; + return; } - this.elementType = 'playable'; + this.elementType = "playable"; this.currentTime = new Time(); - this.volume = .5; + this.volume = 0.5; this.paused = true; this.muted = false; this.timeRange = false; this.loadedMetadata = false; var _this = this; - this.on("play", function() { - _this.paused = false; + this.on("play", function () { + _this.paused = false; }); - this.on("pause", function() { - _this.paused = true; + this.on("pause", function () { + _this.paused = true; }); - this.on("timeupdate", function(_time) { - _this.currentTime = _time; - _this.getAnnotations().filter(function(_a) { - return (_a.end <= _time || _a.begin > _time) && _a.playing; - }).forEach(function(_a) { - _a.playing = false; - _a.trigger("leave"); - _this.trigger("leave-annotation",_a); + this.on("timeupdate", function (_time) { + _this.currentTime = _time; + _this + .getAnnotations() + .filter(function (_a) { + return (_a.end <= _time || _a.begin > _time) && _a.playing; + }) + .forEach(function (_a) { + _a.playing = false; + _a.trigger("leave"); + _this.trigger("leave-annotation", _a); }); - _this.getAnnotations().filter(function(_a) { - return _a.begin <= _time && _a.end > _time && !_a.playing; - }).forEach(function(_a) { - _a.playing = true; - _a.trigger("enter"); - _this.trigger("enter-annotation",_a); + _this + .getAnnotations() + .filter(function (_a) { + return _a.begin <= _time && _a.end > _time && !_a.playing; + }) + .forEach(function (_a) { + _a.playing = true; + _a.trigger("enter"); + _this.trigger("enter-annotation", _a); }); - - if (_this.getTimeRange()){ - if (_this.getTimeRange()[0] > _time) { - _this.pause(); - _this.setCurrentTime(_this.getTimeRange()[0]); - } - if (_this.getTimeRange()[1] < _time){ - _this.pause(); - _this.setCurrentTime(_this.getTimeRange()[1]); - } + + if (_this.getTimeRange()) { + if (_this.getTimeRange()[0] > _time) { + _this.pause(); + _this.setCurrentTime(_this.getTimeRange()[0]); } - + if (_this.getTimeRange()[1] < _time) { + _this.pause(); + _this.setCurrentTime(_this.getTimeRange()[1]); + } + } }); - this.on("loadedmetadata", function() { - _this.loadedMetadata = true; + this.on("loadedmetadata", function () { + _this.loadedMetadata = true; }); -}; - -extendPrototype(Playable, BaseElement); + }); -Playable.prototype.getCurrentTime = function() { + extendPrototype(Playable, BaseElement); + + Playable.prototype.getCurrentTime = function () { return this.currentTime; -}; + }; -Playable.prototype.getVolume = function() { + Playable.prototype.getVolume = function () { return this.volume; -}; + }; -Playable.prototype.getPaused = function() { + Playable.prototype.getPaused = function () { return this.paused; -}; + }; -Playable.prototype.getMuted = function() { + Playable.prototype.getMuted = function () { return this.muted; -}; + }; -Playable.prototype.getTimeRange = function() { + Playable.prototype.getTimeRange = function () { return this.timeRange; -} + }; -Playable.prototype.setCurrentTime = function(_time) { - this.trigger("setcurrenttime",_time); -}; + Playable.prototype.setCurrentTime = function (_time) { + this.trigger("setcurrenttime", _time); + }; -Playable.prototype.setVolume = function(_vol) { - this.trigger("setvolume",_vol); -}; + Playable.prototype.setVolume = function (_vol) { + this.trigger("setvolume", _vol); + }; -Playable.prototype.setMuted = function(_muted) { - this.trigger("setmuted",_muted); -}; + Playable.prototype.setMuted = function (_muted) { + this.trigger("setmuted", _muted); + }; -Playable.prototype.setTimeRange = function(_timeBegin, _timeEnd) { - if ((_timeBegin < _timeEnd)&&(_timeBegin >= 0)&&(_timeEnd>0)){ - return this.trigger("settimerange", [_timeBegin, _timeEnd]); + Playable.prototype.setTimeRange = function (_timeBegin, _timeEnd) { + if (_timeBegin < _timeEnd && _timeBegin >= 0 && _timeEnd > 0) { + return this.trigger("settimerange", [_timeBegin, _timeEnd]); } -} + }; -Playable.prototype.resetTimeRange = function() { + Playable.prototype.resetTimeRange = function () { return this.trigger("resettimerange"); -} + }; -Playable.prototype.play = function() { + Playable.prototype.play = function () { this.trigger("setplay"); -}; + }; -Playable.prototype.pause = function() { + Playable.prototype.pause = function () { this.trigger("setpause"); -}; + }; -Playable.prototype.show = function() {}; + Playable.prototype.show = function () {}; -Playable.prototype.hide = function() {}; + Playable.prototype.hide = function () {}; -/* */ + /* */ -var Media = Model.Media = function(_id, _source) { + var Media = (Model.Media = function (_id, _source) { Playable.call(this, _id, _source); - this.elementType = 'media'; + this.elementType = "media"; this.duration = new Time(); - this.video = ''; + this.video = ""; var _this = this; -}; + }); -extendPrototype(Media, Playable); -/* */ + extendPrototype(Media, Playable); + /* */ -var Media = Model.Media = function(_id, _source) { + var Media = (Model.Media = function (_id, _source) { Playable.call(this, _id, _source); - this.elementType = 'media'; + this.elementType = "media"; this.duration = new Time(); - this.video = ''; + this.video = ""; var _this = this; -}; + }); -extendPrototype(Media, Playable); + extendPrototype(Media, Playable); -/* Default functions to be overriden by players */ - -Media.prototype.setDuration = function(_durationMs) { + /* Default functions to be overriden by players */ + + Media.prototype.setDuration = function (_durationMs) { this.duration.setMilliseconds(_durationMs); -}; + }; -Media.prototype.getAnnotations = function() { + Media.prototype.getAnnotations = function () { return this.getRelated("annotation"); -}; + }; -Media.prototype.getAnnotationsByTypeTitle = function(_title) { - var _annTypes = this.source.getAnnotationTypes().searchByTitle(_title).pluck("id"); + Media.prototype.getAnnotationsByTypeTitle = function (_title) { + var _annTypes = this.source + .getAnnotationTypes() + .searchByTitle(_title) + .pluck("id"); if (_annTypes.length) { - return this.getAnnotations().filter(function(_annotation) { - return ns._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1; - }); + return this.getAnnotations().filter(function (_annotation) { + return _(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1; + }); } else { - return new List(this.source.directory); + return new List(this.source.directory); } -}; + }; -/* */ + /* */ -var Tag = Model.Tag = function(_id, _source) { + var Tag = (Model.Tag = function (_id, _source) { BaseElement.call(this, _id, _source); - this.elementType = 'tag'; -}; + this.elementType = "tag"; + }); -extendPrototype(Tag, BaseElement); + extendPrototype(Tag, BaseElement); -Tag.prototype.getAnnotations = function() { + Tag.prototype.getAnnotations = function () { return this.getRelated("annotation"); -}; + }; -/* */ -var AnnotationType = Model.AnnotationType = function(_id, _source) { + /* */ + var AnnotationType = (Model.AnnotationType = function (_id, _source) { BaseElement.call(this, _id, _source); - this.elementType = 'annotationType'; -}; + this.elementType = "annotationType"; + }); -extendPrototype(AnnotationType, BaseElement); + extendPrototype(AnnotationType, BaseElement); -AnnotationType.prototype.getAnnotations = function() { + AnnotationType.prototype.getAnnotations = function () { return this.getRelated("annotation"); -}; + }; -/* Annotation - * */ + /* Annotation + * */ -var Annotation = Model.Annotation = function(_id, _source) { + var Annotation = (Model.Annotation = function (_id, _source) { BaseElement.call(this, _id, _source); - this.elementType = 'annotation'; + this.elementType = "annotation"; this.begin = new Time(); this.end = new Time(); this.tag = new Reference(_source, []); this.playing = false; var _this = this; - this.on("click", function() { - _this.getMedia().setCurrentTime(_this.begin); + this.on("click", function () { + _this.getMedia().setCurrentTime(_this.begin); }); -}; + }); -extendPrototype(Annotation, BaseElement); + extendPrototype(Annotation, BaseElement); -/* Set begin and end in one go, to avoid undesired side-effects in - * setBegin/setEnd interaction */ -Annotation.prototype.setBeginEnd = function(_beginMs, _endMs) { - _beginMs = Math.max(0,_beginMs); - _endMs = Math.max(0,_endMs); - if (_endMs < _beginMs) - _endMs = _beginMs; + /* Set begin and end in one go, to avoid undesired side-effects in + * setBegin/setEnd interaction */ + Annotation.prototype.setBeginEnd = function (_beginMs, _endMs) { + _beginMs = Math.max(0, _beginMs); + _endMs = Math.max(0, _endMs); + if (_endMs < _beginMs) _endMs = _beginMs; this.begin.setMilliseconds(_beginMs); this.end.setMilliseconds(_endMs); this.trigger("change-begin"); this.trigger("change-end"); -}; + }; -Annotation.prototype.setBegin = function(_beginMs) { - this.begin.setMilliseconds(Math.max(0,_beginMs)); + Annotation.prototype.setBegin = function (_beginMs) { + this.begin.setMilliseconds(Math.max(0, _beginMs)); this.trigger("change-begin"); if (this.end < this.begin) { - this.setEnd(this.begin); + this.setEnd(this.begin); } -}; + }; -Annotation.prototype.setEnd = function(_endMs) { - this.end.setMilliseconds(Math.min(_endMs, this.getMedia().duration.milliseconds)); + Annotation.prototype.setEnd = function (_endMs) { + this.end.setMilliseconds( + Math.min(_endMs, this.getMedia().duration.milliseconds) + ); this.trigger("change-end"); if (this.end < this.begin) { - this.setBegin(this.end); + this.setBegin(this.end); } -}; + }; -Annotation.prototype.setDuration = function(_durMs) { + Annotation.prototype.setDuration = function (_durMs) { this.setEnd(_durMs + this.begin.milliseconds); -}; + }; -Annotation.prototype.setMedia = function(_idRef) { + Annotation.prototype.setMedia = function (_idRef) { this.setReference("media", _idRef); -}; + }; -Annotation.prototype.getMedia = function() { + Annotation.prototype.getMedia = function () { return this.getReference("media"); -}; + }; -Annotation.prototype.setAnnotationType = function(_idRef) { + Annotation.prototype.setAnnotationType = function (_idRef) { this.setReference("annotationType", _idRef); -}; + }; -Annotation.prototype.getAnnotationType = function() { + Annotation.prototype.getAnnotationType = function () { return this.getReference("annotationType"); -}; + }; -Annotation.prototype.setTags = function(_idRefs) { + Annotation.prototype.setTags = function (_idRefs) { this.setReference("tag", _idRefs); -}; + }; -Annotation.prototype.getTags = function() { + Annotation.prototype.getTags = function () { return this.getReference("tag"); -}; + }; -Annotation.prototype.getTagTexts = function() { + Annotation.prototype.getTagTexts = function () { return this.getTags().getTitles(); -}; + }; -Annotation.prototype.getDuration = function() { + Annotation.prototype.getDuration = function () { return new Time(this.end.milliseconds - this.begin.milliseconds); -}; + }; + + /* */ -/* */ - -var MashedAnnotation = Model.MashedAnnotation = function(_mashup, _annotation) { - BaseElement.call(this, _mashup.id + "_" + _annotation.id, _annotation.source); - this.elementType = 'mashedAnnotation'; + var MashedAnnotation = (Model.MashedAnnotation = function ( + _mashup, + _annotation + ) { + BaseElement.call( + this, + _mashup.id + "_" + _annotation.id, + _annotation.source + ); + this.elementType = "mashedAnnotation"; this.annotation = _annotation; this.begin = new Time(); this.end = new Time(); @@ -840,433 +946,439 @@ this.description = this.annotation.description; this.color = this.annotation.color; var _this = this; - this.on("click", function() { - _mashup.setCurrentTime(_this.begin); + this.on("click", function () { + _mashup.setCurrentTime(_this.begin); }); - this.on("enter", function() { - _this.annotation.trigger("enter"); + this.on("enter", function () { + _this.annotation.trigger("enter"); }); - this.on("leave", function() { - _this.annotation.trigger("leave"); + this.on("leave", function () { + _this.annotation.trigger("leave"); }); -}; + }); -extendPrototype(MashedAnnotation, BaseElement); + extendPrototype(MashedAnnotation, BaseElement); -MashedAnnotation.prototype.getMedia = function() { + MashedAnnotation.prototype.getMedia = function () { return this.annotation.getReference("media"); -}; + }; -MashedAnnotation.prototype.getAnnotationType = function() { + MashedAnnotation.prototype.getAnnotationType = function () { return this.annotation.getReference("annotationType"); -}; + }; -MashedAnnotation.prototype.getTags = function() { + MashedAnnotation.prototype.getTags = function () { return this.annotation.getReference("tag"); -}; + }; -MashedAnnotation.prototype.getTagTexts = function() { + MashedAnnotation.prototype.getTagTexts = function () { return this.annotation.getTags().getTitles(); -}; + }; -MashedAnnotation.prototype.getDuration = function() { + MashedAnnotation.prototype.getDuration = function () { return this.annotation.getDuration(); -}; + }; -MashedAnnotation.prototype.setBegin = function(_begin) { + MashedAnnotation.prototype.setBegin = function (_begin) { this.begin.setMilliseconds(_begin); this.duration.setMilliseconds(this.annotation.getDuration()); this.end.setMilliseconds(_begin + this.duration); -}; + }; -/* */ + /* */ -var Mashup = Model.Mashup = function(_id, _source) { + var Mashup = (Model.Mashup = function (_id, _source) { Playable.call(this, _id, _source); - this.elementType = 'mashup'; + this.elementType = "mashup"; this.duration = new Time(); this.segments = new List(_source.directory); this.loaded = false; var _this = this; - this._updateTimes = function() { - _this.updateTimes(); - _this.trigger("change"); + this._updateTimes = function () { + _this.updateTimes(); + _this.trigger("change"); }; this.on("add", this._updateTimes); this.on("remove", this._updateTimes); -}; + }); -extendPrototype(Mashup, Playable); + extendPrototype(Mashup, Playable); -Mashup.prototype.updateTimes = function() { + Mashup.prototype.updateTimes = function () { var _time = 0; - this.segments.forEach(function(_segment) { - _segment.setBegin(_time); - _time = _segment.end; + this.segments.forEach(function (_segment) { + _segment.setBegin(_time); + _time = _segment.end; }); this.duration.setMilliseconds(_time); -}; + }; -Mashup.prototype.addAnnotation = function(_annotation, _defer) { + Mashup.prototype.addAnnotation = function (_annotation, _defer) { var _mashedAnnotation = new MashedAnnotation(this, _annotation), - _defer = _defer || false; + _defer = _defer || false; this.segments.push(_mashedAnnotation); _annotation.on("change-begin", this._updateTimes); _annotation.on("change-end", this._updateTimes); if (!_defer) { - this.trigger("add"); + this.trigger("add"); } -}; + }; -Mashup.prototype.addAnnotationById = function(_elId, _defer) { + Mashup.prototype.addAnnotationById = function (_elId, _defer) { var _annotation = this.source.getElement(_elId), - _defer = _defer || false; + _defer = _defer || false; if (typeof _annotation !== "undefined") { - this.addAnnotation(_annotation, _defer); + this.addAnnotation(_annotation, _defer); } -}; + }; -Mashup.prototype.addAnnotations = function(_segments) { + Mashup.prototype.addAnnotations = function (_segments) { var _this = this; - ns._(_segments).forEach(function(_segment) { - _this.addAnnotation(_segment, true); + _(_segments).forEach(function (_segment) { + _this.addAnnotation(_segment, true); }); this.trigger("add"); -}; + }; -Mashup.prototype.addAnnotationsById = function(_segments) { + Mashup.prototype.addAnnotationsById = function (_segments) { var _this = this; - ns._(_segments).forEach(function(_segment) { - _this.addAnnotationById(_segment, true); + _(_segments).forEach(function (_segment) { + _this.addAnnotationById(_segment, true); }); this.trigger("add"); -}; + }; -Mashup.prototype.removeAnnotation = function(_annotation, _defer) { + Mashup.prototype.removeAnnotation = function (_annotation, _defer) { var _defer = _defer || false; _annotation.off("change-begin", this._updateTimes); _annotation.off("change-end", this._updateTimes); this.segments.removeId(this.id + "_" + _annotation.id); if (!_defer) { - this.trigger("remove"); + this.trigger("remove"); } -}; + }; -Mashup.prototype.removeAnnotationById = function(_annId, _defer) { + Mashup.prototype.removeAnnotationById = function (_annId, _defer) { var _defer = _defer || false; var _annotation = this.source.getElement(_annId); if (_annotation) { - this.removeAnnotation(_annotation, _defer); + this.removeAnnotation(_annotation, _defer); } if (!_defer) { - this.trigger("remove"); + this.trigger("remove"); } -}; + }; -Mashup.prototype.setAnnotations = function(_segments) { + Mashup.prototype.setAnnotations = function (_segments) { while (this.segments.length) { - this.removeAnnotation(this.segments[0].annotation, true); + this.removeAnnotation(this.segments[0].annotation, true); } this.addAnnotations(_segments); -}; + }; -Mashup.prototype.setAnnotationsById = function(_segments) { + Mashup.prototype.setAnnotationsById = function (_segments) { while (this.segments.length) { - this.removeAnnotation(this.segments[0].annotation, true); + this.removeAnnotation(this.segments[0].annotation, true); } this.addAnnotationsById(_segments); -}; + }; -Mashup.prototype.hasAnnotation = function(_annotation) { - return !!ns._(this.segments).find(function(_s) { - return _s.annotation === _annotation; + Mashup.prototype.hasAnnotation = function (_annotation) { + return !!_(this.segments).find(function (_s) { + return _s.annotation === _annotation; }); -}; + }; -Mashup.prototype.getAnnotation = function(_annotation) { - return ns._(this.segments).find(function(_s) { - return _s.annotation === _annotation; + Mashup.prototype.getAnnotation = function (_annotation) { + return _(this.segments).find(function (_s) { + return _s.annotation === _annotation; }); -}; + }; -Mashup.prototype.getAnnotationById = function(_id) { - return ns._(this.segments).find(function(_s) { - return _s.annotation.id === _id; + Mashup.prototype.getAnnotationById = function (_id) { + return _(this.segments).find(function (_s) { + return _s.annotation.id === _id; }); -}; + }; -Mashup.prototype.getAnnotations = function() { + Mashup.prototype.getAnnotations = function () { return this.segments; -}; + }; -Mashup.prototype.getOriginalAnnotations = function() { + Mashup.prototype.getOriginalAnnotations = function () { var annotations = new List(this.source.directory); - this.segments.forEach(function(_s) { - annotations.push(_s.annotation); + this.segments.forEach(function (_s) { + annotations.push(_s.annotation); }); return annotations; -}; + }; -Mashup.prototype.getMedias = function() { + Mashup.prototype.getMedias = function () { var medias = new List(this.source.directory); - this.segments.forEach(function(_annotation) { - medias.push(_annotation.getMedia()); + this.segments.forEach(function (_annotation) { + medias.push(_annotation.getMedia()); }); return medias; -}; + }; -Mashup.prototype.getAnnotationsByTypeTitle = function(_title) { - var _annTypes = this.source.getAnnotationTypes().searchByTitle(_title).pluck("id"); + Mashup.prototype.getAnnotationsByTypeTitle = function (_title) { + var _annTypes = this.source + .getAnnotationTypes() + .searchByTitle(_title) + .pluck("id"); if (_annTypes.length) { - return this.getAnnotations().filter(function(_annotation) { - return ns._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1; - }); + return this.getAnnotations().filter(function (_annotation) { + return _(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1; + }); } else { - return new List(this.source.directory); + return new List(this.source.directory); } -}; + }; -Mashup.prototype.getAnnotationAtTime = function(_time) { - var _list = this.segments.filter(function(_annotation) { - return _annotation.begin <= _time && _annotation.end > _time; + Mashup.prototype.getAnnotationAtTime = function (_time) { + var _list = this.segments.filter(function (_annotation) { + return _annotation.begin <= _time && _annotation.end > _time; }); if (_list.length) { - return _list[0]; + return _list[0]; } else { - return undefined; + return undefined; } -}; + }; -Mashup.prototype.getMediaAtTime = function(_time) { + Mashup.prototype.getMediaAtTime = function (_time) { var _annotation = this.getAnnotationAtTime(_time); if (typeof _annotation !== "undefined") { - return _annotation.getMedia(); + return _annotation.getMedia(); } else { - return undefined; + return undefined; } -}; + }; -/* */ + /* */ -var Source = Model.Source = function(_config) { + var Source = (Model.Source = function (_config) { BaseElement.call(this, false, this); this.status = _SOURCE_STATUS_EMPTY; this.elementType = "source"; if (typeof _config !== "undefined") { - var _this = this; - ns._(_config).forEach(function(_v, _k) { - _this[_k] = _v; - }); - this.callbackQueue = []; - this.contents = {}; - this.get(); + var _this = this; + _(_config).forEach(function (_v, _k) { + _this[_k] = _v; + }); + this.callbackQueue = []; + this.contents = {}; + this.get(); } -}; + }); -extendPrototype(Source, BaseElement); + extendPrototype(Source, BaseElement); -Source.prototype.addList = function(_listId, _contents) { + Source.prototype.addList = function (_listId, _contents) { if (typeof this.contents[_listId] === "undefined") { - this.contents[_listId] = new List(this.directory); + this.contents[_listId] = new List(this.directory); } this.contents[_listId].addElements(_contents); -}; + }; -Source.prototype.getList = function(_listId, _global) { - _global = (typeof _global !== "undefined" && _global); + Source.prototype.getList = function (_listId, _global) { + _global = typeof _global !== "undefined" && _global; if (_global) { - return this.directory.getGlobalList().filter(function(_e) { - return (_e.elementType === _listId); - }); + return this.directory.getGlobalList().filter(function (_e) { + return _e.elementType === _listId; + }); } else { - if (typeof this.contents[_listId] === "undefined") { - this.contents[_listId] = new List(this.directory); - } - return this.contents[_listId]; + if (typeof this.contents[_listId] === "undefined") { + this.contents[_listId] = new List(this.directory); + } + return this.contents[_listId]; } -}; + }; -Source.prototype.forEach = function(_callback) { + Source.prototype.forEach = function (_callback) { var _this = this; - ns._(this.contents).forEach(function(_value, _key) { - _callback.call(_this, _value, _key); + _(this.contents).forEach(function (_value, _key) { + _callback.call(_this, _value, _key); }); -}; + }; -Source.prototype.getElement = function(_elId) { + Source.prototype.getElement = function (_elId) { return this.directory.getElement(_elId); -}; + }; -Source.prototype.get = function() { + Source.prototype.get = function () { this.status = _SOURCE_STATUS_WAITING; this.handleCallbacks(); -}; + }; -/* We defer the callbacks calls so they execute after the queue is cleared */ -Source.prototype.deferCallback = function(_callback) { + /* We defer the callbacks calls so they execute after the queue is cleared */ + Source.prototype.deferCallback = function (_callback) { var _this = this; - ns._.defer(function() { - _callback.call(_this); + _.defer(function () { + _callback.call(_this); }); -}; + }; -Source.prototype.handleCallbacks = function() { + Source.prototype.handleCallbacks = function () { this.status = _SOURCE_STATUS_READY; while (this.callbackQueue.length) { - this.deferCallback(this.callbackQueue.splice(0,1)[0]); + this.deferCallback(this.callbackQueue.splice(0, 1)[0]); } -}; -Source.prototype.onLoad = function(_callback) { + }; + Source.prototype.onLoad = function (_callback) { if (this.status === _SOURCE_STATUS_READY) { - this.deferCallback(_callback); + this.deferCallback(_callback); } else { - this.callbackQueue.push(_callback); + this.callbackQueue.push(_callback); } -}; + }; -Source.prototype.serialize = function() { + Source.prototype.serialize = function () { return this.serializer.serialize(this); -}; + }; + + Source.prototype.deSerialize = function (_data) { + this.serializer.deSerialize(_data, this); + }; + + Source.prototype.getAnnotations = function (_global) { + _global = typeof _global !== "undefined" && _global; + return this.getList("annotation", _global); + }; + + Source.prototype.getMedias = function (_global) { + _global = typeof _global !== "undefined" && _global; + return this.getList("media", _global); + }; + + Source.prototype.getTags = function (_global) { + _global = typeof _global !== "undefined" && _global; + return this.getList("tag", _global); + }; -Source.prototype.deSerialize = function(_data) { - this.serializer.deSerialize(_data, this); -}; + Source.prototype.getMashups = function (_global) { + _global = typeof _global !== "undefined" && _global; + return this.getList("mashup", _global); + }; + + Source.prototype.getAnnotationTypes = function (_global) { + _global = typeof _global !== "undefined" && _global; + return this.getList("annotationType", _global); + }; + + Source.prototype.getAnnotationsByTypeTitle = function (_title, _global) { + _global = typeof _global !== "undefined" && _global; + var _res = new List(this.directory), + _annTypes = this.getAnnotationTypes(_global).searchByTitle(_title); + _annTypes.forEach(function (_annType) { + _res.addElements(_annType.getAnnotations(_global)); + }); + return _res; + }; + + Source.prototype.getDuration = function () { + var _m = this.currentMedia; + if (typeof _m !== "undefined") { + return this.currentMedia.duration; + } + }; -Source.prototype.getAnnotations = function(_global) { - _global = (typeof _global !== "undefined" && _global); - return this.getList("annotation", _global); -}; + Source.prototype.getCurrentMedia = function (_opts) { + if (typeof this.currentMedia === "undefined") { + if (_opts.is_mashup) { + var _mashups = this.getMashups(); + if (_mashups.length) { + this.currentMedia = _mashups[0]; + } + } else { + var _medias = this.getMedias(); + if (_medias.length) { + this.currentMedia = _medias[0]; + } + } + } + return this.currentMedia; + }; -Source.prototype.getMedias = function(_global) { - _global = (typeof _global !== "undefined" && _global); - return this.getList("media", _global); -}; + Source.prototype.merge = function (_source) { + var _this = this; + _source.forEach(function (_value, _key) { + _this.getList(_key).addElements(_value); + }); + }; + + /* */ + + var RemoteSource = (Model.RemoteSource = function (_config) { + Source.call(this, _config); + }); + + extendPrototype(RemoteSource, Source); -Source.prototype.getTags = function(_global) { - _global = (typeof _global !== "undefined" && _global); - return this.getList("tag", _global); -}; + RemoteSource.prototype.get = function () { + this.status = _SOURCE_STATUS_WAITING; + var _this = this, + urlparams = this.url_params || {}, + dataType = this.dataType || "json"; + urlparams.format = dataType; + jQuery.ajax({ + url: this.url, + dataType: dataType, + data: urlparams, + traditional: true, + success: function (_result) { + _this.deSerialize(_result); + _this.handleCallbacks(); + }, + }); + }; + + /* */ + + var Directory = (Model.Directory = function () { + this.remoteSources = {}; + this.elements = {}; + }); -Source.prototype.getMashups = function(_global) { - _global = (typeof _global !== "undefined" && _global); - return this.getList("mashup", _global); -}; + Directory.prototype.remoteSource = function (_properties) { + if ( + typeof _properties !== "object" || + typeof _properties.url === "undefined" + ) { + throw "Error : Directory.remoteSource(configuration): configuration.url is undefined"; + } + var _config = _({ directory: this }).extend(_properties); + _config.url_params = _config.url_params || {}; + var _hash = _config.url + "?" + jQuery.param(_config.url_params); + if (typeof this.remoteSources[_hash] === "undefined") { + this.remoteSources[_hash] = new RemoteSource(_config); + } + return this.remoteSources[_hash]; + }; -Source.prototype.getAnnotationTypes = function(_global) { - _global = (typeof _global !== "undefined" && _global); - return this.getList("annotationType", _global); + Directory.prototype.newLocalSource = function (_properties) { + var _config = _({ directory: this }).extend(_properties), + _res = new Source(_config); + return _res; + }; + + Directory.prototype.getElement = function (_id) { + return this.elements[_id]; + }; + + Directory.prototype.addElement = function (_element) { + this.elements[_element.id] = _element; + }; + + Directory.prototype.getGlobalList = function () { + var _res = new List(this); + _res.addIds(_(this.elements).keys()); + return _res; + }; + return Model; }; -Source.prototype.getAnnotationsByTypeTitle = function(_title, _global) { - _global = (typeof _global !== "undefined" && _global); - var _res = new List(this.directory), - _annTypes = this.getAnnotationTypes(_global).searchByTitle(_title); - _annTypes.forEach(function(_annType) { - _res.addElements(_annType.getAnnotations(_global)); - }); - return _res; -}; - -Source.prototype.getDuration = function() { - var _m = this.currentMedia; - if (typeof _m !== "undefined") { - return this.currentMedia.duration; - } -}; - -Source.prototype.getCurrentMedia = function(_opts) { - if (typeof this.currentMedia === "undefined") { - if (_opts.is_mashup) { - var _mashups = this.getMashups(); - if (_mashups.length) { - this.currentMedia = _mashups[0]; - } - } else { - var _medias = this.getMedias(); - if (_medias.length) { - this.currentMedia = _medias[0]; - } - } - } - return this.currentMedia; -}; - -Source.prototype.merge = function(_source) { - var _this = this; - _source.forEach(function(_value, _key) { - _this.getList(_key).addElements(_value); - }); -}; - -/* */ - -var RemoteSource = Model.RemoteSource = function(_config) { - Source.call(this, _config); -}; - -extendPrototype(RemoteSource, Source); - -RemoteSource.prototype.get = function() { - this.status = _SOURCE_STATUS_WAITING; - var _this = this, - urlparams = this.url_params || {}, - dataType = (isLocalURL(this.url) ? "json" : "jsonp"); - urlparams.format = dataType; - ns.jQuery.ajax({ - url: this.url, - dataType: dataType, - data: urlparams, - traditional: true, - success: function(_result) { - _this.deSerialize(_result); - _this.handleCallbacks(); - } - }); -}; - -/* */ - -var Directory = Model.Directory = function() { - this.remoteSources = {}; - this.elements = {}; -}; - -Directory.prototype.remoteSource = function(_properties) { - if (typeof _properties !== "object" || typeof _properties.url === "undefined") { - throw "Error : Directory.remoteSource(configuration): configuration.url is undefined"; - } - var _config = ns._({ directory: this }).extend(_properties); - _config.url_params = _config.url_params || {}; - var _hash = _config.url + "?" + ns.jQuery.param(_config.url_params); - if (typeof this.remoteSources[_hash] === "undefined") { - this.remoteSources[_hash] = new RemoteSource(_config); - } - return this.remoteSources[_hash]; -}; - -Directory.prototype.newLocalSource = function(_properties) { - var _config = ns._({ directory: this }).extend(_properties), - _res = new Source(_config); - return _res; -}; - -Directory.prototype.getElement = function(_id) { - return this.elements[_id]; -}; - -Directory.prototype.addElement = function(_element) { - this.elements[_element.id] = _element; -}; - -Directory.prototype.getGlobalList = function() { - var _res = new List(this); - _res.addIds(ns._(this.elements).keys()); - return _res; -}; -return Model; - -})(IriSP); +export default Model; /* END js */ -