Community Central
Community Central

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
//__NOWYSIWYG__ <source lang="javascript">
 
/* Imports */
importArticles({
    type: 'script',
    articles: [
        'u:dev:AjaxBatchDelete.js',
        'u:dev:AjaxDelete/code.js',
        'u:dev:AjaxEdit/code.js',
        'u:dev:AjaxUndo/code.js',
        'u:dev:AnalyticsShortcut.js',
        'u:dev:AnnouncementsIgnore.js',
        'u:dev:BlogLink/code.js',
        'u:dev:CategoryQuickRemove.js',
        'u:dev:CommentPreview/code.js',
        'u:dev:EditConflictAlert/code.js',
        'u:dev:FindAndReplace/code.js',
        'u:dev:GalleryCaptions/code.js',
        'u:dev:ManageReferences/code.js',
        'u:dev:MassBlock/code.js',
		'u:dev:MassCategorization/code.js',
        'u:dev:MassEdit/code.js',
        'u:dev:MobileEditor.js',
        'u:dev:ModernLightbox.js',
        'u:dev:ModernProfile/EditButton.js',
        'u:dev:MultiUpload.js',
        'u:dev:Nuke/code.js',
        'u:dev:NullEditButton/code.js',
        'u:dev:PurgeButton/code.js',
        'u:dev:QQX/code.js',
        'u:dev:RandomPageShortcut/code.js',
        'u:dev:RedirectManagement/code.js',
        'u:dev:RefreshThreads/code.js',
        'u:dev:RevealAnonIP/code.js',
        'u:dev:Rollback/code.js',
        'u:dev:SandboxLink/code.js',
        'u:dev:SandboxTab/code.js',
        'u:dev:SeeMoreActivityButton/code.js',
        'u:dev:SOAPReport.js',
        'u:dev:UserActivityTab/code.js',
        'u:dev:View Raw/code.js',
        'u:dev:View Source/code.js',
        'u:dev:WallGreetingButton/code.js',
        'u:dev:WHAM/code.2.js',
        'u:dev:WLHEditLinks/code.js',
    ]
});
 
//Change text direction in arabic wikis
if ( mw.config.get('wgContentLanguage') === 'ar' ) mw.util.addCSS( 'body { direction: rtl } ' );
 
//RemoveBlueOutline
/* It basically removes unnecessary blue outlines except when tabbing */
 
importArticles({
    type: 'style',
    articles: [
        'u:dev:RemoveBlueOutline.css'
    ]
});
function handleFirstTab(e) {
    if (e.keyCode === 9) { // the "I am a keyboard user" key
        document.body.classList.add('user-is-tabbing');
        window.removeEventListener('keydown', handleFirstTab);
    }
}
 
window.addEventListener('keydown', handleFirstTab);
 
var didScroll;
var lastScrollTop = 0;
var delta = 5;
var navbarHeight = $('div#globalNavigation').outerHeight();
 
$(window).scroll(function(event){
    didScroll = true;
});
 
setInterval(function() {
    if (didScroll) {
        hasScrolled();
        didScroll = false;
    }
}, 250);
 fans
function hasScrolled() {
    var st = $(this).scrollTop();
 
    if(Math.abs(lastScrollTop - st) <= delta)
        return;
 
    if (st > lastScrollTop && st > navbarHeight){
        $('div#globalNavigation').removeClass('wds-global-navigation').addClass('wds-global-navigation-up');
    } else {
        if(st + $(window).height() < $(document).height()) {
            $('div#globalNavigation').removeClass('wds-global-navigation-up').addClass('wds-global-navigation');
        }
    }
 
    lastScrollTop = st;
}
 
if (mw.config.get("wgUserGroups").indexOf('sysop') > -1) {
    window.massCategorizationDelay = 1000;
    importArticle({
        type: 'script',
        article: 'u:dev:MediaWiki:MassCategorization/code.js'
    });
}
 
