Main Page

Difference between revisions of "MediaWiki:Common.js"

From Arks-Visiphone
Jump to navigation Jump to search
(Check collapseGlobal before accessing)
 
(40 intermediate revisions by 3 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 every page load. */
 
 
/**
 
/**
  * JS Tab System, jacked and hacked from the jsprefs in wikibits.js
+
  * @source https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
*
+
  * @revision 2017-05-16
* Original code by Dantman
 
* Refactored a bit by Jack Phoenix on 11 April 2014
 
  * @note No doubt that this could be greatly simplified by converting this to jQuery,
 
*      but I think it's nice to have this JS thingy fully reusable.
 
 
  */
 
  */
{{Help page}}
+
mw.loader.using( ['mediawiki.util', 'mediawiki.notify'], function () {
 +
var extraCSS = mw.util.getParamValue( 'withCSS' ),
 +
extraJS = mw.util.getParamValue( 'withJS' );
 +
 
 +
if ( extraCSS ) {
 +
// DONT REMOVE THIS IF (unless you are OK with CSRF attacks)
 +
if ( /^MediaWiki:[^&<>=%#]*\.css$/.test( extraCSS ) ) {
 +
mw.loader.load( '/wiki/index.php?title=' + encodeURIComponent( extraCSS ) + '&action=raw&ctype=text/css', 'text/css' );
 +
} else {
 +
mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );
 +
}
 +
}
 +
 
 +
if ( extraJS ) {
 +
// DONT REMOVE THIS IF (unless you are OK with XSS & CSRF attacks)
 +
if ( /^MediaWiki:[^&<>=%#]*\.js$/.test( extraJS ) ) {
 +
mw.loader.load( '/wiki/index.php?title=' + encodeURIComponent( extraJS ) + '&action=raw&ctype=text/javascript' );
 +
} else {
 +
mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );
 +
}
 +
}
 +
});
 +
 
 +
 
 +
const collapseGlobal = document.getElementById("collapse-global");
 +
if (collapseGlobal) {
 +
  collapseGlobal.addEventListener("click", function() {
 +
      if (collapseGlobal.dataset.state != "expanded") {
 +
          $(".mw-collapsible-toggle.mw-collapsible-toggle-collapsed").click();
 +
          collapseGlobal.dataset.state = "expanded";
 +
      } else {
 +
          $(".mw-collapsible-toggle.mw-collapsible-toggle-expanded").click();
 +
          collapseGlobal.dataset.state = "collapsed";
 +
      }
 +
  });
 +
}
  
 
/**
 
/**
  * JS Tab System, jacked and hacked from the jsprefs in wikibits.js
+
  * Countdown
 
  *
 
  *
  * Original code by Dantman
+
  * @version 2.1
  * Refactored a bit by Jack Phoenix on 11 April 2014
+
  *
  * @note No doubt that this could be greatly simplified by converting this to jQuery,
+
  * @author Pecoes <https://c.fandom.com/wiki/User:Pecoes>
  *       but I think it's nice to have this JS thingy fully reusable.
+
  * @author Asaba <https://dev.fandom.com/wiki/User:Asaba>
 +
*
 +
* Version 1 authors:
 +
* - Splarka <https://c.fandom.com/wiki/User:Splarka>
 +
* - Eladkse <https://c.fandom.com/wiki/User:Eladkse>
 +
*
 +
* documentation and examples at:
 +
* <https://dev.fandom.com/wiki/Countdown>
 
  */
 
  */
var TabSystem = {
 
/**
 
* @property {boolean}
 
* Is the user's browser a KHTML-based one (usually, but not always, Konqueror)?
 
*/
 
isKHTML: ( navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ) ),
 
 
   
 
   
/**
+
/*jshint jquery:true, browser:true, devel:true, camelcase:true, curly:false, undef:true, bitwise:true, eqeqeq:true, forin:true, immed:true, latedef:true, newcap:true, noarg:true, unused:true, regexp:true, strict:true, trailing:false */
* @property {boolean}
+
/*global mediaWiki:true*/
* Is the user's browser Opera?
+
*/
+
;(function (module, mw, $, undefined) {
isOpera: navigator.userAgent.toLowerCase().indexOf( 'opera' ) != -1,
+
 +
'use strict';
 +
 +
var translations = $.extend(true, {
 +
// Language list - start
 +
// Arabic (العربية)
 +
ar: {
 +
and: 'و',
 +
second: 'ثانية',
 +
seconds: 'ثواني',
 +
minute: 'دقيقة',
 +
minutes: 'دقائق',
 +
hour: 'ساعة',
 +
hours: 'ساعات',
 +
day: 'يوم',
 +
days: 'أيام'
 +
},
 +
// Belarusian (Беларуская)
 +
be: {
 +
and: 'і',
 +
second: 'секунда',
 +
seconds: 'секунд',
 +
minute: 'хвіліна',
 +
minutes: 'хвілін',
 +
hour: 'гадзіну',
 +
hours: 'гадзін',
 +
day: 'дзень',
 +
days: 'дзён'
 +
},
 +
// Catalan (Català)
 +
ca: {
 +
and: 'i',
 +
second: 'segon',
 +
seconds: 'segons',
 +
minute: 'minut',
 +
minutes: 'minuts',
 +
hour: 'hora',
 +
hours: 'hores',
 +
day: 'dia',
 +
days: 'dies'
 +
},
 +
// German (Deutsch)
 +
de: {
 +
and: 'und',
 +
second: 'Sekunde',
 +
seconds: 'Sekunden',
 +
minute: 'Minute',
 +
minutes: 'Minuten',
 +
hour: 'Stunde',
 +
hours: 'Stunden',
 +
day: 'Tag',
 +
days: 'Tage'
 +
},
 +
// English (English)
 +
en: {
 +
and: 'and',
 +
second: 'second',
 +
seconds: 'seconds',
 +
minute: 'minute',
 +
minutes: 'minutes',
 +
hour: 'hour',
 +
hours: 'hours',
 +
day: 'day',
 +
days: 'days'
 +
},
 +
// Greek (Ελληνικά)
 +
el: {
 +
and: 'και',
 +
second: 'δευτερόλεπτο',
 +
seconds: 'δευτερόλεπτα',
 +
minute: 'λεπτό',
 +
minutes: 'λεπτά',
 +
hour: 'ώρα',
 +
hours: 'ώρες',
 +
day: 'ημέρα',
 +
days: 'ημέρες'
 +
},
 +
// Spanish (Español)
 +
es: {
 +
and: 'y',
 +
second: 'segundo',
 +
seconds: 'segundos',
 +
minute: 'minuto',
 +
minutes: 'minutos',
 +
hour: 'hora',
 +
hours: 'horas',
 +
day: 'día',
 +
days: 'días'
 +
},
 +
// French (Français)
 +
fr: {
 +
and: 'et',
 +
second: 'seconde',
 +
seconds: 'secondes',
 +
minute: 'minute',
 +
minutes: 'minutes',
 +
hour: 'heure',
 +
hours: 'heures',
 +
day: 'jour',
 +
days: 'jours'
 +
},
 +
//Hindi (हिंदी)
 +
hi: {
 +
and: 'और',
 +
second: 'सेकंड',
 +
seconds: 'सेकंड',
 +
minute: 'मिनट',
 +
minutes: 'मिनट',
 +
hour: 'घंटा',
 +
hours: 'घंटे',
 +
day: 'दिन',
 +
days: 'दिन'
 +
},
 +
// Hungarian (Magyar)
 +
hu: {
 +
and: 'és',
 +
second: 'másodperc',
 +
seconds: 'másodperc',
 +
minute: 'perc',
 +
minutes: 'perc',
 +
hour: 'óra',
 +
hours: 'óra',
 +
day: 'nap',
 +
days: 'nap'
 +
},
 +
// Indonesia (Bahasa Indonesia)
 +
id: {
 +
and: 'dan',
 +
second: 'detik',
 +
seconds: 'detik',
 +
minute: 'menit',
 +
minutes: 'menit',
 +
hour: 'jam',
 +
hours: 'jam',
 +
day: 'hari',
 +
days: 'hari'
 +
},
 +
// Italian (Italiano)
 +
it: {
 +
and: 'e',
 +
second: 'secondo',
 +
seconds: 'secondi',
 +
minute: 'minuto',
 +
minutes: 'minuti',
 +
hour: 'ora',
 +
hours: 'ore',
 +
day: 'giorno',
 +
days: 'giorni'
 +
},
 +
// Japanese (日本語)
 +
ja: {
 +
and: '',
 +
second: '秒',
 +
seconds: '秒',
 +
minute: '分',
 +
minutes: '分',
 +
hour: '時間',
 +
hours: '時間',
 +
day: '日',
 +
days: '日'
 +
},
 +
// Korean (한국어)
 +
ko:{
 +
and: ' ',
 +
second: '초',
 +
seconds: '초',
 +
minute: '분',
 +
minutes: '분',
 +
hour: '시간',
 +
hours: '시간',
 +
day: '일',
 +
days: '일'
 +
},
 +
// Malay (Bahasa Melayu)
 +
ms: {
 +
and: 'dan',
 +
second: 'saat',
 +
seconds: 'saat',
 +
minute: 'minit',
 +
minutes: 'minit',
 +
hour: 'jam',
 +
hours: 'jam',
 +
day: 'hari',
 +
days: 'hari'
 +
},
 +
// Dutch (Nederlands)
 +
nl: {
 +
and: 'en',
 +
second: 'seconde',
 +
seconds: 'seconden',
 +
minute: 'minuut',
 +
minutes: 'minuten',
 +
hour: 'uur',
 +
hours: 'uur',
 +
day: 'dag',
 +
days: 'dagen'
 +
},
 +
// Polish (Polski)
 +
pl: {
 +
and: 'i',
 +
second: 'sekunda',
 +
seconds: 'sekund(y)',
 +
minute: 'minuta',
 +
minutes: 'minut(y)',
 +
hour: 'godzina',
 +
hours: 'godzin(y)',
 +
day: 'dzień',
 +
days: 'dni'
 +
},
 +
// Portuguese (Português)
 +
pt: {
 +
and: 'e',
 +
second: 'segundo',
 +
seconds: 'segundos',
 +
minute: 'minuto',
 +
minutes: 'minutos',
 +
hour: 'hora',
 +
hours: 'horas',
 +
day: 'dia',
 +
days: 'dias'
 +
},
 +
// Brazilian Portuguese (Português do Brasil)
 +
'pt-br': {
 +
and: 'e',
 +
second: 'segundo',
 +
seconds: 'segundos',
 +
minute: 'minuto',
 +
minutes: 'minutos',
 +
hour: 'hora',
 +
hours: 'horas',
 +
day: 'dia',
 +
days: 'dias'
 +
},
 +
// Romanian (Română)
 +
ro: {
 +
and: 'și',
 +
second: 'secundă',
 +
seconds: 'secunde',
 +
minute: 'minut',
 +
minutes: 'minute',
 +
hour: 'oră',
 +
hours: 'ore',
 +
day: 'zi',
 +
days: 'zile',
 +
},
 +
// Russian (русский)
 +
ru: {
 +
and: 'и',
 +
second: 'секунда',
 +
seconds: 'секунд',
 +
minute: 'минута',
 +
minutes: 'минут',
 +
hour: 'час',
 +
hours: 'часов',
 +
day: 'день',
 +
days: 'дней'
 +
},
 +
// Serbian (српски језик)
 +
sr: {
 +
and: 'i',
 +
second: 'sekundu',
 +
seconds: 'sekunde/-i',
 +
minute: 'minutu',
 +
minutes: 'minute/-a',
 +
hour: 'sat',
 +
hours: 'sata/-i',
 +
day: 'dan',
 +
days: 'dana'
 +
},
 +
// Tagalog
 +
tl: {
 +
and: 'at',
 +
second: 'segundo',
 +
seconds: 'mga segundo',
 +
minute: 'minuto',
 +
minutes: 'mga minuto',
 +
hour: 'oras',
 +
hours: 'mga oras',
 +
day: 'araw',
 +
days: 'mga araw'
 +
},
 +
// Turkish (Türkçe)
 +
tr: {
 +
and: 've',
 +
second: 'saniye',
 +
seconds: 'saniye',
 +
minute: 'dakika',
 +
minutes: 'dakika',
 +
hour: 'saat',
 +
hours: 'saat',
 +
day: 'gün',
 +
days: 'gün'
 +
},
 +
// Ukrainian (Українська)
 +
uk: {
 +
and: 'та',
 +
second: 'секунда',
 +
seconds: 'секунд',
 +
minute: 'хвилина',
 +
minutes: 'хвилин',
 +
hour: 'годину',
 +
hours: 'годин',
 +
day: 'день',
 +
days: 'днів'
 +
},
 +
// Vietnamese (Tiếng Việt)
 +
vi: {
 +
and: 'và',
 +
second: 'giây',
 +
seconds: 'giây',
 +
minute: 'phút',
 +
minutes: 'phút',
 +
hour: 'giờ',
 +
hours: 'giờ',
 +
day: 'ngày',
 +
days: 'ngày'
 +
},
 +
// Chinese (简体中文)
 +
zh: {
 +
and: ' ',
 +
second: '秒',
 +
seconds: '秒',
 +
minute: '分',
 +
minutes: '分',
 +
hour: '时',
 +
hours: '时',
 +
day: '天',
 +
days: '天'
 +
},
 +
 +
// Chinese (台湾繁體中文)
 +
'zh-tw':{
 +
and: ' ',
 +
second: '秒',
 +
seconds: '秒',
 +
minute: '分',
 +
minutes: '分',
 +
hour: '時',
 +
hours: '時',
 +
day: '天',
 +
days: '天'
 +
},
 +
 +
// Chinese (香港繁體中文)
 +
'zh-hk':{
 +
and: ' ',
 +
second: '秒',
 +
seconds: '秒',
 +
minute: '分',
 +
minutes: '分',
 +
hour: '時',
 +
hours: '時',
 +
day: '天',
 +
days: '天'
 +
}
 +
// Language list - stop
 +
}, module.translations || {}),
 +
i18n = translations[
 +
mw.config.get('wgContentLanguage')
 +
] || translations.en;
 +
 +
var countdowns = [];
 
   
 
   
/*
+
var NO_LEADING_ZEROS = 1,
Written by Jonathan Snook, http://www.snook.ca/jonathan
+
SHORT_FORMAT = 2,
Add-ons by Robert Nyman, http://www.robertnyman.com
+
NO_ZEROS = 4;
Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
+
From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
+
function output (i, diff) {
*/
+
/*jshint bitwise:false*/
getElementsByClassName: function( oElm, strTagName, oClassNames ) {
+
var delta, result, parts = [];
var arrReturnElements = [];
+
delta = diff % 60;
if ( typeof oElm.getElementsByClassName == 'function' ) {
+
result = ' ' + i18n[delta === 1 ? 'second' : 'seconds'];
/* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
+
if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
+
parts.unshift(delta + result);
if ( strTagName == '*' ) {
+
diff = Math.floor(diff / 60);
return arrNativeReturn;
+
delta = diff % 60;
 +
result = ' ' + i18n[delta === 1 ? 'minute' : 'minutes'];
 +
if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
 +
parts.unshift(delta + result);
 +
diff = Math.floor(diff / 60);
 +
delta = diff % 24;
 +
result = ' ' + i18n[delta === 1 ? 'hour'  : 'hours'  ];
 +
if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
 +
parts.unshift(delta + result);
 +
diff = Math.floor(diff / 24);
 +
result = ' ' + i18n[diff  === 1 ? 'day'    : 'days'  ];
 +
if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
 +
parts.unshift(diff  + result);
 +
result = parts.pop();
 +
if (countdowns[i].opts & NO_LEADING_ZEROS) {
 +
while (parts.length && parts[0][0] === '0') {
 +
parts.shift();
 
}
 
}
for ( var h = 0; h < arrNativeReturn.length; h++ ) {
+
}
if ( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) {
+
if (countdowns[i].opts & NO_ZEROS) {
arrReturnElements[arrReturnElements.length] = arrNativeReturn[h];
+
parts = parts.filter(function(part) {
}
+
return part[0] !== '0';
 +
});
 +
}
 +
if (parts.length) {
 +
if (countdowns[i].opts & SHORT_FORMAT) {
 +
result = parts.join(' ') + ' ' + result;
 +
} else {
 +
result = parts.join(', ') + ' ' + i18n.and + ' ' + result;
 
}
 
}
return arrReturnElements;
 
 
}
 
}
 +
countdowns[i].node.text(result);
 +
}
 
   
 
   
var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
+
function end(i) {
var arrRegExpClassNames = [];
+
var c = countdowns[i].node.parent();
if ( typeof oClassNames == 'object' ) {
+
switch (c.attr('data-end')) {
for ( var i = 0; i < oClassNames.length; i++ ) {
+
case 'remove':
arrRegExpClassNames[arrRegExpClassNames.length] =
+
c.remove();
new RegExp( "(^|\\s)" + oClassNames[i].replace( /\-/g, "\\-" ) + "(\\s|$)" );
+
return true;
 +
case 'stop':
 +
output(i, 0);
 +
return true;
 +
case 'toggle':
 +
var toggle = c.attr('data-toggle');
 +
if (toggle && toggle == 'next') {
 +
c.next().css('display', 'inline');
 +
c.css('display', 'none');
 +
return true;
 +
}
 +
if (toggle && $(toggle).length) {
 +
$(toggle).css('display', 'inline');
 +
c.css('display', 'none');
 +
return true;
 
}
 
}
} else {
+
break;
arrRegExpClassNames[arrRegExpClassNames.length] =
+
case 'callback':
new RegExp( "(^|\\s)" + oClassNames.replace( /\-/g, "\\-" ) + "(\\s|$)" );
+
var callback = c.attr('data-callback');
 +
if (callback && $.isFunction(module[callback])) {
 +
output(i, 0);
 +
module[callback].call(c);
 +
return true;
 +
}
 +
break;
 
}
 
}
 +
countdowns[i].countup = true;
 +
output(i, 0);
 +
return false;
 +
}
 
   
 
   
var oElement;
+
function update () {
var bMatchesAll;
+
var now = Date.now();
for ( var j = 0; j < arrElements.length; j++ ) {
+
var countdownsToRemove = [];
oElement = arrElements[j];
+
$.each(countdowns.slice(0), function (i, countdown) {
bMatchesAll = true;
+
var diff = Math.floor((countdown.date - now) / 1000);
for ( var k = 0; k < arrRegExpClassNames.length; k++ ) {
+
if (diff <= 0 && !countdown.countup) {
if ( !arrRegExpClassNames[k].test( oElement.className ) ) {
+
if (end(i)) countdownsToRemove.push(i);
bMatchesAll = false;
+
} else {
break;
+
output(i, Math.abs(diff));
}
 
}
 
if ( bMatchesAll ) {
 
arrReturnElements[arrReturnElements.length] = oElement;
 
 
}
 
}
 +
});
 +
var x;
 +
while((x = countdownsToRemove.pop()) !== undefined) {
 +
countdowns.splice(x, 1);
 +
}
 +
if (countdowns.length) {
 +
window.setTimeout(function () {
 +
update();
 +
}, 1000);
 
}
 
}
 +
}
 
   
 
   
return arrReturnElements;
+
function getOptions (node) {
},
+
/*jshint bitwise:false*/
+
var text = node.parent().attr('data-options'),
/**
+
opts = 0;
* Main function that performs all the magic on all div elements that have
+
if (text) {
* class="tab" and are inside a div that has class="tabcontainer".
+
if (/no-leading-zeros/.test(text)) {
*/
+
opts |= NO_LEADING_ZEROS;
main: function() {
 
var tabcontainers = TabSystem.getElementsByClassName( document, 'div', 'tabcontainer' );
 
for ( var tc = 0; tc < tabcontainers.length; tc++ ) {
 
if ( !tabcontainers[tc] || !document.createElement ) {
 
return;
 
 
}
 
}
if ( tabcontainers[tc].nodeName.toLowerCase() == 'a' ) {
+
if (/short-format/.test(text)) {
return; // Occasional IE problem
+
opts |= SHORT_FORMAT;
 
}
 
}
+
if (/no-zeros/.test(text)) {
tabcontainers[tc].className += ' jstabs';
+
opts |= NO_ZEROS;
 
var sections = [];
 
var children = tabcontainers[tc].childNodes;
 
var seci = 0;
 
 
for ( var i = 0; i < children.length; i++ ) {
 
if ( children[i].className && children[i].className.match( /tab/i ) ) {
 
children[i].id = 'tabsection-' + seci + '-' + tc;
 
children[i].className += ' tabsection';
 
// Opera and KHTML-based browsers get a special class
 
if ( TabSystem.isOpera || TabSystem.isKHTML ) {
 
children[i].className += ' tabsection operatabsection';
 
}
 
var legends = TabSystem.getElementsByClassName( children[i], 'div', 'tab' );
 
sections[seci] = {};
 
legends[0].className = 'mainTab';
 
if ( legends[0] && legends[0].firstChild.nodeValue ) {
 
sections[seci].text = legends[0].firstChild.nodeValue;
 
} else {
 
sections[seci].text = '# ' + seci;
 
}
 
sections[seci].secid = children[i].id;
 
seci++;
 
if ( sections.length != 1 ) {
 
children[i].style.display = 'none';
 
} else {
 
var selectedid = children[i].id;
 
}
 
}
 
}
 
 
var toc = document.createElement( 'ul' );
 
toc.className = 'tabtoc';
 
toc.id = 'tabtoc-' + tc;
 
toc.selectedid = selectedid;
 
 
for ( i = 0; i < sections.length; i++ ) {
 
var li = document.createElement( 'li' );
 
if ( i === 0 ) {
 
li.className = 'selected';
 
}
 
var a = document.createElement( 'a' );
 
a.href = '#' + sections[i].secid;
 
a.onmousedown = a.onclick = TabSystem.uncoverTabSection;
 
a.appendChild( document.createTextNode( sections[i].text ) );
 
a.tc = tc;
 
a.secid = sections[i].secid;
 
li.appendChild( a );
 
toc.appendChild( li );
 
 
}
 
}
 
tabcontainers[tc].parentNode.insertBefore( toc, tabcontainers[tc] );
 
 
}
 
}
},
+
return opts;
 +
}
 
   
 
   
/**
+
function init() {
* Show the contents of a tab section when the user clicks on the tab.
+
var countdown = $('.countdown:not(.handled)');
*
+
if (!countdown.length) return;
* @return {boolean} Always false
+
$('.nocountdown').css('display', 'none');
*/
+
countdown
uncoverTabSection: function() {
+
.css('display', 'inline')
var oldsecid = this.parentNode.parentNode.selectedid;
+
.find('.countdowndate')
var newsec = document.getElementById( this.secid );
+
.each(function () {
if ( oldsecid != this.secid ) {
+
var $this = $(this),
var ul = document.getElementById( 'tabtoc-' + this.tc );
+
date = (new Date($this.text())).valueOf();
document.getElementById( oldsecid ).style.display = 'none';
+
if (isNaN(date)) {
newsec.style.display = 'block';
+
$this.text('BAD DATE');
ul.selectedid = this.secid;
+
return;
var lis = ul.getElementsByTagName( 'li' );
 
for ( var i = 0; i < lis.length; i++ ) {
 
lis[i].className = '';
 
 
}
 
}
this.parentNode.className = 'selected';
+
countdowns.push({
 +
node: $this,
 +
opts: getOptions($this),
 +
date: date,
 +
});
 +
});
 +
countdown.addClass('handled');
 +
if (countdowns.length) {
 +
update();
 
}
 
}
return false;
 
 
}
 
}
};
 
 
   
 
   
