(function($) {
  function interpolator(c0, c1) {
    if (c0 == c1) return function() { return c0; };
    var i0 = parseInt(c0, 16), i1 = parseInt(c1, 16);
    var delta = i1 - i0;
    return function(x) {
      var i = Math.round(i0 + x * delta);
      return (i < 16 ? "0" : "") + i.toString(16);
    }
  }
  function color_interpolator(color0, color1) {
    var re = /#?(..)(..)(..)/;
    var c0 = re.exec(color0);
    var c1 = re.exec(color1);
    var r = interpolator(c0[1], c1[1]);
    var g = interpolator(c0[2], c1[2]);
    var b = interpolator(c0[3], c1[3]);
    return function(x) {
      return "#" + r(x) + g(x) + b(x);
    }
  }

  window.initCloud = function(nbBucklets, tagDistribution) {
  // sort
  var $sort = $('#sort');
  var comparators = {
    relevance: function(a, b) { return Number(b.getAttribute("importance")) - Number(a.getAttribute("importance")); },
    name: function(a, b) { var ta = $(a).text(), tb = $(b).text(); 
                           return ta < tb ? -1 : ta > tb ? 1 : 0; },
    freshness: function(a, b) { return Number(a.getAttribute("staleness")) - Number(b.getAttribute("staleness")); }
  };
  var $tags = $("#tagList > li");
  function sortTags() {
    var sortBy = $sort.find("a.selected").attr("name");
    Array.prototype.sort.call($tags, comparators[sortBy]);
    $("#tagList").append($tags);
  };
  sortTags();
  var $sortBys = $sort.find("a").click(function() {
    $sortBys.removeClass("selected");
    $(this).addClass("selected");
    sortTags();
    return false;
  });

  var color = color_interpolator("#300030", "#A6639A");

  var i = nbBucklets;
  var $mostImportantTopics = $([]);
  for(var k in tagDistribution) {
    tagDistribution[k] = i / nbBucklets;
    if ($mostImportantTopics.length < 20) {
      $mostImportantTopics = $mostImportantTopics.add($tags.filter("[importance=" + k + "]"));
    }
    i--;
  }
  Array.prototype.sort.call($tags, comparators.freshness);
  var $freshestTopics = $tags.slice(0, 20);
  $freshestTopics.addClass('freshest');
  $mostImportantTopics.addClass('freshest');
  $("#toggleAllTopics").toggle(function() {
    $("#tagList").toggleClass("display-only-freshest");
    $(this).text("Show only main topics");
  }, function() {
    $("#tagList").toggleClass("display-only-freshest");
    $(this).text("Display all topics");
  });

  $tags.each(function() {
    var $this = $(this);
    var importance = $this.attr('importance');
    var ssize = 80+200*tagDistribution[importance];
    var staleness = Math.min(Number($this.attr("staleness")) / 1826, 1); // 5 * 365 + 1
    $this.css('font-size',ssize+"%").children("a").css("color", color(Math.pow(staleness, 0.3)));
  });
  };
})(jQuery);

