MediaWiki:Common.js: Difference between revisions

From Donate
Jump to navigation Jump to search
Content deleted Content added
m minor warning fixes
MNoor (WMF) (talk | contribs)
No edit summary
Line 47: Line 47:
[ 1000, [ 500, 1000, 2000, 2500, 3000, 4000, 5000 ] ]
[ 1000, [ 500, 1000, 2000, 2500, 3000, 4000, 5000 ] ]
],
],
'lowtierlowamt' : [
'LTLA' : [
[ 0, [ 3, 10, 15, 20, 30, 50, 100 ] ],
[ 0, [ 3, 10, 15, 20, 35, 50, 100 ] ],
[ 5, [ 5, 10, 20, 35, 50, 100, 150 ] ],
[ 5, [ 5, 10, 20, 35, 50, 100, 150 ] ],
[ 10, [ 10, 20, 35, 50, 75, 100, 150 ] ],
[ 10, [ 10, 20, 35, 50, 75, 100, 150 ] ],
[ 15, [ 15, 25, 35, 50, 75, 100, 150 ] ],
[ 15, [ 15, 25, 35, 50, 75, 100, 250 ] ],
[ 20, [ 20, 30, 50, 75, 100, 150, 250 ] ],
[ 20, [ 20, 30, 50, 75, 100, 150, 250 ] ],
[ 25, [ 25, 35, 50, 75, 100, 150, 250 ] ],
[ 25, [ 25, 35, 50, 75, 100, 150, 250 ] ],
Line 74: Line 74:
[ 100, [ 150, 200, 250, 300, 400, 500, 1000 ] ],
[ 100, [ 150, 200, 250, 300, 400, 500, 1000 ] ],
[ 150, [ 200, 250, 300, 400, 500, 1000, 2500 ] ],
[ 150, [ 200, 250, 300, 400, 500, 1000, 2500 ] ],
[ 200, [ 500, 550, 750, 1000, 1500, 2500, 5000 ] ],
[ 200, [ 500, 750, 1000, 2000, 3500, 5000, 7500 ] ],
[ 500, [ 750, 1000, 1500, 2500, 5000, 7500, 10000 ] ],
[ 500, [ 750, 1000, 1500, 2500, 5000, 7500, 10000 ] ],
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 10000 ] ]
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 10000 ] ]
],
],
'lowtier2018' : [
'LT2018' : [
[ 0, [ 5, 10, 20.18, 25, 35, 50, 100 ] ],
[ 0, [ 5, 10, 20.18, 25, 35, 50, 100 ] ],
[ 5, [ 10, 15, 20.18, 35, 50, 100, 150 ] ],
[ 5, [ 10, 15, 20.18, 35, 50, 100, 150 ] ],

Revision as of 14:45, 26 November 2018

/**
 * Any JavaScript here will be loaded for all users on every page load.
 **/

function getQuerystring( key ) {
    // TODO: Replace with mw.util.getParamValue() everywhere, and remove
    key = key.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' );
    var regex = new RegExp( '[\\?&]' + key + '=([a-zA-Z0-9\.\_\-]*)' );
    var qs = regex.exec( window.location.search );
    return qs === null ? '' : qs[1];
}

function adjustHPC() {
    /* Adjust amounts based on highest previous contribution (hpc)
        or most recent contribution (mrc) parameter. Used for emails.
        TODO: split data out? */

    // Look for 'hpc' parameter, then 'mrc'. If neither, then bail out.
    var hpc = parseFloat( mw.util.getParamValue('hpc') );
    if( isNaN(hpc) ) {
        hpc = parseFloat( mw.util.getParamValue('mrc') );
        if( isNaN(hpc) ) {
            return;
        }
    }

    var hpcSet = mw.util.getParamValue('hpcSet');

    var currency = $("input[name='currency_code']").val();
    var language = mw.config.get('wgUserLanguage');

    var radioAmountsData = {
        'USD' : {
            'default' : [
                [    0, [   5,   10,   20,   25,   35,   50,  100 ] ],
                [    5, [  10,   15,   20,   35,   50,  100,  150 ] ],
                [   10, [  15,   20,   25,   35,   50,  100,  150 ] ],
                [   15, [  20,   25,   35,   50,   75,  100,  250 ] ],
                [   20, [  25,   35,   50,   75,  100,  150,  250 ] ],
                [   25, [  30,   40,   50,   75,  100,  150,  250 ] ],
                [   35, [  25,   50,   75,  100,  200,  250,  300 ] ],
                [   75, [  25,   50,   75,  100,  200,  300,  500 ] ],
                [  100, [  25,   50,  100,  150,  250,  500, 1000 ] ],
                [  150, [  50,  100,  150,  200,  350,  500, 1000 ] ],
                [  200, [ 100,  150,  200,  300,  400,  500, 1000 ] ],
                [  500, [ 100,  250,  500,  750, 1000, 1500, 2000 ] ],
                [ 1000, [ 500, 1000, 2000, 2500, 3000, 4000, 5000 ] ]
            ],
            'LTLA' : [
                [    0, [   3,    10,   15,   20,   35,   50,  100 ] ],
                [    5, [   5,   10,   20,   35,   50,  100,  150 ] ],
                [   10, [  10,   20,   35,   50,   75,  100,  150 ] ],
                [   15, [  15,   25,   35,   50,   75,  100,  250 ] ],
                [   20, [  20,   30,   50,   75,   100,  150,  250 ] ],
                [   25, [  25,   35,   50,   75,  100,  150,  250 ] ],
                [   35, [  25,   50,   75,  100,  200,  250,  300 ] ],
                [   75, [  25,   50,   75,  100,  200,  300,  500 ] ],
                [  100, [  25,   50,  100,  150,  250,  500, 1000 ] ],
                [  150, [  50,  100,  150,  200,  350,  500, 1000 ] ],
                [  200, [ 100,  150,  200,  300,  400,  500, 1000 ] ],
                [  500, [ 100,  250,  500,  750, 1000, 1500, 2000 ] ],
                [ 1000, [ 500, 1000, 2000, 2500, 3000, 4000, 5000 ] ]
            ],
            'midtier2018' : [
                [    0, [   3,    5,   10,   20,   30,   50,  100 ] ],
                [    5, [   5,   10,   20,   35,   50,  100,  150 ] ],
                [   10, [  10,   15,   20,   35,   50,  100,  150 ] ],
                [   15, [  15,   20,   25,   35,   50,  100,  150 ] ],
                [   20, [  20,   25,   35,   50,   75,  100,  150 ] ],
                [   25, [  35,   50,   75,   100,  150,  250,  500 ] ],
                [   35, [  50,   75,   100,  150,  250,  350,  500 ] ],
                [   50, [  75,   100,   150,  200,  250,  350,  500 ] ],
                [   75, [  100,   150,   200,  300,  400,  500,  1000 ] ],
                [  100, [  150,   200,  250,  300,  400,  500, 1000 ] ],
                [  150, [  200,  250,  300,  400,  500,  1000, 2500 ] ],
                [  200, [ 500,  750,  1000,  2000,  3500,  5000, 7500 ] ],
                [  500, [ 750,  1000,  1500,  2500, 5000, 7500, 10000 ] ],
                [ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 10000 ] ]
            ],
            'LT2018' : [
                [    0, [   5,   10,   20.18,   25,   35,   50,  100 ] ],
                [    5, [  10,   15,   20.18,   35,   50,  100,  150 ] ],
                [   10, [  15,   20.18,   25,   35,   50,  100,  150 ] ],
                [   15, [  20.18,   25,   35,   50,   75,  100,  250 ] ],
                [   20, [  25,   35,   50,   75,  100,  150,  250 ] ],
                [   25, [  30,   40,   50,   75,  100,  150,  250 ] ],
                [   35, [  25,   50,   75,  100,  200,  250,  300 ] ],
                [   75, [  25,   50,   75,  100,  200,  300,  500 ] ],
                [  100, [  25,   50,  100,  150,  250,  500, 1000 ] ],
                [  150, [  50,  100,  150,  200,  350,  500, 1000 ] ],
                [  200, [ 100,  150,  200,  300,  400,  500, 1000 ] ],
                [  500, [ 100,  250,  500,  750, 1000, 1500, 2018 ] ],
                [ 1000, [ 500, 1000, 2018, 2500, 3000, 4000, 5000 ] ]
            ]
        },
        'BRL' : [
            [    0, [   15,   25,   50,   75,   100,   150,   300 ] ],
            [    5, [   25,   35,   50,   75,   100,   200,   300 ] ],
            [   10, [   30,   50,   75,  100,   150,   300,   500 ] ],
            [   15, [   50,   75,  100,  150,   225,   300,   500 ] ],
            [   20, [   50,  100,  150,  225,   300,   400,   500 ] ],
            [   25, [   75,  125,  200,  250,   300,   400,   500 ] ],
            [   35, [  100,  150,  225,  300,   500,   750,  1000 ] ],
            [   75, [  100,  150,  225,  300,   500,  1000,  1500 ] ],
            [  100, [  100,  150,  300,  500,  1000,  1500,  3000 ] ],
            [  150, [  250,  500,  750, 1000,  1500,  3000,  5000 ] ],
            [  200, [  500, 1000, 2000, 3000,  4000,  5000, 10000 ] ],
            [  500, [ 1000, 2500, 5000, 7500, 10000, 12500, 15000 ] ],
            [ 1000, [ 1000, 2500, 5000, 7500, 10000, 12500, 15000 ] ]
        ],
        'JPY' : [
            [   0, [   500,  1000,  2000,  2500,   4000,   5000,  10000 ] ],
            [   5, [  1000,  1500,  2500,  4000,   5000,  10000,  15000 ] ],
            [  10, [  1500,  2000,  3000,  4000,   5000,  10000,  15000 ] ],
            [  15, [  2000,  2500,  3500,  5000,   7500,  10000,  25000 ] ],
            [  20, [  2500,  3500,  5000,  7500,  10000,  15000,  25000 ] ],
            [  25, [  3000,  4000,  5000,  7500,  10000,  15000,  25000 ] ],
            [  35, [  2500,  5000,  7500, 10000,  20000,  30000,  50000 ] ],
            [  75, [  2500,  5000,  7500, 10000,  20000,  50000, 100000 ] ],
            [ 100, [  5000, 10000, 15000, 20000,  35000,  50000, 100000 ] ],
            [ 500, [ 10000, 25000, 50000, 75000, 100000, 150000, 200000 ] ]
        ],
        'SEK' : [
            [   0, [ 20,  50, 100, 200, 300, 500, 1000 ] ],
            [   3, [ 30,  50, 100, 200, 300, 500, 1000 ] ],
            [   5, [ 50, 100, 150, 200, 300, 500, 1000 ] ],
            [  23, [ 50, 100, 200, 300, 500, 750, 1000 ] ]
        ]
    };
    radioAmountsData.AUD = radioAmountsData.USD;
    radioAmountsData.CAD = radioAmountsData.USD;
    radioAmountsData.GBP = radioAmountsData.USD;
    radioAmountsData.NZD = radioAmountsData.USD;
    radioAmountsData.EUR = radioAmountsData.USD;

    var appealAmountsData = {
        'USD' : [
            [   0, [   5,  10,  20 ] ],
            [  10, [  10,  20,  50 ] ],
            [  20, [  20,  30,  50 ] ],
            [  35, [  20,  30,  50 ] ],
            [  50, [  20,  50, 100 ] ],
            [  75, [  50,  75, 100 ] ],
            [ 100, [  75, 100, 150 ] ],
            [ 150, [  75, 100, 200 ] ],
            [ 200, [ 100, 200, 300 ] ]
        ],
        'JPY' : [
            [   0, [  300,   500,  1000 ] ],
            [   3, [  500,  1000,  1500 ] ],
            [   5, [ 1000,  1500,  2000 ] ],
            [  10, [ 1500,  2000,  5000 ] ],
            [  20, [ 2000,  3000,  5000 ] ],
            [  50, [ 2000,  5000, 10000 ] ],
            [ 100, [ 5000, 10000, 15000 ] ]
        ],
        'SEK' : [
            [   0, [  20,  50,  100 ] ],
            [   3, [  30,  50,  100 ] ],
            [   5, [  50, 100,  150 ] ],
            [  15, [ 100, 150,  200 ] ],
            [  23, [ 100, 200,  300 ] ],
            [  38, [ 100, 200,  500 ] ],
            [  75, [ 100, 500,  750 ] ],
            [ 112, [ 100, 500, 1000 ] ]
        ]
    };
    appealAmountsData.AUD = appealAmountsData.USD;
    appealAmountsData.CAD = appealAmountsData.USD;
    appealAmountsData.GBP = appealAmountsData.USD;
    appealAmountsData.NZD = appealAmountsData.USD;
    appealAmountsData.EUR = appealAmountsData.USD;

    var formats = {
        "USD" : "$\t",
        "EUR" : {
            "en" : "€\t",
            "cy" : "€\t",
            "ga" : "€\t",
            "mt" : "€\t",
            "nl" : "€ \t",
            "lv" : "€ \t",
            "tr" : "€ \t",
            "default" : "\t €"
        },
        "AUD" : "$\t",
        "CAD" : {
            "fr" : "\t $",
            "default" : "$\t"
        },
        "GBP" : "£\t",
        "NZD" : "$\t",
        "JPY" : "¥\t",
        "SEK" : "\t kr",
        "BRL" : "R$\t"
    };

    var format = formats[currency][language] || formats[currency]["default"] || formats[currency] || '\t';

    // Radio button amounts
    var radioAmounts = pickAmountArray( radioAmountsData, currency, hpc, hpcSet );
    if ( radioAmounts.length ) {
        // Change buttons
        for (var j = 0; j < radioAmounts.length; j++) {
            var $radio = $("#input_amount_" + j);
            var $label = $("label[for='input_amount_" + j + "']");
            $radio.val( radioAmounts[j] );
            $label.text( format.replace('\t', radioAmounts[j]) );
        }
    }

    // Appeal amounts
    var appealAmounts = pickAmountArray( appealAmountsData, currency, hpc, hpcSet );
    if ( appealAmounts.length ) {
        // Build string
        var appealAmountString = '';
        for( var k = 0; k < appealAmounts.length; k++ ) {
            appealAmountString += format.replace('\t', appealAmounts[k]) + ', ';
        }
        appealAmountString = appealAmountString.trim();

        $('.consider-amounts').html(appealAmountString);
    }

}

function pickAmountArray( data, currency, hpc, hpcSet ) {
    /**
     * Choose the amounts for radio buttons / appeal based on hpc
     * @param {Object} data
     * @param {String} currency
     * @param {Number} hpc
     * @param {String} hpcSet
     * @return {Array} Array of amounts (as numbers)
     */

    var set, amounts;

    if ( !(currency in data) ) {
        return [];
    }

    if ( $.isArray(data[currency]) ) {
        // No variant sets
        set = data[currency];
    } else {
        // We need to go deeper. Check the variants.
        if ( hpcSet in data[currency] ) {
            set = data[currency][hpcSet];
        } else {
            set = data[currency]['default'];
        }
    }

    // Find correct amount array for this hpc
    for (var i = 0; i < set.length; i++) {
        if ( set[i][0] > hpc ) {
            break;
        }
        amounts = set[i][1];
    }

    return amounts;

}

function preSelect() {
    /* Check for a 'preSelect' url parameter, and select that option.
       If there isn't an option, add it to the "Other" box and select that */
    var preSelectAmount = mw.util.getParamValue('preSelect');
    if ( preSelectAmount > 0 ) {
        $preSelectOption = $('input[name="amount"][value="' + preSelectAmount + '"]');
        if ( $preSelectOption.length ) {
            // Select existing input
            $preSelectOption.prop('checked', true);
        } else {
            $('#input_amount_other_box').val( preSelectAmount );
            $('#input_amount_other').prop('checked', true);
        }
    }
}

function addCardTypesClass(country) {
    /**
     * Add card types class to credit card button, so we can show correct logos
     * Banner equivalent: https://meta.wikimedia.org/wiki/MediaWiki:FundraisingBanners/LocalizeJS-2017.js
     * @param {String} country ISO code
     */
    var cardTypes = {
        // Big 6
        'US' : 'vmad',
        'CA' : 'vma',
        'GB' : 'vmaj',
        'IE' : 'vmaj',
        'AU' : 'vmaj',
        'NZ' : 'vma',
        // Euro countries
        'AT' : 'vmaj',
        'BE' : 'vmaj',
        'ES' : 'vmaj',
        'FR' : 'CBvma', // Adyen
        'IT' : 'vmaj',
        'LU' : 'vmaj',
        'LV' : 'vma',
        'NL' : 'vmaj',
        'PT' : 'vmaj',
        'SK' : 'vmaj',
        // Others
        'DK' : 'vma',
        'HU' : 'vma',
        'IL' : 'vmad', // Adyen
        'JP' : 'vmaj',
        'MY' : 'vmaj',
        'NO' : 'vma',
        'PL' : 'vma',
        'RO' : 'vma',
        'SE' : 'vma',
        'UA' : 'vma', // Adyen
        'ZA' : 'vm'
    };
    if ( cardTypes[country] ) {
        $('.paymentmethod-cc').addClass('cctypes-' + cardTypes[country] );
    }
}

/* Form functions */
function clearOther(box) {
    document.getElementById("input_amount_other").checked = true;
    box.value = "";
}

function selectOther() {
    document.getElementById("input_amount_other").checked = true;
}

function resetOther(box) {
    box.value = "</html>{{int:donate_interface-other}}<html>";
}

function selectAmount() {
    $('#input_amount_other_box').val('');
    $('input[name="amountGiven"]').val('');
}
/* End form functions */


$(document).ready(function() {

    mw.loader.using( ['mediawiki.util'] ).done( function() {

        // Block typing symbols in input field, otherwise Safari allows them and then chokes
        // https://phabricator.wikimedia.org/T118741, https://phabricator.wikimedia.org/T173431
        
        var amountOtherInput = document.getElementById('input_amount_other_box');
        if ( amountOtherInput ) {
            amountOtherInput.onkeypress = function(e) {
                // Allow special keys in Firefox
                if ((e.code == 'ArrowLeft') || (e.code == 'ArrowRight') ||
                    (e.code == 'ArrowUp') || (e.code == 'ArrowDown') || 
                    (e.code == 'Delete') || (e.code == 'Backspace')) {
                    return;
                }
                var chr = String.fromCharCode(e.which);
                if ("0123456789., ".indexOf(chr) === -1) {
                    return false;
                }
            };
        }

        // Disable submitting form with Enter key
        $('form[name="paypalcontribution"]').on('keypress', function(e) {
            var code = ( e.keyCode ? e.keyCode : e.which );
            if ( code == 13 ) {
                e.preventDefault();
            }
        });

        // But allow Enter on buttons
        $('.payment-method-button').keyup(function(e) {
            if (event.keyCode === 13) {
                e.target.click();
            }
        });

        if ( document.paypalcontribution ) {
            document.paypalcontribution.utm_medium.value   = mw.util.getParamValue( 'utm_medium' );
            document.paypalcontribution.utm_campaign.value = mw.util.getParamValue( 'utm_campaign' );
            document.paypalcontribution.utm_key.value      = mw.util.getParamValue( 'utm_key' );

            // Strip protocol to stop firewall throwing fits
            document.paypalcontribution.referrer.value = document.referrer.replace(/https?:\/\//i, "");

            // hide frequency options in India, where we can only handle one-time donations
            if (document.paypalcontribution.country.value === 'IN') {
                $("#frequency_onetime").prop('checked', true);
                $(".frequency-options").hide();
                $("#cancel-monthly").hide();
            }

            addCardTypesClass(document.paypalcontribution.country.value);
        }

        // Links open in new tab
        $('.links-in-new-tab a').attr('target', '_blank');

        // Disable logo link
        $("#p-logo a").attr("href", "#");
        $("#p-logo a").attr("title", "");

        // These don't need to be tabbable on the landing page
        $('#searchInput, .mw-jump-link').attr('tabindex', '-1');

        $(".input_amount_other").click(function() {
            $("#input_amount_other_box").focus();
        });

        // Allow preselecting monthly
        if( mw.util.getParamValue('monthly') ) {
            $('#frequency_monthly').click();
        }

        // If the optin section has some javascript to run, do that
        if ( typeof initOptin === 'function' ) {
            initOptin();
        }

        try {
            adjustHPC();
            preSelect(); // Make sure to do this *after* other fiddling with values
        }
        finally {
            $('.optin-options').insertAfter('.amount-options');
            $('.consider-amounts').show();
            $('#actual-form').show();
            $('#actual-form-loading').hide();
        }

    });

    /**
     * Code for fundraising Thank You pages
     * e.g. https://donate.wikimedia.org/wiki/Thank_You
     */
    if ( mw.config.get( 'wgTitle' ).split('/')[0] === 'Thank You' ) {

        mw.loader.using( 'mediawiki.util', function() {

            var paymentMethod = mw.util.getParamValue('payment_method'),
                country = mw.util.getParamValue('country');

            if ( paymentMethod === 'bt' ) {
                document.getElementById('ty-banktransfer').style.display = 'block';
            }
            if ( paymentMethod === 'bitcoin' ) {
                document.getElementById('ty-bitcoin').style.display = 'block';
            }
            if ( paymentMethod === 'bpay' ) {
                document.getElementById('ty-bpay').style.display = 'block';
            }

            if ( country === 'US' || country === 'CA' ) {
                document.getElementById('ty-store').style.display = 'block';
            }

        });

    }

    /**
     * Code for fundraising support pages
     * e.g. https://donate.wikimedia.org/wiki/Problems_donating
     *
     * Edit at https://donate.wikimedia.org/wiki/MediaWiki:SupportPage.js
     */
    var supportPages = [
        'Ways to Give', 
        'Problems donating', 
        'Cancel or change recurring giving',
        'Matching Gifts',
        'Support Page'
    ]
    if ( supportPages.indexOf( mw.config.get( 'wgTitle' ).split('/')[0] ) !== -1 ) {
        mw.loader.load( '/w/index.php?title=MediaWiki:SupportPage.js&action=raw&ctype=text/javascript' );
    }

});


$(document).ready(function() {
    /* HACK to run certain inline scripts when document ready (e.g. so jquery is avaliable)
        TODO: Make suitable for multiple scripts. Or figure out a better way to do this.
    */
    if ( typeof inlineScriptWhenReady !== 'undefined') {
        inlineScriptWhenReady();
    }
});