(function (){
'use strict';
var WRAPPER_SELECTOR='.bitrow-form-wrapper';
var FORM_SELECTOR='.bitrow-form';
var FOCUS_SELECTOR='[data-bitrow-autofocus]';
var FIELD_SELECTOR='input, select, textarea';
var HOST_SELECTOR='.bitrow-form-host';
var LIVE_REG_SELECTOR='.bitrow-live-region';
function announce(anchor, message){
if(! message){
return;
}
var host=anchor.closest ? anchor.closest(HOST_SELECTOR):null;
if(! host){
host=document.querySelector(HOST_SELECTOR);
}
var live=host ? host.querySelector(LIVE_REG_SELECTOR):null;
if(! live){
return;
}
live.textContent='';
window.setTimeout(function (){
live.textContent=message;
}, 50);
}
function pickAnnouncement(root){
var success=root.querySelector('.bitrow-success');
if(success){
return success.textContent.replace(/\s+/g, ' ').trim();
}
var summary=root.querySelector('.bitrow-error-summary');
if(summary){
var generic=summary.getAttribute('data-bitrow-summary-announce');
if(generic){
return generic;
}
return summary.textContent.replace(/\s+/g, ' ').trim();
}
return '';
}
function focusAnnouncement(root){
var target=root.querySelector(FOCUS_SELECTOR);
if(! target){
target=root.querySelector('h2[id$="-title"]');
}
if(! target){
return;
}
if(! target.hasAttribute('tabindex')){
target.setAttribute('tabindex', '-1');
}
try {
target.focus({ preventScroll: true });
} catch(e){
target.focus();
}
if(typeof target.scrollIntoView==='function'){
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}}
document.addEventListener('DOMContentLoaded', function (){
document.querySelectorAll(WRAPPER_SELECTOR).forEach(function(root){
var msg=pickAnnouncement(root);
if(msg){
window.setTimeout(function (){ announce(root, msg); }, 300);
}
if(root.querySelector(FOCUS_SELECTOR)){
window.setTimeout(function (){ focusAnnouncement(root); }, 250);
}});
});
document.addEventListener('input', function(event){
var field=event.target;
if(! field||! field.matches){
return;
}
if(field.matches('.bitrow-items-table input[type="number"]')){
maybeClearItemsError(field);
}
if(field.matches('[data-bitrow-bank-format]')){
formatBankField(field);
}
if(field.matches('[aria-invalid="true"]')){
clearFieldError(field);
}});
document.addEventListener('change', function(event){
var field=event.target;
if(! field||! field.matches){
return;
}
if(field.matches('.bitrow-items-table input[type="number"]')){
maybeClearItemsError(field);
}
if(field.matches('[aria-invalid="true"]')){
clearFieldError(field);
}
if(field.matches('[data-bitrow-toggle]')){
var sel=field.getAttribute('data-bitrow-toggle');
var target=sel ? document.querySelector(sel):null;
var row=target ? target.closest('.bitrow-field')||target:null;
if(row){
var toggleValue=field.getAttribute('data-bitrow-toggle-value');
var isRadio=null!==toggleValue;
var reveal=isRadio
?(field.checked&&field.value===toggleValue)
: field.checked;
if(reveal){
row.removeAttribute('hidden');
if(target){
target.setAttribute('aria-required', 'true');
target.setAttribute('required', 'required');
if(! isRadio&&typeof target.focus==='function'){
target.focus();
}}
}else{
row.setAttribute('hidden', '');
if(target){
target.removeAttribute('aria-required');
target.removeAttribute('required');
target.value='';
if(target.matches&&target.matches('[data-bitrow-bank-format]')){
resetBankVerdict(target);
}
if(target.getAttribute('aria-invalid')==='true'){
clearFieldError(target);
}}
}}
}});
var bankVerdictTimers=new WeakMap();
function bankSignificantBefore(raw, offset, isIban){
var sub=raw.slice(0, offset);
var kept=isIban ? sub.replace(/[^0-9A-Za-z]/g, ''):sub.replace(/\D/g, '');
return kept.length;
}
function bankCaretForCount(formatted, count, isIban){
if(count <=0){
return 0;
}
var seen=0;
for(var i=0; i < formatted.length; i++){
var ch=formatted.charAt(i);
var significant=isIban ? /[0-9A-Za-z]/.test(ch):/\d/.test(ch);
if(significant){
seen++;
if(seen===count){
return i + 1;
}}
}
return formatted.length;
}
function bankGroup(str, size, sep){
var out=[];
for(var i=0; i < str.length; i +=size){
out.push(str.slice(i, i + size));
}
return out.join(sep);
}
function formatBankField(field){
var raw=field.value||'';
var isIban=/^\s*[A-Za-z]/.test(raw);
var caret=(typeof field.selectionStart==='number') ? field.selectionStart:raw.length;
var sigBefore=bankSignificantBefore(raw, caret, isIban);
var pretty;
if(isIban){
pretty=bankGroup(raw.replace(/[^0-9A-Za-z]/g, '').toUpperCase().slice(0, 28), 4, ' ');
}else{
pretty=bankGroup(raw.replace(/\D/g, '').slice(0, 24), 8, '-');
}
if(pretty!==field.value){
field.value=pretty;
if(typeof field.setSelectionRange==='function'){
var pos=bankCaretForCount(pretty, sigBefore, isIban);
try {
field.setSelectionRange(pos, pos);
} catch(e){  }}
}
scheduleBankVerdict(field);
}
function bankIbanMod97Ok(iban){
var rearranged=iban.slice(4) + iban.slice(0, 4);
var numeric='';
for(var i=0; i < rearranged.length; i++){
var ch=rearranged.charAt(i);
numeric +=/[0-9]/.test(ch) ? ch:String(ch.charCodeAt(0) - 65 + 10);
}
var mod=0;
for(var j=0; j < numeric.length;){
var prefix=String(mod);
var piece=numeric.substr(j, 9 - prefix.length);
j   +=piece.length;
mod=parseInt(prefix + piece, 10) % 97;
}
return 1===mod;
}
function bankGiroCdvOk(group){
if(( 8!==group.length&&16!==group.length)||! /^[0-9]+$/.test(group)){
return false;
}
var weights=[ 9, 7, 3, 1 ];
var sum=0;
for(var i=0; i < group.length; i++){
sum +=parseInt(group.charAt(i), 10) * weights[ i % 4 ];
}
return 0===(sum % 10);
}
function bankGiroNumberOk(digits){
if(16!==digits.length&&24!==digits.length){
return false;
}
return bankGiroCdvOk(digits.slice(0, 8));
}
function bankSavedMessage(field, canonical){
var row=field.closest('.bitrow-field');
var box=row ? row.querySelector('[data-bitrow-bank-preview]'):null;
var label=box ?(box.getAttribute('data-bitrow-bank-preview-label')||''):'';
return label ?(label + ' ' + canonical):canonical;
}
function resetBankVerdict(field){
var pending=bankVerdictTimers.get(field);
if(pending){
window.clearTimeout(pending);
bankVerdictTimers.delete(field);
}
field.dataset.bitrowBankState='';
updateBankPreview(field, '');
}
function scheduleBankVerdict(field){
var pending=bankVerdictTimers.get(field);
if(pending){
window.clearTimeout(pending);
}
bankVerdictTimers.set(field, window.setTimeout(function (){
bankVerdictTimers.delete(field);
runBankVerdict(field);
}, 650));
}
function runBankVerdict(field){
var raw=field.value||'';
var isIban=/^\s*[A-Za-z]/.test(raw);
var canonical, fullLength, valid;
if(isIban){
var iban=raw.replace(/[^0-9A-Za-z]/g, '').toUpperCase().slice(0, 28);
canonical=iban;
fullLength=28===iban.length;
valid=/^HU[0-9]{26}$/.test(iban)&&bankIbanMod97Ok(iban);
}else{
var giro=raw.replace(/\D/g, '').slice(0, 24);
canonical=bankGroup(giro, 8, '-');
fullLength=16===giro.length||24===giro.length;
valid=fullLength&&bankGiroNumberOk(giro);
}
var stateKey;
if(! fullLength){
stateKey='';
updateBankPreview(field, '');
if('true'===field.getAttribute('aria-invalid')){
clearFieldError(field);
}}else if(valid){
stateKey='valid:' + canonical;
if('true'===field.getAttribute('aria-invalid')){
clearFieldError(field);
}
updateBankPreview(field, canonical);
}else{
stateKey='invalid:' + canonical;
updateBankPreview(field, '');
setFieldError(field, field.dataset.bitrowErrorInvalidAccount||'The bank account number is not valid.');
}
if(stateKey&&field.dataset.bitrowBankState!==stateKey){
if(valid){
announce(field, bankSavedMessage(field, canonical));
}else{
announce(field, field.dataset.bitrowErrorInvalidAccount||'');
}}
field.dataset.bitrowBankState=stateKey;
}
function updateBankPreview(field, canonical){
var row=field.closest('.bitrow-field');
var box=row ? row.querySelector('[data-bitrow-bank-preview]'):null;
if(! box){
return;
}
var valueEl=box.querySelector('[data-bitrow-bank-preview-value]');
if(canonical){
if(valueEl){
valueEl.textContent=canonical;
}
box.removeAttribute('hidden');
}else{
if(valueEl){
valueEl.textContent='';
}
box.setAttribute('hidden', '');
}}
document.addEventListener('click', function(event){
var link=event.target&&event.target.closest
? event.target.closest('.bitrow-error-summary__list a')
: null;
if(! link){
return;
}
var href=link.getAttribute('href')||'';
if(href.charAt(0)!=='#'||href.length < 2){
return;
}
var target=document.getElementById(href.slice(1));
if(! target){
return;
}
event.preventDefault();
if(! /^(INPUT|SELECT|TEXTAREA|BUTTON)$/.test(target.tagName)){
var control=target.querySelector('input, select, textarea');
if(control){
target=control;
}else if(! target.hasAttribute('tabindex')){
target.setAttribute('tabindex', '-1');
}}
if(typeof target.focus==='function'){
try {
target.focus({ preventScroll: true });
} catch(e){
target.focus();
}}
if(typeof target.scrollIntoView==='function'){
target.scrollIntoView({ behavior: 'smooth', block: 'center' });
}});
if(! window.fetch||! window.FormData){
document.addEventListener('submit', function(event){
var form=event.target;
if(!(form instanceof HTMLFormElement)||! form.matches(FORM_SELECTOR)){
return;
}
if(! runClientValidation(form)){
event.preventDefault();
}});
return;
}
document.addEventListener('submit', function(event){
var form=event.target;
if(!(form instanceof HTMLFormElement)||! form.matches(FORM_SELECTOR)){
return;
}
if(! runClientValidation(form)){
event.preventDefault();
return;
}
var wrapper=form.closest(WRAPPER_SELECTOR);
if(! wrapper){
return;
}
event.preventDefault();
var data=new FormData(form);
data.append('_bitrow_ajax', '1');
var submitButton=form.querySelector('button[type="submit"]:focus')
|| form.querySelector('button[type="submit"]');
if(submitButton){
if(submitButton.name&&! data.has(submitButton.name)){
data.append(submitButton.name, submitButton.value);
}
submitButton.disabled=true;
submitButton.setAttribute('aria-busy', 'true');
}
wrapper.classList.add('is-loading');
var actionUrl=form.getAttribute('action')||window.location.pathname;
fetch(actionUrl, {
method:      'POST',
body:        data,
credentials: 'same-origin',
headers:     { 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'text/html' }})
.then(function(response){
return response.text().then(function(html){
return {
html:       html,
status:     response.status,
statusText: response.statusText,
ok:         response.ok
};});
})
.then(function(result){
swapWrapper(wrapper, result.html, {
status:       result.status,
statusText:   result.statusText,
ok:           result.ok,
submitButton: submitButton
});
})
.catch(function (){
wrapper.classList.remove('is-loading');
if(submitButton){
submitButton.disabled=false;
submitButton.removeAttribute('aria-busy');
}
form.submit();
});
});
function swapWrapper(wrapper, html, ctx){
ctx=ctx||{};
var parser=document.createElement('div');
parser.innerHTML=(html||'').trim();
var fresh=parser.querySelector(WRAPPER_SELECTOR);
if(! fresh){
showTransportError(wrapper, html, parser, ctx);
return;
}
wrapper.replaceWith(fresh);
var msg=pickAnnouncement(fresh);
if(! msg){
var heading=fresh.querySelector('h2[id$="-title"]');
if(heading){
msg=heading.textContent.replace(/\s+/g, ' ').trim();
}}
if(msg){
announce(fresh, msg);
}
focusAnnouncement(fresh);
}
function transportExcerpt(html, parser){
html=html||'';
var title='';
var m=/<title[^>]*>([\s\S]*?)<\/title>/i.exec(html);
if(m&&m[ 1 ]){
title=m[ 1 ].replace(/\s+/g, ' ').trim();
}
var bodyText=(( parser&&parser.textContent)||'').replace(/\s+/g, ' ').trim();
var out=title;
if(bodyText&&bodyText!==title){
out=out ?(out + ' — ' + bodyText):bodyText;
}
if(out.length > 300){
out=out.slice(0, 300) + '…';
}
return out;
}
function logTransport(form, ctx, excerpt){
ctx=ctx||{};
var L=window.bitrowLog;
if(! L||! L.ajaxUrl||! L.nonce){
return;
}
var stepField=form ? form.querySelector('input[name="bitrow_step"]'):null;
var data=new FormData();
data.append('action', 'bitrow_log_transport');
data.append('nonce', L.nonce);
data.append('status', ctx.status ? String(ctx.status):'0');
data.append('status_text', ctx.statusText||'');
data.append('excerpt', excerpt||'');
data.append('page', window.location.href);
data.append('step', stepField ? stepField.value:'');
try {
if(navigator&&typeof navigator.sendBeacon==='function'&&navigator.sendBeacon(L.ajaxUrl, data)){
return;
}} catch(e){  }
if(window.fetch){
try {
window.fetch(L.ajaxUrl, {
method:      'POST',
body:        data,
credentials: 'same-origin',
keepalive:   true,
headers:     { 'X-Requested-With': 'XMLHttpRequest' }}).catch(function (){});
} catch(e){  }}
}
function showTransportError(wrapper, html, parser, ctx){
ctx=ctx||{};
wrapper.classList.remove('is-loading');
if(ctx.submitButton){
ctx.submitButton.disabled=false;
ctx.submitButton.removeAttribute('aria-busy');
}
var form=wrapper.querySelector(FORM_SELECTOR);
function ds(name, fallback){
var v=form ? form.getAttribute(name):null;
return v||fallback;
}
var headingText=ds('data-bitrow-summary-heading', 'There is a problem');
var introText=ds('data-bitrow-transport-error', 'The submission could not be completed because the server returned an unexpected response.');
var emptyText=ds('data-bitrow-transport-empty', 'The server returned an empty response.');
var hintText=ds('data-bitrow-transport-hint', 'Please reload the page and try again.');
var excerpt=transportExcerpt(html, parser);
if(! excerpt&&ctx.status&&''===(html||'').trim()){
excerpt=emptyText;
}
var prior=wrapper.querySelector('.bitrow-transport-error');
if(prior&&prior.parentNode){
prior.parentNode.removeChild(prior);
}
var sectionHeading=wrapper.querySelector(':scope > h2[id$="-title"]');
var nsBase=sectionHeading&&sectionHeading.id
? sectionHeading.id.replace(/title$/, '')
: 'bitrow-form-';
var titleId=nsBase + 'transport-title';
var box=document.createElement('div');
box.className='bitrow-error-summary bitrow-transport-error';
box.setAttribute('role', 'group');
box.setAttribute('tabindex', '-1');
box.setAttribute('data-bitrow-autofocus', '');
box.setAttribute('aria-labelledby', titleId);
var h=document.createElement('h2');
h.className='bitrow-error-summary__title';
h.id=titleId;
h.textContent=headingText;
box.appendChild(h);
var pIntro=document.createElement('p');
pIntro.textContent=introText;
box.appendChild(pIntro);
var pHint=document.createElement('p');
pHint.className='bitrow-transport-error__hint';
pHint.textContent=hintText;
box.appendChild(pHint);
if(form){
wrapper.insertBefore(box, form);
}else{
wrapper.insertBefore(box, wrapper.firstChild);
}
logTransport(form, ctx, excerpt);
announce(box, introText + ' ' + hintText);
try {
box.focus({ preventScroll: true });
} catch(e){
box.focus();
}
if(typeof box.scrollIntoView==='function'){
box.scrollIntoView({ behavior: 'smooth', block: 'start' });
}}
function runClientValidation(form){
var errors=collectErrors(form);
if(errors.length===0){
return true;
}
applyErrors(form, errors);
return false;
}
function collectErrors(form){
var errors=[];
var fields=form.querySelectorAll(FIELD_SELECTOR);
fields.forEach(function(field){
if(field.type==='hidden'){
return;
}
var message=validateField(field);
if(message){
errors.push({ field: field, message: message });
}});
if(form.querySelector('.bitrow-items-table')){
var anyQty=false;
form.querySelectorAll('.bitrow-items-table input[type="number"]').forEach(function(input){
if(parseInt(input.value, 10) > 0){
anyQty=true;
}});
if(! anyQty){
var itemsMsg=form.getAttribute('data-bitrow-items-error')
|| 'Select at least one item to withdraw from.';
errors.push({ itemsLevel: true, message: itemsMsg });
}}
return errors;
}
function validateField(field){
var isRequired=field.hasAttribute('required')||field.getAttribute('aria-required')==='true';
if(field.type==='checkbox'||field.type==='radio'){
if(isRequired&&! field.checked){
return field.dataset.bitrowErrorRequired||'This field is required.';
}
return '';
}
var value=(field.value||'').toString().trim();
if(isRequired&&value===''){
return field.dataset.bitrowErrorRequired||'This field is required.';
}
if(value===''){
return '';
}
if(field.type==='email'&&! field.checkValidity()){
return field.dataset.bitrowErrorInvalid||'Please enter a valid email address.';
}
if(field.type==='number'){
if(! /^-?\d+$/.test(value)){
return field.dataset.bitrowErrorInvalid||'Please enter a whole number.';
}
var n=parseInt(value, 10);
var min=field.min!=='' ? parseInt(field.min, 10):null;
var max=field.max!=='' ? parseInt(field.max, 10):null;
if(min!==null&&! isNaN(min)&&n < min){
return(field.dataset.bitrowErrorMin||'Minimum is {min}.').replace('{min}', String(min));
}
if(max!==null&&! isNaN(max)&&n > max){
return(field.dataset.bitrowErrorMax||'Maximum is {max}.').replace('{max}', String(max));
}}
if(field.pattern){
try {
var re=new RegExp('^(?:' + field.pattern + ')$');
if(! re.test(value)){
return field.dataset.bitrowErrorInvalid||'Please enter a valid value.';
}} catch(e){  }}
return '';
}
function applyErrors(form, errors){
var summaryText=form.getAttribute('data-bitrow-error-summary')
|| 'Please correct the highlighted fields and try again.';
var headingText=form.getAttribute('data-bitrow-summary-heading')
|| 'There is a problem';
var summaryEntries=[];
errors.forEach(function(entry){
if(entry.itemsLevel){
attachItemsError(form, entry.message);
var firstQty=form.querySelector('.bitrow-items-table input[type="number"]:not([disabled])');
var itemsTargetId=firstQty&&firstQty.id ? firstQty.id:'';
if(! itemsTargetId){
var itable=form.querySelector('.bitrow-items-table');
var ifs=itable ? itable.closest('.bitrow-fieldset'):null;
itemsTargetId=itemsErrorId(ifs)||'';
}
summaryEntries.push({ id: itemsTargetId, message: entry.message });
return;
}
setFieldError(entry.field, entry.message);
summaryEntries.push({ id: entry.field.id||'', message: entry.message });
});
summaryEntries.sort(function(a, b){
var ea=a.id ? document.getElementById(a.id):null;
var eb=b.id ? document.getElementById(b.id):null;
if(! ea||! eb){
return 0;
}
var pos=ea.compareDocumentPosition(eb);
if(pos & Node.DOCUMENT_POSITION_FOLLOWING){
return -1;
}
if(pos & Node.DOCUMENT_POSITION_PRECEDING){
return 1;
}
return 0;
});
var wrapper=form.closest(WRAPPER_SELECTOR);
var sectionHeading=wrapper.querySelector(':scope > h2[id$="-title"]');
var nsBase=sectionHeading&&sectionHeading.id
? sectionHeading.id.replace(/title$/, '')
: 'bitrow-form-';
var titleId=nsBase + 'summary-title';
var summary=wrapper.querySelector(':scope > .bitrow-error-summary');
if(! summary){
summary=document.createElement('div');
summary.className='bitrow-error-summary';
summary.setAttribute('tabindex', '-1');
summary.setAttribute('data-bitrow-autofocus', '');
wrapper.insertBefore(summary, form);
}
summary.setAttribute('role', 'group');
summary.setAttribute('aria-labelledby', titleId);
summary.setAttribute('data-bitrow-summary-announce', summaryText);
summary.textContent='';
var heading=document.createElement('h2');
heading.className='bitrow-error-summary__title';
heading.id=titleId;
heading.textContent=headingText;
summary.appendChild(heading);
var hasLinks=summaryEntries.some(function(e){ return e.id; });
if(hasLinks){
var ul=document.createElement('ul');
ul.className='bitrow-error-summary__list';
summaryEntries.forEach(function(e){
var li=document.createElement('li');
if(e.id){
var a=document.createElement('a');
a.setAttribute('href', '#' + e.id);
a.textContent=e.message;
li.appendChild(a);
}else{
li.textContent=e.message;
}
ul.appendChild(li);
});
summary.appendChild(ul);
}else{
var p=document.createElement('p');
p.textContent=summaryText;
summary.appendChild(p);
}
announce(summary, summaryText);
try {
summary.focus({ preventScroll: true });
} catch(e){
summary.focus();
}
summary.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
function setFieldError(field, message){
field.setAttribute('aria-invalid', 'true');
var errorId=field.id ? field.id + '-error':'';
if(! errorId){
return;
}
var existing=document.getElementById(errorId);
if(! existing){
existing=document.createElement('span');
existing.id=errorId;
existing.className='bitrow-field-error';
field.parentNode.insertBefore(existing, field.nextSibling);
}
existing.textContent=message;
var describedby=(field.getAttribute('aria-describedby')||'').split(/\s+/).filter(Boolean);
if(describedby.indexOf(errorId)===-1){
describedby.unshift(errorId);
field.setAttribute('aria-describedby', describedby.join(' '));
}
var fieldRow=field.closest('.bitrow-field');
if(fieldRow){
fieldRow.classList.add('has-error');
}}
function clearFieldError(field){
field.removeAttribute('aria-invalid');
var errorId=field.id ? field.id + '-error':'';
var describedby=(field.getAttribute('aria-describedby')||'').split(/\s+/).filter(Boolean);
if(errorId){
describedby=describedby.filter(function(id){ return id!==errorId; });
if(describedby.length){
field.setAttribute('aria-describedby', describedby.join(' '));
}else{
field.removeAttribute('aria-describedby');
}
var node=document.getElementById(errorId);
if(node&&node.parentNode){
node.parentNode.removeChild(node);
}}
var fieldRow=field.closest('.bitrow-field');
if(fieldRow){
fieldRow.classList.remove('has-error');
}}
function itemsErrorId(fieldset){
if(! fieldset){
return 'bitrow-items-error';
}
return fieldset.getAttribute('data-bitrow-items-error-id')
|| fieldset.getAttribute('aria-describedby')
|| 'bitrow-items-error';
}
function attachItemsError(form, message){
var table=form.querySelector('.bitrow-items-table');
var fieldset=table ? table.closest('.bitrow-fieldset'):null;
var errorId=itemsErrorId(fieldset);
var existing=document.getElementById(errorId);
if(! existing){
existing=document.createElement('p');
existing.id=errorId;
existing.className='bitrow-field-error';
existing.setAttribute('tabindex', '-1');
if(table&&table.parentNode){
table.parentNode.insertBefore(existing, table.nextSibling);
}else{
form.insertBefore(existing, form.firstChild);
}}
existing.textContent=message;
if(fieldset&&fieldset.getAttribute('aria-describedby')!==errorId){
fieldset.setAttribute('aria-describedby', errorId);
}}
function maybeClearItemsError(field){
var table=field.closest ? field.closest('.bitrow-items-table'):null;
if(! table){
return;
}
var anyQty=false;
table.querySelectorAll('input[type="number"]').forEach(function(input){
if(parseInt(input.value, 10) > 0){
anyQty=true;
}});
if(! anyQty){
return;
}
var fieldset=table.closest('.bitrow-fieldset');
var errorId=itemsErrorId(fieldset);
var node=document.getElementById(errorId);
if(node&&node.parentNode){
node.parentNode.removeChild(node);
}
if(fieldset&&fieldset.getAttribute('aria-describedby')===errorId){
fieldset.removeAttribute('aria-describedby');
}}
if(window.bitrowOtp){
var OTP=window.bitrowOtp;
function otpPost(action, fields){
var body=new FormData();
body.append('action', action);
body.append('nonce', OTP.nonce);
Object.keys(fields).forEach(function(k){ body.append(k, fields[ k ]); });
return fetch(OTP.ajaxUrl, {
method:      'POST',
body:        body,
credentials: 'same-origin',
headers:     { 'X-Requested-With': 'XMLHttpRequest' }}).then(function(r){
return r.json().then(function(j){ return { ok: r.ok, json: j };});
});
}
function otpData(res){
return(res&&res.json&&res.json.data) ? res.json.data:{};}
function setBusy(btn, busy){
if(! btn){
return;
}
btn.disabled=busy;
if(busy){
btn.setAttribute('aria-busy', 'true');
}else{
btn.removeAttribute('aria-busy');
}}
document.addEventListener('click', function(event){
if(! event.target||! event.target.closest){
return;
}
var sendBtn=event.target.closest('[data-bitrow-otp-send]');
if(sendBtn){
event.preventDefault();
otpSend(sendBtn);
return;
}
var verifyBtn=event.target.closest('[data-bitrow-otp-verify]');
if(verifyBtn){
event.preventDefault();
otpVerify(verifyBtn);
}});
document.addEventListener('input', function(event){
var field=event.target;
if(field&&field.matches&&field.matches('[data-bitrow-otp-code]')){
var digits=(field.value||'').replace(/\D/g, '').slice(0, 6);
if(digits!==field.value){
field.value=digits;
}}
});
document.addEventListener('input', function(event){
var field=event.target;
if(! field||! field.matches||! field.matches('[data-bitrow-otp-email]')){
return;
}
var form=field.closest(FORM_SELECTOR);
var codeRow=form ? form.querySelector('.bitrow-otp-code'):null;
if(codeRow&&! codeRow.hasAttribute('hidden')){
codeRow.setAttribute('hidden', '');
var codeInput=form.querySelector('[data-bitrow-otp-code]');
if(codeInput){
codeInput.value='';
if(codeInput.getAttribute('aria-invalid')==='true'){
clearFieldError(codeInput);
}}
}});
function otpSend(btn){
var form=btn.closest(FORM_SELECTOR);
if(! form){
return;
}
var emailField=form.querySelector('[data-bitrow-otp-email]');
if(! emailField){
return;
}
var invalid=validateField(emailField);
if(invalid){
setFieldError(emailField, invalid);
emailField.focus();
return;
}
setBusy(btn, true);
announce(btn, OTP.i18n.sending);
otpPost('bitrow_otp_send', { email: emailField.value.trim() }).then(function(res){
setBusy(btn, false);
var data=otpData(res);
if(res.json&&res.json.success){
var codeRow=form.querySelector('.bitrow-otp-code');
if(codeRow){
codeRow.removeAttribute('hidden');
}
announce(btn, data.message||'');
var codeInput=form.querySelector('[data-bitrow-otp-code]');
if(codeInput&&typeof codeInput.focus==='function'){
codeInput.focus();
}}else{
announce(btn, data.message||OTP.i18n.networkError);
}}).catch(function (){
setBusy(btn, false);
announce(btn, OTP.i18n.networkError);
});
}
function otpVerify(btn){
var form=btn.closest(FORM_SELECTOR);
if(! form){
return;
}
var codeInput=form.querySelector('[data-bitrow-otp-code]');
var code=codeInput ?(codeInput.value||'').replace(/\D/g, ''):'';
if(! codeInput||''===code){
if(codeInput){
setFieldError(codeInput, OTP.i18n.enterCode);
codeInput.focus();
}
return;
}
setBusy(btn, true);
announce(btn, OTP.i18n.verifying);
otpPost('bitrow_otp_verify', {
code: code,
ns:   form.getAttribute('data-bitrow-ns')||''
}).then(function(res){
setBusy(btn, false);
var data=otpData(res);
if(res.json&&res.json.success){
var emailField=form.querySelector('[data-bitrow-otp-email]');
if(emailField){
emailField.setAttribute('readonly', 'readonly');
}
var otpBlock=form.querySelector('[data-bitrow-otp]');
if(otpBlock&&otpBlock.parentNode){
otpBlock.parentNode.removeChild(otpBlock);
}
var picker=form.querySelector('[data-bitrow-order-picker]');
if(picker){
picker.innerHTML=data.order_picker_html||'';
}
announce(btn, data.message||'');
var select=picker ? picker.querySelector('select'):null;
if(select&&typeof select.focus==='function'){
select.focus();
}}else{
clearFieldError(codeInput);
setFieldError(codeInput, data.message||OTP.i18n.networkError);
announce(btn, data.message||OTP.i18n.networkError);
}}).catch(function (){
setBusy(btn, false);
announce(btn, OTP.i18n.networkError);
});
}}
})();
!function(){function t(){var t,e=document.createElement("script");return e.src=_zxcvbnSettings.src,e.type="text/javascript",e.async=!0,(t=document.getElementsByTagName("script")[0]).parentNode.insertBefore(e,t)}null!=window.attachEvent?window.attachEvent("onload",t):window.addEventListener("load",t,!1)}.call(this);