Community Central
Community Central
mNo edit summary
mNo edit summary
Line 1: Line 1:
  +
importArticles({
  +
type: 'script',
  +
articles: [
  +
'u:dev:MediaWiki:UserAndIPTools.js',
  +
]
  +
});
 
importArticles({
 
importArticles({
 
type: 'script',
 
type: 'script',

Revision as of 06:29, 26 February 2020

importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:UserAndIPTools.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:UserInfo.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:QuickContribs/code.js'
    ]
});
importArticle({
    type: 'script',
    article: 'u:dev:MediaWiki:AdminDashboard block/code.js',
    });
var MessageBlock = {
  title : 'Blocked',
  message : 'You have been blocked for $2 for $1.',
  autocheck : true
};
importArticles({
    type: 'script',
    articles: [
        'u:dev:MessageBlock/code.js'
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:ArchiveTool/code.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:PowerDelete/code.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:AjaxDiff/code.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:CategoryRenameAuto-update/code.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:MultiUpload/code.js',
    ]
});
importArticles({
    type: 'script',
    articles: [
        'u:dev:MediaWiki:AjaxEdit.js',
    ]
});
/* Redirect to base page if ends with '/' */
if (window.location.href.match("/$")) {
   window.location.href = window.location.href.slice(0, -1);
}
 
/* Disable 5 sec edit save delay */
GlobalTriggers.bind("WikiaEditorReady", function(point) {
    if (point.controls) {
        point.controls.editform.off("submit").on("submit", function() {
            point.setState(3);
        });
    }
});
 
/* Standard Edit Summary config */
window.dev = window.dev || {};
window.dev.editSummaries = {
    select: [
        '(click to browse)',
        'Quick', [
            'Credit to the wikia watchers',
            'Redlink removal',
            'Duplicate image',
            'Removing vandalism',
            'Fixing error(s)',
            'Corrected spelling/grammar',
            'Corrected formatting/layout'
        ],
        'General', [
            'Testing',
            'Testing (will revert shortly if fails)',
            'Testing complete',
            'Added/removed/corrected wikilink(s)',
            'Added/removed/corrected interwiki link(s)',
            'Added/removed/corrected external link(s)',
            'Cleanup',
            'Comment',
            'Correction(s), coding',
            'Expanded',
            'Formatting',
            'Grammar',
            'Headings (adjusting, etc.)',
            'HTML → wikicode',
            'Layout',
            'Mini-wikifying',
            'Punctuation',
            'Redlink removal',
            'Refactoring',
            'Removing RTE refuse',
            'Re-ordering/re-organizing',
            'Reply',
            'Revised',
            'Signing',
            'Spelling',
            'Style/layout',
            'Suggestion',
            'Tidying',
            'Updating',
            'Wikifying',
            'Factual correction',
            'Added/removed/corrected sources/appearances'
        ],
        'Removal/Reversion', [
            'Reverted vandalism',
            'Reverted test edit',
            'Reverted vanity edit',
            'Removed fanon',
            'Removed libel/slander',
            'Removed copyvio',
            'Removed spam'
        ],
        'Templates', [
            'Added/removed/corrected template(s)',
            'Added/removed/corrected infobox(es)',
            'Substituting template(s)',
        ],
        'Categories', [
            'Added category(ies)',
            'Alphabetised category(ies)',
            'Creating Category page',
            'Modified category(ies)',
            'Removed category(ies)',
            'Removed defunct category(ies)',
            'Removed duplicate category(ies)'
        ],
        'Images/Files', [
            'Adding image(s)',
            'Modifying image(s)'
        ]
    ]
};
 
/* Show bot edits on RecentChanges */
if (wgPageName == "Special:RecentChanges") {
    if (window.location.href.indexOf("hidebots=") == -1 && window.location.href.indexOf("?") == -1) {
        window.location.href = window.location.href + "?hidebots=0";
    } else if (window.location.href.indexOf("hidebots=") == -1 && window.location.href.indexOf("?") !== -1) {
        window.location.href = window.location.href + "&hidebots=0";
    }
} else if (wgPageName == "Special:Newwikis") {
    if (window.location.href.indexOf("language=") == -1 && window.location.href.indexOf("?") == -1) {
        window.location.href = window.location.href + "?language=en";
    } else if (window.location.href.indexOf("language=") == -1 && window.location.href.indexOf("?") != -1) {
        window.location.href = window.location.href + "&language=en";
    }
}
 
/* Block links */
$(function() {
    if ($('#UserProfileMasthead').length) {
        $('.tag-container').after('<a class="tag" style="float: right; color: white !important; top: 10px;" href="/wiki/Special:Block/' + $('[itemprop="name"]').text() + '">Block</a>');
    }
    // Threads
    if (wgNamespaceNumber != 1201) return;
    for (var i in $('.msg-toolbar')) {
        var usr = $('.msg-toolbar:eq(' + i + ')').parent().find('.edited-by a').text();
        $('.msg-toolbar:eq(' + i + ')').find('.WikiaMenuElement li').last().before('<li><a href="/wiki/Special:Block/' + usr + '">Block</a></li>');
    }
});
 
/* Add gender tag to global masterhead */
$(function() {
    if($("#UserProfileMasthead").length === 0) {
        return;
    }
    mw.loader.using('mediawiki.api').then(function() {
        new mw.Api().get({
            action: 'parse',
            text: '{{gender:' + $('.masthead-info h1').text() + '|male|female|thisisjustsomethingstupid}}'
        }).done(function(d) {
            if(d.parse.text['*'].indexOf('thisisjustsomethingstupid') === -1) {
                $('.masthead-info hgroup').append('<span class="tag">' + d.parse.text['*'] + '</span>');
            }
        });
    });
});
 
/* Create user page on link click */
$('<li>', {id: 'qcup',})
.html('<a href="#">Create user page</a>') //create the link
.prependTo('#my-tools-menu') //put it in the toolbar
.click(function() { //when clicked
    $.ajax( { //create the userpage
    type: 'POST',
    url: mw.util.wikiScript( 'api' ),
    dataType: 'json',
    data: {
        action: 'edit',
        title: 'User:Dominic1743', //at this page
        summary: 'Creating user page (script)', //with this edit summary
        text: '{{w:User:Dominic1743}}', //using this tempalte
        format: 'json',
        token: mw.user.tokens.get( 'editToken' )
    }
    } ).done( function ( data ) {
        if ( data.edit.result === 'Success' ) {
            new BannerNotification("Successfully created user page!","confirm").show(); //say we created the page
        } else {
            new BannerNotification("An error occurred while creating user page.","error").show(); //say we didn't create the page
        }
    } ).fail( function ( data ) {
        new BannerNotification("An error occurred while creating user page.","error").show(); //say we didn't create the page
    } );
});
 
/* Create message wall greeting on link click */
$.ajax({
    type: 'HEAD', //see if
    url: wgServer + '/wiki/Message_Wall:Dominic1743', //my message wall exists
    success: function() { //if it exists
        $('<li>', {id: 'qcmwg',})
        .html('<a href="#">Create Greeting</a>') //create the link
        .prependTo('#my-tools-menu') //put it in the my tools menu on the toolbar
        .click(function() { //when clicked
            $.ajax( { //create the message wall greeting
            type: 'POST',
            url: mw.util.wikiScript( 'api' ),
            dataType: 'json',
            data: {
                action: 'edit',
                title: 'Message_Wall_Greeting:Dominic1743', //at this page
                summary: 'Creating message wall greeting (script)', //with this edit summary
                text: '{{w:User:Dominic1743/MessageWallGreeting}}', //using this template
                format: 'json',
                token: mw.user.tokens.get( 'editToken' )
            }
            } ).done( function ( data ) {
                if ( data.edit.result === 'Success' ) {
                    new BannerNotification("Successfully created message wall greeting!","confirm").show(); //say we created the page
                } else {
                    new BannerNotification("An error occurred creating while message wall greeting.","error").show(); //say we didn't create the page
            }
            } ).fail( function ( data ) {
                new BannerNotification("An error occurred while creating message wall greeting.","error").show(); //say we didn't create the page
            } );
        });
    },
    error: function() { //if it doesn't exist
        return; //do nothing
    }
});
 
/* Revert buttons */
//@author-Prince(ss)_Platinum (http://community.wikia.com/wiki/User:Prince(ss)_Platinum/vda.js)
// Reverting tools V6.6 Gold (Original coding by VegaDark, modified by Ajraddatz and Manyman)
function getElementsByClass(searchClass,node,tag) {
  // Function from http://www.dustindiaz.com/getelementsbyclass/
  var classElements = new Array();
  if ( node === null )
    node = document;
  if ( tag === null )
    tag = '*';
  var els = node.getElementsByTagName(tag);
  var elsLen = els.length;
  var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
  for (i = 0, j = 0; i < elsLen; i++) {
    if ( pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}
 
// _GET code from NoGray JS Library http://www.nogray.com/new_site/
var _GET = new Array();
var _uri = location.href;
 
var _temp_get_arr = _uri.substring(_uri.indexOf('?')+1, _uri.length).split("&");
 
var _temp_get_arr_1 = new Array();
 
for(_get_arr_i=0; _get_arr_i<_temp_get_arr.length; _get_arr_i++){
  _temp_get_arr_1 = _temp_get_arr[_get_arr_i].split("=");
  _GET[decodeURI(_temp_get_arr_1[0])] = decodeURI(_temp_get_arr_1[1]);
}
 
delete _uri; delete _temp_get_arr; delete _temp_get_arr_1;
 
function getMessage (where, user1, user2) {
  var message = prompt ('Enter undo message below:', '');
  window.location = 'http://'+ location.hostname + '/index.php?title=' + _GET['title'] + '&action=edit&oldid=' + _GET['oldid'] + '&'+where+'=2&user1='+user1+'&user2='+user2+'&message='+message;
}
 
function AGFMessage (where, user1, user2) {
  var message = prompt ('Enter undo message below:', '');
  window.location = 'http://'+ location.hostname + '/index.php?title=' + _GET['title'] + '&action=edit&oldid=' + _GET['oldid'] + '&'+where+'=3&user1='+user1+'&user2='+user2+'&message='+message;
}
 
addOnloadHook(function (){
  if (location.href.match(/diff=/)) {
    // Get username of submitter
    var user1 = getElementsByClass('diff-otitle',null,'td'); user1 = user1[0].getElementsByTagName('a')[2].innerHTML;
    var user2 = getElementsByClass('diff-ntitle',null,'td'); user2 = user2[0].getElementsByTagName('a')[3].innerHTML;
    $('#mw-content-text').prepend('<div style="text-align: center" id="vda-cont"></div>');
    document.getElementById('vda-cont').innerHTML = '<b><a class="wikia-button" href="javascript:var message = getMessage(\'revert\', \''+user1+'\', \''+user2+'\');">Custom</a></b>&nbsp;<b><a class="wikia-button" href="http://'+ location.hostname + '/index.php?title=' + _GET['title'] + '&action=edit&oldid=' + _GET['oldid'] +
 '&revert=3&user1='+user1+'&user2='+user2+'">Speculation</a></b>&nbsp;<b><a class="wikia-button" href="http://'+ location.hostname + '/index.php?title=' + _GET['title'] + '&action=edit&oldid=' + _GET['oldid'] +
 '&revert=1&user1='+user1+'&user2='+user2+'">Revert (Vandalism)</a></span></b>&nbsp;<b><a class="wikia-button" href="http://'+ location.hostname + '/index.php?title=' + _GET['title'] + '&action=edit&oldid=' + _GET['oldid'] +
 '&revert=6&user1='+user1+'&user2='+user2+'">Revert (Good faith)</a></span></b>&nbsp;<b><a class="wikia-button" href="http://'+ location.hostname + '/index.php?title=' + _GET['title'] + '&action=edit&oldid=' + _GET['oldid'] +
 '&revert=4&user1='+user1+'&user2='+user2+'">Revert (Spam)</a></span></b>' + 
 
 
'';
  } else if (location.href.match(/revert=1/)) {
    document.getElementById('wpSummary').value = 'Reverted vandalism';
    document.getElementById('editform').submit();
  } else if (location.href.match(/revert=6/)) {
    document.getElementById('wpSummary').value = 'Reverted good faith edits';
    document.getElementById('editform').submit();
  } else if (location.href.match(/revert=3/)) {
    document.getElementById('wpSummary').value = 'Speculation';
    document.getElementById('editform').submit();
  } else if (location.href.match(/revert=2/)) {
    document.getElementById('wpSummary').value = '' +_GET['message']+ '';
    document.getElementById('editform').submit();
 } else if (location.href.match(/revert=4/)) {
    document.getElementById('wpSummary').value = 'Reverted spam';
    document.getElementById('editform').submit();
  }
 
});
 
/* AjaxBlock config */
window.AjaxBlock = {
    blockReasons: {
        '[[w:Help:Vandalism|Vandalism]]': 'Vandalism',
        '[[w:Help:Spam|Spam]]': 'Spam',
        'Repeated policy violations': 'Repeated violations',
        'Sockpuppetry/Ban Evasion': 'Sockpuppetry',
        'Moved to a new account': 'Moved',
        'Removing content/blanking pages': 'Page blanking',
        'Inserting false information or nonsense': 'Gibberish',
        'Intimidating behaviour/harassment/trolling': 'Troll/Harassment',
        'Unacceptable username, avatar, or global masthead': 'Name/avatar',
        'Under the legal age': 'COPPA',
        'Failing to comply with the [[Project:File Policy|File Policy]]': 'File Policy',
        'Posting/Discussing leaked content': 'Leaks'
    },
    check: {
        creation: true,
        talk: true,
        autoBlock: true,
        override: true
    }
};
 
/* Show removed replies */
$(".message-removed.hide").removeClass("hide").each(function() {
    var $this = $(this),
    id = $this.attr('data-id'),
    relativeid = $this.attr('id'),
    isBoardThread = !!$('.voting-controls').length,
    Api = new mw.Api();
    Api.get({
        action: 'query',
        prop: 'revisions',
        rvprop: 'timestamp|user',
        pageids: id,
        rvlimit: 500
    }).done(function(ts) {
        var rev = ts.query.pages[id].revisions[0],
        name = rev.user,
        time = rev.timestamp,
        d = new Date(time),
        // this may be a readable string, but the code certainly isn't :P
        readableTime = d.getHours() + d.getTimezoneOffset() / 60 + ':' + d.getMinutes() + ', ' + wgMonthNames[d.getMonth() + 1] + ' ' + d.getDate() + ', ' + d.getFullYear();
        $.get('/api/v1/User/Details', {
            ids: name,
            size: 50
        }).done(function(avi) {
            avi = avi.items[0].avatar;
            Api.get({
                action: 'parse',
                pageid: id
            }).done(function(d) {
                var html = d.parse.text['*'],
                $avatar = $('<div>', {
                    class: 'speech-bubble-avatar'
                }).append($('<a>', {
                    href: wgArticlePath.replace('$1', 'Message_Wall:' + name),
                    append: $('<img>', {
                        src: avi,
                        width: '30',
                        height: '30',
                        class: 'avatar',
                        alt: name
                    })
                })),
                $msg = $('<div>', {
                    class: 'speech-bubble-message'
                }).append($('<div>', {
                    class: 'MiniEditorWrapper',
                    'data-min-height': '100',
                    'data-max-height': '400',
                    append: [
                        $('<div>', {
                            class: 'edited-by',
                            append: [
                                $('<a>', {
                                    text: name,
                                    href: wgArticlePath.replace('$1', 'Message_Wall:' + name)
                                }),
                                $('<a>', {
                                    class: 'subtle',
                                    href: wgArticlePath.replace('$1', 'Message_Wall:' + name)
                                })
                            ]
                        }),
                        $('<div>', {
                            class: 'editarea',
                            'data-space-type': 'editarea',
                            append: [
                                $('<div>', {
                                    class: 'msg-body',
                                    id: 'WallMessage_' + id,
                                    html: html
                                }),
                                $('<div>', {
                                    class: 'loading-indicator',
                                    'data-space-type': 'loading-status',
                                    append: [
                                        $('<div>', {
                                            class: 'loading-background'
                                        }),
                                        $('<div>', {
                                            class: 'loading-message',
                                            append: [
                                                $('<span>', {
                                                    class: 'loading-throbber',
                                                    html: '&nbsp;'
                                                }),
                                                $('<span>', {
                                                    class: 'loading-text',
                                                    html: 'Loading editor'
                                                })
                                            ]
                                        })
                                    ]
                                })
                            ]
                        }),
                        $('<div>', {
                            class: 'toolbar',
                            'data-space-type': 'toolbar'
                        }),
                        $('<div>', {
                            class: 'msg-toolbar',
                            append: [
                                $('<div>', {
                                    class: 'timestamp',
                                    append: $('<a>', {
                                        class: 'permalink',
                                        tabindex: '-1',
                                        href: '#' + relativeid,
                                        append: [
                                            $('<span>', {
                                                class: 'timeago abstimeago',
                                                title: time,
                                                alt: readableTime,
                                                each: function() {
                                                    $(this).timeago();
                                                }
                                            }),
                                            $('<span>', {
                                                class: 'timeago-fmt',
                                                text: readableTime
                                            })
                                        ]
                                    })
                                })/*, not adding buttons  coz it's way too hard (also idk why you'd want to quote a removed message)
                                $('<div>', {
                                    class: 'buttonswrapper',
                                    append: the_buttons :P
                                })*/
                            ]
                        })
                    ]
                }));
                $this.append($avatar, $msg);
                console.log(d);
            });
        });
    });
});
 
/* PageCreator config */
window.pageCreatorAvatar = true;
window.pageCreatorTimestamp = true;
window.pageCreatorNamespaces = Object.keys(mw.config.get("wgFormattedNamespaces")).map(Number);
 
/* LastEdited config */
window.lastEdited = {
    namespaces: {
        include: Object.keys(mw.config.get("wgFormattedNamespaces")).map(Number)
    }
};
 
/* Imports */
importArticles({
    type: "script",
    articles: [
        'u:dev:MediaWiki:AjaxBatchDelete/code.js',
        'u:dev:MediaWiki:AjaxBatchDelete/code.2.js',
        'u:dev:MediaWiki:AjaxBatchUndelete.js',
        'u:dev:MediaWiki:CatFilter/code.js',
        'u:dev:MediaWiki:CategoryRenameAuto-update/code.js',
        'u:dev:MediaWiki:FastDelete/code.js',
        'u:dev:MediaWiki:CacheCheck/code.js',
        'u:dev:MediaWiki:MarkBlocked.js',
        'u:dev:MediaWiki:AjaxRC/code.js',
        'u:dev:MediaWiki:AnchoredRollback/code.js',
        'u:dev:MediaWiki:AjaxDelete/code.js',
        'u:dev:MediaWiki:AjaxPatrol/code.js',
        'u:dev:MediaWiki:LastEdited/code.js',
        'u:dev:MediaWiki:AjaxUndo/code.js',
        'u:dev:MediaWiki:PageCreator/code2.js',
        'u:dev:MediaWiki:HoverEditCount/code.js',
        'u:dev:MediaWiki:UserAccountAge/code.js',
        'u:dev:MediaWiki:ContribsLink/code.js',
        'u:dev:MediaWiki:DupImageList/code.js',
        'u:dev:MediaWiki:DisplayTimer/code.js',
        'u:dev:MediaWiki:CodeQuickLinks/code.js',
        'u:dev:MediaWiki:Linksweeper/code.js',
        'u:dev:MediaWiki:WorkingMoreUsersCount.js',
        'u:dev:MediaWiki:ToggleSideBar/code.js',
        'u:dev:MediaWiki:WHAM/code.2.js',
        'u:dev:MediaWiki:FastOldImageDelete/code.js',
        'u:dev:MediaWiki:ListFiles/code.js',
        'u:dev:MediaWiki:WallGreetingButton/code.js',
        'u:dev:MediaWiki:MassCreate/code.js',
        'u:dev:MediaWiki:MassProtect/code.js',
        'u:dev:MediaWiki:MassNullEdit/code.js',
        'u:dev:MediaWiki:MassRename/code.js',
        'u:dev:MediaWiki:MassRenameRevert/code.js',
        'u:dev:MediaWiki:FileUsageAuto-update/code.js',
        'u:dev:MediaWiki:PageRenameAuto-update/code.js',
        'u:dev:MediaWiki:QuickToolsv2/code.js',
        'u:dev:MediaWiki:OldFilePages/code.js',
        'u:dev:MediaWiki:Rollback/code.2.js',
      'u:dev:MediaWiki:Standard_Edit_Summary/code.js',
        'u:dev:MediaWiki:Thread Inspection/code.js',
        'u:dev:MediaWiki:SeeMoreActivityButton/code.js',
       'u:dev:MediaWiki:RecentChangesMultiple/code.2.js',
        'u:kocka:MediaWiki:AjaxCommentDelete/code.js',
        'u:kocka:MediaWiki:AjaxThreadDelete/code.js',
     'u:kocka:User:KockaAdmiralac/UnhideUserMasthead.javascript',
      'u:admintools:MediaWiki:Common.js/extraRollbacks.js',
      'u:admintools:MediaWiki:Common.js/Maintenance.js',
        'u:noreply:MediaWiki:HideWikiaLogs.js',
        'u:noreply:MediaWiki:FileUsage.js',
        'u:starmanw:User:Dorumin/QuickLogs',
        'u:dev:MediaWiki:WhatLinksHere/code.js',
        'u:dev:MediaWiki:MultipleFileDelete/code.js',
        'u:dev:MediaWiki:MassEdit/code.js',
        'u:dev:MediaWiki:PurgeButton/code.js',
        'u:dev:MediaWiki:AjaxBatchDelete.js',
        'u:dev:MediaWiki:HistoryKey/code.js',
    ]
});
//<nowiki>
/* 
* Mass Categorization
* @description (De)Categorize listed multiple pages.
* @author Ozuzanna
* @TODO fix replace
* Added option for <noinclude></include> (Dessamator)
*/
 
;(function($, mw) {
 
    if ($('#t-mc').length)
        return;
 
    //<option value="3">Replace</option> \
 
    var FormMC = '\
    <form method="" name="" class="WikiaForm "> \
       <fieldset> \
           <p>Mode: \
               <select id="select-mc"> \
                 <option value="1">Add</option> \
                 <option value="2">Remove</option> \
               </select> \
           </p> \
           <p>Category: \
               <input type="text" id="category-name" value="" /> \
           <p>Matching: \
               <br/> \
               <label for="normal-removal"><input type="radio" id="normal-removal" name="mass-categorization-removal" value="1" checked="checked"/>General (does not account for piped categories)</label> \
	       <br/> \
               <label for="broad-removal"><input type="radio" id="broad-removal" name="mass-categorization-removal"/ value="2">Broad (also match possible further characters of the specified category e.g. Foo and Foo123, but takes care of pipes)</label> \
           <p> \
           <br/> \
               <label for="no-include"><input type="checkbox" id="no-include" name="mass-categorization-noinclude"/ value="1">Do not include in transclusion (for templates)</label> \
           </p> \
           <br/> \
           <p>Put the name of each page you want to categorize on a <b>separate line</b>.</p> \
               <textarea style="height: 20em; width: 80%;" id="text-categorization"/> \
       </fieldset> \
       <div id="text-error-output" style="height:10em; width: 80%; margin: 5px auto 0px auto; color: #000; background-color: #ffbfbf; height: 150px; border: 1px solid black; font-weight: bold; overflow: scroll">Any errors encountered will appear below<br/></div> \
    </form>',
    delay = window.massCategorizationDelay || 500;
 
    //Support for Monobook
    if (mw.config.get('skin') === 'monobook') {
        mw.util.addPortletLink('p-tb', '#', 'Mass Categorization', 't-mc');
    } else {
        $('#my-tools-menu').prepend('<li class="custom"><a style="cursor:pointer" id="t-mc">Mass Categorization</a></li>');
    }
 
    document.getElementById('t-mc').addEventListener('click', function () {
        $.showCustomModal('Mass Categorization', FormMC, {
            id: 'form-categorization',
            width: 500,
            buttons: [{  
                message: 'Cancel',
                handler: function() {
                    $('#form-categorization').closeModal();
                }
            }, {
                message: 'Add category contents',
                defaultButton: true,
                handler: function() {
                    addCategoryContents();
                }
            }, {
                id: 'start-button',
                message: 'Initiate',
                defaultButton: true,
                handler: function () {
                    init(); 
                }
            }]
        });
    });
 
    function addCategoryContents() {
        var category = prompt('Please enter the category name (no category prefix):').replace('_',' ');
        new mw.Api().get({
            action: 'query',
            list: 'categorymembers',
            cmtitle: "Category:"+category,
            cmlimit: 5000
        })
        .done(function(d) {
            if (!d.error) {
                var data = d.query;
                if (data.categorymembers) {
                    for (var i in data.categorymembers) {
                        $('#text-categorization').append(data.categorymembers[i].title+'\n');
                    }
                }
                else {
                    $('#text-error-output').append(category + ' does not exist!\n');
                }
            }
            else {
                $('#text-error-output').append('Failed to get contents of '+ category +' : '+ d.error.code +'<br/>');
            }
        })
        .fail(function() {
            $('#text-error-output').append('Failed to get contents of '+ category +'!<br/>');
        });
    } 
 
    function init() {
        var catName = document.getElementById('category-name').value,
            txt = document.getElementById('text-categorization'),
            pages = txt.value.split('\n'),	
            page = pages[0];
 
        if (!catName) {
            alert('Please enter the category name!');
            return;
        }
 
        document.getElementById('start-button').setAttribute('disabled','disabled');
 
        if (!page) {
            document.getElementById('start-button').removeAttribute("disabled");
            $.showCustomModal('Finished!', 'Nothing left to do, or next line is blank.', {
                id: 'form-complete',
                width: 200,
                buttons: [{
                    message: 'Close',
                    defaultButton: true,
                    handler: function() {
                        $('#form-complete').closeModal();
                    }
                }]
            });
        } 
        else {
            categorize(page,catName);  
        }
        pages = pages.slice(1,pages.length);
        txt.value = pages.join('\n');
    }
 
    function categorize(pageToCat,cat) {
        var actionVal = $('#select-mc').val();
        if (actionVal == 1) {
            //add category
            new mw.Api().get({
                format: 'json',
                action: 'query',
                titles: pageToCat,
                prop: 'categories'
            })
            .done(function(d) {
                var pages = d.query.pages;    
                for (var page in pages) {
                    var mPage = pages[page],
                        knownCats = [];
                    if (mPage.categories) {
                        for (var i = 0; i < mPage.categories.length; i++) {
                            knownCats.push(mPage.categories[i].title);
                        }
                    }
                }
                cat = 'Category:'+ cat.charAt(0).toUpperCase() + cat.substring(1);
                if (knownCats.indexOf(cat) === -1 || knownCats === 'undefined') {
                    var sPrefix="";
                    var sSuffix = "";
                    if ($('input[name=mass-categorization-noinclude]').prop('checked')){
                    //    sPrefix ="<noinclude>\n";
                    //    sSuffix = "<\/noinclude>";
                        sPrefix ="\n--";
                        sSuffix = "";
                    }
                    var config = {
                        format: 'json',
                        action: 'edit',
                        title: pageToCat,
                        summary: 'Adding categories',
                        nocreate: '',
                        appendtext: sPrefix + '['+'['+cat+']]'+ sSuffix,
                        bot: true,
                        token: mw.user.tokens.get('editToken')
                    };
 
                    if (mw.config.get("wgUserGroups").join(' ').indexOf('bot') == -1)
                        delete config.bot;
 
                    $.ajax({
                        url: mw.util.wikiScript('api'),
                        data: config,
                        dataType: 'json',
                        type: 'POST',
                        success: function(d) {
                            if (!d.error) {
                                console.log('Category successfully added to '+pageToCat+'!');
                            } 
                            else {
                                console.log('Failed to add category to '+pageToCat+': '+ d.error.code);
                                $('#text-error-output').append('Failed to add category to '+pageToCat+': '+ d.error.code +'<br/>');
                            }
                        },
                        error: function() {
                            console.log('Failed to add category to '+pageToCat+'!');
                            $('#text-error-output').append('Failed to add category to '+pageToCat+'!<br/>');
                        }
                    });
                }
                else { 
                    console.log(pageToCat+ ' already has the category '+cat.substring(9)+' or an error was encountered. '+pageToCat+' has been skipped.');
                    $('#text-error-output').append(pageToCat+ ' already has the category '+cat.substring(9)+' or an error was encountered. '+pageToCat+' has been skipped.<br/>');
                }
            })
            .fail(function() {
                console.log('Category check failed for '+pageToCat+'! It has been skipped.');
                $('#text-error-output').append('Category check failed for '+pageToCat+'! It has been skipped.<br/>');
            });
        }
 
        if (actionVal == 2) {
            //remove category
 
            //get page contents
            new mw.Api().get({
                action: 'query',
                prop: 'revisions',
                rvprop: 'content',
                titles: pageToCat
            })
            .done(function(d) {
                if (!d.error) {
                    for (var i in d.query.pages) {
                        if (d.query.pages[i].revisions) {
                            var content = d.query.pages[i].revisions[0]["*"];
                        }
                        else {
                            $('#text-error-output').append('Page '+pageToCat+' does not exist!<br/>');
                            return;
                        }
                    }         
 
                    //remove old category
                    var regex = new RegExp ("\\[\\[Category:"+cat+"\\]\\]","gi");
                    var sRegEx = "\\[\\[Category:"+cat+"\\|?.*?\\]\\]";
                    if ($('input[name=mass-categorization-removal]:checked').val() == 2){
                        regex = new RegExp (sRegEx,"gi");
                    }
                    if ($('input[name=mass-categorization-noinclude]').prop('checked')){
                         regex = new RegExp ("\\<noinclude\\>\\s*"+sRegEx+"\\s*\\<\/noinclude\\>","gi");
                    }
                    var changedContent = content.replace(regex,'');
                    cat = 'Category:'+ cat.charAt(0).toUpperCase() + cat.substring(1);
 
                    //don't submit if new and old contents are equal (no category found)
                    if (changedContent.valueOf() == content.valueOf()) {
                        $('#text-error-output').append('Category not found on '+pageToCat+'!<br/>');
                        return;
                    }
 
                    //submit new page
                    var config = {
                        format: 'json',
                        action: 'edit',
                        watchlist: 'nochange',
                        title: pageToCat,
                        summary: 'Removing category ['+'['+cat+'|'+cat.substring(9)+']] ',
                        nocreate: '',
                        text: changedContent,
                        bot: true,
                        token: mw.user.tokens.get('editToken')
                    };
 
                    if (mw.config.get("wgUserGroups").join(' ').indexOf('bot') == -1)
                        delete config.bot;
 
                    $.ajax({
                        url: mw.util.wikiScript('api'),
                        data: config,
                        dataType: 'json',
                        type: 'POST',
                        success: function(d) {
                            if (!d.error) {
                                console.log('Category successfully removed from '+pageToCat+'!');
                            } 
                            else {
                                console.log('Failed to remove category from '+pageToCat+': '+ d.error.code);
                                $('#text-error-output').append('Failed to remove category from '+pageToCat+': '+ d.error.code +'<br/>');
                            }
                        },
                        error: function() {
                            console.log('Failed to remove category from '+pageToCat+'!');
                            $('#text-error-output').append('Failed to remove category from '+pageToCat+'!<br/>');
                        }
                    });
                }
                else {
                    console.log('Failed to get contents of page: '+ d.error.code);
                    $('#text-error-output').append('Failed to get contents of '+pageToCat+': '+ d.error.code +'<br/>');
                }
            })
            .fail(function() {
                console.log('Failed to get contents of '+pageToCat+'!');
                $('#text-error-output').append('Failed to get contents of '+pageToCat+'!<br/>');
            });
        }
        /* currently broken
    if (actionVal == 3) {
    //replace category
    var newCat = prompt('Please enter the replacement category name (no category prefix):');
    if (!newCat) {
      alert('No name entered!');
      document.getElementById('start-button').removeAttribute("disabled");
      return;
    }
 
      //get page contents
      new mw.Api().get({
      action: 'query',
      prop: 'revisions',
      rvprop: 'content',
      titles: pageToCat
      })
      .done(function(d) {
	if (!d.error) {
          for (var i in d.query.pages) {
            if (d.query.pages[i].revisions) {
	       var content = d.query.pages[i].revisions[0]["*"];
            }
            else {
	      $('#text-error-output').append('Page '+pageToCat+' does not exist!<br/>');
	      return;
            }
          }         
 
	  //replace old category
          var regex = new RegExp ("\\[\\[Category:"+cat+"\\]\\]","gi");
          if ($('input[name=mass-categorization-removal]:checked').val() == 2)
            regex = new RegExp ("\\[\\[Category:"+cat+"\\|?.*?\\]\\]","gi");
 
          newCat = 'Category:'+ newCat.charAt(0).toUpperCase() + newCat.substring(1);
	  var changedContent = content.replace(regex,'[['+newCat+']]');
	  cat = 'Category:'+ cat.charAt(0).toUpperCase() + cat.substring(1);
 
 
	  //don't submit if new and old contents are equal (no category found)
	  if (changedContent.valueOf() == content.valueOf()) {
	    $('#text-error-output').append('Category not found on '+pageToCat+'!<br/>');
	    return;
	  }
 
	  //submit new page
          var config = {
            format: 'json',
            action: 'edit',
            watchlist: 'nochange',
            title: pageToCat,
            summary: 'Replacing category ['+'['+cat+'|'+cat.substring(9)+']] with ['+'['+newCat+'|'+newCat.substring(9)+']]',
            nocreate: '',
	    text: changedContent,
	    bot: true,
            token: mw.user.tokens.get('editToken')
          };
 
          if (mw.config.get("wgUserGroups").indexOf('bot') == -1)
            delete config.bot;
 
          $.ajax({
              url: mw.util.wikiScript('api'),
              data: config,
              dataType: 'json',
              type: 'POST',
              success: function(d) {
                if (!d.error) {
                  console.log('Category successfully replaced on '+pageToCat+'!');
                } 
	        else {
	          console.log('Failed to remove category from '+pageToCat+': '+ d.error.code);
	          $('#text-error-output').append('Failed to replace category on '+pageToCat+': '+ d.error.code +'<br/>');
                }
              },
              error: function() {
                console.log('Failed to remove category from '+pageToCat+'!');
	        $('#text-error-output').append('Failed to replace category on '+pageToCat+'!<br/>');
              }
          });
	}
	else {
	  console.log('Failed to get contents of page: '+ d.error.code);
	  $('#text-error-output').append('Failed to get contents of '+pageToCat+': '+ d.error.code +'<br/>');
        }
     })
     .fail(function() {
       console.log('Failed to get contents of '+pageToCat+'!');
       $('#text-error-output').append('Failed to get contents of '+pageToCat+'!<br/>');
     });
    }
   */
        setTimeout(init,delay);
    }
}) (this.jQuery, this.mediaWiki);//<nowiki>
/* 
* Mass Categorization
* @description (De)Categorize listed multiple pages.
* @author Ozuzanna
* @TODO fix replace
* Added option for <noinclude></include> (Dessamator)
*/
 
;(function($, mw) {
 
    if ($('#t-mc').length)
        return;
 
    //<option value="3">Replace</option> \
 
    var FormMC = '\
    <form method="" name="" class="WikiaForm "> \
       <fieldset> \
           <p>Mode: \
               <select id="select-mc"> \
                 <option value="1">Add</option> \
                 <option value="2">Remove</option> \
               </select> \
           </p> \
           <p>Category: \
               <input type="text" id="category-name" value="" /> \
           <p>Matching: \
               <br/> \
               <label for="normal-removal"><input type="radio" id="normal-removal" name="mass-categorization-removal" value="1" checked="checked"/>General (does not account for piped categories)</label> \
	       <br/> \
               <label for="broad-removal"><input type="radio" id="broad-removal" name="mass-categorization-removal"/ value="2">Broad (also match possible further characters of the specified category e.g. Foo and Foo123, but takes care of pipes)</label> \
           <p> \
           <br/> \
               <label for="no-include"><input type="checkbox" id="no-include" name="mass-categorization-noinclude"/ value="1">Do not include in transclusion (for templates)</label> \
           </p> \
           <br/> \
           <p>Put the name of each page you want to categorize on a <b>separate line</b>.</p> \
               <textarea style="height: 20em; width: 80%;" id="text-categorization"/> \
       </fieldset> \
       <div id="text-error-output" style="height:10em; width: 80%; margin: 5px auto 0px auto; color: #000; background-color: #ffbfbf; height: 150px; border: 1px solid black; font-weight: bold; overflow: scroll">Any errors encountered will appear below<br/></div> \
    </form>',
    delay = window.massCategorizationDelay || 500;
 
    //Support for Monobook
    if (mw.config.get('skin') === 'monobook') {
        mw.util.addPortletLink('p-tb', '#', 'Mass Categorization', 't-mc');
    } else {
        $('#my-tools-menu').prepend('<li class="custom"><a style="cursor:pointer" id="t-mc">Mass Categorization</a></li>');
    }
 
    document.getElementById('t-mc').addEventListener('click', function () {
        $.showCustomModal('Mass Categorization', FormMC, {
            id: 'form-categorization',
            width: 500,
            buttons: [{  
                message: 'Cancel',
                handler: function() {
                    $('#form-categorization').closeModal();
                }
            }, {
                message: 'Add category contents',
                defaultButton: true,
                handler: function() {
                    addCategoryContents();
                }
            }, {
                id: 'start-button',
                message: 'Initiate',
                defaultButton: true,
                handler: function () {
                    init(); 
                }
            }]
        });
    });
 
    function addCategoryContents() {
        var category = prompt('Please enter the category name (no category prefix):').replace('_',' ');
        new mw.Api().get({
            action: 'query',
            list: 'categorymembers',
            cmtitle: "Category:"+category,
            cmlimit: 5000
        })
        .done(function(d) {
            if (!d.error) {
                var data = d.query;
                if (data.categorymembers) {
                    for (var i in data.categorymembers) {
                        $('#text-categorization').append(data.categorymembers[i].title+'\n');
                    }
                }
                else {
                    $('#text-error-output').append(category + ' does not exist!\n');
                }
            }
            else {
                $('#text-error-output').append('Failed to get contents of '+ category +' : '+ d.error.code +'<br/>');
            }
        })
        .fail(function() {
            $('#text-error-output').append('Failed to get contents of '+ category +'!<br/>');
        });
    } 
 
    function init() {
        var catName = document.getElementById('category-name').value,
            txt = document.getElementById('text-categorization'),
            pages = txt.value.split('\n'),	
            page = pages[0];
 
        if (!catName) {
            alert('Please enter the category name!');
            return;
        }
 
        document.getElementById('start-button').setAttribute('disabled','disabled');
 
        if (!page) {
            document.getElementById('start-button').removeAttribute("disabled");
            $.showCustomModal('Finished!', 'Nothing left to do, or next line is blank.', {
                id: 'form-complete',
                width: 200,
                buttons: [{
                    message: 'Close',
                    defaultButton: true,
                    handler: function() {
                        $('#form-complete').closeModal();
                    }
                }]
            });
        } 
        else {
            categorize(page,catName);  
        }
        pages = pages.slice(1,pages.length);
        txt.value = pages.join('\n');
    }
 
    function categorize(pageToCat,cat) {
        var actionVal = $('#select-mc').val();
        if (actionVal == 1) {
            //add category
            new mw.Api().get({
                format: 'json',
                action: 'query',
                titles: pageToCat,
                prop: 'categories'
            })
            .done(function(d) {
                var pages = d.query.pages;    
                for (var page in pages) {
                    var mPage = pages[page],
                        knownCats = [];
                    if (mPage.categories) {
                        for (var i = 0; i < mPage.categories.length; i++) {
                            knownCats.push(mPage.categories[i].title);
                        }
                    }
                }
                cat = 'Category:'+ cat.charAt(0).toUpperCase() + cat.substring(1);
                if (knownCats.indexOf(cat) === -1 || knownCats === 'undefined') {
                    var sPrefix="";
                    var sSuffix = "";
                    if ($('input[name=mass-categorization-noinclude]').prop('checked')){
                    //    sPrefix ="<noinclude>\n";
                    //    sSuffix = "<\/noinclude>";
                        sPrefix ="\n--";
                        sSuffix = "";
                    }
                    var config = {
                        format: 'json',
                        action: 'edit',
                        title: pageToCat,
                        summary: 'Adding category',
                        nocreate: '',
                        appendtext: sPrefix + '['+'['+cat+']]'+ sSuffix,
                        bot: true,
                        token: mw.user.tokens.get('editToken')
                    };
 
                    if (mw.config.get("wgUserGroups").join(' ').indexOf('bot') == -1)
                        delete config.bot;
 
                    $.ajax({
                        url: mw.util.wikiScript('api'),
                        data: config,
                        dataType: 'json',
                        type: 'POST',
                        success: function(d) {
                            if (!d.error) {
                                console.log('Category successfully added to '+pageToCat+'!');
                            } 
                            else {
                                console.log('Failed to add category to '+pageToCat+': '+ d.error.code);
                                $('#text-error-output').append('Failed to add category to '+pageToCat+': '+ d.error.code +'<br/>');
                            }
                        },
                        error: function() {
                            console.log('Failed to add category to '+pageToCat+'!');
                            $('#text-error-output').append('Failed to add category to '+pageToCat+'!<br/>');
                        }
                    });
                }
                else { 
                    console.log(pageToCat+ ' already has the category '+cat.substring(9)+' or an error was encountered. '+pageToCat+' has been skipped.');
                    $('#text-error-output').append(pageToCat+ ' already has the category '+cat.substring(9)+' or an error was encountered. '+pageToCat+' has been skipped.<br/>');
                }
            })
            .fail(function() {
                console.log('Category check failed for '+pageToCat+'! It has been skipped.');
                $('#text-error-output').append('Category check failed for '+pageToCat+'! It has been skipped.<br/>');
            });
        }
 
        if (actionVal == 2) {
            //remove category
 
            //get page contents
            new mw.Api().get({
                action: 'query',
                prop: 'revisions',
                rvprop: 'content',
                titles: pageToCat
            })
            .done(function(d) {
                if (!d.error) {
                    for (var i in d.query.pages) {
                        if (d.query.pages[i].revisions) {
                            var content = d.query.pages[i].revisions[0]["*"];
                        }
                        else {
                            $('#text-error-output').append('Page '+pageToCat+' does not exist!<br/>');
                            return;
                        }
                    }         
 
                    //remove old category
                    var regex = new RegExp ("\\[\\[Category:"+cat+"\\]\\]","gi");
                    var sRegEx = "\\[\\[Category:"+cat+"\\|?.*?\\]\\]";
                    if ($('input[name=mass-categorization-removal]:checked').val() == 2){
                        regex = new RegExp (sRegEx,"gi");
                    }
                    if ($('input[name=mass-categorization-noinclude]').prop('checked')){
                         regex = new RegExp ("\\<noinclude\\>\\s*"+sRegEx+"\\s*\\<\/noinclude\\>","gi");
                    }
                    var changedContent = content.replace(regex,'');
                    cat = 'Category:'+ cat.charAt(0).toUpperCase() + cat.substring(1);
 
                    //don't submit if new and old contents are equal (no category found)
                    if (changedContent.valueOf() == content.valueOf()) {
                        $('#text-error-output').append('Category not found on '+pageToCat+'!<br/>');
                        return;
                    }
 
                    //submit new page
                    var config = {
                        format: 'json',
                        action: 'edit',
                        watchlist: 'nochange',
                        title: pageToCat,
                        summary: 'Removing category ['+'['+cat+'|'+cat.substring(9)+']] ',
                        nocreate: '',
                        text: changedContent,
                        bot: true,
                        token: mw.user.tokens.get('editToken')
                    };
 
                    if (mw.config.get("wgUserGroups").join(' ').indexOf('bot') == -1)
                        delete config.bot;
 
                    $.ajax({
                        url: mw.util.wikiScript('api'),
                        data: config,
                        dataType: 'json',
                        type: 'POST',
                        success: function(d) {
                            if (!d.error) {
                                console.log('Category successfully removed from '+pageToCat+'!');
                            } 
                            else {
                                console.log('Failed to remove category from '+pageToCat+': '+ d.error.code);
                                $('#text-error-output').append('Failed to remove category from '+pageToCat+': '+ d.error.code +'<br/>');
                            }
                        },
                        error: function() {
                            console.log('Failed to remove category from '+pageToCat+'!');
                            $('#text-error-output').append('Failed to remove category from '+pageToCat+'!<br/>');
                        }
                    });
                }
                else {
                    console.log('Failed to get contents of page: '+ d.error.code);
                    $('#text-error-output').append('Failed to get contents of '+pageToCat+': '+ d.error.code +'<br/>');
                }
            })
            .fail(function() {
                console.log('Failed to get contents of '+pageToCat+'!');
                $('#text-error-output').append('Failed to get contents of '+pageToCat+'!<br/>');
            });
        }
        /* currently broken
    if (actionVal == 3) {
    //replace category
    var newCat = prompt('Please enter the replacement category name (no category prefix):');
    if (!newCat) {
      alert('No name entered!');
      document.getElementById('start-button').removeAttribute("disabled");
      return;
    }
 
      //get page contents
      new mw.Api().get({
      action: 'query',
      prop: 'revisions',
      rvprop: 'content',
      titles: pageToCat
      })
      .done(function(d) {
	if (!d.error) {
          for (var i in d.query.pages) {
            if (d.query.pages[i].revisions) {
	       var content = d.query.pages[i].revisions[0]["*"];
            }
            else {
	      $('#text-error-output').append('Page '+pageToCat+' does not exist!<br/>');
	      return;
            }
          }         
 
	  //replace old category
          var regex = new RegExp ("\\[\\[Category:"+cat+"\\]\\]","gi");
          if ($('input[name=mass-categorization-removal]:checked').val() == 2)
            regex = new RegExp ("\\[\\[Category:"+cat+"\\|?.*?\\]\\]","gi");
 
          newCat = 'Category:'+ newCat.charAt(0).toUpperCase() + newCat.substring(1);
	  var changedContent = content.replace(regex,'[['+newCat+']]');
	  cat = 'Category:'+ cat.charAt(0).toUpperCase() + cat.substring(1);
 
 
	  //don't submit if new and old contents are equal (no category found)
	  if (changedContent.valueOf() == content.valueOf()) {
	    $('#text-error-output').append('Category not found on '+pageToCat+'!<br/>');
	    return;
	  }
 
	  //submit new page
          var config = {
            format: 'json',
            action: 'edit',
            watchlist: 'nochange',
            title: pageToCat,
            summary: 'Replacing category ['+'['+cat+'|'+cat.substring(9)+']] with ['+'['+newCat+'|'+newCat.substring(9)+']]',
            nocreate: '',
	    text: changedContent,
	    bot: true,
            token: mw.user.tokens.get('editToken')
          };
 
          if (mw.config.get("wgUserGroups").indexOf('bot') == -1)
            delete config.bot;
 
          $.ajax({
              url: mw.util.wikiScript('api'),
              data: config,
              dataType: 'json',
              type: 'POST',
              success: function(d) {
                if (!d.error) {
                  console.log('Category successfully replaced on '+pageToCat+'!');
                } 
	        else {
	          console.log('Failed to remove category from '+pageToCat+': '+ d.error.code);
	          $('#text-error-output').append('Failed to replace category on '+pageToCat+': '+ d.error.code +'<br/>');
                }
              },
              error: function() {
                console.log('Failed to remove category from '+pageToCat+'!');
	        $('#text-error-output').append('Failed to replace category on '+pageToCat+'!<br/>');
              }
          });
	}
	else {
	  console.log('Failed to get contents of page: '+ d.error.code);
	  $('#text-error-output').append('Failed to get contents of '+pageToCat+': '+ d.error.code +'<br/>');
        }
     })
     .fail(function() {
       console.log('Failed to get contents of '+pageToCat+'!');
       $('#text-error-output').append('Failed to get contents of '+pageToCat+'!<br/>');
     });
    }
   */
        setTimeout(init,delay);
    }
}) (this.jQuery, this.mediaWiki);