MediaWiki:Common.js

/* Any JavaScript here will be loaded for all users on every page load. */ // /** Collapsible tables ********************************************************* * *  Description: Allows tables to be collapsed, showing only the header. See *              NavFrame. * Maintainer on Wikipedia: User:R. Koot */ var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show"; function hasClass( element, className ) { var Classes = element.className.split( " " ); for ( var i = 0; i < Classes.length; i++ ) { if ( Classes[i] == className ) { return ( true ); } }  return ( false ); } 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 ); /* Auto updating recent changes opt-in * See w:c:dev:AjaxRC for info & attribution */ AjaxRCRefreshText = 'Auto-Refresh'; AjaxRCRefreshHoverText = 'Automatically refresh the page'; ajaxPages = ["Special:RecentChanges","Special:WikiActivity","Special:UncategorizedPages","Special:AllPages"]; window.ajaxRefresh = 60000; importScriptPage('AjaxRC/code.js', 'dev');

/***************************************************************/ // // ***************************************************** // * Experimental javascript countdown timer by Splarka* // * Version 0.0.3                                    * // ***************************************************** // // Usage example: // //  Only January 01 2007 00:00:00 PST until New years. // //  Javascript disabled. function updatetimer(i) { var now = new Date; var then = timers[i].eventdate; var diff = count=Math.floor((then.getTime-now.getTime)/1000); // catch bad date strings if(isNaN(diff)) { timers[i].firstChild.nodeValue = '** ' + timers[i].eventdate + ' **' ; return; } // determine plus/minus if(diff<0) { diff = -diff; var tpm = ''; } else { var tpm = ''; } // Calculate the diff - Modified by Eladkse if ((diff%60) == 1) { left = (diff%60) + 's'; } else { left = (diff%60) + 's'; }   diff=Math.floor(diff/60); if(diff > 0) { if ((diff%60) == 1) { left = (diff%60) + 'm ' + left; } else { left = (diff%60) + 'm ' + left; } }    diff=Math.floor(diff/60); if(diff > 0) { if ((diff%24) == 1) { left = (diff%24) + 'h ' + left; } else { left = (diff%24) + 'h ' + left; } }    diff=Math.floor(diff/24); if(diff > 0) { if (diff == 1) { left = diff + 'd ' + left; } else { left = diff + 'd ' + left; } }  timers[i].firstChild.nodeValue = tpm + left; // a setInterval is more efficient, but calling setTimeout // makes errors break the script rather than infinitely recurse timeouts[i] = setTimeout('updatetimer(' + i + ')',1000); } function checktimers { //hide 'nocountdown' and show 'countdown' var nocountdowns = getElementsByClassName(document, 'span', 'nocountdown'); for(var i in nocountdowns) nocountdowns[i].style.display = 'none' var countdowns = getElementsByClassName(document, 'span', 'countdown'); for(var i in countdowns) countdowns[i].style.display = 'inline' //set up global objects timers and timeouts. timers = getElementsByClassName(document, 'span', 'countdowndate'); //global timeouts = new Array; // generic holder for the timeouts, global if(timers.length == 0) return; for(var i in timers) { timers[i].eventdate = new Date(timers[i].firstChild.nodeValue); updatetimer(i); //start it up  } } addOnloadHook(checktimers); // ************************************************** // - end -  Experimental javascript countdown timer // ************************************************** // /** * Name:       DiscordIntegrator * Author:     KockaAdmiralac <1405223@gmail.com> * Description: Allows intergration with Discord * TODO:       I18N */ (function {   'use strict';    var mconfig = mw.config.get([ 'skin', 'wgUserLanguage', 'wgUserName' ]),   /**     * Main object     * @static     */        DiscordIntegrator = {        /**         * Configuration for the plugin         * @property config         * @type {Object}         */        config: (window.DiscordIntegratorConfig || {}).siderail || {},        /**         * Preload resources         */        preload: function {            if(mconfig.skin !== 'oasis' && mconfig.skin !== 'wikia') {                this.init;                return;            }            mw.loader.using('mediawiki.api').then($.proxy(function {                var api = new mw.Api;                api.get({ action: "query", meta: "allmessages", ammessages: ["id", "title", "moduleHeight", "usePTB", "theme", "width", "height", "text", "logged-in"].map(function(el) {                       return "Custom-DiscordIntegrator-config-" + el;                    }).join("|"), amlang: mconfig.wgUserLanguage }).done($.proxy(function(d) {                   if(!d.error) {                        d.query.allmessages.forEach(function(el) { if(el['*']) { this.config[el.name.substring(32)] = el['*']; }                       }, this);                        this._loading = 0;                        if(this.config.text) {                            ++this._loading;                            api.get({ action: "parse", text: this.config.text }).done($.proxy(function(d) {                               if(!d.error) {                                    this.config.text = d.parse.text["*"];                                    if(--this._loading === 0) {                                        this.init;                                    }                                }                            }, this));                        }                        if(this.config.title) {                            ++this._loading;                            api.get({ action: "parse", text: this.config.title }).done($.proxy(function(d) {                               if(!d.error) {                                    this.config.title = d.parse.text["*"];                                    if(--this._loading === 0) {                                        this.init;                                    }                                }                            }, this));                        }                        if(this._loading === 0) {                            this.init;                        }                    }                }, this));            }, this));        },        /**         * Initializing         */        init: function {            if(this.config.id && $('#WikiaRail').length > 0) {                var clas = $('#WikiaRail').attr('class');                if(clas && clas.split(/\s+/).indexOf('loaded') === -1) {                    $('#WikiaRail').on('afterLoad.rail', this.insertToSiderail.bind(this)); } else { this.insertToSiderail; }           }            if($(".DiscordIntegrator").length > 0) { this.insertToContent; }       },        /**         * Inserting the widget to siderail */       insertToSiderail: function { var filter = $('#top-right-boxad-wrapper, #NATIVE_TABOOLA_RAIL, .content-review-module').last, // TODO: Insert some user configuration here el = $(' ', { class: 'DiscordIntegratorModule rail-module' }); if(this.config.title) { el.append(                   $(' ', { class: 'activity-heading' })                        .html(this.config.title)                ); }           if(this.config.text) { el.append(                   $(' ', { id: 'DiscordIntegratorModuleText' })                        .html(this.config.text)                ); }           el.append(this.generateContent(this.config)); if(filter.length > 0) { el.insertAfter(filter); } else { $('#WikiaRail').prepend(el); }           mw.util.addCSS(".DiscordIntegratorModule { height: " + Number(this.config.moduleHeight || 500) + "px; }"); mw.hook('DiscordIntegrator.added').fire; },       /**         * Finding the designated places in content * in which to place the widget and placing it        */ insertToContent: function { $(".DiscordIntegrator").each(function(cabbage, el) {               el = $(el);                el.html(this.generateContent(el.data));            }.bind(this)); },       /**         * Generating widget content from an object * @todo i18n * @return [String] content of the widget */       generateContent: function(config) { return config.id ? ((config.loggedIn === true || Boolean(config["logged-in"]) === true) && !mconfig.wgUserName) ? "Please log in to see this widget" : mw.html.element('iframe', {               src: "https://" + (String(config.usePTB) === "true" ? "ptb." : "") +                    "discordapp.com/widget?id=" +                     config.id +                     "&theme=" +                     (config.theme === "light" ? "light" : "dark"),               width: config.width || "100%",                height: config.height || "90%",                allowtransparency: "true",                frameborder: "0"            }) : "Error: ID of the widget is not supplied"; }   };    $($.proxy(DiscordIntegrator.preload, DiscordIntegrator)); });