MediaWiki:DonationForm parseOtherAmount.js: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
split out parseOtherAmount function so we can re-use it for monthlyconvert other amount |
No edit summary |
||
Line 862: | Line 862: | ||
// Check the "other" amount box |
// Check the "other" amount box |
||
if ( document.getElementById('input_amount_other').checked ) { |
|||
if ( form.input_amount_other_box.value !== '' ) { |
|||
amount = donationForm.parseOtherAmount( form.input_amount_other_box.value ); |
|||
donationForm.extraData.otherAmt = 1; |
|||
} |
|||
return amount; |
|||
}; |
|||
/** |
|||
* Parse Other field value into amount |
|||
* |
|||
* Does some awful regex stuff to rm symbols and turn the string into a number |
|||
* Remember some locales flip . & , for decimal point/thousands separator |
|||
* |
|||
* @param {string} value Value of "Other" field |
|||
* @return {float} Float with amount, or 0 if NaN |
|||
*/ |
|||
donationForm.parseOtherAmount = function( value ) { |
|||
var amount; |
|||
value = value.replace(/[,.](\d)$/, '\:$10'); |
|||
value = value.replace(/[,.](\d)(\d)$/, '\:$1$2'); |
|||
value = value.replace(/[\$£€¥,.]/g, ''); |
|||
value = value.replace(/:/, '.'); |
|||
amount = parseFloat( value ); |
|||
if ( isNaN( amount ) ) { |
|||
return 0; |
|||
} else { |
|||
return amount; |
|||
} |
|||
}; |
|||
/** |
|||
* Validate the form. |
|||
*/ |
|||
donationForm.validate = function( skipAmountValidation ) { |
|||
var error = false; |
|||
var form = document.forms['donateForm']; |
|||
// Reset all errors |
|||
$('.lp-haserror').removeClass('lp-haserror'); |
|||
$('.lp-error').hide(); |
|||
if ( !skipAmountValidation && !donationForm.validateAmount() ) { |
|||
error = true; |
|||
} |
|||
if ( form.opt_in ) { |
|||
if ( $('input[name="opt_in"]:checked').val() === undefined ) { |
|||
$('#error-optin').show(); |
|||
error = true; |
|||
} else { |
|||
$('#error-optin').hide(); |
|||
} |
|||
} |
|||
return !error; |
|||
}; |
|||
/** |
|||
* Check if selected amount is valid i.e. a positive number, between minimum and maximum. |
|||
* If not, show an error and return false. |
|||
*/ |
|||
donationForm.validateAmount = function() { |
|||
var amount = donationForm.getAmount(); |
|||
var minAmount = donationForm.minimums[ donationForm.currency ] || 1; |
|||
if ( amount === null || isNaN(amount) || amount <= 0 || amount < minAmount ) { |
|||
$('.amount-options').addClass('lp-haserror'); |
|||
$('.lp-error-bigamount').hide(); |
|||
$('.lp-error-smallamount').show(); |
|||
return false; |
|||
} else if ( amount > donationForm.maxUSD * minAmount ) { |
|||
$('.amount-options').addClass('lp-haserror'); |
|||
$('.lp-error-bigamount').show(); |
|||
return false; |
|||
} else { |
|||
$('.amount-options').removeClass('lp-haserror'); |
|||
$('.lp-error-smallamount, .lp-error-bigamount').hide(); |
|||
return true; |
|||
} |
|||
}; |
|||
donationForm.toggleMonthly = function(monthly) { |
|||
if (monthly) { |
|||
$('#form-wrapper').addClass('form-monthly'); |
|||
} else { |
|||
$('#form-wrapper').removeClass('form-monthly'); |
|||
} |
|||
}; |
|||
donationForm.updateFeeDisplay = function() { |
|||
var selectedAmount = donationForm.getAmount(), |
|||
feeAmount = donationForm.calculateFee( selectedAmount ), |
|||
minAmount = donationForm.minimums[ donationForm.currency ] || 1, |
|||
maxAmount = donationForm.maxUSD * minAmount, |
|||
feeText; |
|||
if ( feeAmount % 1 !== 0 ) { // Not a whole number |
|||
feeText = feeAmount.toFixed(2); |
|||
} else { |
|||
feeText = feeAmount.toString(); |
|||
} |
|||
$('.ptf label span').text( feeText ); |
|||
if ( selectedAmount + feeAmount <= maxAmount ) { |
|||
$('.ptf').slideDown(); |
|||
} |
|||
}; |
|||
/** |
|||
* Calculate approximate transaction fee on given amount |
|||
* @param {number} amount |
|||
* @return {number} Rounded to 2 decimal places |
|||
*/ |
|||
donationForm.calculateFee = function( amount ) { |
|||
// Minimum fee/PTF amounts. Default is 0.35. |
|||
// Updated 2019-05-21 to approx 0.35 USD equivalent |
|||
var feeMinimums = { |
|||
'DKK' : 2, |
|||
'HUF' : 100, |
|||
'ILS' : 1.2, |
|||
'INR' : 25, |
|||
'JPY' : 35, |
|||
'MYR' : 1, |
|||
'NOK' : 3, |
|||
'PLN' : 1.35, |
|||
'RON' : 1.5, |
|||
'SEK' : 3, |
|||
'UAH' : 10, |
|||
'ZAR' : 5, |
|||
// Latin America |
|||
'BRL' : 2, |
|||
'ARS' : 32, |
|||
'CLP' : 255, |
|||
'COP' : 1300, |
|||
'MXN' : 7.4, |
|||
'PEN' : 1.3, |
|||
'UYU' : 15.5 |
|||
}; |
|||
var feeMultiplier = 0.04, |
|||
feeMinimum = feeMinimums[ donationForm.currency ] || 0.35, |
|||
feeAmount = amount * feeMultiplier; |
|||
if ( feeAmount < feeMinimum ) { |
|||
feeAmount = feeMinimum; |
|||
} |
|||
return parseFloat( feeAmount.toFixed(2) ); |
|||
}; |
|||
donationForm.initOptin = function() { |
|||
$('.optin-options').on('change', function(e) { |
|||
$('#error-optin').hide(); |
|||
// Only do all this if we have translated prompts |
|||
if ( $('.optin-no-prompt').data('is-translated') === 'yes' ) { |
|||
if ( e.target.id === 'optin-no' ) { |
|||
$('.optin-no-prompt').removeClass('is-positive'); |
|||
if ( !$('.optin-no-prompt').is(':visible') ) { |
|||
$('.optin-no-prompt').slideDown(); |
|||
} |
|||
} else { |
|||
$('.optin-no-prompt').addClass('is-positive'); |
|||
} |
|||
} |
|||
}); |
|||
}; |
|||
/* End form functions */ |
|||
$(document).ready(function() { |
|||
mw.loader.using( ['mediawiki.util'] ).done( function() { |
|||
var form = document.forms['donateForm']; |
|||
// Load monthly convert JS if needed |
|||
// TODO: allow loading different JS variants, either here or defined in the Template |
|||
if ( mw.util.getParamValue('monthlyconvert') ) { |
|||
mw.loader.load( '/w/index.php?title=MediaWiki:MonthlyConvert.js&action=raw&ctype=text/javascript' ); |
|||
} |
|||
// These get used in quite a few places |
|||
donationForm.currency = form.currency_code.value; |
|||
donationForm.country = mw.util.getParamValue('country'); |
|||
// 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; |
|||
} |
|||
}; |
|||
} |
|||
// Validate amount and update fee when selected/entered |
|||
$('.amount-options').on( 'input change', function() { |
|||
donationForm.validateAmount(); |
|||
donationForm.updateFeeDisplay(); |
|||
}); |
|||
// Disable submitting form with Enter key |
|||
$('form[name="donateForm"]').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 ( form ) { |
|||
// hide frequency options for some countries |
|||
if ( donationForm.noRecurringCountries.indexOf( donationForm.country ) !== -1 ) { |
|||
$('#frequency_onetime').prop('checked', true); |
|||
$('.frequency-options, #cancel-monthly, #donate-recurring-smallprint').hide(); |
|||
} |
|||
addCardTypesClass( donationForm.country ); |
|||
} |
|||
// Links open in new tab |
|||
$('.links-in-new-tab a').attr('target', '_blank'); |
|||
// Disable logo link |
|||
$('#p-logo a').attr( { href: '#', 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') |
|||
&& donationForm.noRecurringCountries.indexOf( donationForm.country ) === -1 ) { |
|||
$('#frequency_monthly').click(); |
|||
} |
|||
donationForm.initOptin(); |
|||
try { |
|||
adjustHPC(); |
|||
preSelect(); // Make sure to do this *after* other fiddling with values |
|||
donationForm.localizeErrors(); |
|||
} |
|||
finally { |
|||
$('.ptf').appendTo('.amount-options'); |
|||
$('.optin-options').insertAfter('.amount-options'); |
|||
$('.consider-amounts').show(); |
|||
$('#actual-form').show(); |
|||
$('#actual-form-loading').hide(); |
|||
} |
|||
}); |
|||
}); |
|||
/* jshint strict:false */ |
|||
/** MediaWiki:DonationForm.js - loaded on all donation forms |
|||
* TODO: lots of cleanup |
|||
*/ |
|||
var donationForm = {}; |
|||
donationForm.loadedTime = Date.now(); |
|||
donationForm.extraData = { |
|||
'vw' : window.innerWidth, |
|||
'vh' : window.innerHeight |
|||
}; |
|||
if ( navigator.brave !== undefined ) { // T283367 |
|||
donationForm.extraData.brave = '1'; |
|||
} |
|||
// Don't offer recurring at all in these countries |
|||
donationForm.noRecurringCountries = [ 'AR', 'CL', 'CO', 'MX', 'PE', 'UY', 'BR', 'IN' ]; |
|||
donationForm.maxUSD = 12000; |
|||
donationForm.minimums = { |
|||
/* From https://github.com/wikimedia/wikimedia-fundraising-SmashPig/blob/master/PaymentData/ReferenceData/CurrencyRates.php */ |
|||
'ADF' : 5.45, |
|||
'ADP' : 138, |
|||
'AED' : 3.67, |
|||
'AFA' : 77, |
|||
'AFN' : 77, |
|||
'ALL' : 102, |
|||
'AMD' : 522, |
|||
'ANG' : 1.79, |
|||
'AOA' : 622, |
|||
'AON' : 622, |
|||
'ARS' : 90, |
|||
'ATS' : 11, |
|||
'AUD' : 1.29, |
|||
'AWG' : 1.79, |
|||
'AZM' : 8500, |
|||
'AZN' : 1.7, |
|||
'BAM' : 1.63, |
|||
'BBD' : 2, |
|||
'BDT' : 83, |
|||
'BEF' : 34, |
|||
'BGL' : 1.63, |
|||
'BGN' : 1.63, |
|||
'BHD' : 0.37503712235129, |
|||
'BIF' : 1927, |
|||
'BMD' : 1, |
|||
'BND' : 1.33, |
|||
'BOB' : 6.74, |
|||
'BRL' : 5.62, |
|||
'BSD' : 1, |
|||
'BTN' : 73, |
|||
'BWP' : 11, |
|||
'BYR' : 26065, |
|||
'BZD' : 1.97, |
|||
'CAD' : 1.26, |
|||
'CDF' : 1975, |
|||
'CHF' : 0.92373627643191, |
|||
'CLP' : 729, |
|||
'CNY' : 6.47, |
|||
'COP' : 3660, |
|||
'CRC' : 601, |
|||
'CUC' : 1, |
|||
'CUP' : 25, |
|||
'CVE' : 92, |
|||
'CYP' : 0.4866220993031, |
|||
'CZK' : 22, |
|||
'DEM' : 1.63, |
|||
'DJF' : 178, |
|||
'DKK' : 6.18, |
|||
'DOP' : 57, |
|||
'DZD' : 133, |
|||
'ECS' : 24094, |
|||
'EEK' : 13, |
|||
'EGP' : 16, |
|||
'ESP' : 138, |
|||
'ETB' : 40, |
|||
'EUR' : 0.83144322027478, |
|||
'FIM' : 4.94, |
|||
'FJD' : 2.02, |
|||
'FKP' : 0.71743442231745, |
|||
'FRF' : 5.45, |
|||
'GBP' : 0.71743442231745, |
|||
'GEL' : 3.3, |
|||
'GHC' : 57159, |
|||
'GHS' : 5.72, |
|||
'GIP' : 0.71743442231745, |
|||
'GMD' : 51, |
|||
'GNF' : 10041, |
|||
'GRD' : 283, |
|||
'GTQ' : 7.53, |
|||
'GYD' : 201, |
|||
'HKD' : 7.76, |
|||
'HNL' : 24, |
|||
'HRK' : 6.3, |
|||
'HTG' : 76, |
|||
'HUF' : 303, |
|||
'IDR' : 14279, |
|||
'IEP' : 0.65481474833248, |
|||
'ILS' : 3.3, |
|||
'INR' : 73, |
|||
'IQD' : 1442, |
|||
'IRR' : 42010, |
|||
'ISK' : 127, |
|||
'ITL' : 1610, |
|||
'JMD' : 149, |
|||
'JOD' : 0.70900000000001, |
|||
'JPY' : 107, |
|||
'KES' : 109, |
|||
'KGS' : 85, |
|||
'KHR' : 4019, |
|||
'KMF' : 409, |
|||
'KPW' : 135, |
|||
'KRW' : 1126, |
|||
'KWD' : 0.30191153907257, |
|||
'KYD' : 0.83333299999999, |
|||
'KZT' : 418, |
|||
'LAK' : 9170, |
|||
'LBP' : 1508, |
|||
'LKR' : 194, |
|||
'LRD' : 173, |
|||
'LSL' : 15, |
|||
'LTL' : 2.87, |
|||
'LUF' : 34, |
|||
'LVL' : 0.58434162098198, |
|||
'LYD' : 4.42, |
|||
'MAD' : 8.82, |
|||
'MDL' : 17, |
|||
'MGA' : 3716, |
|||
'MGF' : 9150, |
|||
'MKD' : 51, |
|||
'MMK' : 1392, |
|||
'MNT' : 2620, |
|||
'MOP' : 7.99, |
|||
'MRO' : 357, |
|||
'MTL' : 0.35693857446396, |
|||
'MUR' : 39, |
|||
'MVR' : 15, |
|||
'MWK' : 770, |
|||
'MXN' : 21, |
|||
'MYR' : 4.05, |
|||
'MZM' : 73880, |
|||
'MZN' : 74, |
|||
'NAD' : 15, |
|||
'NGN' : 380, |
|||
'NIO' : 35, |
|||
'NLG' : 1.83, |
|||
'NOK' : 8.52, |
|||
'NPR' : 115, |
|||
'NZD' : 1.38, |
|||
'OMR' : 0.38383957365098, |
|||
'PAB' : 1, |
|||
'PEN' : 3.63, |
|||
'PGK' : 3.43, |
|||
'PHP' : 49, |
|||
'PKR' : 157, |
|||
'PLN' : 3.78, |
|||
'PTE' : 167, |
|||
'PYG' : 6541, |
|||
'QAR' : 3.61, |
|||
'ROL' : 40517, |
|||
'RON' : 4.05, |
|||
'RSD' : 97, |
|||
'RUB' : 74, |
|||
'RWF' : 973, |
|||
'SAR' : 3.75, |
|||
'SBD' : 7.89, |
|||
'SCR' : 20, |
|||
'SDD' : 34467, |
|||
'SDG' : 345, |
|||
'SDP' : 2261, |
|||
'SEK' : 8.45, |
|||
'SGD' : 1.33, |
|||
'SHP' : 0.71743442231745, |
|||
'SIT' : 199, |
|||
'SKK' : 25, |
|||
'SLL' : 10105, |
|||
'SOS' : 558, |
|||
'SRD' : 14, |
|||
'SRG' : 14018, |
|||
'STD' : 20304, |
|||
'SVC' : 8.75, |
|||
'SYP' : 513, |
|||
'SZL' : 15, |
|||
'THB' : 30, |
|||
'TJS' : 11, |
|||
'TMM' : 16770, |
|||
'TMT' : 3.35, |
|||
'TND' : 2.69, |
|||
'TOP' : 2.22, |
|||
'TRL' : 7456951, |
|||
'TRY' : 7.46, |
|||
'TTD' : 6.66, |
|||
'TWD' : 28, |
|||
'TZS' : 2309, |
|||
'UAH' : 28, |
|||
'UGX' : 3641, |
|||
'USD' : 1, |
|||
'UYU' : 43, |
|||
'UZS' : 10427, |
|||
'VEB' : 1.86275657102E+14, |
|||
'VEF' : 186275657102, |
|||
'VND' : 22940, |
|||
'VUV' : 112, |
|||
'WST' : 2.43, |
|||
'XAF' : 545, |
|||
'XAG' : 0.038609238198237, |
|||
'XAU' : 0.000584537038152, |
|||
'XCD' : 2.7, |
|||
'XEU' : 0.83144322027478, |
|||
'XOF' : 545, |
|||
'XPD' : 0.000423507866364, |
|||
'XPF' : 99, |
|||
'XPT' : 0.00085367167460603, |
|||
'YER' : 250, |
|||
'YUN' : 97, |
|||
'ZAR' : 15, |
|||
'ZMK' : 5176, |
|||
'ZWD' : 373 |
|||
}; |
|||
/* Localize the amount errors. Call when initialising form. */ |
|||
donationForm.localizeErrors = function() { |
|||
var currency = donationForm.currency; |
|||
var minAmount = donationForm.minimums[ currency ]; |
|||
/* T287706 - round to 2 decimal places (rounding up) */ |
|||
var numFormat = function( amount ) { |
|||
return Math.ceil( amount * 100 ) / 100; |
|||
}; |
|||
$('.lp-error-smallamount').text( function( index, oldText ) { |
|||
return oldText.replace( '$1', numFormat( minAmount ) + ' ' + currency ); |
|||
}); |
|||
if ( currency === 'USD' ) { |
|||
// we don't need to include the conversion |
|||
$('.lp-error-bigamount').text( function( index, oldText ) { |
|||
return oldText.replace( '($1 $2) ', '' ) |
|||
.replace( '($1 $2) ', '' ); |
|||
}); |
|||
} |
|||
$('.lp-error-bigamount').text( function( index, oldText ) { |
|||
return oldText.replace( '$1', numFormat( donationForm.maxUSD * minAmount ) ) |
|||
.replace( '$2', currency ) |
|||
.replace( '$3', 'benefactors@wikimedia.org' ) |
|||
.replace( '$4', donationForm.maxUSD ); |
|||
}); |
|||
}; |
|||
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 = donationForm.currency; |
|||
var language = mw.config.get('wgPageContentLanguage'); |
|||
// If changing, please update https://docs.google.com/spreadsheets/d/1e02TsZ_bKDAS1BMVBCdyo9D7RGln_wCGnkg7IF5kU5s/edit |
|||
var radioAmountsData = { |
|||
'USD' : { |
|||
'default' : [ |
|||
[ 0, [ 2.75, 5, 10, 20, 25, 35, 50 ] ], |
|||
[ 5, [ 5, 10, 15, 20, 35, 50, 100 ] ], |
|||
[ 10, [ 10, 15, 20, 25, 35, 50, 100 ] ], |
|||
[ 15, [ 15, 20, 25, 35, 50, 75, 100 ] ], |
|||
[ 20, [ 20, 25, 35, 50, 75, 100, 150 ] ], |
|||
[ 25, [ 25, 30, 40, 50, 75, 100, 150 ] ], |
|||
[ 35, [ 35, 50, 75, 100, 200, 300, 500 ] ], |
|||
[ 75, [ 75, 100, 150, 250, 500, 750, 1000 ] ], |
|||
[ 100, [ 100, 150, 250, 500, 750, 1000, 2500 ] ], |
|||
[ 150, [ 150, 200, 300, 500, 750, 1000, 2000 ] ], |
|||
[ 200, [ 200, 300, 500, 750, 1000, 2500, 5000 ] ], |
|||
[ 500, [ 500, 750, 1000, 2500, 5000, 7500, 10000 ] ], |
|||
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 10000 ] ], |
|||
[ 3000, [ 3000, 4000, 5000, 6000, 7500, 10000, 12000 ] ] |
|||
], |
|||
'2incvar' : [ |
|||
[ 0, [ 1, 5, 10, 15, 20, 30, 50 ] ], |
|||
[ 3, [ 3, 5, 10, 20, 35, 50, 75 ] ], |
|||
[ 6, [ 6, 10, 20, 35, 50, 75, 100 ] ], |
|||
[ 10, [ 10, 15, 25, 50, 75, 100, 125 ] ], |
|||
[ 13, [ 13, 20, 35, 50, 75, 100, 125 ] ], |
|||
[ 16, [ 16, 25, 50, 75, 100, 150, 200 ] ], |
|||
[ 20, [ 20, 35, 50, 75, 125, 150, 200 ] ], |
|||
[ 23, [ 23, 35, 50, 75, 125, 175, 250 ] ], |
|||
[ 26, [ 26, 35, 50, 75, 125, 175, 250 ] ], |
|||
[ 30, [ 30, 40, 50, 75, 125, 175, 250 ] ], |
|||
[ 35, [ 35, 45, 50, 100, 125, 175, 250 ] ], |
|||
[ 40, [ 40, 50, 75, 100, 150, 250, 300 ] ], |
|||
[ 45, [ 45, 50, 75, 100, 150, 250, 500 ] ], |
|||
[ 50, [ 50, 60, 100, 125, 175, 250, 500 ] ], |
|||
[ 60, [ 60, 75, 100, 125, 175, 250, 500 ] ], |
|||
[ 70, [ 70, 85, 100, 125, 175, 250, 500 ] ], |
|||
[ 80, [ 80, 100, 125, 150, 200, 300, 500 ] ], |
|||
[ 90, [ 90, 100, 125, 150, 200, 300, 500 ] ], |
|||
[ 100, [ 100, 125, 175, 250, 350, 500, 750 ] ], |
|||
[ 125, [ 125, 150, 200, 300, 500, 750, 1000 ] ], |
|||
[ 150, [ 150, 175, 250, 400, 500, 750, 1000 ] ], |
|||
[ 175, [ 175, 200, 300, 400, 500, 750, 1000 ] ], |
|||
[ 200, [ 200, 250, 300, 400, 500, 750, 1000 ] ], |
|||
], |
|||
'3incvarsv' : [ |
|||
[ 0, [ 1, 5, 7.50, 10, 15, 20, 30 ] ], |
|||
[ 3, [ 3, 5, 10, 15, 20, 25, 40 ] ], |
|||
[ 6, [ 6, 10, 15, 20, 30, 40, 50 ] ], |
|||
[ 10, [ 10, 15, 20, 25, 30, 40, 50 ] ], |
|||
[ 13, [ 13, 20, 25, 35, 45, 55, 75 ] ], |
|||
[ 16, [ 16, 20, 25, 35, 45, 55, 75 ] ], |
|||
[ 20, [ 20, 25, 35, 45, 55, 75, 100 ] ], |
|||
[ 23, [ 23, 30, 37, 45, 55, 75, 100 ] ], |
|||
[ 26, [ 26, 30, 37, 45, 55, 75, 100 ] ], |
|||
[ 30, [ 30, 35, 40, 45, 55, 75, 100 ] ], |
|||
[ 35, [ 35, 40, 45, 50, 65, 75, 100 ] ], |
|||
[ 40, [ 40, 45, 50, 65, 75, 100, 125 ] ], |
|||
[ 45, [ 45, 50, 55, 65, 75, 100, 125 ] ], |
|||
[ 50, [ 50, 60, 75, 100, 125, 150, 200 ] ], |
|||
[ 60, [ 60, 70, 80, 100, 125, 150, 200 ] ], |
|||
[ 70, [ 70, 80, 100, 125, 150, 200, 250 ] ], |
|||
[ 80, [ 80, 90, 100, 125, 150, 200, 250 ] ], |
|||
[ 90, [ 90, 100, 125, 150, 200, 250, 300 ] ], |
|||
[ 100, [ 100, 110, 150, 200, 250, 300, 350 ] ], |
|||
[ 125, [ 125, 150, 200, 250, 300, 400, 500 ] ], |
|||
[ 150, [ 150, 175, 200, 250, 300, 400, 500 ] ], |
|||
[ 175, [ 175, 200, 250, 300, 400, 500, 750 ] ], |
|||
[ 200, [ 200, 250, 300, 350, 400, 500, 750 ] ], |
|||
], |
|||
'4HA7' : [ |
|||
[ 0, [ 2.75, 5, 10, 20, 25, 35, 100 ] ], |
|||
[ 5, [ 5, 10, 15, 20, 35, 50, 200 ] ], |
|||
[ 10, [ 10, 15, 20, 25, 35, 50, 250 ] ], |
|||
[ 15, [ 15, 20, 25, 35, 50, 75, 300 ] ], |
|||
[ 20, [ 20, 25, 35, 50, 75, 100, 500 ] ], |
|||
[ 25, [ 25, 30, 40, 50, 75, 100, 500 ] ], |
|||
[ 35, [ 35, 50, 75, 100, 200, 300, 1000 ] ], |
|||
[ 75, [ 75, 100, 150, 250, 500, 750, 2000 ] ], |
|||
[ 100, [ 100, 150, 250, 500, 750, 1000, 5000 ] ], |
|||
[ 150, [ 150, 200, 300, 500, 750, 1000, 7500 ] ], |
|||
[ 200, [ 200, 300, 500, 750, 1000, 2500, 10000 ] ], |
|||
[ 500, [ 500, 750, 1000, 2500, 5000, 7500, 12000 ] ], |
|||
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 12000 ] ] |
|||
], |
|||
'5LA1' : [ |
|||
[ 0, [ 1, 5, 10, 15, 20, 30, 50 ] ], |
|||
[ 3, [ 3, 5, 10, 20, 35, 50, 75 ] ], |
|||
[ 6, [ 5, 10, 20, 35, 50, 75, 100 ] ], |
|||
[ 10, [ 10, 15, 25, 50, 75, 100, 125 ] ], |
|||
[ 13, [ 10, 20, 35, 50, 75, 100, 125 ] ], |
|||
[ 16, [ 15, 25, 50, 75, 100, 150, 200 ] ], |
|||
[ 20, [ 20, 35, 50, 75, 125, 150, 200 ] ], |
|||
[ 23, [ 20, 35, 50, 75, 125, 175, 250 ] ], |
|||
[ 26, [ 25, 35, 50, 75, 125, 175, 250 ] ], |
|||
[ 30, [ 30, 40, 50, 75, 125, 175, 250 ] ], |
|||
[ 35, [ 35, 45, 50, 100, 125, 175, 300 ] ], |
|||
[ 40, [ 40, 50, 75, 100, 150, 200, 300 ] ], |
|||
[ 45, [ 45, 50, 75, 100, 150, 250, 500 ] ], |
|||
[ 50, [ 50, 75, 100, 125, 175, 250, 500 ] ], |
|||
[ 60, [ 60, 75, 100, 125, 175, 250, 500 ] ], |
|||
[ 70, [ 70, 85, 100, 125, 175, 250, 500 ] ], |
|||
[ 80, [ 80, 100, 125, 150, 200, 300, 500 ] ], |
|||
[ 90, [ 90, 100, 125, 150, 200, 300, 500 ] ], |
|||
[ 100, [ 100, 125, 175, 250, 350, 500, 750 ] ], |
|||
[ 125, [ 125, 150, 200, 300, 500, 750, 1000 ] ], |
|||
[ 150, [ 150, 200, 300, 400, 500, 750, 1000 ] ], |
|||
[ 175, [ 175, 200, 300, 400, 500, 750, 1000 ] ], |
|||
[ 200, [ 200, 225, 300, 400, 500, 750, 1000 ] ], |
|||
], |
|||
'2018control' : [ |
|||
[ 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 ] ] |
|||
] |
|||
}, |
|||
'JPY' : [ |
|||
[ 0, [ 500, 1000, 2000, 2500, 4000, 5000, 10000 ] ], |
|||
[ 1000, [ 1000, 1500, 2500, 4000, 5000, 10000, 15000 ] ], |
|||
[ 1500, [ 1500, 2000, 3000, 4000, 5000, 10000, 15000 ] ], |
|||
[ 2000, [ 2000, 2500, 3500, 5000, 7500, 10000, 25000 ] ], |
|||
[ 2500, [ 2500, 3500, 5000, 7500, 10000, 15000, 25000 ] ], |
|||
[ 3000, [ 3000, 4000, 5000, 7500, 10000, 15000, 25000 ] ], |
|||
[ 2500, [ 2500, 5000, 7500, 10000, 20000, 30000, 50000 ] ], |
|||
[ 2500, [ 2500, 5000, 7500, 10000, 20000, 50000, 100000 ] ], |
|||
[ 5000, [ 5000, 10000, 15000, 20000, 35000, 50000, 100000 ] ], |
|||
[ 10000, [ 10000, 25000, 50000, 75000, 100000, 150000, 200000 ] ] |
|||
], |
|||
'SEK' : [ |
|||
[ 0, [ 20, 50, 100, 200, 300, 500, 1000 ] ], |
|||
[ 30, [ 30, 50, 100, 200, 300, 500, 1000 ] ], |
|||
[ 50, [ 50, 100, 150, 200, 300, 500, 1000 ] ], |
|||
[ 200, [ 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 ) { |
|||
var $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); |
|||
} |
|||
donationForm.updateFeeDisplay(); |
|||
} |
|||
} |
|||
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' : 'vma', // Adyen - Carte Bancaire was removed |
|||
'IT' : 'vmaj', |
|||
'LU' : 'vmaj', |
|||
'LV' : 'vma', |
|||
'NL' : 'vmaj', |
|||
'PT' : 'vmaj', |
|||
'SK' : 'vmaj', |
|||
// Others |
|||
'DK' : 'vma', |
|||
'HU' : 'vma', |
|||
'IL' : 'vmad', // Adyen |
|||
'JP' : 'vmj', |
|||
'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 selectAmount() { |
|||
$('#input_amount_other_box').val(''); |
|||
} |
|||
/* -- Moved from Template:2012FR/Form-section/Processing/Default -- */ |
|||
/** |
|||
* Validate form, and if it looks good submit to payments |
|||
* |
|||
* @param {string} paymentMethod - method e.g. 'cc', 'paypal' |
|||
* @param {string} paymentSubMethod - submethod e.g. 'rtbt_ideal' (a submethod of 'rtbt') |
|||
* @param {string} skipAmountValidation - skip validating amount for PayPal forced to USD |
|||
*/ |
|||
donationForm.redirectPayment = function( paymentMethod, paymentSubMethod, skipAmountValidation ) { |
|||
if ( donationForm.validate( skipAmountValidation ) ) { |
|||
var uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:GatewayFormChooser'); |
|||
var params = {}; |
|||
// Overrides for specific cc gateways |
|||
if ( paymentMethod === 'cc-adyen' ) { |
|||
params.payment_method = 'cc'; |
|||
params.gateway = 'adyen'; |
|||
params.ffname = 'adyen'; |
|||
} else if ( paymentMethod === 'cc-dlocal' ) { |
|||
params.payment_method = 'cc'; |
|||
params.gateway = 'astropay'; |
|||
} else { |
|||
params.payment_method = paymentMethod; |
|||
} |
|||
if ( paymentSubMethod ) { |
|||
params.payment_submethod = paymentSubMethod; |
|||
} |
|||
var frequency = $('input[name="frequency"]:checked').val(); |
|||
if ( frequency !== 'monthly' ) { |
|||
params.recurring = false; |
|||
} else { |
|||
params.recurring = true; |
|||
} |
|||
params.currency_code = donationForm.currency; |
|||
params.country = donationForm.country; |
|||
params.uselang = mw.config.get('wgPageContentLanguage'); // see T281285 for why not wgUserLanguage |
|||
if ( params.uselang === 'pt' && params.country === 'BR' ) { |
|||
params.uselang = 'pt-br'; |
|||
} |
|||
if ( params.uselang === 'es' && |
|||
( params.country === 'AR' || params.country === 'CL' || |
|||
params.country === 'CO' || params.country === 'MX' || |
|||
params.country === 'PE' || params.country === 'UY' || |
|||
params.country === 'US' ) |
|||
) { |
|||
params.uselang = 'es-419'; |
|||
} |
|||
var amount = donationForm.getAmount(); |
|||
if ( $('#ptf-checkbox').prop('checked') ) { |
|||
amount = amount + donationForm.calculateFee( amount ); |
|||
donationForm.extraData.ptf = 1; |
|||
} |
|||
params.amount = amount; |
|||
// Email optin |
|||
if ( $('input[name="opt_in"]').length > 0 ) { |
|||
var opt_inValue = $('input[name="opt_in"]:checked').val(); |
|||
params.opt_in = opt_inValue; // donationForm.validate() already checked it's 1 or 0 |
|||
} |
|||
// Default to variant = panExplain for India |
|||
// TODO: make this default payments side - https://phabricator.wikimedia.org/T259146 |
|||
if ( donationForm.country === 'IN' ) { |
|||
params.variant = 'panExplain'; |
|||
} |
|||
if ( mw.util.getParamValue( 'pym_variant' ) ) { |
|||
params.variant = mw.util.getParamValue( 'pym_variant' ); |
|||
} |
|||
if ( mw.util.getParamValue( 'pym_appeal' ) ) { |
|||
params.appeal = mw.util.getParamValue( 'pym_appeal' ); |
|||
} |
|||
donationForm.extraData.time = Math.round( (Date.now() - donationForm.loadedTime)/1000 ); |
|||
// Tracking data |
|||
params.utm_medium = mw.util.getParamValue( 'utm_medium' ); |
|||
params.utm_campaign = mw.util.getParamValue( 'utm_campaign' ); |
|||
params.utm_source = donationForm.buildUtmSource( params ); |
|||
params.utm_key = donationForm.buildUtmKey( donationForm.extraData ); |
|||
if ( document.referrer ) { // TODO: do we need this? |
|||
// Strip protocol to stop firewall complaining |
|||
params.referrer = document.referrer.replace(/https?:\/\//i, ''); |
|||
} |
|||
uri.extend( params ); |
|||
donationForm.goToPayments( uri ); |
|||
} else { |
|||
donationForm.extraData.validateError = 1; // Flag they had an error, even if fixed later |
|||
} |
|||
return false; // don't submit if called by a button |
|||
}; |
|||
donationForm.goToPayments = function( uri ) { |
|||
if ( window.top !== window.self ) { |
|||
// In a frame, open payments in a new tab |
|||
window.open( uri.toString() ); |
|||
} else { |
|||
window.location.href = uri.toString(); |
|||
} |
|||
}; |
|||
/** |
|||
* Build a utm_source value, including the landing page info. |
|||
* |
|||
* Own function so it can be overriden for weird tests |
|||
* |
|||
* @param {Object} params |
|||
* @return {string} utm_source |
|||
*/ |
|||
donationForm.buildUtmSource = function( params ) { |
|||
var utm_source = mw.util.getParamValue( 'utm_source' ) + '.'; |
|||
var fullDottedPaymentMethod = params.payment_method; |
|||
if ( params.recurring ) { |
|||
fullDottedPaymentMethod = 'r' + fullDottedPaymentMethod; |
|||
} |
|||
if ( params.payment_submethod ) { |
|||
fullDottedPaymentMethod = fullDottedPaymentMethod + '.' + params.payment_submethod; |
|||
} |
|||
/* Get URL parameter, but remove parts using old format. Allow fallback to a default value */ |
|||
var getParam = function( param, removeText, dflt ) { |
|||
if ( mw.util.getParamValue( param ) ) { |
|||
return mw.util.getParamValue( param ).replace( removeText, '' ); |
|||
} else { |
|||
return dflt; |
|||
} |
|||
}; |
|||
/* The landing page info, separated by ~. This mostly exists for legacy reasons */ |
|||
utm_source += getParam( 'template' , 'Lp-layout' , 'default' ) + '~'; |
|||
utm_source += getParam( 'appeal-template' , 'Appeal-template-' , 'default' ) + '~'; |
|||
utm_source += getParam( 'appeal' , 'Appeal-' , 'default' ) + '~'; |
|||
utm_source += getParam( 'form-template' , 'Form-template-' , 'default' ) + '~'; |
|||
utm_source += getParam( 'form-countryspecific', 'Form-countryspecific-', 'control' ); |
|||
utm_source += '.' + fullDottedPaymentMethod; |
|||
return utm_source; |
|||
}; |
|||
/** |
|||
* Build a string for utm_key from extra tracking data |
|||
* |
|||
* @param {Object} data |
|||
* @return {string} utm_key |
|||
*/ |
|||
donationForm.buildUtmKey = function(data) { |
|||
var existingUtmKey = mw.util.getParamValue('utm_key'), |
|||
dataArray = []; |
|||
if ( existingUtmKey ) { |
|||
dataArray.push( existingUtmKey ); |
|||
} |
|||
for (var key in data) { |
|||
if (data.hasOwnProperty(key)) { |
|||
dataArray.push( key + '_' + data[key] ); |
|||
} |
|||
} |
|||
return dataArray.join('~'); |
|||
}; |
|||
/* Return amount selected or input */ |
|||
donationForm.getAmount = function() { |
|||
var form = document.forms['donateForm'], |
|||
amount = null; |
|||
donationForm.extraData.otherAmt = 0; |
|||
// If there are some amount radio buttons, then look for the checked one |
|||
if ( form.amount ) { |
|||
for ( var i = 0; i < form.amount.length; i++ ) { |
|||
if ( form.amount[i].checked ) { |
|||
amount = parseFloat( form.amount[i].value ); |
|||
} |
|||
} |
|||
} |
|||
// Check the "other" amount box |
|||
if ( document.getElementById('input_amount_other').checked ) { |
|||
amount = donationForm.parseOtherAmount( form.input_amount_other_box.value ); |
amount = donationForm.parseOtherAmount( form.input_amount_other_box.value ); |
||
donationForm.extraData.otherAmt = 1; |
donationForm.extraData.otherAmt = 1; |
Revision as of 17:11, 24 August 2021
/* jshint strict:false */
/** MediaWiki:DonationForm.js - loaded on all donation forms
* TODO: lots of cleanup
*/
var donationForm = {};
donationForm.loadedTime = Date.now();
donationForm.extraData = {
'vw' : window.innerWidth,
'vh' : window.innerHeight
};
if ( navigator.brave !== undefined ) { // T283367
donationForm.extraData.brave = '1';
}
// Don't offer recurring at all in these countries
donationForm.noRecurringCountries = [ 'AR', 'CL', 'CO', 'MX', 'PE', 'UY', 'BR', 'IN' ];
donationForm.maxUSD = 12000;
donationForm.minimums = {
/* From https://github.com/wikimedia/wikimedia-fundraising-SmashPig/blob/master/PaymentData/ReferenceData/CurrencyRates.php */
'ADF' : 5.45,
'ADP' : 138,
'AED' : 3.67,
'AFA' : 77,
'AFN' : 77,
'ALL' : 102,
'AMD' : 522,
'ANG' : 1.79,
'AOA' : 622,
'AON' : 622,
'ARS' : 90,
'ATS' : 11,
'AUD' : 1.29,
'AWG' : 1.79,
'AZM' : 8500,
'AZN' : 1.7,
'BAM' : 1.63,
'BBD' : 2,
'BDT' : 83,
'BEF' : 34,
'BGL' : 1.63,
'BGN' : 1.63,
'BHD' : 0.37503712235129,
'BIF' : 1927,
'BMD' : 1,
'BND' : 1.33,
'BOB' : 6.74,
'BRL' : 5.62,
'BSD' : 1,
'BTN' : 73,
'BWP' : 11,
'BYR' : 26065,
'BZD' : 1.97,
'CAD' : 1.26,
'CDF' : 1975,
'CHF' : 0.92373627643191,
'CLP' : 729,
'CNY' : 6.47,
'COP' : 3660,
'CRC' : 601,
'CUC' : 1,
'CUP' : 25,
'CVE' : 92,
'CYP' : 0.4866220993031,
'CZK' : 22,
'DEM' : 1.63,
'DJF' : 178,
'DKK' : 6.18,
'DOP' : 57,
'DZD' : 133,
'ECS' : 24094,
'EEK' : 13,
'EGP' : 16,
'ESP' : 138,
'ETB' : 40,
'EUR' : 0.83144322027478,
'FIM' : 4.94,
'FJD' : 2.02,
'FKP' : 0.71743442231745,
'FRF' : 5.45,
'GBP' : 0.71743442231745,
'GEL' : 3.3,
'GHC' : 57159,
'GHS' : 5.72,
'GIP' : 0.71743442231745,
'GMD' : 51,
'GNF' : 10041,
'GRD' : 283,
'GTQ' : 7.53,
'GYD' : 201,
'HKD' : 7.76,
'HNL' : 24,
'HRK' : 6.3,
'HTG' : 76,
'HUF' : 303,
'IDR' : 14279,
'IEP' : 0.65481474833248,
'ILS' : 3.3,
'INR' : 73,
'IQD' : 1442,
'IRR' : 42010,
'ISK' : 127,
'ITL' : 1610,
'JMD' : 149,
'JOD' : 0.70900000000001,
'JPY' : 107,
'KES' : 109,
'KGS' : 85,
'KHR' : 4019,
'KMF' : 409,
'KPW' : 135,
'KRW' : 1126,
'KWD' : 0.30191153907257,
'KYD' : 0.83333299999999,
'KZT' : 418,
'LAK' : 9170,
'LBP' : 1508,
'LKR' : 194,
'LRD' : 173,
'LSL' : 15,
'LTL' : 2.87,
'LUF' : 34,
'LVL' : 0.58434162098198,
'LYD' : 4.42,
'MAD' : 8.82,
'MDL' : 17,
'MGA' : 3716,
'MGF' : 9150,
'MKD' : 51,
'MMK' : 1392,
'MNT' : 2620,
'MOP' : 7.99,
'MRO' : 357,
'MTL' : 0.35693857446396,
'MUR' : 39,
'MVR' : 15,
'MWK' : 770,
'MXN' : 21,
'MYR' : 4.05,
'MZM' : 73880,
'MZN' : 74,
'NAD' : 15,
'NGN' : 380,
'NIO' : 35,
'NLG' : 1.83,
'NOK' : 8.52,
'NPR' : 115,
'NZD' : 1.38,
'OMR' : 0.38383957365098,
'PAB' : 1,
'PEN' : 3.63,
'PGK' : 3.43,
'PHP' : 49,
'PKR' : 157,
'PLN' : 3.78,
'PTE' : 167,
'PYG' : 6541,
'QAR' : 3.61,
'ROL' : 40517,
'RON' : 4.05,
'RSD' : 97,
'RUB' : 74,
'RWF' : 973,
'SAR' : 3.75,
'SBD' : 7.89,
'SCR' : 20,
'SDD' : 34467,
'SDG' : 345,
'SDP' : 2261,
'SEK' : 8.45,
'SGD' : 1.33,
'SHP' : 0.71743442231745,
'SIT' : 199,
'SKK' : 25,
'SLL' : 10105,
'SOS' : 558,
'SRD' : 14,
'SRG' : 14018,
'STD' : 20304,
'SVC' : 8.75,
'SYP' : 513,
'SZL' : 15,
'THB' : 30,
'TJS' : 11,
'TMM' : 16770,
'TMT' : 3.35,
'TND' : 2.69,
'TOP' : 2.22,
'TRL' : 7456951,
'TRY' : 7.46,
'TTD' : 6.66,
'TWD' : 28,
'TZS' : 2309,
'UAH' : 28,
'UGX' : 3641,
'USD' : 1,
'UYU' : 43,
'UZS' : 10427,
'VEB' : 1.86275657102E+14,
'VEF' : 186275657102,
'VND' : 22940,
'VUV' : 112,
'WST' : 2.43,
'XAF' : 545,
'XAG' : 0.038609238198237,
'XAU' : 0.000584537038152,
'XCD' : 2.7,
'XEU' : 0.83144322027478,
'XOF' : 545,
'XPD' : 0.000423507866364,
'XPF' : 99,
'XPT' : 0.00085367167460603,
'YER' : 250,
'YUN' : 97,
'ZAR' : 15,
'ZMK' : 5176,
'ZWD' : 373
};
/* Localize the amount errors. Call when initialising form. */
donationForm.localizeErrors = function() {
var currency = donationForm.currency;
var minAmount = donationForm.minimums[ currency ];
/* T287706 - round to 2 decimal places (rounding up) */
var numFormat = function( amount ) {
return Math.ceil( amount * 100 ) / 100;
};
$('.lp-error-smallamount').text( function( index, oldText ) {
return oldText.replace( '$1', numFormat( minAmount ) + ' ' + currency );
});
if ( currency === 'USD' ) {
// we don't need to include the conversion
$('.lp-error-bigamount').text( function( index, oldText ) {
return oldText.replace( '($1 $2) ', '' )
.replace( '($1 $2) ', '' );
});
}
$('.lp-error-bigamount').text( function( index, oldText ) {
return oldText.replace( '$1', numFormat( donationForm.maxUSD * minAmount ) )
.replace( '$2', currency )
.replace( '$3', 'benefactors@wikimedia.org' )
.replace( '$4', donationForm.maxUSD );
});
};
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 = donationForm.currency;
var language = mw.config.get('wgPageContentLanguage');
// If changing, please update https://docs.google.com/spreadsheets/d/1e02TsZ_bKDAS1BMVBCdyo9D7RGln_wCGnkg7IF5kU5s/edit
var radioAmountsData = {
'USD' : {
'default' : [
[ 0, [ 2.75, 5, 10, 20, 25, 35, 50 ] ],
[ 5, [ 5, 10, 15, 20, 35, 50, 100 ] ],
[ 10, [ 10, 15, 20, 25, 35, 50, 100 ] ],
[ 15, [ 15, 20, 25, 35, 50, 75, 100 ] ],
[ 20, [ 20, 25, 35, 50, 75, 100, 150 ] ],
[ 25, [ 25, 30, 40, 50, 75, 100, 150 ] ],
[ 35, [ 35, 50, 75, 100, 200, 300, 500 ] ],
[ 75, [ 75, 100, 150, 250, 500, 750, 1000 ] ],
[ 100, [ 100, 150, 250, 500, 750, 1000, 2500 ] ],
[ 150, [ 150, 200, 300, 500, 750, 1000, 2000 ] ],
[ 200, [ 200, 300, 500, 750, 1000, 2500, 5000 ] ],
[ 500, [ 500, 750, 1000, 2500, 5000, 7500, 10000 ] ],
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 10000 ] ],
[ 3000, [ 3000, 4000, 5000, 6000, 7500, 10000, 12000 ] ]
],
'2incvar' : [
[ 0, [ 1, 5, 10, 15, 20, 30, 50 ] ],
[ 3, [ 3, 5, 10, 20, 35, 50, 75 ] ],
[ 6, [ 6, 10, 20, 35, 50, 75, 100 ] ],
[ 10, [ 10, 15, 25, 50, 75, 100, 125 ] ],
[ 13, [ 13, 20, 35, 50, 75, 100, 125 ] ],
[ 16, [ 16, 25, 50, 75, 100, 150, 200 ] ],
[ 20, [ 20, 35, 50, 75, 125, 150, 200 ] ],
[ 23, [ 23, 35, 50, 75, 125, 175, 250 ] ],
[ 26, [ 26, 35, 50, 75, 125, 175, 250 ] ],
[ 30, [ 30, 40, 50, 75, 125, 175, 250 ] ],
[ 35, [ 35, 45, 50, 100, 125, 175, 250 ] ],
[ 40, [ 40, 50, 75, 100, 150, 250, 300 ] ],
[ 45, [ 45, 50, 75, 100, 150, 250, 500 ] ],
[ 50, [ 50, 60, 100, 125, 175, 250, 500 ] ],
[ 60, [ 60, 75, 100, 125, 175, 250, 500 ] ],
[ 70, [ 70, 85, 100, 125, 175, 250, 500 ] ],
[ 80, [ 80, 100, 125, 150, 200, 300, 500 ] ],
[ 90, [ 90, 100, 125, 150, 200, 300, 500 ] ],
[ 100, [ 100, 125, 175, 250, 350, 500, 750 ] ],
[ 125, [ 125, 150, 200, 300, 500, 750, 1000 ] ],
[ 150, [ 150, 175, 250, 400, 500, 750, 1000 ] ],
[ 175, [ 175, 200, 300, 400, 500, 750, 1000 ] ],
[ 200, [ 200, 250, 300, 400, 500, 750, 1000 ] ],
],
'3incvarsv' : [
[ 0, [ 1, 5, 7.50, 10, 15, 20, 30 ] ],
[ 3, [ 3, 5, 10, 15, 20, 25, 40 ] ],
[ 6, [ 6, 10, 15, 20, 30, 40, 50 ] ],
[ 10, [ 10, 15, 20, 25, 30, 40, 50 ] ],
[ 13, [ 13, 20, 25, 35, 45, 55, 75 ] ],
[ 16, [ 16, 20, 25, 35, 45, 55, 75 ] ],
[ 20, [ 20, 25, 35, 45, 55, 75, 100 ] ],
[ 23, [ 23, 30, 37, 45, 55, 75, 100 ] ],
[ 26, [ 26, 30, 37, 45, 55, 75, 100 ] ],
[ 30, [ 30, 35, 40, 45, 55, 75, 100 ] ],
[ 35, [ 35, 40, 45, 50, 65, 75, 100 ] ],
[ 40, [ 40, 45, 50, 65, 75, 100, 125 ] ],
[ 45, [ 45, 50, 55, 65, 75, 100, 125 ] ],
[ 50, [ 50, 60, 75, 100, 125, 150, 200 ] ],
[ 60, [ 60, 70, 80, 100, 125, 150, 200 ] ],
[ 70, [ 70, 80, 100, 125, 150, 200, 250 ] ],
[ 80, [ 80, 90, 100, 125, 150, 200, 250 ] ],
[ 90, [ 90, 100, 125, 150, 200, 250, 300 ] ],
[ 100, [ 100, 110, 150, 200, 250, 300, 350 ] ],
[ 125, [ 125, 150, 200, 250, 300, 400, 500 ] ],
[ 150, [ 150, 175, 200, 250, 300, 400, 500 ] ],
[ 175, [ 175, 200, 250, 300, 400, 500, 750 ] ],
[ 200, [ 200, 250, 300, 350, 400, 500, 750 ] ],
],
'4HA7' : [
[ 0, [ 2.75, 5, 10, 20, 25, 35, 100 ] ],
[ 5, [ 5, 10, 15, 20, 35, 50, 200 ] ],
[ 10, [ 10, 15, 20, 25, 35, 50, 250 ] ],
[ 15, [ 15, 20, 25, 35, 50, 75, 300 ] ],
[ 20, [ 20, 25, 35, 50, 75, 100, 500 ] ],
[ 25, [ 25, 30, 40, 50, 75, 100, 500 ] ],
[ 35, [ 35, 50, 75, 100, 200, 300, 1000 ] ],
[ 75, [ 75, 100, 150, 250, 500, 750, 2000 ] ],
[ 100, [ 100, 150, 250, 500, 750, 1000, 5000 ] ],
[ 150, [ 150, 200, 300, 500, 750, 1000, 7500 ] ],
[ 200, [ 200, 300, 500, 750, 1000, 2500, 10000 ] ],
[ 500, [ 500, 750, 1000, 2500, 5000, 7500, 12000 ] ],
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 12000 ] ]
],
'5LA1' : [
[ 0, [ 1, 5, 10, 15, 20, 30, 50 ] ],
[ 3, [ 3, 5, 10, 20, 35, 50, 75 ] ],
[ 6, [ 5, 10, 20, 35, 50, 75, 100 ] ],
[ 10, [ 10, 15, 25, 50, 75, 100, 125 ] ],
[ 13, [ 10, 20, 35, 50, 75, 100, 125 ] ],
[ 16, [ 15, 25, 50, 75, 100, 150, 200 ] ],
[ 20, [ 20, 35, 50, 75, 125, 150, 200 ] ],
[ 23, [ 20, 35, 50, 75, 125, 175, 250 ] ],
[ 26, [ 25, 35, 50, 75, 125, 175, 250 ] ],
[ 30, [ 30, 40, 50, 75, 125, 175, 250 ] ],
[ 35, [ 35, 45, 50, 100, 125, 175, 300 ] ],
[ 40, [ 40, 50, 75, 100, 150, 200, 300 ] ],
[ 45, [ 45, 50, 75, 100, 150, 250, 500 ] ],
[ 50, [ 50, 75, 100, 125, 175, 250, 500 ] ],
[ 60, [ 60, 75, 100, 125, 175, 250, 500 ] ],
[ 70, [ 70, 85, 100, 125, 175, 250, 500 ] ],
[ 80, [ 80, 100, 125, 150, 200, 300, 500 ] ],
[ 90, [ 90, 100, 125, 150, 200, 300, 500 ] ],
[ 100, [ 100, 125, 175, 250, 350, 500, 750 ] ],
[ 125, [ 125, 150, 200, 300, 500, 750, 1000 ] ],
[ 150, [ 150, 200, 300, 400, 500, 750, 1000 ] ],
[ 175, [ 175, 200, 300, 400, 500, 750, 1000 ] ],
[ 200, [ 200, 225, 300, 400, 500, 750, 1000 ] ],
],
'2018control' : [
[ 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 ] ]
]
},
'JPY' : [
[ 0, [ 500, 1000, 2000, 2500, 4000, 5000, 10000 ] ],
[ 1000, [ 1000, 1500, 2500, 4000, 5000, 10000, 15000 ] ],
[ 1500, [ 1500, 2000, 3000, 4000, 5000, 10000, 15000 ] ],
[ 2000, [ 2000, 2500, 3500, 5000, 7500, 10000, 25000 ] ],
[ 2500, [ 2500, 3500, 5000, 7500, 10000, 15000, 25000 ] ],
[ 3000, [ 3000, 4000, 5000, 7500, 10000, 15000, 25000 ] ],
[ 2500, [ 2500, 5000, 7500, 10000, 20000, 30000, 50000 ] ],
[ 2500, [ 2500, 5000, 7500, 10000, 20000, 50000, 100000 ] ],
[ 5000, [ 5000, 10000, 15000, 20000, 35000, 50000, 100000 ] ],
[ 10000, [ 10000, 25000, 50000, 75000, 100000, 150000, 200000 ] ]
],
'SEK' : [
[ 0, [ 20, 50, 100, 200, 300, 500, 1000 ] ],
[ 30, [ 30, 50, 100, 200, 300, 500, 1000 ] ],
[ 50, [ 50, 100, 150, 200, 300, 500, 1000 ] ],
[ 200, [ 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 ) {
var $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);
}
donationForm.updateFeeDisplay();
}
}
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' : 'vma', // Adyen - Carte Bancaire was removed
'IT' : 'vmaj',
'LU' : 'vmaj',
'LV' : 'vma',
'NL' : 'vmaj',
'PT' : 'vmaj',
'SK' : 'vmaj',
// Others
'DK' : 'vma',
'HU' : 'vma',
'IL' : 'vmad', // Adyen
'JP' : 'vmj',
'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 selectAmount() {
$('#input_amount_other_box').val('');
}
/* -- Moved from Template:2012FR/Form-section/Processing/Default -- */
/**
* Validate form, and if it looks good submit to payments
*
* @param {string} paymentMethod - method e.g. 'cc', 'paypal'
* @param {string} paymentSubMethod - submethod e.g. 'rtbt_ideal' (a submethod of 'rtbt')
* @param {string} skipAmountValidation - skip validating amount for PayPal forced to USD
*/
donationForm.redirectPayment = function( paymentMethod, paymentSubMethod, skipAmountValidation ) {
if ( donationForm.validate( skipAmountValidation ) ) {
var uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:GatewayFormChooser');
var params = {};
// Overrides for specific cc gateways
if ( paymentMethod === 'cc-adyen' ) {
params.payment_method = 'cc';
params.gateway = 'adyen';
params.ffname = 'adyen';
} else if ( paymentMethod === 'cc-dlocal' ) {
params.payment_method = 'cc';
params.gateway = 'astropay';
} else {
params.payment_method = paymentMethod;
}
if ( paymentSubMethod ) {
params.payment_submethod = paymentSubMethod;
}
var frequency = $('input[name="frequency"]:checked').val();
if ( frequency !== 'monthly' ) {
params.recurring = false;
} else {
params.recurring = true;
}
params.currency_code = donationForm.currency;
params.country = donationForm.country;
params.uselang = mw.config.get('wgPageContentLanguage'); // see T281285 for why not wgUserLanguage
if ( params.uselang === 'pt' && params.country === 'BR' ) {
params.uselang = 'pt-br';
}
if ( params.uselang === 'es' &&
( params.country === 'AR' || params.country === 'CL' ||
params.country === 'CO' || params.country === 'MX' ||
params.country === 'PE' || params.country === 'UY' ||
params.country === 'US' )
) {
params.uselang = 'es-419';
}
var amount = donationForm.getAmount();
if ( $('#ptf-checkbox').prop('checked') ) {
amount = amount + donationForm.calculateFee( amount );
donationForm.extraData.ptf = 1;
}
params.amount = amount;
// Email optin
if ( $('input[name="opt_in"]').length > 0 ) {
var opt_inValue = $('input[name="opt_in"]:checked').val();
params.opt_in = opt_inValue; // donationForm.validate() already checked it's 1 or 0
}
// Default to variant = panExplain for India
// TODO: make this default payments side - https://phabricator.wikimedia.org/T259146
if ( donationForm.country === 'IN' ) {
params.variant = 'panExplain';
}
if ( mw.util.getParamValue( 'pym_variant' ) ) {
params.variant = mw.util.getParamValue( 'pym_variant' );
}
if ( mw.util.getParamValue( 'pym_appeal' ) ) {
params.appeal = mw.util.getParamValue( 'pym_appeal' );
}
donationForm.extraData.time = Math.round( (Date.now() - donationForm.loadedTime)/1000 );
// Tracking data
params.utm_medium = mw.util.getParamValue( 'utm_medium' );
params.utm_campaign = mw.util.getParamValue( 'utm_campaign' );
params.utm_source = donationForm.buildUtmSource( params );
params.utm_key = donationForm.buildUtmKey( donationForm.extraData );
if ( document.referrer ) { // TODO: do we need this?
// Strip protocol to stop firewall complaining
params.referrer = document.referrer.replace(/https?:\/\//i, '');
}
uri.extend( params );
donationForm.goToPayments( uri );
} else {
donationForm.extraData.validateError = 1; // Flag they had an error, even if fixed later
}
return false; // don't submit if called by a button
};
donationForm.goToPayments = function( uri ) {
if ( window.top !== window.self ) {
// In a frame, open payments in a new tab
window.open( uri.toString() );
} else {
window.location.href = uri.toString();
}
};
/**
* Build a utm_source value, including the landing page info.
*
* Own function so it can be overriden for weird tests
*
* @param {Object} params
* @return {string} utm_source
*/
donationForm.buildUtmSource = function( params ) {
var utm_source = mw.util.getParamValue( 'utm_source' ) + '.';
var fullDottedPaymentMethod = params.payment_method;
if ( params.recurring ) {
fullDottedPaymentMethod = 'r' + fullDottedPaymentMethod;
}
if ( params.payment_submethod ) {
fullDottedPaymentMethod = fullDottedPaymentMethod + '.' + params.payment_submethod;
}
/* Get URL parameter, but remove parts using old format. Allow fallback to a default value */
var getParam = function( param, removeText, dflt ) {
if ( mw.util.getParamValue( param ) ) {
return mw.util.getParamValue( param ).replace( removeText, '' );
} else {
return dflt;
}
};
/* The landing page info, separated by ~. This mostly exists for legacy reasons */
utm_source += getParam( 'template' , 'Lp-layout' , 'default' ) + '~';
utm_source += getParam( 'appeal-template' , 'Appeal-template-' , 'default' ) + '~';
utm_source += getParam( 'appeal' , 'Appeal-' , 'default' ) + '~';
utm_source += getParam( 'form-template' , 'Form-template-' , 'default' ) + '~';
utm_source += getParam( 'form-countryspecific', 'Form-countryspecific-', 'control' );
utm_source += '.' + fullDottedPaymentMethod;
return utm_source;
};
/**
* Build a string for utm_key from extra tracking data
*
* @param {Object} data
* @return {string} utm_key
*/
donationForm.buildUtmKey = function(data) {
var existingUtmKey = mw.util.getParamValue('utm_key'),
dataArray = [];
if ( existingUtmKey ) {
dataArray.push( existingUtmKey );
}
for (var key in data) {
if (data.hasOwnProperty(key)) {
dataArray.push( key + '_' + data[key] );
}
}
return dataArray.join('~');
};
/* Return amount selected or input */
donationForm.getAmount = function() {
var form = document.forms['donateForm'],
amount = null;
donationForm.extraData.otherAmt = 0;
// If there are some amount radio buttons, then look for the checked one
if ( form.amount ) {
for ( var i = 0; i < form.amount.length; i++ ) {
if ( form.amount[i].checked ) {
amount = parseFloat( form.amount[i].value );
}
}
}
// Check the "other" amount box
if ( document.getElementById('input_amount_other').checked ) {
amount = donationForm.parseOtherAmount( form.input_amount_other_box.value );
donationForm.extraData.otherAmt = 1;
}
return amount;
};
/**
* Parse Other field value into amount
*
* Does some awful regex stuff to rm symbols and turn the string into a number
* Remember some locales flip . & , for decimal point/thousands separator
*
* @param {string} value Value of "Other" field
* @return {float} Float with amount, or 0 if NaN
*/
donationForm.parseOtherAmount = function( value ) {
var amount;
value = value.replace(/[,.](\d)$/, '\:$10');
value = value.replace(/[,.](\d)(\d)$/, '\:$1$2');
value = value.replace(/[\$£€¥,.]/g, '');
value = value.replace(/:/, '.');
amount = parseFloat( value );
if ( isNaN( amount ) ) {
return 0;
} else {
return amount;
}
};
/**
* Validate the form.
*/
donationForm.validate = function( skipAmountValidation ) {
var error = false;
var form = document.forms['donateForm'];
// Reset all errors
$('.lp-haserror').removeClass('lp-haserror');
$('.lp-error').hide();
if ( !skipAmountValidation && !donationForm.validateAmount() ) {
error = true;
}
if ( form.opt_in ) {
if ( $('input[name="opt_in"]:checked').val() === undefined ) {
$('#error-optin').show();
error = true;
} else {
$('#error-optin').hide();
}
}
return !error;
};
/**
* Check if selected amount is valid i.e. a positive number, between minimum and maximum.
* If not, show an error and return false.
*/
donationForm.validateAmount = function() {
var amount = donationForm.getAmount();
var minAmount = donationForm.minimums[ donationForm.currency ] || 1;
if ( amount === null || isNaN(amount) || amount <= 0 || amount < minAmount ) {
$('.amount-options').addClass('lp-haserror');
$('.lp-error-bigamount').hide();
$('.lp-error-smallamount').show();
return false;
} else if ( amount > donationForm.maxUSD * minAmount ) {
$('.amount-options').addClass('lp-haserror');
$('.lp-error-bigamount').show();
return false;
} else {
$('.amount-options').removeClass('lp-haserror');
$('.lp-error-smallamount, .lp-error-bigamount').hide();
return true;
}
};
donationForm.toggleMonthly = function(monthly) {
if (monthly) {
$('#form-wrapper').addClass('form-monthly');
} else {
$('#form-wrapper').removeClass('form-monthly');
}
};
donationForm.updateFeeDisplay = function() {
var selectedAmount = donationForm.getAmount(),
feeAmount = donationForm.calculateFee( selectedAmount ),
minAmount = donationForm.minimums[ donationForm.currency ] || 1,
maxAmount = donationForm.maxUSD * minAmount,
feeText;
if ( feeAmount % 1 !== 0 ) { // Not a whole number
feeText = feeAmount.toFixed(2);
} else {
feeText = feeAmount.toString();
}
$('.ptf label span').text( feeText );
if ( selectedAmount + feeAmount <= maxAmount ) {
$('.ptf').slideDown();
}
};
/**
* Calculate approximate transaction fee on given amount
* @param {number} amount
* @return {number} Rounded to 2 decimal places
*/
donationForm.calculateFee = function( amount ) {
// Minimum fee/PTF amounts. Default is 0.35.
// Updated 2019-05-21 to approx 0.35 USD equivalent
var feeMinimums = {
'DKK' : 2,
'HUF' : 100,
'ILS' : 1.2,
'INR' : 25,
'JPY' : 35,
'MYR' : 1,
'NOK' : 3,
'PLN' : 1.35,
'RON' : 1.5,
'SEK' : 3,
'UAH' : 10,
'ZAR' : 5,
// Latin America
'BRL' : 2,
'ARS' : 32,
'CLP' : 255,
'COP' : 1300,
'MXN' : 7.4,
'PEN' : 1.3,
'UYU' : 15.5
};
var feeMultiplier = 0.04,
feeMinimum = feeMinimums[ donationForm.currency ] || 0.35,
feeAmount = amount * feeMultiplier;
if ( feeAmount < feeMinimum ) {
feeAmount = feeMinimum;
}
return parseFloat( feeAmount.toFixed(2) );
};
donationForm.initOptin = function() {
$('.optin-options').on('change', function(e) {
$('#error-optin').hide();
// Only do all this if we have translated prompts
if ( $('.optin-no-prompt').data('is-translated') === 'yes' ) {
if ( e.target.id === 'optin-no' ) {
$('.optin-no-prompt').removeClass('is-positive');
if ( !$('.optin-no-prompt').is(':visible') ) {
$('.optin-no-prompt').slideDown();
}
} else {
$('.optin-no-prompt').addClass('is-positive');
}
}
});
};
/* End form functions */
$(document).ready(function() {
mw.loader.using( ['mediawiki.util'] ).done( function() {
var form = document.forms['donateForm'];
// Load monthly convert JS if needed
// TODO: allow loading different JS variants, either here or defined in the Template
if ( mw.util.getParamValue('monthlyconvert') ) {
mw.loader.load( '/w/index.php?title=MediaWiki:MonthlyConvert.js&action=raw&ctype=text/javascript' );
}
// These get used in quite a few places
donationForm.currency = form.currency_code.value;
donationForm.country = mw.util.getParamValue('country');
// 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;
}
};
}
// Validate amount and update fee when selected/entered
$('.amount-options').on( 'input change', function() {
donationForm.validateAmount();
donationForm.updateFeeDisplay();
});
// Disable submitting form with Enter key
$('form[name="donateForm"]').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 ( form ) {
// hide frequency options for some countries
if ( donationForm.noRecurringCountries.indexOf( donationForm.country ) !== -1 ) {
$('#frequency_onetime').prop('checked', true);
$('.frequency-options, #cancel-monthly, #donate-recurring-smallprint').hide();
}
addCardTypesClass( donationForm.country );
}
// Links open in new tab
$('.links-in-new-tab a').attr('target', '_blank');
// Disable logo link
$('#p-logo a').attr( { href: '#', 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')
&& donationForm.noRecurringCountries.indexOf( donationForm.country ) === -1 ) {
$('#frequency_monthly').click();
}
donationForm.initOptin();
try {
adjustHPC();
preSelect(); // Make sure to do this *after* other fiddling with values
donationForm.localizeErrors();
}
finally {
$('.ptf').appendTo('.amount-options');
$('.optin-options').insertAfter('.amount-options');
$('.consider-amounts').show();
$('#actual-form').show();
$('#actual-form-loading').hide();
}
});
});
/* jshint strict:false */
/** MediaWiki:DonationForm.js - loaded on all donation forms
* TODO: lots of cleanup
*/
var donationForm = {};
donationForm.loadedTime = Date.now();
donationForm.extraData = {
'vw' : window.innerWidth,
'vh' : window.innerHeight
};
if ( navigator.brave !== undefined ) { // T283367
donationForm.extraData.brave = '1';
}
// Don't offer recurring at all in these countries
donationForm.noRecurringCountries = [ 'AR', 'CL', 'CO', 'MX', 'PE', 'UY', 'BR', 'IN' ];
donationForm.maxUSD = 12000;
donationForm.minimums = {
/* From https://github.com/wikimedia/wikimedia-fundraising-SmashPig/blob/master/PaymentData/ReferenceData/CurrencyRates.php */
'ADF' : 5.45,
'ADP' : 138,
'AED' : 3.67,
'AFA' : 77,
'AFN' : 77,
'ALL' : 102,
'AMD' : 522,
'ANG' : 1.79,
'AOA' : 622,
'AON' : 622,
'ARS' : 90,
'ATS' : 11,
'AUD' : 1.29,
'AWG' : 1.79,
'AZM' : 8500,
'AZN' : 1.7,
'BAM' : 1.63,
'BBD' : 2,
'BDT' : 83,
'BEF' : 34,
'BGL' : 1.63,
'BGN' : 1.63,
'BHD' : 0.37503712235129,
'BIF' : 1927,
'BMD' : 1,
'BND' : 1.33,
'BOB' : 6.74,
'BRL' : 5.62,
'BSD' : 1,
'BTN' : 73,
'BWP' : 11,
'BYR' : 26065,
'BZD' : 1.97,
'CAD' : 1.26,
'CDF' : 1975,
'CHF' : 0.92373627643191,
'CLP' : 729,
'CNY' : 6.47,
'COP' : 3660,
'CRC' : 601,
'CUC' : 1,
'CUP' : 25,
'CVE' : 92,
'CYP' : 0.4866220993031,
'CZK' : 22,
'DEM' : 1.63,
'DJF' : 178,
'DKK' : 6.18,
'DOP' : 57,
'DZD' : 133,
'ECS' : 24094,
'EEK' : 13,
'EGP' : 16,
'ESP' : 138,
'ETB' : 40,
'EUR' : 0.83144322027478,
'FIM' : 4.94,
'FJD' : 2.02,
'FKP' : 0.71743442231745,
'FRF' : 5.45,
'GBP' : 0.71743442231745,
'GEL' : 3.3,
'GHC' : 57159,
'GHS' : 5.72,
'GIP' : 0.71743442231745,
'GMD' : 51,
'GNF' : 10041,
'GRD' : 283,
'GTQ' : 7.53,
'GYD' : 201,
'HKD' : 7.76,
'HNL' : 24,
'HRK' : 6.3,
'HTG' : 76,
'HUF' : 303,
'IDR' : 14279,
'IEP' : 0.65481474833248,
'ILS' : 3.3,
'INR' : 73,
'IQD' : 1442,
'IRR' : 42010,
'ISK' : 127,
'ITL' : 1610,
'JMD' : 149,
'JOD' : 0.70900000000001,
'JPY' : 107,
'KES' : 109,
'KGS' : 85,
'KHR' : 4019,
'KMF' : 409,
'KPW' : 135,
'KRW' : 1126,
'KWD' : 0.30191153907257,
'KYD' : 0.83333299999999,
'KZT' : 418,
'LAK' : 9170,
'LBP' : 1508,
'LKR' : 194,
'LRD' : 173,
'LSL' : 15,
'LTL' : 2.87,
'LUF' : 34,
'LVL' : 0.58434162098198,
'LYD' : 4.42,
'MAD' : 8.82,
'MDL' : 17,
'MGA' : 3716,
'MGF' : 9150,
'MKD' : 51,
'MMK' : 1392,
'MNT' : 2620,
'MOP' : 7.99,
'MRO' : 357,
'MTL' : 0.35693857446396,
'MUR' : 39,
'MVR' : 15,
'MWK' : 770,
'MXN' : 21,
'MYR' : 4.05,
'MZM' : 73880,
'MZN' : 74,
'NAD' : 15,
'NGN' : 380,
'NIO' : 35,
'NLG' : 1.83,
'NOK' : 8.52,
'NPR' : 115,
'NZD' : 1.38,
'OMR' : 0.38383957365098,
'PAB' : 1,
'PEN' : 3.63,
'PGK' : 3.43,
'PHP' : 49,
'PKR' : 157,
'PLN' : 3.78,
'PTE' : 167,
'PYG' : 6541,
'QAR' : 3.61,
'ROL' : 40517,
'RON' : 4.05,
'RSD' : 97,
'RUB' : 74,
'RWF' : 973,
'SAR' : 3.75,
'SBD' : 7.89,
'SCR' : 20,
'SDD' : 34467,
'SDG' : 345,
'SDP' : 2261,
'SEK' : 8.45,
'SGD' : 1.33,
'SHP' : 0.71743442231745,
'SIT' : 199,
'SKK' : 25,
'SLL' : 10105,
'SOS' : 558,
'SRD' : 14,
'SRG' : 14018,
'STD' : 20304,
'SVC' : 8.75,
'SYP' : 513,
'SZL' : 15,
'THB' : 30,
'TJS' : 11,
'TMM' : 16770,
'TMT' : 3.35,
'TND' : 2.69,
'TOP' : 2.22,
'TRL' : 7456951,
'TRY' : 7.46,
'TTD' : 6.66,
'TWD' : 28,
'TZS' : 2309,
'UAH' : 28,
'UGX' : 3641,
'USD' : 1,
'UYU' : 43,
'UZS' : 10427,
'VEB' : 1.86275657102E+14,
'VEF' : 186275657102,
'VND' : 22940,
'VUV' : 112,
'WST' : 2.43,
'XAF' : 545,
'XAG' : 0.038609238198237,
'XAU' : 0.000584537038152,
'XCD' : 2.7,
'XEU' : 0.83144322027478,
'XOF' : 545,
'XPD' : 0.000423507866364,
'XPF' : 99,
'XPT' : 0.00085367167460603,
'YER' : 250,
'YUN' : 97,
'ZAR' : 15,
'ZMK' : 5176,
'ZWD' : 373
};
/* Localize the amount errors. Call when initialising form. */
donationForm.localizeErrors = function() {
var currency = donationForm.currency;
var minAmount = donationForm.minimums[ currency ];
/* T287706 - round to 2 decimal places (rounding up) */
var numFormat = function( amount ) {
return Math.ceil( amount * 100 ) / 100;
};
$('.lp-error-smallamount').text( function( index, oldText ) {
return oldText.replace( '$1', numFormat( minAmount ) + ' ' + currency );
});
if ( currency === 'USD' ) {
// we don't need to include the conversion
$('.lp-error-bigamount').text( function( index, oldText ) {
return oldText.replace( '($1 $2) ', '' )
.replace( '($1 $2) ', '' );
});
}
$('.lp-error-bigamount').text( function( index, oldText ) {
return oldText.replace( '$1', numFormat( donationForm.maxUSD * minAmount ) )
.replace( '$2', currency )
.replace( '$3', 'benefactors@wikimedia.org' )
.replace( '$4', donationForm.maxUSD );
});
};
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 = donationForm.currency;
var language = mw.config.get('wgPageContentLanguage');
// If changing, please update https://docs.google.com/spreadsheets/d/1e02TsZ_bKDAS1BMVBCdyo9D7RGln_wCGnkg7IF5kU5s/edit
var radioAmountsData = {
'USD' : {
'default' : [
[ 0, [ 2.75, 5, 10, 20, 25, 35, 50 ] ],
[ 5, [ 5, 10, 15, 20, 35, 50, 100 ] ],
[ 10, [ 10, 15, 20, 25, 35, 50, 100 ] ],
[ 15, [ 15, 20, 25, 35, 50, 75, 100 ] ],
[ 20, [ 20, 25, 35, 50, 75, 100, 150 ] ],
[ 25, [ 25, 30, 40, 50, 75, 100, 150 ] ],
[ 35, [ 35, 50, 75, 100, 200, 300, 500 ] ],
[ 75, [ 75, 100, 150, 250, 500, 750, 1000 ] ],
[ 100, [ 100, 150, 250, 500, 750, 1000, 2500 ] ],
[ 150, [ 150, 200, 300, 500, 750, 1000, 2000 ] ],
[ 200, [ 200, 300, 500, 750, 1000, 2500, 5000 ] ],
[ 500, [ 500, 750, 1000, 2500, 5000, 7500, 10000 ] ],
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 10000 ] ],
[ 3000, [ 3000, 4000, 5000, 6000, 7500, 10000, 12000 ] ]
],
'2incvar' : [
[ 0, [ 1, 5, 10, 15, 20, 30, 50 ] ],
[ 3, [ 3, 5, 10, 20, 35, 50, 75 ] ],
[ 6, [ 6, 10, 20, 35, 50, 75, 100 ] ],
[ 10, [ 10, 15, 25, 50, 75, 100, 125 ] ],
[ 13, [ 13, 20, 35, 50, 75, 100, 125 ] ],
[ 16, [ 16, 25, 50, 75, 100, 150, 200 ] ],
[ 20, [ 20, 35, 50, 75, 125, 150, 200 ] ],
[ 23, [ 23, 35, 50, 75, 125, 175, 250 ] ],
[ 26, [ 26, 35, 50, 75, 125, 175, 250 ] ],
[ 30, [ 30, 40, 50, 75, 125, 175, 250 ] ],
[ 35, [ 35, 45, 50, 100, 125, 175, 250 ] ],
[ 40, [ 40, 50, 75, 100, 150, 250, 300 ] ],
[ 45, [ 45, 50, 75, 100, 150, 250, 500 ] ],
[ 50, [ 50, 60, 100, 125, 175, 250, 500 ] ],
[ 60, [ 60, 75, 100, 125, 175, 250, 500 ] ],
[ 70, [ 70, 85, 100, 125, 175, 250, 500 ] ],
[ 80, [ 80, 100, 125, 150, 200, 300, 500 ] ],
[ 90, [ 90, 100, 125, 150, 200, 300, 500 ] ],
[ 100, [ 100, 125, 175, 250, 350, 500, 750 ] ],
[ 125, [ 125, 150, 200, 300, 500, 750, 1000 ] ],
[ 150, [ 150, 175, 250, 400, 500, 750, 1000 ] ],
[ 175, [ 175, 200, 300, 400, 500, 750, 1000 ] ],
[ 200, [ 200, 250, 300, 400, 500, 750, 1000 ] ],
],
'3incvarsv' : [
[ 0, [ 1, 5, 7.50, 10, 15, 20, 30 ] ],
[ 3, [ 3, 5, 10, 15, 20, 25, 40 ] ],
[ 6, [ 6, 10, 15, 20, 30, 40, 50 ] ],
[ 10, [ 10, 15, 20, 25, 30, 40, 50 ] ],
[ 13, [ 13, 20, 25, 35, 45, 55, 75 ] ],
[ 16, [ 16, 20, 25, 35, 45, 55, 75 ] ],
[ 20, [ 20, 25, 35, 45, 55, 75, 100 ] ],
[ 23, [ 23, 30, 37, 45, 55, 75, 100 ] ],
[ 26, [ 26, 30, 37, 45, 55, 75, 100 ] ],
[ 30, [ 30, 35, 40, 45, 55, 75, 100 ] ],
[ 35, [ 35, 40, 45, 50, 65, 75, 100 ] ],
[ 40, [ 40, 45, 50, 65, 75, 100, 125 ] ],
[ 45, [ 45, 50, 55, 65, 75, 100, 125 ] ],
[ 50, [ 50, 60, 75, 100, 125, 150, 200 ] ],
[ 60, [ 60, 70, 80, 100, 125, 150, 200 ] ],
[ 70, [ 70, 80, 100, 125, 150, 200, 250 ] ],
[ 80, [ 80, 90, 100, 125, 150, 200, 250 ] ],
[ 90, [ 90, 100, 125, 150, 200, 250, 300 ] ],
[ 100, [ 100, 110, 150, 200, 250, 300, 350 ] ],
[ 125, [ 125, 150, 200, 250, 300, 400, 500 ] ],
[ 150, [ 150, 175, 200, 250, 300, 400, 500 ] ],
[ 175, [ 175, 200, 250, 300, 400, 500, 750 ] ],
[ 200, [ 200, 250, 300, 350, 400, 500, 750 ] ],
],
'4HA7' : [
[ 0, [ 2.75, 5, 10, 20, 25, 35, 100 ] ],
[ 5, [ 5, 10, 15, 20, 35, 50, 200 ] ],
[ 10, [ 10, 15, 20, 25, 35, 50, 250 ] ],
[ 15, [ 15, 20, 25, 35, 50, 75, 300 ] ],
[ 20, [ 20, 25, 35, 50, 75, 100, 500 ] ],
[ 25, [ 25, 30, 40, 50, 75, 100, 500 ] ],
[ 35, [ 35, 50, 75, 100, 200, 300, 1000 ] ],
[ 75, [ 75, 100, 150, 250, 500, 750, 2000 ] ],
[ 100, [ 100, 150, 250, 500, 750, 1000, 5000 ] ],
[ 150, [ 150, 200, 300, 500, 750, 1000, 7500 ] ],
[ 200, [ 200, 300, 500, 750, 1000, 2500, 10000 ] ],
[ 500, [ 500, 750, 1000, 2500, 5000, 7500, 12000 ] ],
[ 1000, [ 1000, 2000, 3000, 4000, 5000, 7500, 12000 ] ]
],
'5LA1' : [
[ 0, [ 1, 5, 10, 15, 20, 30, 50 ] ],
[ 3, [ 3, 5, 10, 20, 35, 50, 75 ] ],
[ 6, [ 5, 10, 20, 35, 50, 75, 100 ] ],
[ 10, [ 10, 15, 25, 50, 75, 100, 125 ] ],
[ 13, [ 10, 20, 35, 50, 75, 100, 125 ] ],
[ 16, [ 15, 25, 50, 75, 100, 150, 200 ] ],
[ 20, [ 20, 35, 50, 75, 125, 150, 200 ] ],
[ 23, [ 20, 35, 50, 75, 125, 175, 250 ] ],
[ 26, [ 25, 35, 50, 75, 125, 175, 250 ] ],
[ 30, [ 30, 40, 50, 75, 125, 175, 250 ] ],
[ 35, [ 35, 45, 50, 100, 125, 175, 300 ] ],
[ 40, [ 40, 50, 75, 100, 150, 200, 300 ] ],
[ 45, [ 45, 50, 75, 100, 150, 250, 500 ] ],
[ 50, [ 50, 75, 100, 125, 175, 250, 500 ] ],
[ 60, [ 60, 75, 100, 125, 175, 250, 500 ] ],
[ 70, [ 70, 85, 100, 125, 175, 250, 500 ] ],
[ 80, [ 80, 100, 125, 150, 200, 300, 500 ] ],
[ 90, [ 90, 100, 125, 150, 200, 300, 500 ] ],
[ 100, [ 100, 125, 175, 250, 350, 500, 750 ] ],
[ 125, [ 125, 150, 200, 300, 500, 750, 1000 ] ],
[ 150, [ 150, 200, 300, 400, 500, 750, 1000 ] ],
[ 175, [ 175, 200, 300, 400, 500, 750, 1000 ] ],
[ 200, [ 200, 225, 300, 400, 500, 750, 1000 ] ],
],
'2018control' : [
[ 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 ] ]
]
},
'JPY' : [
[ 0, [ 500, 1000, 2000, 2500, 4000, 5000, 10000 ] ],
[ 1000, [ 1000, 1500, 2500, 4000, 5000, 10000, 15000 ] ],
[ 1500, [ 1500, 2000, 3000, 4000, 5000, 10000, 15000 ] ],
[ 2000, [ 2000, 2500, 3500, 5000, 7500, 10000, 25000 ] ],
[ 2500, [ 2500, 3500, 5000, 7500, 10000, 15000, 25000 ] ],
[ 3000, [ 3000, 4000, 5000, 7500, 10000, 15000, 25000 ] ],
[ 2500, [ 2500, 5000, 7500, 10000, 20000, 30000, 50000 ] ],
[ 2500, [ 2500, 5000, 7500, 10000, 20000, 50000, 100000 ] ],
[ 5000, [ 5000, 10000, 15000, 20000, 35000, 50000, 100000 ] ],
[ 10000, [ 10000, 25000, 50000, 75000, 100000, 150000, 200000 ] ]
],
'SEK' : [
[ 0, [ 20, 50, 100, 200, 300, 500, 1000 ] ],
[ 30, [ 30, 50, 100, 200, 300, 500, 1000 ] ],
[ 50, [ 50, 100, 150, 200, 300, 500, 1000 ] ],
[ 200, [ 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 ) {
var $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);
}
donationForm.updateFeeDisplay();
}
}
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' : 'vma', // Adyen - Carte Bancaire was removed
'IT' : 'vmaj',
'LU' : 'vmaj',
'LV' : 'vma',
'NL' : 'vmaj',
'PT' : 'vmaj',
'SK' : 'vmaj',
// Others
'DK' : 'vma',
'HU' : 'vma',
'IL' : 'vmad', // Adyen
'JP' : 'vmj',
'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 selectAmount() {
$('#input_amount_other_box').val('');
}
/* -- Moved from Template:2012FR/Form-section/Processing/Default -- */
/**
* Validate form, and if it looks good submit to payments
*
* @param {string} paymentMethod - method e.g. 'cc', 'paypal'
* @param {string} paymentSubMethod - submethod e.g. 'rtbt_ideal' (a submethod of 'rtbt')
* @param {string} skipAmountValidation - skip validating amount for PayPal forced to USD
*/
donationForm.redirectPayment = function( paymentMethod, paymentSubMethod, skipAmountValidation ) {
if ( donationForm.validate( skipAmountValidation ) ) {
var uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:GatewayFormChooser');
var params = {};
// Overrides for specific cc gateways
if ( paymentMethod === 'cc-adyen' ) {
params.payment_method = 'cc';
params.gateway = 'adyen';
params.ffname = 'adyen';
} else if ( paymentMethod === 'cc-dlocal' ) {
params.payment_method = 'cc';
params.gateway = 'astropay';
} else {
params.payment_method = paymentMethod;
}
if ( paymentSubMethod ) {
params.payment_submethod = paymentSubMethod;
}
var frequency = $('input[name="frequency"]:checked').val();
if ( frequency !== 'monthly' ) {
params.recurring = false;
} else {
params.recurring = true;
}
params.currency_code = donationForm.currency;
params.country = donationForm.country;
params.uselang = mw.config.get('wgPageContentLanguage'); // see T281285 for why not wgUserLanguage
if ( params.uselang === 'pt' && params.country === 'BR' ) {
params.uselang = 'pt-br';
}
if ( params.uselang === 'es' &&
( params.country === 'AR' || params.country === 'CL' ||
params.country === 'CO' || params.country === 'MX' ||
params.country === 'PE' || params.country === 'UY' ||
params.country === 'US' )
) {
params.uselang = 'es-419';
}
var amount = donationForm.getAmount();
if ( $('#ptf-checkbox').prop('checked') ) {
amount = amount + donationForm.calculateFee( amount );
donationForm.extraData.ptf = 1;
}
params.amount = amount;
// Email optin
if ( $('input[name="opt_in"]').length > 0 ) {
var opt_inValue = $('input[name="opt_in"]:checked').val();
params.opt_in = opt_inValue; // donationForm.validate() already checked it's 1 or 0
}
// Default to variant = panExplain for India
// TODO: make this default payments side - https://phabricator.wikimedia.org/T259146
if ( donationForm.country === 'IN' ) {
params.variant = 'panExplain';
}
if ( mw.util.getParamValue( 'pym_variant' ) ) {
params.variant = mw.util.getParamValue( 'pym_variant' );
}
if ( mw.util.getParamValue( 'pym_appeal' ) ) {
params.appeal = mw.util.getParamValue( 'pym_appeal' );
}
donationForm.extraData.time = Math.round( (Date.now() - donationForm.loadedTime)/1000 );
// Tracking data
params.utm_medium = mw.util.getParamValue( 'utm_medium' );
params.utm_campaign = mw.util.getParamValue( 'utm_campaign' );
params.utm_source = donationForm.buildUtmSource( params );
params.utm_key = donationForm.buildUtmKey( donationForm.extraData );
if ( document.referrer ) { // TODO: do we need this?
// Strip protocol to stop firewall complaining
params.referrer = document.referrer.replace(/https?:\/\//i, '');
}
uri.extend( params );
donationForm.goToPayments( uri );
} else {
donationForm.extraData.validateError = 1; // Flag they had an error, even if fixed later
}
return false; // don't submit if called by a button
};
donationForm.goToPayments = function( uri ) {
if ( window.top !== window.self ) {
// In a frame, open payments in a new tab
window.open( uri.toString() );
} else {
window.location.href = uri.toString();
}
};
/**
* Build a utm_source value, including the landing page info.
*
* Own function so it can be overriden for weird tests
*
* @param {Object} params
* @return {string} utm_source
*/
donationForm.buildUtmSource = function( params ) {
var utm_source = mw.util.getParamValue( 'utm_source' ) + '.';
var fullDottedPaymentMethod = params.payment_method;
if ( params.recurring ) {
fullDottedPaymentMethod = 'r' + fullDottedPaymentMethod;
}
if ( params.payment_submethod ) {
fullDottedPaymentMethod = fullDottedPaymentMethod + '.' + params.payment_submethod;
}
/* Get URL parameter, but remove parts using old format. Allow fallback to a default value */
var getParam = function( param, removeText, dflt ) {
if ( mw.util.getParamValue( param ) ) {
return mw.util.getParamValue( param ).replace( removeText, '' );
} else {
return dflt;
}
};
/* The landing page info, separated by ~. This mostly exists for legacy reasons */
utm_source += getParam( 'template' , 'Lp-layout' , 'default' ) + '~';
utm_source += getParam( 'appeal-template' , 'Appeal-template-' , 'default' ) + '~';
utm_source += getParam( 'appeal' , 'Appeal-' , 'default' ) + '~';
utm_source += getParam( 'form-template' , 'Form-template-' , 'default' ) + '~';
utm_source += getParam( 'form-countryspecific', 'Form-countryspecific-', 'control' );
utm_source += '.' + fullDottedPaymentMethod;
return utm_source;
};
/**
* Build a string for utm_key from extra tracking data
*
* @param {Object} data
* @return {string} utm_key
*/
donationForm.buildUtmKey = function(data) {
var existingUtmKey = mw.util.getParamValue('utm_key'),
dataArray = [];
if ( existingUtmKey ) {
dataArray.push( existingUtmKey );
}
for (var key in data) {
if (data.hasOwnProperty(key)) {
dataArray.push( key + '_' + data[key] );
}
}
return dataArray.join('~');
};
/* Return amount selected or input */
donationForm.getAmount = function() {
var form = document.forms['donateForm'],
amount = null;
donationForm.extraData.otherAmt = 0;
// If there are some amount radio buttons, then look for the checked one
if ( form.amount ) {
for ( var i = 0; i < form.amount.length; i++ ) {
if ( form.amount[i].checked ) {
amount = parseFloat( form.amount[i].value );
}
}
}
// Check the "other" amount box
if ( document.getElementById('input_amount_other').checked ) {
amount = donationForm.parseOtherAmount( form.input_amount_other_box.value );
donationForm.extraData.otherAmt = 1;
}
return amount;
};
/**
* Parse Other field value into amount
*
* Does some awful regex stuff to rm symbols and turn the string into a number
* Remember some locales flip . & , for decimal point/thousands separator
*
* @param {string} value Value of "Other" field
* @return {float} Float with amount, or 0 if NaN
*/
donationForm.parseOtherAmount = function( value ) {
var amount;
value = value.replace(/[,.](\d)$/, '\:$10');
value = value.replace(/[,.](\d)(\d)$/, '\:$1$2');
value = value.replace(/[\$£€¥,.]/g, '');
value = value.replace(/:/, '.');
amount = parseFloat( value );
if ( isNaN( amount ) ) {
return 0;
} else {
return amount;
}
};
/**
* Validate the form.
*/
donationForm.validate = function( skipAmountValidation ) {
var error = false;
var form = document.forms['donateForm'];
// Reset all errors
$('.lp-haserror').removeClass('lp-haserror');
$('.lp-error').hide();
if ( !skipAmountValidation && !donationForm.validateAmount() ) {
error = true;
}
if ( form.opt_in ) {
if ( $('input[name="opt_in"]:checked').val() === undefined ) {
$('#error-optin').show();
error = true;
} else {
$('#error-optin').hide();
}
}
return !error;
};
/**
* Check if selected amount is valid i.e. a positive number, between minimum and maximum.
* If not, show an error and return false.
*/
donationForm.validateAmount = function() {
var amount = donationForm.getAmount();
var minAmount = donationForm.minimums[ donationForm.currency ] || 1;
if ( amount === null || isNaN(amount) || amount <= 0 || amount < minAmount ) {
$('.amount-options').addClass('lp-haserror');
$('.lp-error-bigamount').hide();
$('.lp-error-smallamount').show();
return false;
} else if ( amount > donationForm.maxUSD * minAmount ) {
$('.amount-options').addClass('lp-haserror');
$('.lp-error-bigamount').show();
return false;
} else {
$('.amount-options').removeClass('lp-haserror');
$('.lp-error-smallamount, .lp-error-bigamount').hide();
return true;
}
};
donationForm.toggleMonthly = function(monthly) {
if (monthly) {
$('#form-wrapper').addClass('form-monthly');
} else {
$('#form-wrapper').removeClass('form-monthly');
}
};
donationForm.updateFeeDisplay = function() {
var selectedAmount = donationForm.getAmount(),
feeAmount = donationForm.calculateFee( selectedAmount ),
minAmount = donationForm.minimums[ donationForm.currency ] || 1,
maxAmount = donationForm.maxUSD * minAmount,
feeText;
if ( feeAmount % 1 !== 0 ) { // Not a whole number
feeText = feeAmount.toFixed(2);
} else {
feeText = feeAmount.toString();
}
$('.ptf label span').text( feeText );
if ( selectedAmount + feeAmount <= maxAmount ) {
$('.ptf').slideDown();
}
};
/**
* Calculate approximate transaction fee on given amount
* @param {number} amount
* @return {number} Rounded to 2 decimal places
*/
donationForm.calculateFee = function( amount ) {
// Minimum fee/PTF amounts. Default is 0.35.
// Updated 2019-05-21 to approx 0.35 USD equivalent
var feeMinimums = {
'DKK' : 2,
'HUF' : 100,
'ILS' : 1.2,
'INR' : 25,
'JPY' : 35,
'MYR' : 1,
'NOK' : 3,
'PLN' : 1.35,
'RON' : 1.5,
'SEK' : 3,
'UAH' : 10,
'ZAR' : 5,
// Latin America
'BRL' : 2,
'ARS' : 32,
'CLP' : 255,
'COP' : 1300,
'MXN' : 7.4,
'PEN' : 1.3,
'UYU' : 15.5
};
var feeMultiplier = 0.04,
feeMinimum = feeMinimums[ donationForm.currency ] || 0.35,
feeAmount = amount * feeMultiplier;
if ( feeAmount < feeMinimum ) {
feeAmount = feeMinimum;
}
return parseFloat( feeAmount.toFixed(2) );
};
donationForm.initOptin = function() {
$('.optin-options').on('change', function(e) {
$('#error-optin').hide();
// Only do all this if we have translated prompts
if ( $('.optin-no-prompt').data('is-translated') === 'yes' ) {
if ( e.target.id === 'optin-no' ) {
$('.optin-no-prompt').removeClass('is-positive');
if ( !$('.optin-no-prompt').is(':visible') ) {
$('.optin-no-prompt').slideDown();
}
} else {
$('.optin-no-prompt').addClass('is-positive');
}
}
});
};
/* End form functions */
$(document).ready(function() {
mw.loader.using( ['mediawiki.util'] ).done( function() {
var form = document.forms['donateForm'];
// Load monthly convert JS if needed
// TODO: allow loading different JS variants, either here or defined in the Template
if ( mw.util.getParamValue('monthlyconvert') ) {
mw.loader.load( '/w/index.php?title=MediaWiki:MonthlyConvert.js&action=raw&ctype=text/javascript' );
}
// These get used in quite a few places
donationForm.currency = form.currency_code.value;
donationForm.country = mw.util.getParamValue('country');
// 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;
}
};
}
// Validate amount and update fee when selected/entered
$('.amount-options').on( 'input change', function() {
donationForm.validateAmount();
donationForm.updateFeeDisplay();
});
// Disable submitting form with Enter key
$('form[name="donateForm"]').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 ( form ) {
// hide frequency options for some countries
if ( donationForm.noRecurringCountries.indexOf( donationForm.country ) !== -1 ) {
$('#frequency_onetime').prop('checked', true);
$('.frequency-options, #cancel-monthly, #donate-recurring-smallprint').hide();
}
addCardTypesClass( donationForm.country );
}
// Links open in new tab
$('.links-in-new-tab a').attr('target', '_blank');
// Disable logo link
$('#p-logo a').attr( { href: '#', 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')
&& donationForm.noRecurringCountries.indexOf( donationForm.country ) === -1 ) {
$('#frequency_monthly').click();
}
donationForm.initOptin();
try {
adjustHPC();
preSelect(); // Make sure to do this *after* other fiddling with values
donationForm.localizeErrors();
}
finally {
$('.ptf').appendTo('.amount-options');
$('.optin-options').insertAfter('.amount-options');
$('.consider-amounts').show();
$('#actual-form').show();
$('#actual-form-loading').hide();
}
});
});