{"id":1749,"date":"2026-01-17T16:27:20","date_gmt":"2026-01-17T15:27:20","guid":{"rendered":"https:\/\/xhamiarrugaeudhezimit.se\/?page_id=1749"},"modified":"2026-03-21T09:16:40","modified_gmt":"2026-03-21T08:16:40","slug":"member-form","status":"publish","type":"page","link":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/member-form\/","title":{"rendered":"Bli medlem"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1749\" class=\"elementor elementor-1749\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-30c894a e-flex e-con-boxed e-con e-parent\" data-id=\"30c894a\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_bottom&quot;:&quot;mountains&quot;,&quot;shape_divider_top&quot;:&quot;mountains&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-top\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" opacity=\"0.33\" d=\"M473,67.3c-203.9,88.3-263.1-34-320.3,0C66,119.1,0,59.7,0,59.7V0h1000v59.7 c0,0-62.1,26.1-94.9,29.3c-32.8,3.3-62.8-12.3-75.8-22.1C806,49.6,745.3,8.7,694.9,4.7S492.4,59,473,67.3z\"\/>\n\t<path class=\"elementor-shape-fill\" opacity=\"0.66\" d=\"M734,67.3c-45.5,0-77.2-23.2-129.1-39.1c-28.6-8.7-150.3-10.1-254,39.1 s-91.7-34.4-149.2,0C115.7,118.3,0,39.8,0,39.8V0h1000v36.5c0,0-28.2-18.5-92.1-18.5C810.2,18.1,775.7,67.3,734,67.3z\"\/>\n\t<path class=\"elementor-shape-fill\" d=\"M766.1,28.9c-200-57.5-266,65.5-395.1,19.5C242,1.8,242,5.4,184.8,20.6C128,35.8,132.3,44.9,89.9,52.5C28.6,63.7,0,0,0,0 h1000c0,0-9.9,40.9-83.6,48.1S829.6,47,766.1,28.9z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-shape elementor-shape-bottom\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" opacity=\"0.33\" d=\"M473,67.3c-203.9,88.3-263.1-34-320.3,0C66,119.1,0,59.7,0,59.7V0h1000v59.7 c0,0-62.1,26.1-94.9,29.3c-32.8,3.3-62.8-12.3-75.8-22.1C806,49.6,745.3,8.7,694.9,4.7S492.4,59,473,67.3z\"\/>\n\t<path class=\"elementor-shape-fill\" opacity=\"0.66\" d=\"M734,67.3c-45.5,0-77.2-23.2-129.1-39.1c-28.6-8.7-150.3-10.1-254,39.1 s-91.7-34.4-149.2,0C115.7,118.3,0,39.8,0,39.8V0h1000v36.5c0,0-28.2-18.5-92.1-18.5C810.2,18.1,775.7,67.3,734,67.3z\"\/>\n\t<path class=\"elementor-shape-fill\" d=\"M766.1,28.9c-200-57.5-266,65.5-395.1,19.5C242,1.8,242,5.4,184.8,20.6C128,35.8,132.3,44.9,89.9,52.5C28.6,63.7,0,0,0,0 h1000c0,0-9.9,40.9-83.6,48.1S829.6,47,766.1,28.9z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-93d4040 elementor-widget__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"93d4040\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\t<div id=\"smf-membership-root\"><\/div>\n\n\t<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/signature_pad@4.1.7\/dist\/signature_pad.umd.min.js\"><\/script>\n\n\t<script>\n\t\twindow.SMF_MEMBERSHIP_API = {\n\t\t\tsubmitUrl: \"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/smf\/v1\/membership-submit\",\n\t\t\ttokenUrl: \"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/smf\/v1\/membership-token\",\n\t\t\tlogoUrl: \"https:\/\/xhamiarrugaeudhezimit.se\/wp-content\/uploads\/2025\/11\/C4884FD7-6295-449D-BBDE-1DCA16A28DA3-scaled.png\"\n\t\t};\n\n\t\t(function () {\n\t\t\tconst root = document.getElementById(\"smf-membership-root\");\n\t\t\tconst MAX = 10;\n\n\t\t\tconst state = {\n\t\t\t\taddress: \"\",\n\t\t\t\tpostcode: \"\",\n\t\t\t\tcity: \"\",\n\t\t\t\tcontactPhone: \"\",\n\t\t\t\tmembers: [{ id: crypto.randomUUID(), name: \"\", pnr: \"\", phone: \"\", email: \"\", signature: \"\" }],\n\t\t\t};\n\n\t\t\t\/\/ signature pads by memberId\n\t\t\tconst pads = new Map();\n\n\t\t\tfunction esc(s) {\n\t\t\t\treturn String(s || \"\")\n\t\t\t\t\t.replaceAll(\"&\", \"&amp;\")\n\t\t\t\t\t.replaceAll(\"<\", \"&lt;\")\n\t\t\t\t\t.replaceAll(\">\", \"&gt;\")\n\t\t\t\t\t.replaceAll('\"', \"&quot;\")\n\t\t\t\t\t.replaceAll(\"'\", \"&#039;\");\n\t\t\t}\n\n\t\t\tfunction setMsg(text, isErr = false) {\n\t\t\t\tconst el = root.querySelector(\"#smf-msg\");\n\t\t\t\tif (!el) return;\n\t\t\t\tel.textContent = text;\n\t\t\t\tel.style.color = isErr ? \"#b32d2e\" : \"#1a7f37\";\n\t\t\t}\n\n\t\t\tfunction onlyDigits(s) { return String(s || \"\").replace(\/\\D+\/g, \"\"); }\n\n\t\t\tfunction formatPnr(v) {\n\t\t\t\tconst d = onlyDigits(v);\n\t\t\t\tif (d.length === 12) return d.slice(2, 8) + \"-\" + d.slice(8, 12);\n\t\t\t\tif (d.length === 10) return d.slice(0, 6) + \"-\" + d.slice(6, 10);\n\t\t\t\treturn v;\n\t\t\t}\n\n\t\t\tfunction isPnrFormat(v) { return \/^\\d{6}-\\d{4}$\/.test(String(v || \"\").trim()); }\n\n\t\t\tfunction ageFromPersonnummer(pnr) {\n\t\t\t\tconst d = onlyDigits(pnr);\n\t\t\t\tif (!d) return null;\n\n\t\t\t\tlet yyyy, mm, dd;\n\t\t\t\tif (d.length === 10) {\n\t\t\t\t\tconst yy = parseInt(d.slice(0, 2), 10);\n\t\t\t\t\tmm = parseInt(d.slice(2, 4), 10);\n\t\t\t\t\tdd = parseInt(d.slice(4, 6), 10);\n\t\t\t\t\tif (dd >= 61 && dd <= 91) dd -= 60;\n\n\t\t\t\t\tconst now = new Date();\n\t\t\t\t\tconst currentYY = parseInt(String(now.getFullYear()).slice(2), 10);\n\t\t\t\t\tconst century = (yy > currentYY) ? 1900 : 2000;\n\t\t\t\t\tyyyy = century + yy;\n\t\t\t\t} else if (d.length === 12) {\n\t\t\t\t\tyyyy = parseInt(d.slice(0, 4), 10);\n\t\t\t\t\tmm = parseInt(d.slice(4, 6), 10);\n\t\t\t\t\tdd = parseInt(d.slice(6, 8), 10);\n\t\t\t\t\tif (dd >= 61 && dd <= 91) dd -= 60;\n\t\t\t\t} else return null;\n\n\t\t\t\tconst dob = new Date(yyyy, mm - 1, dd);\n\t\t\t\tif (isNaN(dob.getTime())) return null;\n\n\t\t\t\tconst today = new Date();\n\t\t\t\tlet age = today.getFullYear() - dob.getFullYear();\n\t\t\t\tconst m = today.getMonth() - dob.getMonth();\n\t\t\t\tif (m < 0 || (m === 0 && today.getDate() < dob.getDate())) age--;\n\t\t\t\treturn age;\n\t\t\t}\n\n\t\t\tfunction isSigRequired(pnr) {\n\t\t\t\tconst a = ageFromPersonnummer(pnr);\n\t\t\t\treturn a !== null && a >= 12;\n\t\t\t}\n\n\t\t\tfunction cleanEmail(v) { return String(v || \"\").trim().replace(\/\\u00A0\/g, \"\"); }\n\n\t\t\tfunction isEmail(v) {\n\t\t\t\tconst email = cleanEmail(v).toLowerCase();\n\t\t\t\treturn \/^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-z0-9-]+(\\.[a-z0-9-]+)+$\/.test(email);\n\t\t\t}\n\n\t\t\tfunction getAdultsCount() {\n\t\t\t\treturn state.members.filter(m => {\n\t\t\t\t\tconst a = ageFromPersonnummer(m.pnr);\n\t\t\t\t\treturn a !== null && a >= 12;\n\t\t\t\t}).length;\n\t\t\t}\n\n\t\t\t\/\/ \u2705 ALWAYS keep signature saved in state\n\t\t\tfunction saveSignatureForMember(memberId) {\n\t\t\t\tconst m = state.members.find(x => x.id === memberId);\n\t\t\t\tconst pad = pads.get(memberId);\n\t\t\t\tif (!m || !pad) return;\n\n\t\t\t\tif (!pad.isEmpty()) m.signature = pad.toDataURL(\"image\/png\");\n\t\t\t}\n\n\t\t\tfunction saveAllSignaturesToState() {\n\t\t\t\tfor (const m of state.members) {\n\t\t\t\t\tconst pad = pads.get(m.id);\n\t\t\t\t\tif (pad && !pad.isEmpty()) {\n\t\t\t\t\t\tm.signature = pad.toDataURL(\"image\/png\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction restoreAllSignaturesFromState() {\n\t\t\t\tfor (const m of state.members) {\n\t\t\t\t\tconst pad = pads.get(m.id);\n\t\t\t\t\tif (!pad) continue;\n\t\t\t\t\tif (m.signature) {\n\t\t\t\t\t\ttry { pad.fromDataURL(m.signature); } catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction resizePadCanvas(pad) {\n\t\t\t\tconst canvas = pad.canvas;\n\t\t\t\tconst ratio = Math.max(window.devicePixelRatio || 1, 1);\n\t\t\t\tconst rect = canvas.getBoundingClientRect();\n\n\t\t\t\tcanvas.width = rect.width * ratio;\n\t\t\t\tcanvas.height = rect.height * ratio;\n\n\t\t\t\tconst ctx = canvas.getContext(\"2d\");\n\t\t\t\tctx.setTransform(ratio, 0, 0, ratio, 0, 0);\n\t\t\t}\n\n\t\t\t\/\/ \u2705 global resize: save -> resize -> restore\n\t\t\tlet smfResizeTimer = null;\n\t\t\twindow.addEventListener(\"resize\", () => {\n\t\t\t\tclearTimeout(smfResizeTimer);\n\t\t\t\tsmfResizeTimer = setTimeout(() => {\n\t\t\t\t\tsaveAllSignaturesToState();\n\t\t\t\t\tpads.forEach((pad) => resizePadCanvas(pad));\n\t\t\t\t\trestoreAllSignaturesFromState();\n\t\t\t\t}, 120);\n\t\t\t});\n\n\t\t\t\/\/ \u2705 single helper: any action that re-renders\n\t\t\tfunction rerender() {\n\t\t\t\t\/\/ IMPORTANT: save signatures BEFORE DOM replacement\n\t\t\t\tsaveAllSignaturesToState();\n\t\t\t\trender();\n\t\t\t}\n\n\t\t\tfunction render() {\n\t\t\t\tconst membersHtml = state.members.map((m, idx) => {\n\t\t\t\t\tconst sigRequired = isSigRequired(m.pnr);\n\n\t\t\t\t\treturn `\n        <div style=\"border:1px solid #e5e7eb; padding:14px; margin:12px 0; border-radius:14px\">\n          <div style=\"display:flex; justify-content:space-between; align-items:center; gap:12px\">\n            <strong>An\u00ebtar familjar ${idx + 1}<\/strong>\n            ${idx > 0 ? `<button type=\"button\" data-remove=\"${idx}\" style=\"padding:6px 10px;border-radius:10px;border:1px solid #ddd;background:#fff;cursor:pointer\">Hiq<\/button>` : ``}\n          <\/div>\n\n          <div style=\"display:grid; gap:8px; margin-top:12px\">\n            <input placeholder=\"Emri dhe mbiemri\" data-i=\"${idx}\" data-k=\"name\" value=\"${esc(m.name)}\"\n              style=\"padding:10px;border:1px solid #ddd;border-radius:10px\">\n            <input placeholder=\"Numri personal (\u00c5\u00c5MMDD-XXXX)\" data-i=\"${idx}\" data-k=\"pnr\" value=\"${esc(m.pnr)}\"\n              style=\"padding:10px;border:1px solid #ddd;border-radius:10px\">\n            <input placeholder=\"Telefoni\" data-i=\"${idx}\" data-k=\"phone\" value=\"${esc(m.phone)}\"\n              style=\"padding:10px;border:1px solid #ddd;border-radius:10px\">\n            <input placeholder=\"Email\" data-i=\"${idx}\" data-k=\"email\" value=\"${esc(m.email)}\"\n              style=\"padding:10px;border:1px solid #ddd;border-radius:10px\">\n          <\/div>\n\n          <div style=\"margin-top:12px;\">\n            <div style=\"font-size:13px;color:${sigRequired ? '#1a7f37' : '#6b7280'}\">\n              ${sigRequired ? '\u2705 12+ (n\u00ebnshkrimi k\u00ebrkohet)' : '\u2139\ufe0f N\u00ebn 12 (pa n\u00ebnshkrim)'}\n            <\/div>\n\n            ${sigRequired ? `\n              <div style=\"margin-top:10px;\">\n                <div style=\"font-weight:600;margin-bottom:6px;\">N\u00ebnshkrimi<\/div>\n                <canvas data-sig=\"${m.id}\" style=\"width:100%;max-width:400px;aspect-ratio:21\/9;border:1px solid #d1d5db;border-radius:12px;background:#fff\"><\/canvas>\n                <div style=\"display:flex;gap:8px;margin-top:8px;\">\n                  <button type=\"button\" data-clear=\"${m.id}\" style=\"padding:6px 10px;border-radius:10px;border:1px solid #ddd;background:#fff;cursor:pointer\">Pastro<\/button>\n                <\/div>\n              <\/div>\n            ` : ``}\n          <\/div>\n        <\/div>\n      `;\n\t\t\t\t}).join(\"\");\n\n\t\t\t\troot.innerHTML = `\n      <div style=\"width:100%;max-width:820px;margin:0 auto;padding:16px;border:1px solid #eee;border-radius:16px;box-sizing:border-box;\">\n        <h2 style=\"margin:0 0 10px\">Aplikim p\u00ebr an\u00ebtar\u00ebsim<\/h2>\n        <div style=\"color:#6b7280;margin-bottom:14px\">\n          Shtoni an\u00ebtar\u00ebt e familjes. T\u00eb gjith\u00eb 12+ vje\u00e7 duhet t\u00eb n\u00ebnshkruajn\u00eb.\n        <\/div>\n\n        <div style=\"display:grid; gap:8px; margin-bottom:14px\">\n          <input id=\"smf-address\" placeholder=\"Adresa\" value=\"${esc(state.address)}\"\n            style=\"padding:10px;border:1px solid #ddd;border-radius:10px\">\n          <div style=\"display:flex; gap:8px\">\n            <input id=\"smf-postcode\" placeholder=\"Kodi postal\" style=\"flex:1;padding:10px;border:1px solid #ddd;border-radius:10px\" value=\"${esc(state.postcode)}\">\n            <input id=\"smf-city\" placeholder=\"Qyteti\" style=\"width:100%;padding:10px;border:1px solid #ddd;border-radius:10px\" value=\"${esc(state.city)}\">\n          <\/div>\n          <input id=\"smf-contact-phone\" placeholder=\"Telefoni i personit kontaktues\"\n            style=\"padding:10px;border:1px solid #ddd;border-radius:10px\" value=\"${esc(state.contactPhone)}\">\n        <\/div>\n\n        <h3 style=\"margin:18px 0 8px\">An\u00ebtar\u00ebt e familjes<\/h3>\n        ${membersHtml}\n\n        <div style=\"display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-top:12px\">\n          <button id=\"smf-add\" type=\"button\" style=\"padding:10px 12px;border-radius:12px;border:1px solid #ddd;background:#fff;cursor:pointer\">+ Shto an\u00ebtar<\/button>\n          <button id=\"smf-submit\" type=\"button\" style=\"padding:10px 12px;border-radius:12px;border:0;background:#111827;color:#fff;cursor:pointer\">D\u00ebrgo<\/button>\n          <span id=\"smf-msg\" style=\"margin-left:6px\"><\/span>\n        <\/div>\n\n        <small style=\"display:block; margin-top:10px; color:#6b7280\">\n          Maksimumi ${MAX} persona p\u00ebr aplikim.\n        <\/small>\n      <\/div>\n    `;\n\n\t\t\t\t\/\/ inputs\n\t\t\t\troot.querySelector(\"#smf-address\").oninput = e => state.address = e.target.value;\n\t\t\t\troot.querySelector(\"#smf-postcode\").oninput = e => state.postcode = e.target.value;\n\t\t\t\troot.querySelector(\"#smf-city\").oninput = e => state.city = e.target.value;\n\t\t\t\troot.querySelector(\"#smf-contact-phone\").oninput = e => state.contactPhone = e.target.value;\n\n\t\t\t\troot.querySelectorAll(\"input[data-k]\").forEach(el => {\n\t\t\t\t\tel.oninput = (e) => {\n\t\t\t\t\t\tconst i = Number(e.target.dataset.i);\n\t\t\t\t\t\tconst k = e.target.dataset.k;\n\t\t\t\t\t\tstate.members[i][k] = e.target.value;\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\t\/\/ pnr formatting triggers rerender\n\t\t\t\troot.querySelectorAll('input[data-k=\"pnr\"]').forEach(el => {\n\t\t\t\t\tel.onblur = (e) => {\n\t\t\t\t\t\tconst i = Number(e.target.dataset.i);\n\t\t\t\t\t\tstate.members[i].pnr = formatPnr(e.target.value);\n\t\t\t\t\t\trerender();\n\t\t\t\t\t};\n\t\t\t\t\tel.onchange = (e) => {\n\t\t\t\t\t\tconst i = Number(e.target.dataset.i);\n\t\t\t\t\t\tstate.members[i].pnr = formatPnr(e.target.value);\n\t\t\t\t\t\trerender();\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\t\/\/ remove\n\t\t\t\troot.querySelectorAll(\"button[data-remove]\").forEach(btn => {\n\t\t\t\t\tbtn.onclick = () => {\n\t\t\t\t\t\tconst idx = Number(btn.dataset.remove);\n\t\t\t\t\t\tstate.members.splice(idx, 1);\n\t\t\t\t\t\trerender();\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\t\/\/ add\n\t\t\t\troot.querySelector(\"#smf-add\").onclick = () => {\n\t\t\t\t\tif (state.members.length >= MAX) {\n\t\t\t\t\t\tsetMsg(\"Maks \" + MAX + \" persona.\", true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tstate.members.push({ id: crypto.randomUUID(), name: \"\", pnr: \"\", phone: \"\", email: \"\", signature: \"\" });\n\t\t\t\t\trerender();\n\t\t\t\t};\n\n\t\t\t\t\/\/ \u2705 IMPORTANT: clear old pad objects (they reference old canvases)\n\t\t\t\tpads.clear();\n\n\t\t\t\t\/\/ create pads for canvases in DOM\n\t\t\t\troot.querySelectorAll(\"canvas[data-sig]\").forEach(canvas => {\n\t\t\t\t\tconst id = canvas.dataset.sig;\n\n\t\t\t\t\tconst pad = new SignaturePad(canvas, {\n\t\t\t\t\t\tminWidth: 1.2,\n\t\t\t\t\t\tmaxWidth: 2.2,\n\t\t\t\t\t\tpenColor: \"#1e3a8a\"\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/ initial resize for correct pixel ratio\n\t\t\t\t\tresizePadCanvas(pad);\n\n\t\t\t\t\t\/\/ \u2705 KEY FIX: save immediately when user finishes a stroke\n\t\t\t\t\tpad.onEnd = () => saveSignatureForMember(id);\n\n\t\t\t\t\tpads.set(id, pad);\n\t\t\t\t});\n\n\t\t\t\t\/\/ restore stored drawings into new pads\n\t\t\t\trestoreAllSignaturesFromState();\n\n\t\t\t\t\/\/ clear signature\n\t\t\t\troot.querySelectorAll(\"button[data-clear]\").forEach(btn => {\n\t\t\t\t\tbtn.onclick = () => {\n\t\t\t\t\t\tconst id = btn.dataset.clear;\n\t\t\t\t\t\tconst pad = pads.get(id);\n\t\t\t\t\t\tif (pad) pad.clear();\n\t\t\t\t\t\tconst m = state.members.find(x => x.id === id);\n\t\t\t\t\t\tif (m) m.signature = \"\";\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\troot.querySelector(\"#smf-submit\").onclick = submit;\n\t\t\t}\n\n\t\t\tfunction validateMembers() {\n\t\t\t\tfor (let i = 0; i < state.members.length; i++) {\n\t\t\t\t\tconst m = state.members[i];\n\n\t\t\t\t\tconst name = String(m.name || \"\").trim();\n\t\t\t\t\tconst pnr = String(m.pnr || \"\").trim();\n\t\t\t\t\tconst phone = String(m.phone || \"\").trim();\n\t\t\t\t\tconst email = cleanEmail(m.email);\n\n\t\t\t\t\tif (!name || !pnr) return { ok: false, msg: `Plot\u00ebso Emrin dhe Numrin personal p\u00ebr an\u00ebtarin ${i + 1}.` };\n\t\t\t\t\tif (!isPnrFormat(pnr)) return { ok: false, msg: `Numri personal duhet t\u00eb jet\u00eb n\u00eb formatin YYMMDD-XXXX p\u00ebr an\u00ebtarin ${i + 1}.` };\n\n\t\t\t\t\tconst age = ageFromPersonnummer(pnr);\n\t\t\t\t\tconst isAdult18 = age !== null && age >= 18;\n\n\t\t\t\t\/\/ \tif (isAdult18) {\n\t\t\t\t\/\/ \t\tif (!phone || !email) return { ok: false, msg: `Telefoni dhe Emaili jan\u00eb t\u00eb detyruesh\u00ebm p\u00ebr an\u00ebtarin ${i + 1} (18+).` };\n\t\t\t\t\/\/ \t\tif (!isEmail(email)) return { ok: false, msg: `Emaili nuk \u00ebsht\u00eb valid p\u00ebr an\u00ebtarin ${i + 1}.` };\n\t\t\t\t\/\/ \t} else {\n\t\t\t\t\t\tif (email && !isEmail(email)) return { ok: false, msg: `Emaili nuk \u00ebsht\u00eb valid p\u00ebr an\u00ebtarin ${i + 1}.` };\n\t\t\t\t\/\/ \t}\n\n\t\t\t\t\tif (isSigRequired(pnr)) {\n\t\t\t\t\t\t\/\/ rely on state (because we save onEnd)\n\t\t\t\t\t\tif (!m.signature) return { ok: false, msg: `N\u00ebnshkrimi mungon p\u00ebr an\u00ebtarin ${i + 1} (12+).` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { ok: true };\n\t\t\t}\n\n\t\t\tasync function submit() {\n\t\t\t\tsetMsg(\"Duke d\u00ebrguar...\");\n\n\t\t\t\t\/\/ final save just in case\n\t\t\t\tsaveAllSignaturesToState();\n\n\t\t\t\tconst v = validateMembers();\n\t\t\t\tif (!v.ok) { setMsg(v.msg, true); return; }\n\n\t\t\t\ttry {\n\t\t\t\t\tconst tokRes = await fetch(window.SMF_MEMBERSHIP_API.tokenUrl + \"?t=\" + Date.now(), { cache: \"no-store\" });\n\t\t\t\t\tconst tokData = await tokRes.json();\n\t\t\t\t\tconst token = tokData && tokData.token;\n\t\t\t\t\tif (!token) throw new Error(\"Nuk u mor token\");\n\n\t\t\t\t\tconst payloadMembers = state.members.map((m) => ({\n\t\t\t\t\t\tname: m.name,\n\t\t\t\t\t\tpnr: m.pnr,\n\t\t\t\t\t\tphone: m.phone,\n\t\t\t\t\t\temail: m.email,\n\t\t\t\t\t\tsignature: m.signature || \"\"\n\t\t\t\t\t}));\n\n\t\t\t\t\tconst res = await fetch(window.SMF_MEMBERSHIP_API.submitUrl, {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: { \"Content-Type\": \"application\/json\" },\n\t\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\taddress: state.address,\n\t\t\t\t\t\t\tpostcode: state.postcode,\n\t\t\t\t\t\t\tcity: state.city,\n\t\t\t\t\t\t\tcontactPhone: state.contactPhone,\n\t\t\t\t\t\t\tmembers: payloadMembers,\n\t\t\t\t\t\t\tadultsCount: getAdultsCount()\n\t\t\t\t\t\t})\n\t\t\t\t\t});\n\n\t\t\t\t\tconst out = await res.json().catch(() => ({}));\n\t\t\t\t\tif (!res.ok) throw new Error(out?.message || \"Request failed\");\n\n\t\t\t\t\tsetMsg(\"U d\u00ebrgua \u2705 Aplikimi u d\u00ebrgua me sukses.\");\n\t\t\t\t\tstate.address = \"\"; state.postcode = \"\"; state.city = \"\"; state.contactPhone = \"\";\n\t\t\t\t\tstate.members = [{ id: crypto.randomUUID(), name: \"\", pnr: \"\", phone: \"\", email: \"\", signature: \"\" }];\n\t\t\t\t\tpads.clear();\n\t\t\t\t\trender();\n\n\t\t\t\t} catch (e) {\n\t\t\t\t\tsetMsg(\"Gabim: \" + (e.message || e), true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trender();\n\t\t})();\n\t<\/script>\n\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-1749","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/pages\/1749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/comments?post=1749"}],"version-history":[{"count":22,"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/pages\/1749\/revisions"}],"predecessor-version":[{"id":1899,"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/pages\/1749\/revisions\/1899"}],"wp:attachment":[{"href":"https:\/\/xhamiarrugaeudhezimit.se\/sv\/wp-json\/wp\/v2\/media?parent=1749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}