Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/*global $, mw */
///An updated version of [[User:Timotheus Canens/massrestore.js]] (adapted from [[User:Animum/massdelete.js]])

if (mw.config.get("wgNamespaceNumber") == -1
        && mw.config.get("wgTitle").toLowerCase() == "massrestore"
        && /sysop/.test(mw.config.get("wgUserGroups"))) {
    /**
     * Mediawiki takes WAY too long for the document ready to load; this will
     * listen for the actual body being loaded before that.
     */
    new Promise(resolve => {
        $(resolve);
        var interval = window.setInterval(function () {
            if ($("#footer")[0] && $("#mw-navigation")[0]) {
                resolve();
                window.clearInterval(interval);
            }
        }, 100);
    }).then(function () {
        $("h1").html("Mass-restoration tool");
        document.title = "Tim's mass-restoration tool - Wikipedia, the free encyclopedia";
        $(mw.config.get("skin") == "cologneblue" ? "#article" : "#bodyContent").html(
                "<h3 id=\"siteSub\">From Wikipedia, the free encyclopedia</h3><br /><br />"
                + "<form id=\"wpMassRestore\" name=\"wpMassRestore\">"
                + "<b>If you abuse this tool, it's <i>your</i> fault, not mine.</b>"
                + "<div id=\"wpMassRestoreFailedContainer\"></div>"
                + "<br /><br />"
                + "Pages to restore(one on each line, please):<br />"
                + "<textarea tabindex=\"1\" accesskey=\",\" name=\"wpMassRestorePages\" "
                + "id=\"wpMassRestorePages\" rows=\"10\" cols=\"80\"></textarea>"
                + "<br /><br /><table style=\"background-color:transparent\">"
                + "<tr><td>Reason:</td>"
                + "<td><input type=\"text\" id=\"wpMassRestoreReason\" name=\"wpMassRestoreReason\""
                + " maxlength=\"255\" /></td></tr>"
                + "<tr><td><input type=\"button\" id=\"wpMassRestoreSubmit\" name=\"wpMassRestoreSubmit\""
                + " value=\"Restore\"/></td>" + "</form>");
        $("#wpMassRestoreSubmit").click(function () {
            $("#wpMassRestoreSubmit").attr("disabled", true);
            var wpMassRestoreReason = $("#wpMassRestoreReason").val();
            var restored = 0;
            var errors = {};
            $.ajax({
                url: mw.config.get("wgScriptPath") + "/api.php",
                data: {
                    format: "json",
                    action: "query",
                    prop: "info",
                    intoken: "edit",
                    titles: $("#wpMassRestorePages").val().split("\n").join("|")
                }
            }).then(function (data) {
                Promise.all($.map(data.query.pages, function (info) {
                    function fail(e) {
                        errors[info.title] = e;
                    }
                    return $.ajax({
                        method: "post",
                        url: mw.config.get("wgScriptPath") + "/api.php",
                        data: {
                            format:"json",
                            action: "undelete",
                            reason: wpMassRestoreReason,
                            token: info.edittoken,
                            title: info.title
                        }
                    }).then(function (subdata) {
                        // If restored, update the restored count and the button.
                        if (subdata.undelete) {
                            $("#wpMassRestoreSubmit").val(++restored);
                        } else {
                            fail(subdata.error.info);
                        }
                    }, fail);
                })).then($.noop, $.noop).then(function () {
                    $("#wpMassRestoreSubmit").val("Done (" + restored + ")");

                    if (!$.isEmptyObject(errors)) {
                        var ul = $("<ul></ul>");
                        $.each(errors, function (title, e) {
                            ul.append("<li><a href=\"" + mw.config.get("wgScript") + "?title=" +
                                    encodeURIComponent(title) + "\">" + title + "</a>: " + e + "</li>");
                        });
                        $("#wpMassRestoreFailedContainer").html(
                        		"<br /><strong>Failed restorations:</strong>").append(ul);
                    }
                });
            });
        });
    });
}