Common.js – MediaWiki

From Bohemia Interactive Community
Jump to navigation Jump to search
(Reduced load by adding conditional imports)
(Adding function to "clean" redlinked categories in command and function page footers. CSS wasn't a "good" option.)
Line 371: Line 371:
/*****************************************************************************************/
/*****************************************************************************************/


/*****************************************************************************************
* Function that "fixes" redlink categories in command and function pages
* Maintainer: BIKI User:Fred Gandt
*/
function directRedlinkedCategories() {
var cd = document.getElementsByClassName( "command_description" )[0];
if ( cd ) {
if ( cd.firstChild.getAttribute( "class" ) == "gvi" ) {
var cl = document.getElementById( "catlinks" ).getElementsByTagName( "a" );
for ( var l in cl ) {
if ( typeof cl[l] == "object" ) {
if ( cl[l].getAttribute("class") == "new" ) {
cl[l].setAttribute( "href", cl[l].getAttribute( "href" ).replace( "&action=edit&redlink=1", "" ) );
cl[l].removeAttribute( "class" );
}
}
}
}
}
}
mw.hook( "wikipage.content" ).add( directRedlinkedCategories );
/*****************************************************************************************/
/*****************************************************************************************
/*****************************************************************************************
  * Next ***
  * Next ***
  */
  */
 
// code code code
// code code code
/*****************************************************************************************/


/*****************************************************************************************/
/*****************************************************************************************/


} ); /* END mw.loader WRAPPER */
} ); /* END mw.loader WRAPPER */

Revision as of 01:38, 30 May 2014

/*****************************************************************************************
 * Any JavaScript here will be loaded for all users on every page load.
 *
 * As such, the content of this file page should be kept as minimal as possible.
 *
 *****************************************************************************************/

