2013-06-05 09:32:03 +10:00
Discourse . Formatter = ( function ( ) {
2013-06-07 18:03:09 +10:00
2013-06-11 06:48:50 +10:00
var updateRelativeAge , autoUpdatingRelativeAge , relativeAge , relativeAgeTiny ,
relativeAgeMedium , relativeAgeMediumSpan , longDate , toTitleCase ,
shortDate ;
2013-06-07 18:03:09 +10:00
2013-06-11 06:48:50 +10:00
shortDate = function ( date ) {
2013-06-11 17:25:50 +10:00
return moment ( date ) . shortDate ( ) ;
2013-06-11 06:48:50 +10:00
} ;
// http://stackoverflow.com/questions/196972/convert-string-to-title-case-with-javascript
// TODO: locale support ?
toTitleCase = function toTitleCase ( str )
{
return str . replace ( /\w\S*/g , function ( txt ) {
return txt . charAt ( 0 ) . toUpperCase ( ) + txt . substr ( 1 ) . toLowerCase ( ) ;
} ) ;
}
2013-06-07 18:27:25 +10:00
longDate = function ( dt ) {
2013-06-17 13:00:34 -04:00
if ( ! dt ) return ;
2013-06-11 17:25:50 +10:00
return moment ( dt ) . longDate ( ) ;
2013-06-07 18:27:25 +10:00
} ;
2013-06-05 09:32:03 +10:00
updateRelativeAge = function ( elems ) {
2013-06-11 06:48:50 +10:00
// jQuery .each
2013-06-05 09:32:03 +10:00
elems . each ( function ( ) {
var $this = $ ( this ) ;
2013-06-11 17:25:50 +10:00
$this . html ( relativeAge ( new Date ( $this . data ( 'time' ) ) , { format : $this . data ( 'format' ) , wrapInSpan : false } ) ) ;
2013-06-05 09:32:03 +10:00
} ) ;
} ;
autoUpdatingRelativeAge = function ( date , options ) {
2013-06-17 13:00:34 -04:00
if ( ! date ) return "" ;
2013-06-05 09:32:03 +10:00
options = options || { } ;
var format = options . format || "tiny" ;
2013-06-11 17:25:50 +10:00
var append = "" ;
if ( format === 'medium' ) {
append = " date' title='" + longDate ( date ) ;
if ( options . leaveAgo ) {
format = 'medium-with-ago' ;
}
options . wrapInSpan = false ;
}
return "<span class='relative-date" + append + "' data-time='" + date . getTime ( ) + "' data-format='" + format + "'>" + relativeAge ( date , options ) + "</span>" ;
2013-06-05 09:32:03 +10:00
} ;
2013-06-07 08:49:09 +10:00
relativeAgeTiny = function ( date , options ) {
var format = "tiny" ;
2013-06-05 09:32:03 +10:00
var distance = Math . round ( ( new Date ( ) - date ) / 1000 ) ;
2013-06-07 18:03:09 +10:00
var distanceInMinutes = Math . round ( distance / 60.0 ) ;
2013-06-05 09:32:03 +10:00
var formatted ;
var t = function ( key , opts ) {
return Ember . String . i18n ( "dates." + format + "." + key , opts ) ;
} ;
switch ( true ) {
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes < 1 ) :
2013-06-05 09:32:03 +10:00
formatted = t ( "less_than_x_minutes" , { count : 1 } ) ;
break ;
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes >= 1 && distanceInMinutes <= 44 ) :
formatted = t ( "x_minutes" , { count : distanceInMinutes } ) ;
2013-06-05 09:32:03 +10:00
break ;
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes >= 45 && distanceInMinutes <= 89 ) :
2013-06-05 09:32:03 +10:00
formatted = t ( "about_x_hours" , { count : 1 } ) ;
break ;
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes >= 90 && distanceInMinutes <= 1439 ) :
formatted = t ( "about_x_hours" , { count : Math . round ( distanceInMinutes / 60.0 ) } ) ;
2013-06-05 09:32:03 +10:00
break ;
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes >= 1440 && distanceInMinutes <= 2519 ) :
2013-06-05 09:32:03 +10:00
formatted = t ( "x_days" , { count : 1 } ) ;
break ;
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes >= 2520 && distanceInMinutes <= 129599 ) :
formatted = t ( "x_days" , { count : Math . round ( distanceInMinutes / 1440.0 ) } ) ;
2013-06-05 09:32:03 +10:00
break ;
2013-06-07 18:03:09 +10:00
case ( distanceInMinutes >= 129600 && distanceInMinutes <= 525599 ) :
formatted = t ( "x_months" , { count : Math . round ( distanceInMinutes / 43200.0 ) } ) ;
2013-06-05 09:32:03 +10:00
break ;
default :
2013-06-07 18:03:09 +10:00
var months = Math . round ( distanceInMinutes / 43200.0 ) ;
2013-06-05 09:32:03 +10:00
if ( months < 24 ) {
formatted = t ( "x_months" , { count : months } ) ;
} else {
formatted = t ( "over_x_years" , { count : Math . round ( months / 12.0 ) } ) ;
}
break ;
}
return formatted ;
} ;
2013-06-07 18:03:09 +10:00
relativeAgeMediumSpan = function ( distance , leaveAgo ) {
var formatted , distanceInMinutes ;
distanceInMinutes = Math . round ( distance / 60.0 ) ;
var t = function ( key , opts ) {
return Ember . String . i18n ( "dates.medium" + ( leaveAgo ? "_with_ago" : "" ) + "." + key , opts ) ;
}
switch ( true ) {
case ( distanceInMinutes >= 1 && distanceInMinutes <= 56 ) :
formatted = t ( "x_minutes" , { count : distanceInMinutes } ) ;
break ;
case ( distanceInMinutes >= 56 && distanceInMinutes <= 89 ) :
formatted = t ( "x_hours" , { count : 1 } ) ;
break ;
case ( distanceInMinutes >= 90 && distanceInMinutes <= 1379 ) :
formatted = t ( "x_hours" , { count : Math . round ( distanceInMinutes / 60.0 ) } ) ;
break ;
case ( distanceInMinutes >= 1380 && distanceInMinutes <= 2159 ) :
formatted = t ( "x_days" , { count : 1 } ) ;
break ;
case ( distanceInMinutes >= 2160 ) :
formatted = t ( "x_days" , { count : Math . round ( ( distanceInMinutes - 720.0 ) / 1440.0 ) } ) ;
break ;
}
2013-06-10 10:13:30 +10:00
return formatted || '&mdash' ;
2013-06-07 18:03:09 +10:00
} ;
2013-06-07 08:49:09 +10:00
relativeAgeMedium = function ( date , options ) {
2013-06-07 18:03:09 +10:00
var displayDate , fiveDaysAgo , oneMinuteAgo , fullReadable , leaveAgo , val ;
2013-06-11 06:51:02 +10:00
var wrapInSpan = options . wrapInSpan === false ? false : true ;
2013-06-07 08:49:09 +10:00
leaveAgo = options . leaveAgo ;
2013-06-07 18:03:09 +10:00
var distance = Math . round ( ( new Date ( ) - date ) / 1000 ) ;
2013-06-07 08:49:09 +10:00
if ( ! date ) {
return "—" ;
}
2013-06-07 18:27:25 +10:00
fullReadable = longDate ( date ) ;
2013-06-07 08:49:09 +10:00
displayDate = "" ;
2013-06-07 18:03:09 +10:00
fiveDaysAgo = 432000 ;
oneMinuteAgo = 60 ;
2013-06-07 08:49:09 +10:00
2013-06-10 10:13:30 +10:00
if ( distance < oneMinuteAgo ) {
2013-06-07 08:49:09 +10:00
displayDate = Em . String . i18n ( "now" ) ;
2013-06-07 18:03:09 +10:00
} else if ( distance > fiveDaysAgo ) {
2013-06-07 08:49:09 +10:00
if ( ( new Date ( ) ) . getFullYear ( ) !== date . getFullYear ( ) ) {
2013-06-11 06:48:50 +10:00
displayDate = shortDate ( date ) ;
2013-06-07 08:49:09 +10:00
} else {
2013-06-11 17:25:50 +10:00
displayDate = moment ( date ) . shortDateNoYear ( ) ;
2013-06-07 08:49:09 +10:00
}
} else {
2013-06-07 18:03:09 +10:00
displayDate = relativeAgeMediumSpan ( distance , leaveAgo ) ;
2013-06-07 08:49:09 +10:00
}
2013-06-10 10:13:30 +10:00
if ( wrapInSpan ) {
return "<span class='date' title='" + fullReadable + "'>" + displayDate + "</span>" ;
} else {
return displayDate ;
}
2013-06-07 08:49:09 +10:00
} ;
// mostly lifted from rails with a few amendments
relativeAge = function ( date , options ) {
options = options || { } ;
var format = options . format || "tiny" ;
if ( format === "tiny" ) {
return relativeAgeTiny ( date , options ) ;
} else if ( format === "medium" ) {
return relativeAgeMedium ( date , options ) ;
2013-06-11 17:25:50 +10:00
} else if ( format === 'medium-with-ago' ) {
return relativeAgeMedium ( date , _ . extend ( options , { format : 'medium' , leaveAgo : true } ) ) ;
2013-06-07 08:49:09 +10:00
}
return "UNKNOWN FORMAT" ;
} ;
2013-06-07 18:27:25 +10:00
return {
longDate : longDate ,
relativeAge : relativeAge ,
autoUpdatingRelativeAge : autoUpdatingRelativeAge ,
2013-06-11 06:48:50 +10:00
updateRelativeAge : updateRelativeAge ,
toTitleCase : toTitleCase ,
shortDate : shortDate
2013-06-07 18:27:25 +10:00
} ;
2013-06-05 09:32:03 +10:00
} ) ( ) ;