
function referrerwidget(apikey, divid, theme, limit)
{
  this.apikey = apikey;
  this.divid = divid;
  this.theme = theme;
  this.limit = limit;

  if (!this.theme)
    this.theme = "";
  
  if (!this.limit)
    this.limit = 5;

  var thisobj = this;
  
  var jsonp = 'referrerwidget.cback' + Math.round(Math.random()*10000000);
  eval(jsonp + "= function(data) { thisobj.draw(data); }");

  var host = location.host;
  var pname = location.pathname;

  var dataurl = 'http://api.chartbeat.com/summize/?host='+this.clean_domain(host)+'&path='+encodeURIComponent(pname)+'&jsonp=' + jsonp + '&apikey=' + apikey;

  var headID = document.getElementsByTagName("head")[0];         
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = dataurl;
  headID.appendChild(newScript);
}

referrerwidget.sort = function(a, b)
{
  if (a["count"] > b["count"])
    return -1;
  if (a["count"] < b["count"])
    return 1;

  return 0;
}

referrerwidget.prototype.draw = function(data)
{
  var themes = { '': { 'bgcolor': 'f0f7ea', 'border': 'dde7d4' },
		 'blue': { 'bgcolor': 'c4e3eb', 'border': '77a0ab' },
		 'silver': { 'bgcolor': 'e7e7e7', 'border': 'cccccc' },
		 'green': { 'bgcolor': 'c6dfa7', 'border': 'bdc1a3' },
		 'rose': { 'bgcolor': 'f5c5be', 'border': 'e1cab1' }		
               }

  var html = '<table border="0" cellpadding="0" cellspacing="0" style="background-color:#'+themes[this.theme]['bgcolor']+'; border: 1px solid #'+themes[this.theme]['border']+'; width: 200px; -moz-border-radius: 15px;-webkit-border-radius: 15px;"><tr><td style="text-align:center;color:#555555;font-size:18px; padding-bottom: 10px;">Current visitors to this page came from:</td></tr>';

  var dcounts = new Array();
  for (var domain in data["referers"])
    for (var path in data["referers"][domain])
      dcounts.push({ "domain": domain, "path": path, "count": data["referers"][domain][path] });

  dcounts.sort(referrerwidget.sort);

  if (!data.length)
    html += '<tr><td style="padding:5px; font-size: 14px; text-align: center;">currently no referrers</td></tr>';

  for (var x = 0; x < dcounts.length && x < this.limit; ++x)
  {
    html += '<tr>';

    var title = this.clean_domain(dcounts[x]["domain"]);
    if (!title)
      var href = "direct";
    else
      var href = '<a href="http://' + dcounts[x]["domain"] + dcounts[x]["path"] + '" target="_blank" style="color: #5469d5; font-size: 12px; text-decoration:none;">' + this.truncate(title, 40) + '</a>';

    var people = (dcounts[x]["count"] == 1) ? '1 person' : dcounts[x]["count"] + ' people';

    html += '<td style="padding:5px; padding-left: 10px; color: #55555; font-size: 12px;">'+href+'<div style="font-size:10px; float: right;">' + people + '</div></td>';

    html += '</tr>';
  }

  html += '</table><div style="font-size:8px; text-align: right; width: 200px; color: #aaa"><a href="http://chartbeat.com" style="font-size:8px;color:#aaa;text-decoration:none;" target="_blank">powered by chartbeat</a></div>';


  if (this.divid)
    document.getElementById(this.divid).innerHTML = html;
  else
    document.write(html);
}

referrerwidget.prototype.truncate = function(str, len)
{
  if (str.length <= len)
    return str;

  return str.substr(str, len - 3) + "...";
}


referrerwidget.prototype.clean_domain = function(domain)
{
  domain = domain.replace(/^https?:\/\//i,'');
  domain = domain.replace(/\s*/g,'');
  domain = domain.replace(/^(www.)/i,'');
  domain = domain.replace(/\/.*/g,'');
  domain = domain.replace(/[^0-9A-Za-z.-]*/g,'');

  return domain;
}