if (typeof(namespaceNotifyWiki) == "undefined") {     var namespaceNotifyWiki = 'vstf'; } if (typeof(namespaceNotifyNamespace) == "undefined") {     var namespaceNotifyNamespace = 114; } if (typeof(namespaceNotifyScriptLocation) == "undefined") {     var namespaceNotifyScriptLocation = "ul.tools"; }   function pagesUpdate() {       $('head').append('<script src="//' + namespaceNotifyWiki + '.wikia.com/api.php?action=query&list=recentchanges&rclimit=1&rcprop=title|comment|ids|user&rctype=edit&rcnamespace=' + namespaceNotifyNamespace + '&format=json&callback=getData" onload="this.parentNode.removeChild(this);">'); }   function getData(dis){     $('#NamespaceNotify').html('<a id="NSNotifyLink" href="//' + namespaceNotifyWiki + '.wikia.com/wiki/?diff=' + dis.query.recentchanges[0].revid + '" title="“' + dis.query.recentchanges[0].comment + '”">' + dis.query.recentchanges[0].user + ' changed ' + dis.query.recentchanges[0].title + '</a>')   };   $(document).ready(function(){     if (mw.config.get('skin') == "oasis") {         $(namespaceNotifyScriptLocation).append('<li id="NamespaceNotify"></li>');         $('head').append('<style type="text/css">a#NSNotifyLink:visited {color:#77F !important;}</style>');     } else if (mw.config.get('skin') == "monobook") {         $('#p-personal .pBody ul:first-child').prepend('<li id="NamespaceNotify" style="text-transform:none;color:#FF8C00"></li>');         $('head').append('<style type="text/css">#p-personal li a#NSNotifyLink {color:#F00 !important;} #p-personal li a#NSNotifyLink:visited {color:#77F !important;}</style>');     }           pagesUpdate(); })
 
importArticles({
    type: 'style',
    articles: [
        'u:community:User:JustLeafy/DarkMeta/community.css',
        'u:community:User:JustLeafy/DarkMeta/dev.css',
    ]
});
 
window.WHAMBotMe = true;
window.WHAMBotReason = "Cleanup";
window.WHAMDelay = 100;
window.WHAMDeleteReason = "Housekeeping.";
window.WHAMBlockReason = "Vandalism";
 
/**
 * @name        MultiUpload
 * @author      Gguigui1, KhangND
 * @desc        Allows selecting multiple files directly from the dialog box and upload them
 * <nowiki>
 */
