


Difference between revisions of "MediaWiki:Common.js"
Wikisimpsons - The Simpsons Wiki
(Created page with '→Any JavaScript here will be loaded for all users on every page load.: /* Test if an element has a certain class ************************************** * * Description: Us…') |
|||
(72 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
− | + | //<pre> | |
− | /* Test if an element has a certain class ************************************** | + | /** Test if an element has a certain class ************************************** |
* | * | ||
* Description: Uses regular expressions and caching for better performance. | * Description: Uses regular expressions and caching for better performance. | ||
− | |||
*/ | */ | ||
− | + | var hasClass = ( function() { | |
− | var hasClass = (function () { | + | var reCache = {}; |
− | + | return function( element, className ) { | |
− | + | return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className ); | |
− | + | }; | |
− | |||
})(); | })(); | ||
− | |||
− | / | + | /* |
− | + | Source: http://www.dustindiaz.com/getelementsbyclass/ | |
− | + | getElementsByClass, which complements getElementById and getElementsByTagName, returns an array of all subelements of ''node'' that are tagged with a specific CSS class (''searchClass'') and are of the tag name ''tag''. If tag is null, it searches for any suitable elements regardless of the tag name. | |
− | + | Example: getElementsByClass('infobox', document.getElementById('content'), 'div') selects the same elements as the CSS declaration #content div.infobox | |
− | + | */ | |
− | + | function getElementsByClass( searchClass, node, tag ) { | |
− | + | var classElements = new Array(); | |
− | var | + | |
− | + | if( node == null ) { | |
− | + | node = document; | |
− | + | } | |
− | + | ||
− | { | + | if( tag == null ) { |
− | + | tag = '*'; | |
− | + | } | |
− | + | ||
− | + | var els = node.getElementsByTagName( tag ); | |
− | + | var elsLen = els.length; | |
− | + | var tester = new ClassTester( searchClass ); | |
− | + | ||
− | + | for( i = 0, j = 0; i < elsLen; i++ ) { | |
− | + | if( tester.isMatch( els[i] ) ) { | |
− | + | classElements[j] = els[i]; | |
− | + | j++; | |
− | + | } | |
− | + | } | |
− | + | ||
− | + | return classElements; | |
− | + | } | |
− | + | ||
− | + | function ClassTester( className ) { | |
− | + | this.regex = new RegExp( "(^|\\s)" + className + "(\\s|$)" ); | |
+ | } | ||
+ | |||
+ | ClassTester.prototype.isMatch = function( element ) { | ||
+ | return this.regex.test( element.className ); | ||
+ | } | ||
+ | /* end getElementsByClass */ | ||
+ | |||
+ | /** Username replace function ([[template:USERNAME]]) ******************************* | ||
+ | * Inserts user name into <span class="insertusername"></span> | ||
+ | */ | ||
+ | function UserNameReplace() { | ||
+ | if( typeof( disableUsernameReplace ) != 'undefined' && disableUsernameReplace || wgUserName == null ) { | ||
+ | return; | ||
} | } | ||
+ | var spans = getElementsByClass( 'insertusername', null, 'span' ); | ||
+ | |||
+ | for( var i = 0; i < spans.length; i++ ) { | ||
+ | spans[i].innerHTML = wgUserName; | ||
+ | } | ||
+ | } | ||
+ | jQuery( document ).ready( UserNameReplace ); | ||
+ | |||
+ | |||
+ | /* Returns h1.firstHeading (the page title element). */ | ||
+ | function getFirstHeading() { | ||
+ | var elements = getElementsByClass( 'firstHeading', document.getElementById( 'content' ), 'h1' ); | ||
+ | return ( elements != null && elements.length > 0 ) ? elements[0] : null; | ||
} | } | ||
+ | |||
+ | // BEGIN JavaScript title rewrite | ||
+ | // requires getFirstHeading() and getElementsByClass() and its dependencies | ||
+ | function rewriteTitle() { | ||
+ | if( typeof( window.SKIP_TITLE_REWRITE ) != 'undefined' && window.SKIP_TITLE_REWRITE ) { | ||
+ | return; | ||
+ | } | ||
− | + | var titleDiv = document.getElementById( 'title-meta' ); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if( titleDiv == null ) { | |
− | + | return; | |
− | + | } | |
− | |||
− | + | var cloneNode = titleDiv.cloneNode( true ); | |
− | + | var firstHeading = getFirstHeading(); | |
− | + | var node = firstHeading.childNodes[0]; | |
− | + | // new, then old! | |
− | + | firstHeading.replaceChild( cloneNode, node ); | |
− | + | cloneNode.style.display = 'inline'; | |
− | |||
− | + | var titleAlign = document.getElementById( 'title-align' ); | |
− | + | firstHeading.style.textAlign = titleAlign.childNodes[0].nodeValue; | |
− | |||
− | |||
− | |||
} | } | ||
− | + | jQuery( document ).ready( rewriteTitle ); | |
− | + | // END JavaScript title rewrite | |
− | + | // -------------------------------------------------------- | |
− | + | // addSubpages | |
− | + | // adds a 'subpages' link to the toolbox bar (excludes File, MediaWiki and Category namespaces) | |
− | + | // -------------------------------------------------------- | |
− | + | jQuery( document ).ready( function( $ ) { | |
− | + | var NSWithoutSubpages = new Array(-1, 6, 8, 14); | |
− | + | if (document.getElementById('p-tb') && NSWithoutSubpages.indexOf(wgNamespaceNumber) == -1) | |
− | + | { | |
− | var | + | var linkSubpages = '/wiki/Special:PrefixIndex/' + wgPageName + '/'; |
− | + | mw.util.addPortletLink('p-tb', linkSubpages, 'Subpages', 't-subpages', 'Subpages of this page'); | |
− | |||
} | } | ||
− | + | } ); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// | // | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | // -------------------------------------------------------- | |
− | if( | + | // addUserActivityLog |
− | + | // adds a 'user activity log' link to the toolbox bar | |
− | + | // -------------------------------------------------------- | |
+ | jQuery( document ).ready( function( $ ) { | ||
+ | if((wgUserGroups.indexOf("ServerManager") != -1 || wgUserGroups.indexOf("WikiHead") != -1) && (wgNamespaceNumber == 2 || wgNamespaceNumber == 3)){ | ||
+ | var linkUserLog = '../network/director.php?form_action=View%20User%20Daily%20Activity&user_activity_log=' + wgTitle; | ||
+ | mw.util.addPortletLink('p-tb', linkUserLog, 'User Activity Log', 't-userlog', 'View user daily activity'); | ||
} | } | ||
+ | } ); | ||
+ | // | ||
− | + | // ***************************************************************** | |
− | + | // &bot=1 on contribs pages (Special:Contributions/Foo). | |
− | + | // ***************************************************************** | |
− | + | function hideRollback() { | |
− | + | var botlink = document.location.href; | |
− | + | if( botlink.indexOf( '?' ) == -1 ) { | |
− | + | botlink += '?bot=1'; | |
+ | } else { | ||
+ | botlink += '&bot=1'; | ||
+ | } | ||
+ | mw.util.addPortletLink( 'p-cactions', botlink, '&bot=1', 'ca-bot' ); | ||
+ | } | ||
+ | if( wgCanonicalSpecialPageName == 'Contributions' ) { | ||
+ | jQuery( document ).ready( hideRollback ); | ||
+ | } | ||
− | + | /* Auto-refresh button on Special:RecentChanges from mariowiki.com */ | |
− | + | function setCookie(c_name, value, expiredays) { | |
− | + | var exdate = new Date(); | |
− | + | exdate.setDate(exdate.getDate() + expiredays); | |
− | + | document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()); | |
− | + | } | |
− | + | function getCookie(c_name) { | |
− | + | if (document.cookie.length > 0) { | |
− | + | c_start = document.cookie.indexOf(c_name + "="); | |
− | + | if (c_start != -1) { | |
− | + | c_start = c_start + c_name.length + 1; | |
− | + | c_end = document.cookie.indexOf(";", c_start); | |
− | + | if (c_end == -1) c_end = document.cookie.length; | |
+ | return unescape(document.cookie.substring(c_start, c_end)); | ||
+ | } | ||
+ | } | ||
+ | return ""; | ||
+ | } | ||
+ | var ajaxPages = new Array("Special:RecentChanges"); | ||
+ | var ajaxRCOverride = false; | ||
+ | var rcRefresh = 15000; | ||
+ | function ajaxRC() { | ||
+ | appTo = $(".mw-specialpage-summary"); | ||
+ | appTo.append(' <span style="position:absolute; right:40px;"><span style="position:relative; top:-45px;"><span style="position:relative; top:-12px; right:-15px;" id="autoRefreshProgress"><img src="/images/loader.gif" border="0" alt=" " /></span><span style="font-size: xx-small; cursor:help;" title="Automatically refresh the current page every ' + Math.floor(rcRefresh / 1000) + ' seconds">AUTO-REFRESH:</span><input type="checkbox" id="autoRefreshToggle"></span></span>'); | ||
+ | $("#autoRefreshToggle").click(function () { | ||
+ | setCookie("ajaxRC", $("#autoRefreshToggle").is(":checked") ? "on" : "off") | ||
+ | loadRCData() | ||
+ | }); | ||
+ | $("#autoRefreshProgress").hide(); | ||
+ | if (getCookie("ajaxRC") == "on" || ajaxRCOverride) { | ||
+ | $("#autoRefreshToggle").attr("checked", "checked"); | ||
+ | setTimeout("loadRCData();", rcRefresh); | ||
+ | } | ||
} | } | ||
− | + | function loadRCData() { | |
− | function | + | if (!$("#autoRefreshToggle").is(":checked")) return; |
− | + | $('#autoRefreshProgress').show() | |
− | + | $(article).load(location.href + " " + article + " > *", function (data) { | |
− | + | $(article + " .mw-collapsible").makeCollapsible(); | |
− | + | $('#autoRefreshProgress').hide() | |
− | + | if ($("#autoRefreshToggle").is(":checked")) setTimeout("loadRCData();", rcRefresh); | |
− | + | }); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | $(function () { | |
− | + | article = "#bodyContent"; | |
− | + | for (x in ajaxPages) { | |
− | + | if (wgPageName == ajaxPages[x] && $("#autoRefreshToggle").length == 0) ajaxRC(); | |
− | + | } | |
+ | }); |
Latest revision as of 12:03, August 27, 2017
/* Any JavaScript here will be loaded for all users on every page load. */
//<pre>
/** Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
*/
var hasClass = ( function() {
var reCache = {};
return function( element, className ) {
return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className );
};
})();
/*
Source: http://www.dustindiaz.com/getelementsbyclass/
getElementsByClass, which complements getElementById and getElementsByTagName, returns an array of all subelements of ''node'' that are tagged with a specific CSS class (''searchClass'') and are of the tag name ''tag''. If tag is null, it searches for any suitable elements regardless of the tag name.
Example: getElementsByClass('infobox', document.getElementById('content'), 'div') selects the same elements as the CSS declaration #content div.infobox
*/
function getElementsByClass( searchClass, node, tag ) {
var classElements = new Array();
if( node == null ) {
node = document;
}
if( tag == null ) {
tag = '*';
}
var els = node.getElementsByTagName( tag );
var elsLen = els.length;
var tester = new ClassTester( searchClass );
for( i = 0, j = 0; i < elsLen; i++ ) {
if( tester.isMatch( els[i] ) ) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
function ClassTester( className ) {
this.regex = new RegExp( "(^|\\s)" + className + "(\\s|$)" );
}
ClassTester.prototype.isMatch = function( element ) {
return this.regex.test( element.className );
}
/* end getElementsByClass */
/** Username replace function ([[template:USERNAME]]) *******************************
* Inserts user name into <span class="insertusername"></span>
*/
function UserNameReplace() {
if( typeof( disableUsernameReplace ) != 'undefined' && disableUsernameReplace || wgUserName == null ) {
return;
}
var spans = getElementsByClass( 'insertusername', null, 'span' );
for( var i = 0; i < spans.length; i++ ) {
spans[i].innerHTML = wgUserName;
}
}
jQuery( document ).ready( UserNameReplace );
/* Returns h1.firstHeading (the page title element). */
function getFirstHeading() {
var elements = getElementsByClass( 'firstHeading', document.getElementById( 'content' ), 'h1' );
return ( elements != null && elements.length > 0 ) ? elements[0] : null;
}
// BEGIN JavaScript title rewrite
// requires getFirstHeading() and getElementsByClass() and its dependencies
function rewriteTitle() {
if( typeof( window.SKIP_TITLE_REWRITE ) != 'undefined' && window.SKIP_TITLE_REWRITE ) {
return;
}
var titleDiv = document.getElementById( 'title-meta' );
if( titleDiv == null ) {
return;
}
var cloneNode = titleDiv.cloneNode( true );
var firstHeading = getFirstHeading();
var node = firstHeading.childNodes[0];
// new, then old!
firstHeading.replaceChild( cloneNode, node );
cloneNode.style.display = 'inline';
var titleAlign = document.getElementById( 'title-align' );
firstHeading.style.textAlign = titleAlign.childNodes[0].nodeValue;
}
jQuery( document ).ready( rewriteTitle );
// END JavaScript title rewrite
// --------------------------------------------------------
// addSubpages
// adds a 'subpages' link to the toolbox bar (excludes File, MediaWiki and Category namespaces)
// --------------------------------------------------------
jQuery( document ).ready( function( $ ) {
var NSWithoutSubpages = new Array(-1, 6, 8, 14);
if (document.getElementById('p-tb') && NSWithoutSubpages.indexOf(wgNamespaceNumber) == -1)
{
var linkSubpages = '/wiki/Special:PrefixIndex/' + wgPageName + '/';
mw.util.addPortletLink('p-tb', linkSubpages, 'Subpages', 't-subpages', 'Subpages of this page');
}
} );
//
// --------------------------------------------------------
// addUserActivityLog
// adds a 'user activity log' link to the toolbox bar
// --------------------------------------------------------
jQuery( document ).ready( function( $ ) {
if((wgUserGroups.indexOf("ServerManager") != -1 || wgUserGroups.indexOf("WikiHead") != -1) && (wgNamespaceNumber == 2 || wgNamespaceNumber == 3)){
var linkUserLog = '../network/director.php?form_action=View%20User%20Daily%20Activity&user_activity_log=' + wgTitle;
mw.util.addPortletLink('p-tb', linkUserLog, 'User Activity Log', 't-userlog', 'View user daily activity');
}
} );
//
// *****************************************************************
// &bot=1 on contribs pages (Special:Contributions/Foo).
// *****************************************************************
function hideRollback() {
var botlink = document.location.href;
if( botlink.indexOf( '?' ) == -1 ) {
botlink += '?bot=1';
} else {
botlink += '&bot=1';
}
mw.util.addPortletLink( 'p-cactions', botlink, '&bot=1', 'ca-bot' );
}
if( wgCanonicalSpecialPageName == 'Contributions' ) {
jQuery( document ).ready( hideRollback );
}
/* Auto-refresh button on Special:RecentChanges from mariowiki.com */
function setCookie(c_name, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}
function getCookie(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) c_end = document.cookie.length;
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
}
var ajaxPages = new Array("Special:RecentChanges");
var ajaxRCOverride = false;
var rcRefresh = 15000;
function ajaxRC() {
appTo = $(".mw-specialpage-summary");
appTo.append(' <span style="position:absolute; right:40px;"><span style="position:relative; top:-45px;"><span style="position:relative; top:-12px; right:-15px;" id="autoRefreshProgress"><img src="/images/loader.gif" border="0" alt=" " /></span><span style="font-size: xx-small; cursor:help;" title="Automatically refresh the current page every ' + Math.floor(rcRefresh / 1000) + ' seconds">AUTO-REFRESH:</span><input type="checkbox" id="autoRefreshToggle"></span></span>');
$("#autoRefreshToggle").click(function () {
setCookie("ajaxRC", $("#autoRefreshToggle").is(":checked") ? "on" : "off")
loadRCData()
});
$("#autoRefreshProgress").hide();
if (getCookie("ajaxRC") == "on" || ajaxRCOverride) {
$("#autoRefreshToggle").attr("checked", "checked");
setTimeout("loadRCData();", rcRefresh);
}
}
function loadRCData() {
if (!$("#autoRefreshToggle").is(":checked")) return;
$('#autoRefreshProgress').show()
$(article).load(location.href + " " + article + " > *", function (data) {
$(article + " .mw-collapsible").makeCollapsible();
$('#autoRefreshProgress').hide()
if ($("#autoRefreshToggle").is(":checked")) setTimeout("loadRCData();", rcRefresh);
});
}
$(function () {
article = "#bodyContent";
for (x in ajaxPages) {
if (wgPageName == ajaxPages[x] && $("#autoRefreshToggle").length == 0) ajaxRC();
}
});