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