UESPWiki:Javascript/comments in local time.js

//  
// 
/*
	COMMENTS IN LOCAL TIME
	Original author: 
	
	English Wikipedia documentation: 
/

$(function()
{
	// wgCanonicalNamespace = unsafeWindow.wgCanonicalNamespace
	
	/*
		Language
		
		LOCALIZING THIS SCRIPT
		To localize this script, change the terms below, to the RIGHT of the colons,
		to the correct term used in that language.
		
		For example, in the French language,
		
		'Today'		: 	'Today',
		
		would be
		
		'Today'		: 	'Aujourd'hui',
	*/
	var language = 
	{
		// relative terms
		'Today'		: 	'Today',
		'Yesterday'	: 	'Yesterday',
		'Tomorrow'	: 	'Tomorrow',
		
		'last'		: 	'last',
		'this'		: 	'this',
		
		// days of the week
		'Sunday'	: 	'Sunday',
		'Monday'	: 	'Monday',
		'Tuesday'	: 	'Tuesday',
		'Wednesday'	: 	'Wednesday',
		'Thursday'	: 	'Thursday',
		'Friday'	: 	'Friday',
		'Saturday'	: 	'Saturday',
		
		// months of the year
		'January'	: 	'January',
		'February'	: 	'February',
		'March'		: 	'March',
		'April'		: 	'April',
		'May'		: 	'May',
		'June'		: 	'June',
		'July'		: 	'July',
		'August'	: 	'August',
		'September'	: 	'September',
		'October'	: 	'October',
		'November'	: 	'November',
		'December'	: 	'December',
		
		// difference words
		'ago'		: 	'ago',
		'from now'	: 	'from now',
		
		// date phrases
		'year'		: 	'year',
		'years'		: 	'years',
		'month'		: 	'month',
		'months'	: 	'months',
		'day'		: 	'day',
		'days'		: 	'days'
	};
	
	/*
		Settings
	*/
	if (typeof(LocalComments) == 'undefined')
		LocalComments = {};

	if (typeof(LocalComments.dateDifference) == 'undefined')
		LocalComments.dateDifference = true;
 
	if (typeof(LocalComments.dateFormat) == 'undefined')
	{
		// Deprecated: LocalizeConfig
		if (typeof(LocalizeConfig) != 'undefined' && typeof(LocalizeConfig.dateFormat) != 'undefined' && LocalizeConfig.dateFormat != '')
			LocalComments.dateFormat = LocalizeConfig.dateFormat;
		else
			LocalComments.dateFormat = 'dmy';
	}
 
	if (typeof(LocalComments.timeFirst) == 'undefined')
		LocalComments.timeFirst = true;
	
	if (typeof(LocalComments.twentyFourHours) == 'undefined')
		LocalComments.twentyFourHours = false;
	/*
		End Settings
	*/
 
	if (wgCanonicalNamespace == '' || wgCanonicalNamespace == 'MediaWiki' || wgCanonicalNamespace == 'Special')
		return;
 
	var disabled_urls = new Array('action=history'), unique_url = false, wikiPreview = new Array('action=edit', 'action=submit');
	for (var i = 0; i  = 0)
		utc_offset = '+' + utc_offset;
	else
		utc_offset = '−' + Math.abs(utc_offset);
	
	// set the date bits to output
	var year = time.getFullYear(), month = add_leading_zero(time.getMonth() + 1);
	var day = time.getDate();
	var hour = parseInt(time.getHours()), minute = add_leading_zero(time.getMinutes());

	// output am or pm depending on the date
	var ampm = '';
	if (!LocalComments.twentyFourHours)
	{
		ampm = ' am';
		if (hour > 11) ampm = ' pm';
		if (hour > 12) hour -= 12;
		if (hour == '00') hour = 12;
	}
	
	// return 'today' or 'yesterday' if that is the case
	if (year == today.getFullYear() && month == add_leading_zero(today.getMonth() + 1) && day == today.getDate())
		var date = language['Today'];
	else if (year == yesterday.getFullYear() && month == add_leading_zero(yesterday.getMonth() + 1) && day == yesterday.getDate())
		var date = language['Yesterday'];
	else if (year == tomorrow.getFullYear() && month == add_leading_zero(tomorrow.getMonth() + 1) && day == tomorrow.getDate())
		var date = language['Tomorrow'];
	else
	{
		// calculate day of week
		var day_names = new Array(language['Sunday'], language['Monday'], language['Tuesday'], language['Wednesday'], language['Thursday'], language['Friday'], language['Saturday']);
		var day_of_the_week = day_names[time.getDay()];
		
		if (LocalComments.dateDifference)
		{
			// calculate time difference from today and the timestamp
			today = new Date(today.getYear(), today.getMonth(), today.getDate());
			time = new Date(time.getYear(), time.getMonth(), time.getDate());
		
			var milliseconds_ago = today.getTime() - time.getTime();
			var days_ago = Math.round(milliseconds_ago / 1000 / 60 / 60 / 24);

			var difference, difference_word = , last = ;
			if (today.valueOf() >= time.valueOf())
			{
				difference = new Date(today.valueOf() - time.valueOf());
				difference_word = language['ago'];
				if (days_ago  = -7)
					last = language['this'] + ' ';
			}
			var descriptive_difference = [];

			if (difference.getYear() - 70 > 0)
			{
				var years_ago = (difference.getYear() - 70) + ' ' + pluralize(language['year'], difference.getYear() - 70, language['years']);
				descriptive_difference.push(years_ago);
			}
			if (difference.getMonth() > 0)
			{
				var months_ago = difference.getMonth() + ' ' + pluralize(language['month'], difference.getMonth(), language['months']);
				descriptive_difference.push(months_ago);
			}
			if (difference.getDate() > 0)
			{
				var new_days_ago = difference.getDate() + ' ' + pluralize(language['day'], difference.getDate(), language['days']);
				descriptive_difference.push(new_days_ago);
			}
			
			descriptive_difference = ' (' + descriptive_difference.join(', ') + ' ' + difference_word + ')';
		}
		else
		{
			descriptive_difference = ;
			last = ;
		}
		
		// format the date according to user preferences
		var formatted_date = '', month_name = convert_number_to_month(time.getMonth());
		
		switch (LocalComments.dateFormat.toLowerCase())
		{
			case 'dmy':
				formatted_date = day + ' ' + month_name + ' ' + year;
				break;
			case 'mdy':
				formatted_date = month_name + ' ' + day + ', ' + year;
				break;
			default:
				formatted_date = year + '-' + month + '-' + add_leading_zero(day);
		}
		
		var date = formatted_date + ', ' + last + day_of_the_week + descriptive_difference;
	}
	
	var time = hour + ':' + minute + ampm;
	
	if (LocalComments.timeFirst)
		var return_date = time + ', ' + date + ' (UTC' + utc_offset + ')';
	else
		var return_date = date + ', ' + time + ' (UTC' + utc_offset + ')';

	return return_date;
}

