| This wiki is closed in favour of the new wiki. Information shown is likely to be very out of date. |
Difference between revisions of "MediaWiki:Common.js"
From Discovery Wiki
Jump to navigationJump to searchm (I hope this fix doesn't work.) |
m (Right, I'm mixing DOM level elements and odd jQuery thingies.) |
||
| Line 331: | Line 331: | ||
jQuery("#activeUsersEmbed").load("http://discoverygc.com/wiki/index.php?title=Special:ActiveUsers .mw-activeusers-intro~ul"); | jQuery("#activeUsersEmbed").load("http://discoverygc.com/wiki/index.php?title=Special:ActiveUsers .mw-activeusers-intro~ul"); | ||
// sort it by amount of edits (when DOM changes finished) | // sort it by amount of edits (when DOM changes finished) | ||
| − | jQuery("<script>sortList(document.querySelector('#activeUsersEmbed ul'));</script>").appendTo(" | + | jQuery("<script>sortList(document.querySelector('#activeUsersEmbed ul'));</script>").appendTo(document.getElementById("activeUsersEmbed")); |
} | } | ||
} | } | ||
Revision as of 19:27, 18 April 2015
/* Any JavaScript here will be loaded for all users on every page load. */
/* Event attach functions. */
function DW_eventAttach (obj, event, handler) {
if (obj.addEventListener) {
obj.addEventListener(event, handler, false);
} else if (obj.attachEvent) {
var r = obj.attachEvent('on' + event, handler);
} else {
obj['on' + event] = handler;
}
}
/* Functions for Template:SpoilerWindow */
function DW_createSpoilerLink () {
var el_list = document.getElementsByTagName('div');
var el_cur;
for (var i = 0, l = el_list.length; i < l; i++){
el_cur = el_list[i];
if ((el_cur.className && el_cur.className == 'dwspoiler')) {
var container = el_cur.getElementsByTagName('div');
if (!container.item(1).style.display || container.item(1).style.display == 'block') {
var text = document.createTextNode('Hide');
} else {
var text = document.createTextNode('Show');
}
var link = document.createElement('a');
link.appendChild(text);
link.setAttribute('href', 'javascript:void(0);');
DW_eventAttach(link, 'click', function () { DW_toggleVisibility(this); });
var toggle_element = el_cur.getElementsByTagName('span');
toggle_element.item(0).appendChild(document.createTextNode('['));
toggle_element.item(0).appendChild(link);
toggle_element.item(0).appendChild(document.createTextNode(']'));
}
}
}
addOnloadHook(DW_createSpoilerLink);
function DW_toggleVisibility (obj) {
var container = obj.parentNode.parentNode.parentNode.getElementsByTagName('div').item(1);
if (!container.style.display || container.style.display == 'block') {
container.style.display = 'none';
obj.innerHTML = 'Show';
} else {
container.style.display = 'block';
obj.innerHTML = 'Hide';
}
}
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* [[**DOCUMENTATION LINK**]].
* Maintainers: [[**MAINTAINERS**]]
*/
var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";
function collapseTable( tableIndex )
{
var Button = document.getElementById( "collapseButton" + tableIndex );
var Table = document.getElementById( "collapsibleTable" + tableIndex );
if ( !Table || !Button ) {
return false;
}
var Rows = Table.rows;
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = "none";
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createCollapseButtons()
{
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = document.getElementsByTagName( "table" );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], "collapsible" ) ) {
/* only add button and increment count if there is a header row to work with */
var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
if (!HeaderRow) continue;
var Header = HeaderRow.getElementsByTagName( "th" )[0];
if (!Header) continue;
NavigationBoxes[ tableIndex ] = Tables[i];
Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
var Button = document.createElement( "span" );
var ButtonLink = document.createElement( "a" );
var ButtonText = document.createTextNode( collapseCaption );
Button.className = "collapseButton"; //Styles are declared in Common.css
ButtonLink.style.color = Header.style.color;
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( "[" ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( "]" ) );
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
for ( var i = 0; i < tableIndex; i++ ) {
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
collapseTable( i );
}
}
}
addOnloadHook( createCollapseButtons );
/** Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
*/
var hasClass = (function () {
var reCache = {};
return function (element, className) {
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
};
})();
/* Overwrite mediawiki's default sort function for tables, fixing how numbers are sorted in table cells if they have a unit attached at the end */
function padnum(str, len) {
if (len + 1 >= str.length && str.match(/^\d/)) {
str = Array(len + 1 - str.length).join('0') + str;
}
return str;
}
function ts_sort_numeric(a,b) {
var aa = padnum(ts_parseFloat(a[1]),50);
var bb = padnum(ts_parseFloat(b[1]),50);
return (aa != bb ? aa - bb : a[2] - b[2]);
}
// -------------------------------------------------------------------------------
// Force Preview JavaScript code - Start
//
// To allow any group to bypass being forced to preview,
// enter the group name in the permittedGroups array.
// E.g.
// var permittedGroups = []; // force everyone
// var permittedGroups = [ "user"]; // permit logged-in users
// var permittedGroups = [ "sysop", "bureaucrat"]; // permit sysop, bureaucrat
// -------------------------------------------------------------------------------
var permittedGroups = [ "trusted", "sysop", "bureaucrat" ];
Array.prototype.intersects = function() {
// --------------------------------------------------------
// Returns true if any element in the argument array
// is the same as an element in this array
// --------------------------------------------------------
if ( !arguments.length ) return false;
var array2 = arguments[0];
var len1 = this.length;
var len2 = array2.length;
if ( len2 == 0 ) return false;
for ( var i = 0; i < len1; i++ ) {
for ( var j = 0; j < len2; j++ ) {
if ( this[i] === array2[j] ) return true;
}
}
return false;
};
function forcePreview() {
if ( mw.config.get( 'wgNamespaceNumber' ) == 10 || mw.config.get( 'wgNamespaceNumber' ) == 8 ) return; // No point forcing preview in the Template or MediaWiki namespaces
if ( mw.config.get( "wgAction" ) != "edit" ) return;
if ( mw.config.get( "wgUserGroups" ).intersects( permittedGroups ) ) return;
var saveButton = document.getElementById( "wpSave" );
if ( !saveButton ) return;
saveButton.disabled = true;
saveButton.value = "Save page (use preview first)";
saveButton.style.fontWeight = "normal";
document.getElementById("wpPreview").style.fontWeight = "bold";
}
jQuery(document).ready( forcePreview );
// -----------------------------------------------------
// Force Preview JavaScript code - End
// -----------------------------------------------------
/* Scroll Gallery JS start */
jQuery( document ).ready(function() {
if (document.URL.match(/printable/g)) return;
function toggleImageFunction(group, remindex, shwindex) {
return function() {
document.getElementById("ImageGroupsGr" + group + "Im" + remindex).style["display"] = "none";
document.getElementById("ImageGroupsGr" + group + "Im" + shwindex).style["display"] = "block";
return false;
};
}
var divs = document.getElementsByTagName("div");
var i = 0, j = 0;
var units, search;
var currentimage;
var UnitNode;
for (i = 0; i < divs.length; i++) {
if (divs[i].className !== "ImageGroup") { continue; }
UnitNode = undefined;
search = divs[i].getElementsByTagName("div");
for (j = 0; j < search.length; j++) {
if (search[j].className !== "ImageGroupUnits") { continue; }
UnitNode=search[j];
break;
}
if (UnitNode === undefined) { continue; }
units = [];
for (j = 0 ; j < UnitNode.childNodes.length ; j++ ) {
var temp = UnitNode.childNodes[j];
if (temp.className === "center") { units.push(temp); }
}
var rightlink = undefined;
var commentText = undefined;
for (j = 0; j < units.length; j++) {
currentimage = units[j];
currentimage.id = "ImageGroupsGr" + i + "Im" + j;
var leftlink = document.createElement("a");
if (commentText !== undefined) {
leftlink.setAttribute("title", commentText);
}
var comment;
if (typeof(currentimage.getAttribute("title")) !== "string") {
commentText = (j+1) + "/" + units.length;
comment = document.createElement("tt").appendChild(document.createTextNode("("+ commentText + ")"));
} else {
commentText = currentimage.getAttribute("title");
comment = document.createElement("span").appendChild(document.createTextNode(commentText));
currentimage.removeAttribute("title");
}
if(rightlink !== undefined) {
rightlink.setAttribute("title", commentText);
}
var imghead = document.createElement("div");
rightlink = document.createElement("a");
if (j !== 0) {
leftlink.href = "#";
leftlink.onclick = toggleImageFunction(i, j, j-1);
leftlink.appendChild(document.createTextNode("◀"));
}
if (j !== units.length - 1) {
rightlink.href = "#";
rightlink.onclick = toggleImageFunction(i, j, j+1);
rightlink.appendChild(document.createTextNode("▶"));
}
imghead.style["fontSize"] = "110%";
imghead.style["fontweight"] = "bold";
imghead.appendChild(leftlink);
imghead.appendChild(document.createTextNode("\xA0"));
imghead.appendChild(comment);
imghead.appendChild(document.createTextNode("\xA0"));
imghead.appendChild(rightlink);
if (units.length > 1) {
currentimage.insertBefore(imghead,currentimage.childNodes[0]);
}
if (j !== 0) {
currentimage.style["display"] = "none";
}
}
}
});
/* Scroll Gallery JS end */
/* ActiveUsers embed plugin start */
function sortList(ul){
var new_ul = ul.cloneNode(false);
// Add all li objects to an array
var lis = [];
for(var i = ul.childNodes.length; i--;){
if(ul.childNodes[i].nodeName === 'LI')
lis.push(ul.childNodes[i]);
}
// Sort li objects by user edit count
lis.sort(function(b, a) {
a = a.innerHTML;
b = b.innerHTML;
console.log(String(a)+"\n"+String(b));
editCount = /(\d+)(?= edits in the last 30 days| edit in the last 30 days)/g;
var compA = parseInt(String(a).match(editCount));
var compB = parseInt(String(b).match(editCount));
console.log(String(compA)+"\n"+String(compB));
return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
});
// Add li objects to ul in order
for(var i = 0; i < lis.length; i++)
new_ul.appendChild(lis[i]);
ul.parentNode.replaceChild(new_ul, ul);
}
function getActiveUsers() {
if(!!document.getElementById("activeUsersEmbed")) {
// Alright, some container somewhere wants to contain a list of active users. Cool.
jQuery("#activeUsersEmbed").load("http://discoverygc.com/wiki/index.php?title=Special:ActiveUsers .mw-activeusers-intro~ul");
// sort it by amount of edits (when DOM changes finished)
jQuery("<script>sortList(document.querySelector('#activeUsersEmbed ul'));</script>").appendTo(document.getElementById("activeUsersEmbed"));
}
}
jQuery( document ).ready(function() {
getActiveUsers();
});
/* ActiveUsers embed plugin end */