mw.loader.using( ["mediawiki.util", "mediawiki.notify", "jquery.client"], function() { /* BEGIN mw.loader WRAPPER */

/*****************************************************************************************
 * Redirect User:Name/skin.js and skin.css to the current skin's pages
 * (unless the 'skin' page really exists)
 * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js
 * @rev: 2
 * Copied from Wikipedia's MediaWiki:Common.js
 */

	if ( mw.config.get( "wgArticleId" ) === 0 && mw.config.get( "wgNamespaceNumber" ) == 2 ) {
		var titleParts = mw.config.get( "wgPageName" ).split( "/" );
		// Make sure there was a part before and after the slash
		// And that the latter is "skin.js" or "skin.css"
		if ( titleParts.length == 2 ) {
			var userSkinPage = titleParts.shift() + "/" + mw.config.get( "skin" );
			if ( titleParts.slice( -1 ) == "skin.js" ) {
				window.location.href = mw.util.wikiGetlink( userSkinPage + ".js" );
			} else if ( titleParts.slice( -1 ) == "skin.css" ) {
				window.location.href = mw.util.wikiGetlink( userSkinPage + ".css" );
			}
		}
	}

/*****************************************************************************************/

/*****************************************************************************************
 * Map addPortletLink to mw.util
 * Used for adding links to the left side navigation panel
 * Copied from Wikipedia's MediaWiki:Common.js
 */

	window.addPortletLink = function() {
		return mw.util.addPortletLink.apply( mw.util, arguments );
	};

/*****************************************************************************************/

/*****************************************************************************************
 * Extract a URL parameter from the current URL
 * @deprecated: Use mw.util.getParamValue with proper escaping
 * Copied from Wikipedia's MediaWiki:Common.js
 */

	function getURLParamValue( paramName, url ) {
		return mw.util.getParamValue( paramName, url );
	}

/*****************************************************************************************/

/*****************************************************************************************
 * &withCSS= and &withJS= URL parameters
 * Allow to try custom scripts from MediaWiki space 
 * without editing personal .css or .js files
 * Copied from Wikipedia's MediaWiki:Common.js
 */

	var extraCSS = mw.util.getParamValue( "withCSS" );
	if ( extraCSS && extraCSS.match( /^MediaWiki:[^&<>=%]*\.css$/ ) ) {
		importStylesheet( extraCSS );
	}
	var extraJS = mw.util.getParamValue( "withJS" );
	if ( extraJS && extraJS.match( /^MediaWiki:[^&<>=%]*\.js$/) ) {
		importScript( extraJS );
	}

/*****************************************************************************************/

/*****************************************************************************************
 * Internet Explorer bug fix
 * Description: Fixes IE horizontal scrollbar bug
 * Maintainers: [[User:Tom-]]?
 * Copied from Wikipedia's MediaWiki:Common.js
 */

	if ( navigator.appName == "Microsoft Internet Explorer" ) {
		var oldWidth,
			docEl = document.documentElement,
			fixIEScroll = function() {
				if ( !oldWidth || docEl.clientWidth > oldWidth ) {
					doFixIEScroll();
				} else {
					setTimeout( doFixIEScroll, 1 );
				}
				oldWidth = docEl.clientWidth;
			},
			doFixIEScroll = function () {
				docEl.style.overflowX = ( docEl.scrollWidth - docEl.clientWidth < 4 ) ? "hidden" : "";
			};
		document.attachEvent( "onreadystatechange", fixIEScroll );
		document.attachEvent( "onresize", fixIEScroll );
		// In print IE (7?) does not like line-height
		mw.util.addCSS( "@media print { sup, sub, p, .documentDescription { line-height: normal; }}" );
		// IE overflow bug
		mw.util.addCSS( "div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }" );
		// IE zoomfix
		// Use to fix right floating div/table inside tables
		mw.util.addCSS( ".iezoomfix div, .iezoomfix table { zoom: 1;}" );
		// .hlist fix for IE - remove dot after last list item
		if ( $.browser.version < "9.0" ) {
			$( function() {
				$( ".hlist" ).find( "li:last-child" ).css( "background", "none" ).css( "padding-right", "0" );
			} );
		}
	}

/*****************************************************************************************/

/*****************************************************************************************
 * Test if an element has a certain class
 * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
 * @deprecated:  Use $(element).hasClass() instead.
 * Copied from Wikipedia's 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
 * Allows tables to be collapsed, showing only the header. See  [[Wikipedia:NavFrame]].
 * @version 2.0.3 (2014-03-14)
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
 * @author [[User:R. Koot]]
 * @author [[User:Krinkle]]
 * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
 *  is supported in MediaWiki core.
 * Copied from Wikipedia's MediaWiki:Common.js
 */
 
	var autoCollapse = 2,
		collapseCaption = "hide",
		expandCaption = "show";
	function collapseTable( tableIndex ) {
		var Button = document.getElementById( "collapseButton" + tableIndex ),
			Table = document.getElementById( "collapsibleTable" + tableIndex );
		if ( !Table || !Button ) {
			return false;
		}
		var Rows = Table.rows,
			i;
		if ( Button.firstChild.data === collapseCaption ) {
			for ( i = 1; i < Rows.length; i++ ) {
				Rows[i].style.display = "none";
			}
			Button.firstChild.data = expandCaption;
		} else {
			for ( i = 1; i < Rows.length; i++ ) {
				Rows[i].style.display = Rows[0].style.display;
			}
			Button.firstChild.data = collapseCaption;
		}
	}
	function createClickHandler( tableIndex ) {
		return function( e ) {
			e.preventDefault();
			collapseTable( tableIndex );
		};
	}
	function createCollapseButtons() {
		var tableIndex = 0,
			NavigationBoxes = {},
			Tables = document.getElementsByTagName( "table" ),
			i;
		for ( i = 0; i < Tables.length; i++ ) {
			if ( $( Tables[i] ).hasClass( "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" ),
					ButtonLink = document.createElement( "a" ),
					ButtonText = document.createTextNode( collapseCaption );
				// Styles are declared in [[MediaWiki:Common.css]]
				Button.className = "collapseButton";
				ButtonLink.style.color = Header.style.color;
				ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
				ButtonLink.setAttribute( "href", "#" );
				$( ButtonLink ).on( "click", createClickHandler( tableIndex ) );
				ButtonLink.appendChild( ButtonText );
				Button.appendChild( document.createTextNode( "[" ) );
				Button.appendChild( ButtonLink );
				Button.appendChild( document.createTextNode( "]" ) );
				Header.insertBefore( Button, Header.firstChild );
				tableIndex++;
			}
		}
		for ( i = 0;  i < tableIndex; i++ ) {
			if ( $( NavigationBoxes[i] ).hasClass( "collapsed" ) ||
				( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( "autocollapse" ) )
			) {
				collapseTable( i );
			} 
			else if ( $( NavigationBoxes[i] ).hasClass ( "innercollapse" ) ) {
				var element = NavigationBoxes[i];
				while ((element = element.parentNode)) {
					if ( $( element ).hasClass( "outercollapse" ) ) {
						collapseTable ( i );
						break;
					}
				}
			}
		}
	}
	mw.hook( "wikipage.content" ).add( createCollapseButtons );

/*****************************************************************************************/

/*****************************************************************************************
 * Dynamic Navigation Bars (experimental)
 * Description: See [[Wikipedia:NavFrame]].
 * Maintainers: UNMAINTAINED. Updated by BIKI User:Fred Gandt
 * Copied from Wikipedia's MediaWiki:Common.js
 */

	// set up the words in your language
	var NavigationBarHide = "[" + collapseCaption + "]",
		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 ),
			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 ( $( NavChild ).hasClass( "NavContent" ) || $( NavChild ).hasClass( "NavPic" ) ) {
					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 ( $( NavChild ).hasClass( "NavContent" ) || $( NavChild ).hasClass( "NavPic" ) ) {
					NavChild.style.display = "block";
				}
			}
			NavToggle.firstChild.data = NavigationBarHide;
		}
	}
	// adds show/hide-button to navigation bars
	function createNavigationBarToggleButton() {
		var indexNavigationBar = 0,
			divs = document.getElementsByTagName( "div" );
		// iterate over all < div >-elements
		for ( var i = 0; NavFrame = divs[i]; i++ ) {
			// if found a navigation bar
			if ( $( NavFrame ).hasClass( "NavFrame" ) ) {
				indexNavigationBar++;
				var NavToggle = document.createElement( "a" );
				NavToggle.className = "NavToggle";
				NavToggle.setAttribute( "id", "NavToggle" + indexNavigationBar );
				NavToggle.setAttribute( "href", "javascript:toggleNavigationBar(" + indexNavigationBar + ");" );
				var isCollapsed = $( NavFrame ).hasClass( "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 ( $( NavChild ).hasClass( "NavPic" ) || $( NavChild ).hasClass( "NavContent" ) ) {
						if ( NavChild.style.display == "none" ) {
							isCollapsed = true;
						}
					}
				}
				if ( isCollapsed ) {
					for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
						if ( $( NavChild ).hasClass( "NavPic" ) || $( NavChild ).hasClass( "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 ( $( NavFrame.childNodes[j] ).hasClass( "NavHead" ) ) {
						NavToggle.style.color = NavFrame.childNodes[j].style.color;
						NavFrame.childNodes[j].appendChild( NavToggle );
					}
				}
				NavFrame.setAttribute( "id", "NavFrame" + indexNavigationBar );
			}
		}
	}
	mw.hook( "wikipage.content" ).add( createNavigationBarToggleButton );

