Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<pre><nowiki>

var months_key = new Array('January','February','March','April','May','June','July','August','September','October','November','December');

// Will accurately parse the time difference between two dates (years after 1970)
// EXCEPTED formats (all UTC):
// 16:12, January 15, 2001
// 16:12, 15 January 2001
// 16:12, 2001 January 15
// 16:12, Jan 15, 2001
// 16:12, 15 Jan 2001
// 16:12, 2001 Jan 15
// 2001-01-15T16:12:34 <--seconds ignored
// Fri, 10 Nov 2006 17:39
function getElapsedTime(top_date,bottom_date)
{
	// Get top year
	var TYear = retrieveYear(top_date);
	// Get lower year
	var BYear = retrieveYear(bottom_date);
	// Get top month
	var TMonth = retrieveMonth(top_date);
	// Get lower month
	var BMonth = retrieveMonth(bottom_date);
	// Get top date
	var TDay = retrieveDay(top_date);
	// Get lower date
	var BDay = retrieveDay(bottom_date);
	// Get top time
	var TTime = retrieveTime(top_date).split(':');
	// Get lower time
	var BTime = retrieveTime(bottom_date).split(':');

	// Get date in ms from start of year 1971
	var rtime = Date.UTC(TYear,TMonth-1,TDay,frmtDateNum(TTime[0]),frmtDateNum(TTime[1]),0);
	var ltime = Date.UTC(BYear,BMonth-1,BDay,frmtDateNum(BTime[0]),frmtDateNum(BTime[1]),0);
	
	// Get difference and convert to days
	var day = 24*60*60*1000; // Days in ms
	return (rtime - ltime)/day;
}