// Attach the onload handler. This is the only not-so-self-contained part of
+
mw.hook('wikipage.content').add(init);
// this script: we use either jQuery or the older standard MediaWiki onload
+
// mechanism to run the script on page load. If you're going to use this little
+
}(window.countdownTimer = window.countdownTimer || {}, mediaWiki, jQuery));
// script on a non-MediaWiki-based site, you'll want to
 
if ( typeof $ === 'function' ) {
 
$( document ).ready( function() {
 
TabSystem.main();
 
} );
 
} else if ( typeof addOnloadHook === 'function' ) {
 
addOnloadHook( TabSystem.main );
 
}
 
 
 
//function to open link in new tab
 
function ExtLinks() {
 
var extlinks = getElementsByClassName('extlink');
 
for (var i=0, il=extlinks.length; i<il; i++) {
 
extlinks[i].setAttribute('target','_blank');
 
};
 
};
 
addOnloadHook(ExtLinks);
 

Latest revision as of 08:54, 15 May 2020

/* Any JavaScript here will be loaded for all users on every page load. */
/**
 * @source https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
 * @revision 2017-05-16
 */
mw.loader.using( ['mediawiki.util', 'mediawiki.notify'], function () {
	var extraCSS = mw.util.getParamValue( 'withCSS' ),
		extraJS = mw.util.getParamValue( 'withJS' );

	if ( extraCSS ) {
		// DONT REMOVE THIS IF (unless you are OK with CSRF attacks)
		if ( /^MediaWiki:[^&<>=%#]*\.css$/.test( extraCSS ) ) {
			mw.loader.load( '/wiki/index.php?title=' + encodeURIComponent( extraCSS ) + '&action=raw&ctype=text/css', 'text/css' );
		} else {
			mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );
		}
	}

	if ( extraJS ) {
		// DONT REMOVE THIS IF (unless you are OK with XSS & CSRF attacks)
		if ( /^MediaWiki:[^&<>=%#]*\.js$/.test( extraJS ) ) {
			mw.loader.load( '/wiki/index.php?title=' + encodeURIComponent( extraJS ) + '&action=raw&ctype=text/javascript' );
		} else {
			mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );
		}
	}
});


