penguin/AstroJS

Javascript framework for my blog

botanjs/src/Components/Vim/DateTime/_this.js

raw ยท 4535 bytes

(function(){
	var ns = __namespace( "Components.Vim.DateTime" );

	var Minute = 60;
	var Hour = 60 * Minute;
	var Day = 24 * Hour;
	var Week = 7 * Day;
	var Month = 30.5 * Day;
	var Year = 365 * Day;

	var Mesg = ns[ NS_INVOKE ]( "String" );

	var PluralHourStrings = [
		"XHoursAgo_2To4",
		"XHoursAgo_EndsIn1Not11",
		"XHoursAgo_EndsIn2To4Not12To14",
		"XHoursAgo_Other"
	];

	var PluralMinuteStrings = [
		"XMinutesAgo_2To4",
		"XMinutesAgo_EndsIn1Not11",
		"XMinutesAgo_EndsIn2To4Not12To14",
		"XMinutesAgo_Other"
	];

	var PluralSecondStrings = [
		"XSecondsAgo_2To4",
		"XSecondsAgo_EndsIn1Not11",
		"XSecondsAgo_EndsIn2To4Not12To14",
		"XSecondsAgo_Other"
	];

	var DayOfWeek = { Sunday: 0, Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6 };

	var GetPluralMonth = function( month )
	{
		if ( month >= 2 && month <= 4 )
		{
			return Mesg( "XMonthsAgo_2To4", month );
		}
		else if ( month >= 5 && month <= 12 )
		{
			return Mesg( "XMonthsAgo_5To12", month );
		}
		else
		{
			throw new Error( "Invalid number of Months" );
		}
	};

	var GetLastDayOfWeek = function( dow )
	{
		var result;
		switch ( dow )
		{
			case DayOfWeek.Monday:
				result = Mesg( "last Monday" );
				break;
			case DayOfWeek.Tuesday:
				result = Mesg( "last Tuesday" );
				break;
			case DayOfWeek.Wednesday:
				result = Mesg( "last Wednesday" );
				break;
			case DayOfWeek.Thursday:
				result = Mesg( "last Thursday" );
				break;
			case DayOfWeek.Friday:
				result = Mesg( "last Friday" );
				break;
			case DayOfWeek.Saturday:
				result = Mesg( "last Saturday" );
				break;
			case DayOfWeek.Sunday:
				result = Mesg( "last Sunday" );
				break;
			default:
				result = Mesg( "last Sunday" );
				break;
		}

		return result;
	};

	var GetOnDayOfWeek = function( dow )
	{
		var result;

		switch( dow )
		{
			case DayOfWeek.Monday:
				result = Mesg( "on Monday" );
				break;
			case DayOfWeek.Tuesday:
				result = Mesg( "on Tuesday" );
				break;
			case DayOfWeek.Wednesday:
				result = Mesg( "on Wednesday" );
				break;
			case DayOfWeek.Thursday:
				result = Mesg( "on Thursday" );
				break;
			case DayOfWeek.Friday:
				result = Mesg( "on Friday" );
				break;
			case DayOfWeek.Saturday:
				result = Mesg( "on Saturday" );
				break;
			case DayOfWeek.Sunday:
				result = Mesg( "on Sunday" );
				break;
			default:
				result = Mesg( "on Sunday" );
				break;
		}

		return result;
	};

	var GetPluralTimeUnits = function( units, resources )
	{
		var modTen = units % 10;
		var modHundred = units % 100;

		if ( units <= 1 )
		{
			throw new Error( "Invalid number of Time units" );
		}
		else if ( 2 <= units && units <= 4 )
		{
			return Mesg( resources[ 0 ], units );
		}
		else if ( modTen == 1 && modHundred != 11 )
		{
			return Mesg( resources[ 1 ], units );
		}
		else if ( ( 2 <= modTen && modTen <= 4 ) && !( 12 <= modHundred && modHundred <= 14 ) )
		{
			return Mesg( resources[ 2 ], units );
		}
		else
		{
			return Mesg( resources[ 3 ], units );
		}
	};

	var RelativeTime = function( given )
	{
		var diffSecs = Math.round( 0.001 * ( new Date().getTime() - given.getTime() ) );

		if( Year < diffSecs )
		{
			result = Mesg( "OverAYearAgo" );
		}
		else if( ( 1.5 * Month ) < diffSecs )
		{
			var nMonths = Math.round( ( diffSecs + Month / 2 ) / Month );
			result = GetPluralMonth( nMonths );
		}
		else if( ( 3.5 * Week ) <= diffSecs )
		{
			result = Mesg( "AboutAMonthAgo" );
		}
		else if( Week <= diffSecs )
		{
			var nWeeks = Math.round( diffSecs / Week );
			if ( 1 < nWeeks )
			{
				result = Mesg( "XWeeksAgo_2To4", nWeeks );
			}
			else
			{
				result = Mesg( "AboutAWeekAgo" );
			}
		}
		else if ( ( 5 * Day ) <= diffSecs )
		{
			result = GetLastDayOfWeek( given.getDay() );
		}
		else if ( Day <= diffSecs )
		{
			result = GetOnDayOfWeek( given.getDay() );
		}
		else if ( ( 2 * Hour ) <= diffSecs )
		{
			var nHours = Math.round( diffSecs / Hour );
			result = GetPluralTimeUnits( nHours, PluralHourStrings );
		}
		else if ( Hour <= diffSecs )
		{
			result = Mesg( "AboutAnHourAgo" );
		}
		else if ( ( 2 * Minute ) <= diffSecs )
		{
			var nMinutes = Math.round( diffSecs / Minute );
			result = GetPluralTimeUnits( nMinutes, PluralMinuteStrings );
		}
		else if ( Minute <= diffSecs )
		{
			result = Mesg( "AboutAMinuteAgo" );
		}
		else
		{
			var nSeconds =  1 < diffSecs ? diffSecs : 2;
			result = GetPluralTimeUnits( nSeconds, PluralSecondStrings );
		}

		return result;
	};

	ns[ NS_EXPORT ]( EX_FUNC, "RelativeTime", RelativeTime );
})();