{"id":3935,"date":"2025-08-10T11:00:57","date_gmt":"2025-08-10T11:00:57","guid":{"rendered":"https:\/\/elwan.eg\/my-account\/"},"modified":"2025-10-07T12:37:49","modified_gmt":"2025-10-07T12:37:49","slug":"my-account","status":"publish","type":"page","link":"https:\/\/elwan.eg\/en\/my-account\/","title":{"rendered":"My Account"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3935\" class=\"elementor elementor-3935 elementor-3660\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-27d25cf e-con-full wd-section-stretch e-flex e-con e-parent\" data-id=\"27d25cf\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-52a4cf9 e-flex e-con-boxed e-con e-child\" data-id=\"52a4cf9\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f4c4853 elementor-widget elementor-widget-shortcode\" data-id=\"f4c4853\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"woocommerce\"><\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ead7e23 elementor-widget elementor-widget-shortcode\" data-id=\"ead7e23\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>(function () {\r\n  \/\/ Normalize lang => \"en\", \"ar\".\r\n  const htmlLang = (document.documentElement.getAttribute('lang') || 'en')\r\n    .toLowerCase()\r\n    .replace('_', '-');\r\n  const baseLang = htmlLang.split('-')[0];\r\n\r\n  const MESSAGES = {\r\n    en: {\r\n      invalid_email: 'Please enter a valid email address (e.g. name@example.com).',\r\n      invalid_password: 'Password must be at least 8 characters long and include uppercase, lowercase, number, and special character.',\r\n      invalid_fname: 'First name must be letters only (Arabic\/English), may include spaces or hyphens, and cannot be empty.',\r\n      invalid_lname: 'Last name must be letters only (Arabic\/English), may include spaces or hyphens, and cannot be empty.'\r\n    },\r\n    ar: {\r\n      invalid_email: '\u0645\u0646 \u0641\u0636\u0644\u0643 \u0623\u062f\u062e\u0644 \u0628\u0631\u064a\u062f\u064b\u0627 \u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a\u064b\u0627 \u0635\u0627\u0644\u062d\u064b\u0627 (\u0645\u062b\u0627\u0644: name@example.com).',\r\n      invalid_password: '\u064a\u062c\u0628 \u0623\u0646 \u062a\u062a\u0643\u0648\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u0645\u0646 8 \u0623\u062d\u0631\u0641 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644 \u0648\u062a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u062d\u0631\u0641 \u0643\u0628\u064a\u0631 \u0648\u062d\u0631\u0641 \u0635\u063a\u064a\u0631 \u0648\u0631\u0642\u0645 \u0648\u0631\u0645\u0632 \u062e\u0627\u0635.',\r\n      invalid_fname: '\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0623\u0648\u0644 \u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0628\u062d\u0631\u0648\u0641 \u0641\u0642\u0637 (\u0639\u0631\u0628\u064a\/\u0625\u0646\u062c\u0644\u064a\u0632\u064a)\u060c \u0648\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0645\u0633\u0627\u0641\u0627\u062a \u0623\u0648 \u0634\u0631\u0637\u0627\u062a\u060c \u0648\u0644\u0627 \u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0641\u0627\u0631\u063a\u064b\u0627.',\r\n      invalid_lname: '\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0623\u062e\u064a\u0631 \u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0628\u062d\u0631\u0648\u0641 \u0641\u0642\u0637 (\u0639\u0631\u0628\u064a\/\u0625\u0646\u062c\u0644\u064a\u0632\u064a)\u060c \u0648\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0645\u0633\u0627\u0641\u0627\u062a \u0623\u0648 \u0634\u0631\u0637\u0627\u062a\u060c \u0648\u0644\u0627 \u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0641\u0627\u0631\u063a\u064b\u0627.'\r\n    }\r\n  };\r\n\r\n  function t(key) {\r\n    return (MESSAGES[htmlLang] && MESSAGES[htmlLang][key]) ||\r\n           (MESSAGES[baseLang] && MESSAGES[baseLang][key]) ||\r\n           (MESSAGES.en && MESSAGES.en[key]) || key;\r\n  }\r\n\r\n  const regWrapper = document.querySelector('.xoo-el-form-register');\r\n  const form       = regWrapper ? regWrapper.closest('form') || regWrapper.querySelector('form') || regWrapper : null;\r\n  const regBtn     = regWrapper ? regWrapper.querySelector('.xoo-el-register-btn') : null;\r\n\r\n  const fnameField = regWrapper ? regWrapper.querySelector('input[name=\"xoo_el_reg_fname\"]') : null;\r\n  const lnameField = regWrapper ? regWrapper.querySelector('input[name=\"xoo_el_reg_lname\"]') : null;\r\n  const emailField = regWrapper ? regWrapper.querySelector('input[name=\"xoo_el_reg_email\"]') : null;\r\n\r\n  \/\/ IMPORTANT: this selects ONLY the first password field (main password), not \"confirm\"\r\n  const passField  = regWrapper ? regWrapper.querySelector('input[name=\"xoo_el_reg_pass\"]') : null;\r\n\r\n  \/\/ Regexes\r\n  const emailRegex    = \/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\/;\r\n  const passwordRegex = \/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z0-9]).{8,}$\/;\r\n\r\n  \/\/ Name rules:\r\n  \/\/ - Unicode letters (Arabic\/Latin etc.) + optional spaces, hyphens, apostrophes\r\n  \/\/ - No leading\/trailing spaces, no double spaces\r\n  \/\/ - 2\u201350 visible characters\r\n  \/\/ - At least 2 LETTERS total (ignoring spaces\/punctuation)\r\n  const nameSurfaceRegex = \/^(?!\\s)(?!.*\\s$)(?!.*\\s{2,})[\\p{L}\\p{M}'\u2019-]{1}[\\p{L}\\p{M}'\u2019\\- ]{0,49}$\/u;\r\n  function hasAtLeastTwoLetters(str) {\r\n    const letters = (str.match(\/[\\p{L}\\p{M}]\/gu) || []).length;\r\n    return letters >= 2;\r\n  }\r\n  function validName(val) {\r\n    const v = val.trim();\r\n    return (\r\n      v.length > 0 &&\r\n      nameSurfaceRegex.test(v) &&\r\n      hasAtLeastTwoLetters(v)\r\n    );\r\n  }\r\n\r\n  \/\/ Small helper to toggle field error class\r\n  function markInvalid(el, isInvalid) {\r\n    if (!el) return;\r\n    el.classList.toggle('elwan-invalid', !!isInvalid);\r\n  }\r\n\r\n  if (form && regWrapper && emailField && passField && fnameField && lnameField) {\r\n    form.addEventListener('submit', function (e) {\r\n      const emailVal = emailField.value.trim();\r\n      const passVal  = passField.value.trim();\r\n      const fnameVal = fnameField.value;\r\n      const lnameVal = lnameField.value;\r\n\r\n      const errors = [];\r\n\r\n      const name1Ok = validName(fnameVal);\r\n      const name2Ok = validName(lnameVal);\r\n      const emailOk = emailRegex.test(emailVal);\r\n      const passOk  = passwordRegex.test(passVal);\r\n\r\n      if (!name1Ok) errors.push(t('invalid_fname'));\r\n      if (!name2Ok) errors.push(t('invalid_lname'));\r\n      if (!emailOk) errors.push(t('invalid_email'));\r\n      if (!passOk)  errors.push(t('invalid_password'));\r\n\r\n      \/\/ Visual cues\r\n      markInvalid(fnameField, !name1Ok);\r\n      markInvalid(lnameField, !name2Ok);\r\n      markInvalid(emailField, !emailOk);\r\n      markInvalid(passField,  !passOk);\r\n\r\n      if (errors.length > 0) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n\r\n        if (regBtn) regBtn.disabled = true;\r\n\r\n        const oldErr = regWrapper.querySelector('.elwan-error');\r\n        if (oldErr) oldErr.remove();\r\n\r\n        const errorBox = document.createElement('div');\r\n        errorBox.className = 'elwan-error';\r\n        errorBox.setAttribute('role', 'alert');\r\n        errorBox.style.color = 'red';\r\n        errorBox.style.marginTop = '8px';\r\n        errorBox.innerHTML = errors.join('<br>');\r\n        regWrapper.appendChild(errorBox);\r\n      }\r\n    });\r\n\r\n    function validateLive() {\r\n      const ok =\r\n        validName(fnameField.value) &&\r\n        validName(lnameField.value) &&\r\n        emailRegex.test(emailField.value.trim()) &&\r\n        passwordRegex.test(passField.value.trim());\r\n\r\n      if (ok) {\r\n        if (regBtn) regBtn.disabled = false;\r\n        const err = regWrapper.querySelector('.elwan-error');\r\n        if (err) err.remove();\r\n      }\r\n    }\r\n\r\n    \/\/ Live validation bindings\r\n    [fnameField, lnameField, emailField, passField].forEach(el => {\r\n      el.addEventListener('input', () => {\r\n        \/\/ Re-mark each field individually\r\n        if (el === fnameField) markInvalid(el, !validName(el.value));\r\n        else if (el === lnameField) markInvalid(el, !validName(el.value));\r\n        else if (el === emailField) markInvalid(el, !emailRegex.test(el.value.trim()));\r\n        else if (el === passField) markInvalid(el, !passwordRegex.test(el.value.trim()));\r\n        validateLive();\r\n      });\r\n      el.addEventListener('blur', () => {\r\n        \/\/ Trim on blur to avoid leading\/trailing spaces\r\n        if (el === fnameField || el === lnameField) {\r\n          el.value = el.value.trim().replace(\/\\s{2,}\/g, ' ');\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  \/\/ Optional: override native tooltip messages too (for required fields)\r\n  document.querySelectorAll('form input[required], form select[required], form textarea[required]').forEach(el => {\r\n    el.addEventListener('invalid', () => {\r\n      el.setCustomValidity(t('invalid_' + (el.name || el.type)) || t('invalid_required') || '');\r\n    });\r\n    el.addEventListener('input', () => el.setCustomValidity(''));\r\n  });\r\n\r\n  \/\/ Optional CSS for visual feedback (you can move this to your stylesheet)\r\n  const style = document.createElement('style');\r\n  style.textContent = `\r\n    .elwan-invalid { outline: 2px solid #e3342f !important; }\r\n    .elwan-error { font-size: 0.925rem; line-height: 1.4; }\r\n  `;\r\n  document.head.appendChild(style);\r\n})();<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4a3ec5a elementor-widget elementor-widget-html\" data-id=\"4a3ec5a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"login-with-google\">\n    <p>or sign in with<\/p>\n    <a rel=\"nofollow\" href=\"https:\/\/elwan.eg\/wp-json\/wslu-social-login\/type\/google\"> <img decoding=\"async\" src=\"https:\/\/elwan.eg\/wp-content\/uploads\/2025\/09\/google-icon.svg\" alt=\"Google\" \/><\/a>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7be1d68 elementor-widget elementor-widget-html\" data-id=\"7be1d68\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"register-with-google\">\n    <p>or sign up with<\/p>    <a rel=\"nofollow\" href=\"https:\/\/elwan.eg\/wp-json\/wslu-social-login\/type\/google\"> <img decoding=\"async\" src=\"https:\/\/elwan.eg\/wp-content\/uploads\/2025\/09\/google-icon.svg\" alt=\"Google\" \/><\/a>\n<\/div>\t\t\t\t<\/div>\n\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<div class=\"wd-negative-gap elementor-element elementor-element-a6aa1df e-flex e-con-boxed e-con e-parent\" data-id=\"a6aa1df\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9dedcb1 elementor-widget elementor-widget-shortcode\" data-id=\"9dedcb1\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>var accountNavItems = document.querySelectorAll('.elementor-icon-list-item');\r\n\r\naccountNavItems.forEach((item) => {\r\n    const link = item.querySelector('a');\r\n    if (link && link.getAttribute('href') === window.location.pathname) {\r\n        item.classList.add('active');\r\n    }\r\n});\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ddde81 elementor-widget elementor-widget-shortcode\" data-id=\"0ddde81\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>var loginContainer = document.querySelector('.xoo-el-form-container div[data-section=\"login\"]');\r\nvar registerContainer = document.querySelector('.xoo-el-form-container div[data-section=\"register\"]');\r\nvar loginWGoogle = document.querySelector('.login-with-google');\r\nvar registerWGoogle = document.querySelector('.register-with-google');\r\nloginContainer.append(loginWGoogle);\r\nregisterContainer.append(registerWGoogle);<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d3d2795 elementor-widget elementor-widget-shortcode\" data-id=\"d3d2795\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>document.addEventListener('DOMContentLoaded', () => {\r\n  const lang = document.documentElement.lang || 'en'; \/\/ WPML sets this\r\n  const msgs = {\r\n    ar: { required: '\u0645\u0646 \u0641\u0636\u0644\u0643 \u0627\u0645\u0644\u0623 \u0647\u0630\u0647 \u0627\u0644\u062e\u0627\u0646\u0629.' },\r\n    en: { required: 'Please fill out this field.' }\r\n  };\r\n\r\n  document.querySelectorAll('form input[required], form select[required], form textarea[required]').forEach(el => {\r\n    el.addEventListener('invalid', () => {\r\n      el.setCustomValidity((msgs[lang] && msgs[lang].required) || '');\r\n    });\r\n    el.addEventListener('input', () => el.setCustomValidity(''));\r\n  });\r\n});\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\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\n    <div class=\"xs_social_share_widget xs_share_url after_content \t\tmain_content  wslu-style-1 wslu-share-box-shaped wslu-fill-colored wslu-none wslu-share-horizontal wslu-theme-font-no wslu-main_content\">\n\n\t\t\n        <ul>\n\t\t\t        <\/ul>\n    <\/div> \n","protected":false},"excerpt":{"rendered":"<p>Orders Wallet Points Wishlist My Account Profile Addresses Payments Logout or sign in with or sign up with<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-3935","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/pages\/3935","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/comments?post=3935"}],"version-history":[{"count":0,"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/pages\/3935\/revisions"}],"wp:attachment":[{"href":"https:\/\/elwan.eg\/en\/wp-json\/wp\/v2\/media?parent=3935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}