Difference between revisions of "MediaWiki:Common.js"

From Observer GigaFlow Support | VIAVI Solutions Inc.
Jump to: navigation, search
(Blanked the page)
 
Line 1: Line 1:
 +
/* Any JavaScript here will be loaded for all users on every page load. */
 +
 +
(function ($, mw, store) {
 +
    "use strict";
 +
    var articles;
 +
 +
    if (store && store.getItem('commonjs')) {
 +
        console.log('You have chosen to disable site-wide JavaScript ' +
 +
                    'in MediaWiki:Common.js. Please remove \'commonjs\' ' +
 +
                    'from localStorage to re-enable site-wide JavaScript.');
 +
        return;
 +
    }
 +
 +
    window.UserTagsJS = {
 +
modules: {},
 +
tags: {
 +
          heroicuser:  { u:'Most Heroic Contributor' },
 +
          imageeditor: { u:'Image Editor' },
 +
          retired: { u:'Retired Clasher' },
 +
        }
 +
    };
 +
    UserTagsJS.modules.custom        = {};
 +
    UserTagsJS.modules.inactive      = 30;
 +
    UserTagsJS.modules.newuser      = true;
 +
    UserTagsJS.modules.autoconfirmed = true;
 +
 +
    UserTagsJS.modules.mwGroups = [
 +
        'bureaucrat',
 +
        'sysop',
 +
        'chatmoderator',
 +
        'threadmoderator',
 +
        'rollback',
 +
        'patroller',
 +
        'bannedfromchat',
 +
        'bot',
 +
        'bot-global',
 +
    ];
  
 +
    UserTagsJS.modules.metafilter = {
 +
        bureaucrat:      ['founder'],
 +
        sysop:          ['founder', 'bureaucrat'],
 +
        chatmoderator:  ['founder', 'bureaucrat', 'sysop'],
 +
        threadmoderator: ['founder', 'bureaucrat', 'sysop', 'chatmoderator'],
 +
        imageeditor:    ['founder', 'bureaucrat', 'sysop', 'chatmoderator', 'threadmoderator'],
 +
        rollback:        ['founder', 'bureaucrat', 'sysop', 'chatmoderator', 'threadmoderator',
 +
                          'imageeditor'],
 +
    };
 +
 +
    UserTagsJS.modules.custom = {
 +
        'FaceBound': ['imageeditor'], // Image Editor
 +
    };
 +
 +
    if (typeof(window.SpoilerAlert) === 'undefined') {
 +
        window.SpoilerAlert = {
 +
            question: 'Chief! This page contains sneak peeks. Are you sure you ' +
 +
                      'want to enter?',
 +
            yes: 'Yes, please',
 +
            no: 'No, let it be a surprise',
 +
            isSpoiler: function () {
 +
                return (-1 !== wgCategories.indexOf('Spoiler') &&
 +
                    Boolean($('.spoiler').length));
 +
            }
 +
        };
 +
    }
 +
 +
    window.LockForums = {
 +
        expiryDays:    90,  // Number of days until forum is locked to new replies
 +
        expiryMessage: 'Forums are automatically locked when the most recent post is older than <expiryDays> days.',
 +
        warningDays:  14,  // Number of days until a warning is given to potential replies
 +
        ignoreDeletes: true, // Ignore deleted messages when calculating age of last post
 +
        warningPopup:  true, // Pop up a warning dialog that must be confirmed for posts on older forums
 +
        banners:      true, // Add a banner to the top of aged forums
 +
    };
 +
 +
    /* Articles are interwiki links so that other wikis can use them. */
 +
    articles = [
 +
        'w:c:spottra:MediaWiki:Common.js/Numeral.js', // Defines num.format('<fmt>')
 +
        'w:c:spottra:MediaWiki:Common.js/AjaxGallery.js',
 +
        'u:dev:Countdown/code.js',
 +
        'u:dev:SpoilerAlert/code.js',
 +
        'u:dev:TopEditors/code.js',
 +
        'u:dev:WallGreetingButton/code.js',
 +
        'u:dev:ExtendedNavigation/code.js',
 +
        'u:dev:LockForums/code.js',
 +
        'u:dev:LockOldBlogs/code.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/RGBColor.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/Usernames.js',
 +
        'u:dev:UserTags/code.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/Sliders.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/GemCalculators.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/Experience.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/TroopInfo.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/BuildingInfo.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/AchievementInfo.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/Tabber2.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/ImageHover.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/CumulativeCosts.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/UnitComparator.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/ModeToggle.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/PageVerify.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/GorillaMan.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/Lugia.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/BadgeGenerator.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/Protection.js',
 +
        'w:c:clashofclans:MediaWiki:Common.js/AvailableBuildings.js',
 +
    ];
 +
    // Use Wikia's importArticles() function to load JavaScript files
 +
    window.importArticles({
 +
        type: 'script',
 +
        articles: articles
 +
    });
 +
    console.log('Site-wide JavaScript in MediaWiki:Common.js will load the ' +
 +
                'following JavaScript files:\n  ' + articles.join('\n  '));
 +
 +
    // Moves Clash Royale link to page header
 +
    $('#ClashRoyaleLink').appendTo('header#WikiaPageHeader');
 +
}(jQuery, mediaWiki, window.localStorage));
 +
 +
