1 | Dates = {}
|
2 |
|
3 | Dates.padNumber = (num, count, padCharacter) ->
|
4 | padCharacter = '0' if typeof padCharacter is 'undefined'
|
5 | lenDiff = count - String(num).length
|
6 | padding = ''
|
7 | padding += padCharacter while lenDiff-- if lenDiff > 0
|
8 | padding + num
|
9 |
|
10 | Dates.dayOfYear = (date) ->
|
11 | oneJan = new Date(date.getFullYear(), 0, 1)
|
12 | Math.ceil (date - oneJan) / 86400000
|
13 |
|
14 | Dates.weekOfYear = (date) ->
|
15 | oneJan = new Date(date.getFullYear(), 0, 1)
|
16 | Math.ceil (((date - oneJan) / 86400000) + oneJan.getDay() + 1) / 7
|
17 |
|
18 | Dates.isoWeekOfYear = (date) ->
|
19 | target = new Date(date.valueOf())
|
20 | dayNr = (date.getDay() + 6) % 7
|
21 | target.setDate target.getDate() - dayNr + 3
|
22 | jan4 = new Date(target.getFullYear(), 0, 4)
|
23 | dayDiff = (target - jan4) / 86400000
|
24 | 1 + Math.ceil(dayDiff / 7)
|
25 |
|
26 | Dates.tweleveHour = (date) ->
|
27 | if date.getHours() > 12 then date.getHours() - 12 else date.getHours()
|
28 |
|
29 | Dates.timeZoneOffset = (date) ->
|
30 | hoursDiff = (-date.getTimezoneOffset() / 60)
|
31 | result = Dates.padNumber Math.abs(hoursDiff), 4
|
32 | (if hoursDiff > 0 then '+' else '-') + result
|
33 |
|
34 | Dates.format = (date, format) ->
|
35 | format.replace Dates.formats, (m, p) ->
|
36 | switch p
|
37 | when 'a' then Dates.abbreviatedWeekdays[date.getDay()]
|
38 | when 'A' then Dates.fullWeekdays[date.getDay()]
|
39 | when 'b' then Dates.abbreviatedMonths[date.getMonth()]
|
40 | when 'B' then Dates.fullMonths[date.getMonth()]
|
41 | when 'c' then date.toLocaleString()
|
42 | when 'C' then Math.round date.getFullYear() / 100
|
43 | when 'd' then Dates.padNumber date.getDate(), 2
|
44 | when 'D' then Dates.format date, '%m/%d/%y'
|
45 | when 'e' then Dates.padNumber date.getDate(), 2, ' '
|
46 | when 'F' then Dates.format date, '%Y-%m-%d'
|
47 | when 'h' then Dates.format date, '%b'
|
48 | when 'H' then Dates.padNumber date.getHours(), 2
|
49 | when 'I' then Dates.padNumber Dates.tweleveHour(date), 2
|
50 | when 'j' then Dates.padNumber Dates.dayOfYear(date), 3
|
51 | when 'k' then Dates.padNumber date.getHours(), 2, ' '
|
52 | when 'l' then Dates.padNumber Dates.tweleveHour(date), 2, ' '
|
53 | when 'L' then Dates.padNumber date.getMilliseconds(), 3
|
54 | when 'm' then Dates.padNumber date.getMonth() + 1, 2
|
55 | when 'M' then Dates.padNumber date.getMinutes(), 2
|
56 | when 'n' then '\n'
|
57 | when 'p' then (if date.getHours() > 11 then 'PM' else 'AM')
|
58 | when 'P' then Dates.format(date, '%p').toLowerCase()
|
59 | when 'r' then Dates.format date, '%I:%M:%S %p'
|
60 | when 'R' then Dates.format date, '%H:%M'
|
61 | when 's' then date.getTime() / 1000
|
62 | when 'S' then Dates.padNumber date.getSeconds(), 2
|
63 | when 't' then '\t'
|
64 | when 'T' then Dates.format date, '%H:%M:%S'
|
65 | when 'u' then (if date.getDay() is 0 then 7 else date.getDay())
|
66 | when 'U' then Dates.padNumber Dates.weekOfYear(date), 2
|
67 | when 'v' then Dates.format date, '%e-%b-%Y'
|
68 | when 'V' then Dates.padNumber Dates.isoWeekOfYear(date), 2
|
69 | when 'W' then Dates.padNumber Dates.weekOfYear(date), 2
|
70 | when 'w' then Dates.padNumber date.getDay(), 2
|
71 | when 'x' then date.toLocaleDateString()
|
72 | when 'X' then date.toLocaleTimeString()
|
73 | when 'y' then String(date.getFullYear()).substring 2
|
74 | when 'Y' then date.getFullYear()
|
75 | when 'z' then Dates.timeZoneOffset date
|
76 | else match
|
77 |
|
78 | Dates.formats = /%(a|A|b|B|c|C|d|D|e|F|h|H|I|j|k|l|L|m|M|n|p|P|r|R|s|S|t|T|u|U|v|V|W|w|x|X|y|Y|z)/g
|
79 | Dates.abbreviatedWeekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat']
|
80 | Dates.fullWeekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
|
81 | Dates.abbreviatedMonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
82 | Dates.fullMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
|
83 |
|
84 |
|
85 | Handlebars.registerHelper 'formatDate', (date, format) ->
|
86 | date = new Date date
|
87 | Dates.format date, format
|
88 |
|
89 | Handlebars.registerHelper 'now', (format) ->
|
90 | date = new Date()
|
91 | if Utils.isUndefined(format) then date else Dates.format(date, format)
|
92 |
|
93 |
|
94 | Handlebars.registerHelper 'timeago', (date) ->
|
95 | date = new Date date
|
96 | seconds = Math.floor((new Date() - date) / 1000)
|
97 |
|
98 | interval = Math.floor(seconds / 31536000)
|
99 | return "#{interval} years ago" if interval > 1
|
100 |
|
101 | interval = Math.floor(seconds / 2592000)
|
102 | return if interval > 1 then "#{interval} months ago"
|
103 |
|
104 | interval = Math.floor(seconds / 86400)
|
105 | return if interval > 1 then "#{interval} days ago"
|
106 |
|
107 | interval = Math.floor(seconds / 3600)
|
108 | return if interval > 1 then "#{interval} hours ago"
|
109 |
|
110 | interval = Math.floor(seconds / 60)
|
111 | return if interval > 1 then "#{interval} minutes ago"
|
112 |
|
113 | if Math.floor(seconds) is 0 then 'Just now' else Math.floor(seconds) + ' seconds ago'
|