{"id":4620,"date":"2026-05-04T14:55:25","date_gmt":"2026-05-04T14:55:25","guid":{"rendered":"https:\/\/gambiaandsenegaltours.com\/?page_id=4620"},"modified":"2026-05-07T15:40:28","modified_gmt":"2026-05-07T15:40:28","slug":"book-your-tour","status":"publish","type":"page","link":"https:\/\/gambiaandsenegaltours.com\/nl\/book-your-tour\/","title":{"rendered":"Boek uw tour"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4620\" class=\"elementor elementor-4620\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f71469d e-flex e-con-boxed e-con e-parent\" data-id=\"f71469d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-99e7360 elementor-widget elementor-widget-html\" data-id=\"99e7360\" 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>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Book a Tour \u2013 Gambia & Senegal Tours<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@400;600&family=DM+Sans:wght@300;400;500&display=swap\" rel=\"stylesheet\">\n<style>\n\/* \u2500\u2500 BRAND CONFIG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n:root {\n  --orange:   #e8652a;\n  --orange-d: #c44f18;\n  --orange-l: #f5855a;\n  --dark:     #1a1208;\n  --mid:      #2e1f0a;\n  --card:     #ffffff;\n  --border:   #e8ddd0;\n  --text:     #1a1208;\n  --muted:    #7a6555;\n  --ok:       #2e8b57;\n  --danger:   #c0392b;\n  --bg:       #faf7f3;\n  --radius:   14px;\n  --shadow:   0 4px 24px rgba(26,18,8,.10);\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\nbody {\n  font-family: 'DM Sans', sans-serif;\n  background: var(--bg);\n  color: var(--text);\n  min-height: 100vh;\n}\n\n\/* \u2500\u2500 WRAPPER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.booking-wrap { max-width: 780px; margin: 0 auto; padding: 2rem 1rem 4rem; }\n\n\/* \u2500\u2500 HERO BANNER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.hero {\n  background: linear-gradient(135deg, var(--dark) 0%, var(--mid) 100%);\n  border-radius: var(--radius);\n  padding: 2rem 2rem 1.6rem;\n  margin-bottom: 1.5rem;\n  position: relative;\n  overflow: hidden;\n}\n.hero::before {\n  content: '';\n  position: absolute; inset: 0;\n  background: url(\"data:image\/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.03'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'\/%3E%3C\/g%3E%3C\/g%3E%3C\/svg%3E\");\n}\n.hero-label { font-size: .75rem; text-transform: uppercase; letter-spacing: .12em; color: var(--orange-l); margin-bottom: .5rem; }\n.hero h1 { font-family: 'Playfair Display', serif; font-size: clamp(1.5rem,4vw,2.2rem); color: #fff; line-height: 1.2; }\n.hero p  { color: rgba(255,255,255,.6); font-size: .9rem; margin-top: .5rem; }\n\n\/* \u2500\u2500 STEPS INDICATOR \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.steps {\n  display: flex; align-items: center; justify-content: center;\n  gap: 0; margin-bottom: 1.5rem;\n}\n.step-pill {\n  display: flex; align-items: center; gap: 6px;\n  padding: 6px 14px; border-radius: 20px;\n  font-size: .8rem; font-weight: 500;\n  color: var(--muted); background: transparent;\n  border: 1.5px solid var(--border); transition: all .3s;\n}\n.step-pill.active { background: var(--orange); color: #fff; border-color: var(--orange); }\n.step-pill.done   { background: var(--ok); color: #fff; border-color: var(--ok); }\n.step-line { width: 28px; height: 1.5px; background: var(--border); flex-shrink: 0; }\n.step-line.done { background: var(--ok); }\n\n\/* \u2500\u2500 CARD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.card {\n  background: var(--card);\n  border: 1px solid var(--border);\n  border-radius: var(--radius);\n  padding: 1.8rem;\n  box-shadow: var(--shadow);\n  margin-bottom: 1rem;\n}\n.card-title {\n  font-family: 'Playfair Display', serif;\n  font-size: 1.25rem; color: var(--dark);\n  margin-bottom: 1.4rem;\n  display: flex; align-items: center; gap: 10px;\n}\n.card-title span { font-size: 1.3rem; }\n\n\/* \u2500\u2500 CALENDAR \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.cal-nav-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; }\n.cal-nav-row h3 { font-family: 'Playfair Display', serif; font-size: 1.1rem; }\n.cal-btn { background: var(--bg); border: 1px solid var(--border); color: var(--text);\n           padding: 6px 14px; border-radius: 8px; cursor: pointer; font-size: .85rem;\n           transition: all .2s; }\n.cal-btn:hover { background: var(--orange); color: #fff; border-color: var(--orange); }\n.cal-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 3px; }\n.cal-lbl { text-align: center; font-size: .7rem; font-weight: 500; color: var(--muted);\n           text-transform: uppercase; letter-spacing: .06em; padding: 4px 0; }\n.cal-day { aspect-ratio: 1; display: flex; align-items: center; justify-content: center;\n           border-radius: 8px; font-size: .88rem; cursor: pointer;\n           transition: all .18s; border: 1.5px solid transparent; position: relative; }\n.cal-day.empty  { cursor: default; }\n.cal-day.past   { color: #ccc; cursor: not-allowed; }\n.cal-day.blocked { background: #fff0ee; color: var(--danger); cursor: not-allowed;\n                   text-decoration: line-through; border-color: #ffd5d0; }\n.cal-day.available:hover { background: #fff5f0; border-color: var(--orange-l); color: var(--orange); }\n.cal-day.selected { background: var(--orange); color: #fff; border-color: var(--orange); font-weight: 500; }\n.cal-day.today::after { content:''; position:absolute; bottom:3px; left:50%; transform:translateX(-50%);\n                        width:4px; height:4px; border-radius:50%; background:var(--orange); }\n.cal-day.selected.today::after { background: #fff; }\n.legend { display: flex; gap: 1rem; flex-wrap: wrap; margin-top: .8rem; }\n.legend-item { display: flex; align-items: center; gap: 5px; font-size: .75rem; color: var(--muted); }\n.legend-dot { width: 10px; height: 10px; border-radius: 3px; }\n\n\/* \u2500\u2500 TOUR SELECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.tour-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }\n@media(max-width:520px){ .tour-grid { grid-template-columns: 1fr; } }\n.tour-card { padding: 10px 12px; border: 1.5px solid var(--border); border-radius: 10px;\n             cursor: pointer; transition: all .18s; font-size: .88rem; line-height: 1.3; }\n.tour-card:hover { border-color: var(--orange-l); background: #fff8f5; }\n.tour-card.selected { border-color: var(--orange); background: #fff3ee; font-weight: 500; color: var(--orange-d); }\n.tour-card .cat { font-size: .68rem; text-transform: uppercase; letter-spacing: .06em;\n                  color: var(--muted); margin-bottom: 3px; }\n\n\/* \u2500\u2500 FORM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }\n@media(max-width:520px){ .form-row { grid-template-columns: 1fr; } }\n.form-group { margin-bottom: 1.1rem; }\n.form-group label { display: block; font-size: .8rem; font-weight: 500; color: var(--muted);\n                    margin-bottom: 5px; text-transform: uppercase; letter-spacing: .05em; }\n.form-group input, .form-group select, .form-group textarea {\n  width: 100%; padding: 10px 13px; border: 1.5px solid var(--border);\n  border-radius: 9px; font-family: 'DM Sans', sans-serif; font-size: .93rem;\n  color: var(--text); outline: none; transition: border-color .2s; background: #fff;\n}\n.form-group input:focus, .form-group select:focus, .form-group textarea:focus {\n  border-color: var(--orange);\n}\n.form-group textarea { resize: vertical; min-height: 75px; }\n\n\/* \u2500\u2500 OTP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.otp-row { display: flex; gap: 10px; justify-content: center; margin: 1.4rem 0; }\n.otp-box { width: 54px; height: 62px; text-align: center; font-size: 1.5rem; font-weight: 500;\n           border: 2px solid var(--border); border-radius: 10px; font-family: 'DM Sans',sans-serif;\n           color: var(--text); outline: none; transition: border-color .2s; }\n.otp-box:focus { border-color: var(--orange); }\n.otp-box.ok    { border-color: var(--ok); color: var(--ok); }\n\n\/* \u2500\u2500 PAYMENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.amount-banner {\n  background: linear-gradient(135deg, var(--dark), var(--mid));\n  border-radius: 10px; padding: 1rem 1.4rem;\n  display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.2rem;\n}\n.amount-banner .lbl { font-size: .8rem; color: rgba(255,255,255,.6); }\n.amount-banner .amt { font-family: 'Playfair Display',serif; font-size: 1.9rem; color: var(--orange-l); }\n.stripe-btn {\n  width: 100%; padding: 14px; background: var(--orange); color: #fff;\n  border: none; border-radius: 10px; font-size: 1rem; font-weight: 500;\n  font-family: 'DM Sans',sans-serif; cursor: pointer; transition: background .2s;\n  display: flex; align-items: center; justify-content: center; gap: 10px;\n}\n.stripe-btn:hover { background: var(--orange-d); }\n.stripe-btn:disabled { opacity: .5; cursor: not-allowed; }\n.stripe-icon { font-size: 1.2rem; }\n\n\/* \u2500\u2500 SUMMARY BOX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.summary-rows td { padding: 9px 0; border-bottom: 1px solid var(--border); font-size: .9rem; vertical-align: top; }\n.summary-rows td:first-child { color: var(--muted); width: 130px; white-space: nowrap; }\n.summary-rows tr:last-child td { border-bottom: none; }\n\n\/* \u2500\u2500 NOTICES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.notice { border-radius: 9px; padding: 11px 14px; font-size: .84rem; margin-top: .8rem;\n          display: flex; gap: 9px; line-height: 1.5; }\n.notice.info    { background: #eef5ff; border: 1px solid #b3d0ff; color: #1a4a99; }\n.notice.success { background: #edfaf3; border: 1px solid #8fd9b0; color: #1a6641; }\n.notice.warn    { background: #fff8ee; border: 1px solid #f5c97a; color: #7a4f00; }\n\n\/* \u2500\u2500 CONFIRM SCREEN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.confirm-circle {\n  width: 72px; height: 72px; border-radius: 50%;\n  background: #edfaf3; border: 2px solid var(--ok);\n  display: flex; align-items: center; justify-content: center;\n  font-size: 2rem; margin: 0 auto 1.2rem;\n}\n.booking-ref {\n  display: inline-block; font-family: monospace; font-size: 1rem;\n  background: var(--bg); border: 1px solid var(--border);\n  padding: 5px 14px; border-radius: 6px; color: var(--orange-d);\n  letter-spacing: .1em;\n}\n\n\/* \u2500\u2500 BUTTONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.btn { padding: 11px 24px; border-radius: 9px; border: none; cursor: pointer;\n       font-family: 'DM Sans',sans-serif; font-size: .93rem; font-weight: 500;\n       transition: all .2s; display: inline-flex; align-items: center; gap: 7px; }\n.btn-primary   { background: var(--orange); color: #fff; }\n.btn-primary:hover { background: var(--orange-d); }\n.btn-primary:disabled { opacity: .45; cursor: not-allowed; }\n.btn-secondary { background: transparent; color: var(--muted); border: 1.5px solid var(--border); }\n.btn-secondary:hover { border-color: var(--text); color: var(--text); }\n.btn-wa { background: #25d366; color: #fff; }\n.btn-wa:hover { background: #1db954; }\n.btn-row { display: flex; gap: 10px; justify-content: flex-end; margin-top: 1.4rem; flex-wrap: wrap; }\n\n.hidden { display: none !important; }\n\n\/* \u2500\u2500 ADMIN PANEL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.admin-trigger { text-align: center; margin-top: 3rem; }\n.admin-trigger button { background: none; border: 1px solid #ddd; color: #bbb;\n  padding: 5px 14px; border-radius: 6px; cursor: pointer; font-size: .75rem;\n  font-family: \"DM Sans\",sans-serif; }\n.admin-trigger button:hover { color: #888; border-color: #bbb; }\n#adminPanel { margin-top: 1rem; }\n.admin-card { background: #fff; border: 2px solid var(--orange); border-radius: var(--radius);\n  padding: 1.8rem; box-shadow: var(--shadow); }\n.admin-title { font-family: \"Playfair Display\",serif; font-size: 1.2rem; color: var(--dark);\n  margin-bottom: 1.2rem; display:flex; align-items:center; gap:8px; }\n.admin-cal-day { aspect-ratio:1; display:flex; align-items:center; justify-content:center;\n  border-radius:8px; font-size:.88rem; cursor:pointer; border:1.5px solid transparent;\n  transition:all .18s; }\n.admin-cal-day.a-empty { cursor:default; }\n.admin-cal-day.a-past  { color:#ccc; cursor:not-allowed; }\n.admin-cal-day.a-free  { color:var(--text); }\n.admin-cal-day.a-free:hover { background:#fff5f0; border-color:var(--orange-l); color:var(--orange); }\n.admin-cal-day.a-blocked { background:#fff0ee; color:var(--danger); border-color:#ffd5d0;\n  text-decoration:line-through; }\n.blocked-list { display:flex; flex-wrap:wrap; gap:6px; margin-top:.8rem; min-height:32px; }\n.blocked-tag { background:#fff0ee; border:1px solid #ffd5d0; color:var(--danger);\n  padding:3px 10px; border-radius:20px; font-size:.78rem; display:flex; align-items:center; gap:5px; }\n.blocked-tag button { background:none; border:none; cursor:pointer; color:var(--danger);\n  font-size:.9rem; padding:0; line-height:1; }\n.admin-hint { font-size:.82rem; color:var(--muted); margin-bottom:1rem; }\n.pwd-wrap { display:flex; gap:8px; margin-bottom:1.5rem; }\n.pwd-wrap input { flex:1; padding:9px 12px; border:1.5px solid var(--border);\n  border-radius:8px; font-family:\"DM Sans\",sans-serif; font-size:.93rem; outline:none; }\n.pwd-wrap input:focus { border-color:var(--orange); }\n.pwd-err { color:var(--danger); font-size:.83rem; margin-top:.4rem; }\n.text-center { text-align: center; }\n.divider { border: none; border-top: 1px solid var(--border); margin: 1.4rem 0; }\n\n\/* \u2500\u2500 ADMIN PANEL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.admin-trigger { text-align: center; margin-top: 3rem; }\n.admin-trigger button { background: none; border: 1px solid #ddd; color: #bbb;\n  padding: 5px 14px; border-radius: 6px; cursor: pointer; font-size: .75rem;\n  font-family: 'DM Sans',sans-serif; transition: all .2s; }\n.admin-trigger button:hover { color: #888; border-color: #bbb; }\n.admin-card { background: #fff; border: 2px solid var(--orange); border-radius: var(--radius);\n  padding: 1.8rem; box-shadow: var(--shadow); }\n.admin-title { font-family: 'Playfair Display',serif; font-size: 1.2rem; color: var(--dark);\n  margin-bottom: 1.2rem; display:flex; align-items:center; gap:8px; }\n.admin-cal-day { aspect-ratio:1; display:flex; align-items:center; justify-content:center;\n  border-radius:8px; font-size:.88rem; cursor:pointer; border:1.5px solid transparent; transition:all .18s; }\n.admin-cal-day.a-empty { cursor:default; }\n.admin-cal-day.a-past  { color:#ccc; cursor:not-allowed; }\n.admin-cal-day.a-free:hover { background:#fff5f0; border-color:var(--orange-l); color:var(--orange); }\n.admin-cal-day.a-blocked { background:#fff0ee; color:var(--danger); border-color:#ffd5d0; text-decoration:line-through; }\n.blocked-list { display:flex; flex-wrap:wrap; gap:6px; margin-top:.6rem; }\n.blocked-tag { background:#fff0ee; border:1px solid #ffd5d0; color:var(--danger);\n  padding:3px 10px; border-radius:20px; font-size:.78rem; display:flex; align-items:center; gap:5px; }\n.blocked-tag button { background:none; border:none; cursor:pointer; color:var(--danger); font-size:.9rem; padding:0; }\n.admin-hint { font-size:.82rem; color:var(--muted); margin-bottom:1rem; }\n.pwd-wrap { display:flex; gap:8px; margin-bottom:.8rem; }\n.pwd-wrap input { flex:1; padding:9px 12px; border:1.5px solid var(--border);\n  border-radius:8px; font-family:'DM Sans',sans-serif; font-size:.93rem; outline:none; }\n.pwd-wrap input:focus { border-color:var(--orange); }\n.pwd-err { color:var(--danger); font-size:.83rem; }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"booking-wrap\">\n\n  <!-- HERO -->\n  <div class=\"hero\">\n    <div class=\"hero-label\">\u2726 Secure Online Booking<\/div>\n    <h1>Book Your Gambia &amp; Senegal Adventure<\/h1>\n    <p>Pick a date, choose your tour, verify your email, and pay your deposit securely via Stripe.<\/p>\n  <\/div>\n\n  <!-- STEP PILLS -->\n  <div class=\"steps\" id=\"stepPills\">\n    <div class=\"step-pill active\" id=\"pill1\">1 Date<\/div>\n    <div class=\"step-line\" id=\"line1\"><\/div>\n    <div class=\"step-pill\" id=\"pill2\">2 Tour<\/div>\n    <div class=\"step-line\" id=\"line2\"><\/div>\n    <div class=\"step-pill\" id=\"pill3\">3 Details<\/div>\n    <div class=\"step-line\" id=\"line3\"><\/div>\n    <div class=\"step-pill\" id=\"pill4\">4 Verify<\/div>\n    <div class=\"step-line\" id=\"line4\"><\/div>\n    <div class=\"step-pill\" id=\"pill5\">5 Pay<\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550 STEP 1 \u2014 CALENDAR \u2550\u2550\u2550 -->\n  <div id=\"step1\" class=\"card\">\n    <div class=\"card-title\"><span>\ud83d\udcc5<\/span> Choose Your Date<\/div>\n    <div class=\"cal-nav-row\">\n      <button class=\"cal-btn\" onclick=\"changeMonth(-1)\">\u2190 Prev<\/button>\n      <h3 id=\"calTitle\"><\/h3>\n      <button class=\"cal-btn\" onclick=\"changeMonth(1)\">Next \u2192<\/button>\n    <\/div>\n    <div class=\"cal-grid\" id=\"calGrid\"><\/div>\n    <div class=\"legend\">\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--orange)\"><\/div>Selected<\/div>\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:#f5c97a\"><\/div>Today<\/div>\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:#ffd5d0\"><\/div>Unavailable<\/div>\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:#ddd\"><\/div>Past<\/div>\n    <\/div>\n    <div class=\"btn-row\">\n      <button class=\"btn btn-primary\" id=\"btnCal\" onclick=\"goStep(2)\" disabled>Choose Tour \u2192<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550 STEP 2 \u2014 TOUR \u2550\u2550\u2550 -->\n  <div id=\"step2\" class=\"card hidden\">\n    <div class=\"card-title\"><span>\ud83d\uddfa\ufe0f<\/span> Select Your Tour<\/div>\n    <p style=\"color:var(--muted);font-size:.88rem;margin-bottom:1rem\">Selected date: <strong id=\"selDateLabel\" style=\"color:var(--text)\"><\/strong><\/p>\n\n    <div class=\"form-group\">\n      <label>Category<\/label>\n      <select id=\"catFilter\" onchange=\"filterTours()\">\n        <option value=\"\">All Tours<\/option>\n        <option value=\"gambia\">\ud83c\uddec\ud83c\uddf2 Gambia Day Tours<\/option>\n        <option value=\"senegal\">\ud83c\uddf8\ud83c\uddf3 Senegal Tours<\/option>\n        <option value=\"multiday\">\ud83d\udcc5 Multi-Day &amp; Combos<\/option>\n        <option value=\"nature\">\ud83c\udf3f Nature &amp; Wildlife<\/option>\n        <option value=\"water\">\ud83c\udf0a Water &amp; Fishing<\/option>\n      <\/select>\n    <\/div>\n\n    <div class=\"tour-grid\" id=\"tourGrid\"><\/div>\n\n    <div class=\"divider\"><\/div>\n    <div class=\"form-row\">\n      <div class=\"form-group\">\n        <label>Number of People *<\/label>\n        <input type=\"number\" id=\"numPeople\" min=\"1\" max=\"20\" placeholder=\"e.g. 2\" oninput=\"validateStep2()\">\n      <\/div>\n      <div class=\"form-group\">\n        <label>Deposit Amount<\/label>\n        <input type=\"text\" id=\"depositAmt\" readonly style=\"background:var(--bg); color:var(--orange-d); font-weight:500;\">\n      <\/div>\n    <\/div>\n\n    <div class=\"btn-row\">\n      <button class=\"btn btn-secondary\" onclick=\"goStep(1)\">\u2190 Back<\/button>\n      <button class=\"btn btn-primary\" id=\"btnTour\" onclick=\"goStep(3)\" disabled>Your Details \u2192<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550 STEP 3 \u2014 CONTACT \u2550\u2550\u2550 -->\n  <div id=\"step3\" class=\"card hidden\">\n    <div class=\"card-title\"><span>\ud83d\udc64<\/span> Your Details<\/div>\n    <div class=\"form-row\">\n      <div class=\"form-group\">\n        <label>First Name *<\/label>\n        <input type=\"text\" id=\"firstName\" placeholder=\"Anna\" oninput=\"validateStep3()\">\n      <\/div>\n      <div class=\"form-group\">\n        <label>Last Name *<\/label>\n        <input type=\"text\" id=\"lastName\" placeholder=\"Smith\" oninput=\"validateStep3()\">\n      <\/div>\n    <\/div>\n    <div class=\"form-group\">\n      <label>Email Address * (we'll send a verification code)<\/label>\n      <input type=\"email\" id=\"email\" placeholder=\"anna@example.com\" oninput=\"validateStep3()\">\n    <\/div>\n    <div class=\"form-group\">\n      <label>WhatsApp \/ Phone *<\/label>\n      <input type=\"tel\" id=\"phone\" placeholder=\"+44 7700 900000\" oninput=\"validateStep3()\">\n    <\/div>\n    <div class=\"form-group\">\n      <label>Special Requests<\/label>\n      <textarea id=\"notes\" placeholder=\"e.g. dietary needs, accessibility, pickup location\u2026\"><\/textarea>\n    <\/div>\n    <div class=\"notice info\">\u2139\ufe0f A 4-digit code will be emailed to verify your address before payment.<\/div>\n    <div class=\"btn-row\">\n      <button class=\"btn btn-secondary\" onclick=\"goStep(2)\">\u2190 Back<\/button>\n      <button class=\"btn btn-primary\" id=\"btnContact\" onclick=\"sendOTP()\" disabled>Send Code \u2192<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550 STEP 4 \u2014 VERIFY EMAIL \u2550\u2550\u2550 -->\n  <div id=\"step4\" class=\"card hidden\">\n    <div class=\"card-title\"><span>\u2709\ufe0f<\/span> Verify Your Email<\/div>\n    <p class=\"text-center\" style=\"color:var(--muted);font-size:.9rem\">\n      We sent a 4-digit code to <strong id=\"emailShow\" style=\"color:var(--text)\"><\/strong>\n    <\/p>\n    <div class=\"otp-row\">\n      <input class=\"otp-box\" id=\"o0\" maxlength=\"1\" type=\"text\" inputmode=\"numeric\" oninput=\"otpType(this,0)\">\n      <input class=\"otp-box\" id=\"o1\" maxlength=\"1\" type=\"text\" inputmode=\"numeric\" oninput=\"otpType(this,1)\">\n      <input class=\"otp-box\" id=\"o2\" maxlength=\"1\" type=\"text\" inputmode=\"numeric\" oninput=\"otpType(this,2)\">\n      <input class=\"otp-box\" id=\"o3\" maxlength=\"1\" type=\"text\" inputmode=\"numeric\" oninput=\"otpType(this,3)\">\n    <\/div>\n    <p id=\"otpErr\" class=\"hidden text-center\" style=\"color:var(--danger);font-size:.88rem\">\u2717 Wrong code \u2013 try again.<\/p>\n    <p class=\"text-center\" style=\"font-size:.83rem;color:var(--muted)\">\n      Didn't get it? <a href=\"#\" onclick=\"resendCode(event)\" style=\"color:var(--orange)\">Resend<\/a>\n    <\/p>\n    <div class=\"btn-row\">\n      <button class=\"btn btn-secondary\" onclick=\"goStep(3)\">\u2190 Back<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550 STEP 5 \u2014 PAYMENT \u2550\u2550\u2550 -->\n  <div id=\"step5\" class=\"card hidden\">\n    <div class=\"card-title\"><span>\ud83d\udcb3<\/span> Pay Deposit via Stripe<\/div>\n\n    <div class=\"amount-banner\">\n      <div>\n        <div class=\"lbl\">Deposit to secure your booking<\/div>\n        <div class=\"lbl\" id=\"payTourLabel\" style=\"color:rgba(255,255,255,.8);font-size:.85rem;margin-top:2px\"><\/div>\n      <\/div>\n      <div class=\"amt\" id=\"payAmount\"><\/div>\n    <\/div>\n\n    <table class=\"summary-rows\" style=\"width:100%;margin-bottom:1.2rem\">\n      <tr><td>Date<\/td><td id=\"ps-date\"><\/td><\/tr>\n      <tr><td>Tour<\/td><td id=\"ps-tour\"><\/td><\/tr>\n      <tr><td>People<\/td><td id=\"ps-people\"><\/td><\/tr>\n      <tr><td>Name<\/td><td id=\"ps-name\"><\/td><\/tr>\n      <tr><td>Email<\/td><td id=\"ps-email\"><\/td><\/tr>\n    <\/table>\n\n    <button class=\"stripe-btn\" onclick=\"goStripe()\">\n      <span class=\"stripe-icon\">\ud83d\udd12<\/span> Pay Deposit Securely with Stripe\n    <\/button>\n\n    <div class=\"notice warn\" style=\"margin-top:1rem\">\n      \u26a0\ufe0f You will be redirected to Stripe's secure checkout. After payment, your booking is confirmed and we'll contact you via WhatsApp within 2 hours.\n    <\/div>\n    <div class=\"btn-row\">\n      <button class=\"btn btn-secondary\" onclick=\"goStep(4)\">\u2190 Back<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550\u2550 STEP 6 \u2014 CONFIRMED \u2550\u2550\u2550 -->\n  <div id=\"step6\" class=\"card hidden\">\n    <div class=\"text-center\">\n      <div class=\"confirm-circle\">\u2713<\/div>\n      <div style=\"font-family:'Playfair Display',serif;font-size:1.6rem;margin-bottom:.5rem\">Booking Confirmed!<\/div>\n      <p style=\"color:var(--muted);font-size:.9rem\">Your deposit was received. We'll WhatsApp you within 2 hours to finalise details.<\/p>\n      <div style=\"margin-top:1rem\">\n        <div style=\"font-size:.75rem;color:var(--muted);margin-bottom:5px\">BOOKING REFERENCE<\/div>\n        <span class=\"booking-ref\" id=\"finalRef\"><\/span>\n      <\/div>\n    <\/div>\n    <table class=\"summary-rows\" style=\"width:100%;margin-top:1.5rem\">\n      <tr><td>Tour<\/td><td id=\"cs-tour\"><\/td><\/tr>\n      <tr><td>Date<\/td><td id=\"cs-date\"><\/td><\/tr>\n      <tr><td>People<\/td><td id=\"cs-people\"><\/td><\/tr>\n      <tr><td>Deposit<\/td><td id=\"cs-amount\"><\/td><\/tr>\n      <tr><td>Status<\/td><td><span style=\"color:var(--ok);font-weight:500\">\u2713 Paid<\/span><\/td><\/tr>\n    <\/table>\n    <div class=\"notice success\" style=\"margin-top:1.2rem\">\n      \u2705 A confirmation email has been sent to your inbox with all details.\n    <\/div>\n    <div class=\"btn-row\" style=\"justify-content:center;margin-top:1.5rem\">\n      <button class=\"btn btn-wa\" onclick=\"openWA()\">\n        \ud83d\udcac Message us on WhatsApp\n      <\/button>\n      <button class=\"btn btn-secondary\" onclick=\"startOver()\">Book Another Tour<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 ADMIN TRIGGER \u2500\u2500 -->\n  <div class=\"admin-trigger\">\n    <button onclick=\"showAdminLogin()\">\u2699 Site Admin<\/button>\n  <\/div>\n\n  <!-- \u2500\u2500 ADMIN LOGIN \u2500\u2500 -->\n  <div id=\"adminLogin\" class=\"hidden\" style=\"margin-top:1rem\">\n    <div class=\"admin-card\">\n      <div class=\"admin-title\">\ud83d\udd10 Admin Login<\/div>\n      <div class=\"pwd-wrap\">\n        <input type=\"password\" id=\"adminPwd\" placeholder=\"Enter admin password\" onkeydown=\"if(event.key==='Enter')checkPwd()\">\n        <button class=\"btn btn-primary\" onclick=\"checkPwd()\">Login<\/button>\n      <\/div>\n      <div id=\"pwdErr\" class=\"pwd-err hidden\">\u2717 Wrong password<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 ADMIN PANEL \u2500\u2500 -->\n  <div id=\"adminPanel\" class=\"hidden\">\n    <div class=\"admin-card\">\n      <div class=\"admin-title\">\u2699\ufe0f Manage Unavailable Dates<\/div>\n      <p class=\"admin-hint\">Click any date below to toggle it as unavailable (red = blocked). Changes are saved automatically.<\/p>\n\n      <div class=\"cal-nav-row\">\n        <button class=\"cal-btn\" onclick=\"adminChangeMonth(-1)\">\u2190 Prev<\/button>\n        <h3 id=\"adminCalTitle\"><\/h3>\n        <button class=\"cal-btn\" onclick=\"adminChangeMonth(1)\">Next \u2192<\/button>\n      <\/div>\n      <div class=\"cal-grid\" id=\"adminCalGrid\"><\/div>\n\n      <div style=\"margin-top:1.2rem\">\n        <div style=\"font-size:.8rem;font-weight:500;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem\">Currently Blocked Dates<\/div>\n        <div class=\"blocked-list\" id=\"blockedList\"><\/div>\n        <div id=\"noBlocked\" style=\"font-size:.83rem;color:var(--muted)\">No dates blocked yet.<\/div>\n      <\/div>\n\n      <div style=\"margin-top:1.2rem;display:flex;gap:10px;flex-wrap:wrap\">\n        <button class=\"btn btn-secondary\" onclick=\"clearAllBlocked()\" style=\"font-size:.83rem\">Clear All<\/button>\n        <button class=\"btn btn-secondary\" onclick=\"document.getElementById('adminPanel').classList.add('hidden')\" style=\"font-size:.83rem\">Close Panel<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n\n  <!-- \u2500\u2500 ADMIN TRIGGER \u2500\u2500 -->\n  <div class=\"admin-trigger\">\n    <button onclick=\"showAdminLogin()\">\u2699 Site Admin<\/button>\n  <\/div>\n\n  <!-- \u2500\u2500 ADMIN LOGIN \u2500\u2500 -->\n  <div id=\"adminLogin\" class=\"hidden\" style=\"margin-top:1rem\">\n    <div class=\"admin-card\">\n      <div class=\"admin-title\">\ud83d\udd10 Admin Login<\/div>\n      <div class=\"pwd-wrap\">\n        <input type=\"password\" id=\"adminPwd\" placeholder=\"Enter admin password\" onkeydown=\"if(event.key==='Enter')checkPwd()\">\n        <button class=\"btn btn-primary\" onclick=\"checkPwd()\">Login<\/button>\n      <\/div>\n      <div id=\"pwdErr\" class=\"pwd-err hidden\">\u2717 Incorrect password<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 ADMIN PANEL \u2500\u2500 -->\n  <div id=\"adminPanel\" class=\"hidden\" style=\"margin-top:1rem\">\n    <div class=\"admin-card\">\n      <div class=\"admin-title\">\u2699\ufe0f Manage Unavailable Dates<\/div>\n      <p class=\"admin-hint\">Click any future date to mark it unavailable (red). Click again to unblock. Saved automatically.<\/p>\n      <div class=\"cal-nav-row\">\n        <button class=\"cal-btn\" onclick=\"adminChangeMonth(-1)\">\u2190 Prev<\/button>\n        <h3 id=\"adminCalTitle\"><\/h3>\n        <button class=\"cal-btn\" onclick=\"adminChangeMonth(1)\">Next \u2192<\/button>\n      <\/div>\n      <div class=\"cal-grid\" id=\"adminCalGrid\"><\/div>\n      <div style=\"margin-top:1.2rem\">\n        <div style=\"font-size:.8rem;font-weight:500;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem\">Blocked Dates<\/div>\n        <div class=\"blocked-list\" id=\"blockedList\"><\/div>\n        <div id=\"noBlocked\" style=\"font-size:.83rem;color:var(--muted)\">No dates blocked yet.<\/div>\n      <\/div>\n      <div style=\"margin-top:1.2rem;display:flex;gap:10px;flex-wrap:wrap\">\n        <button class=\"btn btn-secondary\" onclick=\"clearAllBlocked()\" style=\"font-size:.83rem\">Clear All Blocks<\/button>\n        <button class=\"btn btn-secondary\" onclick=\"document.getElementById('adminPanel').classList.add('hidden')\" style=\"font-size:.83rem\">Close<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n<\/div><!-- \/.booking-wrap -->\n\n<script>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   \u2605 CONFIG \u2014 Fill these in\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst CONFIG = {\n  stripeLink:   'PASTE_YOUR_STRIPE_LINK_HERE',   \/\/ e.g. https:\/\/buy.stripe.com\/xxx\n  whatsapp:     '2203261234',                     \/\/ +220 326 1234\n  depositFixed: 100,                              \/\/ deposit amount in \u20ac\n  currency:     '\u20ac',\n  \/\/ Dates you are NOT available (format: 'YYYY-MM-DD')\n  \/\/ Add more as needed\n  blockedDates: [\n    \/\/ '2025-12-25','2025-12-26',\n  ],\n};\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   TOURS DATA\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst TOURS = [\n  \/\/ Gambia Day Tours\n  { id:'banjul',      cat:'gambia',   name:'Banjul City Tour' },\n  { id:'bicycle',     cat:'gambia',   name:'Bicycle City Tour' },\n  { id:'monkey',      cat:'nature',   name:'Monkey Park (Bijilo Forest Park)' },\n  { id:'crocodile',   cat:'gambia',   name:'Crocodile Pool (Kachikally)' },\n  { id:'makasutu',    cat:'nature',   name:'Makasutu Cultural Forest' },\n  { id:'lamin',       cat:'gambia',   name:'Lamin Lodge' },\n  { id:'roots',       cat:'gambia',   name:'Roots \u2013 Kunta Kinteh Island' },\n  { id:'food',        cat:'gambia',   name:'Gambia Food Tour & Cooking Experience' },\n  { id:'southgambia', cat:'gambia',   name:'South Gambia' },\n  { id:'georgetown',  cat:'gambia',   name:'Georgetown (Janjanbureh)' },\n  \/\/ Nature & Wildlife\n  { id:'birding',     cat:'nature',   name:'Birding Tour (Half Day \/ All Day)' },\n  { id:'tendaba',     cat:'nature',   name:'Tendaba River & Wildlife Experience' },\n  { id:'niokolo',     cat:'nature',   name:'Niokolo-Koba National Park' },\n  { id:'bandia',      cat:'nature',   name:'Bandia Reserve Safari' },\n  { id:'fathala',     cat:'nature',   name:'Fathala Wildlife Reserve Safari' },\n  { id:'djoudj',      cat:'nature',   name:'Djoudj National Birds Reserve' },\n  \/\/ Water & Fishing\n  { id:'kayaking',    cat:'water',    name:'Kayaking (River & Mangroves)' },\n  { id:'cruise',      cat:'water',    name:'Lazy Day Cruise' },\n  { id:'fishing',     cat:'water',    name:'Creek & Sea Fishing Trips' },\n  { id:'jinack',      cat:'water',    name:'Jinack Island' },\n  { id:'pelican',     cat:'water',    name:'Pelican Island' },\n  \/\/ Senegal Tours\n  { id:'goree',       cat:'senegal',  name:'Gor\u00e9e Island Day Trip' },\n  { id:'saloum',      cat:'senegal',  name:'Saloum Delta' },\n  { id:'saintlouis',  cat:'senegal',  name:'Saint Louis' },\n  { id:'lompoul',     cat:'senegal',  name:'Lompoul Desert' },\n  \/\/ Multi-Day & Combos\n  { id:'5day',        cat:'multiday', name:'5-Day Gambia & Senegal Adventure' },\n  { id:'combo',       cat:'multiday', name:'Tendaba & Janjanbureh Combo Excursion' },\n  { id:'multiday',    cat:'multiday', name:'Multi-Day Custom Tour' },\n];\n\nconst CAT_LABELS = {\n  gambia:   '\ud83c\uddec\ud83c\uddf2 Gambia',\n  senegal:  '\ud83c\uddf8\ud83c\uddf3 Senegal',\n  multiday: '\ud83d\udcc5 Multi-Day',\n  nature:   '\ud83c\udf3f Nature',\n  water:    '\ud83c\udf0a Water',\n};\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   STATE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nlet currentStep = 1;\nlet selDate = null;\nlet selTour = null;\nlet otp = '';\nlet bookingRef = '';\nconst now = new Date();\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CALENDAR\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nlet calY = now.getFullYear(), calM = now.getMonth();\n\nfunction dateStr(d){ return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; }\nfunction todayStr(){ return dateStr(now); }\nfunction fmtDate(s){\n  const [y,m,d]=s.split('-');\n  const mn=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n  return `${mn[parseInt(m)-1]} ${parseInt(d)}, ${y}`;\n}\n\nfunction renderCal(){\n  const months=['January','February','March','April','May','June','July','August','September','October','November','December'];\n  document.getElementById('calTitle').textContent=`${months[calM]} ${calY}`;\n  const g=document.getElementById('calGrid');\n  g.innerHTML='';\n  ['Su','Mo','Tu','We','Th','Fr','Sa'].forEach(d=>{\n    const e=document.createElement('div');\n    e.className='cal-lbl'; e.textContent=d; g.appendChild(e);\n  });\n  const firstDay=new Date(calY,calM,1).getDay();\n  const days=new Date(calY,calM+1,0).getDate();\n  const today=todayStr();\n  for(let i=0;i<firstDay;i++){ const e=document.createElement('div'); e.className='cal-day empty'; g.appendChild(e); }\n  for(let d=1;d<=days;d++){\n    const ds=dateStr(new Date(calY,calM,d));\n    const isPast=ds<today;\n    const isBlocked=CONFIG.blockedDates.includes(ds);\n    const isSel=ds===selDate;\n    const isToday=ds===today;\n    const e=document.createElement('div');\n    e.textContent=d;\n    if(isPast)         { e.className='cal-day past'; }\n    else if(isBlocked) { e.className='cal-day blocked'; }\n    else if(isSel)     { e.className='cal-day selected'+(isToday?' today':''); }\n    else               { e.className='cal-day available'+(isToday?' today':''); e.onclick=()=>pickDate(ds); }\n    g.appendChild(e);\n  }\n}\n\nfunction pickDate(ds){\n  selDate=ds; renderCal();\n  document.getElementById('btnCal').disabled=false;\n}\nfunction changeMonth(dir){\n  calM+=dir;\n  if(calM<0){calM=11;calY--;}\n  if(calM>11){calM=0;calY++;}\n  renderCal();\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   TOURS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction renderTours(filter=''){\n  const g=document.getElementById('tourGrid');\n  g.innerHTML='';\n  const list=filter?TOURS.filter(t=>t.cat===filter):TOURS;\n  list.forEach(t=>{\n    const e=document.createElement('div');\n    e.className='tour-card'+(selTour&&selTour.id===t.id?' selected':'');\n    e.innerHTML=`<div class=\"cat\">${CAT_LABELS[t.cat]||''}<\/div>${t.name}`;\n    e.onclick=()=>{ selTour=t; renderTours(document.getElementById('catFilter').value); validateStep2(); };\n    g.appendChild(e);\n  });\n}\nfunction filterTours(){ renderTours(document.getElementById('catFilter').value); }\n\nfunction validateStep2(){\n  const p=parseInt(document.getElementById('numPeople').value)||0;\n  const dep=p>0?CONFIG.currency+CONFIG.depositFixed:CONFIG.currency+'\u2014';\n  document.getElementById('depositAmt').value=p>0?(CONFIG.currency+CONFIG.depositFixed):'';\n  document.getElementById('btnTour').disabled=!(selTour&&p>0);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   STEP NAV\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction goStep(n){\n  document.getElementById('step'+currentStep).classList.add('hidden');\n  document.getElementById('step'+n).classList.remove('hidden');\n  for(let i=1;i<=5;i++){\n    const p=document.getElementById('pill'+i);\n    const l=document.getElementById('line'+i);\n    p.classList.remove('active','done');\n    if(i<n){p.classList.add('done');}\n    else if(i===n){p.classList.add('active');}\n    if(l) l.classList.toggle('done',i<n);\n  }\n  currentStep=n;\n  if(n===2){ document.getElementById('selDateLabel').textContent=fmtDate(selDate); renderTours(); }\n  if(n===5){ fillPayScreen(); }\n  window.scrollTo({top:0,behavior:'smooth'});\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   FORM VALIDATION\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction validateStep3(){\n  const ok=document.getElementById('firstName').value.trim()&&\n           document.getElementById('lastName').value.trim()&&\n           document.getElementById('email').value.includes('@')&&\n           document.getElementById('phone').value.trim().length>=6;\n  document.getElementById('btnContact').disabled=!ok;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   OTP\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction genOTP(){ return String(Math.floor(1000+Math.random()*9000)); }\n\nfunction sendOTP(){\n  otp=genOTP();\n  const email=document.getElementById('email').value;\n  \/\/ \u2500\u2500 To send real emails, configure EmailJS (free 200\/month):\n  \/\/ 1. Sign up at emailjs.com\n  \/\/ 2. Uncomment + fill in below:\n  \/\/ emailjs.init('YOUR_PUBLIC_KEY');\n  \/\/ emailjs.send('YOUR_SERVICE_ID','YOUR_TEMPLATE_ID',{to_email:email,otp_code:otp});\n  alert(`[DEMO] Your verification code is: ${otp}\\n\\nIn production this is sent to ${email}`);\n  document.getElementById('emailShow').textContent=email;\n  goStep(4);\n}\n\nfunction resendCode(e){ e.preventDefault(); sendOTP(); }\n\nfunction otpType(el,idx){\n  el.value=el.value.replace(\/\\D\/g,'');\n  if(el.value&&idx<3) document.getElementById('o'+(idx+1)).focus();\n  const entered=[0,1,2,3].map(i=>document.getElementById('o'+i).value).join('');\n  if(entered.length===4){\n    if(entered===otp){\n      document.getElementById('otpErr').classList.add('hidden');\n      [0,1,2,3].forEach(i=>document.getElementById('o'+i).classList.add('ok'));\n      setTimeout(()=>goStep(5), 600);\n    } else {\n      document.getElementById('otpErr').classList.remove('hidden');\n    }\n  }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   PAYMENT SCREEN\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction fillPayScreen(){\n  const name=document.getElementById('firstName').value+' '+document.getElementById('lastName').value;\n  const people=document.getElementById('numPeople').value;\n  document.getElementById('payTourLabel').textContent=selTour.name;\n  document.getElementById('payAmount').textContent=CONFIG.currency+CONFIG.depositFixed;\n  document.getElementById('ps-date').textContent=fmtDate(selDate);\n  document.getElementById('ps-tour').textContent=selTour.name;\n  document.getElementById('ps-people').textContent=people+' person'+(people>1?'s':'');\n  document.getElementById('ps-name').textContent=name;\n  document.getElementById('ps-email').textContent=document.getElementById('email').value;\n}\n\nfunction goStripe(){\n  \/\/ Save booking locally\n  bookingRef='GST-'+Math.random().toString(36).substring(2,8).toUpperCase();\n  const booking={\n    ref:bookingRef,\n    tour:selTour.name,\n    date:selDate,\n    people:document.getElementById('numPeople').value,\n    name:document.getElementById('firstName').value+' '+document.getElementById('lastName').value,\n    email:document.getElementById('email').value,\n    phone:document.getElementById('phone').value,\n    notes:document.getElementById('notes').value,\n    deposit:CONFIG.depositFixed,\n    status:'pending_payment',\n    created:new Date().toISOString(),\n  };\n  const bookings=JSON.parse(localStorage.getItem('gst_bookings')||'[]');\n  bookings.push(booking);\n  localStorage.setItem('gst_bookings',JSON.stringify(bookings));\n\n  if(CONFIG.stripeLink==='PASTE_YOUR_STRIPE_LINK_HERE'){\n    \/\/ Demo mode \u2014 show confirmation directly\n    showConfirmed();\n  } else {\n    \/\/ Real Stripe \u2014 open payment link in same tab\n    \/\/ Stripe will redirect back after payment\n    window.location.href=CONFIG.stripeLink+'?client_reference_id='+bookingRef+'&prefilled_email='+encodeURIComponent(document.getElementById('email').value);\n  }\n}\n\nfunction showConfirmed(){\n  document.getElementById('finalRef').textContent=bookingRef||'GST-DEMO';\n  document.getElementById('cs-tour').textContent=selTour?selTour.name:'\u2014';\n  document.getElementById('cs-date').textContent=selDate?fmtDate(selDate):'\u2014';\n  document.getElementById('cs-people').textContent=(document.getElementById('numPeople').value||1)+' person(s)';\n  document.getElementById('cs-amount').textContent=CONFIG.currency+CONFIG.depositFixed;\n  \/\/ Hide step pills on final screen\n  document.getElementById('stepPills').classList.add('hidden');\n  goStep(6);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   WHATSAPP\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction openWA(){\n  const ref=document.getElementById('finalRef').textContent;\n  const tour=document.getElementById('cs-tour').textContent;\n  const date=document.getElementById('cs-date').textContent;\n  const msg=encodeURIComponent(`Hello! I just booked a tour.\\n\\n\ud83d\udccb Ref: ${ref}\\n\ud83d\uddfa\ufe0f Tour: ${tour}\\n\ud83d\udcc5 Date: ${date}\\n\\nLooking forward to hearing from you!`);\n  window.open(`https:\/\/wa.me\/${CONFIG.whatsapp}?text=${msg}`,'_blank');\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   RESET\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction startOver(){\n  selDate=null; selTour=null; otp=''; bookingRef='';\n  [0,1,2,3].forEach(i=>{ const el=document.getElementById('o'+i); if(el){el.value='';el.classList.remove('ok');} });\n  document.getElementById('btnCal').disabled=true;\n  document.getElementById('stepPills').classList.remove('hidden');\n  goStep(1); renderCal();\n}\n\n\/* \u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nrenderCal();\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   ADMIN PANEL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst ADMIN_PASSWORD = \"gambia2024\"; \/\/ \u2190 Change this to your own password\n\nlet adminCalY = now.getFullYear(), adminCalM = now.getMonth();\n\nfunction showAdminLogin(){\n  const panel = document.getElementById(\"adminPanel\");\n  const login = document.getElementById(\"adminLogin\");\n  if(!panel.classList.contains(\"hidden\")){ panel.classList.add(\"hidden\"); return; }\n  login.classList.toggle(\"hidden\");\n}\n\nfunction checkPwd(){\n  const val = document.getElementById(\"adminPwd\").value;\n  if(val === ADMIN_PASSWORD){\n    document.getElementById(\"adminLogin\").classList.add(\"hidden\");\n    document.getElementById(\"adminPwd\").value = \"\";\n    document.getElementById(\"pwdErr\").classList.add(\"hidden\");\n    document.getElementById(\"adminPanel\").classList.remove(\"hidden\");\n    renderAdminCal();\n    renderBlockedList();\n  } else {\n    document.getElementById(\"pwdErr\").classList.remove(\"hidden\");\n  }\n}\n\nfunction getBlocked(){\n  return JSON.parse(localStorage.getItem(\"gst_blocked\") || \"[]\");\n}\nfunction saveBlocked(arr){\n  localStorage.setItem(\"gst_blocked\", JSON.stringify(arr));\n  CONFIG.blockedDates = arr;\n  renderCal();\n}\n\nfunction toggleBlock(ds){\n  let blocked = getBlocked();\n  if(blocked.includes(ds)){\n    blocked = blocked.filter(d => d !== ds);\n  } else {\n    blocked.push(ds);\n    blocked.sort();\n  }\n  saveBlocked(blocked);\n  renderAdminCal();\n  renderBlockedList();\n}\n\nfunction clearAllBlocked(){\n  if(!confirm(\"Remove all blocked dates?\")) return;\n  saveBlocked([]);\n  renderAdminCal();\n  renderBlockedList();\n}\n\nfunction adminChangeMonth(dir){\n  adminCalM += dir;\n  if(adminCalM < 0){ adminCalM = 11; adminCalY--; }\n  if(adminCalM > 11){ adminCalM = 0; adminCalY++; }\n  renderAdminCal();\n}\n\nfunction renderAdminCal(){\n  const months=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\n  document.getElementById(\"adminCalTitle\").textContent = months[adminCalM]+\" \"+adminCalY;\n  const g = document.getElementById(\"adminCalGrid\");\n  g.innerHTML = \"\";\n  [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"].forEach(d => {\n    const e = document.createElement(\"div\");\n    e.className = \"cal-lbl\"; e.textContent = d; g.appendChild(e);\n  });\n  const firstDay = new Date(adminCalY, adminCalM, 1).getDay();\n  const days = new Date(adminCalY, adminCalM+1, 0).getDate();\n  const today = todayStr();\n  const blocked = getBlocked();\n  for(let i=0;i<firstDay;i++){\n    const e=document.createElement(\"div\"); e.className=\"admin-cal-day a-empty\"; g.appendChild(e);\n  }\n  for(let d=1;d<=days;d++){\n    const ds = dateStr(new Date(adminCalY, adminCalM, d));\n    const isPast = ds < today;\n    const isBlocked = blocked.includes(ds);\n    const e = document.createElement(\"div\");\n    e.textContent = d;\n    if(isPast){ e.className=\"admin-cal-day a-past\"; }\n    else if(isBlocked){ e.className=\"admin-cal-day a-blocked\"; e.onclick=()=>toggleBlock(ds); }\n    else { e.className=\"admin-cal-day a-free\"; e.onclick=()=>toggleBlock(ds); }\n    g.appendChild(e);\n  }\n}\n\nfunction renderBlockedList(){\n  const blocked = getBlocked();\n  const list = document.getElementById(\"blockedList\");\n  const none = document.getElementById(\"noBlocked\");\n  list.innerHTML = \"\";\n  if(blocked.length === 0){ none.style.display=\"block\"; return; }\n  none.style.display = \"none\";\n  blocked.forEach(ds => {\n    const tag = document.createElement(\"div\");\n    tag.className = \"blocked-tag\";\n    tag.innerHTML = fmtDate(ds) + '<button onclick=\"toggleBlock(\\''+ds+'\\')\">\u2715<\/button>';\n    list.appendChild(tag);\n  });\n}\n\n\/\/ On load, apply any saved blocked dates from localStorage\n(function loadSavedBlocked(){\n  const saved = getBlocked();\n  if(saved.length > 0){ CONFIG.blockedDates = saved; renderCal(); }\n})();\n\n<\/script>\n<\/body>\n<\/html>\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","protected":false},"excerpt":{"rendered":"<p>\u2726 Secure Online Booking Book Your Gambia &amp; Senegal Adventure Pick a date, choose your tour, verify your email, and pay your deposit securely via Stripe. 1 Date 2 Tour 3 Details 4 Verify 5 Pay \ud83d\udcc5 Choose Your Date \u2190 Prev Next \u2192 Selected Today Unavailable Past Choose Tour \u2192 \ud83d\uddfa\ufe0f Select Your Tour [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-4620","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Book Your Tour - Gambia &amp; Senegal Tours<\/title>\n<meta name=\"description\" content=\"Book unforgettable Gambia and Senegal tours, including safari, cultural, river cruise, and nature experiences for every traveler.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gambiaandsenegaltours.com\/nl\/book-your-tour\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Book Your Tour - Gambia &amp; Senegal Tours\" \/>\n<meta property=\"og:description\" content=\"Book unforgettable Gambia and Senegal tours, including safari, cultural, river cruise, and nature experiences for every traveler.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gambiaandsenegaltours.com\/nl\/book-your-tour\/\" \/>\n<meta property=\"og:site_name\" content=\"Gambia &amp; Senegal Tours\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/httl.gambiaandsenegaltours\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-07T15:40:28+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verwachte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/book-your-tour\\\/\",\"url\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/book-your-tour\\\/\",\"name\":\"Book Your Tour - Gambia &amp; Senegal Tours\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/#website\"},\"datePublished\":\"2026-05-04T14:55:25+00:00\",\"dateModified\":\"2026-05-07T15:40:28+00:00\",\"description\":\"Book unforgettable Gambia and Senegal tours, including safari, cultural, river cruise, and nature experiences for every traveler.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/book-your-tour\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gambiaandsenegaltours.com\\\/book-your-tour\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/book-your-tour\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Book Your Tour\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/#website\",\"url\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/\",\"name\":\"Gambia & Senegal Tours\",\"description\":\"Just another Astra Starter Templates site\",\"publisher\":{\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/#organization\",\"name\":\"Gambia & Senegal Tours\",\"url\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/WhatsApp-Image-2025-12-20-at-02.22.50-e1767828334978.jpeg\",\"contentUrl\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/WhatsApp-Image-2025-12-20-at-02.22.50-e1767828334978.jpeg\",\"width\":816,\"height\":746,\"caption\":\"Gambia & Senegal Tours\"},\"image\":{\"@id\":\"https:\\\/\\\/gambiaandsenegaltours.com\\\/nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/httl.gambiaandsenegaltours\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Book Your Tour - Gambia &amp; Senegal Tours","description":"Book unforgettable Gambia and Senegal tours, including safari, cultural, river cruise, and nature experiences for every traveler.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gambiaandsenegaltours.com\/nl\/book-your-tour\/","og_locale":"nl_NL","og_type":"article","og_title":"Book Your Tour - Gambia &amp; Senegal Tours","og_description":"Book unforgettable Gambia and Senegal tours, including safari, cultural, river cruise, and nature experiences for every traveler.","og_url":"https:\/\/gambiaandsenegaltours.com\/nl\/book-your-tour\/","og_site_name":"Gambia &amp; Senegal Tours","article_publisher":"https:\/\/www.facebook.com\/httl.gambiaandsenegaltours","article_modified_time":"2026-05-07T15:40:28+00:00","twitter_card":"summary_large_image","twitter_misc":{"Verwachte leestijd":"2 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gambiaandsenegaltours.com\/book-your-tour\/","url":"https:\/\/gambiaandsenegaltours.com\/book-your-tour\/","name":"Book Your Tour - Gambia &amp; Senegal Tours","isPartOf":{"@id":"https:\/\/gambiaandsenegaltours.com\/nl\/#website"},"datePublished":"2026-05-04T14:55:25+00:00","dateModified":"2026-05-07T15:40:28+00:00","description":"Book unforgettable Gambia and Senegal tours, including safari, cultural, river cruise, and nature experiences for every traveler.","breadcrumb":{"@id":"https:\/\/gambiaandsenegaltours.com\/book-your-tour\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gambiaandsenegaltours.com\/book-your-tour\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gambiaandsenegaltours.com\/book-your-tour\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gambiaandsenegaltours.com\/"},{"@type":"ListItem","position":2,"name":"Book Your Tour"}]},{"@type":"WebSite","@id":"https:\/\/gambiaandsenegaltours.com\/nl\/#website","url":"https:\/\/gambiaandsenegaltours.com\/nl\/","name":"Gambia & Senegal Tours","description":"Just another Astra Starter Templates site","publisher":{"@id":"https:\/\/gambiaandsenegaltours.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gambiaandsenegaltours.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/gambiaandsenegaltours.com\/nl\/#organization","name":"Gambia & Senegal Tours","url":"https:\/\/gambiaandsenegaltours.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/gambiaandsenegaltours.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/gambiaandsenegaltours.com\/wp-content\/uploads\/2026\/01\/WhatsApp-Image-2025-12-20-at-02.22.50-e1767828334978.jpeg","contentUrl":"https:\/\/gambiaandsenegaltours.com\/wp-content\/uploads\/2026\/01\/WhatsApp-Image-2025-12-20-at-02.22.50-e1767828334978.jpeg","width":816,"height":746,"caption":"Gambia & Senegal Tours"},"image":{"@id":"https:\/\/gambiaandsenegaltours.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/httl.gambiaandsenegaltours"]}]}},"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/pages\/4620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/comments?post=4620"}],"version-history":[{"count":11,"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/pages\/4620\/revisions"}],"predecessor-version":[{"id":4756,"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/pages\/4620\/revisions\/4756"}],"wp:attachment":[{"href":"https:\/\/gambiaandsenegaltours.com\/nl\/wp-json\/wp\/v2\/media?parent=4620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}