PageSourceSearch

https://www.issaonline.com/cdn/shop/t/5/assets/chunk--CertificateValidation-DJPZDRT2.vbt.js

js issaonline.com collected 2026-09-24 15:23:46 UTC 6,580 bytes, 2 lines download raw bytes

1var CertificateValidation=class{constructor(element,selector){this.el=element,this.options=JSON.parse(element.getAttribute(selector)||"{}"),this.proxyUrl=this.options.proxyUrl||"",this.siteKey=this.options.recaptchaSiteKey||"",this.recaptchaAction="cert_verify",this.submitting=!1,this.form=this.el.querySelector("[data-cert-form]"),this.lastNameInput=this.el.querySelector("[data-cert-lastname]"),this.certIdInput=this.el.querySelector("[data-cert-id]"),this.submitBtn=this.el.querySelector("[data-cert-submit]"),this.submitLabel=this.el.querySelector("[data-cert-submit-label]"),this.submitSpinner=this.el.querySelector("[data-cert-submit-spinner]"),this.formError=this.el.querySelector("[data-cert-form-error]"),this.resultRegion=this.el.querySelector("[data-cert-result]"),this.states={loading:this.el.querySelector('[data-cert-state="loading"]'),found:this.el.querySelector('[data-cert-state="found"]'),"not-found":this.el.querySelector('[data-cert-state="not-found"]'),error:this.el.querySelector('[data-cert-state="error"]')},this.fld={name:this.el.querySelector('[data-cert-field="name"]'),code:this.el.querySelector('[data-cert-field="code"]'),course:this.el.querySelector('[data-cert-field="course"]'),course2:this.el.querySelector('[data-cert-field="course2"]'),course2Row:this.el.querySelector('[data-cert-field="course2-row"]'),issued:this.el.querySelector('[data-cert-field="issued"]'),expires:this.el.querySelector('[data-cert-field="expires"]')}}
1async init(){this.form&&(this.proxyUrl&&!this.proxyUrl.startsWith("https://")&&console.warn("[CertificateValidation] Proxy endpoint URL should be HTTPS \u2014 non-HTTPS requests are blocked as mixed content on the live (HTTPS) store page."),this.loadRecaptcha(),this.form.addEventListener("submit",e=>{e.preventDefault(),this.handleSubmit()}))}loadRecaptcha(){if(!this.siteKey||window.grecaptcha||document.querySelector("script[data-recaptcha]"))return;const s=document.createElement("script");s.src=`https://www.google.com/recaptcha/api.js?render=${encodeURIComponent(this.siteKey)}`,s.async=!0,s.defer=!0,s.setAttribute("data-recaptcha",""),document.head.appendChild(s)}async getRecaptchaToken(){if(!this.siteKey)return"";const grecaptcha=await this.waitForRecaptcha();if(!grecaptcha)return console.error("[CertificateValidation] reCAPTCHA failed to load."),"";try{return await new Promise(resolve=>grecaptcha.ready(resolve)),await grecaptcha.execute(this.siteKey,{action:this.recaptchaAction})}catch(e){return console.error("[CertificateValidation] reCAPTCHA execute failed:",e),""}}waitForRecaptcha(timeout=5e3){return new Promise(resolve=>{if(window.grecaptcha)return resolve(window.grecaptcha);const start=Date.now(),interval=setInterval(()=>{window.grecaptcha?(clearInterval(interval),resolve(window.grecaptcha)):Date.now()-start>timeout&&(clearInterval(interval),resolve(null))},100)})}validate(){const lastName=(this.lastNameInput?.value||"").trim(),certId=(this.certIdInput?.value||"").trim();return!lastName||!certId?(this.toggleFormError(!0),null):(this.toggleFormError(!1),{lastName,certId})}async handleSubmit(){if(this.submitting)return;const values=this.validate();if(!values){this.resultRegion?.classList.add("hidden");return}this.submitting=!0,this.setLoading(!0),this.showState("loading");try{const token=await this.getRecaptchaToken(),result=await this.lookup(values.lastName,values.certId,token);result.status==="found"?this.renderFound(result.data,values.certId)?this.showState("found"):this.showState("not-found"):result.status==="not-found"?this.showState("not-found"):this.showState("error")}catch(e){console.error("[CertificateValidation] lookup failed:",e),this.showState("error")}finally{this.submitting=!1,this.setLoading(!1)}}async lookup(lastName,certId,token){if(!this.proxyUrl)return console.error(`[CertificateValidation] No proxy endpoint configured \u2014 set the section's "Proxy endpoint URL".`),{status:"error"};const res=await fetch(this.proxyUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({last_name:lastName,cert_id:certId,token})});if(res.status===204)return{status:"not-found"};if(!res.ok)return{status:"error"};const data=await res.json().catch(()=>null);return data?data.success===!1?{status:"not-found"}:{status:"found",data}:{status:"error"}}renderFound(d,submittedCertId){const results=Array.isArray(d?.results)?d.results:[],topLevel=d&&typeof d=="object"&&!Array.isArray(d)&&d.certification_code!=null?[d]:[],candidates=[...results,...topLevel],normalizeCode=value=>String(value??"").trim().toLowerCase(),wanted=normalizeCode(submittedCertId),matched=candidates.find(entry=>normalizeCode(entry?.certification_code)===wanted);if(!matched)return!1;this.setText(this.fld.name,matched.student_name_to_print??d.student_name_to_print),this.setText(this.fld.code,matched.certification_code),this.setText(this.fld.course,matched.certification_name),this.setText(this.fld.issued,this.formatDate(matched.granted_at)),this.setText(this.fld.expires,this.formatDate(matched.expires_at)),this.fld.course2Row&&(matched.certification_name_2?(this.setText(this.fld.course2,matched.certification_name_2),this.fld.course2Row.classList.remove("hidden")):this.fld.course2Row.classList.add("hidden"));const expired=!!matched.is_expired;return this.states.found?.setAttribute("data-cert-status",expired?"expired":"valid"),!0}formatDate(iso){if(!iso)return"\u2014";const d=new Date(iso);return isNaN(d.getTime())?iso:d.toLocaleDateString(void 0,{year:"numeric",month:"long",day:"numeric"})}setText(el,val){el&&(el.textContent=val==null||val===""?"\u2014":val)}showState(state){this.resultRegion?.classList.remove("hidden"),Object.values(this.states).forEac
1h(el=>el&&el.classList.add("hidden")),this.states[state]?.classList.remove("hidden"),state!=="loading"&&this.scrollResultIntoView()}scrollResultIntoView(){const el=this.resultRegion;if(!el)return;const rect=el.getBoundingClientRect(),vh=window.innerHeight||document.documentElement.clientHeight;(rect.top<0||rect.top>vh*.5)&&el.scrollIntoView({behavior:"smooth",block:"start"})}setLoading(isLoading){this.submitBtn&&(this.submitBtn.disabled=isLoading,this.submitBtn.setAttribute("aria-busy",isLoading?"true":"false")),this.submitLabel?.classList.toggle("opacity-0",isLoading),this.submitSpinner?.classList.toggle("hidden",!isLoading)}toggleFormError(show){this.formError?.classList.toggle("hidden",!show)}},CertificateValidation_default=CertificateValidation;export{CertificateValidation_default as default};
2//# sourceMappingURL=/cdn/shop/t/5/assets/chunk--CertificateValidation-DJPZDRT2.vbt.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.