Difference between revisions of "MediaWiki:Common.js"
From Species-ID
(New code for target highlighting of internal links, especially for single-access keys) |
|||
Line 1: | Line 1: | ||
// <source lang="javascript"> | // <source lang="javascript"> | ||
− | / | + | // Any JavaScript here will be loaded for all users on every page load. |
− | /*** | + | /** Highlight all targets of page-internal links ***************************** |
− | ** | + | * |
− | * | + | * Description: Highlight all targets of page-internal links. The code works generically, |
− | ** | + | * but has special options to be used in single-access identification keys |
− | + | * (see Template:Key_Start). | |
− | function highlight_target(caller) { | + | * Maintainers: [[User:Gregor Hagedorn]] (created Nov. 2008) |
+ | */ | ||
+ | |||
+ | function highlight_target( caller ) { | ||
/* Highlight a single element that is the target of the caller (which must always be a link object, e.g. <a href=...>) | /* Highlight a single element that is the target of the caller (which must always be a link object, e.g. <a href=...>) | ||
USAGE: highlight_target(this) */ | USAGE: highlight_target(this) */ | ||
/* LATER: perhaps try elem.scrollIntoView() instead of the normal hyperlink action */ | /* LATER: perhaps try elem.scrollIntoView() instead of the normal hyperlink action */ | ||
− | /* style.fontSize="120%" | + | /* NOTE: style.fontSize="120%" would move lines up/down..., style.color="#FFCC50" (= nice orange) is too strong. */ |
− | /* | + | /* WHY DOES BORDER NOT WORK? target.style.border = "2px dashed red"; */ |
var idref = caller.hash.substring(1, caller.hash.length); /* substring strips leading hash */ | var idref = caller.hash.substring(1, caller.hash.length); /* substring strips leading hash */ | ||
− | highlight_targetx( idref, "", | + | highlight_targetx( idref, "", "", "blink underline"); |
− | highlight_targetx( idref+"row", " | + | highlight_targetx( idref+"row", "", "2px dashed red", "none"); |
} | } | ||
− | function highlight_targetx(idref, backgroundColor, border, txtdeco) { | + | function highlight_targetx( idref, backgroundColor, border, txtdeco ) { |
/* subfunction of highlight_target, for a single target element */ | /* subfunction of highlight_target, for a single target element */ | ||
var target = document.getElementById(idref); | var target = document.getElementById(idref); | ||
Line 28: | Line 31: | ||
} | } | ||
− | function highlight_reset(idref, old_bcolor, old_border, old_txtdeco) { | + | function highlight_reset( idref, old_bcolor, old_border, old_txtdeco ) { |
/* Stop highlighting (blinking and background color) */ | /* Stop highlighting (blinking and background color) */ | ||
if (idref != "") { /* remove previous highlight: */ | if (idref != "") { /* remove previous highlight: */ | ||
Line 41: | Line 44: | ||
function add_target_highlighting() { | function add_target_highlighting() { | ||
/* Add the necessary onclick events to all page-internal links. | /* Add the necessary onclick events to all page-internal links. | ||
− | Registration is done through anonymous function calling highlight_target(); | + | * Registration is done through anonymous function calling highlight_target(); |
− | Note: "this" must be passed as parameter since valid only in the anonymous function, but not in highlight_target()! */ | + | * Note: "this" must be passed as parameter since valid only in the anonymous function, but not in highlight_target()! |
+ | */ | ||
for (var i = 0, max = document.links.length; i < max; i++) { | for (var i = 0, max = document.links.length; i < max; i++) { | ||
lnk = document.links[i]; | lnk = document.links[i]; | ||
Line 52: | Line 56: | ||
addOnloadHook(add_target_highlighting); | addOnloadHook(add_target_highlighting); | ||
+ | /**** END Highlight all targets of page-internal links *****/ | ||
+ | |||
+ | |||
+ | //== Remainder imported from en.wikipedia.org and modified (parts removed). | ||
+ | // for authors see http://en.wikipedia.org/w/index.php?title=MediaWiki:Common.js&action=history | ||
+ | |||
+ | |||
+ | /* Import more specific scripts if necessary */ | ||
+ | if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages | ||
+ | { | ||
+ | importScript("MediaWiki:Common.js/edit.js") | ||
+ | } | ||
+ | |||
+ | |||
+ | /** 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.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 ); | ||
+ | } | ||
+ | else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) { | ||
+ | var element = NavigationBoxes[i]; | ||
+ | while (element = element.parentNode) { | ||
+ | if ( hasClass( element, "outercollapse" ) ) { | ||
+ | collapseTable ( i ); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | addOnloadHook( createCollapseButtons ); | ||
+ | |||
+ | |||
+ | /** Dynamic Navigation Bars (experimental) ************************************* | ||
+ | * | ||
+ | * Description: See [[Wikipedia:NavFrame]]. | ||
+ | * Maintainers: UNMAINTAINED | ||
+ | */ | ||
+ | |||
+ | // set up the words in your language | ||
+ | var NavigationBarHide = '[' + collapseCaption + ']'; | ||
+ | var NavigationBarShow = '[' + expandCaption + ']'; | ||
+ | |||
+ | // shows and hides content and picture (if available) of navigation bars | ||
+ | // Parameters: | ||
+ | // indexNavigationBar: the index of navigation bar to be toggled | ||
+ | function toggleNavigationBar(indexNavigationBar) | ||
+ | { | ||
+ | var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); | ||
+ | var NavFrame = document.getElementById("NavFrame" + indexNavigationBar); | ||
+ | |||
+ | if (!NavFrame || !NavToggle) { | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | // if shown now | ||
+ | if (NavToggle.firstChild.data == NavigationBarHide) { | ||
+ | for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { | ||
+ | if ( hasClass( NavChild, 'NavPic' ) ) { | ||
+ | NavChild.style.display = 'none'; | ||
+ | } | ||
+ | if ( hasClass( NavChild, 'NavContent') ) { | ||
+ | NavChild.style.display = 'none'; | ||
+ | } | ||
+ | } | ||
+ | NavToggle.firstChild.data = NavigationBarShow; | ||
+ | |||
+ | // if hidden now | ||
+ | } else if (NavToggle.firstChild.data == NavigationBarShow) { | ||
+ | for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { | ||
+ | if (hasClass(NavChild, 'NavPic')) { | ||
+ | NavChild.style.display = 'block'; | ||
+ | } | ||
+ | if (hasClass(NavChild, 'NavContent')) { | ||
+ | NavChild.style.display = 'block'; | ||
+ | } | ||
+ | } | ||
+ | NavToggle.firstChild.data = NavigationBarHide; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // adds show/hide-button to navigation bars | ||
+ | function createNavigationBarToggleButton() | ||
+ | { | ||
+ | var indexNavigationBar = 0; | ||
+ | // iterate over all < div >-elements | ||
+ | var divs = document.getElementsByTagName("div"); | ||
+ | for (var i = 0; NavFrame = divs[i]; i++) { | ||
+ | // if found a navigation bar | ||
+ | if (hasClass(NavFrame, "NavFrame")) { | ||
+ | |||
+ | indexNavigationBar++; | ||
+ | var NavToggle = document.createElement("a"); | ||
+ | NavToggle.className = 'NavToggle'; | ||
+ | NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); | ||
+ | NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');'); | ||
+ | |||
+ | var isCollapsed = hasClass( NavFrame, "collapsed" ); | ||
+ | /* | ||
+ | * Check if any children are already hidden. This loop is here for backwards compatibility: | ||
+ | * the old way of making NavFrames start out collapsed was to manually add style="display:none" | ||
+ | * to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make | ||
+ | * the content visible without JavaScript support), the new recommended way is to add the class | ||
+ | * "collapsed" to the NavFrame itself, just like with collapsible tables. | ||
+ | */ | ||
+ | for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) { | ||
+ | if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) { | ||
+ | if ( NavChild.style.display == 'none' ) { | ||
+ | isCollapsed = true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | if (isCollapsed) { | ||
+ | for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { | ||
+ | if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) { | ||
+ | NavChild.style.display = 'none'; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide); | ||
+ | NavToggle.appendChild(NavToggleText); | ||
+ | |||
+ | // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) | ||
+ | for(var j=0; j < NavFrame.childNodes.length; j++) { | ||
+ | if (hasClass(NavFrame.childNodes[j], "NavHead")) { | ||
+ | NavFrame.childNodes[j].appendChild(NavToggle); | ||
+ | } | ||
+ | } | ||
+ | NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | addOnloadHook( createNavigationBarToggleButton ); | ||
+ | |||
+ | |||
+ | /** Table sorting fixes ************************************************ | ||
+ | * | ||
+ | * Description: Disables code in table sorting routine to set classes on even/odd rows | ||
+ | * Maintainers: [[User:Random832]] | ||
+ | */ | ||
+ | |||
+ | ts_alternate_row_colors = false; | ||
// </source> | // </source> |
Revision as of 17:45, 14 June 2009
// <source lang="javascript">
// Any JavaScript here will be loaded for all users on every page load.
/** Highlight all targets of page-internal links *****************************
*
* Description: Highlight all targets of page-internal links. The code works generically,
* but has special options to be used in single-access identification keys
* (see Template:Key_Start).
* Maintainers: [[User:Gregor Hagedorn]] (created Nov. 2008)
*/
function highlight_target( caller ) {
/* Highlight a single element that is the target of the caller (which must always be a link object, e.g. <a href=...>)
USAGE: highlight_target(this) */
/* LATER: perhaps try elem.scrollIntoView() instead of the normal hyperlink action */
/* NOTE: style.fontSize="120%" would move lines up/down..., style.color="#FFCC50" (= nice orange) is too strong. */
/* WHY DOES BORDER NOT WORK? target.style.border = "2px dashed red"; */
var idref = caller.hash.substring(1, caller.hash.length); /* substring strips leading hash */
highlight_targetx( idref, "", "", "blink underline");
highlight_targetx( idref+"row", "", "2px dashed red", "none");
}
function highlight_targetx( idref, backgroundColor, border, txtdeco ) {
/* subfunction of highlight_target, for a single target element */
var target = document.getElementById(idref);
var reset_string = "highlight_reset(\""+idref+"\",\""+target.style.backgroundColor+"\",\""+target.style.border+"\",\""+target.style.textDecoration+"\")";
target.style.backgroundColor = backgroundColor;
target.style.border = border;
target.style.textDecoration = txtdeco;
window.setTimeout(reset_string, 2000);
}
function highlight_reset( idref, old_bcolor, old_border, old_txtdeco ) {
/* Stop highlighting (blinking and background color) */
if (idref != "") { /* remove previous highlight: */
var e = document.getElementById(idref);
e.style.backgroundColor = old_bcolor;
e.style.border = old_border; /* reset value may be "" for no border! */
if (old_txtdeco == "") old_txtdeco = "none";
e.style.textDecoration = old_txtdeco;
}
}
function add_target_highlighting() {
/* Add the necessary onclick events to all page-internal links.
* Registration is done through anonymous function calling highlight_target();
* Note: "this" must be passed as parameter since valid only in the anonymous function, but not in highlight_target()!
*/
for (var i = 0, max = document.links.length; i < max; i++) {
lnk = document.links[i];
if (lnk.pathname==location.pathname && lnk.hash.length>0) { /* = is page internal link */
document.links[i].onclick = function(){highlight_target(this)};
}
}
}
addOnloadHook(add_target_highlighting);
/**** END Highlight all targets of page-internal links *****/
//== Remainder imported from en.wikipedia.org and modified (parts removed).
// for authors see http://en.wikipedia.org/w/index.php?title=MediaWiki:Common.js&action=history
/* Import more specific scripts if necessary */
if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages
{
importScript("MediaWiki:Common.js/edit.js")
}
/** 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.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 );
}
else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
var element = NavigationBoxes[i];
while (element = element.parentNode) {
if ( hasClass( element, "outercollapse" ) ) {
collapseTable ( i );
break;
}
}
}
}
}
addOnloadHook( createCollapseButtons );
/** Dynamic Navigation Bars (experimental) *************************************
*
* Description: See [[Wikipedia:NavFrame]].
* Maintainers: UNMAINTAINED
*/
// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
// shows and hides content and picture (if available) of navigation bars
// Parameters:
// indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar)
{
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
if (!NavFrame || !NavToggle) {
return false;
}
// if shown now
if (NavToggle.firstChild.data == NavigationBarHide) {
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if ( hasClass( NavChild, 'NavPic' ) ) {
NavChild.style.display = 'none';
}
if ( hasClass( NavChild, 'NavContent') ) {
NavChild.style.display = 'none';
}
}
NavToggle.firstChild.data = NavigationBarShow;
// if hidden now
} else if (NavToggle.firstChild.data == NavigationBarShow) {
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if (hasClass(NavChild, 'NavPic')) {
NavChild.style.display = 'block';
}
if (hasClass(NavChild, 'NavContent')) {
NavChild.style.display = 'block';
}
}
NavToggle.firstChild.data = NavigationBarHide;
}
}
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton()
{
var indexNavigationBar = 0;
// iterate over all < div >-elements
var divs = document.getElementsByTagName("div");
for (var i = 0; NavFrame = divs[i]; i++) {
// if found a navigation bar
if (hasClass(NavFrame, "NavFrame")) {
indexNavigationBar++;
var NavToggle = document.createElement("a");
NavToggle.className = 'NavToggle';
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
var isCollapsed = hasClass( NavFrame, "collapsed" );
/*
* Check if any children are already hidden. This loop is here for backwards compatibility:
* the old way of making NavFrames start out collapsed was to manually add style="display:none"
* to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make
* the content visible without JavaScript support), the new recommended way is to add the class
* "collapsed" to the NavFrame itself, just like with collapsible tables.
*/
for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
if ( NavChild.style.display == 'none' ) {
isCollapsed = true;
}
}
}
if (isCollapsed) {
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
NavChild.style.display = 'none';
}
}
}
var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
NavToggle.appendChild(NavToggleText);
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
for(var j=0; j < NavFrame.childNodes.length; j++) {
if (hasClass(NavFrame.childNodes[j], "NavHead")) {
NavFrame.childNodes[j].appendChild(NavToggle);
}
}
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
}
}
}
addOnloadHook( createNavigationBarToggleButton );
/** Table sorting fixes ************************************************
*
* Description: Disables code in table sorting routine to set classes on even/odd rows
* Maintainers: [[User:Random832]]
*/
ts_alternate_row_colors = false;
// </source>