// Change Random Page button to only go to pages in the mainspace
 +
    $('.wds-dropdown a[data-tracking=explore-random], ul.tools li a[data-name=random]').attr("href", "/wiki/Special:Random/main");
 +
 +
/** Collapsible tables *********************************************************
 +
*
 +
*  Description: Allows tables to be collapsed, showing only the header. See
 +
*  http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
 +
*  Maintainers: [[en: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);
 +
 +
        // Styles are declared in [[MediaWiki:Common.css]]
 +
        Button.className = 'collapseButton';
 +
 +
        ButtonLink.style.color = Header.style.color;
 +
        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(']'));
 +
 +
        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;
 +
            }
 +
        }
 +
      }
 +
  }
 +
}
 +
 +
addOnloadHook(createCollapseButtons);
 +
 +
/** 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);
 +
  };
 +
})();
 +
 +
function hasClassTest(element, className) {
 +
  // No reason to have two functions that do the same thing
 +
  // return element.className.indexOf(className) != -1;
 +
  return hasClass(element, className);
 +
}

Latest revision as of 11:11, 15 November 2018

/* Any JavaScript here will be loaded for all users on every page load. */
 
(function ($, mw, store) {
    "use strict";
    var articles;
 
    if (store && store.getItem('commonjs')) {
        console.log('You have chosen to disable site-wide JavaScript ' +
                    'in MediaWiki:Common.js. Please remove \'commonjs\' ' +
                    'from localStorage to re-enable site-wide JavaScript.');
        return;
    }
 
    window.UserTagsJS = {
	modules: {},
	tags: {
           heroicuser:  { u:'Most Heroic Contributor' },
           imageeditor: { u:'Image Editor' },
           retired: { u:'Retired Clasher' },
        }
    };
    UserTagsJS.modules.custom        = {};
    UserTagsJS.modules.inactive      = 30;
    UserTagsJS.modules.newuser       = true;
    UserTagsJS.modules.autoconfirmed = true;
 
    UserTagsJS.modules.mwGroups = [
        'bureaucrat',
        'sysop',
        'chatmoderator',
        'threadmoderator',
        'rollback',
        'patroller',
        'bannedfromchat',
        'bot',
        'bot-global',
    ];

    UserTagsJS.modules.metafilter = {
        bureaucrat:      ['founder'],
        sysop:           ['founder', 'bureaucrat'],
        chatmoderator:   ['founder', 'bureaucrat', 'sysop'],
        threadmoderator: ['founder', 'bureaucrat', 'sysop', 'chatmoderator'],
        imageeditor:     ['founder', 'bureaucrat', 'sysop', 'chatmoderator', 'threadmoderator'],
        rollback:        ['founder', 'bureaucrat', 'sysop', 'chatmoderator', 'threadmoderator',
                          'imageeditor'],
    };
 
    UserTagsJS.modules.custom = {
        'FaceBound': ['imageeditor'], // Image Editor
    };

    if (typeof(window.SpoilerAlert) === 'undefined') {
        window.SpoilerAlert = {
            question: 'Chief! This page contains sneak peeks. Are you sure you ' +
                      'want to enter?',
            yes: 'Yes, please',
            no: 'No, let it be a surprise',
            isSpoiler: function () {
                return (-1 !== wgCategories.indexOf('Spoiler') &&
                    Boolean($('.spoiler').length));
            }
        };
    }

    window.LockForums = {
        expiryDays:    90,  // Number of days until forum is locked to new replies
        expiryMessage: 'Forums are automatically locked when the most recent post is older than <expiryDays> days.',
        warningDays:   14,   // Number of days until a warning is given to potential replies
        ignoreDeletes: true, // Ignore deleted messages when calculating age of last post
        warningPopup:  true, // Pop up a warning dialog that must be confirmed for posts on older forums
        banners:       true, // Add a banner to the top of aged forums
    };

    /* Articles are interwiki links so that other wikis can use them. */
    articles = [
        'w:c:spottra:MediaWiki:Common.js/Numeral.js', // Defines num.format('<fmt>')
        'w:c:spottra:MediaWiki:Common.js/AjaxGallery.js',
        'u:dev:Countdown/code.js',
        'u:dev:SpoilerAlert/code.js',
        'u:dev:TopEditors/code.js',
        'u:dev:WallGreetingButton/code.js',
        'u:dev:ExtendedNavigation/code.js',
        'u:dev:LockForums/code.js',
        'u:dev:LockOldBlogs/code.js',
        'w:c:clashofclans:MediaWiki:Common.js/RGBColor.js',
        'w:c:clashofclans:MediaWiki:Common.js/Usernames.js',
        'u:dev:UserTags/code.js',
        'w:c:clashofclans:MediaWiki:Common.js/Sliders.js',
        'w:c:clashofclans:MediaWiki:Common.js/GemCalculators.js',
        'w:c:clashofclans:MediaWiki:Common.js/Experience.js',
        'w:c:clashofclans:MediaWiki:Common.js/TroopInfo.js',
        'w:c:clashofclans:MediaWiki:Common.js/BuildingInfo.js',
        'w:c:clashofclans:MediaWiki:Common.js/AchievementInfo.js',
        'w:c:clashofclans:MediaWiki:Common.js/Tabber2.js',
        'w:c:clashofclans:MediaWiki:Common.js/ImageHover.js',
        'w:c:clashofclans:MediaWiki:Common.js/CumulativeCosts.js',
        'w:c:clashofclans:MediaWiki:Common.js/UnitComparator.js',
        'w:c:clashofclans:MediaWiki:Common.js/ModeToggle.js',
        'w:c:clashofclans:MediaWiki:Common.js/PageVerify.js',
        'w:c:clashofclans:MediaWiki:Common.js/GorillaMan.js',
        'w:c:clashofclans:MediaWiki:Common.js/Lugia.js',
        'w:c:clashofclans:MediaWiki:Common.js/BadgeGenerator.js',
        'w:c:clashofclans:MediaWiki:Common.js/Protection.js',
        'w:c:clashofclans:MediaWiki:Common.js/AvailableBuildings.js',
    ];
    // Use Wikia's importArticles() function to load JavaScript files
    window.importArticles({
        type: 'script',
        articles: articles
    });
    console.log('Site-wide JavaScript in MediaWiki:Common.js will load the ' +
                'following JavaScript files:\n   ' + articles.join('\n   '));

    // Moves Clash Royale link to page header
    $('#ClashRoyaleLink').appendTo('header#WikiaPageHeader');
}(jQuery, mediaWiki, window.localStorage));

// Change Random Page button to only go to pages in the mainspace
    $('.wds-dropdown a[data-tracking=explore-random], ul.tools li a[data-name=random]').attr("href", "/wiki/Special:Random/main");

/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *  http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
 *  Maintainers: [[en: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);
 
         // Styles are declared in [[MediaWiki:Common.css]]
         Button.className = 'collapseButton';
 
         ButtonLink.style.color = Header.style.color;
         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(']'));
 
         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;
            }
         }
      }
   }
}

addOnloadHook(createCollapseButtons);
 
/** 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);
   };
})();

function hasClassTest(element, className) {
   // No reason to have two functions that do the same thing
   // return element.className.indexOf(className) != -1;
   return hasClass(element, className);
}