(function (){
'use strict';
if(!window.MANDO_DONATE||!document.querySelector){ return; }
var CFG=window.MANDO_DONATE;
function each(sel, fn, root){
var els=(root||document).querySelectorAll(sel);
for (var i=0; i < els.length; i++){ fn(els[i]); }}
function Widget(box){
var state={ boot: null, stripe: null, elements: null, card: null, secret: null, amount: 0, pi: null, busy: false };
var q=function (sel){ return box.querySelector(sel); };
function show(sel, on){ var el=q(sel); if(el){ el.hidden = !on; }}
function err(msg){
var p=q('.mnd-err');
if(msg){ p.textContent=msg; p.hidden=false; }else{ p.hidden=true; }}
function busy(on, label){
state.busy=on;
var b=q('.mnd-btn');
b.disabled=on;
if(label){ b.textContent=label; }}
function loadStripeJs(cb){
if(window.Stripe){ cb(true); return; }
var s=document.createElement('script');
s.src=CFG.stripe_js;
s.setAttribute('data-cfasync', 'false');
s.onload=function (){ cb(!!window.Stripe); };
s.onerror=function (){ cb(false); };
document.head.appendChild(s);
}
function post(action, fields, cb){
try {
var data=new FormData();
data.append('action', action);
for (var k in fields){ if(fields.hasOwnProperty(k)){ data.append(k, fields[k]); }}
if(!window.fetch){ cb(null); return; }
fetch(CFG.ajax, { method: 'POST', body: data, credentials: 'same-origin' })
.then(function (r){ return r.json(); })
.then(function (js){ cb(js); })
.catch(function (){ cb(null); });
} catch (e){ cb(null); }}
function ensureBoot(cb){
if(state.boot){ cb(true); return; }
post('mando_donate_boot', {}, function (js){
if(js&&js.success){
state.boot=js.data;
if(state.boot.test_mode){ show('.mnd-testpill', true); }
loadStripeJs(function (ok){ cb(ok); });
}else{ cb(false); }});
}
function selectChip(chip){
each('.mnd-chip', function (c){ c.classList.remove('mnd-on'); }, box);
chip.classList.add('mnd-on');
err(null);
var val=chip.getAttribute('data-amount');
if(val==='0'){
show('.mnd-free', true); show('.mnd-pay', false); show('.mnd-custom', false);
return;
}
show('.mnd-free', false);
if(val==='custom'){
show('.mnd-custom', true);
state.amount=0;
var input=q('.mnd-custom-in');
input.focus();
}else{
show('.mnd-custom', false);
state.amount=parseInt(val, 10)||0;
}
show('.mnd-pay', true);
ensureBoot(function (){});
}
function customCents(){
var raw=(q('.mnd-custom-in').value||'').replace(/[^0-9.]/g, '');
var f=parseFloat(raw);
return isNaN(f) ? 0:Math.round(f * 100);
}
function mountElement(clientSecret, cb){
state.secret=clientSecret;
state.elements=state.stripe.elements({ clientSecret: clientSecret });
state.card=state.elements.create('payment', {
fields: { billingDetails: { email: 'never' }},
terms: { card: 'never' }});
state.card.mount(q('.mnd-element'));
state.card.on('ready', function (){ cb(); });
}
function validEmail(){
var v=(q('.mnd-email').value||'').trim();
return v.indexOf('@') > 0&&v.indexOf('.') > 1 ? v:null;
}
function pay(){
if(state.busy){ return; }
err(null);
if(!validEmail()){ err('Add your email so Stripe can send your receipt.'); q('.mnd-email').focus(); return; }
var isCustom = !q('.mnd-custom').hidden;
if(isCustom){ state.amount=customCents(); }
if(!state.amount||state.amount < ((state.boot&&state.boot.minimum)||50)){
err('Minimum is $0.50. Every bit helps, but Stripe needs at least that much.');
return;
}
busy(true, 'One moment…');
ensureBoot(function (ok){
if(!ok||!window.Stripe){ busy(false, 'Support MandoLessons'); err('Payments aren’t available right now. PayPal and Patreon below still work.'); return; }
if(!state.stripe){ state.stripe=window.Stripe(state.boot.pk); }
if(state.pi){ confirmNow(); return; }
post('mando_donate_intent', {
nonce: state.boot.nonce,
amount: state.amount,
email: q('.mnd-email').value||'',
website: q('.mnd-hp').value||'',
source: location.href
}, function (js){
if(!js||!js.success||!js.data||!js.data.client_secret){
busy(false, 'Support MandoLessons');
var code=js&&js.data&&js.data.code;
if(code==='rate_limited'){ err('A few too many tries. Give it a couple of minutes.'); }
else if(code==='bad_amount'){ err('Minimum is $0.50.'); }else{ err('Couldn’t start the payment. PayPal and Patreon below still work.'); }
return;
}
state.pi=js.data.id;
mountElement(js.data.client_secret, function (){
busy(false, 'Confirm $' + (state.amount / 100).toFixed(2).replace(/\.00$/, ''));
});
});
});
}
function confirmNow(){
if(!validEmail()){ err('Add your email so Stripe can send your receipt.'); q('.mnd-email').focus(); return; }
busy(true, 'Processing…');
var url=location.href.split('#')[0];
url +=(url.indexOf('?')===-1 ? '?':'&') + 'mnd_thanks=1';
state.stripe.confirmPayment({
elements: state.elements,
confirmParams: {
return_url: url,
payment_method_data: { billing_details: { email: validEmail() }}
},
redirect: 'if_required'
}).then(function (res){
if(res.error){ busy(false, 'Try again'); err(res.error.message||'Payment didn’t go through.'); return; }
verify(state.pi);
});
}
function verify(pi){
post('mando_donate_verify', { nonce: state.boot.nonce, payment_intent: pi }, function (js){
var ok=js&&js.success&&js.data&&(js.data.status==='succeeded'||js.data.status==='processing');
if(ok){ thanks(); }else{ busy(false, 'Support MandoLessons'); err('We couldn’t confirm the payment. If your bank shows a charge, you’re all set, and your receipt is on its way.'); }});
}
function thanks(){
try { localStorage.setItem('mando_tab_gave', '1'); } catch (e){}
show('.mnd-chips', false); show('.mnd-custom', false); show('.mnd-pay', false);
show('.mnd-free', false); show('.mnd-thanks', true);
}
if(/[?&]mnd_ctx=tab\b/.test(location.search)){
var tabPresets=(box.getAttribute('data-tab-presets')||'').split(',');
if(tabPresets.length&&tabPresets[0]){
var wrap=q('.mnd-chips');
var customChip=wrap.querySelector('.mnd-chip-custom');
wrap.innerHTML='';
for (var t=0; t < tabPresets.length; t++){
var cents=parseInt(tabPresets[t], 10);
if(!cents){ continue; }
var b=document.createElement('button');
b.type='button';
b.className='mnd-chip';
b.setAttribute('data-amount', String(cents));
b.textContent='$' + (cents % 100===0 ? String(cents / 100):(cents / 100).toFixed(2));
wrap.appendChild(b);
}
if(customChip){ wrap.appendChild(customChip); }}
}
each('.mnd-chip', function (chip){ chip.addEventListener('click', function (){ selectChip(chip); });}, box);
q('.mnd-btn').addEventListener('click', function (){
if(state.pi&&state.elements){ confirmNow(); }else{ pay(); }});
q('.mnd-custom-in').addEventListener('input', function (){ err(null); });
var m=location.search.match(/[?&]payment_intent=(pi_[A-Za-z0-9_]+)/);
if(location.search.indexOf('mnd_thanks=1')!==-1&&m){
ensureBoot(function (ok){ if(ok){ verify(m[1]); }});
}}
document.addEventListener('DOMContentLoaded', function (){
each('[data-mando-donate]', function (box){ Widget(box); });
});
})();
var cssua=function(e,o,i){"use strict";var s=" ua-",r=/\s*([\-\w ]+)[\s\/\:]([\d_]+\b(?:[\-\._\/]\w+)*)/,n=/([\w\-\.]+[\s\/][v]?[\d_]+\b(?:[\-\._\/]\w+)*)/g,a=/\b(?:(blackberry\w*|bb10)|(rim tablet os))(?:\/(\d+\.\d+(?:\.\w+)*))?/,b=/\bsilk-accelerated=true\b/,t=/\bfluidapp\b/,l=/(\bwindows\b|\bmacintosh\b|\blinux\b|\bunix\b)/,p=/(\bandroid\b|\bipad\b|\bipod\b|\bwindows phone\b|\bwpdesktop\b|\bxblwp7\b|\bzunewp7\b|\bwindows ce\b|\bblackberry\w*|\bbb10\b|\brim tablet os\b|\bmeego|\bwebos\b|\bpalm|\bsymbian|\bj2me\b|\bdocomo\b|\bpda\b|\bchtml\b|\bmidp\b|\bcldc\b|\w*?mobile\w*?|\w*?phone\w*?)/,c=/(\bxbox\b|\bplaystation\b|\bnintendo\s+\w+)/,d={parse:function(e,o){var i={};if(o&&(i.standalone=o),!(e=(""+e).toLowerCase()))return i;for(var s,d,m=e.split(/[()]/),w=0,_=m.length;w<_;w++)if(w%2){var u=m[w].split(";");for(s=0,d=u.length;s<d;s++)if(r.exec(u[s])){var f=RegExp.$1.split(" ").join("_"),v=RegExp.$2;(!i[f]||parseFloat(i[f])<parseFloat(v))&&(i[f]=v)}}else{var x=m[w].match(n);if(x)for(s=0,d=x.length;s<d;s++){var g=x[s].split(/[\/\s]+/);g.length&&"mozilla"!==g[0]&&(i[g[0].split(" ").join("_")]=g.slice(1).join("-"))}}if(p.exec(e))i.mobile=RegExp.$1,a.exec(e)&&(delete i[i.mobile],i.blackberry=i.version||RegExp.$3||RegExp.$2||RegExp.$1,RegExp.$1?i.mobile="blackberry":"0.0.1"===i.version&&(i.blackberry="7.1.0.0"));else if(l.exec(e))i.desktop=RegExp.$1;else if(c.exec(e)){i.game=RegExp.$1;var h=i.game.split(" ").join("_");i.version&&!i[h]&&(i[h]=i.version)}return i.intel_mac_os_x?(i.mac_os_x=i.intel_mac_os_x.split("_").join("."),delete i.intel_mac_os_x):i.cpu_iphone_os?(i.ios=i.cpu_iphone_os.split("_").join("."),delete i.cpu_iphone_os):i.cpu_os?(i.ios=i.cpu_os.split("_").join("."),delete i.cpu_os):"iphone"!==i.mobile||i.ios||(i.ios="1"),i.opera&&i.version?(i.opera=i.version,delete i.blackberry):b.exec(e)?i.silk_accelerated=!0:t.exec(e)&&(i.fluidapp=i.version),i.applewebkit?(i.webkit=i.applewebkit,delete i.applewebkit,i.opr&&(i.opera=i.opr,delete i.opr,delete i.chrome),i.safari&&(i.chrome||i.crios||i.opera||i.silk||i.fluidapp||i.phantomjs||i.mobile&&!i.ios?delete i.safari:i.version&&!i.rim_tablet_os?i.safari=i.version:i.safari={419:"2.0.4",417:"2.0.3",416:"2.0.2",412:"2.0",312:"1.3",125:"1.2",85:"1.0"}[parseInt(i.safari,10)]||i.safari)):i.msie||i.trident?(i.opera||(i.ie=i.msie||i.rv),delete i.msie,i.windows_phone_os?(i.windows_phone=i.windows_phone_os,delete i.windows_phone_os):"wpdesktop"!==i.mobile&&"xblwp7"!==i.mobile&&"zunewp7"!==i.mobile||(i.mobile="windows desktop",i.windows_phone=+i.ie<9?"7.0":+i.ie<10?"7.5":"8.0",delete i.windows_nt)):(i.gecko||i.firefox)&&(i.gecko=i.rv),i.rv&&delete i.rv,i.version&&delete i.version,i},format:function(e){function o(e,o){e=e.split(".").join("-");var i=s+e;if("string"==typeof o){for(var r=(o=o.split(" ").join("_").split(".").join("-")).indexOf("-");r>0;)i+=s+e+"-"+o.substring(0,r),r=o.indexOf("-",r+1);i+=s+e+"-"+o}return i}var i="";for(var r in e)r&&e.hasOwnProperty(r)&&(i+=o(r,e[r]));return i},encode:function(e){var o="";for(var i in e)i&&e.hasOwnProperty(i)&&(o&&(o+="&"),o+=encodeURIComponent(i)+"="+encodeURIComponent(e[i]));return o}};d.userAgent=d.ua=d.parse(o,i);var m=d.format(d.ua)+" js";return e.className?e.className=e.className.replace(/\bno-js\b/g,"")+m:e.className=m.substr(1),d}(document.documentElement,navigator.userAgent,navigator.standalone);