/*
 * timeago: a jQuery plugin, version: 0.6.2 (10/14/2008)
 * @requires jQuery v1.2 or later
 *
 * Timeago is a jQuery plugin that makes it easy to support automatically
 * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
 *
 * For usage and examples, visit:
 * http://timeago.yarp.com/
 *
 * Licensed under the MIT:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright (c) 2008, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)
 */

var TimeAgo = function(element, timestamp) {
  this.element = element;

  timestamp = this.normalizeDate(timestamp || element.getAttribute("title"));

  if(!timestamp || isNaN(timestamp)) return;

  this.timestamp = timestamp;
  this.refresh();

  if (this.settings.refreshMillis < 0) return;

  if (this.element.timeagotimer) {
    clearInterval(this.element.timeagotimer);
  }

  var self = this;
  this.element.timeagotimer = setInterval(function() { self.refresh.apply(self); }, this.settings.refreshMillis);
};

(function() {

var sprintf = function (astring, value) {
  return astring.replace(/%d/i, value);
};

var distance = function(relative_to) {
  return (new Date().getTime() - relative_to.getTime());
};

var parse = function(iso8601) {
  var s = iso8601; // FIXME: trim
  s = s.replace(/-/,"/").replace(/-/,"/");
  s = s.replace(/T/," ").replace(/Z/," UTC");
  s = s.replace(/([\+-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
  return new Date(s);
};

TimeAgo.prototype = {
  parse: parse,

  refresh: function() {
    this.updateElement(this.inWords(this.timestamp));
  },

  updateElement: function(words) {
    this.element.innerHTML = words;
  },

  settings: {
    refreshMillis: 60000,
    allowFuture: false,
    strings: {
      prefixAgo: null,
      prefixFromNow: null,
      suffixAgo: "ago",
      suffixFromNow: "from now",
      ago: null, // DEPRECATED, use suffixAgo
      fromNow: null, // DEPRECATED, use suffixFromNow
      seconds: "less than a minute",
      minute: "about a minute",
      minutes: "%d minutes",
      hour: "about an hour",
      hours: "about %d hours",
      day: "a day",
      days: "%d days",
      month: "about a month",
      months: "%d months",
      year: "about a year",
      years: "%d years"
    }
  },

  normalizeDate: function(normalize) {
    if(!normalize) {
      return;
    }

    if (normalize instanceof Date) {
      return normalize;
    }

    if (normalize.getAttribute) {
      normalize = normalize.getAttribute("title");
    }

    if (typeof normalize == "string") {
      return parse(normalize);
    }
  },

  inWords: function(distanceMillis) {
    if(distanceMillis instanceof Date)
      distanceMillis = distance(distanceMillis);

    var $l = this.settings.strings;
    var prefix = $l.prefixAgo;
    var suffix = $l.suffixAgo || $l.ago;

    if (this.settings.allowFuture) {
      if (distanceMillis < 0) {
        prefix = $l.prefixFromNow;
        suffix = $l.suffixFromNow || $l.fromNow;
      }
      distanceMillis = Math.abs(distanceMillis);
    }
 
    var seconds = distanceMillis / 1000;
    var minutes = seconds / 60;
    var hours = minutes / 60;
    var days = hours / 24;
    var years = days / 365;
 
    var words = seconds < 45 && sprintf($l.seconds, Math.round(seconds)) ||
      seconds < 90 && $l.minute ||
      minutes < 45 && sprintf($l.minutes, Math.round(minutes)) ||
      minutes < 90 && $l.hour ||
      hours < 24 && sprintf($l.hours, Math.round(hours)) ||
      hours < 48 && $l.day ||
      days < 30 && sprintf($l.days, Math.floor(days)) ||
      days < 60 && $l.month ||
      days < 365 && sprintf($l.months, Math.floor(days / 30)) ||
      years < 2 && $l.year ||
      sprintf($l.years, Math.floor(years));
 
    return [prefix, words, suffix].join(" "); // FIXME: trim
  }
};

// stolen from jquery
var userAgent = navigator.userAgent.toLowerCase();
var version = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1];
var msie = /msie/.test( userAgent ) && !/opera/.test( userAgent );

// fix for IE6 suckage
if( msie && version < 7.0 ) {
    document.createElement('abbr');
}

}());
