-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathform-shield.min.js
More file actions
2 lines (2 loc) · 4.04 KB
/
form-shield.min.js
File metadata and controls
2 lines (2 loc) · 4.04 KB
1
2
/* Form Shield by Moonito | https://moonito.net | MIT License */
(function(){'use strict';var sc=document.getElementsByTagName('script'),cs=sc[sc.length-1],pk=cs.getAttribute('data-key'),fsel=cs.getAttribute('data-form-selector')||'',ef=(cs.getAttribute('data-email-field')||'email').split(',').map(function(s){return s.trim();}).filter(Boolean),pf=(cs.getAttribute('data-phone-field')||'phone').split(',').map(function(s){return s.trim();}).filter(Boolean),au='https://moonito.net/api/v1/form-shield/validate',re=false,NS='_fshield_',EC='_fshield_err',SI='_fshield_styles',KF='_fshield_spin';if(!document.getElementById(SI)){var st=document.createElement('style');st.id=SI;st.textContent='@keyframes '+KF+'{to{transform:rotate(360deg)}}';document.head.appendChild(st);}function gsb(f){return f.querySelectorAll('button:not([type="button"]):not([type="reset"]), input[type="submit"]');}function ls(f){var b=gsb(f);for(var i=0;i<b.length;i++){var t=b[i];if(t.dataset[NS+'locked'])continue;t.dataset[NS+'locked']='1';t.disabled=true;if(t.tagName==='BUTTON'){t.dataset[NS+'orig']=t.innerHTML;t.innerHTML='<span style="display:inline-block;width:12px;height:12px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:'+KF+' 0.6s linear infinite;vertical-align:middle;margin-right:6px;"></span>Validating\u2026';}else{t.dataset[NS+'orig']=t.value;t.value='Validating\u2026';}}}function us(f){var b=gsb(f);for(var i=0;i<b.length;i++){var t=b[i];if(!t.dataset[NS+'locked'])continue;t.disabled=false;if(t.tagName==='BUTTON'){t.innerHTML=t.dataset[NS+'orig']||'';}else{t.value=t.dataset[NS+'orig']||'Submit';}delete t.dataset[NS+'locked'];delete t.dataset[NS+'orig'];}}function rsub(f){re=true;var e=new Event('submit',{bubbles:true,cancelable:true});var nc=f.dispatchEvent(e);if(nc){f.submit();}else{us(f);}}var ES='color:#dc3545;font-size:0.85em;margin-top:4px;display:block;';function clr(f){var e=f.querySelectorAll('.'+EC);for(var i=0;i<e.length;i++){e[i].parentNode.removeChild(e[i]);}}function sho(fd,m){if(!fd)return;var d=document.createElement('div');d.className=EC;d.setAttribute('style',ES);d.textContent=m;if(fd.nextSibling){fd.parentNode.insertBefore(d,fd.nextSibling);}else{fd.parentNode.appendChild(d);}}function fld(f,n,ie){if(!Array.isArray(n))n=[n];for(var i=0;i<n.length;i++){var nm=n[i],el=f.querySelector('[name="'+nm+'"]');if(el)return el;el=f.querySelector('[name="'+nm+'[]"]');if(el)return el;}if(ie)return f.querySelector('input[type="email"]')||null;return f.querySelector('input[type="tel"]')||null;}function isTF(f){if(!fsel)return true;var sl=fsel.split(',');for(var i=0;i<sl.length;i++){var s=sl[i].trim();if(s&&f.matches(s))return true;}return false;}function exD(f){var d={},ei=fld(f,ef,true),pi=fld(f,pf,false);if(ei&&ei.value)d.email=ei.value.trim();if(pi&&pi.value)d.phone=pi.value.trim();d.form_action=f.action||window.location.href;return d;}function hSub(ev){if(re){re=false;return;}var f=ev.target;if(f.tagName!=='FORM')return;if(!isTF(f))return;var d=exD(f);if(!d.email&&!d.phone)return;ev.preventDefault();ev.stopPropagation();clr(f);ls(f);var x=new XMLHttpRequest();x.open('POST',au,true);x.setRequestHeader('Content-Type','application/json');x.setRequestHeader('X-Form-Shield-Key',pk);x.setRequestHeader('Accept','application/json');x.onload=function(){try{var rp=JSON.parse(x.responseText);if(rp.data&&rp.data.status==='pass'){rsub(f);return;}if(rp.data&&rp.data.status==='fail'&&rp.data.errors){var er=rp.data.errors;for(var fn in er){if(!er.hasOwnProperty(fn))continue;var tf=null;if(fn==='email'){tf=fld(f,ef,true);}else if(fn==='phone'){tf=fld(f,pf,false);}else if(fn==='_rate_limit'){tf=fld(f,ef,true)||fld(f,pf,false);}sho(tf,er[fn]);}us(f);return;}us(f);rsub(f);}catch(e){us(f);rsub(f);}};x.onerror=function(){us(f);rsub(f);};x.ontimeout=function(){us(f);rsub(f);};x.timeout=15000;x.send(JSON.stringify(d));}function init(){if(!pk){console.warn('Form Shield: No data-key attribute found on script tag.');return;}document.addEventListener('submit',hSub,true);}if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',init);}else{init();}})();