Twitter Trends Explained (Jetpack)

By blindgaenger Uploaded Jun 11, 2009
// ==UserScript==
// @name           Twitter Trends Explained
// @fullname       Twitter Trends Explained
// @namespace      http://userscripts.org/scripts/show/51003
// @description    Adds a tooltip to each 'Trending Topic' to let you know what the trend is all about (using the 'What The Trend?' service).
// @include        http://twitter.com/*
// @include        http://search.twitter.com/*
// @version        2009-06-11
// ==/UserScript==

function explainTrends(linkElements) {
  $(linkElements).each(function(){
    var linkElement = this;
    var trendName = encodeURIComponent($(linkElement).text());
    var trendURL = "http://www.whatthetrend.com/api/trend/getByName/" + trendName + "/jsonp/callback=?";

    $.getJSON(trendURL, function(json){
      var explanation;
      try {
        explanation = (json.api.error) ? json.api.error : json.api.trend.blurb.text;
        if (!explanation) explanation = "Trend not explained yet.";
      } catch(ex) {
        explanation = "Sorry, could not get trend explanation."
      }
      createTooltip(linkElement, explanation);
    });
  });
}

function createTooltip(linkElement, explanation) {
  $(linkElement).attr('tooltip', $(linkElement).attr('title'))
  $(linkElement).attr('title', explanation);

  // unfortunately twitter uses @title as query string for their 
  // ajax search query so we have to toggle between them
  var toggleTooltip = function() {
    var tooltip = $(this).attr('tooltip');
    $(this).attr('tooltip', $(this).attr('title'));
    $(this).attr('title', tooltip);
  }

  $(linkElement).mousedown(toggleTooltip);
  $(linkElement).bind('loaded', toggleTooltip);
}

function execJQuery(doc) {
  if (doc.location.href.match(/http:\/\/(.*)twitter.com/gi)) {
    explainTrends($('#hot p a', doc));
    explainTrends($('#hot li a', doc));
    explainTrends($('.trends-links li a', doc));
  }
}

jetpack.statusBar.append({
  html: '<img alt="Twitter Trends Explained" src="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAMQOAADEDgAAAAAAAAAAAACz/v6m0f///8L////C////wv///8L////C////wf///8H////B////wP///8H////B////wP///8D////P////tv7+msT9+P+ysX//sr+V/7POr/+yxab/ssCi/7PZyP+zz7v/tdnB/7Xhzf+x2sn/sd7T/7Th1/+159z/wv38/7f+/prG////sqFs/7Opdv+39O3/tuve/7Xm2/+1593/tdPA/7bYwv+228L/sb6d/7C4of+0u6T/uMOq/8X48/+5/v6ayPz6/7O1kf+ynmj/uv///7n///+5////uf///7n///+4////uP///7n///+5////uP///7f////F////vP7+msfx5/+yqIT/s6N5/7jk1/+8////uvv3/7r9/P+6////uv///7r///+6////uf///7r///+6////yP///7z+/prN////tcSq/7fPuv+0q4n/vfr2/7Sja/+1r37/vf///7z///+8////vP///7z///+8////u////8n////A/v6ayOXZ/7G5m/+/////tr2j/7KYav+74dL/t7yT/7rdyP++////vv///77///+9////vf///73////M////wf7+msrp3v+zvqH/wv///8D///++8ev/wf///7vXv/+4ton/wP///8D////A////v////7////+/////zf///8P+/prR////ucKi/8P////C////wv///8L////B+fb/t6d2/8L////A9vL/tq+F/7/07v/B////wf///8/////F/v6ayde8/7muhf/F////xP///8T////E////xf///7q7mf+6waT/uK59/7mxiv+4roH/w////8P////R////yP7+msvjy/+zonj/x////8X////F////xf///8X////E+PX/tpRk/77RuP/I////urOJ/8Ddyv/G////0////8v+/prR9OT/tKV6/8v////I////yP///8j////H////x////8j////H////x////8Tw5/+7tIj/vsqp/9T////D+/aaybyH/7q5lP/H////x////8j////J////yf///8r////K////yv///8r//v/F3sv/uI1I/7iXW//Z////oP79mq/26v+l6tv/pv///6j///+q////rf///7D///+y////tP///7f///+6////uvXu/7Owf/+1lFb/0P///5n9/qax////pP///6T///+k////pP///6T///+k////pf///6X///+m////p////6j///+r////rP///7r///+c+f5dqP7+mpv6/pqb+v6am/r+mpv7/pqb+/6amfv+mpn7/pqZ/f6amf3+mpj9/pqY/f6amP3+mpb+/pqi/v6agAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAA//8AAA==" />',
  width: 16,
  onReady: function(widget) {
    $(widget).click(function(event) {
      if (event.button == 0) {
        jetpack.tabs.open("http://whatthetrend.com/").focus();
      }
    });
    jetpack.tabs.onReady(execJQuery);
  }
});