MediaWiki:Common.js: Difference between revisions
From Unreal Wiki, The Unreal Engine Documentation Site
mNo edit summary |
m added support for non-floating toggle button in collapsible table |
||
Line 69: | Line 69: | ||
var ButtonLink = document.createElement( "a" ); | var ButtonLink = document.createElement( "a" ); | ||
var ButtonText = document.createTextNode( collapseCaption ); | var ButtonText = document.createTextNode( collapseCaption ); | ||
Button.style.styleFloat = "right"; | if ( !hasClass(Header, "inline-button") ) { | ||
Button.style.styleFloat = "right"; | |||
Button.style.cssFloat = "right"; | |||
Button.style.textAlign = "right"; | |||
Button.style.width = "6em"; | |||
} | |||
Button.style.fontWeight = "normal"; | Button.style.fontWeight = "normal"; | ||
ButtonLink.style.color = Header.style.color; | ButtonLink.style.color = Header.style.color; | ||
Line 81: | Line 83: | ||
ButtonLink.appendChild( ButtonText ); | ButtonLink.appendChild( ButtonText ); | ||
Button.appendChild( document.createTextNode( "[" ) ); | Button.appendChild( document.createTextNode( hasClass(Header, "inline-button") ? " [" : "[" ) ); | ||
Button.appendChild( ButtonLink ); | Button.appendChild( ButtonLink ); | ||
Button.appendChild( document.createTextNode( "]" ) ); | Button.appendChild( document.createTextNode( "]" ) ); | ||
Header.insertBefore( Button, Header.childNodes[0] ); | if ( hasClass(Header, "inline-button") ) { | ||
Header.appendChild( Button ); | |||
} else { | |||
Header.insertBefore( Button, Header.childNodes[0] ); | |||
} | |||
tableIndex++; | tableIndex++; | ||
} | } |
Revision as of 07:06, 13 May 2008
/* <!-- Add source highlighting to preview page --> <source lang=javascript> */
/* Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Copied from: [[wikipedia:MediaWiki:Common.js]]
*/
var hasClass = (function () {
var reCache = {};
return function (element, className) {
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
};
})();
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* [[wikipedia:Project:NavFrame]].
* Copied from: [[wikipedia:MediaWiki:Common.js]]
*/
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 );
if ( !hasClass(Header, "inline-button") ) {
Button.style.styleFloat = "right";
Button.style.cssFloat = "right";
Button.style.textAlign = "right";
Button.style.width = "6em";
}
Button.style.fontWeight = "normal";
ButtonLink.style.color = Header.style.color;
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( hasClass(Header, "inline-button") ? " [" : "[" ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( "]" ) );
if ( hasClass(Header, "inline-button") ) {
Header.appendChild( Button );
} else {
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 );
/* Hidden blocks ***********************************************************
*
* Description: Similar to collapsible tables, hidden blocks' visibility can
* be toggled on and off.
*/
function toggleHiddenBlock(blockIndex)
{
var Button = document.getElementById("toggleBlockButton" + blockIndex);
var Block = document.getElementById("hiddenBlock" + blockIndex);
if (!Block || !Button) {
return false;
}
if (Button.firstChild.data == collapseCaption) {
Block.style.display = "none";
Button.firstChild.data = expandCaption;
} else {
Block.style.display = "block";
Button.firstChild.data = collapseCaption;
}
}
function createShowBlockButtons()
{
var blockIndex = 0;
var Blocks = document.getElementsByTagName("div");
for (var i = 0; i < Blocks.length; i++) {
if (hasClass(Blocks[i], "hidden-block" ) ) {
var Hint = Blocks[i].getElementsByTagName("span")[0];
if (!Hint) continue;
var HiddenBlock = Blocks[i].getElementsByTagName("div")[0];
if (!HiddenBlock) continue;
HiddenBlock.setAttribute("id", "hiddenBlock" + blockIndex);
var Button = document.createElement("span");
var ButtonLink = document.createElement("a");
var ButtonText = document.createTextNode(collapseCaption);
ButtonLink.style.color = Hint.style.color;
ButtonLink.setAttribute("id", "toggleBlockButton" + blockIndex);
ButtonLink.setAttribute("href", "javascript:toggleHiddenBlock(" + blockIndex + ");");
ButtonLink.appendChild(ButtonText);
Button.appendChild(document.createTextNode("["));
Button.appendChild(ButtonLink);
Button.appendChild(document.createTextNode("]"));
Blocks[i].insertBefore(Button, HiddenBlock);
blockIndex++;
}
}
for (var i = 0; i < blockIndex; i++ ) {
toggleHiddenBlock(i);
}
}
addOnloadHook(createShowBlockButtons);
/* Change Watch URLs ***********************************************************
*
* Description: The format of watch URLs on this wiki is different from the
* standard format. Adjust the Ajax code to accommodate this.
*/
function changeWatchURLs() {
wgAjaxWatch.setHref = function( string ) {
for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) {
if( string == 'watch' ) {
wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href
.replace( /\/unwatch\//, '/watch/' );
} else if( string == 'unwatch' ) {
wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href
.replace( /\/watch\//, '/unwatch/' );
}
}
}
}
addOnloadHook( changeWatchURLs );
/** Extra toolbar options ******************************************************
*
* Description: UNDOCUMENTED
* Copied from: [[wikipedia:MediaWiki:Common.js]]
*/
// To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]]
if (mwCustomEditButtons) {
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png",
"speedTip": "Redirect",
"tagOpen": "#REDIRECT [[",
"tagClose": "]]",
"sampleText": "Insert text"
};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/w/images/Button_uscript.png",
"speedTip": "UScript code",
"tagOpen": "<uscript>",
"tagClose": "</uscript>",
"sampleText": "Insert code"
};
}
/* </source> */