|
|
(80 intermediate revisions by 4 users not shown) |
Line 1: |
Line 1: |
| /* Any JavaScript here will be loaded for all users on every page load. */ | | /* Any JavaScript here will be loaded for all users on desktop */ |
|
| |
|
| /* Automatically add Aboutfile template to file upload description. Source: nl.wikipedia.org/wiki/MediaWiki:Common.js */ | | /* Alternating wiki logo */ |
| if (mw.config.get('wgCanonicalSpecialPageName') === 'Upload' && !document.getElementById('wpForReUpload') && !document.getElementsByClassName('warning')[0] && !document.getElementsByClassName('error')[0]) {
| | $(function() { |
| function loadAutoAboutfileTemplate() { | | var logos = ['b/bc/Wiki.png', 'd/d7/Wiki_2.png', '9/97/Wiki_3.png', '6/6a/Wiki_4.png', '7/79/Wiki_5.png']; |
| uploadDescription = document.getElementById('wpUploadDescription');
| | $('#p-logo a').css('background-image', 'url(https://kh.wiki.gallery/images/' + logos[Math.floor(Math.random() * logos.length)] + ')'); |
| var doubleBracket = '{' + '{';
| | }); |
| uploadDescription.value = doubleBracket + 'aboutfile\n|description=\n|purpose=\n|game=\n|source=\n}}';
| |
| }
| |
| | |
| addOnloadHook(loadAutoAboutfileTemplate);
| |
| }
| |
|
| |
|
| /* Shrinking talk bubble sprites */ | | /* Add user subpages toolbox link */ |
| $(document).ready(function () { | | $(function() { |
| if (document.readyState != "complete") { | | if (mw.config.get('wgCanonicalNamespace') === 'User' && mw.config.get('skin') !== 'timeless') { |
| setTimeout(arguments.callee, 100); | | var subpagesLink = '/Special:PrefixIndex/User:' + mw.config.get('wgTitle').split('/')[0] + '/'; |
| return; | | mw.util.addPortletLink('p-tb', subpagesLink, 'User subpages', 't-subpages', 'Subpages for this user'); |
| } | | } |
| $("table.talkbubble").each(function () {
| |
| $(this).find("td").first().width(90).css("text-align", "center").find("img").each(function () {
| |
| if ($(this).width() > 90) $(this).css("height", "auto").width(90);
| |
| });
| |
| });
| |
| }); | | }); |
|
| |
|
| // =========== | | /* Hide page previews when portals are used */ |
| // Code for alternating wiki logo
| | $(function() { |
| // Author: Porplemontage
| | if (document.getElementsByClassName('nav')[0] && document.getElementsByClassName('dropdown')[0]) |
| // =============
| | $('head').append('<style type="text/css">.mwe-popups { display: none !important; }</style>'); |
| | |
| var logos = ['/images/b/bc/Wiki.png', '/images/9/97/Wiki_3.png', '/images/d/d7/Wiki_2.png'];
| |
| $('#p-logo a').css('background-image', 'url(' + logos[Math.floor(Math.random() * logos.length)] + ')');
| |
| | |
| // ==================
| |
| // Code for Template:Suite3
| |
| // Author: Soxra
| |
| // ==================
| |
| | |
| $(document).ready(function () {
| |
| $(".morphMaster").each(function () {
| |
| var $master = $(this);
| |
| var $tabs = $master.find(".morphTabBox");
| |
| var $container = $master.find(".morphTabContainer");
| |
| | |
| $tabs.find(".morphLink").click(function () {
| |
| var id = $(this).attr("id");
| |
| id = id.substr(0, id.length - 4);
| |
| $container.find(".morphContent").hide();
| |
| $container.find("#" + id + "Content").show();
| |
| });
| |
| });
| |
| });
| |
| | |
| // ============================================================
| |
| // BEGIN Dynamic Navigation Bars (experimantal)
| |
| // This script is from Wikipedia. For author attribution, please see http://en.wikipedia.org/w/index.php?title=MediaWiki:Common.js&action=history
| |
| | |
| /* Test if an element has a certain class **************************************
| |
| *
| |
| * Description: Uses regular expressions and caching for better performance.
| |
| * Maintainers: User:Mike Dillon, User:R. Koot, 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.getElementsByTagName("tr");
| |
| | |
| 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")) {
| |
| 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.setAttribute("id", "collapseButton" + tableIndex);
| |
| ButtonLink.setAttribute("href", "javascript:collapseTable(" + tableIndex + ");");
| |
| ButtonLink.appendChild(ButtonText);
| |
| | |
| Button.appendChild(document.createTextNode("["));
| |
| Button.appendChild(ButtonLink);
| |
| Button.appendChild(document.createTextNode("]"));
| |
| | |
| var Header = Tables[i].getElementsByTagName("tr")[0].getElementsByTagName("th")[0];
| |
| /* only add button and increment count if there is a header row to work with */
| |
| if (Header) {
| |
| 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);
| |
| | |
| /** Dynamic Navigation Bars (experimental) *************************************
| |
| *
| |
| * Description: See [[Wikipedia:NavFrame]].
| |
| * Maintainers: UNMAINTAINED
| |
| */
| |
| | |
| // set up the words in your language
| |
| var NavigationBarHide = '[' + collapseCaption + ']';
| |
| var NavigationBarShow = '[' + expandCaption + ']';
| |
| | |
| // set up max count of Navigation Bars on page,
| |
| // if there are more, all will be hidden
| |
| // NavigationBarShowDefault = 0; // all bars will be hidden
| |
| // NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden
| |
| var NavigationBarShowDefault = autoCollapse;
| |
| | |
| // 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 NavToggleText = document.createTextNode(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);
| |
| }
| |
| }
| |
| // if more Navigation Bars found than Default: hide all
| |
| if (NavigationBarShowDefault < indexNavigationBar) {
| |
| for (
| |
| var i = 1;
| |
| i <= indexNavigationBar;
| |
| i++) {
| |
| toggleNavigationBar(i);
| |
| }
| |
| }
| |
| | |
| }
| |
| addOnloadHook(createNavigationBarToggleButton);
| |
| | |
| // Code courtesy of pcj of WoWWiki.
| |
| // This is a modified version of the WoWWiki site version.
| |
| | |
| // Code adds a checkbox at the top of the Special:RecentChanges list, next to the header.
| |
| // Ticking it sets a cookie (should be individual to wikis) and starts updating the RC list.
| |
| // This occurs silently every 30 seconds without a full page reload occuring.
| |
| | |
| function setCookie(c_name, value, expiredays) {
| |
| var exdate = new Date();
| |
| exdate.setDate(exdate.getDate() + expiredays);
| |
| document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
| |
| }
| |
| | |
| function getCookie(c_name) {
| |
| if (document.cookie.length > 0) {
| |
| c_start = document.cookie.indexOf(c_name + "=");
| |
| if (c_start != -1) {
| |
| c_start = c_start + c_name.length + 1;
| |
| c_end = document.cookie.indexOf(";", c_start);
| |
| if (c_end == -1) c_end = document.cookie.length;
| |
| return unescape(document.cookie.substring(c_start, c_end));
| |
| }
| |
| }
| |
| return "";
| |
| }
| |
| | |
| var ajaxPages = new Array("Special:RecentChanges");
| |
| var ajaxRCOverride = false;
| |
| var rcRefresh = 30000;
| |
| | |
| function ajaxRC() {
| |
| appTo = $(".firstHeading");
| |
| appTo.append(' <span style="position:absolute; margin-left:10px;"><span style="font-size: xx-small; cursor:help;" title="Automatically refresh the current page every ' + Math.floor(rcRefresh / 1000) + ' seconds">AUTO-REFRESH:</span><input type="checkbox" id="autoRefreshToggle"><span style="position:relative; top:5px; left:5px;" id="autoRefreshProgress"><img src="/images/loader.gif" border="0" alt="AJAX operation in progress" /></span></span>');
| |
| $("#autoRefreshToggle").click(function () {
| |
| setCookie("ajaxRC", $("#autoRefreshToggle").is(":checked") ? "on" : "off")
| |
| loadRCData()
| |
| });
| |
| $("#autoRefreshProgress").hide();
| |
| if (getCookie("ajaxRC") == "on" || ajaxRCOverride) {
| |
| $("#autoRefreshToggle").attr("checked", "checked");
| |
| setTimeout("loadRCData();", rcRefresh);
| |
| }
| |
| }
| |
| | |
| function loadRCData() {
| |
| if (!$("#autoRefreshToggle").is(":checked")) return;
| |
| $('#autoRefreshProgress').show()
| |
| $(article).load(location.href + " " + article + " > *", function (data) {
| |
| $(article + " .mw-collapsible").makeCollapsible();
| |
| $('#autoRefreshProgress').hide()
| |
| if ($("#autoRefreshToggle").is(":checked")) setTimeout("loadRCData();", rcRefresh);
| |
| });
| |
| }
| |
| | |
| $(function () {
| |
| article = "#bodyContent";
| |
| for (x in ajaxPages) {
| |
| if (wgPageName == ajaxPages[x] && $("#autoRefreshToggle").length == 0) ajaxRC();
| |
| }
| |
| }); | | }); |
|
| |
| /*==================================================
| |
| $Id: tabber.js,v 1.9 2006/04/27 20:51:51 pat Exp $
| |
| tabber.js by Patrick Fitzgerald pat@barelyfitz.com
| |
|
| |
| Documentation can be found at the following URL:
| |
| http://www.barelyfitz.com/projects/tabber/
| |
|
| |
| License (http://www.opensource.org/licenses/mit-license.php)
| |
|
| |
| Copyright (c) 2006 Patrick Fitzgerald
| |
|
| |
| Permission is hereby granted, free of charge, to any person
| |
| obtaining a copy of this software and associated documentation files
| |
| (the "Software"), to deal in the Software without restriction,
| |
| including without limitation the rights to use, copy, modify, merge,
| |
| publish, distribute, sublicense, and/or sell copies of the Software,
| |
| and to permit persons to whom the Software is furnished to do so,
| |
| subject to the following conditions:
| |
|
| |
| The above copyright notice and this permission notice shall be
| |
| included in all copies or substantial portions of the Software.
| |
|
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
| |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
| |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
| |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
| |
| BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
| |
| ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
| |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
| |
| SOFTWARE.
| |
| ==================================================*/
| |
|
| |
| function tabberObj(argsObj)
| |
| {
| |
| var arg; /* name of an argument to override */
| |
|
| |
| /* Element for the main tabber div. If you supply this in argsObj,
| |
| then the init() method will be called.
| |
| */
| |
| this.div = null;
| |
|
| |
| /* Class of the main tabber div */
| |
| this.classMain = "tabber";
| |
|
| |
| /* Rename classMain to classMainLive after tabifying
| |
| (so a different style can be applied)
| |
| */
| |
| this.classMainLive = "tabberlive";
| |
|
| |
| /* Class of each DIV that contains a tab */
| |
| this.classTab = "tabbertab";
| |
|
| |
| /* Class to indicate which tab should be active on startup */
| |
| this.classTabDefault = "tabbertabdefault";
| |
|
| |
| /* Class for the navigation UL */
| |
| this.classNav = "tabbernav";
| |
|
| |
| /* When a tab is to be hidden, instead of setting display='none', we
| |
| set the class of the div to classTabHide. In your screen
| |
| stylesheet you should set classTabHide to display:none. In your
| |
| print stylesheet you should set display:block to ensure that all
| |
| the information is printed.
| |
| */
| |
| this.classTabHide = "tabbertabhide";
| |
|
| |
| /* Class to set the navigation LI when the tab is active, so you can
| |
| use a different style on the active tab.
| |
| */
| |
| this.classNavActive = "tabberactive";
| |
|
| |
| /* Elements that might contain the title for the tab, only used if a
| |
| title is not specified in the TITLE attribute of DIV classTab.
| |
| */
| |
| this.titleElements = ['h2','h3','h4','h5','h6'];
| |
|
| |
| /* Should we strip out the HTML from the innerHTML of the title elements?
| |
| This should usually be true.
| |
| */
| |
| this.titleElementsStripHTML = true;
| |
|
| |
| /* If the user specified the tab names using a TITLE attribute on
| |
| the DIV, then the browser will display a tooltip whenever the
| |
| mouse is over the DIV. To prevent this tooltip, we can remove the
| |
| TITLE attribute after getting the tab name.
| |
| */
| |
| this.removeTitle = true;
| |
|
| |
| /* If you want to add an id to each link set this to true */
| |
| this.addLinkId = false;
| |
|
| |
| /* If addIds==true, then you can set a format for the ids.
| |
| <tabberid> will be replaced with the id of the main tabber div.
| |
| <tabnumberzero> will be replaced with the tab number
| |
| (tab numbers starting at zero)
| |
| <tabnumberone> will be replaced with the tab number
| |
| (tab numbers starting at one)
| |
| <tabtitle> will be replaced by the tab title
| |
| (with all non-alphanumeric characters removed)
| |
| */
| |
| this.linkIdFormat = '<tabberid>nav<tabnumberone>';
| |
|
| |
| /* You can override the defaults listed above by passing in an object:
| |
| var mytab = new tabber({property:value,property:value});
| |
| */
| |
| for (arg in argsObj) { this[arg] = argsObj[arg]; }
| |
|
| |
| /* Create regular expressions for the class names; Note: if you
| |
| change the class names after a new object is created you must
| |
| also change these regular expressions.
| |
| */
| |
| this.REclassMain = new RegExp('\\b' + this.classMain + '\\b', 'gi');
| |
| this.REclassMainLive = new RegExp('\\b' + this.classMainLive + '\\b', 'gi');
| |
| this.REclassTab = new RegExp('\\b' + this.classTab + '\\b', 'gi');
| |
| this.REclassTabDefault = new RegExp('\\b' + this.classTabDefault + '\\b', 'gi');
| |
| this.REclassTabHide = new RegExp('\\b' + this.classTabHide + '\\b', 'gi');
| |
|
| |
| /* Array of objects holding info about each tab */
| |
| this.tabs = new Array();
| |
|
| |
| /* If the main tabber div was specified, call init() now */
| |
| if (this.div) {
| |
|
| |
| this.init(this.div);
| |
|
| |
| /* We don't need the main div anymore, and to prevent a memory leak
| |
| in IE, we must remove the circular reference between the div
| |
| and the tabber object. */
| |
| this.div = null;
| |
| }
| |
| }
| |
|
| |
|
| |
| /*--------------------------------------------------
| |
| Methods for tabberObj
| |
| --------------------------------------------------*/
| |
|
| |
|
| |
| tabberObj.prototype.init = function(e)
| |
| {
| |
| /* Set up the tabber interface.
| |
|
| |
| e = element (the main containing div)
| |
|
| |
| Example:
| |
| init(document.getElementById('mytabberdiv'))
| |
| */
| |
|
| |
| var
| |
| childNodes, /* child nodes of the tabber div */
| |
| i, i2, /* loop indices */
| |
| t, /* object to store info about a single tab */
| |
| defaultTab=0, /* which tab to select by default */
| |
| DOM_ul, /* tabbernav list */
| |
| DOM_li, /* tabbernav list item */
| |
| DOM_a, /* tabbernav link */
| |
| aId, /* A unique id for DOM_a */
| |
| headingElement; /* searching for text to use in the tab */
| |
|
| |
| /* Verify that the browser supports DOM scripting */
| |
| if (!document.getElementsByTagName) { return false; }
| |
|
| |
| /* If the main DIV has an ID then save it. */
| |
| if (e.id) {
| |
| this.id = e.id;
| |
| }
| |
|
| |
| /* Clear the tabs array (but it should normally be empty) */
| |
| this.tabs.length = 0;
| |
|
| |
| /* Loop through an array of all the child nodes within our tabber element. */
| |
| childNodes = e.childNodes;
| |
| for(i=0; i < childNodes.length; i++) {
| |
|
| |
| /* Find the nodes where class="tabbertab" */
| |
| if(childNodes[i].className &&
| |
| childNodes[i].className.match(this.REclassTab)) {
| |
|
| |
| /* Create a new object to save info about this tab */
| |
| t = new Object();
| |
|
| |
| /* Save a pointer to the div for this tab */
| |
| t.div = childNodes[i];
| |
|
| |
| /* Add the new object to the array of tabs */
| |
| this.tabs[this.tabs.length] = t;
| |
|
| |
| /* If the class name contains classTabDefault,
| |
| then select this tab by default.
| |
| */
| |
| if (childNodes[i].className.match(this.REclassTabDefault)) {
| |
| defaultTab = this.tabs.length-1;
| |
| }
| |
| }
| |
| }
| |
|
| |
| /* Create a new UL list to hold the tab headings */
| |
| DOM_ul = document.createElement("ul");
| |
| DOM_ul.className = this.classNav;
| |
|
| |
| /* Loop through each tab we found */
| |
| for (i=0; i < this.tabs.length; i++) {
| |
|
| |
| t = this.tabs[i];
| |
|
| |
| /* Get the label to use for this tab:
| |
| From the title attribute on the DIV,
| |
| Or from one of the this.titleElements[] elements,
| |
| Or use an automatically generated number.
| |
| */
| |
| t.headingText = t.div.title;
| |
|
| |
| /* Remove the title attribute to prevent a tooltip from appearing */
| |
| if (this.removeTitle) { t.div.title = ''; }
| |
|
| |
| if (!t.headingText) {
| |
|
| |
| /* Title was not defined in the title of the DIV,
| |
| So try to get the title from an element within the DIV.
| |
| Go through the list of elements in this.titleElements
| |
| (typically heading elements ['h2','h3','h4'])
| |
| */
| |
| for (i2=0; i2<this.titleElements.length; i2++) {
| |
| headingElement = t.div.getElementsByTagName(this.titleElements[i2])[0];
| |
| if (headingElement) {
| |
| t.headingText = headingElement.innerHTML;
| |
| if (this.titleElementsStripHTML) {
| |
| t.headingText.replace(/<br>/gi," ");
| |
| t.headingText = t.headingText.replace(/<[^>]+>/g,"");
| |
| }
| |
| break;
| |
| }
| |
| }
| |
| }
| |
|
| |
| if (!t.headingText) {
| |
| /* Title was not found (or is blank) so automatically generate a
| |
| number for the tab.
| |
| */
| |
| t.headingText = i + 1;
| |
| }
| |
|
| |
| /* Create a list element for the tab */
| |
| DOM_li = document.createElement("li");
| |
|
| |
| /* Save a reference to this list item so we can later change it to
| |
| the "active" class */
| |
| t.li = DOM_li;
| |
|
| |
| /* Create a link to activate the tab */
| |
| DOM_a = document.createElement("a");
| |
| DOM_a.appendChild(document.createTextNode(t.headingText));
| |
| DOM_a.href = "javascript:void(null);";
| |
| DOM_a.title = t.headingText;
| |
| DOM_a.onclick = this.navClick;
| |
|
| |
| /* Add some properties to the link so we can identify which tab
| |
| was clicked. Later the navClick method will need this.
| |
| */
| |
| DOM_a.tabber = this;
| |
| DOM_a.tabberIndex = i;
| |
|
| |
| /* Do we need to add an id to DOM_a? */
| |
| if (this.addLinkId && this.linkIdFormat) {
| |
|
| |
| /* Determine the id name */
| |
| aId = this.linkIdFormat;
| |
| aId = aId.replace(/<tabberid>/gi, this.id);
| |
| aId = aId.replace(/<tabnumberzero>/gi, i);
| |
| aId = aId.replace(/<tabnumberone>/gi, i+1);
| |
| aId = aId.replace(/<tabtitle>/gi, t.headingText.replace(/[^a-zA-Z0-9\-]/gi, ''));
| |
|
| |
| DOM_a.id = aId;
| |
| }
| |
|
| |
| /* Add the link to the list element */
| |
| DOM_li.appendChild(DOM_a);
| |
|
| |
| /* Add the list element to the list */
| |
| DOM_ul.appendChild(DOM_li);
| |
| }
| |
|
| |
| /* Add the UL list to the beginning of the tabber div */
| |
| e.insertBefore(DOM_ul, e.firstChild);
| |
|
| |
| /* Make the tabber div "live" so different CSS can be applied */
| |
| e.className = e.className.replace(this.REclassMain, this.classMainLive);
| |
|
| |
| /* Activate the default tab, and do not call the onclick handler */
| |
| this.tabShow(defaultTab);
| |
|
| |
| /* If the user specified an onLoad function, call it now. */
| |
| if (typeof this.onLoad == 'function') {
| |
| this.onLoad({tabber:this});
| |
| }
| |
|
| |
| return this;
| |
| };
| |
|
| |
|
| |
| tabberObj.prototype.navClick = function(event)
| |
| {
| |
| /* This method should only be called by the onClick event of an <A>
| |
| element, in which case we will determine which tab was clicked by
| |
| examining a property that we previously attached to the <A>
| |
| element.
| |
|
| |
| Since this was triggered from an onClick event, the variable
| |
| "this" refers to the <A> element that triggered the onClick
| |
| event (and not to the tabberObj).
| |
|
| |
| When tabberObj was initialized, we added some extra properties
| |
| to the <A> element, for the purpose of retrieving them now. Get
| |
| the tabberObj object, plus the tab number that was clicked.
| |
| */
| |
|
| |
| var
| |
| rVal, /* Return value from the user onclick function */
| |
| a, /* element that triggered the onclick event */
| |
| self, /* the tabber object */
| |
| tabberIndex, /* index of the tab that triggered the event */
| |
| onClickArgs; /* args to send the onclick function */
| |
|
| |
| a = this;
| |
| if (!a.tabber) { return false; }
| |
|
| |
| self = a.tabber;
| |
| tabberIndex = a.tabberIndex;
| |
|
| |
| /* Remove focus from the link because it looks ugly.
| |
| I don't know if this is a good idea...
| |
| */
| |
| a.blur();
| |
|
| |
| /* If the user specified an onClick function, call it now.
| |
| If the function returns false then do not continue.
| |
| */
| |
| if (typeof self.onClick == 'function') {
| |
|
| |
| onClickArgs = {'tabber':self, 'index':tabberIndex, 'event':event};
| |
|
| |
| /* IE uses a different way to access the event object */
| |
| if (!event) { onClickArgs.event = window.event; }
| |
|
| |
| rVal = self.onClick(onClickArgs);
| |
| if (rVal === false) { return false; }
| |
| }
| |
|
| |
| self.tabShow(tabberIndex);
| |
|
| |
| return false;
| |
| };
| |
|
| |
|
| |
| tabberObj.prototype.tabHideAll = function()
| |
| {
| |
| var i; /* counter */
| |
|
| |
| /* Hide all tabs and make all navigation links inactive */
| |
| for (i = 0; i < this.tabs.length; i++) {
| |
| this.tabHide(i);
| |
| }
| |
| };
| |
|
| |
|
| |
| tabberObj.prototype.tabHide = function(tabberIndex)
| |
| {
| |
| var div;
| |
|
| |
| if (!this.tabs[tabberIndex]) { return false; }
| |
|
| |
| /* Hide a single tab and make its navigation link inactive */
| |
| div = this.tabs[tabberIndex].div;
| |
|
| |
| /* Hide the tab contents by adding classTabHide to the div */
| |
| if (!div.className.match(this.REclassTabHide)) {
| |
| div.className += ' ' + this.classTabHide;
| |
| }
| |
| this.navClearActive(tabberIndex);
| |
|
| |
| return this;
| |
| };
| |
|
| |
|
| |
| tabberObj.prototype.tabShow = function(tabberIndex)
| |
| {
| |
| /* Show the tabberIndex tab and hide all the other tabs */
| |
|
| |
| var div;
| |
|
| |
| if (!this.tabs[tabberIndex]) { return false; }
| |
|
| |
| /* Hide all the tabs first */
| |
| this.tabHideAll();
| |
|
| |
| /* Get the div that holds this tab */
| |
| div = this.tabs[tabberIndex].div;
| |
|
| |
| /* Remove classTabHide from the div */
| |
| div.className = div.className.replace(this.REclassTabHide, '');
| |
|
| |
| /* Mark this tab navigation link as "active" */
| |
| this.navSetActive(tabberIndex);
| |
|
| |
| /* If the user specified an onTabDisplay function, call it now. */
| |
| if (typeof this.onTabDisplay == 'function') {
| |
| this.onTabDisplay({'tabber':this, 'index':tabberIndex});
| |
| }
| |
|
| |
| return this;
| |
| };
| |
|
| |
| tabberObj.prototype.navSetActive = function(tabberIndex)
| |
| {
| |
| /* Note: this method does *not* enforce the rule
| |
| that only one nav item can be active at a time.
| |
| */
| |
|
| |
| /* Set classNavActive for the navigation list item */
| |
| this.tabs[tabberIndex].li.className = this.classNavActive;
| |
|
| |
| return this;
| |
| };
| |
|
| |
|
| |
| tabberObj.prototype.navClearActive = function(tabberIndex)
| |
| {
| |
| /* Note: this method does *not* enforce the rule
| |
| that one nav should always be active.
| |
| */
| |
|
| |
| /* Remove classNavActive from the navigation list item */
| |
| this.tabs[tabberIndex].li.className = '';
| |
|
| |
| return this;
| |
| };
| |
|
| |
|
| |
| /*==================================================*/
| |
|
| |
|
| |
| function tabberAutomatic(tabberArgs)
| |
| {
| |
| /* This function finds all DIV elements in the document where
| |
| class=tabber.classMain, then converts them to use the tabber
| |
| interface.
| |
|
| |
| tabberArgs = an object to send to "new tabber()"
| |
| */
| |
| var
| |
| tempObj, /* Temporary tabber object */
| |
| divs, /* Array of all divs on the page */
| |
| i; /* Loop index */
| |
|
| |
| if (!tabberArgs) { tabberArgs = {}; }
| |
|
| |
| /* Create a tabber object so we can get the value of classMain */
| |
| tempObj = new tabberObj(tabberArgs);
| |
|
| |
| /* Find all DIV elements in the document that have class=tabber */
| |
|
| |
| /* First get an array of all DIV elements and loop through them */
| |
| divs = document.getElementsByTagName("div");
| |
| for (i=0; i < divs.length; i++) {
| |
|
| |
| /* Is this DIV the correct class? */
| |
| if (divs[i].className &&
| |
| divs[i].className.match(tempObj.REclassMain)) {
| |
|
| |
| /* Now tabify the DIV */
| |
| tabberArgs.div = divs[i];
| |
| divs[i].tabber = new tabberObj(tabberArgs);
| |
| }
| |
| }
| |
|
| |
| return this;
| |
| }
| |
|
| |
|
| |
| /*==================================================*/
| |
|
| |
|
| |
| function tabberAutomaticOnLoad(tabberArgs)
| |
| {
| |
| /* This function adds tabberAutomatic to the window.onload event,
| |
| so it will run after the document has finished loading.
| |
| */
| |
| var oldOnLoad;
| |
|
| |
| if (!tabberArgs) { tabberArgs = {}; }
| |
|
| |
| /* Taken from: http://simon.incutio.com/archive/2004/05/26/addLoadEvent */
| |
|
| |
| oldOnLoad = window.onload;
| |
| if (typeof window.onload != 'function') {
| |
| window.onload = function() {
| |
| tabberAutomatic(tabberArgs);
| |
| };
| |
| } else {
| |
| window.onload = function() {
| |
| oldOnLoad();
| |
| tabberAutomatic(tabberArgs);
| |
| };
| |
| }
| |
| }
| |
|
| |
|
| |
| /*==================================================*/
| |
|
| |
|
| |
| /* Run tabberAutomaticOnload() unless the "manualStartup" option was specified */
| |
|
| |
| if (typeof tabberOptions == 'undefined') {
| |
|
| |
| tabberAutomaticOnLoad();
| |
|
| |
| } else {
| |
|
| |
| if (!tabberOptions['manualStartup']) {
| |
| tabberAutomaticOnLoad(tabberOptions);
| |
| }
| |
|
| |
| }
| |
|
| |
| /**
| |
| * Countdown
| |
| *
| |
| * Version: 2.0
| |
| *
| |
| * Rewrite by Pecoes
| |
| * Original script by Splarka + Eladkse
| |
| *
| |
| * documentation and examples at:
| |
| * http://dev.wikia.com/wiki/Countdown
| |
| * (some things like languages options removed)
| |
| */
| |
|
| |
| ;(function (module, mw, $) {
| |
|
| |
| 'use strict';
| |
|
| |
| var translations = $.extend(true, {
| |
| en: {
| |
| and: 'and',
| |
| second: 'second',
| |
| seconds: 'seconds',
| |
| minute: 'minute',
| |
| minutes: 'minutes',
| |
| hour: 'hour',
| |
| hours: 'hours',
| |
| day: 'day',
| |
| days: 'days'
| |
| }
| |
| }, module.translations || {}),
| |
| i18n = translations[
| |
| mw.config.get('wgContentLanguage')
| |
| ] || translations.en;
| |
|
| |
| var countdowns = [];
| |
|
| |
| var NO_LEADING_ZEROS = 1;
| |
|
| |
| function output (i, diff) {
| |
| /*jshint bitwise:false*/
| |
| var delta, result, parts = [];
| |
| delta = diff % 60;
| |
| parts.unshift(delta + ' ' + i18n[delta === 1 ? 'second' : 'seconds']);
| |
| diff = Math.floor(diff / 60);
| |
| delta = diff % 60;
| |
| parts.unshift(delta + ' ' + i18n[delta === 1 ? 'minute' : 'minutes']);
| |
| diff = Math.floor(diff / 60);
| |
| delta = diff % 24;
| |
| parts.unshift(delta + ' ' + i18n[delta === 1 ? 'hour' : 'hours' ]);
| |
| diff = Math.floor(diff / 24);
| |
| parts.unshift(diff + ' ' + i18n[diff === 1 ? 'day' : 'days' ]);
| |
| result = parts.pop();
| |
| if (countdowns[i].opts & NO_LEADING_ZEROS) {
| |
| while (parts.length && parts[0][0] === '0') {
| |
| parts.shift();
| |
| }
| |
| }
| |
| if (parts.length) {
| |
| result = parts.join(', ') + ' ' + i18n.and + ' ' + result;
| |
| }
| |
| countdowns[i].node.text(result);
| |
| }
| |
|
| |
| function end(i) {
| |
| var c = countdowns[i].node.parent();
| |
| switch (c.attr('data-end')) {
| |
| case 'remove':
| |
| c.remove();
| |
| countdowns.splice(i, 1);
| |
| return;
| |
| case 'stop':
| |
| output(i, 0);
| |
| countdowns.splice(i, 1);
| |
| return;
| |
| case 'toggle':
| |
| var toggle = c.attr('data-toggle');
| |
| if (toggle && $(toggle).length) {
| |
| $(toggle).css('display', 'inline');
| |
| c.css('display', 'none');
| |
| countdowns.splice(i, 1);
| |
| return;
| |
| }
| |
| break;
| |
| case 'callback':
| |
| var callback = c.attr('data-callback');
| |
| if (callback && $.isFunction(module[callback])) {
| |
| output(i, 0);
| |
| countdowns.splice(i, 1);
| |
| module[callback].call(c);
| |
| return;
| |
| }
| |
| break;
| |
| }
| |
| countdowns[i].countup = true;
| |
| output(i, 0);
| |
| }
| |
|
| |
| function update () {
| |
| var now = Date.now();
| |
| $.each(countdowns.slice(0), function (i, countdown) {
| |
| var diff = Math.floor((countdown.date - now) / 1000);
| |
| if (diff <= 0 && !countdown.countup) {
| |
| end(i);
| |
| } else {
| |
| output(i, Math.abs(diff));
| |
| }
| |
| });
| |
| if (countdowns.length) {
| |
| window.setTimeout(function () {
| |
| update();
| |
| }, 1000);
| |
| }
| |
| }
| |
|
| |
| function getOptions (node) {
| |
| /*jshint bitwise:false*/
| |
| var text = node.parent().attr('data-options'),
| |
| opts = 0;
| |
| if (text) {
| |
| if (/no-leading-zeros/.test(text)) {
| |
| opts |= NO_LEADING_ZEROS;
| |
| }
| |
| }
| |
| return opts;
| |
| }
| |
|
| |
| $(function () {
| |
| var countdown = $('.countdown');
| |
| if (!countdown.length) return;
| |
| $('.nocountdown').css('display', 'none');
| |
| countdown
| |
| .css('display', 'inline')
| |
| .find('.countdowndate')
| |
| .each(function () {
| |
| var $this = $(this),
| |
| date = (new Date($this.text())).valueOf();
| |
| if (isNaN(date)) {
| |
| $this.text('BAD DATE');
| |
| return;
| |
| }
| |
| countdowns.push({
| |
| node: $this,
| |
| opts: getOptions($this),
| |
| date: date,
| |
| });
| |
| });
| |
| if (countdowns.length) {
| |
| update();
| |
| }
| |
| });
| |
|
| |
| }(window.countdownTimer = window.countdownTimer || {}, mediaWiki, jQuery));
| |
|
| |
| // **************************************************
| |
| // - end - JavaScript countdown timer
| |
| // **************************************************
| |