MediaWiki:Gadget/comments in local time.js&action=edit

From OpenWetWare
Jump to navigationJump to search

/*

   Documentation: Wikipedia:Comments in Local Time
  • /

addOnloadHook(function() {

   // wgCanonicalNamespace = unsafeWindow.wgCanonicalNamespace
   
   /*
       Language
   */
   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.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.dateDifference) == 'undefined')
       LocalComments.dateDifference = true;
   /*
       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 < disabled_urls.length; i++)
   {
       if (document.location.href.indexOf(disabled_urls[i]) != -1)
           return;
   }

   for (var i = 0; i < wikiPreview.length; i++)
   {
       if (document.location.href.indexOf(wikiPreview[i]) != -1)
           unique_url = 'wikiPreview';
   }

   var element_id = unique_url ? unique_url : 'bodyContent';
   replace_text(document.getElementById(element_id), /(\d\d):(\d\d), (\d{1,2}) ([A-Z][a-z]+) (\d{4}) \(UTC\)/g, adjust_time);

function add_leading_zero(number) {

   if (number < 10)
       number = '0' + number;
   return number;

}

function adjust_time(original_timestamp, old_hour, old_minute, old_day, old_month, old_year, offset) {

   var today = new Date(), yesterday = new Date(), tomorrow = new Date();
   yesterday.setDate(yesterday.getDate() - 1);
   tomorrow.setDate(tomorrow.getDate() + 1);
   
   // set the date entered
   var time = new Date();
   time.setUTCFullYear(old_year, convert_month_to_number(old_month), old_day);
   time.setUTCHours(old_hour);
   time.setUTCMinutes(old_minute);
   
   // determine the time offset
   var utc_offset = -1 * time.getTimezoneOffset() / 60;
   if (utc_offset >= 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 = '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['last'] + ' ';
           }
           else
           {
               difference = new Date(time.valueOf() - today.valueOf());
               difference_word = language['from now'];
               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.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 < matches.length; match++)
           {
               // Create MATCHES[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
   {
       var children = [], child = node.firstChild;
       while (child)
       {
           children[children.length] = child;
           child = child.nextSibling;
       }
       
       for (var child = 0; child < children.length; child++)
           replace_text(children[child], search, replace);
   }

}

});