{"id":2322,"date":"2026-07-04T01:48:50","date_gmt":"2026-07-04T01:48:50","guid":{"rendered":"https:\/\/muslimcongress.org\/new\/?page_id=2322"},"modified":"2026-09-12T02:53:24","modified_gmt":"2026-09-12T02:53:24","slug":"mc-2026-registration","status":"publish","type":"page","link":"https:\/\/muslimcongress.org\/new\/mc-2026-registration\/","title":{"rendered":"2026 Conference Registration"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2322\" class=\"elementor elementor-2322\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ea6641a e-flex e-con-boxed e-con e-parent\" data-id=\"ea6641a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-11e4862 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"11e4862\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/muslimcongress.org\/new\/muslim-congress-2026\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-left\" viewBox=\"0 0 320 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Conference Details<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\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-7a7be82 elementor-widget elementor-widget-heading\" data-id=\"7a7be82\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Complete the steps below to reserve your place. <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-259be88 elementor-widget elementor-widget-heading\" data-id=\"259be88\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/events.heavenlymatch.org\/nov2026\/register\" target=\"_blank\">Note: If you or anyone in your family wants to register for Heavenly Match, <u>click here<\/u>.<\/a><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-03395e8 elementor-icon-list--layout-inline elementor-align-center elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"03395e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-calendar-alt\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Nov. 6-8, 2026<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-map-pin\" viewBox=\"0 0 288 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M112 316.94v156.69l22.02 33.02c4.75 7.12 15.22 7.12 19.97 0L176 473.63V316.94c-10.39 1.92-21.06 3.06-32 3.06s-21.61-1.14-32-3.06zM144 0C64.47 0 0 64.47 0 144s64.47 144 144 144 144-64.47 144-144S223.53 0 144 0zm0 76c-37.5 0-68 30.5-68 68 0 6.62-5.38 12-12 12s-12-5.38-12-12c0-50.73 41.28-92 92-92 6.62 0 12 5.38 12 12s-5.38 12-12 12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Dearborn, Michigan<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-bell\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Registration closes Oct. 15<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/urldefense.proofpoint.com\/v2\/url?u=https-3A__app.marriott.com_reslink-3Fid-3D1777574279729-26key-3DGRP-26app-3Dresvlink&#038;d=DwMFaQ&#038;c=euGZstcaTDllvimEN8b7jXrwqOf-v5A_CdpgnVfiiMM&#038;r=yKTixzPcaoLuINshgY31m5HpK9MsUEzVHlPTOD_9-L9A2WsJQwP38RgBiMJTb48p&#038;m=38bbpF37IjTKnSqwhuiJjwJ9dfI8TMqItm-p--LUVQ3V620g62w6XPHa2z5CuRmo&#038;s=q8Ii1O0gBfJ1aVjq6IQbNlcMHfQpg9XgygSLXQHXzWE&#038;e=\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Book Hotel Room<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\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<div class=\"elementor-element elementor-element-be6d06a e-flex e-con-boxed e-con e-parent\" data-id=\"be6d06a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-df1a1ff e-con e-atomic-element e-flexbox-base e-df1a1ff-0019a8e \" data-id=\"df1a1ff\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"df1a1ff\" data-e-type=\"e-flexbox\" data-id=\"df1a1ff\">\n    \t\t<div class=\"elementor-element elementor-element-556ec43 elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"556ec43\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>Muslim Congress Annual Conference \u2014 Registration<\/title>\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/@tabler\/icons-webfont@2\/tabler-icons.min.css\">\r\n<style>\r\n  \/* Design tokens \u2014 override any of these from Elementor's Custom CSS panel\r\n     or your theme's Additional CSS to match your brand. *\/\r\n  .mc-registration {\r\n    --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\r\n    --color-background-primary: white;\r\n    --color-background-secondary: none;\r\n    --color-text-primary: #1a1a1a;\r\n    --color-text-secondary: #6b6b6b;\r\n    --color-border-primary: #d9d9d6;\r\n    --color-border-secondary: #d9d9d6;\r\n    --color-border-tertiary: #e5e5e2;\r\n    --border-radius-md: 4px;\r\n    --border-radius-lg: 12px;\r\n  }\r\n  :root { --teal: #1C58A6; --teal-light: #F6F8FC; --teal-border: #1C58A6; --amber: #BA7517; --amber-light: #FAEEDA; --coral: #D85A30; --coral-light: #FAECE7; }\r\n  * { box-sizing: border-box; margin: 0; padding: 0; }\r\n  body { font-family: var(--font-sans, sans-serif); background: none; }\r\n  .mc-registration { background: none; }\r\n  .shell { padding: 0px; max-width: 100%; margin: 0 auto; }\r\n  .step-nav { display: flex; align-items: center; gap: 0; margin-bottom: 2rem; overflow-x: auto; padding-bottom: 4px; }\r\n  .step-item { display: flex; align-items: center; flex-shrink: 0; }\r\n  .step-bubble { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 500; border: 1.5px solid var(--color-border-tertiary); background: var(--color-background-primary); color: var(--color-text-secondary); cursor: pointer; transition: all 0.15s; }\r\n  .step-bubble.active { background: #1C58A6; border-color: #1C58A6; color: #fff; }\r\n  .step-bubble.done { background: var(--teal-light); border-color: #1C58A6; color: #1C58A6; }\r\n  .step-label { font-size: 11px; color: var(--color-text-secondary); margin-top: 4px; text-align: center; max-width: 70px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\r\n  .step-label.active { color: #1C58A6; font-weight: 500; }\r\n  .step-col { display: flex; flex-direction: column; align-items: center; gap: 0; }\r\n  .step-connector { height: 1.5px; width: 28px; background: var(--color-border-tertiary); flex-shrink: 0; margin-bottom: 18px; }\r\n  .step-connector.done { background: #1C58A6; }\r\n  .panel { background: var(--color-background-primary); border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-lg); padding: 1.5rem; margin-bottom: 1.5rem; }\r\n  .panel-title { font-size: 16px; font-weight: 500; color: var(--color-text-primary); margin-bottom: 4px; display: flex; align-items: center; gap: 0px; }\r\n  .panel-sub { font-size: 13px; color: var(--color-text-secondary); margin-bottom: 1.25rem; }\r\n  .field-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\r\n  .field-grid.single { grid-template-columns: 1fr; }\r\n  .field-grid.triple { grid-template-columns: 1fr 1fr 1fr; }\r\n  .field { display: flex; flex-direction: column; gap: 8px; }\r\n  .field.span2 { grid-column: span 2; }\r\n  label { font-size: 12px; color: var(--color-text-secondary); font-weight: 500; letter-spacing: 0.02em; display: flex; align-items: center; gap: 4px; }\r\n  .req { color: #D85A30; font-size: 12px; }\r\n  input, select, textarea { border-radius: var(--border-radius-md); border: 0.5px solid var(--color-border-secondary); background: var(--color-background-secondary); color: var(--color-text-primary); padding: 10px 10px; font-size: 13px; width: 100%; font-family: inherit; }\r\n  input:focus, select:focus, textarea:focus { outline: 2px solid #1C58A6; outline-offset: 1px; border-color: #1C58A6; }\r\n  input.invalid, select.invalid { border-color: #D85A30; background: #FAECE7; }\r\n  .field-error { font-size: 11px; color: #993C1D; display: none; }\r\n  .field-error.show { display: block; }\r\n  .badge { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; padding: 3px 8px; border-radius: var(--border-radius-md); font-weight: 500; }\r\n  .badge-required { background: #FAECE7; color: #993C1D; }\r\n  .badge-optional { background: var(--color-background-secondary); color: var(--color-text-secondary); }\r\n  .note { font-size: 12px; color: var(--color-text-secondary); background: var(--color-background-secondary); border-left: 2px solid #1C58A6; padding: 8px 10px; border-radius: 0 var(--border-radius-md) var(--border-radius-md) 0; margin-top: 8px; }\r\n  .member-card { border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-md); padding: 1rem; margin-bottom: 10px; background: var(--color-background-secondary); }\r\n  .member-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }\r\n  .member-title { font-size: 13px; font-weight: 500; color: var(--color-text-primary); display: flex; align-items: center; gap: 6px; }\r\n  .remove-member { background: none; border: none; color: var(--color-text-secondary); cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 4px; width: auto; }\r\n  .remove-member:hover { color: #D85A30; }\r\n  .add-btn { display: flex; align-items: center; gap: 6px; border: 1px dashed var(--color-border-secondary); border-radius: var(--border-radius-md); padding: 8px 14px; font-size: 13px; color: #1C58A6; background: transparent; cursor: pointer; width: 100%; justify-content: center; margin-top: 4px; }\r\n  .add-btn:hover { background: var(--color-background-secondary); }\r\n  .ticket-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 0.5px solid var(--color-border-tertiary); gap: 12px; }\r\n  .ticket-row:last-child { border-bottom: none; }\r\n  .ticket-label { font-size: 13px; color: var(--color-text-primary); }\r\n  .ticket-sub { font-size: 11px; color: var(--color-text-secondary); margin-top: 2px; }\r\n  .ticket-price { font-size: 14px; font-weight: 500; color: var(--color-text-primary); white-space: nowrap; }\r\n  .ticket-price.free { color: #0F6E56; }\r\n  .total-row { display: flex; justify-content: space-between; padding-top: 12px; font-size: 15px; font-weight: 500; color: var(--color-text-primary); }\r\n  .empty-summary { font-size: 13px; color: var(--color-text-secondary); padding: 8px 0; }\r\n  .discount-strip { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }\r\n  .discount-msg { font-size: 12px; margin-top: 8px; display: none; }\r\n  .discount-msg.ok { color: #0F6E56; display: block; }\r\n  .discount-msg.err { color: #993C1D; display: block; }\r\n  .nav-row { display: flex; justify-content: space-between; align-items: center; margin-top: 1rem; gap: 10px; }\r\n  .btn-back { background: transparent; border: 0.5px solid var(--color-border-secondary); color: var(--color-text-secondary); padding: 9px 20px; border-radius: var(--border-radius-md); font-size: 13px; cursor: pointer; display: flex; align-items: center; gap: 6px; }\r\n  .btn-next { background: #1C58A6; border: none; color: #fff; padding: 9px 24px; border-radius: var(--border-radius-md); font-size: 13px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 6px; }\r\n  .btn-next:hover { background: #164685; }\r\n  .divider { height: 0.5px; background: var(--color-border-tertiary); margin: 1rem 0; }\r\n  .tag { display: inline-block; font-size: 11px; padding: 2px 7px; border-radius: 100px; font-weight: 500; }\r\n  .tag-age { background: #FAEEDA; color: #633806; }\r\n  .confirmation-icon { width: 56px; height: 56px; border-radius: 50%; background: #F6F8FC; display: flex; align-items: center; justify-content: center; margin: 0 auto 12px; }\r\n  .step-section { display: none; }\r\n  .step-section.visible { display: block; }\r\n  select option { background: var(--color-background-primary); }\r\n  .waiver-box { border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-md); padding: 10px 12px; font-size: 12px; color: var(--color-text-secondary); max-height: 80px; overflow-y: auto; line-height: 1.6; background: var(--color-background-secondary); }\r\n  .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; }\r\n\r\n  \/* Read-only fields (e.g. the auto-calculated child\/youth counts). *\/\r\n  input[readonly] { background: #eeeeec; color: var(--color-text-secondary); cursor: not-allowed; }\r\n\r\n  \/* Full-screen dim + block while we confirm the payment on return from Stripe. *\/\r\n  @keyframes mcspin { to { transform: rotate(360deg); } }\r\n  #mcLoadingOverlay { position: fixed; inset: 0; background: rgba(0,0,0,0.8); z-index: 99999; display: none; align-items: center; justify-content: center; flex-direction: column; gap: 16px; }\r\n  #mcLoadingOverlay.show { display: flex; }\r\n  #mcLoadingOverlay .spinner { width: 40px; height: 40px; border: 3px solid rgba(255,255,255,0.25); border-top-color: #fff; border-radius: 50%; animation: mcspin 0.8s linear infinite; }\r\n  #mcLoadingOverlay .overlay-msg { color: #fff; font-size: 14px; font-family: var(--font-sans, sans-serif); }\r\n\r\n  \/* Error banner shown at the top of a step when validation fails. *\/\r\n  .banner { display: none; border-radius: var(--border-radius-md); padding: 10px 12px; font-size: 13px; margin-bottom: 1rem; line-height: 1.5; }\r\n  .banner.show { display: block; }\r\n  .banner-error { background: #FAECE7; color: #993C1D; border-left: 2px solid #D85A30; }\r\n  .banner-warn { background: #FAEEDA; color: #633806; border-left: 2px solid #BA7517; }\r\n  .banner ul { margin: 4px 0 0 18px; }\r\n\r\n  \/* Filter-style chips for the Quran competition categories. *\/\r\n  .chip-row { display: flex; flex-wrap: wrap; gap: 8px; }\r\n  .chip { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 400; letter-spacing: normal; color: var(--color-text-primary); border: 0.5px solid var(--color-border-tertiary); background: var(--color-background-primary); border-radius: 100px; padding: 6px 12px; cursor: pointer; }\r\n  .chip input { width: 14px; height: 14px; accent-color: #1C58A6; flex-shrink: 0; }\r\n  .chip:has(input:checked) { border-color: #1C58A6; background: #E1F5EE; color: #0F6E56; font-weight: 500; }\r\n\r\n  \/* ---------- Elementor hover override fixes ---------- *\/\r\n  .mc-registration button.add-btn,\r\n  .mc-registration button.remove-member {\r\n    box-shadow: none !important;\r\n    text-decoration: none !important;\r\n    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease !important;\r\n  }\r\n  .mc-registration button.add-btn,\r\n  .mc-registration button.add-btn:visited {\r\n    color: #1C58A6 !important;\r\n    background: transparent !important;\r\n    border: 1px dashed var(--color-border-secondary) !important;\r\n  }\r\n  .mc-registration button.add-btn:hover,\r\n  .mc-registration button.add-btn:focus,\r\n  .mc-registration button.add-btn:active {\r\n    color: #1C58A6 !important;\r\n    background: var(--color-background-secondary) !important;\r\n    border-color: #1C58A6 !important;\r\n    outline-color: #1C58A6 !important;\r\n  }\r\n  .mc-registration button.remove-member,\r\n  .mc-registration button.remove-member:visited {\r\n    color: var(--color-text-secondary) !important;\r\n    background: transparent !important;\r\n    border: 0 !important;\r\n  }\r\n  .mc-registration button.remove-member:hover,\r\n  .mc-registration button.remove-member:focus,\r\n  .mc-registration button.remove-member:active {\r\n    color: #D85A30 !important;\r\n    background: transparent !important;\r\n    border: 0 !important;\r\n    outline-color: #D85A30 !important;\r\n  }\r\n\r\n  \/* ---------- Responsive ---------- *\/\r\n  @media (max-width: 640px) {\r\n    .shell { padding: 0px; }\r\n    .field-grid, .field-grid.triple { grid-template-columns: 1fr; }\r\n    .field.span2 { grid-column: span 1; }\r\n    .panel { padding: 1.25rem 1rem; }\r\n    .step-label { font-size: 10px; max-width: 54px; }\r\n    .btn-next, .btn-back { padding: 8px 16px; }\r\n    .nav-row { flex-wrap: wrap; }\r\n  }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"mc-registration\">\r\n<div class=\"shell\">\r\n  <h2 class=\"sr-only\">Muslim Congress conference registration<\/h2>\r\n\r\n  <div class=\"step-nav\" id=\"stepNav\">\r\n    <div class=\"step-col\"><div class=\"step-bubble active\" id=\"b0\" onclick=\"goTo(0)\">1<\/div><div class=\"step-label active\" id=\"l0\">Personal<\/div><\/div>\r\n    <div class=\"step-connector\" id=\"c0\"><\/div>\r\n    <div class=\"step-col\"><div class=\"step-bubble\" id=\"b1\" onclick=\"goTo(1)\">2<\/div><div class=\"step-label\" id=\"l1\">Attendees<\/div><\/div>\r\n    <div class=\"step-connector\" id=\"c1\"><\/div>\r\n    <div class=\"step-col\"><div class=\"step-bubble\" id=\"b2\" onclick=\"goTo(2)\">3<\/div><div class=\"step-label\" id=\"l2\">Logistics<\/div><\/div>\r\n    <div class=\"step-connector\" id=\"c2\"><\/div>\r\n    <div class=\"step-col\"><div class=\"step-bubble\" id=\"b3\" onclick=\"goTo(3)\">4<\/div><div class=\"step-label\" id=\"l3\">Payment<\/div><\/div>\r\n    <div class=\"step-connector\" id=\"c3\"><\/div>\r\n    <div class=\"step-col\"><div class=\"step-bubble\" id=\"b4\" onclick=\"goTo(4)\">5<\/div><div class=\"step-label\" id=\"l4\">Review<\/div><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"step-section visible\" id=\"step0\">\r\n    <div class=\"banner banner-error\" id=\"err0\"><\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Primary registrant<\/div>\r\n      <div class=\"panel-sub\">The person completing this registration. All confirmation details will be sent here.<\/div>\r\n      <div class=\"field-grid\">\r\n        <div class=\"field\"><label>First name <span class=\"req\">*<\/span><\/label><input id=\"p-first\" name=\"primary_first\" type=\"text\" placeholder=\"First name\"><\/div>\r\n        <div class=\"field\"><label>Last name <span class=\"req\">*<\/span><\/label><input id=\"p-last\" name=\"primary_last\" type=\"text\" placeholder=\"Last name\"><\/div>\r\n        <div class=\"field\"><label>Email address <span class=\"req\">*<\/span><\/label><input id=\"p-email\" name=\"primary_email\" type=\"email\" placeholder=\"Email address\"><\/div>\r\n        <div class=\"field\"><label>Confirm email <span class=\"req\">*<\/span><\/label><input id=\"p-email2\" name=\"primary_email_confirm\" type=\"email\" placeholder=\"Confirm email\"><\/div>\r\n        <div class=\"field\"><label>Phone number <span class=\"req\">*<\/span><\/label><input id=\"p-phone\" name=\"primary_phone\" type=\"tel\" inputmode=\"numeric\" autocomplete=\"tel\" maxlength=\"14\" placeholder=\"(123) 456-7890\"><\/div>\r\n        <div class=\"field\"><label>Country \/ region <span class=\"req\">*<\/span><\/label>\r\n          <select id=\"p-country\" name=\"country\" onchange=\"onCountryChange()\"><\/select><\/div>\r\n        <div class=\"field\"><label id=\"stateLabel\">State \/ province<\/label>\r\n          <div id=\"stateWrap\"><\/div><\/div>\r\n        <div class=\"field\"><label>City<\/label><input id=\"p-city\" name=\"city\" type=\"text\"><\/div>\r\n        <div class=\"field\"><label>Age <span class=\"req\">*<\/span> <span class=\"tag tag-age\">sets ticket price<\/span><\/label><input id=\"p-age\" name=\"primary_age\" type=\"number\" min=\"0\" max=\"120\" step=\"1\" placeholder=\"e.g. 34\"><\/div>\r\n        <div class=\"field\"><label>Gender <span class=\"req\">*<\/span><\/label>\r\n          <select id=\"p-gender\" name=\"primary_gender\"><option value=\"\">Select<\/option><option>Male<\/option><option>Female<\/option><\/select><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Registration type<\/div>\r\n      <div class=\"panel-sub\">Select your primary registration category. Your ticket price is set automatically from your age.<\/div>\r\n      <div class=\"field-grid single\">\r\n        <div class=\"field\"><label>Registration type <span class=\"req\">*<\/span><\/label>\r\n          <select id=\"reg-type\" name=\"reg_type\"><option selected>General attendee<\/option><option>Scholar \/ Speaker (invite code required)<\/option><option>Media \/ Press (credentials required)<\/option><\/select><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Community &amp; identity<\/div>\r\n      <div class=\"panel-sub\">Helps us understand our attendees and tailor programming.<\/div>\r\n      <div class=\"field-grid\">\r\n        <div class=\"field span2\"><label>Affiliated organization <span class=\"badge badge-optional\">optional<\/span><\/label><input id=\"organization\" name=\"organization\" type=\"text\" placeholder=\"e.g. Zainabia, IEC, Seattle, etc\"><\/div>\r\n        <div class=\"field span2\"><label>How did you hear about this conference?<\/label>\r\n          <select id=\"referral\" name=\"referral\"><option value=\"\">Select<\/option><option>Social media<\/option><option>Masjid announcement<\/option><option>Friend \/ family<\/option><option>Email newsletter<\/option><option>Muslim Congress website<\/option><option>Other<\/option><\/select><\/div>\r\n        <div class=\"field span2\"><label>Is this your first Muslim Congress conference?<\/label>\r\n          <select id=\"first-time\" name=\"first_time\"><option value=\"\">Select<\/option><option>Yes, first time<\/option><option>No, I've attended before<\/option><\/select><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nav-row\">\r\n      <div><\/div>\r\n      <button class=\"btn-next\" onclick=\"goTo(1)\">Add attendees <i class=\"ti ti-arrow-right\" aria-hidden=\"true\"><\/i><\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"step-section\" id=\"step1\">\r\n    <div class=\"banner banner-error\" id=\"err1\"><\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Additional attendees<\/div>\r\n      <div class=\"panel-sub\">Add a spouse, children, or anyone else registering with you. Each person needs their own record for name badges \u2014 and their age determines their ticket price.<\/div>\r\n\r\n      <div id=\"membersContainer\"><\/div>\r\n\r\n      <button type=\"button\" class=\"add-btn\" onclick=\"addMember()\"><i class=\"ti ti-plus\" aria-hidden=\"true\"><\/i>Add another attendee<\/button>\r\n      <div class=\"note\" style=\"margin-top:12px;\"><i class=\"ti ti-info-circle\" aria-hidden=\"true\"><\/i>Include children here too. Ages 6\u201364 are $150, 65+ are $110, and 5 &amp; under are free \u2014 prices are calculated from each person's age in the Payment step.<\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Youth &amp; children programming<\/div>\r\n      <div class=\"panel-sub\">The counts below are calculated automatically from the ages you enter above. Let us know your childcare preference so we can plan appropriately. (Pricing still comes from each attendee's age.)<\/div>\r\n      <div class=\"field-grid\">\r\n        <div class=\"field\"><label>Number of children (5 &amp; under) <span class=\"badge badge-optional\">auto<\/span><\/label><input id=\"num-children\" name=\"num_children\" type=\"number\" min=\"0\" value=\"0\" readonly tabindex=\"-1\"><\/div>\r\n        <div class=\"field\"><label>Number of youth (6\u201317) <span class=\"badge badge-optional\">auto<\/span><\/label><input id=\"num-youth\" name=\"num_youth\" type=\"number\" min=\"0\" value=\"0\" readonly tabindex=\"-1\"><\/div>\r\n        <div class=\"field span2\"><label>Are you interested in youth programming \/ childcare?<\/label>\r\n          <select id=\"childcare\" name=\"childcare\"><option value=\"\">Select<\/option><option>Yes \u2014 full day childcare<\/option><option>Yes \u2014 partial day<\/option><option>No thanks, children will attend with me<\/option><\/select><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nav-row\">\r\n      <button class=\"btn-back\" onclick=\"goTo(0)\"><i class=\"ti ti-arrow-left\" aria-hidden=\"true\"><\/i>Back<\/button>\r\n      <button class=\"btn-next\" onclick=\"goTo(2)\">Logistics <i class=\"ti ti-arrow-right\" aria-hidden=\"true\"><\/i><\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"step-section\" id=\"step2\">\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Travel &amp; transportation<\/div>\r\n      <div class=\"panel-sub\">Help us coordinate shuttles and parking logistics.<\/div>\r\n      <div class=\"field-grid\">\r\n        <div class=\"field\"><label>Do you need an airport shuttle?<\/label>\r\n          <select id=\"shuttle\" name=\"shuttle\"><option value=\"\">Select<\/option><option>Yes \u2014 arrival shuttle<\/option><option>Yes \u2014 departure shuttle<\/option><option>Yes \u2014 both<\/option><option>No<\/option><\/select><\/div>\r\n        <div class=\"field\"><label>Do you need a parking pass?<\/label>\r\n          <select id=\"parking\" name=\"parking\"><option value=\"\">Select<\/option><option>Yes \u2014 reserve a parking pass<\/option><option>No<\/option><\/select><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Accessibility &amp; special needs<\/div>\r\n      <div class=\"panel-sub\">We are committed to full accessibility. Let us know what you need so we can prepare.<\/div>\r\n      <div class=\"field-grid single\">\r\n        <div class=\"field\"><label>Accessibility requirements<\/label>\r\n          <select id=\"accessibility\" name=\"accessibility\"><option value=\"\">None<\/option><option>Wheelchair \/ mobility aid<\/option><option>Sign language interpreter<\/option><option>Hearing loop \/ FM system<\/option><option>Large-print materials<\/option><option>Prayer space for specific health need<\/option><option>Other (describe below)<\/option><\/select><\/div>\r\n        <div class=\"field\"><label>Additional notes<\/label><textarea id=\"accessibility-notes\" name=\"accessibility_notes\" rows=\"2\" placeholder=\"Anything else our accessibility team should know\u2026\"><\/textarea><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nav-row\">\r\n      <button class=\"btn-back\" onclick=\"goTo(1)\"><i class=\"ti ti-arrow-left\" aria-hidden=\"true\"><\/i>Back<\/button>\r\n      <button class=\"btn-next\" onclick=\"goTo(3)\">Payment <i class=\"ti ti-arrow-right\" aria-hidden=\"true\"><\/i><\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"step-section\" id=\"step3\">\r\n    <div class=\"banner banner-warn\" id=\"canceledBanner\">Your payment was cancelled, so nothing was charged. Your details are still here \u2014 press <strong>Continue to payment<\/strong> when you're ready to try again.<\/div>\r\n    <div class=\"banner banner-error\" id=\"err3\"><\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Order summary<\/div>\r\n      <div id=\"orderItems\"><\/div>\r\n      <div class=\"divider\"><\/div>\r\n      <div class=\"ticket-row\">\r\n        <div style=\"color: var(--color-text-secondary); font-size:13px;\">Subtotal<\/div>\r\n        <div id=\"sumSubtotal\" style=\"font-size:13px; color: var(--color-text-secondary);\">$0.00<\/div>\r\n      <\/div>\r\n      <div class=\"ticket-row\" id=\"discountRow\" style=\"display:none;\">\r\n        <div style=\"color: #0F6E56; font-size:13px;\"><i class=\"ti ti-tag\" style=\"font-size:13px;\" aria-hidden=\"true\"><\/i><span id=\"discountLabel\">Discount<\/span><\/div>\r\n        <div id=\"sumDiscount\" style=\"font-size:13px; color: #0F6E56;\">\u2212$0.00<\/div>\r\n      <\/div>\r\n      <div class=\"total-row\">\r\n        <span>Total due<\/span>\r\n        <span id=\"sumTotal\">$0.00<\/span>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Discount \/ scholarship code<\/div>\r\n      <div class=\"discount-strip\">\r\n        <input id=\"discountCode\" type=\"text\" placeholder=\"Enter code\" style=\"flex:1; max-width:220px;\">\r\n        <button onclick=\"applyDiscount()\" style=\"border: 0.5px solid var(--color-border-secondary); background: var(--color-background-secondary); color: var(--color-text-primary); padding: 7px 16px; border-radius: var(--border-radius-md); font-size:13px; cursor:pointer;\">Apply<\/button>\r\n      <\/div>\r\n      <div class=\"discount-msg\" id=\"discountMsg\"><\/div>\r\n      <div class=\"note\" style=\"margin-top:10px;\"><i class=\"ti ti-hand-heart\" aria-hidden=\"true\"><\/i>Scholarship \/ hardship waivers are available. <a href=\"#\" style=\"color:#1C58A6;\">Apply here<\/a> before registering.<\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Payment<\/div>\r\n      <div class=\"panel-sub\">You'll be taken to our secure payment page to pay by card. Your place is held while you're there, and your registration is confirmed the moment payment goes through.<\/div>\r\n      <div class=\"note\"><i class=\"ti ti-lock\" aria-hidden=\"true\"><\/i>Card details are entered on Stripe's page and never touch this site. Refund policy: full refund up to 30 days before the event.<\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-title\">Consent &amp; waiver<\/div>\r\n      <div class=\"waiver-box\">By registering, I confirm that all information provided is accurate. I consent to the Muslim Congress code of conduct, photo\/video release policy, and acknowledge the refund and cancellation policy. I understand that my registration is confirmed only upon receipt of full payment.<\/div>\r\n      <div style=\"display:flex; align-items:center; gap:8px; margin-top:16px;\">\r\n        <input type=\"checkbox\" id=\"consent\" style=\"width:16px; height:16px; accent-color:#1C58A6; flex-shrink:0;\">\r\n        <label for=\"consent\" style=\"font-size:13px; color:var(--color-text-primary); cursor:pointer;\">I have read and agree to the above terms <span class=\"req\">*<\/span><\/label>\r\n      <\/div>\r\n      <div id=\"consentError\" class=\"field-error\" style=\"margin-top:10px;\">Please agree to the terms to continue.<\/div>\r\n      <div style=\"display:flex; align-items:center; gap:8px; margin-top:10px;\">\r\n        <input type=\"checkbox\" id=\"updates\" style=\"width:16px; height:16px; accent-color:#1C58A6; flex-shrink:0;\">\r\n        <label for=\"updates\" style=\"font-size:13px; color:var(--color-text-secondary); cursor:pointer;\">Send me event updates and Muslim Congress news (optional)<\/label>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nav-row\">\r\n      <button class=\"btn-back\" onclick=\"goTo(2)\"><i class=\"ti ti-arrow-left\" aria-hidden=\"true\"><\/i>Back<\/button>\r\n      <button id=\"completeBtn\" class=\"btn-next\" onclick=\"complete()\">Continue to payment <i class=\"ti ti-arrow-right\" aria-hidden=\"true\"><\/i><\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"step-section\" id=\"step4\">\r\n    <div class=\"panel\" style=\"text-align:center; padding:2.5rem 1.5rem;\">\r\n      <div class=\"confirmation-icon\"><i class=\"ti ti-circle-check\" style=\"font-size:28px; color:#1C58A6;\" aria-hidden=\"true\"><\/i><\/div>\r\n      <div style=\"font-size:18px; font-weight:500; color:var(--color-text-primary); margin-bottom:6px;\">Registration confirmed<\/div>\r\n      <div style=\"font-size:13px; color:var(--color-text-secondary); margin-bottom:1.5rem;\">Payment received. A confirmation email with your registration details is on its way.<\/div>\r\n      <div style=\"background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:1rem; text-align:left; font-size:13px; color:var(--color-text-secondary); line-height:2;\">\r\n        <div><strong style=\"color:var(--color-text-primary);\">Confirmation #<\/strong> &nbsp;<span id=\"confNumber\">\u2014<\/span><\/div>\r\n        <div><strong style=\"color:var(--color-text-primary);\">Attendees<\/strong> &nbsp;<span id=\"confAttendees\">\u2014<\/span><\/div>\r\n        <div><strong style=\"color:var(--color-text-primary);\">Amount paid<\/strong> &nbsp;<span id=\"confTotal\">\u2014<\/span><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Dim + block interaction while we confirm the payment after returning from Stripe. -->\r\n<div id=\"mcLoadingOverlay\" role=\"alertdialog\" aria-label=\"Confirming payment\" aria-hidden=\"true\">\r\n  <div class=\"spinner\"><\/div>\r\n  <div class=\"overlay-msg\">Confirming your payment\u2026<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<script>\r\n  \/* =========================================================================\r\n     Backend. Everything that matters \u2014 prices, discounts, registration IDs,\r\n     payment status \u2014 is decided by the Apps Script web app, not by this file.\r\n     The numbers below are for display only; the server recomputes them.\r\n     ========================================================================= *\/\r\n  var BACKEND_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbykrjtpoCp1NsuT-CUVRUhINDPep1Q19qk2T_ZKLzChHkJa3AcTqd7VnIbmDbQFOK43Mg\/exec';\r\n\r\n  var PRICE_ADULT  = 150;   \/\/ ages 6\u201364\r\n  var PRICE_SENIOR = 110;   \/\/ ages 65+\r\n  var PRICE_CHILD  = 0;     \/\/ ages 5 & under\r\n\r\n  var discountType = '', discountValue = 0, discountName = '';  \/\/ value: fraction for %, dollars for $\r\n\r\n  \/* ---------- Small helpers ---------- *\/\r\n  function $(sel){ return document.querySelector(sel); }\r\n  function val(sel){ var el = $(sel); return el ? el.value.trim() : ''; }\r\n  function money(n){ return '$' + n.toFixed(2); }\r\n  function escapeHtml(s){ return (s||'').replace(\/[&<>\"']\/g, function(c){ return ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]); }); }\r\n\r\n  \/* Apps Script accepts text\/plain without a CORS preflight, and its JSON\r\n     response is readable \u2014 unlike mode:'no-cors', which hides every failure. *\/\r\n  function api(path, body){\r\n    var url = BACKEND_URL + path;\r\n    var opts = { method: body ? 'POST' : 'GET', redirect: 'follow' };\r\n    if(body){\r\n      opts.headers = { 'Content-Type': 'text\/plain;charset=utf-8' };\r\n      opts.body = JSON.stringify(body);\r\n    }\r\n    return fetch(url, opts).then(function(res){\r\n      if(!res.ok) throw new Error('Server error (' + res.status + ')');\r\n      return res.json();\r\n    });\r\n  }\r\n\r\n  \/* ---------- Full-screen loading overlay (Stripe return) ---------- *\/\r\n  function showOverlay(){ var o = document.getElementById('mcLoadingOverlay'); if(o){ o.classList.add('show'); o.setAttribute('aria-hidden', 'false'); } }\r\n  function hideOverlay(){ var o = document.getElementById('mcLoadingOverlay'); if(o){ o.classList.remove('show'); o.setAttribute('aria-hidden', 'true'); } }\r\n\r\n  \/* ---------- Phone number formatting ---------- *\/\r\n  function formatPhoneNumber(value){\r\n    var numbers = (value || '').replace(\/\\D\/g, '').slice(0, 10);\r\n    if(numbers.length <= 3){ return numbers; }\r\n    if(numbers.length <= 6){ return '(' + numbers.slice(0, 3) + ') ' + numbers.slice(3); }\r\n    return '(' + numbers.slice(0, 3) + ') ' + numbers.slice(3, 6) + '-' + numbers.slice(6);\r\n  }\r\n  function initPhoneFormatting(){\r\n    document.querySelectorAll('.mc-registration input[type=\"tel\"]').forEach(function(input){\r\n      input.addEventListener('input', function(){ this.value = formatPhoneNumber(this.value); });\r\n      input.addEventListener('paste', function(e){\r\n        e.preventDefault();\r\n        var pasted = (e.clipboardData || window.clipboardData).getData('text');\r\n        this.value = formatPhoneNumber(pasted);\r\n      });\r\n      input.value = formatPhoneNumber(input.value);\r\n    });\r\n  }\r\n\r\n  \/* ---------- Name auto-capitalization ---------- *\/\r\n  function toNameCase(str){\r\n    if(!str) return str;\r\n    return str.toLowerCase().replace(\/\\s+\/g, ' ').trim()\r\n      .replace(\/(^|[\\s\\-'\u2019])([a-z\u00e0-\u00f6\u00f8-\u00ff])\/g, function(m, sep, ch){ return sep + ch.toUpperCase(); });\r\n  }\r\n  function initNameFormatting(){\r\n    var container = document.querySelector('.mc-registration');\r\n    if(!container) return;\r\n    container.addEventListener('focusout', function(e){\r\n      var t = e.target;\r\n      if(!t || t.tagName !== 'INPUT' || !t.value) return;\r\n      if(t.id === 'p-first' || t.id === 'p-last' || t.id === 'p-city' ||\r\n         t.classList.contains('m-first') || t.classList.contains('m-last')){\r\n        t.value = toNameCase(t.value);\r\n      }\r\n    });\r\n  }\r\n\r\n  \/* ---------- Country \/ region + state\u2013province selector ---------- *\/\r\n  var COUNTRIES = [\r\n    \"Afghanistan\",\"Albania\",\"Algeria\",\"Andorra\",\"Angola\",\"Antigua and Barbuda\",\"Argentina\",\"Armenia\",\"Australia\",\"Austria\",\r\n    \"Azerbaijan\",\"Bahamas\",\"Bahrain\",\"Bangladesh\",\"Barbados\",\"Belarus\",\"Belgium\",\"Belize\",\"Benin\",\"Bhutan\",\"Bolivia\",\r\n    \"Bosnia and Herzegovina\",\"Botswana\",\"Brazil\",\"Brunei\",\"Bulgaria\",\"Burkina Faso\",\"Burundi\",\"Cabo Verde\",\"Cambodia\",\r\n    \"Cameroon\",\"Canada\",\"Central African Republic\",\"Chad\",\"Chile\",\"China\",\"Colombia\",\"Comoros\",\"Congo (Brazzaville)\",\r\n    \"Congo (Kinshasa)\",\"Costa Rica\",\"C\u00f4te d'Ivoire\",\"Croatia\",\"Cuba\",\"Cyprus\",\"Czechia\",\"Denmark\",\"Djibouti\",\"Dominica\",\r\n    \"Dominican Republic\",\"Ecuador\",\"Egypt\",\"El Salvador\",\"Equatorial Guinea\",\"Eritrea\",\"Estonia\",\"Eswatini\",\"Ethiopia\",\r\n    \"Fiji\",\"Finland\",\"France\",\"Gabon\",\"Gambia\",\"Georgia\",\"Germany\",\"Ghana\",\"Greece\",\"Grenada\",\"Guatemala\",\"Guinea\",\r\n    \"Guinea-Bissau\",\"Guyana\",\"Haiti\",\"Honduras\",\"Hungary\",\"Iceland\",\"India\",\"Indonesia\",\"Iran\",\"Iraq\",\"Ireland\",\"Israel\",\r\n    \"Italy\",\"Jamaica\",\"Japan\",\"Jordan\",\"Kazakhstan\",\"Kenya\",\"Kiribati\",\"Kuwait\",\"Kyrgyzstan\",\"Laos\",\"Latvia\",\"Lebanon\",\r\n    \"Lesotho\",\"Liberia\",\"Libya\",\"Liechtenstein\",\"Lithuania\",\"Luxembourg\",\"Madagascar\",\"Malawi\",\"Malaysia\",\"Maldives\",\r\n    \"Mali\",\"Malta\",\"Marshall Islands\",\"Mauritania\",\"Mauritius\",\"Mexico\",\"Micronesia\",\"Moldova\",\"Monaco\",\"Mongolia\",\r\n    \"Montenegro\",\"Morocco\",\"Mozambique\",\"Myanmar\",\"Namibia\",\"Nauru\",\"Nepal\",\"Netherlands\",\"New Zealand\",\"Nicaragua\",\r\n    \"Niger\",\"Nigeria\",\"North Korea\",\"North Macedonia\",\"Norway\",\"Oman\",\"Pakistan\",\"Palau\",\"Palestine\",\"Panama\",\r\n    \"Papua New Guinea\",\"Paraguay\",\"Peru\",\"Philippines\",\"Poland\",\"Portugal\",\"Qatar\",\"Romania\",\"Russia\",\"Rwanda\",\r\n    \"Saint Kitts and Nevis\",\"Saint Lucia\",\"Saint Vincent and the Grenadines\",\"Samoa\",\"San Marino\",\"Sao Tome and Principe\",\r\n    \"Saudi Arabia\",\"Senegal\",\"Serbia\",\"Seychelles\",\"Sierra Leone\",\"Singapore\",\"Slovakia\",\"Slovenia\",\"Solomon Islands\",\r\n    \"Somalia\",\"South Africa\",\"South Korea\",\"South Sudan\",\"Spain\",\"Sri Lanka\",\"Sudan\",\"Suriname\",\"Sweden\",\"Switzerland\",\r\n    \"Syria\",\"Taiwan\",\"Tajikistan\",\"Tanzania\",\"Thailand\",\"Timor-Leste\",\"Togo\",\"Tonga\",\"Trinidad and Tobago\",\"Tunisia\",\r\n    \"Turkey\",\"Turkmenistan\",\"Tuvalu\",\"Uganda\",\"Ukraine\",\"United Arab Emirates\",\"United Kingdom\",\"United States\",\"Uruguay\",\r\n    \"Uzbekistan\",\"Vanuatu\",\"Vatican City\",\"Venezuela\",\"Vietnam\",\"Yemen\",\"Zambia\",\"Zimbabwe\"\r\n  ];\r\n  var SUBDIVISIONS = {\r\n    'United States': [\"Alabama\",\"Alaska\",\"Arizona\",\"Arkansas\",\"California\",\"Colorado\",\"Connecticut\",\"Delaware\",\"Florida\",\r\n      \"Georgia\",\"Hawaii\",\"Idaho\",\"Illinois\",\"Indiana\",\"Iowa\",\"Kansas\",\"Kentucky\",\"Louisiana\",\"Maine\",\"Maryland\",\r\n      \"Massachusetts\",\"Michigan\",\"Minnesota\",\"Mississippi\",\"Missouri\",\"Montana\",\"Nebraska\",\"Nevada\",\"New Hampshire\",\r\n      \"New Jersey\",\"New Mexico\",\"New York\",\"North Carolina\",\"North Dakota\",\"Ohio\",\"Oklahoma\",\"Oregon\",\"Pennsylvania\",\r\n      \"Rhode Island\",\"South Carolina\",\"South Dakota\",\"Tennessee\",\"Texas\",\"Utah\",\"Vermont\",\"Virginia\",\"Washington\",\r\n      \"West Virginia\",\"Wisconsin\",\"Wyoming\",\"District of Columbia\",\"Puerto Rico\",\"Guam\",\"U.S. Virgin Islands\",\r\n      \"American Samoa\",\"Northern Mariana Islands\"],\r\n    'Canada': [\"Alberta\",\"British Columbia\",\"Manitoba\",\"New Brunswick\",\"Newfoundland and Labrador\",\"Northwest Territories\",\r\n      \"Nova Scotia\",\"Nunavut\",\"Ontario\",\"Prince Edward Island\",\"Quebec\",\"Saskatchewan\",\"Yukon\"]\r\n  };\r\n\r\n  function populateCountries(){\r\n    var sel = document.getElementById('p-country');\r\n    if(!sel) return;\r\n    var html = '';\r\n    for(var i = 0; i < COUNTRIES.length; i++){\r\n      var c = COUNTRIES[i];\r\n      html += '<option'+ (c === 'United States' ? ' selected' : '') +'>'+ escapeHtml(c) +'<\/option>';\r\n    }\r\n    sel.innerHTML = html;\r\n  }\r\n  function onCountryChange(){\r\n    var countrySel = document.getElementById('p-country');\r\n    var wrap = document.getElementById('stateWrap');\r\n    var lbl  = document.getElementById('stateLabel');\r\n    if(!countrySel || !wrap) return;\r\n    var country = countrySel.value;\r\n    var subs = SUBDIVISIONS[country];\r\n    if(subs){\r\n      if(lbl) lbl.textContent = (country === 'Canada') ? 'Province \/ territory' : 'State';\r\n      var html = '<select name=\"state\"><option value=\"\">Select\u2026<\/option>';\r\n      for(var i = 0; i < subs.length; i++){ html += '<option>'+ escapeHtml(subs[i]) +'<\/option>'; }\r\n      html += '<\/select>';\r\n      wrap.innerHTML = html;\r\n    } else {\r\n      if(lbl) lbl.textContent = 'State \/ province \/ region';\r\n      wrap.innerHTML = '<input name=\"state\" type=\"text\" placeholder=\"State \/ province \/ region\">';\r\n    }\r\n  }\r\n\r\n  function parseAge(v){\r\n    if(v === '' || v == null) return null;\r\n    var n = parseInt(v, 10);\r\n    if(isNaN(n) || n < 0 || n > 120) return null;\r\n    return n;\r\n  }\r\n  function priceForAge(age){\r\n    if(age === null) return null;\r\n    if(age <= 5) return PRICE_CHILD;\r\n    if(age <= 64) return PRICE_ADULT;\r\n    return PRICE_SENIOR;\r\n  }\r\n  function bracketLabel(age){\r\n    if(age <= 5) return 'Child (5 & under)';\r\n    if(age <= 64) return 'Ages 6\u201364';\r\n    return 'Senior (65+)';\r\n  }\r\n\r\n  \/* ---------- Auto-calculated child \/ youth counts ---------- *\/\r\n  function updateYouthCounts(){\r\n    var people = collectPeople();\r\n    var children = 0, youth = 0;\r\n    people.forEach(function(p){\r\n      var age = parseAge(p.age);\r\n      if(age === null) return;\r\n      if(age <= 5) children++;\r\n      else if(age <= 17) youth++;\r\n    });\r\n    var c = document.getElementById('num-children'), y = document.getElementById('num-youth');\r\n    if(c) c.value = children;\r\n    if(y) y.value = youth;\r\n  }\r\n  function initYouthCounts(){\r\n    var container = document.querySelector('.mc-registration');\r\n    if(!container) return;\r\n    \/\/ Recompute whenever any age field changes (primary or an attendee card).\r\n    container.addEventListener('input', function(e){\r\n      var t = e.target;\r\n      if(t && (t.id === 'p-age' || (t.classList && t.classList.contains('m-age')))){\r\n        updateYouthCounts();\r\n      }\r\n    });\r\n    updateYouthCounts();\r\n  }\r\n\r\n  \/* ---------- Attendee cards ---------- *\/\r\n  function memberCardHTML(){\r\n    return ''+\r\n    '<div class=\"member-card\" data-member>'+\r\n      '<div class=\"member-header\">'+\r\n        '<div class=\"member-title\"><i class=\"ti ti-user-circle\" aria-hidden=\"true\"><\/i><span class=\"member-num\">Attendee<\/span><\/div>'+\r\n        '<button type=\"button\" class=\"remove-member\" onclick=\"removeMember(this)\">Remove <i class=\"ti ti-x\" aria-hidden=\"true\"><\/i><\/button>'+\r\n      '<\/div>'+\r\n      '<div class=\"field-grid triple\">'+\r\n        '<div class=\"field\"><label>First name <span class=\"req\">*<\/span><\/label><input class=\"m-first\" type=\"text\" placeholder=\"First name\"><\/div>'+\r\n        '<div class=\"field\"><label>Last name <span class=\"req\">*<\/span><\/label><input class=\"m-last\" type=\"text\" placeholder=\"Last name\"><\/div>'+\r\n        '<div class=\"field\"><label>Age <span class=\"req\">*<\/span><\/label><input class=\"m-age\" type=\"number\" min=\"0\" max=\"120\" step=\"1\" placeholder=\"e.g. 9\"><\/div>'+\r\n        '<div class=\"field\"><label>Gender <span class=\"req\">*<\/span><\/label><select class=\"m-gender\"><option value=\"\">Select<\/option><option>Male<\/option><option>Female<\/option><\/select><\/div>'+\r\n        '<div class=\"field\"><label>Relationship to primary<\/label><select class=\"m-relationship\"><option value=\"\">Select<\/option><option>Spouse<\/option><option>Child<\/option><option>Parent<\/option><option>Sibling<\/option><option>Other<\/option><\/select><\/div>'+\r\n        '<div class=\"field\"><label>Dietary needs<\/label><select class=\"m-dietary\"><option value=\"\">None \/ standard halal<\/option><option>Vegetarian<\/option><option>Vegan<\/option><option>Nut allergy<\/option><option>Gluten-free<\/option><option>Other<\/option><\/select><\/div>'+\r\n      '<\/div>'+\r\n      '<div class=\"field-grid\" style=\"margin-top:10px;\">'+\r\n        '<div class=\"field span2\"><label>Any accessibility needs?<\/label><select class=\"m-accessibility\"><option value=\"\">None<\/option><option>Wheelchair access<\/option><option>Hearing assistance<\/option><option>Sign language interpreter<\/option><option>Other<\/option><\/select><\/div>'+\r\n      '<\/div>'+\r\n    '<\/div>';\r\n  }\r\n  function addMember(){\r\n    $('#membersContainer').insertAdjacentHTML('beforeend', memberCardHTML());\r\n    renumberMembers();\r\n    updateYouthCounts();\r\n  }\r\n  function removeMember(btn){\r\n    var card = btn.closest('[data-member]');\r\n    if(card) card.remove();\r\n    renumberMembers();\r\n    updateYouthCounts();\r\n    if(currentStep === 3) buildSummary();\r\n  }\r\n  function renumberMembers(){\r\n    document.querySelectorAll('#membersContainer [data-member]').forEach(function(c, i){\r\n      var n = c.querySelector('.member-num');\r\n      if(n) n.textContent = 'Attendee ' + (i + 2);\r\n    });\r\n  }\r\n\r\n  \/* ---------- Validation ---------- *\/\r\n  function mark(el, bad){\r\n    if(!el) return;\r\n    el.classList.toggle('invalid', !!bad);\r\n  }\r\n  function showErrors(step, list){\r\n    var banner = document.getElementById('err' + step);\r\n    if(!banner) return;\r\n    if(!list.length){ banner.classList.remove('show'); banner.innerHTML = ''; return; }\r\n    banner.innerHTML = 'Please fix the following before continuing:<ul>' +\r\n      list.map(function(m){ return '<li>' + escapeHtml(m) + '<\/li>'; }).join('') + '<\/ul>';\r\n    banner.classList.add('show');\r\n    banner.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n  }\r\n\r\n  function validateStep0(){\r\n    var errs = [];\r\n    var email = val('#p-email'), email2 = val('#p-email2');\r\n    var emailOk = \/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$\/.test(email);\r\n    var phoneDigits = val('#p-phone').replace(\/\\D\/g, '');\r\n\r\n    mark($('#p-first'),  !val('#p-first'));\r\n    mark($('#p-last'),   !val('#p-last'));\r\n    mark($('#p-email'),  !emailOk);\r\n    mark($('#p-email2'), email !== email2 || !email2);\r\n    mark($('#p-phone'),  phoneDigits.length !== 10);\r\n    mark($('#p-age'),    parseAge(val('#p-age')) === null);\r\n    mark($('#p-gender'), !val('#p-gender'));\r\n\r\n    if(!val('#p-first') || !val('#p-last')) errs.push('Enter your first and last name.');\r\n    if(!emailOk) errs.push('Enter a valid email address.');\r\n    else if(email !== email2) errs.push('The two email addresses don\\'t match.');\r\n    if(phoneDigits.length !== 10) errs.push('Enter a 10-digit phone number.');\r\n    if(parseAge(val('#p-age')) === null) errs.push('Enter your age \u2014 it sets your ticket price.');\r\n    if(!val('#p-gender')) errs.push('Select a gender.');\r\n\r\n    showErrors(0, errs);\r\n    return errs.length === 0;\r\n  }\r\n\r\n  function validateStep1(){\r\n    var errs = [];\r\n    document.querySelectorAll('#membersContainer [data-member]').forEach(function(card, i){\r\n      var first = card.querySelector('.m-first'), last = card.querySelector('.m-last');\r\n      var age = card.querySelector('.m-age'), gender = card.querySelector('.m-gender');\r\n      var label = 'Attendee ' + (i + 2);\r\n      mark(first,  !first.value.trim());\r\n      mark(last,   !last.value.trim());\r\n      mark(age,    parseAge(age.value) === null);\r\n      mark(gender, !gender.value);\r\n      if(!first.value.trim() || !last.value.trim()) errs.push(label + ' needs a first and last name.');\r\n      if(parseAge(age.value) === null) errs.push(label + ' needs an age.');\r\n      if(!gender.value) errs.push(label + ' needs a gender.');\r\n    });\r\n    showErrors(1, errs);\r\n    return errs.length === 0;\r\n  }\r\n\r\n  \/* ---------- Order summary (display only) ---------- *\/\r\n  function collectPeople(){\r\n    var people = [{\r\n      first: val('#p-first'),\r\n      last: val('#p-last'),\r\n      age: val('#p-age'),\r\n      gender: val('#p-gender'),\r\n      relationship: 'Primary',\r\n      dietary: '',\r\n      accessibility: val('#accessibility')\r\n    }];\r\n    document.querySelectorAll('#membersContainer [data-member]').forEach(function(card){\r\n      people.push({\r\n        first: (card.querySelector('.m-first').value || '').trim(),\r\n        last:  (card.querySelector('.m-last').value  || '').trim(),\r\n        age:   card.querySelector('.m-age').value,\r\n        gender: card.querySelector('.m-gender').value,\r\n        relationship: card.querySelector('.m-relationship').value,\r\n        dietary: card.querySelector('.m-dietary').value,\r\n        accessibility: card.querySelector('.m-accessibility').value\r\n      });\r\n    });\r\n    return people;\r\n  }\r\n\r\n  function buildSummary(){\r\n    var people = collectPeople();\r\n    var container = $('#orderItems');\r\n    container.innerHTML = '';\r\n    var subtotal = 0;\r\n\r\n    people.forEach(function(p, i){\r\n      var name = (p.first || p.last) ? (p.first + ' ' + p.last).trim()\r\n                 : (i === 0 ? 'Primary registrant' : 'Attendee ' + (i + 1));\r\n      var age = parseAge(p.age);\r\n      var price = priceForAge(age);\r\n      subtotal += price;\r\n      container.insertAdjacentHTML('beforeend',\r\n        '<div class=\"ticket-row\">'+\r\n          '<div><div class=\"ticket-label\">'+ escapeHtml(name) +'<\/div>'+\r\n          '<div class=\"ticket-sub\">'+ bracketLabel(age) +' \u00b7 age '+ age +'<\/div><\/div>'+\r\n          '<div class=\"ticket-price'+ (price === 0 ? ' free' : '') +'\">'+\r\n            (price === 0 ? 'Free' : money(price)) +'<\/div>'+\r\n        '<\/div>');\r\n    });\r\n\r\n    var discount = 0;\r\n    if(discountType === 'amount'){ discount = Math.min(discountValue, subtotal); }\r\n    else if(discountType === 'percent'){ discount = subtotal * discountValue; }\r\n    $('#sumSubtotal').textContent = money(subtotal);\r\n    if(discount > 0){\r\n      $('#discountRow').style.display = 'flex';\r\n      $('#discountLabel').textContent = discountName + (\r\n        discountType === 'amount'\r\n          ? ' (' + money(discountValue) + ' off)'\r\n          : ' (' + Math.round(discountValue * 100) + '% off)');\r\n      $('#sumDiscount').textContent = '\u2212' + money(discount);\r\n    } else {\r\n      $('#discountRow').style.display = 'none';\r\n    }\r\n    $('#sumTotal').textContent = money(subtotal - discount);\r\n  }\r\n\r\n  \/* ---------- Discount codes (validated by the server) ---------- *\/\r\n  function applyDiscount(){\r\n    var code = val('#discountCode').toUpperCase();\r\n    var msg = $('#discountMsg');\r\n    if(!code){\r\n      discountType = ''; discountValue = 0; discountName = '';\r\n      msg.className = 'discount-msg'; msg.textContent = '';\r\n      buildSummary();\r\n      return;\r\n    }\r\n    msg.className = 'discount-msg ok';\r\n    msg.textContent = 'Checking\u2026';\r\n    api('?action=discount&code=' + encodeURIComponent(code))\r\n      .then(function(d){\r\n        if(d.valid){\r\n          discountType = d.type; discountName = d.code;\r\n          if(d.type === 'amount'){\r\n            discountValue = d.value \/ 100;                 \/\/ cents \u2192 dollars\r\n            msg.textContent = 'Code applied \u2014 ' + money(discountValue) + ' off.';\r\n          } else {\r\n            discountValue = d.value;                       \/\/ fraction\r\n            msg.textContent = 'Code applied \u2014 ' + Math.round(d.value * 100) + '% off.';\r\n          }\r\n          msg.className = 'discount-msg ok';\r\n        } else {\r\n          discountType = ''; discountValue = 0; discountName = '';\r\n          msg.className = 'discount-msg err';\r\n          msg.textContent = 'That code was not recognized.';\r\n        }\r\n        buildSummary();\r\n      })\r\n      .catch(function(){\r\n        msg.className = 'discount-msg err';\r\n        msg.textContent = 'Couldn\\'t check that code right now. Try again in a moment.';\r\n      });\r\n  }\r\n\r\n  \/* ---------- Step navigation ----------\r\n     Browsing between steps is free \u2014 required fields no longer block moving\r\n     forward. Validation is enforced at submit time (see complete()). *\/\r\n  var currentStep = 0;\r\n  function goTo(n){\r\n    if(currentStep === 4) return;                       \/\/ no going back from confirmation\r\n    if(n > currentStep){\r\n      if(n > 3) return;                                 \/\/ step 5 is reached by paying, not clicking\r\n    }\r\n    document.getElementById('step' + currentStep).classList.remove('visible');\r\n    document.getElementById('step' + n).classList.add('visible');\r\n    for(var i = 0; i < 5; i++){\r\n      var b = document.getElementById('b' + i), l = document.getElementById('l' + i);\r\n      b.classList.remove('active', 'done'); l.classList.remove('active');\r\n      if(i < n){ b.classList.add('done'); }\r\n      else if(i === n){ b.classList.add('active'); l.classList.add('active'); }\r\n      if(i < 4){ document.getElementById('c' + i).classList.toggle('done', i < n); }\r\n    }\r\n    currentStep = n;\r\n    if(n === 1) updateYouthCounts();\r\n    if(n === 3) buildSummary();\r\n    window.scrollTo({ top: 0, behavior: 'smooth' });\r\n  }\r\n\r\n  \/* ---------- Submit \u2192 Stripe Checkout ---------- *\/\r\n  function buildPayload(){\r\n    var stateEl = document.querySelector('#stateWrap select, #stateWrap input');\r\n    return {\r\n      primary: {\r\n        firstName: val('#p-first'),\r\n        lastName: val('#p-last'),\r\n        email: val('#p-email'),\r\n        phone: val('#p-phone'),\r\n        country: val('#p-country'),\r\n        state: stateEl ? stateEl.value : '',\r\n        city: val('#p-city'),\r\n        age: val('#p-age'),\r\n        gender: val('#p-gender'),\r\n        registrationType: val('#reg-type'),\r\n        organization: val('#organization'),\r\n        referral: val('#referral'),\r\n        firstTime: val('#first-time')\r\n      },\r\n      attendees: collectPeople(),\r\n      logistics: {\r\n        numChildrenUnderFive: val('#num-children'),\r\n        numYouth: val('#num-youth'),\r\n        childcare: val('#childcare'),\r\n        shuttle: val('#shuttle'),\r\n        parking: val('#parking'),\r\n        accessibility: val('#accessibility'),\r\n        accessibilityNotes: val('#accessibility-notes')\r\n      },\r\n      programs: {\r\n        quranCompetition: [],\r\n        youthTalks: ''\r\n      },\r\n      discountCode: discountName,          \/\/ the server re-checks this\r\n      consent: $('#consent').checked,\r\n      updatesOptIn: $('#updates').checked\r\n    };\r\n  }\r\n\r\n  function complete(){\r\n    if(!validateStep0()){ goTo(0); return; }\r\n    if(!validateStep1()){ goTo(1); return; }\r\n    if(!$('#consent').checked){\r\n      $('#consentError').classList.add('show');\r\n      $('#consent').scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      return;\r\n    }\r\n    $('#consentError').classList.remove('show');\r\n    showErrors(3, []);\r\n\r\n    var btn = document.getElementById('completeBtn');\r\n    btn.disabled = true;\r\n    btn.style.opacity = '0.7';\r\n    btn.style.cursor = 'wait';\r\n    btn.innerHTML = '<i class=\"ti ti-loader-2\" aria-hidden=\"true\"><\/i>Taking you to payment\u2026';\r\n\r\n    api('', buildPayload())\r\n      .then(function(data){\r\n        if(!data.ok){ throw new Error((data.errors || [data.error]).join(' ')); }\r\n        if(data.checkoutUrl){\r\n          window.location.href = data.checkoutUrl;   \/\/ hand off to Stripe\r\n          return;\r\n        }\r\n        showConfirmation({                            \/\/ $0 total \u2014 nothing to charge\r\n          registrationId: data.registrationId,\r\n          total: 0,\r\n          attendees: buildPayload().attendees.map(function(a){\r\n            return { name: (a.first + ' ' + a.last).trim(), attendeeId: '' };\r\n          })\r\n        });\r\n        resetButton(btn);\r\n      })\r\n      .catch(function(err){\r\n        showErrors(3, [err.message || 'We couldn\\'t reach the registration server. Please try again.']);\r\n        resetButton(btn);\r\n      });\r\n  }\r\n  function resetButton(btn){\r\n    btn.disabled = false;\r\n    btn.style.opacity = '';\r\n    btn.style.cursor = '';\r\n    btn.innerHTML = 'Continue to payment <i class=\"ti ti-arrow-right\" aria-hidden=\"true\"><\/i>';\r\n  }\r\n\r\n  \/* ---------- Coming back from Stripe ---------- *\/\r\n  function showConfirmation(data){\r\n    hideOverlay();\r\n    $('#confNumber').textContent = data.registrationId;\r\n    $('#confAttendees').textContent = (data.attendees || []).map(function(a){\r\n      return a.attendeeId ? a.name + ' (' + a.attendeeId + ')' : a.name;\r\n    }).join(', ') || '\u2014';\r\n    $('#confTotal').textContent = money((data.total || 0) \/ 100);\r\n    document.getElementById('step' + currentStep).classList.remove('visible');\r\n    document.getElementById('step4').classList.add('visible');\r\n    for(var i = 0; i < 5; i++){\r\n      var b = document.getElementById('b' + i), l = document.getElementById('l' + i);\r\n      b.classList.remove('active'); l.classList.remove('active');\r\n      if(i < 4) { b.classList.add('done'); document.getElementById('c' + i).classList.add('done'); }\r\n    }\r\n    document.getElementById('b4').classList.add('active');\r\n    document.getElementById('l4').classList.add('active');\r\n    currentStep = 4;\r\n    window.scrollTo({ top: 0, behavior: 'smooth' });\r\n  }\r\n\r\n  function handleReturnFromStripe(){\r\n    var params = new URLSearchParams(window.location.search);\r\n    var rid = params.get('rid');\r\n    if(!rid) return;\r\n\r\n    if(params.get('canceled')){\r\n      document.getElementById('canceledBanner').classList.add('show');\r\n      goTo(3);\r\n      return;\r\n    }\r\n\r\n    \/\/ Dim + block the page while we confirm the payment.\r\n    showOverlay();\r\n\r\n    \/\/ Stripe's webhook usually lands before the browser gets back here, but not\r\n    \/\/ always. Poll for a few seconds before giving up.\r\n    function stillConfirming(){\r\n      hideOverlay();\r\n      showErrors(3, ['Your payment went through, but we\\'re still confirming it. ' +\r\n        'Your confirmation number is ' + rid + ' \u2014 save it, and check your email in a few minutes.']);\r\n      goTo(3);\r\n    }\r\n\r\n    var attempts = 0;\r\n    (function poll(){\r\n      attempts++;\r\n      api('?action=status&rid=' + encodeURIComponent(rid))\r\n        .then(function(data){\r\n          if(data.ok && data.status === 'Paid'){\r\n            showConfirmation(data);                    \/\/ hides overlay\r\n            history.replaceState({}, '', window.location.pathname);\r\n            return;\r\n          }\r\n          \/\/ If the server returns an explicit error, show it rather than hiding\r\n          \/\/ it behind the generic timeout \u2014 but allow a couple of retries first\r\n          \/\/ in case it's a transient blip.\r\n          if(data.ok === false && attempts >= 2){\r\n            hideOverlay();\r\n            showErrors(3, ['We couldn\\'t confirm your payment automatically: ' +\r\n              (data.error || 'unknown error') + '. Your confirmation number is ' + rid +\r\n              ' \u2014 please save it and contact us if you were charged.']);\r\n            goTo(3);\r\n            return;\r\n          }\r\n          if(attempts < 8){ setTimeout(poll, 1500); return; }\r\n          stillConfirming();\r\n        })\r\n        .catch(function(){\r\n          if(attempts < 8){ setTimeout(poll, 1500); return; }\r\n          stillConfirming();\r\n        });\r\n    })();\r\n  }\r\n\r\n  \/* ---------- Init ---------- *\/\r\n  $('#consent').addEventListener('change', function(){\r\n    if(this.checked) $('#consentError').classList.remove('show');\r\n  });\r\n  populateCountries();\r\n  onCountryChange();\r\n  initPhoneFormatting();\r\n  initNameFormatting();\r\n  initYouthCounts();\r\n  handleReturnFromStripe();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Conference Details Complete the steps below to reserve your place. Note: If you or anyone in your family wants to register for Heavenly Match, click here. Nov. 6-8, 2026 Dearborn, Michigan Registration closes Oct. 15 Book Hotel Room Muslim Congress Annual Conference \u2014 Registration Muslim Congress conference registration 1Personal 2Attendees 3Logistics 4Payment 5Review Primary registrant [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"_angie_page":false,"footnotes":""},"class_list":["post-2322","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/pages\/2322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/comments?post=2322"}],"version-history":[{"count":5,"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/pages\/2322\/revisions"}],"predecessor-version":[{"id":3135,"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/pages\/2322\/revisions\/3135"}],"wp:attachment":[{"href":"https:\/\/muslimcongress.org\/new\/wp-json\/wp\/v2\/media?parent=2322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}