User:Pilk/vector.js
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
importScript('User:The Happy Flygineer/cleandeletereasons.js'); /* COMMENTS IN LOCAL TIME Description: Changes [[Coordinated Universal Time|UTC]]-based times and dates, such as those used in signatures, to be relative to local time. Documentation: [[Wikipedia:Comments in Local Time]] Link: [[User:Gary King/comments in local time.js]] TODO Make lines with more than one timestamp format all timestamps on the line. TODO All instances of "new Date(today.getYear()" should be changed to "new Date(today.getFullYear()" */ addOnloadHook(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 < 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 = ''; 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['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 != 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 < matches.length; match++) { // Create <span class="localcomments" style="font-size: 95%; white-space: nowrap;" title="MATCHES[MATCH]">MATCHES[MATCH]</span> 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 < children.length; child++) replace_text(children[child], search, replace); } } }); // Recent changes shows bots by default function gid(i) { return document.getElementById(i); } function replaceRecentChangesLink(){ if(gid('n-recentchanges')) { var a = gid('n-recentchanges').getElementsByTagName('a'); for(i in a) { a[i].href = '/w/index.php?title=Special:RecentChanges&hidebots=0'; } } } addOnloadHook(replaceRecentChangesLink); $(document).ready(function(){ var ttCache = new Object(); var urlPrefix = wgArticlePath.replace("$1",""); var ttOffset = 10; var mouseX = 0; var mouseY = 0; var currentTooltip = ""; var container = $("<div id='tooltip-container' style='position:absolute;z-index:999999;height:auto !important;max-width: 300px;color:white;text-align: center; background: #24201B; -moz-border-radius: 10px; border-radius: 10px; padding:7px 0px;'></div>"); $("#bodyContent").append(container); var offsetContainer = container.offsetParent(); container.hide(); $(".backpack-link > a[href]").mouseover(function(evt){ var url = $(this).attr("href"); if(urlPrefix == url.substr(0,urlPrefix.length)){ url = url.substr(urlPrefix.length); } currentTooltip = url; relocateTooltip(evt); if(ttCache[url] != undefined){ showTooltip(ttCache[url]); return; } $.get(wgScript+"?title="+url+"&action=render",function(data){ var subpage = $(data).find(".backpack-tooltip"); if(subpage.size() == 0){ subpage = "<span style='padding-left:7px;margin-right:7px;'>Unable to load tooltip for this item</span>"; }else{ subpage = subpage.eq(0).html(); } ttCache[url] = subpage; if(currentTooltip == url){ showTooltip(subpage); } },"html"); }).mousemove(function(evt){ updateCoords(evt); relocateTooltip(); }).mouseout(function(){ container.hide(); }); function showTooltip(tooltipObj){ container.html(tooltipObj); container.css("width","auto"); if(container.outerWidth() > 300) container.css("width","300px"); relocateTooltip(); container.show(); } function relocateTooltip(){ var lMouseX = mouseX; var lMouseY = mouseY; if(lMouseY + container.outerHeight() > $(window).height()+$(window).scrollTop()) lMouseY = ($(window).height()+$(window).scrollTop())-container.outerHeight(); if(lMouseX + container.outerWidth() > $(window).width()+$(window).scrollLeft()) lMouseX = lMouseX - ((ttOffset*2) + container.outerWidth()); var bodyOffset = offsetContainer.offset(); lMouseX -= bodyOffset.left; lMouseY -= bodyOffset.top; container.css("left",lMouseX+"px").css("top",lMouseY+"px"); } function updateCoords(evt){ mouseX = evt.pageX + ttOffset; mouseY = evt.pageY + ttOffset; } $(document).unload(function(){ container.hide(); }); });