summaryrefslogtreecommitdiff
path: root/ikiwiki/relativedate.js
blob: e8643f4c1a6860a7c7de5c9bbd00a9807b83aa97 (plain)
  1. // © 2006-2010 Joey Hess
  2. // Redistribution and use in source and compiled forms, with or without
  3. // modification, are permitted under any circumstances. No warranty.
  4. //
  5. // Causes html elements in the 'relativedate' class to be displayed
  6. // as relative dates. The date is parsed from the title attribute, or from
  7. // the element content.
  8. var dateElements;
  9. hook("onload", getDates);
  10. function getDates() {
  11. dateElements = getElementsByClass('relativedate');
  12. for (var i = 0; i < dateElements.length; i++) {
  13. var elt = dateElements[i];
  14. var title = elt.attributes.title;
  15. var d = new Date(title ? title.value : elt.innerHTML);
  16. if (! isNaN(d)) {
  17. dateElements[i].date=d;
  18. elt.title=elt.innerHTML;
  19. }
  20. }
  21. showDates();
  22. }
  23. function showDates() {
  24. for (var i = 0; i < dateElements.length; i++) {
  25. var elt = dateElements[i];
  26. var d = elt.date;
  27. if (! isNaN(d)) {
  28. elt.innerHTML=relativeDate(d);
  29. }
  30. }
  31. setTimeout(showDates,30000); // keep updating every 30s
  32. }
  33. var timeUnits = [
  34. { unit: 'year', seconds: 60 * 60 * 24 * 364 },
  35. { unit: 'month', seconds: 60 * 60 * 24 * 30 },
  36. { unit: 'day', seconds: 60 * 60 * 24 },
  37. { unit: 'hour', seconds: 60 * 60 },
  38. { unit: 'minute', seconds: 60 },
  39. ];
  40. function relativeDate(date) {
  41. var now = new Date();
  42. var offset = date.getTime() - now.getTime();
  43. var seconds = Math.round(Math.abs(offset) / 1000);
  44. // hack to avoid reading just in the future if there is a minor
  45. // amount of clock slip
  46. if (offset >= 0 && seconds < 30 * 60 * 60) {
  47. return "just now";
  48. }
  49. var ret = "";
  50. var shown = 0;
  51. for (i = 0; i < timeUnits.length; i++) {
  52. if (seconds >= timeUnits[i].seconds) {
  53. var num = Math.floor(seconds / timeUnits[i].seconds);
  54. seconds -= num * timeUnits[i].seconds;
  55. if (ret)
  56. ret += "and ";
  57. ret += num + " " + timeUnits[i].unit + (num > 1 ? "s" : "") + " ";
  58. if (++shown == 2)
  59. break;
  60. }
  61. else if (shown)
  62. break;
  63. }
  64. if (! ret)
  65. ret = "less than a minute "
  66. return ret + (offset < 0 ? "ago" : "from now");
  67. }