/*****************************************************************************************/

/*****************************************************************************************
 * Table sorting fixes
 * Description: Disables code in table sorting routine to set classes on even/odd rows
 * Maintainers: [[User:Random832]]
 * Copied from Wikipedia's MediaWiki:Common.js
 */
 
	ts_alternate_row_colors = false;

/*****************************************************************************************/

/*****************************************************************************************
 * uploadwizard_newusers
 * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
 * Maintainers: [[User:Krimpet]]
 * Copied from Wikipedia's MediaWiki:Common.js
 */
 
	function uploadwizard_newusers() {
		if ( wgNamespaceNumber == 4 && wgTitle == "Upload" && wgAction == "view" ) {
			var oldDiv = document.getElementById( "autoconfirmedusers" ),
				newDiv = document.getElementById( "newusers" );
			if ( oldDiv && newDiv ) {
				if ( typeof wgUserGroups == "object" && wgUserGroups ) {
					for ( i = 0; i < wgUserGroups.length; i++ ) {
						if ( wgUserGroups[i] == "autoconfirmed")  {
							oldDiv.style.display = "block";
							newDiv.style.display = "none";
							return;
						}
					}
				}
				oldDiv.style.display = "none";
				newDiv.style.display = "block";
				return;
			}
		}
	}
	mw.hook( "wikipage.content" ).add( uploadwizard_newusers );

/*****************************************************************************************/

/*****************************************************************************************
 * Conditionally import further JavaScript for specific situations.
 */

	function conditionallyImport() {
		if ( mw.config.get( "wgAction" ) === "edit" || mw.config.get( "wgAction" ) === "submit" ) {
			importScript( "MediaWiki:Editing.js" );
		}
		if ( mw.config.get( "wgArticleId" ) === 0 ) {
			importScript( "MediaWiki:Creation.js" );
		}
	}
	mw.hook( "wikipage.content" ).add( conditionallyImport );

/*****************************************************************************************/

/*****************************************************************************************
 * Function that "fixes" redlink categories in command and function pages
 * Maintainer: BIKI User:Fred Gandt
 */

	function directRedlinkedCategories() {
		var cd = document.getElementsByClassName( "command_description" )[0];
		if ( cd ) {
			if ( cd.firstChild.getAttribute( "class" ) == "gvi" ) {
				var cl = document.getElementById( "catlinks" ).getElementsByTagName( "a" );
				for ( var l in cl ) {
					if ( typeof cl[l] == "object" ) {
						if ( cl[l].getAttribute("class") == "new" ) {
							cl[l].setAttribute( "href", cl[l].getAttribute( "href" ).replace( "&action=edit&redlink=1", "" ) );
							cl[l].removeAttribute( "class" );
						}
					}
				}
			}
		}
	}
	mw.hook( "wikipage.content" ).add( directRedlinkedCategories );
 
/*****************************************************************************************/
 
/*****************************************************************************************
 * Next ***
 */
 
	// code code code
 
/*****************************************************************************************/

/*****************************************************************************************/

} ); /* END mw.loader WRAPPER */