2008-07-18 11:34:06 -04:00
/ *
2008-08-19 19:40:43 -04:00
* timeago : a jQuery plugin , version : 0.5 ( 08 / 19 / 2008 )
2008-07-18 11:34:06 -04:00
* @ requires jQuery v1 . 2 or later
*
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps ( e . g . "4 minutes ago" or "about 1 day ago" ) .
*
* For usage and examples , visit :
* http : //timeago.yarp.com/
*
* Licensed under the MIT :
* http : //www.opensource.org/licenses/mit-license.php
*
* Copyright ( c ) 2008 , Ryan McGeary ( ryanonjavascript - [ at ] - mcgeary [ * dot * ] org )
* /
( function ( $ ) {
$ . timeago = function ( timestamp ) {
2008-07-20 17:08:34 -04:00
if ( timestamp instanceof Date ) return inWords ( timestamp ) ;
else if ( typeof timestamp == "string" ) return inWords ( $ . timeago . parse ( timestamp ) ) ;
2008-07-30 10:38:21 -04:00
else return inWords ( $ . timeago . parse ( $ ( timestamp ) . attr ( "title" ) ) ) ;
2008-07-18 11:34:06 -04:00
} ;
2008-08-19 19:40:43 -04:00
var $t = $ . timeago ;
2008-07-18 11:34:06 -04:00
$ . extend ( $ . timeago , {
settings : {
2008-08-06 07:04:15 -04:00
refreshMillis : 60000 ,
2008-08-19 19:40:43 -04:00
allowFuture : false ,
strings : {
ago : "ago" ,
fromNow : "from now" ,
seconds : "less than a minute" ,
minute : "about a minute" ,
minutes : "%d minutes" ,
hour : "about an hour" ,
hours : "about %d hours" ,
day : "a day" ,
days : "%d days" ,
month : "about a month" ,
months : "%d months" ,
year : "about a year" ,
years : "%d years"
}
2008-07-18 11:34:06 -04:00
} ,
inWords : function ( distanceMillis ) {
2008-08-19 19:40:43 -04:00
var $l = this . settings . strings ;
var suffix = $l . ago ;
2008-08-06 07:04:15 -04:00
if ( this . settings . allowFuture ) {
2008-08-19 19:40:43 -04:00
if ( distanceMillis < 0 ) suffix = $l . fromNow ;
2008-08-06 07:04:15 -04:00
distanceMillis = Math . abs ( distanceMillis ) ;
}
2008-07-18 11:34:06 -04:00
var seconds = distanceMillis / 1000 ;
var minutes = seconds / 60 ;
var hours = minutes / 60 ;
var days = hours / 24 ;
var years = days / 365 ;
2008-08-19 19:40:43 -04:00
var words = seconds < 45 && sprintf ( $l . seconds , Math . round ( seconds ) ) ||
seconds < 90 && $l . minute ||
minutes < 45 && sprintf ( $l . minutes , Math . round ( minutes ) ) ||
minutes < 90 && $l . hour ||
hours < 24 && sprintf ( $l . hours , Math . round ( hours ) ) ||
hours < 48 && $l . day ||
days < 30 && sprintf ( $l . days , Math . floor ( days ) ) ||
days < 60 && $l . month ||
days < 365 && sprintf ( $l . months , Math . floor ( days / 30 ) ) ||
years < 2 && $l . year ||
sprintf ( $l . years , Math . floor ( years ) ) ;
2008-07-18 11:34:06 -04:00
2008-08-19 19:40:43 -04:00
return words + " " + suffix ;
2008-07-18 11:34:06 -04:00
} ,
parse : function ( iso8601 ) {
2008-07-30 10:24:08 -04:00
var s = $ . trim ( iso8601 ) ;
2008-07-18 11:34:06 -04:00
s = s . replace ( /-/ , "/" ) . replace ( /-/ , "/" ) ;
s = s . replace ( /T/ , " " ) . replace ( /Z/ , " UTC" ) ;
s = s . replace ( /([\+-]\d\d)\:?(\d\d)/ , " $1$2" ) ; // -04:00 -> -0400
return new Date ( s ) ;
}
} ) ;
$ . fn . timeago = function ( ) {
var self = this ;
self . each ( refresh ) ;
2008-08-19 19:40:43 -04:00
var $s = $t . settings ;
2008-07-20 16:08:59 -04:00
if ( $s . refreshMillis > 0 ) {
2008-07-20 17:08:34 -04:00
setInterval ( function ( ) { self . each ( refresh ) ; } , $s . refreshMillis ) ;
2008-07-18 11:34:06 -04:00
}
2008-07-20 17:08:34 -04:00
return self ;
2008-07-18 11:34:06 -04:00
} ;
function refresh ( ) {
2008-08-19 19:40:43 -04:00
var date = $t . parse ( this . title ) ;
2008-07-19 10:36:59 -04:00
if ( ! isNaN ( date ) ) {
2008-07-20 17:08:34 -04:00
$ ( this ) . text ( inWords ( date ) ) ;
2008-07-19 10:36:59 -04:00
}
2008-07-20 17:08:34 -04:00
return this ;
}
function inWords ( date ) {
2008-08-19 19:40:43 -04:00
return $t . inWords ( distance ( date ) ) ;
2008-07-18 11:34:06 -04:00
}
function distance ( date ) {
return ( new Date ( ) . getTime ( ) - date . getTime ( ) ) ;
}
2008-08-19 19:40:43 -04:00
// lame sprintf implementation
function sprintf ( string , value ) {
return string . replace ( /%d/i , value ) ;
}
} ) ( jQuery ) ;