(function() { 'use strict'; window.Whisper = window.Whisper || {}; Whisper.TimestampView = Whisper.View.extend({ initialize: function(options) { extension.windows.onClosed(this.clearTimeout.bind(this)); }, update: function() { this.clearTimeout(); var millis_now = Date.now(); var millis = this.$el.data('timestamp'); if (millis === '') { return; } if (millis >= millis_now) { millis = millis_now; } var result = this.getRelativeTimeSpanString(millis); this.$el.text(result); var timestamp = moment(millis); this.$el.attr('title', timestamp.format('llll')); var millis_since = millis_now - millis; if (this.delay) { if (this.delay < 0) { this.delay = 1000; } this.timeout = setTimeout(this.update.bind(this), this.delay); } }, clearTimeout: function() { clearTimeout(this.timeout); }, getRelativeTimeSpanString: function(timestamp_) { // Convert to moment timestamp if it isn't already var timestamp = moment(timestamp_), now = moment(), timediff = moment.duration(now - timestamp); if (timediff.years() > 0) { this.delay = null; return timestamp.format(this._format.y); } else if (timediff.months() > 0 || timediff.days() > 6) { this.delay = null; return timestamp.format(this._format.M); } else if (timediff.days() > 0) { this.delay = moment(timestamp) .add(timediff.days() + 1, 'd') .diff(now); return timestamp.format(this._format.d); } else if (timediff.hours() > 1) { this.delay = moment(timestamp) .add(timediff.hours() + 1, 'h') .diff(now); return this.relativeTime(timediff.hours(), 'h'); } else if (timediff.hours() === 1) { this.delay = moment(timestamp) .add(timediff.hours() + 1, 'h') .diff(now); return this.relativeTime(timediff.hours(), 'h'); } else if (timediff.minutes() > 1) { this.delay = moment(timestamp) .add(timediff.minutes() + 1, 'm') .diff(now); return this.relativeTime(timediff.minutes(), 'm'); } else if (timediff.minutes() === 1) { this.delay = moment(timestamp) .add(timediff.minutes() + 1, 'm') .diff(now); return this.relativeTime(timediff.minutes(), 'm'); } else { this.delay = moment(timestamp) .add(1, 'm') .diff(now); return this.relativeTime(timediff.seconds(), 's'); } }, relativeTime: function(number, string) { return moment.duration(number, string).humanize(); }, _format: { y: 'll', M: i18n('timestampFormat_M') || 'MMM D', d: 'ddd', }, }); Whisper.ExtendedTimestampView = Whisper.TimestampView.extend({ relativeTime: function(number, string, isFuture) { return moment.duration(-1 * number, string).humanize(string !== 's'); }, _format: { y: 'lll', M: (i18n('timestampFormat_M') || 'MMM D') + ' LT', d: 'ddd LT', }, }); })();