function convert_month_to_number(month)
{
   var output = new Date(month + ' 1, 2001');
   return output.getMonth();
}

function convert_number_to_month(number)
{
	var month = new Array(language['January'], language['February'], language['March'], language['April'], language['May'], language['June'], language['July'], language['August'], language['September'], language['October'], language['November'], language['December']);
	return month[number];
}

function pluralize(term, count, plural)
{
  if (plural == null)
    plural = term + 's';

  return (count == 1 ? term : plural)	
}

function replace_text(node, search, replace)
{
	if (node != null && node.nodeType == 3)
	{
		var value = node.nodeValue;
		var matches = value.match(search);
		
		if (matches != null)
		{
			var node_parent_node = node.parentNode;
			var old_node = node;
			// old_node_list = node.parentNode.childNodes;
			
			for (match = 0; match  
				
				var position;
				
				if (after_match != null && length != null)
					position = after_match.search(search) + before_match.length + length;
				else
					position = value.search(search);
				
				var length = matches[match].toString().length;
				var before_match = value.substring(0, position);
				var after_match = value.substring(position + length);
				
				var span = document.createElement('span');			
				span.setAttribute('class', 'localcomments');
				span.style.fontSize = '95%';
				span.style.whiteSpace = 'nowrap';
				span.setAttribute('title', matches[match]);
				span.appendChild(document.createTextNode(matches[match].toString().replace(search, replace)));
				
				var new_node = document.createDocumentFragment();
				new_node.appendChild(document.createTextNode(before_match));
				new_node.appendChild(span);
				new_node.appendChild(document.createTextNode(after_match));

				node_parent_node.replaceChild(new_node, old_node);
				
				break;
			}
		}
	}
	else if (node != null)
	{
		var children = [], child = node.firstChild;
		while (child)
		{
			children[children.length] = child;
			child = child.nextSibling;
		}
		
		for (var child = 0; child