(function () { 'use strict'; document.addEventListener('DOMContentLoaded', function() { var dash = document.getElementById('elp-student-dashboard'); if (!dash) return; var CFG = window.ELP_DASH_CFG || {}; // 1. Handle Avatar Upload (Hover Overlay Method) var avatarWrap = document.getElementById('elp-avatar-trigger'); var avatarInput = document.getElementById('elp-avatar-input'); var avatarImg = document.getElementById('elp-dash-avatar'); if (avatarWrap) { avatarWrap.addEventListener('click', function() { avatarInput.click(); }); } if (avatarInput) { avatarInput.addEventListener('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(event) { var base64Image = event.target.result; var overlay = document.querySelector('.elp-dash-avatar-overlay'); if (overlay) { overlay.innerHTML = 'Uploading...'; overlay.style.opacity = '1'; } fetch(CFG.restUrl + '/dashboard/update-avatar', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': CFG.nonce }, body: JSON.stringify({ image: base64Image }) }) .then(r => r.json()) .then(res => { if (res.success) { var newUrl = res.url + '?t=' + new Date().getTime(); avatarImg.src = newUrl; var headerAvatar = document.querySelector('.elp-header-avatar'); if (headerAvatar) headerAvatar.src = newUrl; } else { alert(res.message || 'Upload failed.'); } if (overlay) overlay.innerHTML = 'Change Photo'; }) .catch(() => { alert('Network error.'); if (overlay) overlay.innerHTML = 'Change Photo'; }); }; reader.readAsDataURL(file); }); } // 2. Fetch Real Recent Exam Attempts (Enhanced Error Reporting) var examList = document.getElementById('elp-recent-exams'); if (examList) { fetch(CFG.restUrl + '/dashboard/recent-exams', { headers: { 'X-WP-Nonce': CFG.nonce } }) .then(r => r.json().then(data => ({ status: r.status, body: data }))) .then(res => { if (res.status >= 400) { var errMsg = res.body.message || 'Failed to load exams.'; examList.innerHTML = '
Error: ' + errMsg + '
'; return; } if (res.body.exams && res.body.exams.length > 0) { examList.innerHTML = res.body.exams.map(function(exam) { var badgeClass = exam.passed ? 'passed' : 'failed'; var badgeText = exam.passed ? 'Passed' : 'Failed'; return `
${exam.title} ${exam.score} (${exam.percent})
${badgeText}
`; }).join(''); } else { examList.innerHTML = '
You haven\'t taken any exams yet. Start one!
'; } }) .catch(() => { examList.innerHTML = '
Network error loading exams.
'; }); } // 3. Handle Profile Update Form var profileForm = document.getElementById('elp-profile-form'); if (profileForm) { profileForm.addEventListener('submit', function(e) { e.preventDefault(); var msgBox = dash.querySelector('.elp-profile-msg'); var btn = profileForm.querySelector('button[type="submit"]'); msgBox.style.display = 'none'; btn.textContent = 'Saving...'; btn.disabled = true; var formData = new FormData(profileForm); var data = Object.fromEntries(formData); fetch(CFG.restUrl + '/dashboard/update-profile', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': CFG.nonce }, body: JSON.stringify(data) }) .then(r => r.json()) .then(res => { if (res.success) { msgBox.textContent = res.message; msgBox.style.color = '#10b981'; msgBox.style.display = 'block'; } else { msgBox.textContent = res.message || 'Update failed.'; msgBox.style.color = '#dc2626'; msgBox.style.display = 'block'; } btn.textContent = 'Update Profile'; btn.disabled = false; setTimeout(() => { msgBox.style.display = 'none'; }, 3000); }) .catch(() => { msgBox.textContent = 'Network error.'; msgBox.style.color = '#dc2626'; msgBox.style.display = 'block'; btn.textContent = 'Update Profile'; btn.disabled = false; }); }); } // 4. Handle "Become Ambassador" Upgrade var upgradeBtn = document.getElementById('elp-become-ambassador-btn'); if (upgradeBtn) { upgradeBtn.addEventListener('click', function() { upgradeBtn.textContent = 'Verifying...'; upgradeBtn.disabled = true; fetch(CFG.restUrl + '/dashboard/become-ambassador', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': CFG.nonce } }) .then(r => r.json()) .then(res => { if (res.success) { window.location.href = res.redirect; } else { if (res.code === 'not_purchased' && res.data && res.data.link) { alert('You must purchase the "Affiliate Marketing" course first. Redirecting you now...'); window.location.href = res.data.link; } else { alert(res.message || 'Upgrade failed.'); upgradeBtn.textContent = 'Become an Ambassador'; upgradeBtn.disabled = false; } } }) .catch(() => { alert('Network error.'); upgradeBtn.textContent = 'Become an Ambassador'; upgradeBtn.disabled = false; }); }); } // 5. Handle OTP Verification (Email & WhatsApp) using Event Delegation dash.addEventListener('click', function(e) { var sendBtn = e.target.closest('.elp-send-otp-btn'); var confirmBtn = e.target.closest('.elp-confirm-otp-btn'); // Send OTP Click if (sendBtn) { e.preventDefault(); var type = sendBtn.getAttribute('data-type'); var wrap = sendBtn.nextElementSibling; sendBtn.textContent = 'Sending...'; sendBtn.disabled = true; fetch(CFG.restUrl + '/dashboard/send-otp', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': CFG.nonce }, body: JSON.stringify({ type: type }) }) .then(r => r.json()) .then(res => { if (res.success) { alert(res.message); sendBtn.style.display = 'none'; if(wrap) wrap.style.display = 'flex'; } else { alert(res.message || 'Failed to send OTP.'); sendBtn.textContent = 'Send OTP'; sendBtn.disabled = false; } }) .catch(() => { alert('Network error.'); sendBtn.textContent = 'Send OTP'; sendBtn.disabled = false; }); } // Confirm OTP Click if (confirmBtn) { e.preventDefault(); var type = confirmBtn.getAttribute('data-type'); var input = confirmBtn.previousElementSibling; var otp = input ? input.value.trim() : ''; if (!otp) { alert('Please enter the OTP.'); return; } confirmBtn.textContent = 'Verifying...'; confirmBtn.disabled = true; fetch(CFG.restUrl + '/dashboard/verify-otp', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': CFG.nonce }, body: JSON.stringify({ type: type, otp: otp }) }) .then(r => r.json()) .then(res => { if (res.success) { alert(res.message); window.location.reload(); } else { alert(res.message || 'Invalid OTP.'); confirmBtn.textContent = 'Verify'; confirmBtn.disabled = false; } }) .catch(() => { alert('Network error.'); confirmBtn.textContent = 'Verify'; confirmBtn.disabled = false; }); } }); // 6. Handle Copy Referral Link (Ambassador Dashboard) var copyBtn = document.getElementById('elp-copy-ref-link'); var linkInput = document.getElementById('elp-ref-link'); if (copyBtn && linkInput) { copyBtn.addEventListener('click', function() { linkInput.select(); linkInput.setSelectionRange(0, 99999); // For mobile devices navigator.clipboard.writeText(linkInput.value).then(function() { var originalText = copyBtn.textContent; copyBtn.textContent = 'Copied!'; copyBtn.classList.add('copied'); setTimeout(function() { copyBtn.textContent = originalText; copyBtn.classList.remove('copied'); }, 2000); }).catch(function() { alert('Please copy the link manually.'); }); }); } }); })(); Abacus Level-1 Book – Youth SKill Development

Great things are on the horizon

Something big is brewing! Our store is in the works and will be launching soon!

abacus level 1 bookAbacus Level-1 Book
150.00
Scroll to Top