MediaWiki:Common.js

From Outreach Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */
importScript('MediaWiki:CollapsibleTemplates.js'); //Enable collapsible sections


/**
 * Check if an element has a certain class.
 * @deprecated: Use jQuery hasClass() instead.
 *
 * @param elem {Element}
 * @param className {String}
 * @return {Boolean}
 */

function hasClass(elem, className) {
	return $(elem).hasClass(className);
}


jQuery(function ($) {
	if (!(document.getElementById('signupuserpagefillmagic'))) {
		return;
	}
	/*
	 * Puts an userpage edit-box inside a div with the ID 'signupuserpagefillmagic'
	 * Created for [[:outreach:Account Creation Improvement Project]] by
	 * [[:sv:User:Sertion]] on the behalf of [[:outreach:User:Hannibal]]
	 * 
	 * Below are variables for internationalization. Please use \n for linebreaks
	 * and escape all single quotation marks (') with \'
	 */
	var preComment = '<!-- BELOW IS THE TEXT ABOUT YOU. YOU CAN CHANGE IT COMPLETELY OR IN PARTS AND THEN COME BACK TO IT. AFTER YOU ARE DONE, SCROLL DOWN A BIT FURTHER AND CLICK "SAVE PAGE".--\>{' + '{New user bar}}\n',
		postComment = '\n\n<!-- NOW, CLICK THE "SAVE PAGE" BUTTON. CONGRATULATIONS, YOU\'VE JUST MADE YOUR FIRST EDIT TO WIKIPEDIA. --\>',
		preSubmitButton = 'Do not forget to click SAVE PAGE when you get to the next page!',
		submitText = 'Create my user page for me now!',
		SUPeditSummary = 'New user page thru [[:outreach:Account Creation Improvement Project|Outreach:ACIP]]',
		preFilltemplate = 'Replace this example text below with information about you: \n\nHello, my name is Rosie Underhill. I am a veterinarian from Utah, USA, but I was born just outside London, UK, around forty years ago. My background is in biology, with a main interest in snakes.\n\nI speak English and French. In my off-time, I listen to a lot of music, and I have discovered that Wikipedia is a very good source for information in that department. Hopefully I can help make it even better.';

	/*
	 * The actual magic:
	 * Inserts a form with a single visible field that simulates the normal
	 * edit-field. It uses the variables from above to set a text example (pre
	 * filled), an automated edit summary and the label of the submit button.
	 * 'fakewpTextbox1' is used to hide the assembling of the final output that
	 * is made below.
	 */
	$('#signupuserpagefillmagic').html('<form action="' + mw.config.get('wgScript') + '?title=' + mw.config.get('wgFormattedNamespaces')[2] + ':' + mw.config.get('wgUserName') + '&action=submit" method="post"><textarea id="fakewpTextbox1" style="width: 46em; height: 20em;">' + preFilltemplate + '</textarea><textarea name="wpTextbox1" id="wpTextbox1" style="border:0;padding:0;display:inline;height:0;width:0;resize:none;margin:0;opacity:0"></textarea><input type="hidden" name="wpSummary" id="wpSummary" value="' + SUPeditSummary + '" /><br/>' + preSubmitButton + '<br/><input type="submit" value="' + submitText + '"/></form>');

	// Waits for the form to be submitted.
	$('#signupuserpagefillmagic form').live('submit', function (e) {
		// Stops the form from submitting
		e.preventDefault();

		/*
		 * Uses the previously defined variables preComment and postComment
		 * to assemble the final output in the hidden textarea.
		 */

		$('#wpTextbox1').text(preComment + jQuery('#fakewpTextbox1').text() + postComment);
		/*
		 * Submits the form.
		 * For unknown reasons jQuery('#signupuserpagefillmagic form').submit() crashes
		 * Firefox (only tested in version 4.0). This method seam to work cross browser.
		 */
		document.getElementById('signupuserpagefillmagic').getElementsByTagName('form')[0].submit();
	});
});

/** 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", "#");
			addHandler(ButtonLink, "click", new Function("evt", "collapseTable(" + tableIndex + " ); return false;"));
			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;
				}
			}
		}
	}
}

$(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, 'NavContent') || hasClass(NavChild, '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 (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
				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")) {
					NavToggle.style.color = NavFrame.childNodes[j].style.color;
					NavFrame.childNodes[j].appendChild(NavToggle);
				}
			}
			NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
		}
	}
}

$(createNavigationBarToggleButton);