mw.loader.using([
    'mediawiki',
    'mediawiki.user',
    'jquery.client',
    'ext.wikia.LinkSuggest'
], function() {
    var groups  = mw.config.get('wgUserGroups').join(),
        config = mw.config.get([
            'wgCanonicalSpecialPageName',
            'wgNamespaceNumber',
            'wgTitle',
            'wgUserLanguage',
            'wgUserName'
        ]);
 
    // load protections
    if(window.MultiUploadLoaded
    || config.wgUserName === null
    || !/autoconfirmed/.test(groups)) {
        return;
    } window.MultiUploadLoaded = true;
 
    var storage = 'MultiUploadLicenses';
    var content = $('#mw-content-text');
    var allowTypes = [
        '.png', '.gif', '.jpg', '.jpeg', '.ico', '.pdf',
        '.svg', '.odt', '.ods', '.odp', '.odg', '.odc',
        '.odf', '.odi', '.odm', '.ogg', '.ogv', '.oga'
    ];
    var style = {
        block: {
            display: 'inline-block',
            margin: '0 8px'
        },
        textarea: {
            width: '100%',
            height: 150,
            boxSizing: 'border-box',
            resize: 'none'
        }
    };
 
    function loadMWMessagesIfMissing(messages) {
        var deferred = $.Deferred(),
            missingMessages = messages.filter(function (message) { return !mw.messages.exists(message); });
        if (!missingMessages.length) {
            deferred.resolve();
        } else {
            $.get(mw.util.wikiScript('api'), {
                format: 'json',
                action: 'query',
                meta: 'allmessages',
                ammessages: missingMessages.join('|'),
                amlang: config.wgUserLanguage
            }).then(function (data) {
                if ($.isArray(data.query.allmessages)) {
                    $.each(data.query.allmessages, function (_, message) {
                        if (message.missing !== '') {
                            mw.messages.set(message.name, message['*']);
                        }
                    });
                }
                deferred.resolve();
            }, function () {
                // Silently swallow failures; we don't want error reporting to stall just because we failed to fetch some messages.
                deferred.resolve();
            });
        }
        return deferred;
    }
 
    var MultiUpload = {
        input: $(),  // available on init
        editor: $(), // available on init
        button: $(), // available on init
        fileCount: 0,// available on create
        preload: function(i18n) {
            $.extend(this, window.MultiUploadoption || {});
            this.i18n = i18n;
 
            // prepends a link in My Tools menu
            $('<li>', {
                'class': 'custom',
                prependTo: '#my-tools-menu',
                append: $('<a>', {
                    href: mw.util.getUrl('Special:MultiUpload'),
                    text: this.i18n.msg('title').plain()
                })
            });
 
            // creates Special page
            if(
                (config.wgNamespaceNumber === -1 && config.wgTitle === 'MultiUpload') ||
                (config.wgCanonicalSpecialPageName === 'Blankpage' && /MultiUpload/.test($.getUrlVar('blankspecial')))
            ) {
                $('.page-header__title').text(this.i18n.msg('title').plain());
                $('title').text(this.i18n.msg('title').plain());
                this.init();
                content.after(
                    $('<div>', {
                        id: 'mu-footer',
                        css: {
                            textAlign: 'center',
                            fontSize: 10,
                            borderTop: '1px solid',
                            marginTop: 10
                        },
                        text: this.i18n.msg('poweredby').plain() + ' ',
                        append: $('<a>', {
                            href: '//dev.fandom.com/wiki/MultiUpload',
                            text: 'MultiUpload'
                        })
                    })
                );
            }
        },
        init: function() {
            content.empty().append([
                $('<input>', {
                    id: 'fileinput',
                    type: 'file',
                    multiple: true,
                    accept: allowTypes.join(),
                }),
                $('<div>', {
                    id: 'editor',
                    css: { display: 'none' },
                }),
                $('<button>', {
                    id: 'go',
                    text: this.i18n.msg('update').plain(),
                    click: $.proxy(this.getLicenses, this)
                })
            ]);
            this.input = $('#fileinput');
            this.editor = $('#editor');
            this.button = $('#go');
        },
        notify: function(message, type) {
            new BannerNotification(message, type, null).show();
        },
        getLicenses: function() {
            var data = localStorage.getItem(storage);
            if(data !== null) {
                this.create(data);
                return;
            }
 
            $.get(mw.util.wikiScript('api'), {
                action: 'query',
                meta: 'allmessages',
                ammessages: 'Licenses',
                format: 'json'
            }).success(
                $.proxy(this.create, this)
            ).error($.proxy(function(data) {
                this.notify(this.i18n.msg('errorapi').plain() + ' : ' + data.error.info, 'error');
            }), this);
        },
        create: function(data) {
            // conditions
            var formatError = false;
            this.fileCount = this.input[0].files.length;
 
            $(this.input[0].files).each(function(i, file) {
                if(!new RegExp(allowTypes.join('|\\'), 'i').test(file.name)) {
                    formatError = true;
                    return;
                }
            });
            if (formatError) {
                this.notify(this.i18n.msg('fileformat').plain(), 'warn');
                return;
            }
            if (!this.input[0].files) {
                this.notify(this.i18n.msg('browsersupport').plain(), 'notify');
                return;
            }
            if (this.fileCount === 0) {
                this.notify(this.i18n.msg('nofile').plain(), 'warn');
                return;
            }
            if(!this.max
            ||  this.max < 0
            ||  this.max > 101
            || typeof this.max !== 'number') {
                if (/staff|helper|util|bot-global/.test(groups)) {
                    this.max = 200;
                } else if (/bureaucrat|bot/.test(groups)) {
                    this.max = 100;
                } else if (/sysop/.test(groups)) {
                    this.max = 100;
                } else if (/rollback/.test(groups)) {
                    this.max = 30;
                } else {
                    this.max = 20;
                }
            }
            if (!this.max) {
                this.notify(this.i18n.msg('problem').plain(), 'error');
                return;
            }
 
            // creates form
            data = typeof data === 'object'
                ? data.query.allmessages[0]['*'].trim()
                : data;
            localStorage.setItem(storage, data); // retrieves licenses 1 time only
            var licenses = data.split('\n');
            var limit = this.max < this.fileCount ? this.max : this.fileCount;
            for (i = 1; i <= limit; i++) {
                $('<fieldset>', {
                    id: 'field' + i,
                    appendTo: this.editor,
                    append: [
                        $('<legend>', {
                            text: this.i18n.msg('imagename').plain() + ' ' + i
                        }),
                        $('<div>', {
                            css: style.block,
                            text: this.i18n.msg('filename').plain(),
                            append: $('<input>', {
                                type: 'text',
                                id: 'imagename' + i,
                                'class': 'imagename',
                                val: this.input[0].files[i - 1].name
                            })
                        }),
                        $('<div>', {
                            css: style.block,
                            text: this.i18n.msg('licensetext').plain(),
                            append: $('<select>', {
                                id: 'licence' + i,
                                'class': 'licence',
                                append: $('<option>', {
                                    val: 'none',
                                    text: this.i18n.msg('nolicence').plain()
                                })
                            })
                        }),
                        $('<div>', {
                            id: 'progress' + i,
                            css: style.block
                        })
                    ]
                });
            }
            for (i = 0; i < licenses.length; i++) {
                if (licenses[i].indexOf('**') === 0) {
                    var name = licenses[i].split('|')[0].replace('**', '').trim(),
                        text = licenses[i].split('|')[1];
                    $('<option>', {
                        val: name,
                        text: text,
                        selected: name == this.defaultlicence,
                        appendTo: $('.licence').find('optgroup:last-child')
                    });
                } else {
                    $('<optgroup>', {
                        label: licenses[i].replace('*', '').trim(),
                        appendTo: $('.licence')
                    });
                }
            }
            $('<div>', {
                appendTo: this.editor,
                text: this.i18n.msg('filedescription').plain()
            }),
            $('<textarea>', {
                appendTo: this.editor,
                id: 'UploadDescription',
                css: style.textarea,
            }).linksuggest();
            $('<button>', {
                'class': 'secondary',
                id: 'reset',
                css: style.block,
                text: this.i18n.msg('reset').plain(),
                click: $.proxy(this.init, this),
                appendTo: content
            }),
            $('<input>', {
                type: 'checkbox',
                id: 'ignorewarnings',
                name: 'ignorewarnings',
                appendTo: content
            }),
            $('<label>', {
                'for': 'ignorewarnings',
                text: this.i18n.msg('ignorewarnings').plain(),
                appendTo: content
            });
 
            this.input.attr('disabled', true);
            this.editor.show();
            this.button
                .unbind('click')
                .click($.proxy(this.upload, this))
                .text(this.i18n.msg('uploadfiles').plain());
        },
        upload: function() {
            content.find('*').attr('disabled', true);
            $('#reset').removeAttr('disabled');
 
            for (i = 1; i <= this.fileCount; i++) {
                var file = this.input[0].files[i - 1],
                    filename = $('#imagename' + i).val() || file.name,
                    licence = $('#licence' + i).find('option:selected').val(),
                    text = $('#UploadDescription').val();
                if(licence !== "none") text = '{{' + licence + '}}\n' + text;
                this.uploadFile(file, filename, text, i);
            }
        },
        uploadFile: function(fileToUpload, fileName, text, index) {
            // https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects
            formdata = new FormData(); 
            formdata.append('action', 'upload');
            formdata.append('format', 'json');
            formdata.append('filename', fileName);
            formdata.append('token', mw.user.tokens.get('editToken'));
            formdata.append('file', fileToUpload);
            formdata.append('text', text);
            formdata.append(
                $('#ignorewarnings').prop('checked') ? 'ignorewarnings' : '', ''
            );
 
            // https://stackoverflow.com/a/8244082
            $.ajax({
                url: mw.util.wikiScript('api'),
                contentType: false,
                processData: false,
                type: 'POST',
                data: formdata,
                dataType: 'json',
                xhr: function() { // https://stackoverflow.com/a/27030092
                    myXhr = $.ajaxSettings.xhr();
                    myXhr.upload.addEventListener('progress', function(e) {
                        MultiUpload.progress(index, e);
                    });
                    return myXhr;
                },
                success: $.proxy(function(data) {
                    this.success(index, data);
                }, this),
                error: $.proxy(function(_, __, error) {
                    this.notify(error, 'error');
                }, this)
            });
        },
        progress: function(index, e) {
            var progress = e.loaded / e.total * 100;
            $('#progress' + index).text(progress.toFixed(0) + '%');
        },
        success: function(index, data) {
            // Error
            if (data.error) {
                var errorInfo, errorDetails;
 
                function displayError() {                
                    $('#progress' + index).html([
                        $('<strong/>').text(errorInfo),
                        (errorDetails === undefined) ? null : $('<br/>'),
                        (errorDetails === undefined) ? null : $('<div/>').text(errorDetails)
                    ]);
                }
 
                // Excluding variants of `unknownerror`, we're going to ignore `error.info` since it mightn't be localized.
                // See <https://github.com/Wikia/app/blob/release-886.001/includes/upload/UploadBase.php> for special cases.
                if (data.error.code.startsWith('unknownerror')) {
                    errorInfo = data.error.info;
                    displayError();
                } else {
                    var messages = [data.error.code];
                    if (data.error.code === 'verification-error') {
                        messages.push(data.error.details[0]);
                    }
                    loadMWMessagesIfMissing(messages).then(function () {
                        errorInfo = mw.msg(data.error.code);
                        if (data.error.code === 'verification-error') {
                            errorDetails = mw.msg.apply(null, data.error.details);
                        } else if (data.error.code === 'hookaborted') {
                            errorDetails = data.error.error;  // TODO: Determine whether it's safe to assume this'll always be properly escaped HTML.
                        }
                        displayError();
                    });
                }
                return;
            }
 
            // Success
            if(data.upload.result === 'Success') {
                $('#progress' + index).text(this.i18n.msg('success').plain());
                return;
            }
 
            // Warnings
            var msg;
            if(data.upload.warnings.hasOwnProperty('was-deleted')) {
                msg = this.i18n.msg('deleted').plain();
            } else if(data.upload.warnings.hasOwnProperty('duplicate')) {
                msg = this.i18n.msg('duplicate').plain();
            } else if(data.upload.warnings.hasOwnProperty('exists')) {
                msg = this.i18n.msg('exist').plain();
            } else {
                msg = this.i18n.msg('success').plain();
            }
 
            $('#progress' + index).text(msg);
        }
    };
 
    mw.hook('dev.i18n').add(function(i18n) {
        i18n.loadMessages('MultiUpload').then(
            $.proxy(MultiUpload.preload, MultiUpload)
        );
    });
    importArticle({
        type: 'script',
        article: 'u:dev:MediaWiki:I18n-js/code.js'
    });
});

// Show all announcements except those from 12345 and 23456
window.announcementsIgnore = {
    option: 'opt-in-all',
    exceptWikiIds: [
        1603513
    ]
};