{"id":4733,"date":"2026-08-12T13:34:05","date_gmt":"2026-08-12T04:34:05","guid":{"rendered":"https:\/\/www.travel-network-act.co.jp\/local\/?page_id=4733"},"modified":"2026-08-12T14:58:47","modified_gmt":"2026-08-12T05:58:47","slug":"book-now","status":"publish","type":"page","link":"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/","title":{"rendered":"Book Your Experience"},"content":{"rendered":"\n<style>\n\/* \u30c6\u30fc\u30de(Lightning)\u5074\u306b\u3082\u540c\u540d\u306e\u6c4e\u7528\u30af\u30e9\u30b9(.page-header\u7b49)\u304c\u3042\u308a\u3001\u8a73\u7d30\u5ea6\u304c\u540c\u70b9\u307e\u305f\u306f\n   \u305d\u308c\u4ee5\u4e0a\u306e\u305f\u3081\u30bd\u30fc\u30b9\u9806\u30fb\u8a73\u7d30\u5ea6\u6b21\u7b2c\u3067\u30c6\u30fc\u30de\u306e\u30eb\u30fc\u30eb(min-height:360px\u306e\u30d2\u30fc\u30ed\u30fc\u7528\u30b9\u30bf\u30a4\u30eb\u7b49)\u304c\n   \u52dd\u3063\u3066\u3057\u307e\u3046\u4e8b\u6545\u304c\u3042\u3063\u305f\u3002all:revert + \u3053\u306e\u30d5\u30a1\u30a4\u30eb\u5168\u4f53\u306e !important \u3067\u30c6\u30fc\u30de\u5074\u3092\u78ba\u5b9f\u306b\u906e\u65ad\u3059\u308b\u3002 *\/\n.booking-embed, .booking-embed * { all: revert !important; box-sizing: border-box !important; margin: 0 !important; padding: 0 !important; }\n\/* revert\u5f8c\u3001[hidden] \u5c5e\u6027\u306b\u3088\u308bdisplay:none\u3082\u540c\u3058\u7406\u7531\u3067\u660e\u793a\u3057\u3066\u304a\u304f\u3002 *\/\n.booking-embed [hidden] { display: none !important; }\n\n.booking-embed * { box-sizing: border-box !important; margin: 0 !important; padding: 0 !important; }\n\n.booking-embed { font-family: 'Helvetica Neue', Arial, sans-serif !important; background: #f0f7fa !important; color: #1f3a4a !important; padding: 16px !important; font-size: 15px !important; line-height: 1.45 !important; color-scheme: light only !important; }\n.booking-embed, .booking-embed * { color-scheme: light only !important; }\n\n.booking-embed .booking-wrap { max-width: 640px !important; margin: 0 auto !important; }\n\n\/* \u30c6\u30fc\u30de\u3068\u306e\u517c\u306d\u5408\u3044\u3067\u3001\u898b\u305f\u76ee\u4e0a\u306e\u30dc\u30c3\u30af\u30b9\u3068\u306f\u7121\u95a2\u4fc2\u306b\u30af\u30ea\u30c3\u30af\u5224\u5b9a\u3060\u3051\u304c\u3053\u306e\u898b\u51fa\u3057\u306b\u6b8b\u3063\u3066\u3057\u307e\u3044\u3001\n   \u4e0b\u306e\u30dc\u30bf\u30f3\u7fa4\u3092\u8986\u3063\u3066\u30af\u30ea\u30c3\u30af\u4e0d\u80fd\u306b\u3059\u308b\u4e8b\u6545\u304c\u3042\u3063\u305f\u3002\u898b\u51fa\u3057\u306f\u30c6\u30ad\u30b9\u30c8\u8868\u793a\u306e\u307f\u306a\u306e\u3067\n   pointer-events:none \u3067\u5b8c\u5168\u306b\u30af\u30ea\u30c3\u30af\u5224\u5b9a\u304b\u3089\u5916\u3059\u3002 *\/\n.booking-embed .page-header { text-align: center !important; margin-bottom: 18px !important; pointer-events: none !important; }\n.booking-embed .page-title { font-size: 1.5rem !important; font-weight: 700 !important; color: #1f3a4a !important; }\n.booking-embed .page-subtitle { font-size: 0.9rem !important; color: #5b7280 !important; margin-top: 4px !important; }\n\n.booking-embed .card { background: #fff !important; border-radius: 16px !important; box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08) !important; padding: 20px !important; }\n\n.booking-embed .block { padding: 14px 0 !important; border-top: 1px solid #eef3f5 !important; }\n.booking-embed .block:first-child { border-top: none !important; padding-top: 0 !important; }\n\n.booking-embed .step-title { font-size: 0.8rem !important; text-transform: uppercase !important; letter-spacing: 0.6px !important; color: #5b7280 !important; margin: 4px 0 10px !important; }\n\n.booking-embed .choices { display: flex !important; flex-wrap: wrap !important; gap: 10px !important; }\n.booking-embed .choices.times { gap: 8px !important; }\n\n.booking-embed .choice { border: 1.5px solid #d7e3e8 !important; background: #fff !important; color: #1f3a4a !important; border-radius: 12px !important; padding: 11px 16px !important; font-size: 0.95rem !important; cursor: pointer !important; transition: all 0.15s ease !important; display: inline-flex !important; flex-direction: column !important; gap: 2px !important; line-height: 1.25 !important; }\n.booking-embed .choice:hover:not(.disabled) { border-color: #009efd !important; }\n.booking-embed .choice.selected { border-color: transparent !important; background: linear-gradient(135deg, #2af598, #009efd) !important; color: #fff !important; box-shadow: 0 4px 10px rgba(0, 158, 253, 0.3) !important; }\n.booking-embed .choice.selected .muted { color: rgba(255, 255, 255, 0.85) !important; }\n.booking-embed .choice.disabled { opacity: 0.4 !important; cursor: not-allowed !important; }\n.booking-embed .choice.plan { align-items: flex-start !important; min-width: 200px !important; }\n.booking-embed .choice.time { padding: 9px 14px !important; font-variant-numeric: tabular-nums !important; align-items: center !important; }\n.booking-embed .choice.time .time-main { font-size: 0.95rem !important; font-weight: 600 !important; }\n.booking-embed .choice.time .pickup-sub { font-size: 0.7rem !important; color: #5b7280 !important; font-variant-numeric: tabular-nums !important; }\n.booking-embed .choice.time.selected .pickup-sub { color: rgba(255, 255, 255, 0.9) !important; }\n\n.booking-embed .muted { color: #5b7280 !important; font-size: 0.85rem !important; }\n.booking-embed .small { font-size: 0.8rem !important; }\n\n.booking-embed .people-row input, .booking-embed .field input { width: 100% !important; border: 1.5px solid #d7e3e8 !important; border-radius: 10px !important; padding: 10px 12px !important; font-size: 1rem !important; color: #1f3a4a !important; }\n.booking-embed .people-row input { width: 110px !important; }\n.booking-embed .people-row input:focus, .booking-embed .field input:focus { outline: none !important; border-color: #009efd !important; }\n\n.booking-embed .field { display: block !important; margin-bottom: 10px !important; }\n.booking-embed .field-label { display: block !important; font-size: 0.82rem !important; color: #5b7280 !important; margin-bottom: 4px !important; }\n\n.booking-embed .summary { background: #f7fbfc !important; border-radius: 12px !important; margin-top: 8px !important; padding: 16px !important; border-top: none !important; }\n.booking-embed .sum-row { display: flex !important; justify-content: space-between !important; padding: 5px 0 !important; border-bottom: 1px dashed #e3edf0 !important; }\n.booking-embed .sum-row:last-child { border-bottom: none !important; }\n.booking-embed .sum-row span { color: #5b7280 !important; }\n\n.booking-embed .submit { width: 100% !important; margin-top: 14px !important; border: none !important; border-radius: 12px !important; padding: 14px !important; font-size: 1.05rem !important; font-weight: 700 !important; color: #fff !important; cursor: pointer !important; background: linear-gradient(135deg, #2af598, #009efd) !important; box-shadow: 0 6px 14px rgba(0, 158, 253, 0.35) !important; }\n.booking-embed .submit:disabled { background: #c5d3da !important; box-shadow: none !important; cursor: not-allowed !important; }\n\n.booking-embed .status { margin-top: 10px !important; text-align: center !important; color: #c0392b !important; font-size: 0.9rem !important; min-height: 1em !important; }\n\n.booking-embed .done { text-align: center !important; padding: 36px 20px !important; }\n.booking-embed .done-check { width: 56px !important; height: 56px !important; line-height: 56px !important; margin: 0 auto 12px !important; border-radius: 50% !important; color: #fff !important; font-size: 1.6rem !important; background: linear-gradient(135deg, #2af598, #009efd) !important; }\n.booking-embed .done h2 { color: #1f3a4a !important; margin-bottom: 8px !important; }\n.booking-embed .done p { margin: 4px 0 !important; }\n\n\/* PayPal \u304a\u652f\u6255\u3044\u30dc\u30bf\u30f3\uff08\u5b8c\u4e86\u753b\u9762\uff09 *\/\n.booking-embed .pay-btn { display: block !important; width: 100% !important; margin-top: 18px !important; padding: 15px !important; border-radius: 12px !important; font-size: 1.1rem !important; font-weight: 700 !important; color: #fff !important; text-decoration: none !important; background: linear-gradient(135deg, #0070ba, #003087) !important; box-shadow: 0 6px 14px rgba(0, 112, 186, 0.35) !important; }\n.booking-embed .pay-btn:hover { filter: brightness(1.06) !important; }\n\n\/* ---- \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u7528 \u6708\u30ab\u30ec\u30f3\u30c0\u30fc ---- *\/\n.booking-embed .cal-head { display: flex !important; align-items: center !important; justify-content: space-between !important; margin-bottom: 10px !important; }\n.booking-embed .cal-title { font-size: 1rem !important; font-weight: 700 !important; color: #1f3a4a !important; }\n.booking-embed .cal-nav { border: 1.5px solid #d7e3e8 !important; background: #fff !important; color: #1f3a4a !important; border-radius: 10px !important; width: 40px !important; height: 36px !important; font-size: 1.2rem !important; line-height: 1 !important; cursor: pointer !important; transition: all 0.15s ease !important; }\n.booking-embed .cal-nav:hover:not(:disabled) { border-color: #009efd !important; }\n.booking-embed .cal-nav:disabled { opacity: 0.35 !important; cursor: not-allowed !important; }\n\n.booking-embed .cal-grid { display: grid !important; grid-template-columns: repeat(7, 1fr) !important; gap: 6px !important; }\n.booking-embed .cal-dow { margin-bottom: 4px !important; }\n.booking-embed .cal-dowcell { text-align: center !important; font-size: 0.7rem !important; color: #5b7280 !important; padding: 2px 0 !important; }\n\n.booking-embed .cal-cell { aspect-ratio: 1 \/ 1 !important; border: 1.5px solid #d7e3e8 !important; background: #fff !important; color: #1f3a4a !important; border-radius: 10px !important; font-size: 0.9rem !important; font-variant-numeric: tabular-nums !important; cursor: pointer !important; transition: all 0.15s ease !important; padding: 0 !important; }\n.booking-embed .cal-cell.empty, .booking-embed .cal-cell.out { border: none !important; background: transparent !important; cursor: default !important; }\n.booking-embed .cal-cell.closed { color: #c5d3da !important; background: #f7fbfc !important; cursor: not-allowed !important; }\n.booking-embed .cal-cell.open:hover { border-color: #009efd !important; }\n.booking-embed .cal-cell.open { border-color: #2af598 !important; box-shadow: inset 0 0 0 1px rgba(42, 245, 152, 0.35) !important; font-weight: 600 !important; }\n.booking-embed .cal-cell.today { position: relative !important; }\n.booking-embed .cal-cell.today::after { content: '' !important; position: absolute !important; bottom: 5px !important; left: 50% !important; transform: translateX(-50%) !important; width: 4px !important; height: 4px !important; border-radius: 50% !important; background: #009efd !important; }\n.booking-embed .cal-cell.selected { border-color: transparent !important; color: #fff !important; box-shadow: 0 4px 10px rgba(0, 158, 253, 0.3) !important; background: linear-gradient(135deg, #2af598, #009efd) !important; }\n.booking-embed .cal-cell.selected.today::after { background: #fff !important; }\n\n\/* ---- \u30c4\u30a2\u30fc\u7528\u300cSee more dates\u300d\u30c8\u30b0\u30eb\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u4ee5\u5916\u306e\u30ab\u30ec\u30f3\u30c0\u30fc\u5c55\u958b\uff09 ---- *\/\n.booking-embed .link-toggle { background: none !important; border: none !important; color: #009efd !important; font-size: 0.85rem !important; cursor: pointer !important; padding: 6px 2px !important; text-decoration: underline !important; }\n.booking-embed .tour-calendar { margin-top: 10px !important; width: 100% !important; }\n\n\/* ---- \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6848\u5185 ---- *\/\n.booking-embed .maint-notice { text-align: center !important; padding: 20px 8px !important; }\n.booking-embed .maint-notice h3 { font-size: 1.15rem !important; color: #1f3a4a !important; margin-bottom: 10px !important; }\n.booking-embed .maint-notice p { margin: 6px 0 !important; }\n\n<\/style>\n<div class=\"booking-embed\">\n  <div class=\"booking-wrap\">\n    <header class=\"page-header\">\n      <div class=\"page-title\">Book Your Experience<\/div>\n      <div class=\"page-subtitle\">Algueblue Thalassotherapy Spa &middot; e-bike Tours &middot; Himeji Castle Guide &middot; Afternoon Craft Tour<\/div>\n    <\/header>\n\n    <div id=\"form-body\" class=\"card\">\n      <section class=\"block\">\n        <h3 class=\"step-title\">What would you like to book?<\/h3>\n        <div id=\"activities\" class=\"choices\"><\/div>\n      <\/section>\n\n      <section id=\"date-section\" class=\"block\" hidden>\n        <h3 class=\"step-title\">Choose a date<\/h3>\n        <div id=\"dates\" class=\"choices\"><\/div>\n      <\/section>\n\n      <section id=\"details-section\" class=\"block\" hidden><\/section>\n\n      <section id=\"summary-section\" class=\"block summary\" hidden>\n        <h3 class=\"step-title\">Summary<\/h3>\n        <div id=\"summary\"><\/div>\n        <button id=\"submit-btn\" type=\"button\" class=\"submit\" disabled>Confirm booking<\/button>\n        <div id=\"status\" class=\"status\"><\/div>\n        <p class=\"muted small\">No payment is taken now &mdash; you pay on site.<\/p>\n        <p class=\"muted small\" id=\"privacy-note\"><\/p>\n      <\/section>\n    <\/div>\n\n    <div id=\"done\" class=\"card done\" hidden><\/div>\n  <\/div>\n<\/div>\n<script>\n\/* Unified booking form (Algueblue + cycling + Himeji castle).\n * Talks to the Apps Script Web App: GET ?action=availability \/ POST (text\/plain JSON).\n * Deploy the Web App, then paste its \/exec URL below. *\/\nconst WEBAPP_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbyL_cqU6-SkSg7yNXCSterbVFVM4lPp8d6W4mJQyvXKSh7Qqu2Njsr_pPz11v8rvJw\/exec';\n\n\/\/ \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306e\u300c\u5148\u306e\u4e88\u7d04\u300d\u3067\u8868\u793a\u3059\u308b\u65e5\u6570\uff08\u4eca\u65e5\u304b\u3089 HORIZON_DAYS \u65e5\u5148\u307e\u3067\uff09\u3002GAS \u306e algueblueOpenDays \u3068\u63c3\u3048\u308b\u3002\nconst HORIZON_DAYS = 30;\n\n\/\/ \u25bc\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u7528\u30b9\u30a4\u30c3\u30c1\u3002true \u306e\u9593\u306f\u300c\u505c\u6b62\u5bfe\u8c61\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u300d\u3060\u3051\u7533\u8fbc\u3092\u6b62\u3081\u3001\u6848\u5185\u3092\u8868\u793a\u3059\u308b\u3002\n\/\/   \u30c4\u30a2\u30fc\u7b49\u306f\u901a\u5e38\u3069\u304a\u308a\u53d7\u4ed8\u3002\u4f5c\u696d\u304c\u7d42\u308f\u3063\u305f\u3089 false \u306b\u623b\u3057\u3066 push \u3059\u308c\u3070\u901a\u5e38\u904b\u7528\u306b\u5fa9\u5e30\u3059\u308b\u3002\nconst MAINTENANCE = false;\n\/\/ \u505c\u6b62\u5bfe\u8c61\uff08activityKind \u306e\u5024\uff09\u3002\u4eca\u56de\u306f\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306e\u307f\u505c\u6b62\u3002\nconst MAINTENANCE_KINDS = ['algueblue'];\nconst MAINTENANCE_MSG =\n  '<h3>\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306f\u305f\u3060\u3044\u307e\u4e88\u7d04\u8abf\u6574\u4e2d\u3067\u3059<\/h3>'\n  + '<p>\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306e\u30aa\u30f3\u30e9\u30a4\u30f3\u4e88\u7d04\u3092\u4e00\u6642\u7684\u306b\u505c\u6b62\u3057\u3066\u3044\u307e\u3059\u3002\u3054\u4e0d\u4fbf\u3092\u304a\u304b\u3051\u3057\u307e\u3059\u304c\u3001\u5c11\u3057\u6642\u9593\u3092\u304a\u3044\u3066\u518d\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002<\/p>'\n  + '<p class=\"muted\">Algueblue online booking is temporarily paused. Please try again a little later.<\/p>'\n  + '<p class=\"muted small\">\u304a\u6025\u304e\u306e\u5834\u5408 \/ Urgent: WhatsApp +81 70-2013-1181 \u30fb comecomehimeji@gmail.com<\/p>';\n\n\/\/ \u30d7\u30ec\u30d3\u30e5\u30fc\u7528\u30d0\u30a4\u30d1\u30b9\uff1a?preview=algueblue2026 \u4ed8\u304dURL\u306e\u6642\u3060\u3051\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u3092\u7121\u8996\uff08\u672c\u4eba\u78ba\u8a8d\u7528\uff09\u3002\n\/\/   \u4e00\u822c\u306e\u304a\u5ba2\u69d8\u306b\u306f\u5f15\u304d\u7d9a\u304d\u30e1\u30f3\u30c6\u8868\u793a\u3002\u516c\u958b\u6642\u306f\u3053\u306e\u5408\u8a00\u8449\u4ed8\u304dURL\u3092\u5171\u6709\u3057\u306a\u3051\u308c\u3070\u3088\u3044\u3002\nfunction maintenanceBypassed() { return new URLSearchParams(location.search).get('preview') === 'algueblue2026'; }\n\n\/\/ \u9078\u629e\u4e2d\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u304c\u505c\u6b62\u5bfe\u8c61\u304b\nfunction activityUnderMaintenance() { return MAINTENANCE && !maintenanceBypassed() && MAINTENANCE_KINDS.indexOf(activityKind()) !== -1; }\n\nconst ACTIVITIES = [\n  \/\/ maxPeople: \u4e88\u7d04\u30d5\u30a9\u30fc\u30e0\u3067\u9078\u3079\u308b\u4eba\u6570\u306e\u4e0a\u9650\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306f\u500b\u5ba4\u306e\u305f\u30812\u540d\uff09\u3002\n  \/\/ minPeople: \u4e88\u7d04\u30d5\u30a9\u30fc\u30e0\u3067\u9078\u3079\u308b\u4eba\u6570\u306e\u4e0b\u9650\uff08\u672a\u6307\u5b9a\u306f1\uff09\u3002\u5348\u5f8c\u5de5\u82b8\u30c4\u30a2\u30fc\u306f\u30ac\u30a4\u30c91\u540d\u304c\u6700\u59276\u540d\u3092\u5f15\u7387\u3059\u308b\u5c11\u4eba\u6570\u5236\u306e\u305f\u3081\u6700\u5c112\u540d\u3002\n  { code: 'algueblue',    label: 'Thalassotherapy Spa (Algueblue)', kind: 'algueblue', maxPeople: 2 },\n  { code: 'ebike-castle', label: 'e-bike Ride around the Castle',    kind: 'tour', maxPeople: 4 },\n  { code: 'ebike-sea',    label: 'e-bike Ride to the Sea',          kind: 'tour', maxPeople: 4 },\n  { code: 'castle-guide', label: 'Himeji Castle Guide Tour',         kind: 'tour', maxPeople: 8 },\n  { code: 'craft-course1', label: 'Afternoon Craft Tour \u2014 Calligraphy + Wagashi Making', kind: 'tour', maxPeople: 6, minPeople: 2 },\n  { code: 'craft-course2', label: 'Afternoon Craft Tour \u2014 Calligraphy + Gold Leaf Application', kind: 'tour', maxPeople: 6, minPeople: 2 },\n  { code: 'craft-course3', label: 'Afternoon Craft Tour \u2014 Indigo Dyeing + Gold Leaf Application', kind: 'tour', maxPeople: 6, minPeople: 2 },\n];\n\nconst state = {\n  availability: null,   \/\/ \u65e5\u4ed8\u30ad\u30e3\u30c3\u30b7\u30e5 { 'YYYY-MM-DD': { algueblue, tours } }\uff08\u521d\u671f\u306f\u4eca\u65e5\u30fb\u660e\u65e5\u3002\u5148\u306e\u65e5\u306f\u30af\u30ea\u30c3\u30af\u6642\u306b\u5358\u65e5\u8ffd\u52a0\uff09\n  dates: [],            \/\/ \u30c4\u30a2\u30fc\u7528\u306e\u65e5\u4ed8\uff08today, tomorrow\uff09\n  openDays: [],         \/\/ \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306e\u4e88\u7d04\u5019\u88dc\u65e5\uff08\u51fa\u52e4\u4e88\u5b9a\u3042\u308a\uff06\u4f11\u696d\u3067\u306a\u3044\u65e5\uff09'YYYY-MM-DD' \u306e\u914d\u5217\n  tourOpenDays: {},     \/\/ \u30c4\u30a2\u30fc\u7528\u306e\u4e88\u7d04\u5019\u88dc\u65e5\u30ad\u30e3\u30c3\u30b7\u30e5 { activityCode: ['YYYY-MM-DD', ...] }\uff08\u300cSee more dates\u300d\u3067\u53d6\u5f97\uff09\n  showTourCalendar: false, \/\/ \u30c4\u30a2\u30fc\u3067\u300cSee more dates\u300d\u3092\u958b\u3044\u3066\u3044\u308b\u304b\n  calMonth: null,       \/\/ \u30ab\u30ec\u30f3\u30c0\u30fc\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u30fb\u30c4\u30a2\u30fc\u5171\u901a\uff09\u3067\u8868\u793a\u4e2d\u306e\u6708 {y, m(0-11)}\n  presetPlan: null,     \/\/ ?plan= \u3067\u6765\u305f\u30d7\u30e9\u30f3\uff08WP\u306e\u30d7\u30e9\u30f3\u30dc\u30bf\u30f3\u304b\u3089\uff09\n  activity: null,\n  date: null,\n  plan: null, option: null, start: null,  \/\/ Algueblue: plan\/option\/start; tours: start\n  pickup: null,                            \/\/ Algueblue: pickup hotel\n  height: '',                              \/\/ e-bike tours: rider height(s)\n  people: 1,\n};\n\nconst $ = (sel) => document.querySelector(sel);\nconst el = (tag, cls, html) => { const e = document.createElement(tag); if (cls) e.className = cls; if (html != null) e.innerHTML = html; return e; };\nconst esc = (s) => String(s).replace(\/[&<>\"']\/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n\n\/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u65b9\u91dd\uff1a\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306e\u307f\u65e5\u672c\u8a9e\uff0b\u82f1\u8a9e\u4f75\u8a18\u3002\u30c4\u30a2\u30fc\u306f\u82f1\u8a9e\u306e\u307f\u3002\nconst isAlg = () => activityKind() === 'algueblue';\nconst bi = (ja, en) => isAlg() ? (ja + ' \/ ' + en) : en;\n\n\/\/ PayPal.Me \u53d7\u53d6\u30ea\u30f3\u30af\uff08\u672b\u5c3e\u306b\u91d1\u984d\u3092\u4ed8\u3051\u3066\u4f7f\u3046\u3002\u4f8b ...\/44000JPY\uff09\u3002\u4f1a\u793e\u30a2\u30ab\u30a6\u30f3\u30c8 @himejiact\u3002\nconst PAYPAL_ME = 'https:\/\/paypal.me\/himejiact\/';\n\n\/\/ \u3053\u306e\u4e88\u7d04\u306e\u5408\u8a08\u91d1\u984d\uff08\u5186\uff09\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9(booking_webapp.gs)\u3068\u540c\u3058\u8a08\u7b97\u5f0f\u306b\u3059\u308b\uff1a\n\/\/   \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\uff1d\u30d7\u30e9\u30f3\u5358\u4fa1\u00d7\u4eba\u6570\uff08soloPrice\u306a\u3057\uff09\uff0f\u30c4\u30a2\u30fc\uff1d1\u540d\u306fsoloPrice\u30fb2\u540d\u4ee5\u4e0a\u306f\u5358\u4fa1\u00d7\u4eba\u6570\u3002\nfunction bookingTotalYen() {\n  if (!state.date || !state.availability || !state.availability[state.date]) return null;\n  const day = state.availability[state.date];\n  const ppl = Math.max(1, Number(state.people) || 1);\n  if (activityKind() === 'algueblue') {\n    const plan = day.algueblue && day.algueblue.plans && day.algueblue.plans[state.plan];\n    if (!plan || plan.price == null) return null;\n    return plan.price * ppl;\n  }\n  const tour = day.tours && day.tours[state.activity];\n  if (!tour || tour.pricePerPerson == null) return null;\n  return (ppl === 1 && tour.soloPrice) ? tour.soloPrice : tour.pricePerPerson * ppl;\n}\n\n\/\/ \u4e88\u7d04\u65e5\u304c\u300c\u5f53\u65e5\uff08\u4eca\u65e5\uff09\u300d\u304b\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u7531\u6765\u306e state.dates[0]\uff08\u4eca\u65e5, JST\u57fa\u6e96\uff09\u3068\u6bd4\u8f03\u3059\u308b\u306e\u3067\u7aef\u672bTZ\u306b\u4f9d\u5b58\u3057\u306a\u3044\u3002\n\/\/ \u5f53\u65e5\u306e\u307f\u73fe\u5730\u6255\u3044\u3082\u53ef\uff08\u6642\u9593\u304c\u7121\u304f\u3001PayPal\u672a\u767b\u9332\uff0f\u8acb\u6c42\u66f8\u9001\u4ed8\u304c\u9593\u306b\u5408\u308f\u306a\u3044\u30b1\u30fc\u30b9\u306e\u6551\u6e08\uff09\u3002\nfunction isSameDay() {\n  return !!(state.date && state.dates && state.dates.length && state.date === state.dates[0]);\n}\n\n\/\/ \u5171\u6709\u306e\u9759\u7684\u30c6\u30ad\u30b9\u30c8\uff08\u65e5\u4ed8\u9078\u629e\u30fbSummary\u30fb\u78ba\u5b9a\u30dc\u30bf\u30f3\u7b49\uff09\u3092\u3001\u9078\u629e\u4e2d\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306b\u5408\u308f\u305b\u3066\u5207\u66ff\u3002\nfunction updateChrome() {\n  const alg = isAlg();\n  const dateH = document.querySelector('#date-section .step-title');\n  if (dateH) dateH.textContent = alg ? '\u65e5\u4ed8\u3092\u9078\u629e \/ Choose a date' : 'Choose a date';\n  const sumH = document.querySelector('#summary-section .step-title');\n  if (sumH) sumH.textContent = alg ? '\u3054\u4e88\u7d04\u5185\u5bb9 \/ Summary' : 'Summary';\n  const btn = $('#submit-btn');\n  if (btn) btn.textContent = alg ? '\u4e88\u7d04\u3059\u308b \/ Confirm booking' : 'Confirm booking';\n  const pay = document.querySelector('#summary-section .muted.small');\n  if (pay) {\n    let t = alg\n      ? '\u3054\u78ba\u5b9a\u5f8c\u3001\u6b21\u306e\u753b\u9762\u3067PayPal\u306b\u3066\u304a\u652f\u6255\u3044\u3044\u305f\u3060\u3051\u307e\u3059\u3002\u3054\u5165\u91d1\u306e\u78ba\u8a8d\u3092\u3082\u3063\u3066\u3054\u4e88\u7d04\u5b8c\u4e86\u3068\u306a\u308a\u307e\u3059\u3002 \/ After you confirm, you can pay by PayPal on the next screen. Your booking is complete once we receive your payment.'\n      : 'After you confirm, you can pay by PayPal on the next screen. Your booking is complete once we receive your payment.';\n    if (isSameDay()) t += alg\n      ? '\u3000\u5f53\u65e5\u306e\u3054\u4e88\u7d04\u306b\u9650\u308a\u3001\u5f53\u65e5\u73fe\u5730\u3067\u306e\u304a\u652f\u6255\u3044\u3082\u53ef\u80fd\u3067\u3059\u3002 \/ For same-day bookings, you may also pay on site.'\n      : ' For same-day bookings, you may also pay on site.';\n    pay.textContent = t;\n  }\n  const priv = $('#privacy-note');\n  if (priv) priv.textContent = alg\n    ? '\u3054\u5165\u529b\u306e\u500b\u4eba\u60c5\u5831\uff08\u304a\u540d\u524d\u30fb\u3054\u9023\u7d61\u5148\u306a\u3069\uff09\u306f\u3001\u3054\u4e88\u7d04\u306e\u53d7\u4ed8\u30fb\u78ba\u8a8d\u306e\u3054\u9023\u7d61\u306b\u306e\u307f\u4f7f\u7528\u3057\u3001\u6cd5\u4ee4\u306b\u57fa\u3065\u304f\u5834\u5408\u3092\u9664\u304d\u7b2c\u4e09\u8005\u3078\u63d0\u4f9b\u3057\u307e\u305b\u3093\u3002\u30c7\u30fc\u30bf\u306fGoogle\u306e\u30b5\u30fc\u30d3\u30b9\u4e0a\u306b\u5b89\u5168\u306b\u4fdd\u7ba1\u3057\u307e\u3059\u3002\u304a\u554f\u3044\u5408\u308f\u305b\uff1acomecomehimeji@gmail.com\uff08\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff09 \/ The personal information you provide is used only to process and confirm your booking; we do not share it with third parties except as required by law. Data is stored securely on Google. Contact: comecomehimeji@gmail.com (ACT Co., Ltd.).'\n    : 'The personal information you provide (name and contact details) is used only to process and confirm your booking. We do not share it with third parties except as required by law. Your data is stored securely on Google services. Contact: comecomehimeji@gmail.com (ACT Co., Ltd.).';\n}\n\nfunction fmtDateLabel(dateStr, idx) {\n  const [y, m, d] = dateStr.split('-').map(Number);\n  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n  const rel = idx === 0 ? 'Today' : idx === 1 ? 'Tomorrow' : '';\n  return (rel ? rel + ' \u00b7 ' : '') + months[m - 1] + ' ' + d;\n}\n\n\/\/ \"HH:mm\" \u304b\u3089 min \u5206\u3092\u5f15\u3044\u305f \"HH:mm\"\uff08\u304a\u8fce\u3048\u6642\u523b\u306e\u76ee\u5b89\u8868\u793a\u306b\u4f7f\u7528\uff09\nfunction subtractMinutes(hhmm, min) {\n  const [h, m] = String(hhmm).split(':').map(Number);\n  let total = h * 60 + m - Number(min);\n  if (total < 0) total = 0;\n  const hh = Math.floor(total \/ 60), mm = total % 60;\n  return ('0' + hh).slice(-2) + ':' + ('0' + mm).slice(-2);\n}\n\nasync function init() {\n  const qs = new URLSearchParams(location.search);\n\n  \/\/ \u5148\u6255\u3044\u5236\uff08PayPal Orders v2\uff09\u304b\u3089\u306e\u623b\u308a\u3002\u901a\u5e38\u306e\u30a6\u30a3\u30b6\u30fc\u30c9\u306f\u51fa\u3055\u305a\u3001\u5c02\u7528\u306e\u753b\u9762\u3060\u3051\u8868\u793a\u3059\u308b\u3002\n  if (qs.get('cancelled') === '1') { showPaymentCancelled(); return; }\n  if (qs.get('paypalReturn') === '1' && qs.get('token')) { showPaymentPendingConfirmation(); return; }\n\n  \/\/ \u4eca\u65e5\u30fb\u660e\u65e5\u30da\u30fc\u30b8\u306e\u30ab\u30fc\u30c9\u3084 WP\u306e\u30d7\u30e9\u30f3\u30dc\u30bf\u30f3\u304b\u3089 activity \/ date \/ plan \u3092\u5f15\u304d\u7d99\u3044\u3067\u4e8b\u524d\u9078\u629e\n  const preset = qs.get('activity');\n  if (preset && ACTIVITIES.some((a) => a.code === preset)) state.activity = preset;\n  state.presetDate = qs.get('date') || null;\n  const presetPlan = qs.get('plan');\n  if (presetPlan && ['plan01', 'plan02', 'plan03'].indexOf(presetPlan) !== -1) state.presetPlan = presetPlan;\n  renderActivities();\n  try {\n    \/\/ \u4eca\u65e5\u30fb\u660e\u65e5\u306e\u7a7a\u304d\uff08\u5168\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u5171\u901a\uff09\u3068\u3001\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306e\u5019\u88dc\u65e5\uff0860\u65e5\u5206\uff09\u3092\u4e26\u884c\u53d6\u5f97\n    const [availRes, openRes] = await Promise.all([\n      fetch(WEBAPP_URL + '?action=availability', { cache: 'no-store' }),\n      fetch(WEBAPP_URL + '?action=algueblueOpenDays&days=' + HORIZON_DAYS, { cache: 'no-store' }).catch(() => null),\n    ]);\n    const data = await availRes.json();\n    if (!data.ok) throw new Error(data.error || 'load failed');\n    state.availability = data.days;              \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u4eca\u65e5\u30fb\u660e\u65e5\u3092\u6295\u5165\n    state.dates = Object.keys(data.days).sort(); \/\/ \u30c4\u30a2\u30fc\u7528\u306e\u65e5\u4ed8\u30ea\u30b9\u30c8\n    if (openRes) { try { const od = await openRes.json(); if (od && od.ok) state.openDays = od.openDays || []; } catch (e) { \/* \u5019\u88dc\u65e5\u304c\u53d6\u308c\u306a\u304f\u3066\u3082\u4eca\u65e5\u660e\u65e5\u306f\u52d5\u304f *\/ } }\n    \/\/ \u4e8b\u524d\u9078\u629e\u3092\u53cd\u6620\uff08\u4eca\u65e5\u30fb\u660e\u65e5\u306e\u30ab\u30fc\u30c9\u304b\u3089\u6765\u305f\u5834\u5408\u3002\u5148\u306e\u65e5\u4ed8\u306f presetDate \u306b\u6765\u306a\u3044\u60f3\u5b9a\uff09\n    if (state.activity && state.presetDate && state.availability[state.presetDate]) {\n      state.date = state.presetDate;\n      if (!isDateOpen(state.date)) state.date = null; \/\/ \u6e80\u5e2d\/\u4f11\u696d\u306a\u3089\u65e5\u4ed8\u9078\u629e\u306b\u623b\u3059\n    }\n    if (state.activity) {\n      renderDates();\n      if (state.date && !activityUnderMaintenance()) { maybePresetPlan(); renderDetails(); renderSummary(); }\n    }\n  } catch (err) {\n    $('#status').textContent = 'Could not load availability. Please try again later.';\n    console.error(err);\n  }\n}\n\n\/\/ ?plan= \u3067\u6765\u305f\u30d7\u30e9\u30f3\u3092\u3001\u305d\u306e\u65e5\u306b\u9078\u629e\u53ef\u80fd\u306a\u3089\u81ea\u52d5\u9078\u629e\u3059\u308b\uff08WP\u306e\u30d7\u30e9\u30f3\u30dc\u30bf\u30f3\u7528\uff09\nfunction maybePresetPlan() {\n  if (!state.presetPlan || state.plan) return;\n  if (activityKind() !== 'algueblue' || !state.date) return;\n  const day = state.availability[state.date];\n  const ab = day && day.algueblue;\n  if (ab && ab.plans && ab.plans[state.presetPlan] && ab.plans[state.presetPlan].open) {\n    state.plan = state.presetPlan;\n  }\n}\n\n\/* ---- Step 1: activity ---- *\/\nfunction renderActivities() {\n  const wrap = $('#activities');\n  wrap.innerHTML = '';\n  ACTIVITIES.forEach((a) => {\n    const b = el('button', 'choice' + (state.activity === a.code ? ' selected' : ''), esc(a.label));\n    b.type = 'button';\n    b.onclick = () => { Object.assign(state, { activity: a.code, date: null, plan: null, option: null, start: null, pickup: null, height: '', showTourCalendar: false, calMonth: null }); renderActivities(); renderDates(); renderDetails(); renderSummary(); };\n    wrap.appendChild(b);\n  });\n}\n\nfunction activityKind() { const a = ACTIVITIES.find((x) => x.code === state.activity); return a ? a.kind : null; }\n\/\/ \u9078\u629e\u4e2d\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306e\u4eba\u6570\u4e0a\u9650\uff08\u672a\u5b9a\u7fa9\u306a\u3089\u5f93\u6765\u3069\u304a\u308a20\uff09\u3002\nfunction activityMaxPeople() { const a = ACTIVITIES.find((x) => x.code === state.activity); return (a && a.maxPeople) || 20; }\n\/\/ \u9078\u629e\u4e2d\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306e\u4eba\u6570\u4e0b\u9650\uff08\u672a\u5b9a\u7fa9\u306a\u30891\u3002\u5348\u5f8c\u5de5\u82b8\u30c4\u30a2\u30fc\u306f\u5c11\u4eba\u6570\u5236\u306e\u305f\u30812\uff09\u3002\nfunction activityMinPeople() { const a = ACTIVITIES.find((x) => x.code === state.activity); return (a && a.minPeople) || 1; }\n\n\/* ---- Step 2: date ---- *\/\nfunction renderDates() {\n  const sec = $('#date-section');\n  const wrap = $('#dates');\n  wrap.innerHTML = '';\n  updateChrome();\n  if (!state.activity || !state.availability) { sec.hidden = true; return; }\n  sec.hidden = false;\n  \/\/ \u505c\u6b62\u5bfe\u8c61\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\uff09\u306f\u6848\u5185\u306e\u307f\u8868\u793a\u3057\u3001\u65e5\u4ed8\u30fb\u8a73\u7d30\u30fb\u78ba\u5b9a\u306f\u51fa\u3055\u306a\u3044\u3002\n  if (activityUnderMaintenance()) {\n    wrap.innerHTML = '<div class=\"maint-notice\">' + MAINTENANCE_MSG + '<\/div>';\n    $('#details-section').hidden = true;\n    $('#summary-section').hidden = true;\n    return;\n  }\n  \/\/ \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u306f\u300c\u5148\u306e\u4e88\u7d04\u300d\u5bfe\u5fdc\u306e\u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u3002\u30c4\u30a2\u30fc\u306f\u4eca\u65e5\u30fb\u660e\u65e5\u3092\u3059\u3050\u9078\u3079\u308b\u30dc\u30bf\u30f3\uff0b\u300cSee more dates\u300d\u3067\u540c\u3058\u30ab\u30ec\u30f3\u30c0\u30fc\u3092\u5c55\u958b\u3002\n  if (activityKind() === 'algueblue') { renderAlgueblueCalendar(wrap); return; }\n  renderTourDates(wrap);\n}\n\n\/\/ \u30c4\u30a2\u30fc\uff08e-bike\uff0f\u57ce\u30ac\u30a4\u30c9\uff0f\u5348\u5f8c\u5de5\u82b8\u30c4\u30a2\u30fc\uff09\u306e\u65e5\u4ed8\u9078\u629e\uff1a\u4eca\u65e5\u30fb\u660e\u65e5\u306f\u30dc\u30bf\u30f3\u3067\u5373\u9078\u629e\u3001\n\/\/ \u305d\u308c\u3088\u308a\u5148\u306f\u300cSee more dates\u300d\u3092\u62bc\u3059\u3068\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u3068\u540c\u3058\u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u304c\u5c55\u958b\u3055\u308c\u308b\u3002\nfunction renderTourDates(wrap) {\n  state.dates.forEach((d, idx) => {\n    const open = isDateOpen(d);\n    const b = el('button', 'choice' + (state.date === d ? ' selected' : '') + (open ? '' : ' disabled'), fmtDateLabel(d, idx));\n    b.type = 'button';\n    b.disabled = !open;\n    b.onclick = () => { Object.assign(state, { date: d, plan: null, option: null, start: null, pickup: null }); renderDates(); renderDetails(); renderSummary(); };\n    wrap.appendChild(b);\n  });\n\n  const toggle = el('button', 'link-toggle', state.showTourCalendar ? 'Hide calendar' : 'See more dates \u203a');\n  toggle.type = 'button';\n  toggle.onclick = () => { state.showTourCalendar = !state.showTourCalendar; renderDates(); };\n  wrap.appendChild(toggle);\n\n  if (state.showTourCalendar) {\n    const calWrap = el('div', 'tour-calendar');\n    wrap.appendChild(calWrap);\n    renderTourCalendar(calWrap);\n  }\n}\n\n\/* ---- \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u7528 \u6708\u30ab\u30ec\u30f3\u30c0\u30fc\uff08\u4eca\u65e5\u301cHORIZON_DAYS\u65e5\u5148\uff09 ---- *\/\nconst CAL_MONTHS_EN = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nconst CAL_DOW = ['\u65e5\/Su', '\u6708\/Mo', '\u706b\/Tu', '\u6c34\/We', '\u6728\/Th', '\u91d1\/Fr', '\u571f\/Sa'];\n\nconst todayYmd = () => dateToYmd(new Date());\nconst ymdToDate = (s) => { const [y, m, d] = s.split('-').map(Number); return new Date(y, m - 1, d); };\nconst dateToYmd = (dt) => dt.getFullYear() + '-' + ('0' + (dt.getMonth() + 1)).slice(-2) + '-' + ('0' + dt.getDate()).slice(-2);\nconst addDaysYmd = (s, n) => { const dt = ymdToDate(s); dt.setDate(dt.getDate() + n); return dateToYmd(dt); };\n\n\/\/ \u305d\u306e\u65e5\u304c\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u3067\u4e88\u7d04\u53ef\u80fd\u304b\u3002\u5019\u88dc\u65e5(openDays)\u306b\u3042\u308a\u3001\u304b\u3064\uff08\u30ad\u30e3\u30c3\u30b7\u30e5\u6e08\u3067\u6e80\u5e2d\u3068\u5224\u660e\u3057\u3066\u3044\u306a\u3044\uff09\nfunction isAlgueblueDayOpen(ds) {\n  if ((state.openDays || []).indexOf(ds) === -1) return false;\n  const cached = state.availability[ds];\n  if (cached && cached.algueblue && cached.algueblue.anyOpen === false) return false;\n  return true;\n}\n\n\/\/ \u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u5171\u901a\u63cf\u753b\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u30fb\u30c4\u30a2\u30fc\u517c\u7528\uff09\u3002isOpenFn(ds)\u3067\u958b\u3044\u3066\u3044\u308b\u65e5\u3092\u5224\u5b9a\u3057\u3001onSelect(ds)\u3067\u9078\u629e\u3059\u308b\u3002\nfunction renderCalendarGrid(wrap, isOpenFn, onSelect) {\n  const today = todayYmd();\n  const endYmd = addDaysYmd(today, HORIZON_DAYS - 1);\n  const todayD = ymdToDate(today), endD = ymdToDate(endYmd);\n  if (!state.calMonth) state.calMonth = { y: todayD.getFullYear(), m: todayD.getMonth() };\n  const y = state.calMonth.y, m = state.calMonth.m;\n\n  \/\/ \u6708\u79fb\u52d5\uff08\u8868\u793a\u7bc4\u56f2\uff1d\u4eca\u65e5\u306e\u6708\u301cHORIZON\u672b\u65e5\u306e\u6708\uff09\n  const prevAllowed = (y > todayD.getFullYear()) || (y === todayD.getFullYear() && m > todayD.getMonth());\n  const nextAllowed = (y < endD.getFullYear()) || (y === endD.getFullYear() && m < endD.getMonth());\n  const head = el('div', 'cal-head');\n  const prev = el('button', 'cal-nav', '\u2039'); prev.type = 'button'; prev.disabled = !prevAllowed;\n  prev.onclick = () => { state.calMonth = (m === 0) ? { y: y - 1, m: 11 } : { y: y, m: m - 1 }; renderDates(); };\n  const next = el('button', 'cal-nav', '\u203a'); next.type = 'button'; next.disabled = !nextAllowed;\n  next.onclick = () => { state.calMonth = (m === 11) ? { y: y + 1, m: 0 } : { y: y, m: m + 1 }; renderDates(); };\n  head.appendChild(prev);\n  head.appendChild(el('div', 'cal-title', (m + 1) + '\u6708 \/ ' + CAL_MONTHS_EN[m] + ' ' + y));\n  head.appendChild(next);\n  wrap.appendChild(head);\n\n  const dow = el('div', 'cal-grid cal-dow');\n  CAL_DOW.forEach((d) => dow.appendChild(el('div', 'cal-dowcell', d)));\n  wrap.appendChild(dow);\n\n  const grid = el('div', 'cal-grid');\n  const startPad = new Date(y, m, 1).getDay();\n  const daysInMonth = new Date(y, m + 1, 0).getDate();\n  for (let i = 0; i < startPad; i++) grid.appendChild(el('div', 'cal-cell empty'));\n  for (let dnum = 1; dnum <= daysInMonth; dnum++) {\n    const ds = dateToYmd(new Date(y, m, dnum));\n    const inRange = ds >= today && ds <= endYmd;\n    const open = inRange && isOpenFn(ds);\n    const cls = 'cal-cell' + (inRange ? (open ? ' open' : ' closed') : ' out')\n      + (state.date === ds ? ' selected' : '') + (ds === today ? ' today' : '');\n    const cell = el('button', cls, String(dnum));\n    cell.type = 'button';\n    cell.disabled = !open;\n    if (open) cell.onclick = () => onSelect(ds);\n    grid.appendChild(cell);\n  }\n  wrap.appendChild(grid);\n}\n\nfunction renderAlgueblueCalendar(wrap) {\n  renderCalendarGrid(wrap, isAlgueblueDayOpen, selectAlgueblueDate);\n  if (!(state.openDays || []).length) {\n    wrap.appendChild(el('p', 'muted small',\n      '\u73fe\u5728\u3054\u4e88\u7d04\u3044\u305f\u3060\u3051\u308b\u65e5\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u30ab\u30ec\u30f3\u30c0\u30fc\u306b\u30b9\u30bf\u30c3\u30d5\u306e\u51fa\u52e4\u4e88\u5b9a\u304c\u5165\u308a\u6b21\u7b2c\u3001\u3053\u3053\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002 \/ No open dates yet \u2014 dates appear once staff shifts are added to the calendar.'));\n  }\n}\n\n\/\/ \u30c4\u30a2\u30fc\u7528\u300cSee more dates\u300d\u30ab\u30ec\u30f3\u30c0\u30fc\u3002\u9078\u629e\u4e2d\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306e\u5019\u88dc\u65e5\u3092\u521d\u56de\u3060\u3051\u53d6\u5f97\u3057\u3066\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u3002\nfunction isTourDayOpen(ds) {\n  const days = state.tourOpenDays[state.activity] || [];\n  if (days.indexOf(ds) === -1) return false;\n  const cached = state.availability[ds];\n  if (cached && cached.tours && cached.tours[state.activity] && cached.tours[state.activity].open === false) return false;\n  return true;\n}\n\nfunction renderTourCalendar(wrap) {\n  const code = state.activity;\n  if (!state.tourOpenDays[code]) {\n    wrap.appendChild(el('p', 'muted small', 'Loading available dates\u2026'));\n    fetch(WEBAPP_URL + '?action=tourOpenDays&activity=' + encodeURIComponent(code) + '&days=' + HORIZON_DAYS, { cache: 'no-store' })\n      .then((r) => r.json())\n      .then((d) => { state.tourOpenDays[code] = (d && d.ok && d.openDays) || []; if (state.activity === code) renderDates(); })\n      .catch(() => { state.tourOpenDays[code] = []; if (state.activity === code) renderDates(); });\n    return;\n  }\n  renderCalendarGrid(wrap, isTourDayOpen, selectTourDate);\n  if (!(state.tourOpenDays[code] || []).length) {\n    wrap.appendChild(el('p', 'muted small', 'No open dates in the next ' + HORIZON_DAYS + ' days.'));\n  }\n}\n\n\/\/ \u30ab\u30ec\u30f3\u30c0\u30fc\u3067\u30c4\u30a2\u30fc\u306e\u65e5\u4ed8\u3092\u9078\u629e\u3002\u672a\u53d6\u5f97\u306a\u3089\u5358\u65e5\u306e\u7a7a\u304d\u3092\u53d6\u5f97\u3057\u3066\u304b\u3089\u8a73\u7d30\u3092\u63cf\u753b\uff08selectAlgueblueDate\u3068\u540c\u3058\u5f62\uff09\u3002\nasync function selectTourDate(ds) {\n  Object.assign(state, { date: ds, plan: null, option: null, start: null, pickup: null });\n  renderDates();\n  if (!state.availability[ds]) {\n    const sec = $('#details-section');\n    sec.hidden = false;\n    sec.innerHTML = '';\n    sec.appendChild(el('p', 'muted', 'Checking availability\u2026'));\n    try {\n      const res = await fetch(WEBAPP_URL + '?action=availability&date=' + ds, { cache: 'no-store' });\n      const data = await res.json();\n      if (!(data.ok && data.days && data.days[ds])) throw new Error(data.error || 'load failed');\n      state.availability[ds] = data.days[ds];\n    } catch (err) {\n      const sec2 = $('#details-section');\n      sec2.innerHTML = '';\n      sec2.appendChild(el('p', 'muted', 'Could not load availability. Please try again.'));\n      console.error(err);\n      return;\n    }\n    renderDates();\n  }\n  renderDetails();\n  renderSummary();\n}\n\n\/\/ \u30ab\u30ec\u30f3\u30c0\u30fc\u3067\u65e5\u4ed8\u3092\u9078\u629e\u3002\u672a\u53d6\u5f97\u306a\u3089\u5358\u65e5\u306e\u7a7a\u304d\u3092\u53d6\u5f97\u3057\u3066\u304b\u3089\u8a73\u7d30\u3092\u63cf\u753b\u3002\nasync function selectAlgueblueDate(ds) {\n  Object.assign(state, { date: ds, plan: null, option: null, start: null, pickup: null });\n  renderDates();\n  if (!state.availability[ds]) {\n    const sec = $('#details-section');\n    sec.hidden = false;\n    sec.innerHTML = '';\n    sec.appendChild(el('p', 'muted', '\u7a7a\u304d\u72b6\u6cc1\u3092\u78ba\u8a8d\u4e2d\u2026 \/ Checking availability\u2026'));\n    try {\n      const res = await fetch(WEBAPP_URL + '?action=availability&date=' + ds, { cache: 'no-store' });\n      const data = await res.json();\n      if (!(data.ok && data.days && data.days[ds])) throw new Error(data.error || 'load failed');\n      state.availability[ds] = data.days[ds];\n    } catch (err) {\n      const sec2 = $('#details-section');\n      sec2.innerHTML = '';\n      sec2.appendChild(el('p', 'muted', '\u7a7a\u304d\u72b6\u6cc1\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002 \/ Could not load availability. Please try again.'));\n      console.error(err);\n      return;\n    }\n    \/\/ \u6e80\u5e2d\u3068\u5224\u660e\u3057\u305f\u3089\u30ab\u30ec\u30f3\u30c0\u30fc\u8868\u793a\u3092\u66f4\u65b0\uff08\u30af\u30ea\u30c3\u30af\u4e0d\u53ef\u306b\uff09\n    renderDates();\n  }\n  maybePresetPlan();\n  renderDetails();\n  renderSummary();\n}\n\nfunction isDateOpen(d) {\n  const day = state.availability[d];\n  if (!day) return false;\n  if (activityKind() === 'algueblue') return day.algueblue && !day.algueblue.closed && day.algueblue.anyOpen;\n  const t = day.tours[state.activity];\n  return t && t.starts && t.starts.length > 0;\n}\n\n\/* ---- Step 3: details (plan\/option\/start OR slot) + people ---- *\/\nfunction renderDetails() {\n  const sec = $('#details-section');\n  sec.innerHTML = '';\n  if (!state.activity || !state.date) { sec.hidden = true; return; }\n  sec.hidden = false;\n  updateChrome();\n  if (activityKind() === 'algueblue') renderAlgueblueDetails(sec);\n  else renderTourDetails(sec);\n  renderPeople(sec);\n  if (activityRequiresHeight()) renderHeight(sec);\n  renderContact(sec);\n}\n\n\/\/ e-bike \u30c4\u30a2\u30fc\u306f\u81ea\u8ee2\u8eca\u30b5\u30a4\u30ba\u78ba\u8a8d\u306e\u305f\u3081\u8eab\u9577\u304c\u5fc5\u8981\uff08doGet \u306e requiresHeight \u3067\u5224\u5b9a\uff09\nfunction activityRequiresHeight() {\n  if (activityKind() !== 'tour' || !state.date) return false;\n  const t = state.availability[state.date].tours[state.activity];\n  return !!(t && t.requiresHeight);\n}\n\nfunction renderHeight(sec) {\n  sec.appendChild(el('h3', 'step-title', 'Rider height \u2014 for bike sizing'));\n  const f = el('label', 'field');\n  f.appendChild(el('span', 'field-label', 'Height in cm (one per rider, e.g. 165, 172) *'));\n  const input = el('input');\n  input.type = 'text';\n  input.placeholder = 'e.g. 165, 172';\n  input.value = state.height || '';\n  input.oninput = () => { state.height = input.value; renderSummary(); };\n  f.appendChild(input);\n  sec.appendChild(f);\n}\n\nfunction renderAlgueblueDetails(sec) {\n  const ab = state.availability[state.date].algueblue;\n  sec.appendChild(el('h3', 'step-title', '\u30d7\u30e9\u30f3\u3092\u9078\u629e \/ Choose a plan'));\n  const planWrap = el('div', 'choices');\n  Object.keys(ab.plans).forEach((key) => {\n    const p = ab.plans[key];\n    if (!p.open) return;\n    const b = el('button', 'choice plan' + (state.plan === key ? ' selected' : ''),\n      '<strong>' + esc(p.name) + '<\/strong><span class=\"muted\">\u00a5' + Number(p.price).toLocaleString() + '<\/span>');\n    b.type = 'button';\n    b.onclick = () => { Object.assign(state, { plan: key, option: null, pickup: null, start: null }); renderDetails(); renderSummary(); };\n    planWrap.appendChild(b);\n  });\n  if (!planWrap.children.length) planWrap.appendChild(el('p', 'muted', '\u3053\u306e\u65e5\u306f\u9078\u3079\u308b\u30d7\u30e9\u30f3\u304c\u3042\u308a\u307e\u305b\u3093\u3002 \/ No plan available on this date.'));\n  sec.appendChild(planWrap);\n  if (!state.plan) return;\n\n  const plan = ab.plans[state.plan];\n  if (plan.options && plan.options.length) {\n    sec.appendChild(el('h3', 'step-title', '\u30b3\u30fc\u30b9 \/ Course'));\n    const ow = el('div', 'choices');\n    plan.options.forEach((o) => {\n      const b = el('button', 'choice' + (state.option === o ? ' selected' : ''), esc(o));\n      b.type = 'button';\n      b.onclick = () => { state.option = o; renderDetails(); renderSummary(); };\n      ow.appendChild(b);\n    });\n    sec.appendChild(ow);\n  }\n\n  \/\/ \u9001\u8fce\u30db\u30c6\u30eb\u3092\u5148\u306b\u9078\u3076\uff08\u30db\u30c6\u30eb\u3067\u9001\u8fce\u6642\u9593\u304c\u9055\u3044\u3001\u53d6\u308c\u308b\u958b\u59cb\u6642\u523b\u3082\u5909\u308f\u308b\u305f\u3081\uff09\n  const startsByHotel = plan.startsByHotel || {};\n  sec.appendChild(el('h3', 'step-title', '\u304a\u8fce\u3048\u5834\u6240 \/ Pickup hotel'));\n  const hw = el('div', 'choices');\n  (ab.pickupHotels || []).forEach((h) => {\n    const openForHotel = (startsByHotel[h.name] || []).length > 0;\n    const b = el('button', 'choice' + (state.pickup === h.name ? ' selected' : '') + (openForHotel ? '' : ' disabled'), esc(h.name));\n    b.type = 'button';\n    b.disabled = !openForHotel;\n    b.onclick = () => { Object.assign(state, { pickup: h.name, start: null }); renderDetails(); renderSummary(); };\n    hw.appendChild(b);\n  });\n  sec.appendChild(hw);\n  sec.appendChild(el('p', 'muted small', '\u3054\u5bbf\u6cca\u306e\u30db\u30c6\u30eb\u307e\u3067\u304a\u8fce\u3048\u306b\u4f3a\u3044\u307e\u3059\u3002\u4e0b\u306e\u958b\u59cb\u6642\u523b\u306f\u9001\u8fce\u306e\u79fb\u52d5\u6642\u9593\u3092\u542b\u3093\u3060\u8868\u793a\u3067\u3059\u3002 \/ Our staff will pick you up at your hotel. The start times below already include travel to Algueblue.'));\n  if (!state.pickup) return;\n\n  \/\/ \u9078\u3093\u3060\u30db\u30c6\u30eb\u3067\u53d6\u308c\u308b\u958b\u59cb\u6642\u523b\u3060\u3051\u3092\u8868\u793a\u3002\u5404\u30dc\u30bf\u30f3\u306b\u300c\u65bd\u8853\u958b\u59cb\u300d\u3068\u300c\u304a\u8fce\u3048\u6642\u523b\u300d\u3092\u4f75\u8a18\u3057\u3066\u5206\u304b\u308a\u3084\u3059\u304f\u3002\n  const starts = startsByHotel[state.pickup] || [];\n  const hotel = (ab.pickupHotels || []).find((x) => x.name === state.pickup);\n  sec.appendChild(el('h3', 'step-title', '\u65bd\u8853\u958b\u59cb\u6642\u9593 \/ Treatment start time'));\n  sec.appendChild(el('p', 'muted small', '\u65bd\u8853\u304c\u59cb\u307e\u308b\u6642\u523b\u3092\u304a\u9078\u3073\u304f\u3060\u3055\u3044\u3002\u5404\u30dc\u30bf\u30f3\u306e\u4e0b\u306b\u304a\u8fce\u3048\u6642\u523b\u3092\u8868\u793a\u3057\u3066\u3044\u307e\u3059\u3002 \/ Pick when your treatment starts \u2014 the hotel pickup time is shown under each.'));\n  const tw = el('div', 'choices times');\n  starts.forEach((t) => {\n    const pk = (hotel && hotel.toSalonMin != null) ? subtractMinutes(t, hotel.toSalonMin) : null;\n    const label = '<span class=\"time-main\">' + esc(t) + '<\/span>'\n      + (pk ? '<span class=\"pickup-sub\">\u304a\u8fce\u3048\/pickup ' + esc(pk) + '<\/span>' : '');\n    const b = el('button', 'choice time' + (state.start === t ? ' selected' : ''), label);\n    b.type = 'button';\n    b.onclick = () => { state.start = t; renderDetails(); renderSummary(); };\n    tw.appendChild(b);\n  });\n  if (!starts.length) tw.appendChild(el('p', 'muted', '\u3053\u306e\u30db\u30c6\u30eb\u3067\u7a7a\u3044\u3066\u3044\u308b\u958b\u59cb\u6642\u523b\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u5225\u306e\u304a\u8fce\u3048\u5834\u6240\u3092\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002 \/ No open start times for this hotel. Please try another pickup hotel.'));\n  sec.appendChild(tw);\n\n  \/\/ \u9078\u629e\u5f8c\u306e\u78ba\u8a8d\uff08\u65bd\u8853\u958b\u59cb\u3068\u304a\u8fce\u3048\u6642\u523b\u3092\u660e\u793a\uff09\n  if (state.start && hotel && hotel.toSalonMin != null) {\n    const pk = subtractMinutes(state.start, hotel.toSalonMin);\n    sec.appendChild(el('p', 'muted small',\n      '\u65bd\u8853\u958b\u59cb ' + esc(state.start) + ' \u30fb \u304a\u8fce\u3048\u76ee\u5b89 ' + esc(pk) + '\uff08\u6642\u9593\u306f\u30e1\u30fc\u30eb\u3067\u78ba\u5b9a\u3057\u307e\u3059\uff09'\n      + ' \/ Treatment starts ' + esc(state.start) + ' \u00b7 hotel pickup around ' + esc(pk) + ' (we will confirm by email).'));\n  }\n}\n\nfunction renderTourDetails(sec) {\n  const t = state.availability[state.date].tours[state.activity];\n  sec.appendChild(el('h3', 'step-title', 'Start time (3-hour tour)'));\n  const wrap = el('div', 'choices times');\n  (t.starts || []).forEach((time) => {\n    const b = el('button', 'choice time' + (state.start === time ? ' selected' : ''), esc(time));\n    b.type = 'button';\n    b.onclick = () => { state.start = time; renderDetails(); renderSummary(); };\n    wrap.appendChild(b);\n  });\n  if (!(t.starts || []).length) wrap.appendChild(el('p', 'muted', 'No open start times on this date.'));\n  sec.appendChild(wrap);\n}\n\nfunction renderPeople(sec) {\n  sec.appendChild(el('h3', 'step-title', bi('\u4eba\u6570', 'Number of people')));\n  const row = el('div', 'people-row');\n  \/\/ \u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3054\u3068\u306e\u4eba\u6570\u4e0a\u9650\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc2\uff0fe-bike\u54044\uff0f\u59eb\u8def\u57ce\u30ac\u30a4\u30c98\uff0f\u5348\u5f8c\u5de5\u82b8\u30c4\u30a2\u30fc6\uff09\u3068\u4e0b\u9650\uff08\u5de5\u82b8\u30c4\u30a2\u30fc\u306e\u307f2\uff09\u3002\n  const maxPeople = activityMaxPeople();\n  const minPeople = activityMinPeople();\n  if (state.people > maxPeople) state.people = maxPeople;\n  if (state.people < minPeople) state.people = minPeople;\n  const input = el('input'); input.type = 'number'; input.min = String(minPeople); input.max = String(maxPeople); input.value = state.people;\n  \/\/ min\/max\u5c5e\u6027\u3060\u3051\u3060\u3068\u624b\u5165\u529b\u3067\u8d85\u904e\u3067\u304d\u308b\u305f\u3081\u3001\u72b6\u614b\u3082\u4e0a\u4e0b\u9650\u3067\u4e38\u3081\u308b\u3002\n  input.oninput = () => { state.people = Math.min(maxPeople, Math.max(minPeople, Number(input.value) || minPeople)); renderSummary(); };\n  input.onchange = () => { input.value = state.people; }; \/\/ \u78ba\u5b9a\u6642\u306b\u898b\u305f\u76ee\u3082\u4e0a\u4e0b\u9650\u3078\u63c3\u3048\u308b\n  row.appendChild(input);\n  if (minPeople > 1) row.appendChild(el('p', 'muted small', bi('\u6700\u5c11' + minPeople + '\u540d\u304b\u3089\u627f\u308a\u307e\u3059', 'Minimum ' + minPeople + ' people for this tour')));\n  sec.appendChild(row);\n}\n\nfunction renderContact(sec) {\n  sec.appendChild(el('h3', 'step-title', bi('\u304a\u5ba2\u69d8\u60c5\u5831', 'Your details')));\n  const fields = [\n    ['name', bi('\u304a\u540d\u524d', 'Full name') + ' *', 'text'],\n    ['email', bi('\u30e1\u30fc\u30eb', 'Email') + ' *', 'email'],\n    ['phone', bi('\u96fb\u8a71\u756a\u53f7', 'Phone'), 'tel'],\n    ['note', bi('\u5099\u8003\uff08\u4efb\u610f\uff09', 'Note (optional)'), 'text'],\n  ];\n  fields.forEach(([key, label, type]) => {\n    const f = el('label', 'field');\n    f.appendChild(el('span', 'field-label', label));\n    const input = el('input'); input.type = type; input.id = 'f-' + key; input.value = state[key] || '';\n    input.oninput = () => { state[key] = input.value; renderSummary(); };\n    f.appendChild(input);\n    sec.appendChild(f);\n  });\n}\n\n\/* ---- Summary + submit ---- *\/\nfunction renderSummary() {\n  const sec = $('#summary-section');\n  const ready = isReady();\n  sec.hidden = !state.activity || !state.date;\n  updateChrome();\n  const a = ACTIVITIES.find((x) => x.code === state.activity);\n  const lines = [];\n  if (a) lines.push([bi('\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3', 'Activity'), a.label]);\n  if (state.date) lines.push([bi('\u65e5\u4ed8', 'Date'), state.date]);\n  if (activityKind() === 'algueblue' && state.plan) {\n    const p = state.availability[state.date].algueblue.plans[state.plan];\n    lines.push([bi('\u30d7\u30e9\u30f3', 'Plan'), p.name + (state.option ? ' (' + state.option + ')' : '')]);\n  }\n  if (state.start) lines.push([activityKind() === 'algueblue' ? bi('\u65bd\u8853\u958b\u59cb', 'Treatment start') : 'Start', state.start]);\n  if (activityKind() === 'algueblue' && state.pickup) {\n    lines.push([bi('\u304a\u8fce\u3048\u5834\u6240', 'Pickup hotel'), state.pickup]);\n    const hotel = (state.availability[state.date].algueblue.pickupHotels || []).find((x) => x.name === state.pickup);\n    if (hotel && hotel.toSalonMin != null && state.start) lines.push([bi('\u304a\u8fce\u3048\u6642\u523b', 'Pickup time'), subtractMinutes(state.start, hotel.toSalonMin)]);\n  }\n  lines.push([bi('\u4eba\u6570', 'People'), state.people]);\n  if (activityRequiresHeight() && state.height) lines.push(['Height (cm)', state.height]);\n  \/\/ \u6599\u91d1\u8868\u793a\uff08\u30c4\u30a2\u30fc\uff09\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u304c availability \u3067\u8fd4\u3059 pricePerPerson \/ soloPrice \u304b\u3089\u7b97\u51fa\u3002\n  \/\/   \u8a08\u7b97\u5f0f\u306f\u78ba\u8a8d\u30e1\u30fc\u30eb(booking_webapp.gs)\u3068\u540c\u3058\uff1a1\u540d\u306f\u5358\u72ec\u6599\u91d1\u30012\u540d\u4ee5\u4e0a\u306f\u4eba\u6570\u00d7\u5358\u4fa1\u3002\n  \/\/   \u6599\u91d1\u306e\u51fa\u6240\u306f GAS \u306e BOOKING_CONFIG.tours\uff08\u30d5\u30ed\u30f3\u30c8\u306b\u306f\u6301\u305f\u306a\u3044\uff1d\u4e8c\u91cd\u7ba1\u7406\u3092\u907f\u3051\u308b\uff09\u3002\n  if (activityKind() === 'tour' && state.date) {\n    const tour = state.availability[state.date].tours[state.activity];\n    if (tour && tour.pricePerPerson) {\n      const ppl = Number(state.people) || 1;\n      let total, note;\n      if (ppl === 1 && tour.soloPrice) {\n        total = tour.soloPrice; note = bi('1\u540d', '1 person');\n      } else {\n        total = tour.pricePerPerson * ppl;\n        note = '\u00a5' + Number(tour.pricePerPerson).toLocaleString() + bi('\uff0f\u4eba', '\/person') + ' \u00d7 ' + ppl;\n      }\n      lines.push([bi('\u6599\u91d1', 'Price'), '\u00a5' + Number(total).toLocaleString() + ' (' + note + ')']);\n    }\n  }\n  $('#summary').innerHTML = lines.map(([k, v]) => '<div class=\"sum-row\"><span>' + esc(k) + '<\/span><b>' + esc(v) + '<\/b><\/div>').join('');\n  $('#submit-btn').disabled = !ready;\n}\n\nfunction isReady() {\n  if (!state.activity || !state.date || !state.people) return false;\n  if (Number(state.people) < activityMinPeople()) return false;\n  if (!state.name || !state.email) return false;\n  if (activityKind() === 'algueblue') {\n    if (!state.plan || !state.start || !state.pickup) return false;\n    const plan = state.availability[state.date].algueblue.plans[state.plan];\n    if (plan.options && plan.options.length && !state.option) return false;\n    return true;\n  }\n  if (!state.start) return false;\n  if (activityRequiresHeight() && !String(state.height || '').trim()) return false;\n  return true;\n}\n\nasync function submit() {\n  if (activityUnderMaintenance()) return; \/\/ \u505c\u6b62\u5bfe\u8c61\u306f\u9001\u4fe1\u3055\u305b\u306a\u3044\uff08\u9632\u5fa1\uff09\n  $('#submit-btn').disabled = true;\n  $('#status').textContent = 'Sending\u2026';\n  const body = {\n    activity: state.activity, date: state.date, people: state.people,\n    name: state.name, email: state.email, phone: state.phone || '', note: state.note || '',\n    plan: state.plan, option: state.option, start: state.start, height: state.height || '',\n    pickup: state.pickup || '',\n  };\n  try {\n    const res = await fetch(WEBAPP_URL + '?action=createBooking', {\n      method: 'POST',\n      headers: { 'Content-Type': 'text\/plain;charset=utf-8' }, \/\/ avoid CORS preflight\n      body: JSON.stringify(body),\n    });\n    const data = await res.json();\n    if (!data.ok) throw new Error(data.error || 'Booking failed');\n    \/\/ \u5148\u6255\u3044\u5236\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306f\u3053\u3053\u3067 approveUrl \u304c\u8fd4\u308b\uff1dPayPal\u306e\u6c7a\u6e08\u30da\u30fc\u30b8\u3078\u79fb\u52d5\u3059\u308b\u3002\n    \/\/ \u5f93\u6765\u3069\u304a\u308a\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306f approveUrl \u304c\u7121\u3044\u306e\u3067\u3001\u3053\u308c\u307e\u3067\u3068\u540c\u3058\u5b8c\u4e86\u753b\u9762\u3092\u51fa\u3059\u3002\n    if (data.approveUrl) {\n      location.href = data.approveUrl;\n      return;\n    }\n    showDone(data);\n  } catch (err) {\n    $('#status').textContent = 'Sorry \u2014 ' + err.message;\n    $('#submit-btn').disabled = false;\n  }\n}\n\n\/\/ PayPal\u3067\u306e\u652f\u6255\u3044\u627f\u8a8d\u304c\u5b8c\u4e86\u3057\u3001booking.html \u306b\u623b\u3063\u3066\u304d\u305f\u76f4\u5f8c\u306e\u753b\u9762\u3002\n\/\/ \u3053\u306e\u6642\u70b9\u3067\u306f\u307e\u3060 Webhook \u5074\u306e\u78ba\u5b9a\u51e6\u7406\uff08\u30ab\u30ec\u30f3\u30c0\u30fc\u78ba\u4fdd\uff09\u304c\u5b8c\u4e86\u3057\u3066\u3044\u308b\u3068\u306f\u9650\u3089\u306a\u3044\u305f\u3081\u3001\n\/\/ \u300c\u78ba\u8a8d\u4e2d\u300d\u3067\u3042\u308b\u3053\u3068\u3092\u4f1d\u3048\u308b\uff08\u904e\u5ea6\u306a\u78ba\u7d04\u306f\u3057\u306a\u3044\uff09\u3002\nfunction showPaymentPendingConfirmation() {\n  $('#form-body').hidden = true;\n  $('#done').hidden = false;\n  $('#done').innerHTML =\n    '<div class=\"done-check\">\u2713<\/div>' +\n    '<h2>Payment received<\/h2>' +\n    '<p class=\"muted\">We are finalizing your booking now. You will receive a confirmation email within a few minutes.<\/p>' +\n    '<p class=\"muted small\">If you do not receive an email within 30 minutes, please contact ' +\n    '<a href=\"mailto:comecomehimeji@gmail.com\">comecomehimeji@gmail.com<\/a>.<\/p>';\n}\n\n\/\/ PayPal\u306e\u6c7a\u6e08\u30da\u30fc\u30b8\u3067\u300c\u30ad\u30e3\u30f3\u30bb\u30eb\u300d\u3057\u3066\u623b\u3063\u3066\u304d\u305f\u753b\u9762\u3002\u652f\u6255\u3044\u3082\u4e88\u7d04\u67a0\u306e\u78ba\u4fdd\u3082\u3055\u308c\u3066\u3044\u306a\u3044\u65e8\u3092\u660e\u78ba\u306b\u3059\u308b\u3002\nfunction showPaymentCancelled() {\n  $('#form-body').hidden = true;\n  $('#done').hidden = false;\n  $('#done').innerHTML =\n    '<h2>Payment not completed<\/h2>' +\n    '<p class=\"muted\">No payment was taken and no time slot was held. Feel free to book again whenever you are ready.<\/p>' +\n    '<a class=\"pay-btn\" href=\"' + location.pathname + '\">Back to booking form<\/a>';\n}\n\nfunction showDone(data) {\n  $('#form-body').hidden = true;\n  $('#done').hidden = false;\n  const alg = isAlg();\n  const heading = alg ? '\u3054\u4e88\u7d04\u3092\u53d7\u3051\u4ed8\u3051\u307e\u3057\u305f \/ Booking received' : 'Booking received';\n  const refLine = (alg ? '\u4e88\u7d04\u756a\u53f7 \/ Your reference: ' : 'Your reference is ') + '<b>' + esc(data.bookingId) + '<\/b>.';\n\n  \/\/ \u304a\u652f\u6255\u3044\u91d1\u984d\uff08\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u304b\u3089\u8fd4\u308c\u3070\u512a\u5148\u3001\u306a\u3051\u308c\u3070\u30d5\u30ed\u30f3\u30c8\u3067\u8a08\u7b97\uff09\u3002\n  const amount = (data && Number(data.amount)) ? Number(data.amount) : bookingTotalYen();\n  let payBlock = '';\n  if (amount) {\n    const label = (alg ? 'PayPal\u3067\u304a\u652f\u6255\u3044 \/ Pay with PayPal ' : 'Pay with PayPal ') + '\u00a5' + amount.toLocaleString();\n    payBlock =\n      '<a class=\"pay-btn\" href=\"' + PAYPAL_ME + amount + 'JPY\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(label) + '<\/a>';\n  }\n\n  const note = alg\n    ? '\u4e0b\u306e\u300cPayPal\u3067\u304a\u652f\u6255\u3044\u300d\u30dc\u30bf\u30f3\u304b\u3089\u304a\u652f\u6255\u3044\u304f\u3060\u3055\u3044\u3002<strong>\u3054\u5165\u91d1\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3089\u3001\u3054\u4e88\u7d04\u5b8c\u4e86\u306e\u3054\u9023\u7d61\u3092\u30e1\u30fc\u30eb\u3067\u304a\u9001\u308a\u3057\u307e\u3059\u3002<\/strong>'\n      + '<br><br>PayPal\u3092\u304a\u6301\u3061\u3067\u306a\u3044\u65b9\u306f\u3001\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u3067\u3082\u304a\u652f\u6255\u3044\u3044\u305f\u3060\u3051\u307e\u3059\u3002\u30ab\u30fc\u30c9\u6255\u3044\u3092\u3054\u5e0c\u671b\u306e\u5834\u5408\u306f\u3001\u4e0b\u8a18\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3078\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002\u30ab\u30fc\u30c9\u7528\u306e\u304a\u652f\u6255\u3044\u30da\u30fc\u30b8\u3092\u304a\u9001\u308a\u3057\u307e\u3059\u3002'\n      + '<br>\u3054\u4e0d\u660e\u306a\u70b9\u3082 <a href=\"mailto:comecomehimeji@gmail.com\">comecomehimeji@gmail.com<\/a> \u307e\u3067\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002'\n      + '<br><br>Please pay with the PayPal button below. Once we receive your payment, we will email you to confirm your booking.'\n      + '<br>No PayPal account? You can also pay by credit or debit card. Just email us and we will send you a card payment page.'\n      + '<br>Questions? Contact <a href=\"mailto:comecomehimeji@gmail.com\">comecomehimeji@gmail.com<\/a>.'\n    : 'Please pay with the PayPal button below. Once we receive your payment, we will email you to confirm your booking.'\n      + '<br>No PayPal account? You can also pay by credit or debit card. Just email us and we will send you a card payment page.'\n      + '<br>Questions? Contact <a href=\"mailto:comecomehimeji@gmail.com\">comecomehimeji@gmail.com<\/a>.';\n\n  \/\/ \u5f53\u65e5\uff08\u4eca\u65e5\uff09\u306e\u3054\u4e88\u7d04\u306b\u9650\u308a\u73fe\u5730\u6255\u3044\u3082\u53ef\uff08\u6642\u9593\u304c\u7121\u304f\u3001PayPal\u672a\u767b\u9332\uff0f\u8acb\u6c42\u66f8\u9001\u4ed8\u304c\u9593\u306b\u5408\u308f\u306a\u3044\u5834\u5408\u306e\u6551\u6e08\uff09\u3002\n  const sameDayNote = isSameDay()\n    ? (alg\n        ? '<br><br><strong>\u5f53\u65e5\u306e\u3054\u4e88\u7d04\u306b\u9650\u308a\u3001\u5f53\u65e5\u73fe\u5730\u3067\u306e\u304a\u652f\u6255\u3044\u3082\u53ef\u80fd\u3067\u3059\u3002<\/strong>'\n          + '<br>For same-day bookings, you may also pay on site.'\n        : '<br><br>For same-day bookings, you may also pay on site.')\n    : '';\n\n  \/\/ \u91d1\u984d\u304c\u53d6\u308c\u306a\u304b\u3063\u305f\u5834\u5408\u306e\u4fdd\u967a\uff1a\u30dc\u30bf\u30f3\u3092\u51fa\u3055\u305a\u3001\u30ea\u30f3\u30af\u3092\u5225\u9014\u304a\u9001\u308a\u3059\u308b\u6848\u5185\u306b\u3059\u308b\u3002\n  const fallbackNote = alg\n    ? '<strong>\u304a\u652f\u6255\u3044\u7528\u306ePayPal\u30ea\u30f3\u30af\u3092\u30e1\u30fc\u30eb\u3067\u304a\u9001\u308a\u3057\u307e\u3059\u3002<\/strong>\u3054\u5165\u91d1\u306e\u78ba\u8a8d\u3092\u3082\u3063\u3066\u3054\u4e88\u7d04\u5b8c\u4e86\u3068\u306a\u308a\u307e\u3059\u3002'\n      + '<br>We will email you a PayPal payment link. Your booking is complete once we receive your payment.'\n    : 'We will email you a PayPal payment link. Your booking is complete once we receive your payment.';\n\n  $('#done').innerHTML =\n    '<div class=\"done-check\">\u2713<\/div>' +\n    '<h2>' + heading + '<\/h2>' +\n    '<p>' + refLine + '<\/p>' +\n    (payBlock\n      ? '<p class=\"muted\">' + note + sameDayNote + '<\/p>' + payBlock\n      : '<p class=\"muted\">' + fallbackNote + sameDayNote + '<\/p>');\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  $('#submit-btn').addEventListener('click', submit);\n  init();\n});\n\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Book Your Experience Algueblue Thalassotherapy Spa &middot; e-bike Tours &middot; Himeji Castle Guide &middot; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_lightning_design_setting":{"layout":"col-one-no-subsection"},"footnotes":""},"class_list":["post-4733","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Book Your Experience - \u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Book Your Experience - \u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\" \/>\n<meta property=\"og:description\" content=\"Book Your Experience Algueblue Thalassotherapy Spa &middot; e-bike Tours &middot; Himeji Castle Guide &middot; [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/\" \/>\n<meta property=\"og:site_name\" content=\"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=100063594069731\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-12T05:58:47+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/book-now\\\/\",\"url\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/book-now\\\/\",\"name\":\"Book Your Experience - \u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/#website\"},\"datePublished\":\"2026-08-12T04:34:05+00:00\",\"dateModified\":\"2026-08-12T05:58:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/book-now\\\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/book-now\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/book-now\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Book Your Experience\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/#website\",\"url\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/\",\"name\":\"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068 \u65c5\u884c\u4f1a\u793e\u5730\u57df\u60c5\u5831 \u59eb\u8def \u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\uff5c\u96fb\u52d5\u81ea\u8ee2\u8eca\u30b5\u30a4\u30af\u30ea\u30f3\u30b0\u30fb\u30aa\u30f3\u30e9\u30a4\u30f3\u4f53\u9a13\uff5c\u3231\u3042\u304f\u3068Himeji E-Bike Tours e-bike rental | Travel Network ACT\",\"description\":\"\u59eb\u8def\u306e\u96a0\u308c\u305f\u9b45\u529b\u3092\u96fb\u52d5\u81ea\u8ee2\u8eca\u3068\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u5de1\u308b\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u4f53\u9a13\u3002\u3042\u306a\u305f\u306e\u65c5\u306b\u3001\u304b\u3051\u304c\u3048\u306e\u306a\u30441\u30da\u30fc\u30b8\u3092Explore Himeji\u2019s hidden gems by E-Bike or from home with our local online tours. Create unforgettable memories with Travel Network ACT\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/#organization\",\"name\":\"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068 \u65c5\u884c\u4f1a\u793e\u5730\u57df\u60c5\u5831 \u59eb\u8def \u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\",\"url\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/_LOGO-e1751852292441.jpg\",\"contentUrl\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/_LOGO-e1751852292441.jpg\",\"width\":500,\"height\":500,\"caption\":\"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068 \u65c5\u884c\u4f1a\u793e\u5730\u57df\u60c5\u5831 \u59eb\u8def \u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\"},\"image\":{\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=100063594069731\",\"https:\\\/\\\/www.instagram.com\\\/travel_network_act\\\/?locale=ja_JP\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Book Your Experience - \u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba","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:\/\/www.travel-network-act.co.jp\/local\/book-now\/","og_locale":"ja_JP","og_type":"article","og_title":"Book Your Experience - \u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba","og_description":"Book Your Experience Algueblue Thalassotherapy Spa &middot; e-bike Tours &middot; Himeji Castle Guide &middot; [&hellip;]","og_url":"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/","og_site_name":"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=100063594069731","article_modified_time":"2026-08-12T05:58:47+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/","url":"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/","name":"Book Your Experience - \u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff5c\u59eb\u8def\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba","isPartOf":{"@id":"https:\/\/www.travel-network-act.co.jp\/local\/#website"},"datePublished":"2026-08-12T04:34:05+00:00","dateModified":"2026-08-12T05:58:47+00:00","breadcrumb":{"@id":"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.travel-network-act.co.jp\/local\/book-now\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.travel-network-act.co.jp\/local\/book-now\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/www.travel-network-act.co.jp\/local\/"},{"@type":"ListItem","position":2,"name":"Book Your Experience"}]},{"@type":"WebSite","@id":"https:\/\/www.travel-network-act.co.jp\/local\/#website","url":"https:\/\/www.travel-network-act.co.jp\/local\/","name":"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068 \u65c5\u884c\u4f1a\u793e\u5730\u57df\u60c5\u5831 \u59eb\u8def \u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba\uff5c\u96fb\u52d5\u81ea\u8ee2\u8eca\u30b5\u30a4\u30af\u30ea\u30f3\u30b0\u30fb\u30aa\u30f3\u30e9\u30a4\u30f3\u4f53\u9a13\uff5c\u3231\u3042\u304f\u3068Himeji E-Bike Tours e-bike rental | Travel Network ACT","description":"\u59eb\u8def\u306e\u96a0\u308c\u305f\u9b45\u529b\u3092\u96fb\u52d5\u81ea\u8ee2\u8eca\u3068\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u5de1\u308b\u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u4f53\u9a13\u3002\u3042\u306a\u305f\u306e\u65c5\u306b\u3001\u304b\u3051\u304c\u3048\u306e\u306a\u30441\u30da\u30fc\u30b8\u3092Explore Himeji\u2019s hidden gems by E-Bike or from home with our local online tours. Create unforgettable memories with Travel Network ACT","publisher":{"@id":"https:\/\/www.travel-network-act.co.jp\/local\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.travel-network-act.co.jp\/local\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Organization","@id":"https:\/\/www.travel-network-act.co.jp\/local\/#organization","name":"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068 \u65c5\u884c\u4f1a\u793e\u5730\u57df\u60c5\u5831 \u59eb\u8def \u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba","url":"https:\/\/www.travel-network-act.co.jp\/local\/","logo":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.travel-network-act.co.jp\/local\/#\/schema\/logo\/image\/","url":"https:\/\/www.travel-network-act.co.jp\/local\/wp-content\/uploads\/2025\/07\/_LOGO-e1751852292441.jpg","contentUrl":"https:\/\/www.travel-network-act.co.jp\/local\/wp-content\/uploads\/2025\/07\/_LOGO-e1751852292441.jpg","width":500,"height":500,"caption":"\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068 \u65c5\u884c\u4f1a\u793e\u5730\u57df\u60c5\u5831 \u59eb\u8def \u30ed\u30fc\u30ab\u30eb\u30c4\u30a2\u30fc\u30ba"},"image":{"@id":"https:\/\/www.travel-network-act.co.jp\/local\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=100063594069731","https:\/\/www.instagram.com\/travel_network_act\/?locale=ja_JP"]}]}},"_links":{"self":[{"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/pages\/4733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/comments?post=4733"}],"version-history":[{"count":6,"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/pages\/4733\/revisions"}],"predecessor-version":[{"id":4743,"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/pages\/4733\/revisions\/4743"}],"wp:attachment":[{"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/media?parent=4733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}