// Will accurately parse the time difference between two dates (years after 0)
// counts leap years and febuary month length changes
// EXCEPTED formats:
// 16:12, January 15, 2001
// 16:12, 15 January 2001
// 16:12, 2001 January 15
// 16:12, Jan 15, 2001
// 16:12, 15 Jan 2001
// 16:12, 2001 Jan 15
// 2001-01-15T16:12:34 <--seconds ignored
// Fri, 10 Nov 2006 17:39
function getDateDiff(top_date,bottom_date)
{
	// Get top year
	var TYear = retrieveYear(top_date);
	// Get leap year factor
	var TFEB = getFebDays(TYear);
	// Get lower year
	var BYear = retrieveYear(bottom_date);
	// Get leap year factor
	var BFEB = getFebDays(BYear);
	var months_tvalue = new Array(31, TFEB, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var months_bvalue = new Array(31, BFEB, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	// Get top month
	var TMonth = retrieveMonth(top_date);
	// Get lower month
	var BMonth = retrieveMonth(bottom_date);
	// Get top date
	var TDay = retrieveDay(top_date);
	// Get lower date
	var BDay = retrieveDay(bottom_date);
	// Get top time and turn it into days
	var TTime = convTimeToDays(retrieveTime(top_date));
	// Get lower time and turn it into days
	var BTime = convTimeToDays(retrieveTime(bottom_date));
	// Parse, months are 1-12, but array starts at 0, so take 1 one the index
	// monthr and monthl get amount of relavent days passed in the recent and old month respectively
	var monthr = TDay - 1 + TTime;
	var monthl = months_bvalue[BMonth-1] - (BDay - 1 + BTime);
	if (TYear == BYear)
	{
		var mdiff = addFullMonths(TMonth-1,BMonth+1,months_tvalue);
		var totdays = monthr + monthl + mdiff;
		if (TMonth == BMonth) 
			{totdays = monthr - (BDay - 1 + BTime);}
	}
	else
	{
		var ydiff = addFullYears(TYear - 1,BYear + 1);
		var yearr = addFullMonths(TMonth - 1,1,months_tvalue) + monthr;
		var yearl = addFullMonths(12,BMonth + 1,months_bvalue) + monthl;
		var totdays = yearr + ydiff + yearl;
	}
	return totdays;
}

function addFullYears(T,B)
{
	var tot_days = 0;
	for (var i=T; i>=B; i--)
	{
	FEB = getFebDays(i);
	if (FEB == 28) 
		tot_days += 365;
	else if (FEB == 29) 
		tot_days += 366;
  }
	return tot_days;
}

//3rd var is the calendar (for Leap Years)
function addFullMonths(T,B,months_value)
{
	var tot_days = 0;
	for (var i=T; i>=B; i--)
		{tot_days += months_value[i-1];}
	return tot_days;
}

function retrieveYear(date)
{
	var Year = '0000';
	if (date.search(/\d{4}/) !=-1)
		Year = date.match(/\d{4}/)[0];
	else 
		alert('[retrieveYear] Error at: ' + date);
	return Year;
}

// Returns 1-12
function retrieveMonth(date)
{
	var Month = 0;
	if (date.search(/-\d{1,2}-/) !=-1) 
		{Month = date.match(/-\d{1,2}-/)[0].replace(/-/g,''); return frmtDateNum(Month);}
	for (var i=0; i<months_key.length; i++)
	{
	if (date.search(months_key[i]) !=-1 || date.search(months_key[i].substring(0,3)) !=-1)
		{Month = i+1; break;}
	}
	return Month;
}

// Returns 1-31
function retrieveDay(date)
{
	if (date.search(/[ ,-]\d{1,2}([ ,T]|$)/) !=-1) 
		var Days = date.match(/[ ,-]\d{1,2}([ ,T]|$)/)[0].replace(/[-, T]/g,'');
	else 
		alert('[retrieveDay] Error at: ' + date);
	Days = frmtDateNum(Days);
	return Days;
}

function retrieveTime(date)
{
	if (date.search(/^\d\d:\d\d,/) !=-1)
		var Time = date.match(/^\d\d:\d\d,/)[0];
	else if (date.search(/T\d\d:\d\d/) !=-1) 
		var Time = date.match(/T\d\d:\d\d/)[0];
	else if (date.search(/ \d\d:\d\d$/) !=-1) 
		var Time = date.match(/ \d\d:\d\d$/)[0];
	else if (date.search(/ \d\d:\d\d:/) !=-1) 
		var Time = date.match(/ \d\d:\d\d:/)[0];
	else alert('[retrieveTime] Error at: ' + date);
	
	Time = Time.replace(/[ T,]|:$/g,'');
	return Time;
}

function getFebDays(Year)
{
	var LP4 = Year/4; 
	var LP100 = Year/100;
	var LP400 = Year/400;
	if (Math.round(LP4) == LP4 && (Math.round(LP100) != LP100 || Math.round(LP400) == LP400)) 
		var FEB = 29;
	else 
		var FEB = 28;
	return FEB;
}

//remove pointless zeros
function frmtDateNum(number)
{
	number = new String(number);
	x = (number=='0') ? 0 : number.replace(/^0+/g,'');
	return x;
}

//converts a time into days
function convTimeToDays(Time)
{
	var mins = frmtDateNum(Time.split(':')[1]); var hours = frmtDateNum(Time.split(':')[0]);
	TimeDays = (hours + (mins/60))/24;
	return TimeDays;
}

// 16:12, January 15, 2001
// 16:12, Jan 15, 2001
// 16:12, 15 January 2001
// 16:12, 15 Jan 2001
// 16:12, 2001 January 15
// 16:12, 2001 Jan 15
// 2001-01-15T16:12
// Fri, 10 Nov 2006 17:39
var STAND_DATE_REGEXP = /\d{1,2}:\d\d, [^ ]+ \d{1,2}, \d\d\d\d|\d{1,2}:\d\d, \d{1,2} [^ ]+ \d\d\d\d|\d{1,2}:\d\d,\d\d\d\d [^ ]+ \d{1,2}|\d\d\d\d-\d\d-\d\dT\d{1,2}:\d\d|[^ ]+, \d{1,2} [^ ]+ \d\d\d\d \d{1,2}:\d\d/g;
//////

//</nowiki></pre>