const collapseGlobal = document.getElementById("collapse-global");
if (collapseGlobal) {
  collapseGlobal.addEventListener("click", function() {
      if (collapseGlobal.dataset.state != "expanded") {
          $(".mw-collapsible-toggle.mw-collapsible-toggle-collapsed").click();
          collapseGlobal.dataset.state = "expanded";
      } else {
          $(".mw-collapsible-toggle.mw-collapsible-toggle-expanded").click();
          collapseGlobal.dataset.state = "collapsed";
      }
  });
}

/**
 * Countdown
 *
 * @version 2.1
 *
 * @author Pecoes <https://c.fandom.com/wiki/User:Pecoes>
 * @author Asaba <https://dev.fandom.com/wiki/User:Asaba>
 *
 * Version 1 authors:
 * - Splarka <https://c.fandom.com/wiki/User:Splarka>
 * - Eladkse <https://c.fandom.com/wiki/User:Eladkse>
 *
 * documentation and examples at:
 * <https://dev.fandom.com/wiki/Countdown>
 */
 
/*jshint jquery:true, browser:true, devel:true, camelcase:true, curly:false, undef:true, bitwise:true, eqeqeq:true, forin:true, immed:true, latedef:true, newcap:true, noarg:true, unused:true, regexp:true, strict:true, trailing:false */
/*global mediaWiki:true*/
 
