Donate donatewiki https://foundation.wikimedia.org/wiki/Home MediaWiki 1.39.0-wmf.23 first-letter Media Special Talk User User talk Donate Donate talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Campaign Campaign talk TimedText TimedText talk Module Module talk Gadget Gadget talk Gadget definition Gadget definition talk MediaWiki:DonationForm.js 8 7993 37601 37575 2022-08-11T13:59:39Z Pcoombe 5 don't preselect anything >1000 - hack to deal with error in email send javascript text/javascript /* 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; // Hack for specific Major Gifts email form mw.loader.using( ['mediawiki.util'] ).done( function() { if ( mw.util.getParamValue( 'form-countryspecific' ) === 'Form-countryspecific-MG2022' ) { donationForm.maxUSD = 25000; } }); donationForm.minimums = { // From https://github.com/wikimedia/wikimedia-fundraising-SmashPig/blob/master/PaymentData/ReferenceData/CurrencyRates.php // Updated 2022-02-04 'ADF' : 5.64, 'ADP' : 143, 'AED' : 3.67, 'AFA' : 89, 'AFN' : 89, 'ALL' : 104, 'AMD' : 456, 'ANG' : 1.79, 'AOA' : 592, 'AON' : 592, 'ARS' : 99, 'ATS' : 12, 'AUD' : 1.34, 'AWG' : 1.8, 'AZM' : 8500, 'AZN' : 1.7, 'BAM' : 1.68, 'BBD' : 2, 'BDT' : 84, 'BEF' : 35, 'BGL' : 1.68, 'BGN' : 1.68, 'BHD' : 0.37389487524886, 'BIF' : 1974, 'BMD' : 1, 'BND' : 1.35, 'BOB' : 6.73, 'BRL' : 5.61, 'BSD' : 1, 'BTN' : 75, 'BWP' : 11, 'BYR' : 24130, 'BZD' : 1.97, 'CAD' : 1.24, 'CDF' : 1986, 'CHF' : 0.91804240355267, 'CLP' : 812, 'CNY' : 6.38, 'COP' : 3762, 'CRC' : 616, 'CUC' : 1, 'CUP' : 25, 'CVE' : 95, 'CYP' : 0.50332112008272, 'CZK' : 22, 'DEM' : 1.68, 'DJF' : 178, 'DKK' : 6.4, 'DOP' : 56, 'DZD' : 137, 'ECS' : 24094, 'EEK' : 13, 'EGP' : 16, 'ESP' : 143, 'ETB' : 47, 'EUR' : 0.8599751912484, 'FIM' : 5.11, 'FJD' : 2.06, 'FKP' : 0.72622003775714, 'FRF' : 5.64, 'GBP' : 0.72622003775714, 'GEL' : 3.11, 'GHC' : 60651, 'GHS' : 6.07, 'GIP' : 0.72622003775714, 'GMD' : 52, 'GNF' : 9563, 'GRD' : 293, 'GTQ' : 7.56, 'GYD' : 201, 'HKD' : 7.77, 'HNL' : 24, 'HRK' : 6.47, 'HTG' : 98, 'HUF' : 314, 'IDR' : 14166, 'IEP' : 0.67728550152036, 'ILS' : 3.2, 'INR' : 10, // T309818 'IQD' : 1445, 'IRR' : 42000, 'ISK' : 129, 'ITL' : 1665, 'JMD' : 151, 'JOD' : 0.70900000000001, 'JPY' : 114, 'KES' : 110, 'KGS' : 85, 'KHR' : 4021, 'KMF' : 423, 'KPW' : 135, 'KRW' : 1169, 'KWD' : 0.30084989206684, 'KYD' : 0.83333299999999, 'KZT' : 424, 'LAK' : 10002, 'LBP' : 1508, 'LKR' : 200, 'LRD' : 158, 'LSL' : 15, 'LTL' : 2.97, 'LUF' : 35, 'LVL' : 0.60439400431017, 'LYD' : 4.51, 'MAD' : 8.95, 'MDL' : 17, 'MGA' : 3918, 'MGF' : 9150, 'MKD' : 52, 'MMK' : 1843, 'MNT' : 2620, 'MOP' : 8.01, 'MRO' : 359, 'MTL' : 0.36918734960296, 'MUR' : 42, 'MVR' : 15, 'MWK' : 808, 'MXN' : 20, 'MYR' : 4.15, 'MZM' : 63200, 'MZN' : 63, 'NAD' : 15, 'NGN' : 411, 'NIO' : 35, 'NLG' : 1.9, 'NOK' : 8.35, 'NPR' : 118, 'NZD' : 1.4, 'OMR' : 0.38369830294331, 'PAB' : 1, 'PEN' : 3.93, 'PGK' : 3.43, 'PHP' : 51, 'PKR' : 174, 'PLN' : 3.96, 'PTE' : 172, 'PYG' : 6799, 'QAR' : 3.62, 'ROL' : 42505, 'RON' : 4.25, 'RSD' : 101, 'RUB' : 70, 'RWF' : 996, 'SAR' : 3.75, 'SBD' : 8.01, 'SCR' : 13, 'SDD' : 43676, 'SDG' : 437, 'SDP' : 2261, 'SEK' : 8.59, 'SGD' : 1.35, 'SHP' : 0.72622003775714, 'SIT' : 206, 'SKK' : 26, 'SLL' : 10684, 'SOS' : 562, 'SRD' : 21, 'SRG' : 21363, 'STD' : 20826, 'SVC' : 8.75, 'SYP' : 513, 'SZL' : 15, 'THB' : 33, 'TJS' : 11, 'TMM' : 16794, 'TMT' : 3.36, 'TND' : 2.82, 'TOP' : 2.19, 'TRL' : 9654942, 'TRY' : 9.65, 'TTD' : 6.67, 'TWD' : 28, 'TZS' : 2303, 'UAH' : 26, 'UGX' : 3548, 'USD' : 1, 'UYU' : 43, 'UZS' : 10654, 'VEB' : 420776310, 'VEF' : 420776, 'VND' : 22710, 'VUV' : 112, 'WST' : 2.51, 'XAF' : 564, 'XAG' : 0.04084236107244, 'XAU' : 0.00055475059827898, 'XCD' : 2.7, 'XEU' : 0.8599751912484, 'XOF' : 564, 'XPD' : 0.000490118884148, 'XPF' : 103, 'XPT' : 0.00094617370232302, 'YER' : 250, 'YUN' : 101, '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&nbsp;$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" }; if ( formats[currency] ) { var format = formats[currency][language] || formats[currency]['default'] || formats[currency]; } else { var format = '\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 = parseFloat( mw.util.getParamValue('preSelect') ); if ( preSelectAmount > 0 && preSelectAmount <= 1000 ) { 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', 'ZZ' : 'vmad' // For testing }; 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 prep most of the parameters * * @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 params = {}; params.currency = donationForm.currency; params.country = donationForm.country; // Overrides for specific cc gateways if ( paymentMethod === 'cc-adyen' ) { params.payment_method = 'cc'; params.gateway = 'adyen'; } else if ( paymentMethod === 'cc-dlocal' ) { params.payment_method = 'cc'; params.gateway = 'astropay'; } else { params.payment_method = paymentMethod; } if ( params.payment_method === 'cc' && params.country === 'ZA' ) { params.gateway = 'astropay'; } if ( paymentSubMethod ) { params.payment_submethod = paymentSubMethod; } var frequency = $('input[name="frequency"]:checked').val(); if ( frequency !== 'monthly' ) { params.recurring = false; } else { params.recurring = true; } 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 } if ( mw.util.getParamValue( 'pym_variant' ) ) { params.variant = mw.util.getParamValue( 'pym_variant' ); } if ( params.recurring && params.variant && params.variant.match( /monthlyConvert/ ) ) { // Post-payments monthly convert makes no sense if it's already recurring // Avoid things like T312905 delete params.variant; } if ( mw.util.getParamValue( 'pym_appeal' ) ) { params.appeal = mw.util.getParamValue( 'pym_appeal' ); } // Check for monthly convert. TODO: make it possible to test JS variants if ( mw.util.getParamValue( 'monthlyconvert' ) ) { mc.main( params, donationForm.finalStep ); } else { donationForm.finalStep( params ); } } else { donationForm.extraData.validateError = 1; // Flag they had an error, even if fixed later } return false; // don't submit if called by a button }; /** * Build final tracking parameters, and submit to payments * @param {Object} params */ donationForm.finalStep = function( params ) { var uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:GatewayChooser'); // Skip form chooser for Apple Pay / Google Pay if ( params.payment_method === 'apple' || params.payment_method === 'google' ) { uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:AdyenCheckoutGateway'); } 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 ); 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' : 4, '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'); } } }); }; /** * Block typing letters and symbols in given input. Used for Other amount inputs * * If we don't do this, Safari allows typing them and then chokes on submit * https://phabricator.wikimedia.org/T118741, https://phabricator.wikimedia.org/T173431 * * @param {Element} inputElement The element to block typing on */ donationForm.otherInputControl = function( inputElement ) { if ( inputElement ) { inputElement.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; } }; } }; /** * Make language and country into a standard javascript Intl locale identifier * * Currently only used in monthlyconvert, but this could be useful * * @param {string} language * @param {string} country * @return {string} locale identifier */ donationForm.getLocale = function( language, country ) { if ( language === 'en-gb' ) { language = 'en'; } if ( language === 'es-419' ) { language = 'es'; } if ( language === 'pt-br' ) { language = 'pt'; } return language + '-' + country; }; /** * Should we show Apple Pay? * * Note there is a ~500ms delay in Safari when checking, so only call this if needed * * @param {string} country * @return {boolean} */ donationForm.shouldShowApplePay = function ( country ) { // TODO: Add country logic when we get a list from payments if ( location.search.match('forceApplePay') ) { return true; } if ( window.ApplePaySession ) { if ( ApplePaySession.canMakePayments() ) { return true; } } return false; }; /* End form functions */ $(document).ready(function() { mw.loader.using( ['mediawiki.util'] ).done( function() { var form = document.forms['donateForm']; // These get used in quite a few places try { donationForm.currency = form.currency_code.value; } catch (error) { donationForm.currency = 'USD'; } donationForm.country = mw.util.getParamValue('country').toUpperCase(); // Block typing symbols in Other field donationForm.otherInputControl( document.getElementById('input_amount_other_box') ); // 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 ); // Apple Pay if ( $('.paymentmethod-applepay').length > 0 ) { if ( !donationForm.shouldShowApplePay( donationForm.country ) ) { $('.paymentmethod-applepay').remove(); } } } // 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(); } }); }); 8dz5y29u4l5vdeb6yvr302bp5e70ij1 File:Noah-Reply-Mail-Block.png 6 8975 37602 2022-08-12T01:47:21Z NIsrael (WMF) 41 wikitext text/x-wiki == Licensing == {{CC-by-sa-4.0}} 7nhoqsp59uch1eltewpc5ihckclgjnj