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.
// Until someone tells me how to fix the NetworkErrors this is causing, it's dead. Rest in peace.
// I mean, I could theoretically host an ipinfo.io proxy on wmflabs, but I don't have a wmflabs
// and I don't know if that's what one would be used for. Something CORS-related is weird. Ugh.



/*
// This attempts to automatically fill out the shared IP form for you.
// The API we're using (ipinfo) has a ratelimit of 1k per day.
// I don't have the time or the patience to actually reach that limit, so if you somehow manage to, let me know if it doesn't fail gracefully.
sharedcallback = function friendlysharedCallback() {
    var Window = new Morebits.simpleWindow(600, 420);
    Window.setTitle("Shared IP address tagging");
    Window.setScriptName("Twinkle");
    Window.addFooterLink("Twinkle help", "WP:TW/DOC#shared");

    var form = new Morebits.quickForm(Twinkle.shared.callback.evaluate);

    var div = form.append({
        type: 'div',
        id: 'sharedip-templatelist',
        className: 'morebits-scrollbox'
    });
    div.append({
        type: 'header',
        label: 'Shared IP address templates'
    });
    div.append({
        type: 'radio',
        name: 'shared',
        list: Twinkle.shared.standardList,
        event: function(e) {
            Twinkle.shared.callback.change_shared(e);
            e.stopPropagation();
        }
    });

    var whois = {
        host: '',
        org: ''
    }

    // We assume the wgTitle is still an IP, because it has to be for the link to appear, and I'd like to stay sane.
    getIP = (function() {
        console.log(mw.config.get('wgTitle'))
        return $.get("https://ipinfo.io/" + mw.config.get('wgTitle'), function(response) {
            //console.log(response)
            if (response.hostname !== "No Hostname" // Why don't they return a more sane "nothing" instead? The world may never know.
                &&
                typeof(response.hostname) !== "undefined") {
                whois['host'] = response.hostname
            }
            if (typeof(response.org) !== "undefined" // This being undefined does happen. Rarely and only in odd cases, but it does.
                &&
                response.org.search(' ') > 0) { // We're chopping off the AS number, but we want to make sure there's a name after it.
                var orgname = response.org.split(' ').splice(1).join(' ')
                // TODO: add an org alias object that can be set from common.js and have this be the default
                if (orgname === "Cellco Partnership DBA Verizon Wireless") {
                    orgname = "Verizon Wireless"
                    // This'll probably make more sense to people, as I doubt many know "Cellco" as well as "Verizon"
                }
                whois['org'] = orgname
            }
        }, "jsonp").fail(function(x, y) {
            console.log(x, y);
            whois = {}
        })
    })
    $.when(getIP()).done(function(ipreturn) {
        //console.log(ipreturn,whois)
        var org = form.append({
            type: 'field',
            label: 'Fill in other details (optional) and click \"Submit\"'
        });
        org.append({
            type: 'input',
            name: 'organization',
            label: 'IP address owner/operator',
            disabled: true,
            value: whois['org'],
            tooltip: 'You can optionally enter the name of the organization that owns/operates the IP address.  You can use wikimarkup if necessary.'
        });
        org.append({
            type: 'input',
            name: 'host',
            label: 'Host name (optional)',
            value: whois['host'],
            disabled: true,
            tooltip: 'The host name (for example, proxy.example.com) can be optionally entered here and will be linked by the template.'
        });
        org.append({
            type: 'input',
            name: 'contact',
            label: 'Contact information (only if requested)',
            disabled: true,
            tooltip: 'You can optionally enter some contact details for the organization.  Use this parameter only if the organization has specifically requested that it be added.  You can use wikimarkup if necessary.'
        });

        form.append({
            type: 'submit'
        });

        var result = form.render();
        Window.setContent(result);
        Window.display();
    });
};

function changeSharedIPCallback() {
    // below copies all the functions from Twinkle's shared ip callback to mine
    Object.keys(Twinkle.shared.callback).forEach(function(key) {
        sharedcallback[key] = Twinkle.shared.callback[key];
    });
    Twinkle.shared.callback = sharedcallback;
}

function waitForTwinkleSIP() {
    if (typeof(Twinkle) !== "undefined" && typeof(Twinkle.shared) !== "undefined") {
        clearInterval(window.waitForTwinkleSIP.interval)
        changeSharedIPCallback();
    }
}
window.waitForTwinkleSIP.interval = setInterval(waitForTwinkleSIP, 100)
*/