;(function (module, mw, $, undefined) {
 
	'use strict';
 
	var translations = $.extend(true, {
		// Language list - start
		// Arabic (العربية)
		ar: {
			and: 'و',
			second: 'ثانية',
			seconds: 'ثواني',
			minute: 'دقيقة',
			minutes: 'دقائق',
			hour: 'ساعة',
			hours: 'ساعات',
			day: 'يوم',
			days: 'أيام'
		},
		// Belarusian (Беларуская)
		be: {
			and: 'і',
			second: 'секунда',
			seconds: 'секунд',
			minute: 'хвіліна',
			minutes: 'хвілін',
			hour: 'гадзіну',
			hours: 'гадзін',
			day: 'дзень',
			days: 'дзён'
		},
		// Catalan (Català)
		ca: {
			and: 'i',
			second: 'segon',
			seconds: 'segons',
			minute: 'minut',
			minutes: 'minuts',
			hour: 'hora',
			hours: 'hores',
			day: 'dia',
			days: 'dies'
		},
		// German (Deutsch)
		de: {
			and: 'und',
			second: 'Sekunde',
			seconds: 'Sekunden',
			minute: 'Minute',
			minutes: 'Minuten',
			hour: 'Stunde',
			hours: 'Stunden',
			day: 'Tag',
			days: 'Tage'
		},
		// English (English)
		en: {
			and: 'and',
			second: 'second',
			seconds: 'seconds',
			minute: 'minute',
			minutes: 'minutes',
			hour: 'hour',
			hours: 'hours',
			day: 'day',
			days: 'days'
		},
		// Greek (Ελληνικά)
		el: {
			and: 'και',
			second: 'δευτερόλεπτο',
			seconds: 'δευτερόλεπτα',
			minute: 'λεπτό',
			minutes: 'λεπτά',
			hour: 'ώρα',
			hours: 'ώρες',
			day: 'ημέρα',
			days: 'ημέρες'
		},
		// Spanish (Español)
		es: {
			and: 'y',
			second: 'segundo',
			seconds: 'segundos',
			minute: 'minuto',
			minutes: 'minutos',
			hour: 'hora',
			hours: 'horas',
			day: 'día',
			days: 'días'
		},
		// French (Français)
		fr: {
			and: 'et',
			second: 'seconde',
			seconds: 'secondes',
			minute: 'minute',
			minutes: 'minutes',
			hour: 'heure',
			hours: 'heures',
			day: 'jour',
			days: 'jours'
		},
		//Hindi (हिंदी)
		hi: {
			and: 'और',
			second: 'सेकंड',
			seconds: 'सेकंड',
			minute: 'मिनट',
			minutes: 'मिनट',
			hour: 'घंटा',
			hours: 'घंटे',
			day: 'दिन',
			days: 'दिन'
		},
		// Hungarian (Magyar)
		hu: {
			and: 'és',
			second: 'másodperc',
			seconds: 'másodperc',
			minute: 'perc',
			minutes: 'perc',
			hour: 'óra',
			hours: 'óra',
			day: 'nap',
			days: 'nap'
		},
		// Indonesia (Bahasa Indonesia)
		id: {
			and: 'dan',
			second: 'detik',
			seconds: 'detik',
			minute: 'menit',
			minutes: 'menit',
			hour: 'jam',
			hours: 'jam',
			day: 'hari',
			days: 'hari'
		},
		// Italian (Italiano)
		it: {
			and: 'e',
			second: 'secondo',
			seconds: 'secondi',
			minute: 'minuto',
			minutes: 'minuti',
			hour: 'ora',
			hours: 'ore',
			day: 'giorno',
			days: 'giorni'
		},
		// Japanese (日本語)
		ja: {
			and: '',
			second: '秒',
			seconds: '秒',
			minute: '分',
			minutes: '分',
			hour: '時間',
			hours: '時間',
			day: '日',
			days: '日'
		},
		// Korean (한국어)
		ko:{
			and: ' ',
			second: '초',
			seconds: '초',
			minute: '분',
			minutes: '분',
			hour: '시간',
			hours: '시간',
			day: '일',
			days: '일'
		},
		// Malay (Bahasa Melayu)
		ms: {
			and: 'dan',
			second: 'saat',
			seconds: 'saat',
			minute: 'minit',
			minutes: 'minit',
			hour: 'jam',
			hours: 'jam',
			day: 'hari',
			days: 'hari'
		},
		// Dutch (Nederlands)
		nl: {
			and: 'en',
			second: 'seconde',
			seconds: 'seconden',
			minute: 'minuut',
			minutes: 'minuten',
			hour: 'uur',
			hours: 'uur',
			day: 'dag',
			days: 'dagen'
		},
		// Polish (Polski)
		pl: {
			and: 'i',
			second: 'sekunda',
			seconds: 'sekund(y)',
			minute: 'minuta',
			minutes: 'minut(y)',
			hour: 'godzina',
			hours: 'godzin(y)',
			day: 'dzień',
			days: 'dni'
		},
		// Portuguese (Português)
		pt: {
			and: 'e',
			second: 'segundo',
			seconds: 'segundos',
			minute: 'minuto',
			minutes: 'minutos',
			hour: 'hora',
			hours: 'horas',
			day: 'dia',
			days: 'dias'
		},
		// Brazilian Portuguese (Português do Brasil)
		'pt-br': {
			and: 'e',
			second: 'segundo',
			seconds: 'segundos',
			minute: 'minuto',
			minutes: 'minutos',
			hour: 'hora',
			hours: 'horas',
			day: 'dia',
			days: 'dias'
		},
		// Romanian (Română)
		ro: {
			and: 'și',
			second: 'secundă',
			seconds: 'secunde',
			minute: 'minut',
			minutes: 'minute',
			hour: 'oră',
			hours: 'ore',
			day: 'zi',
			days: 'zile',
		},
		// Russian (русский)
		ru: {
			and: 'и',
			second: 'секунда',
			seconds: 'секунд',
			minute: 'минута',
			minutes: 'минут',
			hour: 'час',
			hours: 'часов',
			day: 'день',
			days: 'дней'
		},
		// Serbian (српски језик)
		sr: {
			and: 'i',
			second: 'sekundu',
			seconds: 'sekunde/-i',
			minute: 'minutu',
			minutes: 'minute/-a',
			hour: 'sat',
			hours: 'sata/-i',
			day: 'dan',
			days: 'dana'
		},
		// Tagalog
		tl: {
			and: 'at',
			second: 'segundo',
			seconds: 'mga segundo',
			minute: 'minuto',
			minutes: 'mga minuto',
			hour: 'oras',
			hours: 'mga oras',
			day: 'araw',
			days: 'mga araw'
		},
		// Turkish (Türkçe)
		tr: {
			and: 've',
			second: 'saniye',
			seconds: 'saniye',
			minute: 'dakika',
			minutes: 'dakika',
			hour: 'saat',
			hours: 'saat',
			day: 'gün',
			days: 'gün'
		},
		// Ukrainian (Українська)
		uk: {
			and: 'та',
			second: 'секунда',
			seconds: 'секунд',
			minute: 'хвилина',
			minutes: 'хвилин',
			hour: 'годину',
			hours: 'годин',
			day: 'день',
			days: 'днів'
		},
		// Vietnamese (Tiếng Việt)
		vi: {
			and: 'và',
			second: 'giây',
			seconds: 'giây',
			minute: 'phút',
			minutes: 'phút',
			hour: 'giờ',
			hours: 'giờ',
			day: 'ngày',
			days: 'ngày'
		},
		// Chinese (简体中文)
		zh: {
			and: ' ',
			second: '秒',
			seconds: '秒',
			minute: '分',
			minutes: '分',
			hour: '时',
			hours: '时',
			day: '天',
			days: '天'
		},
 
		// Chinese (台湾繁體中文)
		'zh-tw':{
			and: ' ',
			second: '秒',
			seconds: '秒',
			minute: '分',
			minutes: '分',
			hour: '時',
			hours: '時',
			day: '天',
			days: '天'
		},
 
		// Chinese (香港繁體中文)
		'zh-hk':{
			and: ' ',
			second: '秒',
			seconds: '秒',
			minute: '分',
			minutes: '分',
			hour: '時',
			hours: '時',
			day: '天',
			days: '天'
		}
		// Language list - stop
	}, module.translations || {}),
	i18n = translations[
		mw.config.get('wgContentLanguage')
	] || translations.en;
 
	var countdowns = [];
 
	var NO_LEADING_ZEROS = 1,
	SHORT_FORMAT = 2,
	NO_ZEROS = 4;
 
	function output (i, diff) {
		/*jshint bitwise:false*/
		var delta, result, parts = [];
		delta = diff % 60;
		result = ' ' + i18n[delta === 1 ? 'second' : 'seconds'];
		if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
		parts.unshift(delta + result);
		diff = Math.floor(diff / 60);
		delta = diff % 60;
		result = ' ' + i18n[delta === 1 ? 'minute' : 'minutes'];
		if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
		parts.unshift(delta + result);
		diff = Math.floor(diff / 60);
		delta = diff % 24;
		result = ' ' + i18n[delta === 1 ? 'hour'   : 'hours'  ];
		if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
		parts.unshift(delta + result);
		diff = Math.floor(diff / 24);
		result = ' ' + i18n[diff  === 1 ? 'day'    : 'days'   ];
		if (countdowns[i].opts & SHORT_FORMAT) result = result.charAt(1);
		parts.unshift(diff  + result);
		result = parts.pop();
		if (countdowns[i].opts & NO_LEADING_ZEROS) {
			while (parts.length && parts[0][0] === '0') {
				parts.shift();
			}
		}
		if (countdowns[i].opts & NO_ZEROS) {
			parts = parts.filter(function(part) {
				return part[0] !== '0';
			});
		}
		if (parts.length) {
			if (countdowns[i].opts & SHORT_FORMAT) {
				result = parts.join(' ') + ' ' + result;
			} else {
				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();
			return true;
		case 'stop':
			output(i, 0);
			return true;
		case 'toggle':
			var toggle = c.attr('data-toggle');
			if (toggle && toggle == 'next') {
				c.next().css('display', 'inline');
				c.css('display', 'none');
				return true;
			}
			if (toggle && $(toggle).length) {
				$(toggle).css('display', 'inline');
				c.css('display', 'none');
				return true;
			}
			break;
		case 'callback':
			var callback = c.attr('data-callback');
			if (callback && $.isFunction(module[callback])) {
				output(i, 0);
				module[callback].call(c);
				return true;
			}
			break;
		}
		countdowns[i].countup = true;
		output(i, 0);
		return false;
	}
 
	function update () {
		var now = Date.now();
		var countdownsToRemove = [];
		$.each(countdowns.slice(0), function (i, countdown) {
			var diff = Math.floor((countdown.date - now) / 1000);
			if (diff <= 0 && !countdown.countup) {
				if (end(i)) countdownsToRemove.push(i);
			} else {
				output(i, Math.abs(diff));
			}
		});
		var x;
		while((x = countdownsToRemove.pop()) !== undefined) {
			countdowns.splice(x, 1);
		}
		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;
			}
			if (/short-format/.test(text)) {
				opts |= SHORT_FORMAT;
			}
			if (/no-zeros/.test(text)) {
				opts |= NO_ZEROS;
			}
		}
		return opts;
	}
 
	function init() {
		var countdown = $('.countdown:not(.handled)');
		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,
			});
		});
		countdown.addClass('handled');
		if (countdowns.length) {
			update();
		}
	}
 
	mw.hook('wikipage.content').add(init);
 
}(window.countdownTimer = window.countdownTimer || {}, mediaWiki, jQuery));