|
|
// Livestamp.js / v1.1.2 / (c) 2012 Matt Bradley / MIT License
(function($, moment) { var updateInterval = 1e3, paused = false, $livestamps = $([]),
init = function() { livestampGlobal.resume(); },
prep = function($el, timestamp) { var oldData = $el.data('livestampdata'); if (typeof timestamp == 'number') timestamp *= 1e3;
$el.removeAttr('data-livestamp') .removeData('livestamp');
timestamp = moment(timestamp); if (moment.isMoment(timestamp) && !isNaN(+timestamp)) { var newData = $.extend({ }, { 'original': $el.contents() }, oldData); newData.moment = moment(timestamp);
$el.data('livestampdata', newData).empty(); $livestamps.push($el[0]); } },
run = function() { if (paused) return; livestampGlobal.update(); setTimeout(run, updateInterval); },
livestampGlobal = { update: function() { $('[data-livestamp]').each(function() { var $this = $(this); prep($this, $this.data('livestamp')); });
var toRemove = []; $livestamps.each(function() { var $this = $(this), data = $this.data('livestampdata');
if (data === undefined) toRemove.push(this); else if (moment.isMoment(data.moment)) { var from = $this.html(), to = data.moment.fromNow();
if (from != to) { var e = $.Event('change.livestamp'); $this.trigger(e, [from, to]); if (!e.isDefaultPrevented()) $this.html(to); } } });
$livestamps = $livestamps.not(toRemove); },
pause: function() { paused = true; },
resume: function() { paused = false; run(); },
interval: function(interval) { if (interval === undefined) return updateInterval; updateInterval = interval; } },
livestampLocal = { add: function($el, timestamp) { if (typeof timestamp == 'number') timestamp *= 1e3; timestamp = moment(timestamp);
if (moment.isMoment(timestamp) && !isNaN(+timestamp)) { $el.each(function() { prep($(this), timestamp); }); livestampGlobal.update(); }
return $el; },
destroy: function($el) { $livestamps = $livestamps.not($el); $el.each(function() { var $this = $(this), data = $this.data('livestampdata');
if (data === undefined) return $el;
$this .html(data.original ? data.original : '') .removeData('livestampdata'); });
return $el; },
isLivestamp: function($el) { return $el.data('livestampdata') !== undefined; } };
$.livestamp = livestampGlobal; $(init); $.fn.livestamp = function(method, options) { if (!livestampLocal[method]) { options = method; method = 'add'; }
return livestampLocal[method](this, options); }; })(jQuery, moment);
|