src/js/widgets/polemicNewWidget.js
branchnew-model
changeset 874 38b65761a7d5
parent 872 d777d05a16e4
child 875 43629caa77bc
equal deleted inserted replaced
872:d777d05a16e4 874:38b65761a7d5
     1 IriSP.PolemicNewWidget = function(player, config) {
       
     2     IriSP.Widget.call(this, player, config);
       
     3     this.bindPopcorn("IriSP.search", "searchHandler");
       
     4     this.bindPopcorn("IriSP.search.closed", "searchHandler");
       
     5     this.bindPopcorn("IriSP.search.cleared", "searchHandler");
       
     6     this.bindPopcorn("timeupdate", "onTimeupdate");
       
     7     this.sliceCount = Math.floor( this.width / this.element_width );
       
     8     this.$zone = IriSP.jQuery('<div>');
       
     9     this.$.append(this.$zone);
       
    10 };
       
    11 
       
    12 IriSP.PolemicNewWidget.prototype = new IriSP.Widget();
       
    13 
       
    14 IriSP.PolemicNewWidget.prototype.searchHandler = function(searchString) {
       
    15     this.searchString = typeof searchString !== "undefined" ? searchString : '';
       
    16     var _found = 0,
       
    17         _re = IriSP.Model.regexpFromTextOrArray(searchString)
       
    18         _this = this;
       
    19     this.$tweets.each(function() {
       
    20         var _el = IriSP.jQuery(this);
       
    21         if (_this.searchString) {
       
    22             if (_re.test(_el.attr("title"))) {
       
    23                 _el.css({
       
    24                     "background" : _this.foundcolor,
       
    25                     "opacity" : 1
       
    26                 });
       
    27                 _found++;
       
    28             } else {
       
    29                 _el.css({
       
    30                     "background" : _el.attr("polemic-color"),
       
    31                     "opacity" : .6
       
    32                 });
       
    33             }
       
    34         } else {
       
    35             _el.css({
       
    36                 "background" : _el.attr("polemic-color"),
       
    37                 "opacity" : 1
       
    38             });
       
    39         }
       
    40     });
       
    41     if (this.searchString) {
       
    42         if (_found) {
       
    43             this.player.popcorn.trigger("IriSP.search.matchFound");
       
    44         } else {
       
    45             this.player.popcorn.trigger("IriSP.search.noMatchFound");
       
    46         }
       
    47     }
       
    48 }
       
    49 
       
    50 IriSP.PolemicNewWidget.prototype.draw = function() {
       
    51     var _slices = [],
       
    52         _duration = this.source.getDuration(),
       
    53         _max = 0,
       
    54         _list = this.annotation_type ? this.source.getAnnotationsByTypeTitle(this.annotation_type) : this.source.getAnnotations();
       
    55     
       
    56     for (var _i = 0; _i < this.sliceCount; _i++) {
       
    57         var _begin = new IriSP.Model.Time(_i*_duration/this.sliceCount),
       
    58             _end = new IriSP.Model.Time((_i+1)*_duration/this.sliceCount),
       
    59             _count = 0,
       
    60             _res = {
       
    61                 annotations : _list.filter(function(_annotation) {
       
    62                     return _annotation.begin >= _begin && _annotation.end < _end;
       
    63                 }),
       
    64                 polemicStacks : []
       
    65             }
       
    66             
       
    67         for (var _j = 0; _j < this.tags.length; _j++) {
       
    68             var _polemic = _res.annotations.searchByDescription(this.tags[_j].keywords);
       
    69             _count += _polemic.length;
       
    70             _res.polemicStacks.push(_polemic);
       
    71         }
       
    72         for (var _j = 0; _j < this.tags.length; _j++) {
       
    73             _res.annotations.removeElements(_res.polemicStacks[_j]);
       
    74         }
       
    75         _count += _res.annotations.length;
       
    76         _max = Math.max(_max, _count);
       
    77         _slices.push(_res);
       
    78     }
       
    79     this.height = (_max ? (_max + 2) * this.element_height : 0);
       
    80     console.log(this.height);
       
    81     this.$zone.css({
       
    82         width: this.width + "px",
       
    83         height: this.height + "px",
       
    84         position: "relative"
       
    85     });
       
    86     
       
    87     this.$elapsed = IriSP.jQuery('<div>')
       
    88         .css({
       
    89             background: '#cccccc',
       
    90             position: "absolute",
       
    91             top: 0,
       
    92             left: 0,
       
    93             width: 0,
       
    94             height: "100%"
       
    95         });
       
    96         
       
    97     this.$zone.append(this.$elapsed);
       
    98     
       
    99     var _x = 0,
       
   100         _this = this;
       
   101     
       
   102     function displayElement(_x, _y, _color, _id, _title) {
       
   103         var _el = IriSP.jQuery('<div>')
       
   104             .attr({
       
   105                 title : _title,
       
   106                 "pos-x" : _x,
       
   107                 "pos-y" : _y,
       
   108                 "polemic-color" : _color,
       
   109                 "annotation-id" : _id
       
   110             })
       
   111             .css({
       
   112                 position: "absolute",
       
   113                 width: (_this.element_width-1) + "px",
       
   114                 height: _this.element_height + "px",
       
   115                 left: _x + "px",
       
   116                 top: _y + "px",
       
   117                 background: _color
       
   118             })
       
   119             .addClass("Ldt-Polemic-TweetDiv");
       
   120         _this.$zone.append(_el);
       
   121         return _el;
       
   122     }
       
   123     
       
   124     IriSP._(_slices).forEach(function(_slice) {
       
   125         var _y = _this.height;
       
   126         _slice.annotations.forEach(function(_annotation) {
       
   127             _y -= _this.element_height;
       
   128             displayElement(_x, _y, _this.defaultcolor, _annotation.namespacedId.name, _annotation.title);
       
   129         });
       
   130         IriSP._(_slice.polemicStacks).forEach(function(_annotations, _j) {
       
   131             var _color = _this.tags[_j].color;
       
   132             _annotations.forEach(function(_annotation) {
       
   133                 _y -= _this.element_height;
       
   134                 displayElement(_x, _y, _color, _annotation.namespacedId.name, _annotation.title);
       
   135             });
       
   136         });
       
   137         _x += _this.element_width;
       
   138     });
       
   139     
       
   140     this.$tweets = this.$.find(".Ldt-Polemic-TweetDiv");
       
   141     
       
   142     this.$position = IriSP.jQuery('<div>')
       
   143         .css({
       
   144             background: '#fc00ff',
       
   145             position: "absolute",
       
   146             top: 0,
       
   147             left: "-1px",
       
   148             width: "2px",
       
   149             height: "100%"
       
   150         });
       
   151         
       
   152     this.$zone.append(this.$position);
       
   153     
       
   154     this.$tweets.click(function(_e) {
       
   155         //TODO: Display Tweet in Tweet Widget
       
   156     });
       
   157     
       
   158     //TODO: Mouseover a tweet to display tooltip
       
   159     
       
   160     this.$zone.click(function(_e) {
       
   161         var _x = _e.pageX - _this.$zone.offset().left;
       
   162         _this.player.popcorn.currentTime(_this.source.getDuration().getSeconds() * _x / _this.width);
       
   163     });
       
   164 }
       
   165 
       
   166 IriSP.PolemicNewWidget.prototype.onTimeupdate = function() {
       
   167     var _x = Math.floor( this.width * this.player.popcorn.currentTime() / this.source.getDuration().getSeconds());
       
   168     this.$elapsed.css({
       
   169         width:  _x + "px"
       
   170     });
       
   171     this.$position.css({
       
   172         left: (_x - 1) + "px"
       
   173     })
       
   174 }