// relativedates.js
// Nathan Ashby-Kuhlman
// 2002-12-19
//
// I'm hereby releasing this script into the public domain.
// Do whatever you want with it, especially if you want to make it better.


var monthAbbreviations = new Array("January ", "February ", "March ", "April ", "May ", "June ", "July ", "August ", "September ", "October ", "November ", "December ");
var daysOfTheWeek = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

// In milliseconds:
ONEDAYAGO = -86400000;
ONEDAYFROMNOW = 86400000;
TWODAYSAGO = -172800000;
SEVENDAYSAGO = -604800000;
SIXDAYSFROMNOW = 518400000;

function dateReference(dateString) {
  var relative = relativeDate(dateString);
  var explicit = explicitDate(dateString, true);
  if (relative != explicit) {
    document.write("<acronym title=\"" + explicit + "\">" + relative + "</acronym>");
  } else {
    document.write(explicit);
  }
}

function relativeDate(dateString) {
  var now = new Date();
  var reference = new Date(dateString);
  if (isNaN(reference)) return dateString;
  // Calculate time offset between the two dates
  var offset = reference.getTime() - now.getTime();

  // Today, tomorrow, yesterday
  if ((offset > ONEDAYAGO) && (offset <= 0)) return "today";
  if ((offset > 0) && (offset < ONEDAYFROMNOW )) return "tomorrow";
  if ((offset > TWODAYSAGO) && (offset <= ONEDAYAGO)) return "yesterday";

  // Past week or coming week
  if ((offset > SEVENDAYSAGO) && (offset <= TWODAYSAGO)) return "last " + daysOfTheWeek[reference.getDay()];
  if ((offset >= ONEDAYFROMNOW) && (offset < SIXDAYSFROMNOW)) return "this " + daysOfTheWeek[reference.getDay()];

  // None of the above
  return explicitDate(dateString, false);
}

function explicitDate(dateString, includeYearRegardless) {
  var now = new Date();
  var reference = new Date(dateString);
  if (isNaN(reference)) return dateString;
  var date = reference.getDate();
  var month = monthAbbreviations[reference.getMonth()];
  // Unless specified, only include the year if it is different from the current year
  if ((reference.getFullYear() != now.getFullYear()) || includeYearRegardless) {
    var year = ", " + reference.getFullYear();
  } else {
    var year = "";
  }
  return(month + date + year);
}
