/*
 * Taken from:
 * http://dansnetwork.com/2008/11/01/javascript-iso8601rfc3339-date-parser/
 */
Date.rfc3339 = function(dString){
  var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))/;
  var date = new Date();
  if (dString.toString().match(new RegExp(regexp))) {
    var d = dString.match(new RegExp(regexp));
    var offset = 0;
    date.setUTCDate(1);
    date.setUTCFullYear(parseInt(d[1],10));
    date.setUTCMonth(parseInt(d[3],10) - 1);
    date.setUTCDate(parseInt(d[5],10));
    date.setUTCHours(parseInt(d[7],10));
    date.setUTCMinutes(parseInt(d[9],10));
    date.setUTCSeconds(parseInt(d[11],10));
    if (d[12]) {
      date.setUTCMilliseconds(parseFloat(d[12]) * 1000);
    }
    else {
      date.setUTCMilliseconds(0);
    }
    if (d[13] != 'Z') {
      offset = (d[15] * 60) + parseInt(d[17],10);
      offset *= ((d[14] == '-') ? -1 : 1);
      date.setTime(date.getTime() - offset * 60 * 1000);
    }
  }
  else {
    date.setTime(Date.parse(dString));
  }
  return date;
};

/*
 * Returns a description of this past date in relative terms.
 * Example: '3 years ago'
 */
Date.prototype.toRelativeTime = function() {
  var delta       = new Date() - this;
  var units       = null;
  var conversions = {
    millisecond: 1, // ms    -> ms
    second: 1000,   // ms    -> sec
    minute: 60,     // sec   -> min
    hour:   60,     // min   -> hour
    day:    24,     // hour  -> day
    month:  30,     // day   -> month (roughly)
    year:   12      // month -> year
  };

  for(var key in conversions) {
    if(delta < conversions[key]) {
      break;
    } else {
      units = key; // keeps track of the selected key over the iteration
      delta = delta / conversions[key];
    }
  }

  // pluralize a unit when the difference is greater than 1.
  delta = Math.floor(delta);
  if(delta !== 1) { units += "s"; }
  return [delta, units, "ago"].join(" ");
};

/*
 * Wraps up a common pattern used with this plugin whereby you take a String
 * representation of a Date, and want back a date object.
 */
Date.fromString = function(str) {
  return new Date(Date.parse(str));
};
