mislav (owner)

Fork Of

Forks

Revisions

gist: 58799 Download_button fork
public
Description:
Update contents of elements with relative times
Public Clone URL: git://gist.github.com/58799.git
Embed All Files: show embed
JavaScript #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
document.observe("dom:loaded", function() {
  function updateElementsWithTime() {
    $$("span[time]").invoke('updateTime')
  }
  
  // update immediately
  updateElementsWithTime()
  // continue updating every 2 minutes
  new PeriodicalExecuter(updateElementsWithTime, 60 * 2)
})
 
Element.addMethods({
  updateTime: function(element) {
    element = $(element)
    var time = element.readAttribute("time")
    var relativeTime = DateHelper.time_ago_in_words_with_parsing(time)
    element.update(relativeTime)
    return element
  }
})
 
var DateHelper = {
  // Takes the format of "Jan 15, 2007 15:45:00 GMT" and converts it to a relative time
  // Ruby strftime: %b %d, %Y %H:%M:%S GMT
  time_ago_in_words_with_parsing: function(from) {
    var date = new Date;
    date.setTime(Date.parse(from));
    return this.time_ago_in_words(date);
  },
  
  time_ago_in_words: function(from) {
    return this.distance_of_time_in_words(new Date, from);
  },
 
  distance_of_time_in_words: function(to, from) {
    var distance_in_seconds = ((to - from) / 1000);
    var distance_in_minutes = (distance_in_seconds / 60).floor();
 
    if (distance_in_minutes == 0) { return 'less than a minute ago'; }
    if (distance_in_minutes == 1) { return 'a minute ago'; }
    if (distance_in_minutes < 45) { return distance_in_minutes + ' minutes ago'; }
    if (distance_in_minutes < 90) { return 'about 1 hour ago'; }
    if (distance_in_minutes < 1440) { return 'about ' + (distance_in_minutes / 60).floor() + ' hours ago'; }
    if (distance_in_minutes < 2880) { return '1 day ago'; }
    if (distance_in_minutes < 43200) { return (distance_in_minutes / 1440).floor() + ' days ago'; }
    if (distance_in_minutes < 86400) { return 'about 1 month ago'; }
    if (distance_in_minutes < 525960) { return (distance_in_minutes / 43200).floor() + ' months ago'; }
    if (distance_in_minutes < 1051199) { return 'about 1 year ago'; }
 
    return 'over ' + (distance_in_minutes / 525960).floor() + ' years ago';
  }
};