انضم إلينا
↻
(function(){ var form = document.getElementById('volunteerForm'); var box = document.getElementById('volunteer_box'); if(!form || !box) return; // Detect language + direction from <html lang=".."> var htmlLang = (document.documentElement.getAttribute('lang') || 'ar').toLowerCase(); var isAr = htmlLang.indexOf('ar') === 0; var lang = isAr ? 'ar' : 'en'; box.setAttribute('dir', isAr ? 'rtl' : 'ltr'); // Fill labels/title/submit based on locale var TITLE = { ar: 'بيانات المتطوعين/ات لدى اتحاد الشباب الفلسطيني', en: 'Volunteers data at the Palestinian Youth Union' }; box.querySelector('.vf-title').textContent = TITLE[lang]; box.querySelectorAll('[data-' + lang + ']').forEach(function(el){ var val = el.getAttribute('data-' + lang); if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') { el.setAttribute('placeholder', val); } else { el.textContent = val; } }); // Max birth date: today minus 16 years var today = new Date(); var maxDob = new Date(today.getFullYear() - 16, today.getMonth(), today.getDate()); var minDob = new Date(today.getFullYear() - 100, today.getMonth(), today.getDate()); var iso = function(d){ return d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0') + '-' + String(d.getDate()).padStart(2,'0'); }; var birthInput = form.querySelector('input[name="v_birthdate"]'); birthInput.setAttribute('max', iso(maxDob)); birthInput.setAttribute('min', iso(minDob)); function ageFrom(dateStr){ var d = new Date(dateStr); if (isNaN(d.getTime())) return -1; var a = today.getFullYear() - d.getFullYear(); var m = today.getMonth() - d.getMonth(); if (m < 0 || (m === 0 && today.getDate() < d.getDate())) a--; return a; } function validateField(input){ var wrap = input.closest('.vf-row'); var err = wrap ? wrap.querySelector('.vf-err') : null; var msg = ''; var v = (input.value || '').trim(); if (input.hasAttribute('required') && v === ''){ msg = isAr ? 'هذا الحقل مطلوب.' : 'This field is required.'; } else if (v !== '' && input.name === 'v_birthdate'){ var age = ageFrom(v); if (age < 16 || age > 100){ msg = input.getAttribute('data-err-' + lang) || ''; } } else if (v !== '' && input.pattern){ var re = new RegExp('^(?:' + input.pattern + ')$', 'u'); if (!re.test(v)) msg = input.getAttribute('data-err-' + lang) || ''; } else if (v !== '' && input.type === 'email'){ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)){ msg = input.getAttribute('data-err-' + lang) || ''; } } if (err){ err.textContent = msg; err.style.display = msg ? 'block' : 'none'; } input.style.borderColor = msg ? '#c00' : '#ccc'; return msg === ''; } form.querySelectorAll('.vf-input').forEach(function(inp){ inp.addEventListener('blur', function(){ validateField(inp); }); inp.addEventListener('input', function(){ if (inp.name === 'v_national_id') inp.value = inp.value.replace(/\D+/g,'').slice(0,10); }); }); // Resolve form action based on current URL (works for /<base>/<locale>/Article/...) var m = location.pathname.match(/^(.*?\/(en|ar))\//); var base = m ? m[1] : ''; form.action = base + '/Volunteers/Store'; // Captcha load/refresh var capImg = document.getElementById('vf-captcha-img'); var capRefresh = document.getElementById('vf-captcha-refresh'); var capToken = form.querySelector('input[name="captcha_token"]'); var capAnswer = form.querySelector('input[name="captcha_answer"]'); function loadCaptcha(){ capImg.innerHTML = '<span style="color:#888;font-size:13px;">' + (isAr ? 'جارٍ التحميل...' : 'Loading...') + '</span>'; fetch(base + '/Volunteers/Captcha', { headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, credentials: 'same-origin', cache: 'no-store' }).then(function(r){ return r.json(); }).then(function(j){ if (j && j.token && j.svg){ capImg.innerHTML = j.svg; capToken.value = j.token; if (capAnswer) capAnswer.value = ''; } else { capImg.innerHTML = '<span style="color:#c00;font-size:13px;">' + (isAr ? 'تعذر تحميل التحقق' : 'Captcha failed') + '</span>'; } }).catch(function(){ capImg.innerHTML = '<span style="color:#c00;font-size:13px;">' + (isAr ? 'تعذر تحميل التحقق' : 'Captcha failed') + '</span>'; }); } if (capRefresh) capRefresh.addEventListener('click', loadCaptcha); loadCaptcha(); form.addEventListener('submit', function(e){ e.preventDefault(); var okBox = document.getElementById('volunteer_success'); var errBox = document.getElementById('volunteer_error'); okBox.style.display = 'none'; errBox.style.display = 'none'; var allOk = true; form.querySelectorAll('.vf-input').forEach(function(inp){ if (!validateField(inp)) allOk = false; }); if (!allOk){ errBox.innerHTML = isAr ? 'يرجى تصحيح الحقول المظللة.' : 'Please fix the highlighted fields.'; errBox.style.display = 'block'; var firstErr = form.querySelector('.vf-err[style*="block"]'); if (firstErr && firstErr.scrollIntoView) firstErr.scrollIntoView({behavior:'smooth', block:'center'}); return; } var btn = form.querySelector('.vf-submit'); btn.disabled = true; var origTxt = btn.textContent; btn.textContent = isAr ? 'جارٍ الإرسال...' : 'Submitting...'; var fd = new FormData(form); fetch(form.action, { method: 'POST', body: fd, headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, credentials: 'same-origin' }).then(function(r){ return r.json().then(function(j){ return { ok: r.ok, body: j }; }) .catch(function(){ return { ok: r.ok, body: null }; }); }).then(function(res){ btn.disabled = false; btn.textContent = origTxt; if (res.ok && res.body && res.body.ok){ okBox.textContent = res.body.message || (isAr ? 'شكراً لتسجيلك كمتطوع.' : 'Thank you for registering as a volunteer.'); okBox.style.display = 'block'; form.reset(); loadCaptcha(); window.scrollTo({ top: box.offsetTop - 80, behavior: 'smooth' }); } else { var msgs = []; if (res.body && res.body.errors){ Object.keys(res.body.errors).forEach(function(k){ (res.body.errors[k] || []).forEach(function(m){ msgs.push(m); }); }); } errBox.innerHTML = msgs.length ? msgs.map(function(m){ return '• ' + m; }).join('<br>') : (isAr ? 'حدث خطأ، الرجاء المحاولة لاحقاً.' : 'An error occurred. Please try again.'); errBox.style.display = 'block'; loadCaptcha(); } }).catch(function(){ btn.disabled = false; btn.textContent = origTxt; errBox.textContent = isAr ? 'تعذر الإرسال. الرجاء التحقق من الاتصال.' : 'Unable to submit. Check your connection.'; errBox.style.display = 'block'; }); }); })();