MediaWiki:Common.js: Difference between revisions

From Tardis Wiki, the free Doctor Who reference
(i'm gonna put in the whole code of the archive tool rather than importing it, just to see if that makes a difference)
 
(208 intermediate revisions by 6 users not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
console.log("Common.js is running");
importScriptPage('ShowHide/code.js', 'dev');
/* ================
importScriptPage('EditIntroButton/code.js', 'dev' );
  TABLE stuff
importScriptPage('AjaxBatchDelete/code.js', 'dev');
  ================ */
importScriptPage('DisableArchiveEdit/code.js', 'dev');
importScriptPage('DupImageList/code.js', 'dev');
// importScriptPage('AdvancedOasisUI/code.js', 'dev'); violates Wikia TOU but is okay for individual users to use
importScriptPage('PurgeButton/code.js', 'dev');
importScriptPage('ShowAdsButton/code.js', 'dev');
importScriptPage('WikiSwitch/code.js', 'dev');


wikiaDomainList = new Array(
//$("tr:odd").addClass("zebra-stripe"); (adversely affects TOCs for a reason I've not yet determined)
{ id: 'central', domain: 'www.wikia.com', name: 'Central', title: 'Central Wikia', interwiki: 'w:' }
);


/* ######################################################################## */
$("table").delegate('td','mouseover mouseleave', function(e) {
/* ### ARCHIVE TOOL                                                    ### */
    if (e.type == 'mouseover') {
/* ### ---------------------------------------------------------------- ### */
       $(this).parent().addClass("hover");
/* ### Description: AJAX-archiving of talk pages via GUI                ### */
      $("colgroup").eq($(this).index()).addClass("hover2");
/* ### Credit:      User:Dantman (original)                             ### */
    }
/* ###              User:Porter21 (Oasis & Monobook support)            ### */
    else {
/* ######################################################################## */
      $(this).parent().removeClass("hover");
      $("colgroup").eq($(this).index()).removeClass("hover2");
/*
    }
* Copyright © 2009, Daniel Friesen
});
* All rights reserved.
/* ================
*
  ROTATING PICS
* Redistribution and use in source and binary forms, with or without
  helps with infobox
* modification, are permitted provided that the following conditions are met:
  images of characters
*    * Redistributions of source code must retain the above copyright
  with mulitple
*      notice, this list of conditions and the following disclaimer.
  actors, principally
*    * Redistributions in binary form must reproduce the above copyright
  [[The Doctor]] and
*      notice, this list of conditions and the following disclaimer in the
  [[The Master]].
*      documentation and/or other materials provided with the distribution.
 
*    * Neither the name of the script nor the
  Also has some helper
*      names of its contributors may be used to endorse or promote products
  CSS elsewhere.
*      derived from this software without specific prior written permission.
  ================
*
 
* THIS SOFTWARE IS PROVIDED BY DANIEL FRIESEN ''AS IS'' AND ANY
  globals defaults:true, window:false, $:false
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL DANIEL FRIESEN BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
function archiveTool () {
  // Configuration
  var config = window.ArchiveToolConfig = $.extend(true, {
      archiveListTemplate: 'Archives',
      archivePageTemplate: 'Archivepage',
      archiveSubpage: 'Archive',
      userLang: false,
      // English
      en: {
        buttonArchiveTool: "Archive",
        buttonArchiveToolTooltip: "Archive this page",
        buttonSelectAll: "Select all",
        buttonDeselectAll: "Deselect all",
        buttonSaveArchive: "Save archive",
        buttonAbort: "Abort",
        labelLines: "Lines",
        labelSections: "Sections",
        summaryArchiveFrom: "ArchiveTool: Archiving from",
        summaryArchiveTo: "ArchiveTool: Archiving to"
      }
  }, window.ArchiveToolConfig || {});
  // Function for multi-language support
  function msg(name) {
      if ( config.userLang && wgUserLanguage in config && name in config[wgUserLanguage] )
        return config[wgUserLanguage][name];
      if ( wgContentLanguage in config && name in config[wgContentLanguage] )
        return config[wgContentLanguage][name];
      return config.en[name];
  }
  if (skin != "monaco" && skin != 'monobook' && skin != 'oasis' && skin != 'wikia') {
       return;
  }
  if ( wgNamespaceNumber % 2 === 1 && ( wgAction === "view" || wgAction === "purge" ) ) {
      var pageBody, pageControls, pageControlHTML;
      var buttonPrimary = buttonSecondary = ['', ''];
      switch(skin) {
        case 'monaco':
            pageBody = '#bodyContent';
            pageControls = '#page_controls';
            pageControlHTML = '<li id="control_archive"><img src="/skins/common/blank.gif" class="sprite move" /><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
            buttonPrimary = ['<a class="wikia-button">', '</a>'];
            buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
            break;
        case 'monobook':
            pageBody = '#bodyContent';
            pageControls = '#p-cactions > div > ul';
            pageControlHTML = '<li id="control_archive"><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
            buttonPrimary = ['<input type="submit" style="font-weight: bold;" value="', '" />'];
            buttonSecondary = ['<input type="submit" value="', '" />'];
            break;
        case 'oasis':
        case 'wikia':
            pageBody = '#WikiaArticle';
            pageControls = (wgNamespaceNumber == 3) ? '#WikiaUserPagesHeader > ul.wikia-menu-button > li > ul' : '#WikiaPageHeader > ul.wikia-menu-button > li > ul';
            pageControlHTML = '<li id="control_archive"><a id="ca-archive" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
            buttonPrimary = ['<a class="wikia-button">', '</a>'];
            buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
            break;
      }
      $(function() {
        function api(q, fn) {
            q.format = 'json';
            return $.post(wgScriptPath + '/api.php', q, fn, "json");
        }
        function token(page, fn) {
            api({
              action: 'query',
              query: 'prop',
              prop: 'info',
              titles: page,
              intoken: 'edit'
            }, function(q) {
              for ( var k in q.query.pages )
                  return fn(q.query.pages[k]);
            });
        }
        function startArchiving() {
            var c = config.archiveListTemplate.substr(0,1);
            var archiveListRegex = '['+c.toUpperCase()+c.toLowerCase()+']'+config.archiveListTemplate.substr(1);
            var bc = $(pageBody).addClass('va-archiving').empty();
            $('<img class="ajax" alt="Loading..." />')
              .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
            api({
              action: 'query',
              prop: 'revisions',
              titles: wgPageName,
              rvprop: 'timestamp|content'
            }, function(q) {
              bc.empty();
              var rev = q.query.pages[wgArticleId].revisions[0];
              var time = rev.timestamp;
              var talkToken, tokenTime;
              var content = rev['*'];
              token(wgPageName, function(p) {
                  talkToken = p.edittoken;
                  tokenTime = p.starttimestamp;
              });
              var lines = content.split('\n');
              var table = $('<table style="margin: 10px 0;"><thead><tr><th>' + msg('labelLines') + '</th><th title="' + msg('labelSections') + '">{&hellip;}</th></tr></thead></table>').appendTo(bc);
              var ul = $('<tbody/>').appendTo(table);
              for ( var l = 0; l < lines.length; l++ ) {
                  var line = lines[l];
                  $('<tr/>').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line))
                    .attr({line:line})
                    .append( $('<td class=line />').text(line).append('&nbsp;') ).appendTo(ul);
              }
              var sections = [];
              var sectionEnd = lines.length-1;
              for ( var l = lines.length-1; l >= 0; l-- ) {
                  var line = lines[l];
                  if ( /^=.+?=/.test(line) || l === 0 ) {
                    var section = { start: l, end: sectionEnd };
                    section.length = section.end - section.start + 1;
                    sections.unshift(section);
                    sectionEnd = l-1;
                  }
              }
              var section;
              while( section = sections.shift() ) {
                  var tr = ul.children().eq(section.start);
                  $('<td class=section />').attr({rowspan: section.length}).appendTo(tr);
              }
              $('<div class="buttons" style="text-align: right;" />').append(
                  $(buttonSecondary[0] + msg('buttonSelectAll') + buttonSecondary[1]).click(function(e) {
                    e.preventDefault();
                    ul.children('tr').addClass('archive');
                  }), ' ',
                  $(buttonSecondary[0] + msg('buttonDeselectAll') + buttonSecondary[1]).click(function(e) {
                    e.preventDefault();
                    ul.children('tr').removeClass('archive');
                  }), ' ',
                  $(buttonPrimary[0] + msg('buttonSaveArchive') + buttonPrimary[1]).click(function(e) {
                    archive();
                  }), ' ',
                  $(buttonPrimary[0] + msg('buttonAbort') + buttonPrimary[1]).click(function(e) {
                    bc.find('.ajax').remove();
                    location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                  })
              ).prependTo(bc).clone(true).appendTo(bc);
              var click = false;
              var add;
              table.mousedown(function(e) {
                  e.preventDefault();
                  var $li = $(e.target).closest('tr');
                  if(!$li.length) return;
                  var $section = $(e.target).closest('.section');
                  if ( $section.length ) {
                    var slist = $li.nextAll(':lt('+(parseInt($section.attr('rowspan'),10)-1)+')').andSelf();
                    var sadd = slist.filter(function() { return !$(this).hasClass('archive') }).length;
                    slist.toggleClass('archive', !!sadd);
                    return;
                  }
                  click = true;
                  add = !$li.hasClass('archive');
                  $li.toggleClass('archive', !!add);
              });
              table.mouseover(function(e) {
                  if (!click) return;
                  var $li = $(e.target).closest('tr');
                  if(!$li.length) return;
                  $li.toggleClass('archive', !!add);
              });
              $('body').mouseup(function(e) {
                  click = false;
              });
              function archive() {
                  var talkLines = [];
                  var archiveLines = [];
                  ul.children().each(function() {
                    var arr = $(this).hasClass('noarchive') || !$(this).hasClass('archive')
                        ? talkLines : archiveLines;
                    arr.push( $(this).attr('line') );
                  });
                  if ( !(new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(talkLines[0]) )
                    talkLines = ['{{'+config.archiveListTemplate+'}}', ''].concat(talkLines);
                  archiveLines = ['{{'+config.archivePageTemplate+'}}', ''].concat(archiveLines);
                  bc.empty();
                  $('<img class="ajax" alt="Loading..." />')
                    .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
                  //$('<pre/>').text(talkLines.join('\n')).appendTo(bc);
                  //$('<pre/>').text(archiveLines.join('\n')).appendTo(bc);
                  runArchive(talkLines.join('\n'), archiveLines.join('\n'));
              }
              var archiveTitle;
              function runArchive(talkContent, archiveContent) {
                  var archiveNo;
                  function findArchives() {
                    var m = $('<p>Finding archive id: </p>').appendTo(bc);
                    api({
                        action: 'query',
                        list: 'allpages',
                        apnamespace: wgNamespaceNumber,
                        apprefix: wgTitle+'/'+config.archiveSubpage,
                        aplimit: 1,
                        apdir: 'descending'
                    }, function(q) {
                        archiveNo = q.query.allpages.length ?
                          parseInt(q.query.allpages[0].title.substr(wgPageName.length+("/"+config.archiveSubpage).length),10)+1 :
                          1;
                        archiveTitle = wgPageName+'/'+config.archiveSubpage+' '+archiveNo;
                        m.append('done... (using '+archiveNo+')');
                        saveArchive();
                    });
                  }
                  function saveArchive() {
                    var m = $('<p>Finding token for '+archiveTitle+': </p>').appendTo(bc);
                    token(archiveTitle, function(p) {
                        m.append('done...');
                        m = $('<p>Saving archive page: </p>').appendTo(bc);
                        api({
                          action: 'edit',
                          title: archiveTitle,
                          text: archiveContent,
                          token: p.edittoken,
                          summary: "''"+ msg('summaryArchiveFrom') + " [["+wgPageName+"]].''",
                          minor: true,
                          createonly: true
                        }, function(q) {
                          if ( q.error && q.error.code === "articleexists" ) {
                              m.append('failed...');
                              bc.append("<p>The archive page we tried to create already exists.</p>");
                              return abort();
                          }
                          m.append('done...');
                          saveTalk();
                        });
                    });
                  }
                  function saveTalk() {
                    var m = $('<p>Finding token for '+wgPageName+': </p>').appendTo(bc);
                    m.append('done...');
                    m = $('<p>Updating talk page: </p>').appendTo(bc);
                    api({
                        action: 'edit',
                        title: wgPageName,
                        text: talkContent,
                        token: talkToken,
                        summary: "''" + msg('summaryArchiveTo') + " [["+archiveTitle+"]].''",
                        minor: true,
                        basetimestamp: time,
                        starttimestamp: tokenTime
                    }, function(q) {
                        if ( q.edit.result === "Success" ) {
                          m.append('done...');
                          bc.find('.ajax').remove();
                          location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                        } else {
                          m.append('failed...');
                          bc.append("<p>Failed to update talkpage, you may wish to have the archive subpage we just created deleted.</p>");
                          return abort();
                        }
                    });
                  }
                  function abort() {
                    bc.find('.ajax').remove();
                    bc.append("<p>Aborting...</p>");
                    $("<p>You may want to </p>")
                        .append( $('<a>refresh</a>').attr({href: wgServer+wgArticlePath.replace('$1', encodeURI(wgPageName))}) )
                        .append(' and try again.')
                        .appendTo(bc);
                  }
                  // start
                  findArchives();
              }
            });
        }
        $(pageControlHTML)
            .click(startArchiving)
            .appendTo(pageControls);
      });
  }
}


  First of all we need to detect whether browser
  supports animation natively or it needs a javascript
  polyfill.


  The detection code by the courtesy of Christian Heilmann
  http://hacks.mozilla.org/2011/09/detecting-and-generating-css-animations-in-javascript/ */


/*This comes from [[starwars:User:Sikon/preload.js]] and implements the preloadable template system at bottom of input page*/
var animation = false,
    elm = document.createElement('detect'),
    animationstring = 'animation',
    keyframeprefix = '',
    domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
    pfx  = '';


document.write('<script type="text/javascript" src="'
    + '/index.php?title=MediaWiki:Functions.js&action=raw&ctype=text/javascript"></script>');


function fillPreloads()
if( elm.style.animationName ) { animation = true; }
{
    var div = document.getElementById("lf-preload");


    if(div == null)
if( animation === false ) {
        return;
  for( var i = 0; i < domPrefixes.length; i++ ) {
 
     if( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {
    div.style.display = 'block';
      pfx = domPrefixes[ i ];
     var span = document.getElementById('lf-preload-cbox');
      animationstring = pfx + 'Animation';
 
      keyframeprefix = '-' + pfx.toLowerCase() + '-';
    var comboString = "<select id='stdPreloads' onchange='onPreloadChange()'>";
      animation = true;
    comboString += "</select>";
      break;
    span.innerHTML = comboString;
     }
   
  }
    span = document.getElementById('lf-preload-pagename');
    span.innerHTML = '<input type="text" class="textbox" />';
    span = document.getElementById('lf-preload-button');
    span.innerHTML = '<input type="button" class="button" value="Insert" onclick="doCustomPreload()" />';
 
     requestComboFill('stdPreloads', "Template:Stdpreloads");
}
}


function doCustomPreload()
(function ($) {
{
    $.slowEach = function (array, interval, callback) {
     doPreload(document.getElementById('lf-preload-pagename').getElementsByTagName('input')[0].value);
        if (!array.length) {
}
            return;
        }
        var i = 0;
        function next() {
            if (callback.call(array[i], i, array[i]) !== false) {
                if (++i < array.length) {
                    setTimeout(next, interval);
                }
            }
        }
        next();
        return array;
     };
    $.fn.dissolve = function (options) {
        var op = $.extend(defaults, options),
            $that = $(this),
            interval = op.visibleItemDuration + op.transitionDuration;
        return $.slowEach(this, interval, function () {
            var $this = $(this);
            $this
                .animate({
                    opacity: 1
                }, op.transitionDuration, function () {
                    function initCarousel() {
                        $that.dissolve(options);
                    }
                    if ($this.is(':last-child')) {
                        setTimeout(initCarousel, op.visibleItemDuration);
                    }
                })
                .delay(op.visibleItemDuration)
                .animate({
                    opacity: 0
                }, op.transitionDuration);
        });
    };
    var defaults = {
        visibleItemDuration: 4000,
        transitionDuration: 1000
    };
}(window.jQuery));


function onPreloadChange()
$(function () {
{
     if( animation === false ) {
     var combo = document.getElementById("stdPreloads");
        $('.dissolve .item').dissolve({
    var value = combo.options[combo.selectedIndex].value;
            // TUNE YOUR CAROUSEL HERE


    if(value == "")
            // duration of an item being visible in miliseconds
        return;
            visibleItemDuration: 4000,


    value = "Template:" + value + "/preload";
            // duration of a transition between items in miliseconds
    value = value.replace(" ", "_");
            transitionDuration: 1000
     doPreload(value);
        });
}
     }
 
});
addOnloadHook(fillPreloads);
 
/* Preload system ends */


/* The following Facebook box builder comes from Improvaganza Wiki.  It's sort of cool, but it may not be something
/* ================
we keep around.  It creates a little box allowing you to like whatever thing appears after "id="
   ARCHIVE TOOL
   below.  At present, it's using the id for Doctor Who on Facebook.  You can see an example of what it
   customisation
   does at [[user:CzechOut/Sandbox10]].  Might be an idea to rotate it every once in a while, putting up the id of
   ================ */
   whatever's the "hottest" thing in the DWU at the moment.
var ArchiveToolConfig = {
 
   archiveListTemplate: 'ArchCat',
   The IDs of some other shows:
   archivePageTemplate: 'ArchPage',
    
   archiveSubpage: 'Archive',
  Torchwood: 113521238658450
   userLang: true
   The Sarah Jane Adventures: 109282012424173
};
   Doctor Who: 127031120644257
  Big Finish: 109833429043462 */


function fBox() {
/* ================
$('#fbox').append('<iframe marginheight="0" marginwidth="0" src="http://www.facebook.com/connect/connect.php?id=127031120644257&amp;connections=10" align="top" frameborder="0" width="300" height="90" scrolling="no" />');
  {{pullout}}
}
  Accesability
  tweaks
  ================ */
$(document).ready(function(){
$('.pullout-content').each(function(i, obj) {
    $(obj).attr("aria-hidden","false");
    var toggle = $(".pullout-handle");
    $(toggle).attr("aria-controls","mw-customcollapsible-pullout");
$(toggle).attr("title","Hide editor notices");
$(toggle).attr("aria-label","Hide editor notices");
});
});
$(".pullout-content").on("afterExpand.mw-collapsible", function() {
$(this).attr("aria-hidden","false");
var toggle = $(".pullout-handle");
$(toggle).attr("aria-expanded","true");
$(toggle).attr("title","Hide editor notices");
$(toggle).attr("aria-label","Hide editor notices");
});
$(".pullout-content").on("afterCollapse.mw-collapsible", function() {
$(this).attr("aria-hidden","true");
var toggle = $(".pullout-handle");
$(toggle).attr("aria-expanded","false");
$(toggle).attr("title","Show editor notices");
$(toggle).attr("aria-label","Show editor notices");
});


$(fBox);
/* ================
  {{nwlh}}
  ================
  re-instate if external links are set to open in new tabs
$(document).ready(function(){
$('NWLH').children("a").each(function(i, obj) {
$(obj).removeAttr("target");
});
}); */

Latest revision as of 21:10, 9 April 2024

console.log("Common.js is running");
/* ================
   TABLE stuff 
   ================ */

//$("tr:odd").addClass("zebra-stripe"); (adversely affects TOCs for a reason I've not yet determined)

$("table").delegate('td','mouseover mouseleave', function(e) {
    if (e.type == 'mouseover') {
      $(this).parent().addClass("hover");
      $("colgroup").eq($(this).index()).addClass("hover2");
    }
    else {
      $(this).parent().removeClass("hover");
      $("colgroup").eq($(this).index()).removeClass("hover2");
    }
});
/* ================
   ROTATING PICS
   helps with infobox
   images of characters
   with mulitple 
   actors, principally
   [[The Doctor]] and
   [[The Master]].
   
   Also has some helper
   CSS elsewhere.
   ================
   
   globals defaults:true, window:false, $:false

   First of all we need to detect whether browser
   supports animation natively or it needs a javascript
   polyfill.

   The detection code by the courtesy of Christian Heilmann
   http://hacks.mozilla.org/2011/09/detecting-and-generating-css-animations-in-javascript/ */

var animation = false,
    elm = document.createElement('detect'),
    animationstring = 'animation',
    keyframeprefix = '',
    domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
    pfx  = '';


if( elm.style.animationName ) { animation = true; }

if( animation === false ) {
  for( var i = 0; i < domPrefixes.length; i++ ) {
    if( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {
      pfx = domPrefixes[ i ];
      animationstring = pfx + 'Animation';
      keyframeprefix = '-' + pfx.toLowerCase() + '-';
      animation = true;
      break;
    }
  }
}

(function ($) {
    $.slowEach = function (array, interval, callback) {
        if (!array.length) {
            return;
        }
        var i = 0;
        function next() {
            if (callback.call(array[i], i, array[i]) !== false) {
                if (++i < array.length) {
                    setTimeout(next, interval);
                }
            }
        }
        next();
        return array;
    };
    $.fn.dissolve = function (options) {
        var op = $.extend(defaults, options),
            $that = $(this),
            interval = op.visibleItemDuration + op.transitionDuration;
        return $.slowEach(this, interval, function () {
            var $this = $(this);
            $this
                .animate({
                    opacity: 1
                }, op.transitionDuration, function () {
                    function initCarousel() {
                        $that.dissolve(options);
                    }
                    if ($this.is(':last-child')) {
                        setTimeout(initCarousel, op.visibleItemDuration);
                    }
                })
                .delay(op.visibleItemDuration)
                .animate({
                    opacity: 0
                }, op.transitionDuration);
        });
    };
    var defaults = {
        visibleItemDuration: 4000,
        transitionDuration: 1000
    };
}(window.jQuery));

$(function () {
    if( animation === false ) {
        $('.dissolve .item').dissolve({
            // TUNE YOUR CAROUSEL HERE

            // duration of an item being visible in miliseconds
            visibleItemDuration: 4000,

            // duration of a transition between items in miliseconds
            transitionDuration: 1000
        });
    }
});

/* ================
   ARCHIVE TOOL
   customisation 
   ================ */
var ArchiveToolConfig = { 
   archiveListTemplate: 'ArchCat',
   archivePageTemplate: 'ArchPage',
   archiveSubpage: 'Archive',
   userLang: true
};

/* ================
   {{pullout}}
   Accesability
   tweaks
   ================ */
$(document).ready(function(){
	$('.pullout-content').each(function(i, obj) {
	    $(obj).attr("aria-hidden","false");
	    var toggle = $(".pullout-handle");
	    $(toggle).attr("aria-controls","mw-customcollapsible-pullout");
		$(toggle).attr("title","Hide editor notices");
		$(toggle).attr("aria-label","Hide editor notices");
	});
}); 
$(".pullout-content").on("afterExpand.mw-collapsible", function() {
	$(this).attr("aria-hidden","false");
	var toggle = $(".pullout-handle");
	$(toggle).attr("aria-expanded","true");
	$(toggle).attr("title","Hide editor notices");
	$(toggle).attr("aria-label","Hide editor notices");
});
$(".pullout-content").on("afterCollapse.mw-collapsible", function() {
	$(this).attr("aria-hidden","true");
	var toggle = $(".pullout-handle");
	$(toggle).attr("aria-expanded","false");
	$(toggle).attr("title","Show editor notices");
	$(toggle).attr("aria-label","Show editor notices");
});

/* ================
   {{nwlh}}
   ================
   re-instate if external links are set to open in new tabs
$(document).ready(function(){
	$('NWLH').children("a").each(function(i, obj) {
		$(obj).removeAttr("target");
	});
}); */