{"id":294,"date":"2026-01-05T19:17:26","date_gmt":"2026-01-05T19:17:26","guid":{"rendered":"https:\/\/khorasantaekwondo.com\/?page_id=294"},"modified":"2026-01-05T19:17:27","modified_gmt":"2026-01-05T19:17:27","slug":"student-verification","status":"publish","type":"page","link":"https:\/\/khorasantaekwondo.com\/index.php\/student-verification\/","title":{"rendered":"Student Verification"},"content":{"rendered":"<div class=\"tcms-container\" role=\"form\" aria-labelledby=\"tcms-verify-heading\">\n\t<h2 id=\"tcms-verify-heading\">Student Verification<\/h2>\n\n\t<div id=\"tcms-last-name-group\" class=\"tcms-form-group\">\n\t\t<label for=\"tcms-last-name\">Last Name *<\/label>\n\t\t<input type=\"text\" id=\"tcms-last-name\" inputmode=\"text\" autocomplete=\"family-name\" aria-required=\"true\" aria-invalid=\"false\" \/>\n\t<\/div>\n\n\t<div id=\"tcms-dob-group\" class=\"tcms-form-group\">\n\t\t<label for=\"tcms-dob\">Date of Birth *<\/label>\n\t\t<input type=\"date\" id=\"tcms-dob\" aria-required=\"true\" aria-invalid=\"false\" \/>\n\t\t<small class=\"tcms-help\">Use the date picker or enter DD\/MM\/YYYY.<\/small>\n\t<\/div>\n\n\t<div id=\"tcms-input-row\" class=\"tcms-input-row\">\n\t\t<button type=\"button\" id=\"tcms-verify-btn\" class=\"tcms-btn tcms-btn-primary\">\n\t\t\tVerify\t\t<\/button>\n\t<\/div>\n\n\t<div id=\"tcms-verify-loading\" class=\"tcms-alert tcms-alert-info\" role=\"status\" aria-live=\"polite\" style=\"display:none;\">\n\t\tChecking\u2026\t<\/div>\n\t<div id=\"tcms-verify-error\" class=\"tcms-alert tcms-alert-danger\" style=\"display:none;\" aria-live=\"assertive\"><\/div>\n\n\t<!-- Result Card -->\n\t<div id=\"tcms-verify-result\" class=\"tcms-details-card\" style=\"display:none;\" aria-live=\"polite\">\n\t\t<div class=\"tcms-row\">\n\t\t\t<div class=\"tcms-col\">\n\t\t\t\t<p class=\"card-text\"><strong>Full Name:<\/strong> <span id=\"tcms-v-name\"><\/span><\/p>\n\t\t\t\t<p class=\"card-text\"><strong>Membership Number:<\/strong> <span id=\"tcms-v-membership\"><\/span><\/p>\n\n\t\t\t\t<p class=\"card-text\"><strong>Club:<\/strong> <span id=\"tcms-v-club\"><\/span><\/p>\n\t\t\t\t<p class=\"card-text\">\n\t\t\t\t\t<strong>Belt:<\/strong>\n\t\t\t\t\t<span id=\"tcms-v-belt\"><\/span>\n\t\t\t\t\t<img decoding=\"async\" id=\"tcms-v-belt-img\" src=\"\" alt=\"Belt Image\" class=\"img-fluid ms-2\" style=\"display:none;width:80px;height:auto;\">\n\t\t\t\t<\/p>\n\n\t\t\t\t<p class=\"card-text\">\n\t\t\t\t\t<strong>Training Commence Date:<\/strong>\n\t\t\t\t\t<span id=\"tcms-v-tcd\"><\/span>\n\t\t\t\t<\/p>\n\t\t\t\t<p class=\"card-text\">\n\t\t\t\t\t<strong>Last Grading Date:<\/strong>\n\t\t\t\t\t<span id=\"tcms-v-lgd\"><\/span>\n\t\t\t\t<\/p>\n\n\t\t\t\t<div id=\"tcms-v-photo-wrap\" class=\"mt-3\" style=\"display:none;\">\n\t\t\t\t\t<img decoding=\"async\" id=\"tcms-v-photo\" src=\"\" alt=\"Student Photo\" class=\"img-thumbnail\" style=\"width:150px;height:auto;\">\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"tcms-actions\">\n\t\t\t\t\t<button type=\"button\" id=\"tcms-close-btn\" class=\"tcms-btn tcms-btn-secondary\">Close<\/button>\n\t\t\t\t<\/div>\n\t\t\t\t<!-- QR intentionally omitted for public output -->\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div><!-- .tcms-container -->\n\n<script>\n(function(cfg){\n\t'use strict';\n\t\/\/ Merge localized tcmsPublic (if provided elsewhere) with this template config\n\twindow.tcmsPublic = Object.assign({ ajax_url:'', nonce:'' }, (window.tcmsPublic || {}), cfg || {});\n\n\tvar btn    = document.getElementById('tcms-verify-btn');\n\tvar ln     = document.getElementById('tcms-last-name');\n\tvar dob    = document.getElementById('tcms-dob');\n\tvar lnGrp  = document.getElementById('tcms-last-name-group');\n\tvar dobGrp = document.getElementById('tcms-dob-group');\n\tvar btnRow = document.getElementById('tcms-input-row');\n\tvar loadB  = document.getElementById('tcms-verify-loading');\n\tvar errB   = document.getElementById('tcms-verify-error');\n\tvar box    = document.getElementById('tcms-verify-result');\n\tvar closeB = document.getElementById('tcms-close-btn');\n\n\tfunction f(id){ return document.getElementById(id); }\n\tfunction show(el){ if(el){ el.style.display=''; } }\n\tfunction hide(el){ if(el){ el.style.display='none'; } }\n\tfunction busy(on){ if(btn){ btn.disabled = !!on; } if(loadB){ loadB.setAttribute('aria-busy', on ? 'true':'false'); } }\n\tfunction setInvalid(el, on){ if(el){ el.setAttribute('aria-invalid', on ? 'true' : 'false'); } }\n\tfunction fail(msg){ if(errB){ errB.textContent = msg; show(errB); } }\n\n\tfunction hideForm(){ hide(lnGrp); hide(dobGrp); hide(btnRow); }\n\tfunction showForm(){ show(lnGrp); show(dobGrp); show(btnRow); }\n\n\tfunction clearResult(){\n\t\thide(box);\n\t\t['tcms-v-name','tcms-v-membership','tcms-v-club','tcms-v-belt','tcms-v-tcd','tcms-v-lgd'].forEach(function(id){\n\t\t\tvar el=f(id); if(el){ el.textContent=''; }\n\t\t});\n\t\tvar beltImg = f('tcms-v-belt-img'); if(beltImg){ beltImg.src=''; hide(beltImg); }\n\t\tvar photo = f('tcms-v-photo'); var photoW = f('tcms-v-photo-wrap'); if(photo&&photoW){ photo.src=''; hide(photoW); }\n\t}\n\n\tfunction verify(){\n\t\thide(errB);\n\t\tclearResult();\n\t\tshow(loadB);\n\t\tbusy(true);\n\t\tsetInvalid(ln,false);\n\t\tsetInvalid(dob,false);\n\n\t\t\/\/ Immediately hide the form after clicking Verify (less PII on screen)\n\t\thideForm();\n\n\t\tvar lastName = (ln && ln.value || '').trim().replace(\/\\s+\/g,' ');\n\t\tvar dobVal   = (dob && dob.value || '').trim(); \/\/ 'YYYY-MM-DD' from <input type=\"date\">\n\n\t\tif(!lastName || !dobVal){\n\t\t\thide(loadB); busy(false);\n\t\t\tif(!lastName) setInvalid(ln,true);\n\t\t\tif(!dobVal)   setInvalid(dob,true);\n\t\t\tshowForm();\n\t\t\treturn fail(\"Please enter last name and date of birth.\");\n\t\t}\n\n\t\tvar body = new FormData();\n\t\tbody.append('action', 'tcms_public_verify_student');\n\t\tbody.append('security', (window.tcmsPublic && tcmsPublic.nonce) ? tcmsPublic.nonce : '');\n\t\tbody.append('last_name', lastName);\n\t\tbody.append('date_of_birth', dobVal); \/\/ PHP accepts YYYY-MM-DD and DD\/MM\/YYYY\n\n\t\tvar url = (window.tcmsPublic && tcmsPublic.ajax_url) ? tcmsPublic.ajax_url : \"https:\\\/\\\/khorasantaekwondo.com\\\/wp-admin\\\/admin-ajax.php\";\n\n\t\tfetch(url, { method:'POST', credentials:'same-origin', body: body })\n\t\t\t.then(function(r){\n\t\t\t\tif(!r.ok) throw new Error('HTTP '+r.status);\n\t\t\t\treturn r.json().catch(function(){ throw new Error('Bad JSON'); });\n\t\t\t})\n\t\t\t.then(function(json){\n\t\t\t\thide(loadB); busy(false);\n\t\t\t\tif(!json || !json.success || !json.data){\n\t\t\t\t\tshowForm();\n\t\t\t\t\treturn fail( (json && json.data) ? (typeof json.data === 'string' ? json.data : 'Enter the correct details and try again!') : 'Enter the correct details and try again!' );\n\t\t\t\t}\n\t\t\t\tvar d = json.data;\n\n\t\t\t\tf('tcms-v-name').textContent       = ((d.first_name || '') + ' ' + (d.last_name || '')).trim();\n\t\t\t\tf('tcms-v-membership').textContent = d.membership_number || '';\n\t\t\t\tf('tcms-v-club').textContent       = d.club_name || '';\n\t\t\t\tf('tcms-v-belt').textContent       = d.belt_name || '';\n\t\t\t\tf('tcms-v-tcd').textContent        = d.training_commence_date || '';\n\t\t\t\tf('tcms-v-lgd').textContent        = d.last_grading_date || '';\n\n\t\t\t\tvar beltImg = f('tcms-v-belt-img');\n\t\t\t\tif (beltImg && d.belt_img_url){\n\t\t\t\t\tbeltImg.src = d.belt_img_url;\n\t\t\t\t\tshow(beltImg);\n\t\t\t\t}\n\t\t\t\tvar photo = f('tcms-v-photo'); var photoW = f('tcms-v-photo-wrap');\n\t\t\t\tif(photo && photoW && d.photo){\n\t\t\t\t\tphoto.src = d.photo;\n\t\t\t\t\tshow(photoW);\n\t\t\t\t}\n\n\t\t\t\tshow(box);\n\t\t\t})\n\t\t\t.catch(function(){\n\t\t\t\thide(loadB); busy(false);\n\t\t\t\tshowForm();\n\t\t\t\tfail(\"Enter the correct details and try again!\");\n\t\t\t});\n\t}\n\n\tfunction closeCard(){\n\t\thide(errB);\n\t\tclearResult();\n\t\tshowForm();\n\t\tif (ln) { ln.focus(); }\n\t}\n\n\tif (btn)   btn.addEventListener('click', verify);\n\tif (ln)    ln.addEventListener('keydown', function(e){ if(e.key==='Enter'){ e.preventDefault(); verify(); }});\n\tif (dob)   dob.addEventListener('keydown', function(e){ if(e.key==='Enter'){ e.preventDefault(); verify(); }});\n\tif (closeB) closeB.addEventListener('click', closeCard);\n})({\"ajax_url\":\"https:\\\/\\\/khorasantaekwondo.com\\\/wp-admin\\\/admin-ajax.php\",\"nonce\":\"a90953041e\"});\n<\/script>\n\n\n<script type=\"text\/javascript\">\n(function($){\n    function show(el){ $(el).show(); }\n    function hide(el){ $(el).hide(); }\n    function esc(s){ return String(s || '').replace(\/[&<>\"']\/g, function(m){ return ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[m]); }); }\n\n    var cfg = {\"ajax_url\":\"https:\\\/\\\/khorasantaekwondo.com\\\/wp-admin\\\/admin-ajax.php\",\"nonce\":\"a90953041e\"};\n\n    $('#tcms-verify-btn').on('click', function(){\n        var lastName = ($('#tcms-last-name').val() || '').trim();\n        var dob      = ($('#tcms-dob').val() || '').trim();\n\n        hide('#tcms-verify-error'); hide('#tcms-verify-result');\n        if(!lastName || !dob){\n            $('#tcms-verify-error').text('Please provide last name and date of birth.').show();\n            return;\n        }\n\n        $('#tcms-verify-btn').prop('disabled', true);\n        show('#tcms-verify-loading');\n\n        $.ajax({\n            url: cfg.ajax_url,\n            type: 'POST',\n            dataType: 'json',\n            data: {\n                action: 'tcms_public_verify_student',\n                security: cfg.nonce,\n                last_name: lastName,\n                date_of_birth: dob\n            }\n        }).done(function(res){\n            hide('#tcms-verify-loading');\n            $('#tcms-verify-btn').prop('disabled', false);\n\n            if(res && res.success && res.data){\n                var d = res.data;\n                $('#tcms-v-name').text(d.full_name || '');\n                $('#tcms-v-membership').text(d.membership_number || '');\n                $('#tcms-v-club').text(d.club_name || '');\n                $('#tcms-v-belt').text(d.belt_name || '');\n                $('#tcms-v-status').text(d.status || '');\n                $('#tcms-v-expiry').text(d.membership_expiry_date || '');\n                show('#tcms-verify-result');\n            } else {\n                var msg = (res && res.data) ? res.data : 'Student not found.';\n                $('#tcms-verify-error').text(msg).show();\n            }\n        }).fail(function(xhr){\n            hide('#tcms-verify-loading');\n            $('#tcms-verify-btn').prop('disabled', false);\n            var msg = 'Verification failed. Please try again.';\n            if(xhr && xhr.responseJSON && xhr.responseJSON.data){ msg = xhr.responseJSON.data; }\n            $('#tcms-verify-error').text(msg).show();\n        });\n    });\n})(jQuery);\n<\/script>\n\n<style>\n.tcms-container { max-width: 720px; margin: 1rem auto; font-family: inherit; }\n.tcms-form-group { margin-bottom: 1rem; display: flex; flex-direction: column; gap: .25rem; }\n.tcms-input-row { margin-top: .5rem; }\n.tcms-btn { cursor: pointer; padding: .5rem .75rem; border: 1px solid #ccc; border-radius: 4px; background: #f7f7f7; }\n.tcms-btn:disabled { opacity: .6; cursor: not-allowed; }\n.tcms-btn-primary { background: #0057d9; color: #fff; border-color: #0057d9; }\n.tcms-btn-secondary { background: #e9ecef; color: #212529; border-color: #ced4da; }\n.tcms-btn-secondary:hover { background: #dee2e6; }\n.tcms-alert { padding: .75rem 1rem; border-radius: 4px; margin-top: 1rem; border: 1px solid transparent; }\n.tcms-alert-info { background: #cff4fc; color: #055160; border-color: #b6effb; }\n.tcms-alert-danger { background: #f8d7da; color: #842029; border-color: #f5c2c7; }\n.tcms-details-card { padding: 1rem; border: 1px solid #e5e5e5; border-radius: 6px; background: #fafafa; margin-top: 1rem; }\n.tcms-row { display: flex; gap: 1rem; flex-wrap: wrap; }\n.tcms-col { flex: 1 1 300px; min-width: 280px; }\n.tcms-actions { margin-top: 1rem; display: flex; justify-content: flex-end; }\n<\/style>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-294","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/pages\/294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/comments?post=294"}],"version-history":[{"count":1,"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/pages\/294\/revisions"}],"predecessor-version":[{"id":295,"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/pages\/294\/revisions\/295"}],"wp:attachment":[{"href":"https:\/\/khorasantaekwondo.com\/index.php\/wp-json\/wp\/v2\/media?parent=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}