MediaWiki:Common.js

/* Any JavaScript here will be loaded for all users on every page load. */ importScriptPage('ShowHide/code.js', 'dev'); importScriptPage('EditIntroButton/code.js', 'dev' ); 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(	{ id: 'central', domain: 'www.wikia.com', name: 'Central', title: 'Central Wikia', interwiki: 'w:' } );

/* ######################################################################## */ /* ### ARCHIVE TOOL                                                    ### */ /* ### ### */ /* ### Description: AJAX-archiving of talk pages via GUI                ### */ /* ### Credit:     User:Dantman (original)                             ### */ /* ###             User:Porter21 (Oasis & Monobook support)            ### */ /* ######################################################################## */ /* * Copyright © 2009, Daniel Friesen * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: *    * Redistributions of source code must retain the above copyright *      notice, this list of conditions and the following disclaimer. *    * Redistributions in binary form must reproduce the above copyright *      notice, this list of conditions and the following disclaimer in the *      documentation and/or other materials provided with the distribution. *    * Neither the name of the script nor the *      names of its contributors may be used to endorse or promote products *      derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DANIEL FRIESEN AS IS AND ANY * 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 = '' + msg('buttonArchiveTool') + ''; buttonPrimary = ['', '']; buttonSecondary = ['', '']; break; case 'monobook': pageBody = '#bodyContent'; pageControls = '#p-cactions > div > ul'; pageControlHTML = '' + msg('buttonArchiveTool') + ''; buttonPrimary = ['']; buttonSecondary = ['']; 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 = '' + msg('buttonArchiveTool') + '</a></li>'; buttonPrimary = ['', '</a>']; buttonSecondary = ['', '</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 = $(' ').appendTo(bc); var ul = $(' ').appendTo(table); for ( var l = 0; l < lines.length; l++ ) { var line = lines[l]; $(' ').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line)) .attr({line:line}) .append( $(' ').text(line).append(' ') ).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); $(' ').attr({rowspan: section.length}).appendTo(tr); }              $(' ').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 = [, ].concat(talkLines); archiveLines = [, ].concat(archiveLines); bc.empty; $('<img class="ajax" alt="Loading..." />') .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc); //$(' ').text(talkLines.join('\n')).appendTo(bc); //$(' ').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 = $(' Finding archive id: ').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 = $(' Finding token for '+archiveTitle+': ').appendTo(bc); token(archiveTitle, function(p) {                       m.append('done...');                        m = $(' Saving archive page: ').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(" The archive page we tried to create already exists. "); return abort; }                          m.append('done...'); saveTalk; });                    });                  }                  function saveTalk { var m = $(' Finding token for '+wgPageName+': ').appendTo(bc); m.append('done...'); m = $(' Updating talk page: ').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(" Failed to update talkpage, you may wish to have the archive subpage we just created deleted. ");                          return abort;                        }                     });                  }                  function abort {                     bc.find('.ajax').remove;                     bc.append(" Aborting... ");                     $(" You may want to ")                        .append( $('refresh</a>').attr({href: wgServer+wgArticlePath.replace('$1', encodeURI(wgPageName))}) )                        .append(' and try again.')                        .appendTo(bc);                  }                  // start                  findArchives;               }            });         }         $(pageControlHTML)            .click(startArchiving)            .appendTo(pageControls);      });   } }

/*This comes from starwars:User:Sikon/preload.js and implements the preloadable template system at bottom of input page*/

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

function fillPreloads {   var div = document.getElementById("lf-preload");

if(div == null) return;

div.style.display = 'block'; var span = document.getElementById('lf-preload-cbox');

var comboString = "<select id='stdPreloads' onchange='onPreloadChange'>"; comboString += " "; 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 {   doPreload(document.getElementById('lf-preload-pagename').getElementsByTagName('input')[0].value); }

function onPreloadChange {   var combo = document.getElementById("stdPreloads"); var value = combo.options[combo.selectedIndex].value;

if(value == "") return;

value = "Template:" + value + "/preload"; value = value.replace(" ", "_"); 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=" below. At present, it's using the id for Doctor Who on Facebook. You can see an example of what it   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. The IDs of some other shows: Torchwood: 113521238658450 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" />'); }

$(fBox);

/* ######################################################################## */ /* ### SCRIPT LOADER                                                   ### */ /* ### ### */ /* ### Description: Loads all the other scripts                         ### */ /* ### Credit:     User:Porter21                                       ### */ /* ######################################################################## */ function vaultScriptLoader { // Always loaded addFacebookFanbox; addTitleIcons; checktimers; createCollapseButtons; // Only loaded for specific namespaces if (wgNamespaceNumber%2 != 0 && wgNamespaceNumber != 501) { archiveTool; disableArchiveEdit; }  // Only loaded for specific pages if (wgPageName == 'The_Vault:Duplicate_files') { findDupFiles; }  for (x in ajaxPages) { if (wgPageName == ajaxPages[x] && $("#ajaxToggle").length==0) preloadAJAXRL; } } jQuery(function($) {  vaultScriptLoader; }); /* */