diff -r 7e132e2a48ca -r 267d67791e05 server/src/main/webapp/static/js/twitter-bin.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/webapp/static/js/twitter-bin.js Tue Dec 25 21:29:11 2012 +0100 @@ -0,0 +1,124 @@ +Rkns.Twitter = { +} + +Rkns.Twitter.Search = function(_renkan, _opts) { + this.renkan = _renkan; + this.opts = _opts; +} + +Rkns.Twitter.Search.prototype.getBgClass = function() { + return "Rk-Twitter-Icon"; +} + +Rkns.Twitter.Search.prototype.getSearchTitle = function() { + return this.renkan.l10n.search_on_twitter; +} + +Rkns.Twitter.Search.prototype.search = function(_q) { + this.renkan.tabs.push( + new Rkns.Twitter.Bin(this.renkan, { + search: _q + }) + ); +} + +Rkns.Twitter.Bin = Rkns.Utils.inherit(Rkns._BaseBin); + +Rkns.Twitter.Bin.prototype.tweetTemplate = Rkns._.template( + '
  • ' + + '' + + '

    @<%=tweet.from_user%> (<%=tweet.from_user_name%>)

    ' + + '

    <%=date%>

    ' + + '

    <%=text%>

    ' + + '

    show original · ' + + 'reply · ' + + 'retweet · ' + + 'favorite

  • ' +); + +Rkns.Twitter.Bin.prototype._init = function(_renkan, _opts) { + this.search = _opts.search; + this.title_icon_$.addClass('Rk-Twitter-Title-Icon'); + this.title_$.html(this.search).addClass("Rk-Twitter-Title"); + this.refresh(); +} + +Rkns.Twitter.Bin.prototype.refresh = function() { + var _this = this; + Rkns.$.ajax({ + url: "http://search.twitter.com/search.json?q=" + encodeURIComponent(this.search), + dataType: "jsonp", + success: function(_data) { + var _rgxp = new RegExp('('+_this.search.replace(/(\W)/g,'\\$1')+')','gi'); + function highlight(_text) { + return _text.replace(_rgxp, "$1"); + } + var _html = Rkns._(_data.results).map(function(_result) { + var _entities = [], + _users = _result.text.match(/@[\w_]+/gm), + _lastpos = 0; + if (_users) { + for (var _i = 0; _i < _users.length; _i++) { + var _m = _users[_i], + _start = _lastpos + _result.text.substr(_lastpos).search(_m), + _lastpos = _start + _m.length; + _entities.push({ + "text" : _m, + "start" : _start, + "end" : _lastpos, + "link" :'', + }); + } + } + var _hashes = _result.text.match(/([^&]|^)#[^\s,.!?=#@&;()]+/gm), + _lastpos = 0; + if (_hashes) { + for (var _i = 0; _i < _hashes.length; _i++) { + var _m = _hashes[_i], + _h = ( _m[0] == '#' ? _m : _m.substr(1) ), + _start = _lastpos + _result.text.substr(_lastpos).search(_h), + _lastpos = _start + _h.length; + _entities.push({ + "text" : _h, + "start" : _start, + "end" : _lastpos, + "link" :'', + }); + } + } + + var _urls = _result.text.match(/(www\.|https?:\/\/)[\w./_\-]+/gim), + _lastpos = 0; + if (_urls) { + for (var _i = 0; _i < _urls.length; _i++) { + var _m = _urls[_i], + _start = _lastpos + _result.text.substr(_lastpos).search(_m), + _lastpos = _start + _m.length; + _entities.push({ + "text" : _m, + "start" : _start, + "end" : _lastpos, + "link" :'', + }); + } + } + _entities = Rkns._(_entities).sortBy(function(a) { return a.start }); + var _lastend = 0, + _text = Rkns._(_entities).map(function(_e) { + var _txt = highlight(_result.text.substring(_lastend, _e.start)) + _e.link + highlight(_e.text) + ''; + _lastend = _e.end; + return _txt; + }).join("") + highlight(_result.text.substring(_lastend)); + + return _this.tweetTemplate({ + tweet: _result, + date: new Date(_result.created_at.replace(/(\+|-)/,'UTC$1')).toLocaleString(), + text: _text + }); + }).join(""); + _this.main_$.html(_html); + _renkan.resizeBins(); + } + }); +}