diff -r 2c025db10a10 -r d777d05a16e4 src/js/widgets/annotationsListWidget.js --- a/src/js/widgets/annotationsListWidget.js Wed Apr 18 18:58:44 2012 +0200 +++ b/src/js/widgets/annotationsListWidget.js Thu Apr 19 19:20:41 2012 +0200 @@ -30,198 +30,38 @@ } } } -/** effectively redraw the widget - called by drawList */ -IriSP.AnnotationsListWidget.prototype.do_redraw = function(list) { -/* var _html = IriSP.templToHTML(IriSP.annotationsListWidget_template, { - annotations : list - }), _this = this; - this.selector.html(_html); - - this.selector.find('.Ldt-AnnotationsList-Tag-Li').click(function() { - _this.player.popcorn.trigger("IriSP.search.triggeredSearch", IriSP.jQuery(this).text().trim()); - }) - if(this.searchRe !== null) { - this.selector.find(".Ldt-AnnotationsList-Title a, .Ldt-AnnotationsList-Description").each(function() { - var _$ = IriSP.jQuery(this); - _$.html(_$.text().trim().replace(_this.searchRe, '$1')) - }) - } */ -}; - -IriSP.AnnotationsListWidget.prototype.transformAnnotation = function(a) { -/* var _this = this; - return { - "id" : a.id, - "title" : this.cinecast_version ? IriSP.get_aliased(a.meta, ['creator_name', 'creator']) : a.content.title, - "desc" : this.cinecast_version ? a.content.data : a.content.description, - "begin" : IriSP.msToTime(a.begin), - "end" : IriSP.msToTime(a.end), - "thumbnail" : ( typeof a.meta == "object" && typeof a.meta.thumbnail == "string") ? a.meta.thumbnail : this.default_thumbnail, - "url" : ( typeof a.meta == "object" && typeof a.meta.url == "string") ? a.meta.url : null, - "created_at" : ( typeof a.meta == "object" && typeof a.meta.created == "string") ? Date.parse(a.meta.created.replace(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}\:\d{2}\:\d{2}).*$/, "$2/$3/$1 $4 UTC+0000")) : null, - "tags" : typeof a.tags == "object" ? IriSP.underscore(a.tags).chain().map(function(_t) { - if( typeof _t == "string") { - return _t.replace(/^.*:/, '#'); - } else { - if( typeof _t['id-ref'] != "undefined") { - var _f = IriSP.underscore.find(_this._serializer._data.tags, function(_tag) { - return _tag.id == _t['id-ref']; - }); - if( typeof _f != "undefined") { - return IriSP.get_aliased(_f.meta, ['dc:title', 'title']); - } - } - } - return null; - }).filter(function(_t) { - return _t !== null && _t !== "" - }).value() : [] - } */ -} -/** draw the annotation list */ -IriSP.AnnotationsListWidget.prototype.drawList = function(force_redraw) { -/* var _this = this; - - // var view_type = this._serializer.getContributions(); - var annotations = this._serializer._data.annotations; - var currentTime = this.player.popcorn.currentTime(); - var list = []; - - for( i = 0; i < annotations.length; i++) { - var obj = this.transformAnnotation(annotations[i]); - obj.iterator = i; - obj.distance = Math.abs((annotations[i].end + annotations[i].begin) / 2000 - currentTime); - if(!this.cinecast_version || annotations[i].type == "cinecast:UserAnnotation") { - list.push(obj); - } - - } - - if(this.searchRe !== null) { - list = list.filter(function(_a) { - return (_this.searchRe.test(_a.desc) || _this.searchRe.test(_a.title)); - }); - if(list.length) { - this.player.popcorn.trigger("IriSP.search.matchFound"); - } else { - this.player.popcorn.trigger("IriSP.search.noMatchFound"); - } - } - list = IriSP.underscore(list).chain().sortBy(function(_o) { - return _o.distance; - }).first(10).sortBy(function(_o) { - return (_this.cinecast_version ? -_o.created_at : _o.iterator); - }).value(); - var idList = IriSP.underscore.pluck(list, "id").sort(); - - if(!IriSP.underscore.isEqual(this.__oldList, idList) || this.lastSearch !== this.searchRe || typeof (force_redraw) !== "undefined") { - this.do_redraw(list); - this.__oldList = idList; - this.lastSearch = this.searchRe; - } - /* save for next call */ - -}; - -IriSP.AnnotationsListWidget.prototype.ajaxRedraw = function(timecode) { - - /* the seeked signal sometimes passes an argument - depending on if we're using - our popcorn lookalike or the real thing - if it's the case, use it as it's - more precise than currentTime which sometimes contains the place we where at */ - if(IriSP.null_or_undefined(timecode) || typeof (timecode) != "number") { - var tcode = this.player.popcorn.currentTime(); - } else { - var tcode = timecode; - } - - /* the platform gives us a special url - of the type : http://path/{{media}}/{{begin}}/{{end}} - we double the braces using regexps and we feed it to mustache to build the correct url - we have to do that because the platform only knows at run time what view it's displaying. - */ - - var media_id = this.currentMedia()["id"]; - var duration = this.getDuration(); - - var begin_timecode = (Math.floor(tcode) - 300) * 1000; - if(begin_timecode < 0) - begin_timecode = 0; - - var end_timecode = (Math.floor(tcode) + 300) * 1000; - if(end_timecode > duration) - end_timecode = duration; - - var templ = Mustache.to_html(this.ajax_url, { - media : media_id, - begin : begin_timecode, - end : end_timecode - }); - - /* we create on the fly a serializer to get the ajax */ - var serializer = new IriSP.JSONSerializer(IriSP.__dataloader, templ); - serializer.sync(IriSP.wrap(this, function(json) { - this.processJson(json, serializer) - })); -}; -/** process the received json - it's a bit hackish */ -IriSP.AnnotationsListWidget.prototype.processJson = function(json, serializer) { - /* FIXME: DRY the whole thing */ -/* var annotations = serializer._data.annotations; - if(IriSP.null_or_undefined(annotations)) - return; - - /* - commented in case we wanted to discriminate against some annotation types. - var view_types = serializer.getIds("Contributions"); - */ - var l = []; - - var media = this.currentMedia()["id"]; - - for( i = 0; i < annotations.length; i++) { - var obj = this.transformAnnotation(annotations[i]) - if( typeof obj.url == "undefined" || !obj.url) { - /* only if the annotation isn't present in the document create an - external link */ - if(this.annotations_ids.indexOf(obj.id.toLowerCase()) == -1) { - // braindead url; jacques didn't want to create a new one in the platform, - // so we append the cutting id to the url. - obj.url = this.project_url + "/" + media + "/" + annotations[i].meta.project + "/" + annotations[i].meta["id-ref"] + '#id=' + annotations[i].id; - - // obj.url = document.location.href.split("#")[0] + "/" + annotation.meta.project; - } - } - l.push(obj); - } - this._ajax_cache = l; - this.do_redraw(l); -}; +//obj.url = this.project_url + "/" + media + "/" + annotations[i].meta.project + "/" + annotations[i].meta["id-ref"] + '#id=' + annotations[i].id; IriSP.AnnotationsListWidget.prototype.ajaxSource = function() { + var _currentTime = this.player.popcorn.currentTime(), + _duration = this.source.getDuration(); + if (typeof _currentTime == "undefined") { + _currentTime = 0; + } + this.lastAjaxQuery = _currentTime; + _currentTime = Math.floor(1000 * _currentTime); var _url = Mustache.to_html(this.ajax_url, { media : this.source.currentMedia.namespacedId.name, - begin : 0, - end : 0 + begin : Math.max(0, _currentTime - this.ajax_granularity), + end : Math.min(_duration.milliseconds, _currentTime + this.ajax_granularity) }); - console.log(_url); + this.currentSource = this.player.loadMetadata(IriSP._.defaults({ + "url" : _url + }, this.metadata)); } IriSP.AnnotationsListWidget.prototype.refresh = function(_forceRedraw) { + _forceRedraw = (typeof _forceRedraw !== "undefined" && _forceRedraw); if (this.currentSource.status !== IriSP.Model._SOURCE_STATUS_READY) { return 0; } var _this = this, - _list = undefined, _currentTime = this.player.popcorn.currentTime(); if (typeof _currentTime == "undefined") { _currentTime = 0; } - if (this.annotation_type) { - _list = this.currentSource.getAnnotationsByTypeTitle(this.annotation_type); - } - if (typeof _list === "undefined") { - _list = this.currentSource.getAnnotations(); - } + var _list = this.annotation_type ? this.currentSource.getAnnotationsByTypeTitle(this.annotation_type, true) : this.currentSource.getAnnotations(); if (this.searchString) { _list = _list.searchByTextFields(this.searchString); } @@ -236,49 +76,71 @@ }); } else { _list = _list.sortBy(function(_annotation) { - return _annotation.begin.milliseconds; + return _annotation.begin; }); } - var _ids = _list.idIndex; - if (!_forceRedraw && IriSP._.isEqual(_ids, this.lastIds)) { - return _list.length; - } - /* This part only gets executed if the list needs updating */ - this.lastIds = _ids; - - var _html = IriSP.templToHTML( - IriSP.annotationsListWidget_template, - { - annotations : _list.map(function(_annotation) { - var _res = { - id : _annotation.id, - title : _annotation.title.replace(_annotation.description,''), - description : _annotation.description, - begin : _annotation.begin.toString(), - end : _annotation.end.toString(), - thumbnail : typeof _annotation.thumbnail !== "undefined" ? _annotation.thumbnail : _this.default_thumbnail, - url : typeof _annotation.url !== "undefined" ? _annotation.thumbnail : '#' + _annotation.namespacedId.name, - tags : _annotation.getTagTexts() - } - return _res; + var _ids = _list.idIndex; + + if (_forceRedraw || !IriSP._.isEqual(_ids, this.lastIds)) { + /* This part only gets executed if the list needs updating */ + this.lastIds = _ids; + + var _html = IriSP.templToHTML( + IriSP.annotationsListWidget_template, + { + annotations : _list.map(function(_annotation) { + var _url = ( + ( typeof _annotation.url !== "undefined" ) + ? _annotation.url + : ( + ( typeof _this.source.projectId !== "undefined" && typeof _annotation.project !== "undefined" && _this.source.projectId !== _annotation.project ) + ? Mustache.to_html( + this.foreign_url, + { + project : _annotation.project, + media : _annotation.media.id.replace(/^.*:/,''), + annotation : _annotation.namespacedId.name, + annotationType : _annotation.annotationType.id.replace(/^.*:/,'') + } + ) + : '#id=' + _annotation.namespacedId.name + ) + ); + var _res = { + id : _annotation.id, + title : _annotation.title.replace(_annotation.description,''), + description : _annotation.description, + begin : _annotation.begin.toString(), + end : _annotation.end.toString(), + thumbnail : typeof _annotation.thumbnail !== "undefined" ? _annotation.thumbnail : _this.default_thumbnail, + url : _url, + tags : _annotation.getTagTexts() + } + return _res; + }) + }); + + this.$.html(_html); + + this.$.find('.Ldt-AnnotationsList-Tag-Li').click(function() { + _this.player.popcorn.trigger("IriSP.search.triggeredSearch", IriSP.jQuery(this).text().replace(/(^\s+|\s+$)/g,'')); + }) + + if(this.searchString) { + var _searchRe = new RegExp('(' + this.searchString.replace(/(\W)/gm,'\\$1') + ')','gim'); + this.$.find(".Ldt-AnnotationsList-Title a, .Ldt-AnnotationsList-Description").each(function() { + var _$ = IriSP.jQuery(this); + _$.html(_$.text().replace(/(^\s+|\s+$)/g,'').replace(_searchRe, '$1')) }) - }); - - this.$.html(_html); - - this.$.find('.Ldt-AnnotationsList-Tag-Li').click(function() { - _this.player.popcorn.trigger("IriSP.search.triggeredSearch", IriSP.jQuery(this).text().replace(/(^\s+|\s+$)/g,'')); - }) - - if(this.searchString) { - var _searchRe = new RegExp('(' + this.searchString.replace(/(\W)/gm,'\\$1') + ')','gim'); - this.$.find(".Ldt-AnnotationsList-Title a, .Ldt-AnnotationsList-Description").each(function() { - var _$ = IriSP.jQuery(this); - _$.html(_$.text().replace(/(^\s+|\s+$)/g,'').replace(_searchRe, '$1')) - }) + } } + if (this.ajax_url && this.ajax_granularity) { + if (Math.abs(_currentTime - this.lastAjaxQuery) > this.ajax_granularity / 2) { + this.ajaxSource(); + } + } return _list.length; }