MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
Greenpickle (talk | contribs) (pretty sure it's not needed) |
Greenpickle (talk | contribs) (a bit of a test) |
||
Line 161: | Line 161: | ||
} | } | ||
) | ) | ||
/* Content tabber, version 1.0.2 by Greenpickle (GPL3) */ | |||
var switchableAnchorPrefix = ''; | |||
var switchableClass = 'switchable'; | |||
var switchableSectionClass = 'switch'; | |||
function initialiseSwitchable () { | |||
// get the elements we care about | |||
switchable = document.myGetElementsByClassName(switchableClass); | |||
// some functions | |||
switchable.createTab = function (label, isAnchor, i, j) { | |||
var tab = document.createElement('li'); | |||
var child; | |||
if (isAnchor) { | |||
child = document.createElement('a'); | |||
child.setAttribute('href', | |||
'javascript:switchable.setVisible(' + i + ', ' + j + ');'); | |||
} else child = document.createElement('strong'); | |||
child.appendChild(document.createTextNode(label)); | |||
tab.appendChild(child); | |||
return tab; | |||
} | |||
switchable.getVisible = function (i) { | |||
var visible = this[i].getAttribute('visiblesection'); | |||
if (visible) visible = parseInt(visible); | |||
if (visible === null || isNaN(visible)) { | |||
visible = 0; | |||
this[i].setAttribute('visiblesection', visible.toString()); | |||
} | |||
return Math.max(0, Math.min(visible, this[i].sections.length - 1)); | |||
} | |||
switchable.updateVisible = function (i) { | |||
if (isNaN(parseInt(i))) { | |||
// update all switchables if no valid number given | |||
for (var i = 0; i < this.length; i++) | |||
this.updateVisible(i); | |||
} else { | |||
var visible = this.getVisible(i); | |||
var sections = this[i].sections; | |||
var tc = this[i].tabContainer; | |||
var currentTab; | |||
for (var j = 0; j < sections.length; j++) { | |||
if (j == visible) { | |||
// change 'show' link | |||
currentTab = this.createTab(sections[j].sectionName, | |||
false); | |||
currentTab.j = j; | |||
tc.replaceChild(currentTab, tc.tabs[j]); | |||
// show section | |||
sections[j].style.display = ''; | |||
} else { | |||
// change 'show' link | |||
if (tc.currentTab !== undefined && tc.currentTab.j == j) | |||
tc.replaceChild(tc.tabs[j], tc.currentTab); | |||
// hide section | |||
sections[j].style.display = 'none'; | |||
} | |||
} | |||
if (currentTab !== undefined) tc.currentTab = currentTab; | |||
} | |||
} | |||
switchable.setVisible = function (i, j) { | |||
this[i].setAttribute('visiblesection', j); | |||
this.updateVisible(i); | |||
} | |||
// initialise | |||
for (var i = 0; i < switchable.length; i++) { | |||
var sections = switchable[i].myGetElementsByClassName( | |||
switchableSectionClass); | |||
switchable[i].sections = sections; | |||
// create show/hide anchors | |||
var tabContainer = document.createElement('ul'); | |||
switchable[i].appendChild(tabContainer); | |||
switchable[i].tabContainer = tabContainer; | |||
tabContainer.tabs = []; | |||
for (var j = 0; j < sections.length; j++) { | |||
// re-append section to place it after links | |||
switchable[i].appendChild(sections[j]); | |||
// use section's name if it has one | |||
var sectionName = sections[j].getAttribute('sectionname'); | |||
if (!sectionName) sectionName = j.toString(); | |||
sections[j].sectionName = sectionName; | |||
// create anchor | |||
var tab = switchable.createTab( | |||
switchableAnchorPrefix + sectionName, true, i, j); | |||
tabContainer.appendChild(tab); | |||
tabContainer.tabs.push(tab); | |||
} | |||
} | |||
this.switchable = switchable; | |||
// initial show/hide | |||
switchable.updateVisible(); | |||
} | |||
Node.prototype.myGetElementsByClassName = function (cls) { | |||
var result = []; | |||
var pool = this.getElementsByTagName("*"); | |||
var re = new RegExp('\\b' + cls + '\\b'); | |||
for (var i = 0; i < pool.length; i++) | |||
if (re.test(pool[i].className)) result.push(pool[i]); | |||
return result; | |||
} | |||
// initialise on page load | |||
addOnloadHook('load', initialiseSwitchable); | |||
/* table.hideable, version 1.0.0 by Greenpickle (GPL3) */ | |||
var hideImageURL = 'http://img87.imageshack.us/img87/5183/hide.png'; | |||
var showImageURL = 'http://img87.imageshack.us/img87/2237/showg.png'; | |||
var hideableTableClass = 'colshideable'; | |||
var hideableHeaderClass = 'hideable'; | |||
var hiddenHeaderClass = 'hidden'; | |||
var hideableHeaderLinkClass = 'hideheader'; | |||
Element.prototype.indexOf = function (o) { | |||
var children = this.childNodes; | |||
var i = children.length; | |||
while (i--) { | |||
if (children[i] === o) return i; | |||
} | |||
return -1; | |||
} | |||
function getCells (tr) { | |||
// return an array of all th and td elements in a table row | |||
var cells = []; | |||
var children = tr.childNodes; | |||
for (var i = 0; i < children.length; i++) { | |||
if (children[i].constructor === HTMLTableCellElement) cells.push(children[i]); | |||
} | |||
return cells; | |||
} | |||
function initHideable () { | |||
var tables = getElementsByClassName(document, 'table', hideableTableClass); | |||
window.tables = tables; | |||
var hiddenCols = []; | |||
window.hiddenCols = hiddenCols; | |||
for (var i = 0; i < tables.length; i++) { | |||
// operate on first row | |||
var tr = tables[i].getElementsByTagName('tr')[0] | |||
var ths = getCells(tr); | |||
hiddenCols.push(Array(ths.length)); | |||
for (var j = 0; j < ths.length; j++) { | |||
if (hasClass(ths[j], hideableHeaderClass)) { | |||
// add show/hide button | |||
var lnk = document.createElement('a'); | |||
lnk.className = hideableHeaderLinkClass; | |||
lnk.setAttribute('href', '#'); | |||
lnk.setAttribute('onclick', 'toggleColHidden(' + i | |||
+ ', ' + j + '); return false;'); | |||
var img = document.createElement('img'); | |||
img.setAttribute('alt', 'hide'); | |||
img.src = hideImageURL; | |||
lnk.appendChild(img); | |||
ths[j].appendChild(lnk); | |||
// hide column now if marked | |||
if (hasClass(ths[j], hiddenHeaderClass)) toggleColHidden(i, j); | |||
} | |||
} | |||
} | |||
} | |||
function toggleColHidden (tableNum, col) { | |||
var hidden = hiddenCols[tableNum]; | |||
var table = tables[tableNum]; | |||
var rows = table.getElementsByTagName('tr'); | |||
if (hidden[col] === undefined) { | |||
// replace each cell with an empty one | |||
hidden = hidden[col] = []; | |||
for (var i = 0; i < rows.length; i++) { | |||
var oldCell = getCells(rows[i])[col]; | |||
if (i == 0) { | |||
// create 'show' link | |||
var cell = document.createElement(oldCell.tagName); | |||
var lnk = document.createElement('a'); | |||
lnk.className = hideableHeaderLinkClass; | |||
lnk.setAttribute('href', '#'); | |||
lnk.setAttribute('onclick', 'toggleColHidden(' | |||
+ tableNum + ', ' + col + '); return false;'); | |||
var img = document.createElement('img'); | |||
img.setAttribute('alt', 'show'); | |||
img.src = showImageURL; | |||
lnk.appendChild(img); | |||
cell.appendChild(lnk); | |||
} else { | |||
var cell = document.createElement('td'); | |||
cell.style.border = 'none'; | |||
} | |||
hidden[i] = rows[i].replaceChild(cell, oldCell); | |||
} | |||
} else { | |||
// restore replaced cells | |||
hidden[col]; | |||
for (var i = 0; i < rows.length; i++) { | |||
var oldCell = getCells(rows[i])[col]; | |||
rows[i].replaceChild(hidden[col][i], oldCell); | |||
} | |||
hidden[col] = undefined; | |||
} | |||
} | |||
// initialise on page load | |||
addOnloadHook(initHideable); |
Revision as of 05:45, October 29, 2010
/* tooltips and access keys */
ta = new Object();
ta['pt-userpage'] = new Array('.','My user page');
ta['pt-anonuserpage'] = new Array('.','The user page for the ip you\'re editing as');
ta['pt-mytalk'] = new Array('n','My talk page');
ta['pt-anontalk'] = new Array('n','Discussion about edits from this ip address');
ta['pt-preferences'] = new Array('','My preferences');
ta['pt-watchlist'] = new Array('l','The list of pages you\'re monitoring for changes.');
ta['pt-mycontris'] = new Array('y','List of my contributions');
ta['pt-login'] = new Array('o','You are encouraged to log in, it is not mandatory however.');
ta['pt-anonlogin'] = new Array('o','You are encouraged to log in, it is not mandatory however.');
ta['pt-logout'] = new Array('o','Log out');
ta['ca-talk'] = new Array('t','Discussion about the content page');
ta['ca-edit'] = new Array('e','You can edit this page. Please use the preview button before saving.');
ta['ca-addsection'] = new Array('+','Add a comment to this discussion.');
ta['ca-viewsource'] = new Array('e','This page is protected. You can view its source.');
ta['ca-history'] = new Array('h','Past versions of this page.');
ta['ca-protect'] = new Array('=','Protect this page');
ta['ca-delete'] = new Array('d','Delete this page');
ta['ca-undelete'] = new Array('d','Restore the edits done to this page before it was deleted');
ta['ca-move'] = new Array('m','Move this page');
ta['ca-watch'] = new Array('w','Add this page to your watchlist');
ta['ca-unwatch'] = new Array('w','Remove this page from your watchlist');
ta['search'] = new Array('f','Search this wiki');
ta['p-logo'] = new Array('','Main Page');
ta['n-mainpage'] = new Array('z','Visit the Main Page');
ta['n-portal'] = new Array('','About the project, what you can do, where to find things');
ta['n-currentevents'] = new Array('','Find background information on current events');
ta['n-recentchanges'] = new Array('r','The list of recent changes in the wiki.');
ta['n-randompage'] = new Array('x','Load a random page');
ta['n-help'] = new Array('','The place to find out.');
ta['n-sitesupport'] = new Array('','Support us');
ta['t-whatlinkshere'] = new Array('j','List of all wiki pages that link here');
ta['t-recentchangeslinked'] = new Array('k','Recent changes in pages linked from this page');
ta['feed-rss'] = new Array('','RSS feed for this page');
ta['feed-atom'] = new Array('','Atom feed for this page');
ta['t-contributions'] = new Array('','View the list of contributions of this user');
ta['t-emailuser'] = new Array('','Send a mail to this user');
ta['t-upload'] = new Array('u','Upload images or media files');
ta['t-specialpages'] = new Array('q','List of all special pages');
ta['ca-nstab-main'] = new Array('c','View the content page');
ta['ca-nstab-user'] = new Array('c','View the user page');
ta['ca-nstab-media'] = new Array('c','View the media page');
ta['ca-nstab-special'] = new Array('','This is a special page, you can\'t edit the page itself.');
ta['ca-nstab-project'] = new Array('a','View the project page');
ta['ca-nstab-image'] = new Array('c','View the image page');
ta['ca-nstab-mediawiki'] = new Array('c','View the system message');
ta['ca-nstab-template'] = new Array('c','View the template');
ta['ca-nstab-help'] = new Array('c','View the help page');
ta['ca-nstab-category'] = new Array('c','View the category page');
ta['ca-nstab-forum'] = new Array('c','View the forum page');
/* Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[Wikipedia:User:Mike Dillon]], [[Wikipedia:User:R. Koot]], [[Wikipedia: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);
};
})();
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* [[Wikipedia:NavFrame]].
* Maintainers: [[User:R. Koot]]
*/
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.style.styleFloat = "right";
Button.style.cssFloat = "right";
Button.style.fontWeight = "normal";
Button.style.textAlign = "right";
Button.style.width = "6em";
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 );
/* Rename Main Page tab */
if (wgPageName == 'Main_Page' || wgPageName == 'Talk:Main_Page')
addOnloadHook(function () {
var nstab = document.getElementById('ca-nstab-main')
if (nstab && wgUserLanguage=='en') {
while (nstab.firstChild) nstab = nstab.firstChild
nstab.nodeValue = 'Main Page'
}
}
)
/* Content tabber, version 1.0.2 by Greenpickle (GPL3) */
var switchableAnchorPrefix = '';
var switchableClass = 'switchable';
var switchableSectionClass = 'switch';
function initialiseSwitchable () {
// get the elements we care about
switchable = document.myGetElementsByClassName(switchableClass);
// some functions
switchable.createTab = function (label, isAnchor, i, j) {
var tab = document.createElement('li');
var child;
if (isAnchor) {
child = document.createElement('a');
child.setAttribute('href',
'javascript:switchable.setVisible(' + i + ', ' + j + ');');
} else child = document.createElement('strong');
child.appendChild(document.createTextNode(label));
tab.appendChild(child);
return tab;
}
switchable.getVisible = function (i) {
var visible = this[i].getAttribute('visiblesection');
if (visible) visible = parseInt(visible);
if (visible === null || isNaN(visible)) {
visible = 0;
this[i].setAttribute('visiblesection', visible.toString());
}
return Math.max(0, Math.min(visible, this[i].sections.length - 1));
}
switchable.updateVisible = function (i) {
if (isNaN(parseInt(i))) {
// update all switchables if no valid number given
for (var i = 0; i < this.length; i++)
this.updateVisible(i);
} else {
var visible = this.getVisible(i);
var sections = this[i].sections;
var tc = this[i].tabContainer;
var currentTab;
for (var j = 0; j < sections.length; j++) {
if (j == visible) {
// change 'show' link
currentTab = this.createTab(sections[j].sectionName,
false);
currentTab.j = j;
tc.replaceChild(currentTab, tc.tabs[j]);
// show section
sections[j].style.display = '';
} else {
// change 'show' link
if (tc.currentTab !== undefined && tc.currentTab.j == j)
tc.replaceChild(tc.tabs[j], tc.currentTab);
// hide section
sections[j].style.display = 'none';
}
}
if (currentTab !== undefined) tc.currentTab = currentTab;
}
}
switchable.setVisible = function (i, j) {
this[i].setAttribute('visiblesection', j);
this.updateVisible(i);
}
// initialise
for (var i = 0; i < switchable.length; i++) {
var sections = switchable[i].myGetElementsByClassName(
switchableSectionClass);
switchable[i].sections = sections;
// create show/hide anchors
var tabContainer = document.createElement('ul');
switchable[i].appendChild(tabContainer);
switchable[i].tabContainer = tabContainer;
tabContainer.tabs = [];
for (var j = 0; j < sections.length; j++) {
// re-append section to place it after links
switchable[i].appendChild(sections[j]);
// use section's name if it has one
var sectionName = sections[j].getAttribute('sectionname');
if (!sectionName) sectionName = j.toString();
sections[j].sectionName = sectionName;
// create anchor
var tab = switchable.createTab(
switchableAnchorPrefix + sectionName, true, i, j);
tabContainer.appendChild(tab);
tabContainer.tabs.push(tab);
}
}
this.switchable = switchable;
// initial show/hide
switchable.updateVisible();
}
Node.prototype.myGetElementsByClassName = function (cls) {
var result = [];
var pool = this.getElementsByTagName("*");
var re = new RegExp('\\b' + cls + '\\b');
for (var i = 0; i < pool.length; i++)
if (re.test(pool[i].className)) result.push(pool[i]);
return result;
}
// initialise on page load
addOnloadHook('load', initialiseSwitchable);
/* table.hideable, version 1.0.0 by Greenpickle (GPL3) */
var hideImageURL = 'http://img87.imageshack.us/img87/5183/hide.png';
var showImageURL = 'http://img87.imageshack.us/img87/2237/showg.png';
var hideableTableClass = 'colshideable';
var hideableHeaderClass = 'hideable';
var hiddenHeaderClass = 'hidden';
var hideableHeaderLinkClass = 'hideheader';
Element.prototype.indexOf = function (o) {
var children = this.childNodes;
var i = children.length;
while (i--) {
if (children[i] === o) return i;
}
return -1;
}
function getCells (tr) {
// return an array of all th and td elements in a table row
var cells = [];
var children = tr.childNodes;
for (var i = 0; i < children.length; i++) {
if (children[i].constructor === HTMLTableCellElement) cells.push(children[i]);
}
return cells;
}
function initHideable () {
var tables = getElementsByClassName(document, 'table', hideableTableClass);
window.tables = tables;
var hiddenCols = [];
window.hiddenCols = hiddenCols;
for (var i = 0; i < tables.length; i++) {
// operate on first row
var tr = tables[i].getElementsByTagName('tr')[0]
var ths = getCells(tr);
hiddenCols.push(Array(ths.length));
for (var j = 0; j < ths.length; j++) {
if (hasClass(ths[j], hideableHeaderClass)) {
// add show/hide button
var lnk = document.createElement('a');
lnk.className = hideableHeaderLinkClass;
lnk.setAttribute('href', '#');
lnk.setAttribute('onclick', 'toggleColHidden(' + i
+ ', ' + j + '); return false;');
var img = document.createElement('img');
img.setAttribute('alt', 'hide');
img.src = hideImageURL;
lnk.appendChild(img);
ths[j].appendChild(lnk);
// hide column now if marked
if (hasClass(ths[j], hiddenHeaderClass)) toggleColHidden(i, j);
}
}
}
}
function toggleColHidden (tableNum, col) {
var hidden = hiddenCols[tableNum];
var table = tables[tableNum];
var rows = table.getElementsByTagName('tr');
if (hidden[col] === undefined) {
// replace each cell with an empty one
hidden = hidden[col] = [];
for (var i = 0; i < rows.length; i++) {
var oldCell = getCells(rows[i])[col];
if (i == 0) {
// create 'show' link
var cell = document.createElement(oldCell.tagName);
var lnk = document.createElement('a');
lnk.className = hideableHeaderLinkClass;
lnk.setAttribute('href', '#');
lnk.setAttribute('onclick', 'toggleColHidden('
+ tableNum + ', ' + col + '); return false;');
var img = document.createElement('img');
img.setAttribute('alt', 'show');
img.src = showImageURL;
lnk.appendChild(img);
cell.appendChild(lnk);
} else {
var cell = document.createElement('td');
cell.style.border = 'none';
}
hidden[i] = rows[i].replaceChild(cell, oldCell);
}
} else {
// restore replaced cells
hidden[col];
for (var i = 0; i < rows.length; i++) {
var oldCell = getCells(rows[i])[col];
rows[i].replaceChild(hidden[col][i], oldCell);
}
hidden[col] = undefined;
}
}
// initialise on page load
addOnloadHook(initHideable);