src/js/widgets/segmentsWidget.js
author hamidouk
Tue, 08 Nov 2011 15:57:04 +0100
branchpopcorn-port
changeset 212 3a6e4089eef0
parent 210 7ab4ff32a19d
child 214 50c4609e50f4
permissions -rw-r--r--
fixed teh segments display bug and another bug related to float positioning.

IriSP.SegmentsWidget = function(Popcorn, config, Serializer) {

  var self = this;
  IriSP.Widget.call(this, Popcorn, config, Serializer);
  this.oldSearchMatches = [];

  // event handlers
  this._Popcorn.listen("IriSP.search", function(searchString) { self.searchHandler.call(self, searchString); });
  this._Popcorn.listen("IriSP.search.closed", function() { self.searchFieldClosedHandler.call(self); });
  this._Popcorn.listen("IriSP.search.cleared", function() { self.searchFieldClearedHandler.call(self); });
};

IriSP.SegmentsWidget.prototype = new IriSP.Widget();

IriSP.SegmentsWidget.prototype.draw = function() {

  var self = this;
  var annotations = this._serializer._data.annotations;

  
  this.selector.after("<div class='cleaner'></div>"); // we need to do this because the segments are floated                                                      
  
  var i = 0;
  var totalWidth = this.selector.width();
  var onePxPercent = 100 / totalWidth; /* the value of a pixel, in percents */
  
  for (i = 0; i < annotations.length; i++) {
    var annotation = annotations[i];

    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) + onePxPercent * annotations.length * 2;
    var endPourcent 	= IriSP.timeToPourcent(end, duration) - startPourcent;

    var divTitle		= annotation.content.title.substr(0,55);
    var color = annotation.content.color


    var annotationTemplate = Mustache.to_html(IriSP.annotation_template,
        {"divTitle" : divTitle, "id" : id, "startPourcent" : startPourcent,
        "endPourcent" : endPourcent, "hexa_color" : IriSP.DEC_HEXA_COLOR(color),
        "seekPlace" : Math.round(begin/1000)});


    var toolTipTemplate = Mustache.to_html(IriSP.tooltip_template,
          {"title" : divTitle, "begin" : begin, "end" : end,
          "description": annotation.content.description});

    this.selector.append(annotationTemplate);

    IriSP.jQuery("#" + id).tooltip({ effect: 'slide'});

    IriSP.jQuery("#" + id).fadeTo(0, 0.3);

    IriSP.jQuery("#" + id).mouseover(function() {
      IriSP.jQuery("#" + id).animate({opacity: 0.6}, 5);
    }).mouseout(function(){
      IriSP.jQuery("#" + id).animate({opacity: 0.3}, 5);
    });

    IriSP.jQuery("#" + id).click(function(_this, annotation) {
                                    return function() { _this.clickHandler(annotation)};
                                 }(this, annotation));
  }
};

/* restores the view after a search */
IriSP.SegmentsWidget.prototype.clear = function() {
  // reinit the fields
  for (var id in this.oldSearchMatches) {

      IriSP.jQuery("#"+id).dequeue();
			IriSP.jQuery("#"+id).animate({height:0},100);
			IriSP.jQuery("#"+id).css('border','0px');
			IriSP.jQuery("#"+id).css('border-color','red');
			IriSP.jQuery("#"+id).animate({opacity:0.3},100);
  }
};

IriSP.SegmentsWidget.prototype.clickHandler = function(annotation) {
  var begin = Math.round((+ annotation.begin) / 1000);
  this._Popcorn.currentTime(begin)
};

IriSP.SegmentsWidget.prototype.searchHandler = function(searchString) {

  if (searchString == "")
    return;

  console.log(searchString);
  var matches = this._serializer.searchOccurences(searchString);

  for (var id in matches) {
    var factor = matches[id] * 8;
    IriSP.jQuery("#"+id).dequeue();
    IriSP.jQuery("#"+id).animate({height: factor}, 200);
    IriSP.jQuery("#"+id).css('border','2px');
    IriSP.jQuery("#"+id).css('border-color','red');
    IriSP.jQuery("#"+id).animate({opacity:0.6}, 200);

    //IriSP.jQuery("#LdtSearchInput").css('background-color','#e1ffe1');
  }

  // clean up the blocks that were in the previous search
  // but who aren't in the current one.
  for (var id in this.oldSearchMatches) {
    if (!matches.hasOwnProperty(id)) {
        IriSP.jQuery("#"+id).dequeue();
				IriSP.jQuery("#"+id).animate({height:0},250);
				IriSP.jQuery("#"+id).animate({opacity:0.3},200);
    }
  }
  this.oldSearchMatches = matches;
};

IriSP.SegmentsWidget.prototype.searchFieldClearedHandler = function() {
  this.clear();
};

IriSP.SegmentsWidget.prototype.searchFieldClosedHandler = function() {
  this.clear();
};