=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=
+function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=I||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)m.call(a,d)&&(b[b.length]=d);return b};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)b[d]!==void 0&&(a[d]=b[d])});return a};b.defaults=function(a){j(i.call(arguments,
+1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(m.call(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===
+Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!m.call(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)==
+"[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.noConflict=function(){s._=F;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a),function(c){J(c,
+b[c]=a[c])})};var K=0;b.uniqueId=function(a){var b=K++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape,function(a,b){return"',_.escape("+b.replace(/\\'/g,"'")+"),'"}).replace(d.interpolate,function(a,b){return"',"+b.replace(/\\'/g,
+"'")+",'"}).replace(d.evaluate||null,function(a,b){return"');"+b.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};var n=function(a){this._wrapped=a};b.prototype=n.prototype;var u=function(a,c){return c?b(a).chain():a},J=function(a,c){n.prototype[a]=function(){var a=i.call(arguments);H.call(a,this._wrapped);return u(c.apply(b,
+a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];n.prototype[a]=function(){b.apply(this._wrapped,arguments);return u(this._wrapped,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];n.prototype[a]=function(){return u(b.apply(this._wrapped,arguments),this._chain)}});n.prototype.chain=function(){this._chain=true;return this};n.prototype.value=function(){return this._wrapped}}).call(this);
diff -r b1e442d9a1bc -r 97599ff43072 src/js/main.js
--- a/src/js/main.js Wed Dec 21 16:06:41 2011 +0100
+++ b/src/js/main.js Fri Dec 23 10:46:07 2011 +0100
@@ -43,6 +43,8 @@
$L.wait(function() {
IriSP.jQuery = window.jQuery.noConflict( true );
+ IriSP._ = window._.noConflict();
+ IriSP.underscore = IriSP._;
var css_link_jquery = IriSP.jQuery( "", {
rel: "stylesheet",
diff -r b1e442d9a1bc -r 97599ff43072 src/js/serializers/JSONSerializer.js
--- a/src/js/serializers/JSONSerializer.js Wed Dec 21 16:06:41 2011 +0100
+++ b/src/js/serializers/JSONSerializer.js Fri Dec 23 10:46:07 2011 +0100
@@ -242,3 +242,34 @@
return ret_array;
};
+
+
+/* this function returns a list of ids of tweet lines */
+IriSP.JSONSerializer.prototype.getTweetIds = function() {
+ if (typeof(this._data.lists) === "undefined" || this._data.lists === null)
+ return [];
+
+ var tweetsId = [];
+
+ /* first get the list containing the tweets */
+ var tweets = IriSP.underscore.filter(this._data.lists, function(entry) { return entry.id.indexOf("tweet") !== -1 });
+
+ // FIXME: collect tweets from multiple sources ?
+ tweetsId = IriSP.underscore.pluck(tweets[0].items, "id-ref");
+
+ return tweetsId;
+};
+
+/* this function returns a list of lines which are not tweet lines */
+IriSP.JSONSerializer.prototype.getNonTweetIds = function() {
+ if (typeof(this._data.lists) === "undefined" || this._data.lists === null)
+ return [];
+
+ /* get all the ids */
+ var ids = IriSP.underscore.map(this._data.lists, function(entry) {
+ return IriSP.underscore.pluck(entry.items, "id-ref"); });
+
+ var illegal_values = this.getTweetIds();
+ return IriSP.underscore.difference(ids, illegal_values);
+
+};
diff -r b1e442d9a1bc -r 97599ff43072 src/js/widgets/segmentsWidget.js
--- a/src/js/widgets/segmentsWidget.js Wed Dec 21 16:06:41 2011 +0100
+++ b/src/js/widgets/segmentsWidget.js Fri Dec 23 10:46:07 2011 +0100
@@ -12,29 +12,41 @@
IriSP.SegmentsWidget.prototype = new IriSP.Widget();
+/* Get the width of a segment, in pixels. */
+IriSP.SegmentsWidget.prototype.segmentToPixel = function(annotation) {
+ var begin = Math.round((+ annotation.begin) / 1000);
+ var end = Math.round((+ annotation.end) / 1000);
+ var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+
+ var startPourcent = IriSP.timeToPourcent(begin, duration);
+ var startPixel = Math.floor(this.selector.parent().width() * (startPourcent / 100));
+
+ var endPourcent = Math.floor(IriSP.timeToPourcent(end, duration) - startPourcent);
+ var endPixel = Math.floor(this.selector.parent().width() * (endPourcent / 100));
+
+ return endPixel;
+};
+
+/* compute the total length of a group of segments */
+IriSP.SegmentsWidget.prototype.segmentsLength = function(segmentsList) {
+ var self = this;
+ var total = 0;
+
+ for (var i = 0; i < segmentsList.length; i++)
+ total += self.segmentToPixel(segmentsList[i].annotation);
+
+ return total;
+};
+
IriSP.SegmentsWidget.prototype.draw = function() {
var self = this;
var annotations = this._serializer._data.annotations;
this.selector.addClass("Ldt-SegmentsWidget");
-
- /* in case we have different types of annotations, we want to display only the first type */
- /* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
- null or undefined.
- */
- var view;
-
- if (typeof(this._serializer._data.views) !== "undefined" && this._serializer._data.views !== null)
- view = this._serializer._data.views[0];
-
- var view_type = "";
-
- if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
- view_type = view.annotation_types[0];
- }
-
this.selector.append(Mustache.to_html(IriSP.overlay_marker_template));
+
+ var view_type = this._serializer.getNonTweetIds()[0];
this.positionMarker = this.selector.children(":first");
@@ -42,9 +54,9 @@
var i = 0;
- var totalWidth = this.selector.width();
- var onePxPercent = 100 / totalWidth; /* the value of a pixel, in percents */
-
+
+ var segments_annotations = [];
+
for (i = 0; i < annotations.length; i++) {
var annotation = annotations[i];
@@ -54,23 +66,30 @@
continue;
}
- var begin = Math.round((+ annotation.begin) / 1000);
- var end = Math.round((+ annotation.end) / 1000);
- var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
- var id = annotation.id;
- var startPourcent = IriSP.timeToPourcent(begin, duration);
+ segments_annotations.push(annotation);
+ }
- /* surprisingly, the following code doesn't work on webkit - for some reason, most of the
- boxes are 3 pixels smaller.
- */
- var endPourcent = Math.floor(IriSP.timeToPourcent(end, duration) - startPourcent);
- var endPixel = Math.floor(this.selector.parent().width() * (endPourcent / 100)) - 2;
+ var totalWidth = this.selector.width() - segments_annotations.length;
+ var lastSegment = IriSP.underscore.max(segments_annotations, function(annotation) { return annotation.end; });
+
+ for (i = 0; i < segments_annotations.length; i++) {
+
+ var annotation = segments_annotations[i];
+ var begin = (+ annotation.begin);
+ var end = (+ annotation.end);
+ var duration = this._serializer.currentMedia().meta["dc:duration"];
+ var id = annotation.id;
- if (i == 0) {
+ var startPixel = Math.floor(this.selector.parent().width() * (begin / duration));
- endPourcent -= onePxPercent;
- }
+ var endPixel = Math.floor(this.selector.parent().width() * (end / duration));
+ if (annotation.id !== lastSegment.id)
+ var pxWidth = endPixel - startPixel -1;
+ else
+ /* the last segment has no segment following it */
+ var pxWidth = endPixel - startPixel;
+
var divTitle = (annotation.content.title + " - " + annotation.content.description).substr(0,55);
if (typeof(annotation.content.color) !== "undefined")
@@ -86,13 +105,18 @@
hexa_color = hexa_color + '00';
var annotationTemplate = Mustache.to_html(IriSP.annotation_template,
- {"divTitle" : divTitle, "id" : id, "startPourcent" : startPourcent,
- "endPixel" : endPixel, "hexa_color" : hexa_color,
+ {"divTitle" : divTitle, "id" : id, "startPixel" : startPixel,
+ "pxWidth" : pxWidth, "hexa_color" : hexa_color,
"seekPlace" : Math.round(begin/1000)});
+
this.selector.append(annotationTemplate);
-
-// IriSP.jQuery("#" + id).tooltip({ effect: 'slide'});
+
+ /* add a special class to the last segment and change its border */
+ if (annotation.id === lastSegment.id) {
+ this.selector.find("#" + id).addClass("Ldt-lastSegment");
+ this.selector.find(".Ldt-lastSegment").css("border-color", "#" + hexa_color);
+ }
IriSP.jQuery("#" + id).fadeTo(0, 0.3);
@@ -126,7 +150,7 @@
/* restores the view after a search */
IriSP.SegmentsWidget.prototype.clear = function() {
- this.selector.children(".Ldt-iri-chapter").css('border','none').animate({opacity:0.3}, 100);
+ this.selector.children(".Ldt-iri-chapter").animate({opacity:0.3}, 100);
};
IriSP.SegmentsWidget.prototype.clickHandler = function(annotation) {
@@ -155,7 +179,6 @@
for (var id in matches) {
var factor = 0.5 + matches[id] * 0.2;
this.selector.find("#"+id).dequeue();
- this.selector.find("#"+id).css('border','1px red');
this.selector.find("#"+id).animate({opacity:factor}, 200);
}
diff -r b1e442d9a1bc -r 97599ff43072 src/templates/annotation.html
--- a/src/templates/annotation.html Wed Dec 21 16:06:41 2011 +0100
+++ b/src/templates/annotation.html Fri Dec 23 10:46:07 2011 +0100
@@ -1,8 +1,8 @@
{{! template for an annotation displayed in a segmentWidget }}
diff -r b1e442d9a1bc -r 97599ff43072 test/integration/polemic-jsonp.htm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/integration/polemic-jsonp.htm Fri Dec 23 10:46:07 2011 +0100
@@ -0,0 +1,111 @@
+
+
+
+
+Metadataplayer - Polemic tweet integration test
+
+
+
+
+
+
MetaDataPlayer
+ Polemic tweet integration test - loading an outside ressource using JSONP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+