MediaWiki:Common.js: Difference between revisions

From Donate
Jump to navigation Jump to search
Content deleted Content added
rm "checked" class for frequency, no longer needed
sigh, lets try vanilla js again
(15 intermediate revisions by the same user not shown)
Line 281: Line 281:


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


Line 296: Line 296:


// Block typing symbols in input field, otherwise Safari allows them and then chokes
// Block typing symbols in input field, otherwise Safari allows them and then chokes
// https://phabricator.wikimedia.org/T118741
// https://phabricator.wikimedia.org/T118741, https://phabricator.wikimedia.org/T173431
document.getElementById('input_amount_other_box').onkeypress = function(e) {
var chr = String.fromCharCode(e.which);
var amountOtherInput = document.getElementById('input_amount_other_box');
if ("$£€¥".indexOf(chr) !== -1) {
if ( amountOtherInput ) {
return false;
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 return key
// Disable submitting form with Enter key
$( 'form[name="paypalcontribution"]' ).bind( 'keypress', function(e) {
$('form[name="paypalcontribution"]').on('keypress', function(e) {
var code = ( e.keyCode ? e.keyCode : e.which );
var code = ( e.keyCode ? e.keyCode : e.which );
if ( code == 13 ) return false;
if ( code == 13 ) {
e.preventDefault();
};
});

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



Revision as of 15:17, 30 October 2017

/**
 * 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 checkPaymentOutages() {
    /*  Check against the scheduled payment method outages
     *  in global variable "outages" (loaded cross-wiki from meta)
     *  and hide the relevant button for any which are ongoing.
     */

    // var outages = outages || []; // don't die if it hasn't loaded...
    var now = new Date();

    for (var i = outages.length - 1; i >= 0; i--) {
        if ( now > outages[i]['start'] ) {
            if ( now < outages[i]['end'] ) {
                if ( (typeof outages[i]['country'] === 'undefined') || (outages[i]['country'] == country) ) {
                    $('.paymentmethod-' + outages[i]['method']).hide();
                }
            }
        }
    }
}

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 ] ]
            ],
            'low2016' : [
                [    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, [  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 ] ]
            ]
        },
        '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);
        }
    }
}

/* 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();
            }
        }

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

        // This is 1 by default, make it 0
        $('#searchInput').attr('tabindex', 0);

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


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

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

        // Load list of payment outages from meta, and hide any which are current
        $.getScript('//meta.wikimedia.org/w/index.php?' + $.param( { title:'MediaWiki:FR2013/Resources/PaymentOutages.js', action:'raw', ctype:'text/javascript' } ),
            function() {
                setTimeout(checkPaymentOutages(), 250); // allow time for script to have _executed_ (not just loaded)
            });

    });

});

$(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();
    }
});