{"id":3820,"date":"2026-05-02T09:00:00","date_gmt":"2026-05-02T00:00:00","guid":{"rendered":"https:\/\/www.travel-network-act.co.jp\/local\/?page_id=3820"},"modified":"2026-10-27T17:34:44","modified_gmt":"2026-10-27T08:34:44","slug":"we-still-have-spots-available-for-our-tours-and-etc","status":"publish","type":"page","link":"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/","title":{"rendered":"Availability"},"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: #fff !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-header::before, .booking-embed .page-header::after { content: none !important; display: 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#store-btn.submit { background: #fff !important; color: #087f5b !important; border: 2px solid #087f5b !important; box-shadow: none !important; }\n#store-btn.submit:disabled { opacity: .45; cursor: not-allowed !important; }\n#store-btn[hidden] { display: none !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<\/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        <button id=\"store-btn\" type=\"button\" class=\"submit\" hidden disabled>\u5e97\u982d\u3067\u652f\u6255\u3046\uff08\u4e88\u7d04\u78ba\u5b9a\uff09<\/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\/AKfycbzpGzicfO_KShS1JmmoxiZZexTgmffUOwagyUjplLmDFSc9DDDj_tT_h2s2PzuaKZkf\/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 ALGUEBLUE_HORIZON_DAYS \u65e5\u5148\u307e\u3067\uff09\u3002GAS \u306e algueblueOpenDays \u3068\u63c3\u3048\u308b\u3002\nconst ALGUEBLUE_HORIZON_DAYS = 30;\n\/\/ \u30c4\u30a2\u30fc\uff08e-bike\/\u57ce\u30ac\u30a4\u30c9\/\u5348\u5f8c\u5de5\u82b8\u30c4\u30a2\u30fc\uff09\u306e\u300cSee more dates\u300d\u3067\u8868\u793a\u3059\u308b\u65e5\u6570\u3002\n\/\/ \u6d77\u5916\u30b2\u30b9\u30c8\u306e3\u301c6\u304b\u6708\u524d\u4e88\u7d04\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u30812026-09-08\u306b\u62e1\u5f35\u3002GAS \u306e tourOpenDays \u4e0a\u9650(190)\u3068\u63c3\u3048\u308b\u3002\nconst TOUR_HORIZON_DAYS = 183;\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, payFirst: true },\n  { code: 'ebike-castle', label: 'e-bike Ride around the Castle',    kind: 'tour', maxPeople: 5, payFirst: true },\n  { code: 'ebike-sea',    label: 'e-bike Ride to the Sea',          kind: 'tour', maxPeople: 5, payFirst: true },\n  \/\/ payFirst: \u30d0\u30c3\u30af\u30a8\u30f3\u30c9(BOOKING_CONFIG.tours['castle-guide'].payFirst)\u3068\u63c3\u3048\u308b\u30022026-08 \u5148\u6255\u3044\u5236\u30c8\u30e9\u30a4\u30a2\u30eb\u7b2c1\u5f3e\u3002\n  { code: 'castle-guide', label: 'Himeji Castle Guide Tour',         kind: 'tour', maxPeople: 8, payFirst: true },\n  { code: 'craft-course1', label: 'Afternoon Craft Tour \u2014 Calligraphy + Wagashi Making', kind: 'tour', maxPeople: 6, minPeople: 2, hiddenFromPicker: true, payFirst: true },\n  { code: 'craft-course2', label: 'Afternoon Craft Tour \u2014 Calligraphy + Gold Leaf Application', kind: 'tour', maxPeople: 6, minPeople: 2, hiddenFromPicker: true, payFirst: true },\n  { code: 'craft-course3', label: 'Afternoon Craft Tour \u2014 Indigo Dyeing + Gold Leaf Application', kind: 'tour', maxPeople: 6, minPeople: 2, hiddenFromPicker: true, payFirst: true },\n  { code: 'tatsuno-ebike', label: 'Tatsuno Castle Town Ride & Fermentation Tour', kind: 'tour', maxPeople: 4, hiddenFromPicker: true, payFirst: true },\n  { code: 'craft-beer-tour', label: 'Harima Craft Beer Tour', kind: 'tour', maxPeople: 10, minPeople: 6, hiddenFromPicker: true, payFirst: true },\n  { code: 'himeji-bar-hopping', label: 'Himeji Bar Hop & Izakaya Night', kind: 'tour', maxPeople: 8, minPeople: 2, hiddenFromPicker: true, payFirst: true },\n  { code: 'healing-cave-yasutomi', label: 'E-bike Tour: Head to the Healing Cave (Yasutomi)', kind: 'tour', maxPeople: 8, minPeople: 2, hiddenFromPicker: true, payFirst: true },\n  { code: 'shiso-sake-cycle', label: 'Shiso Sake Town Cycle Tour', kind: 'tour', maxPeople: 8, minPeople: 2, hiddenFromPicker: true, payFirst: true },\n  \/\/ \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\uff08\u30ac\u30a4\u30c9\u7121\u3057\u30fb\u81ea\u8d70\uff09\u30022026-09-16\u8ffd\u52a0\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9(BOOKING_CONFIG.rentalCycle)\u306f\n  \/\/ guardRentalCycle_\/commitRentalCycle_ \u3067 activity==='rental-cycle' \u3092\u898b\u3066\u5206\u5c90\uff08payFirst\u5236\uff09\u3002\n  \/\/ maxPeople=3 \u306f\u30aa\u30f3\u30e9\u30a4\u30f3\u53d7\u4ed8\u306e\u4e0a\u9650\uff08\u73fe\u5730\u5728\u5eab9\u53f0\u306f\u30c4\u30a2\u30fc\u3068\u5171\u6709\u306e\u305f\u3081\u30014\u53f0\u4ee5\u4e0a\u306f\u554f\u3044\u5408\u308f\u305b\u8a98\u5c0e\uff09\u3002\n  { code: 'rental-cycle', label: 'E-Bike Rental \u2014 Self-Guided (no guide)', kind: 'rental', maxPeople: 3, payFirst: true },\n  \/\/ \u8377\u7269\u9810\u304b\u308a\uff082026-09-28\u8ffd\u52a0\uff09\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9(BOOKING_CONFIG.luggage)\u306f guardLuggage_\/commitLuggage_ \u3067 activity==='luggage' \u3092\u898b\u3066\u5206\u5c90\uff08payFirst\u5236\uff09\u3002\n  { code: 'luggage', label: 'Luggage Storage', kind: 'luggage', maxPeople: 40, payFirst: true },\n];\n\n\/\/ \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u306e\u30d7\u30e9\u30f3\u4e00\u89a7\u30fb\u53d7\u4ed8\u6642\u9593\u30fb\u96c6\u5408\u5834\u6240\u3002GAS\u306e BOOKING_CONFIG.rentalCycle \u3068\u624b\u52d5\u3067\u63c3\u3048\u308b\n\/\/ \uff08GET\u5074\u306b\u5c02\u7528\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u304c\u7121\u3044\u305f\u3081\u3001\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u5909\u66f4\u6642\u306f\u3053\u3053\u3082\u5408\u308f\u305b\u3066\u66f4\u65b0\u3059\u308b\u3053\u3068\uff09\u3002\nconst RENTAL_CONFIG = {\n  capacity: 3,\n  openTime: '09:30',\n  closeTime: '18:00',\n  meeting: 'Travel Network ACT (ACT Co., Ltd.), 1-41 Nounencho, Himeji',\n  plans: [\n    { code: '1h', label: '1 hour', hours: 1, price: 550 },\n    { code: '2h', label: '2 hours', hours: 2, price: 1100 },\n    { code: '3h', label: '3 hours', hours: 3, price: 1650 },\n    { code: '4h', label: '4 hours', hours: 4, price: 2200 },\n    { code: '5h', label: '5 hours', hours: 5, price: 2750 },\n    { code: 'fullday', label: 'Full day (6\u20138 hours)', hours: 8, minHours: 6, price: 3300 },\n    { code: '2d1n', label: '2 days \/ 1 night', days: 2, price: 6600 },\n    { code: '3d2n', label: '3 days \/ 2 nights', days: 3, price: 9900 },\n  ],\n};\n\n\/\/ \u8377\u7269\u9810\u304b\u308a\u306e\u6599\u91d1\u30fb\u53d7\u4ed8\u6642\u9593\u30fb\u5834\u6240\u3002GAS\u306e BOOKING_CONFIG.luggage \u3068\u624b\u52d5\u3067\u63c3\u3048\u308b\u3002\n\/\/ \u6599\u91d1 = (\u5927\u00a5800\u00d7\u500b\u6570 + \u624b\u8377\u7269\u00a5500\u00d7\u500b\u6570) \u00d7 \u9810\u3051\u65e5\u301c\u53d7\u53d6\u65e5\u306e\u66a6\u65e5\u6570\u3002\u53d7\u53d6\u306f\u300c\u3060\u3044\u305f\u3044\u306e\u6642\u523b\u300d\u3092\u805e\u304f\uff08\u76ee\u5b89\u3001\u55b6\u696d\u6642\u9593\u5185\u306a\u3089\u3044\u3064\u3067\u3082\u53ef\uff09\u3002\nconst LUGGAGE_CONFIG = {\n  openTime: '09:30',\n  closeTime: '18:00',\n  maxDays: 30,\n  maxPerSize: 20,\n  location: 'Travel Network ACT (ACT Co., Ltd.), 1-41 Nounencho, Himeji \u2014 approx. 2 min walk from JR Himeji Station South Exit, along the Shinkansen tracks',\n  sizes: [\n    { key: 'large', label: 'Suitcase \/ large bag', note: 'bigger than carry-on', price: 800 },\n    { key: 'small', label: 'Hand luggage', note: 'carry-on size, total of 3 sides up to 115 cm', price: 500 },\n  ],\n};\n\n\/\/ \u5e97\u982d\u53d7\u4ed8\uff08\u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u30fb\u8377\u7269\u9810\u304b\u308a\uff09\u306e Open\/Closed \u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u8868\u793a\u65e5\u6570\uff08\u30c4\u30a2\u30fc\u3068\u540c\u3058\u7d04\u534a\u5e74\uff09\u3002\nconst STORE_HORIZON_DAYS = 183;\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  lunch: false,                            \/\/ Tatsuno: tea-kaiseki lunch for all participants (2026-10-06)\n  endDate: null,                           \/\/ Luggage: pick-up date\n  endTime: null,                           \/\/ Luggage: approximate pick-up time\n  large: 0, small: 0,                      \/\/ Luggage: number of items per size\n  lugMode: 'drop',                         \/\/ Luggage: which date the calendar is choosing ('drop' | 'pickup')\n  storeClosed: null,                       \/\/ Rental\/Luggage: closed days from storeClosedDays (null = not loaded yet)\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';\n\/\/ ---- \u65e5\u672c\u8a9e\u8868\u793a\uff082026-09-30\uff09: \u65e5\u672c\u8a9e\u30da\u30fc\u30b8\u306e\u57cb\u3081\u8fbc\u307f\u3067\u306f iframe \u306e URL \u306b &lang=ja \u304c\u4ed8\u304f ----\nconst LANG_JA = new URLSearchParams(location.search).get('lang') === 'ja';\nconst JA_ADDRESS = '\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff08\u59eb\u8def\u5e02\u5357\u755d\u753a1\u4e01\u76ee41\u756a\u5730\u3001JR\u59eb\u8def\u99c5\u5357\u53e3\u304b\u3089\u5f92\u6b69\u7d042\u5206\u30fb\u65b0\u5e79\u7dda\u9ad8\u67b6\u6cbf\u3044\uff09';\nconst JA_EXACT = {\n  \/\/ \u4e88\u7d04\u30da\u30fc\u30b8\u5358\u4f53\u3067\u958b\u3044\u305f\u3068\u304d\uff08?lang=ja\uff09\u306e\u898b\u51fa\u3057\u30fb\u4e0b\u306e\u30ab\u30fc\u30c9\uff082026-10-01 \u8ffd\u52a0\uff09\n  'Availability': '\u7a7a\u304d\u72b6\u6cc1\u30fb\u3054\u4e88\u7d04', 'Book Your Experience': '\u3054\u4e88\u7d04',\n  'Algueblue Thalassotherapy Spa \u00b7 e-bike Tours \u00b7 Himeji Castle Guide': '\u30bf\u30e9\u30bd\u30c6\u30e9\u30d4\u30fc\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\uff09\u30fbe-bike\u30c4\u30a2\u30fc\u30fb\u59eb\u8def\u57ce\u30ac\u30a4\u30c9',\n  'What would you like to book?': '\u3054\u4e88\u7d04\u306e\u5185\u5bb9\u3092\u304a\u9078\u3073\u304f\u3060\u3055\u3044',\n  'See more dates \u203a': '\u307b\u304b\u306e\u65e5\u3092\u898b\u308b \u203a', 'Hide calendar': '\u30ab\u30ec\u30f3\u30c0\u30fc\u3092\u9589\u3058\u308b',\n  'Hotel Nikko Himeji': '\u30db\u30c6\u30eb\u65e5\u822a\u59eb\u8def', 'Hotel Monterey Himeji': '\u30db\u30c6\u30eb\u30e2\u30f3\u30c8\u30ec\u59eb\u8def',\n  'Daiwa Roynet Hotel Himeji': '\u30c0\u30a4\u30ef\u30ed\u30a4\u30cd\u30c3\u30c8\u30db\u30c6\u30eb\u59eb\u8def', 'Setre Highland Villa Himeji': '\u30bb\u30c8\u30ec \u30cf\u30a4\u30e9\u30f3\u30c9\u30f4\u30a3\u30e9\u59eb\u8def',\n  'e-bike Ride around the Castle, Slurp Like a Local': 'e-bike \u59eb\u8def\u57ce\u4e0b\u753a\u3081\u3050\u308a', 'e-bike Ride to the Sea- Slurp Like a Local': 'e-bike \u98fe\u78e8\u8857\u9053\u304b\u3089\u6d77\u3078',\n  'Perfect for history lovers': '\u6b74\u53f2\u597d\u304d\u306e\u65b9\u306b\u304a\u3059\u3059\u3081',\n  \"We won't go to inside of the Castle but we can enjoy a 360 degrees view around it.\": '\u304a\u57ce\u306e\u4e2d\u306b\u306f\u5165\u308a\u307e\u305b\u3093\u304c\u3001\u304a\u57ce\u306e\u307e\u308f\u308a\u3092\u3050\u308b\u308a\u3068\u4e00\u5468\u3057\u3066\u697d\u3057\u3081\u307e\u3059\u3002',\n  \"Let's head towards the sea.\": '\u6d77\u3092\u76ee\u6307\u3057\u3066\u8d70\u308a\u307e\u3057\u3087\u3046\u3002', 'Perfect for lovers of nostalgic scenery': '\u61d0\u304b\u3057\u3044\u753a\u4e26\u307f\u304c\u597d\u304d\u306a\u65b9\u306b\u304a\u3059\u3059\u3081',\n  'Himeji castle guide': '\u59eb\u8def\u57ce\u30ac\u30a4\u30c9\u30c4\u30a2\u30fc', 'Perfect for exploring with a fun guide.': '\u697d\u3057\u3044\u30ac\u30a4\u30c9\u3068\u4e00\u7dd2\u306b\u304a\u57ce\u3092\u3081\u3050\u308a\u305f\u3044\u65b9\u306b\u304a\u3059\u3059\u3081',\n  'We also offer': '\u305d\u306e\u307b\u304b\u306e\u30b5\u30fc\u30d3\u30b9\uff1a', 'e-bike rentals': 'e-bike \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb', 'and cheap': '\u304a\u624b\u9803\u306a\u6599\u91d1\u3067\u3059', 'Baggage storage': '\u8377\u7269\u9810\u304b\u308a', 'Access': '\u30a2\u30af\u30bb\u30b9',\n  'You can now': '\u4e0a\u306e\u30ab\u30fc\u30c9\u306e', 'book online': '\u30aa\u30f3\u30e9\u30a4\u30f3\u4e88\u7d04', 'directly from the cards above \u2014 just tap': '\u306f\u3001', 'Book Now!': '\u300cBook Now!\u300d\u30dc\u30bf\u30f3\u304b\u3089\u3069\u3046\u305e\u3002',\n  'Real-time spots for our e-bike tours, the Himeji Castle guide, and the Algueblue Thalassotherapy Spa can be booked online up to 6 months ahead.': 'e-bike\u30c4\u30a2\u30fc\u30fb\u59eb\u8def\u57ce\u30ac\u30a4\u30c9\u30fb\u30bf\u30e9\u30bd\u30c6\u30e9\u30d4\u30fc\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\uff09\u306f\u30016\u304b\u6708\u5148\u307e\u3067\u7a7a\u304d\u72b6\u6cc1\u3092\u898b\u306a\u304c\u3089\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u3054\u4e88\u7d04\u3044\u305f\u3060\u3051\u307e\u3059\u3002',\n  'Questions? Feel free to': '\u3054\u4e0d\u660e\u306a\u70b9\u306f\u3001\u304a\u6c17\u8efd\u306b', 'contact us': '\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044',\n  'Choose a date': '\u65e5\u4ed8\u3092\u9078\u629e', 'Choose drop-off & pick-up dates': '\u304a\u9810\u3051\u65e5\u3068\u304a\u53d7\u3051\u53d6\u308a\u65e5\u3092\u9078\u629e',\n  'Summary': '\u3054\u4e88\u7d04\u5185\u5bb9', 'Activity': '\u3054\u4e88\u7d04', 'Date': '\u65e5\u4ed8', 'People': '\u4eba\u6570', 'Price': '\u6599\u91d1', 'Plan': '\u30d7\u30e9\u30f3',\n  'Start': '\u958b\u59cb', 'Bikes': '\u53f0\u6570', 'Drop-off': '\u304a\u9810\u3051', 'Pick-up': '\u304a\u53d7\u3051\u53d6\u308a', 'Items': '\u500b\u6570', 'Course': '\u30b3\u30fc\u30b9',\n  'Pickup hotel': '\u304a\u8fce\u3048\u5834\u6240', 'Height (cm)': '\u8eab\u9577\uff08cm\uff09', 'Pickup time': '\u53d7\u3051\u53d6\u308a\u6642\u523b', 'Drop-off time': '\u304a\u9810\u3051\u6642\u523b',\n  'Pick-up time (approximate)': '\u304a\u53d7\u3051\u53d6\u308a\u6642\u523b\uff08\u76ee\u5b89\uff09', 'Number of items': '\u500b\u6570',\n  'How long would you like to ride?': '\u3054\u5229\u7528\u6642\u9593', 'Continue to payment': '\u304a\u652f\u6255\u3044\u3078\u9032\u3080',\n  'Full name *': '\u304a\u540d\u524d *', 'Email *': '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9 *', 'Phone': '\u96fb\u8a71\u756a\u53f7', 'Note (optional)': '\u3054\u8981\u671b\u306a\u3069\uff08\u4efb\u610f\uff09',\n  'Rider height \u2014 for bike sizing': '\u3054\u5229\u7528\u8005\u306e\u8eab\u9577\uff08\u81ea\u8ee2\u8eca\u306e\u30b5\u30a4\u30ba\u5408\u308f\u305b\u7528\uff09',\n  'Height in cm (one per rider, e.g. 165, 172) *': '\u8eab\u9577\uff08cm\u3002\u304a\u4e00\u4eba\u305a\u3064\u3002\u4f8b\uff1a165, 172\uff09*', 'e.g. 165, 172': '\u4f8b\uff1a165, 172',\n  'Suitcase \/ large bag \u2014 \u00a5800 per item per day': '\u30b9\u30fc\u30c4\u30b1\u30fc\u30b9\u30fb\u5927\u304d\u306a\u8377\u7269 \u2014 1\u500b1\u65e5 \u00a5800',\n  'Hand luggage \u2014 \u00a5500 per item per day': '\u624b\u8377\u7269 \u2014 1\u500b1\u65e5 \u00a5500',\n  '(bigger than carry-on)': '\uff08\u6a5f\u5185\u6301\u3061\u8fbc\u307f\u30b5\u30a4\u30ba\u3088\u308a\u5927\u304d\u3044\u3082\u306e\uff09',\n  '(carry-on size, total of 3 sides up to 115 cm)': '\uff08\u6a5f\u5185\u6301\u3061\u8fbc\u307f\u30b5\u30a4\u30ba\u30013\u8fba\u5408\u8a08115cm\u307e\u3067\uff09',\n  'Tap your drop-off date. Grey days are closed.': '\u304a\u9810\u3051\u65e5\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002\u30b0\u30ec\u30fc\u306e\u65e5\u306f\u4f11\u696d\u65e5\u3067\u3059\u3002',\n  'Tap your pickup date. Grey days are closed.': '\u53d7\u3051\u53d6\u308a\u65e5\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002\u30b0\u30ec\u30fc\u306e\u65e5\u306f\u4f11\u696d\u65e5\u3067\u3059\u3002',\n  'More than 20 items of one size, or hotel delivery? Please contact us at comecomehimeji@gmail.com.': '\u540c\u3058\u30b5\u30a4\u30ba\u306720\u500b\u3092\u8d85\u3048\u308b\u5834\u5408\u3084\u3001\u30db\u30c6\u30eb\u3078\u306e\u914d\u9001\u3092\u3054\u5e0c\u671b\u306e\u5834\u5408\u306f\u3001comecomehimeji@gmail.com \u307e\u3067\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002',\n  'You will be taken to PayPal to pay now. Your booking is confirmed once payment is completed.': '\u3053\u306e\u3042\u3068PayPal\u306e\u304a\u652f\u6255\u3044\u753b\u9762\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002\u304a\u652f\u6255\u3044\u304c\u5b8c\u4e86\u3057\u305f\u6642\u70b9\u3067\u3054\u4e88\u7d04\u304c\u78ba\u5b9a\u3057\u307e\u3059\u3002',\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.).': '\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',\n  'Loading calendar\u2026': '\u30ab\u30ec\u30f3\u30c0\u30fc\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u2026', 'Loading available dates\u2026': '\u4e88\u7d04\u3067\u304d\u308b\u65e5\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u2026',\n  'Checking availability\u2026': '\u7a7a\u304d\u72b6\u6cc1\u3092\u78ba\u8a8d\u4e2d\u2026', 'Try again': '\u3082\u3046\u4e00\u5ea6\u8aad\u307f\u8fbc\u3080', 'Reload': '\u518d\u8aad\u307f\u8fbc\u307f',\n  'Could not load available dates. Please check your connection and try again.': '\u4e88\u7d04\u3067\u304d\u308b\u65e5\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u901a\u4fe1\u72b6\u614b\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002',\n  'Could not load availability. Please check your connection and try again.': '\u7a7a\u304d\u72b6\u6cc1\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u901a\u4fe1\u72b6\u614b\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002',\n  'Could not load availability. Please try again.': '\u7a7a\u304d\u72b6\u6cc1\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002',\n  'A few dates are still open this month \u2014 tap \u2039 to see them.': '\u4eca\u6708\u3082\u307e\u3060\u4e88\u7d04\u3067\u304d\u308b\u65e5\u304c\u3042\u308a\u307e\u3059\u3002\u2039 \u3092\u62bc\u3059\u3068\u8868\u793a\u3055\u308c\u307e\u3059\u3002',\n  'Some multi-day plans are unavailable because we are closed on the return day.': '\u8fd4\u5374\u65e5\u304c\u4f11\u696d\u65e5\u306e\u305f\u3081\u3001\u9078\u3079\u306a\u3044\u5bbf\u6cca\u30d7\u30e9\u30f3\u304c\u3042\u308a\u307e\u3059\u3002',\n  'No pickup times left today \u2014 please choose another date.': '\u672c\u65e5\u306e\u53d7\u3051\u53d6\u308a\u6642\u523b\u306f\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002\u5225\u306e\u65e5\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002',\n  '1 hour': '1\u6642\u9593', 'Full day (6\u20138 hours)': '1\u65e5\uff086\u301c8\u6642\u9593\uff09', '2 days \/ 1 night': '1\u6cca2\u65e5', '3 days \/ 2 nights': '2\u6cca3\u65e5',\n  'Thalassotherapy Spa (Algueblue)': '\u30bf\u30e9\u30bd\u30c6\u30e9\u30d4\u30fc\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\uff09', 'e-bike Ride around the Castle': 'e-bike \u59eb\u8def\u57ce\u4e0b\u753a\u3081\u3050\u308a',\n  'e-bike Ride to the Sea': 'e-bike \u98fe\u78e8\u8857\u9053\u304b\u3089\u6d77\u3078', 'Himeji Castle Guide Tour': '\u59eb\u8def\u57ce\u30ac\u30a4\u30c9\u30c4\u30a2\u30fc',\n  'Afternoon Craft Tour \u2014 Calligraphy + Wagashi Making': '\u5348\u5f8c\u306e\u5de5\u82b8\u4f53\u9a13\u30c4\u30a2\u30fc \u2014 \u66f8\u9053\uff0b\u548c\u83d3\u5b50\u3065\u304f\u308a',\n  'Afternoon Craft Tour \u2014 Calligraphy + Gold Leaf Application': '\u5348\u5f8c\u306e\u5de5\u82b8\u4f53\u9a13\u30c4\u30a2\u30fc \u2014 \u66f8\u9053\uff0b\u91d1\u7b94\u62bc\u3057',\n  'Afternoon Craft Tour \u2014 Indigo Dyeing + Gold Leaf Application': '\u5348\u5f8c\u306e\u5de5\u82b8\u4f53\u9a13\u30c4\u30a2\u30fc \u2014 \u85cd\u67d3\u3081\uff0b\u91d1\u7b94\u62bc\u3057',\n  'Tatsuno Castle Town Ride & Fermentation Tour': 'e-bike \u305f\u3064\u306e\u57ce\u4e0b\u753a\u30e9\u30a4\u30c9\uff06\u767a\u9175\u30c4\u30a2\u30fc',\n  'Harima Craft Beer Tour': '\u64ad\u78e8\u30af\u30e9\u30d5\u30c8\u30d3\u30fc\u30eb\u30c4\u30a2\u30fc', 'Himeji Bar Hop & Izakaya Night': '\u59eb\u8def\u30d0\u30fc\u30db\u30c3\u30d4\u30f3\u30b0\uff08\u5c45\u9152\u5c4b\u5de1\u308a\uff09',\n  'E-bike Tour: Head to the Healing Cave (Yasutomi)': 'e-bike \u7652\u3057\u306e\u6d1e\u7a9f\u3092\u76ee\u6307\u3059\uff08\u5b89\u5bcc\uff09',\n  'Shiso Sake Town Cycle Tour': '\u5b8d\u7c9f \u9152\u8535\u306e\u753a\u30b5\u30a4\u30af\u30ea\u30f3\u30b0', 'E-Bike Rental \u2014 Self-Guided (no guide)': 'e-bike \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\uff08\u30ac\u30a4\u30c9\u306a\u3057\uff09',\n  'Luggage Storage': '\u8377\u7269\u9810\u304b\u308a',\n};\nconst JA_MONTH = { Jan: 1, Feb: 2, Mar: 3, Apr: 4, May: 5, Jun: 6, Jul: 7, Aug: 8, Sep: 9, Oct: 10, Nov: 11, Dec: 12 };\nconst JA_RULES = [\n  [\/^(\\d+)\u6708 \\\/ [A-Za-z]+ (\\d{4})$\/, '$2\u5e74$1\u6708'],\n  [\/^(.)\\\/(Su|Mo|Tu|We|Th|Fr|Sa)$\/, '$1'],\n  [\/^Start time \\((\\d+)-hour tour\\)$\/, '\u958b\u59cb\u6642\u523b\uff08\u6240\u8981 \u7d04$1\u6642\u9593\uff09'],\n  [\/^Start time \\((\\d+) h (\\d+) min tour\\)$\/, '\u958b\u59cb\u6642\u523b\uff08\u6240\u8981 \u7d04$1\u6642\u9593$2\u5206\uff09'],\n  [\/^(\\d+) hours$\/, '$1\u6642\u9593'],\n  [\/^\u00a5([\\d,]+) \u00b7 return by (\\d\\d:\\d\\d) on day (\\d+)$\/, '\u00a5$1 \u00b7 $3\u65e5\u76ee\u306e$2\u307e\u3067\u306b\u8fd4\u5374'],\n  [\/^\u00a5([\\d,]+) \u00b7 return by (\\d\\d:\\d\\d)$\/, '\u00a5$1 \u00b7 $2\u307e\u3067\u306b\u8fd4\u5374'],\n  [\/^\u00a5([\\d,]+)\\\/bike \u00d7 (\\d+) = \u00a5([\\d,]+)$\/, '\u00a5$1\/\u53f0 \u00d7 $2\u53f0 = \u00a5$3'],\n  [\/^\u00a5([\\d,]+) \\((\\d+) (person|people)\\)$\/, '\u00a5$1\uff08$2\u540d\uff09'],\n  [\/^\u00a5([\\d,]+) \\(\u00a5([\\d,]+)\\\/person \u00d7 (\\d+)\\)$\/, '\u00a5$1\uff08\u00a5$2\/\u4eba \u00d7 $3\u540d\uff09'],\n  [\/^\u00a5([\\d,]+)\\\/day \u00d7 (\\d+) days? = \u00a5([\\d,]+)$\/, '\u00a5$1\/\u65e5 \u00d7 $2\u65e5 = \u00a5$3'],\n  [\/^((Large|Hand luggage) \u00d7 \\d+(, )?)+$\/, (s) => s.replace(\/Large\/g, '\u5927\u304d\u306a\u8377\u7269').replace(\/Hand luggage\/g, '\u624b\u8377\u7269').replace(\/, \/g, '\u3001')],\n  [\/^(\\d{4}-\\d{2}-\\d{2}) around (\\d\\d:\\d\\d)$\/, '$1 $2\u3054\u308d'],\n  [\/^1\\. Drop-off: (.*)$\/, '\u2460 \u304a\u9810\u3051\u65e5\uff1a$1'],\n  [\/^2\\. Pick-up: (.*)$\/, '\u2461 \u304a\u53d7\u3051\u53d6\u308a\u65e5\uff1a$1'],\n  [\/^Business hours (\\S+)\u2013(\\S+)\\. Hourly rentals must be returned by (\\S+)\\.$\/, '\u55b6\u696d\u6642\u9593 $1\u301c$2\u3002\u6642\u9593\u8cb8\u3057\u306f$3\u307e\u3067\u306b\u3054\u8fd4\u5374\u304f\u3060\u3055\u3044\u3002'],\n  [\/^Business hours (\\S+)\u2013(\\S+)\\.$\/, '\u55b6\u696d\u6642\u9593 $1\u301c$2\u3002'],\n  [\/^Pickup & return: .*$\/, '\u53d7\u3051\u53d6\u308a\u30fb\u8fd4\u5374\uff1a' + JA_ADDRESS],\n  [\/^Location: .*$\/, '\u5834\u6240\uff1a' + JA_ADDRESS],\n  [\/^Roughly when will you pick up your luggage on (.+)\\? .*$\/, '$1\u306f\u4f55\u6642\u3054\u308d\u304a\u53d7\u3051\u53d6\u308a\u306b\u6765\u3089\u308c\u307e\u3059\u304b\uff1f\u55b6\u696d\u6642\u9593\u5185\u306a\u3089\u3044\u3064\u3067\u3082\u69cb\u3044\u307e\u305b\u3093\uff08\u3054\u7528\u610f\u306e\u76ee\u5b89\u306b\u3057\u307e\u3059\uff09\u3002'],\n  [\/^Now tap your pick-up date\\. Same-day pick-up is fine \\(up to (\\d+) days\\)\\..*$\/, '\u6b21\u306b\u304a\u53d7\u3051\u53d6\u308a\u65e5\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002\u5f53\u65e5\u306e\u304a\u53d7\u3051\u53d6\u308a\u3082\u53ef\u80fd\u3067\u3059\uff08\u6700\u9577$1\u65e5\uff09\u3002\u6599\u91d1\u306f\u304a\u9810\u3051\u65e5\u30fb\u304a\u53d7\u3051\u53d6\u308a\u65e5\u3092\u542b\u3080\u65e5\u6570\u3067\u8a08\u7b97\u3057\u307e\u3059\u3002'],\n  [\/^No open dates in the next (\\d+) days\\.$\/, '\u4eca\u5f8c$1\u65e5\u9593\u306b\u4e88\u7d04\u3067\u304d\u308b\u65e5\u304c\u3042\u308a\u307e\u305b\u3093\u3002'],\n  [\/^Longer hourly plans are unavailable because bikes must be back by (\\S+)\\..*$\/, '\u8fd4\u5374\u306f$1\u307e\u3067\u306e\u305f\u3081\u3001\u9577\u3044\u6642\u9593\u306e\u30d7\u30e9\u30f3\u306f\u9078\u3079\u307e\u305b\u3093\u3002\u9577\u304f\u4e57\u308a\u305f\u3044\u5834\u5408\u306f\u3001\u65e9\u3081\u306e\u53d7\u3051\u53d6\u308a\u6642\u523b\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002'],\n  [\/^For (\\d+)\\+ bikes, please contact us directly instead of booking online\\.$\/, '$1\u53f0\u4ee5\u4e0a\u306e\u5834\u5408\u306f\u3001\u30aa\u30f3\u30e9\u30a4\u30f3\u4e88\u7d04\u3067\u306f\u306a\u304f\u76f4\u63a5\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044\u3002'],\n  \/\/ 2026-10-01 \u8ffd\u52a0: \u4e88\u7d04\u30da\u30fc\u30b8\u5358\u4f53\uff08?lang=ja\uff09\u3067\u6b8b\u3063\u3066\u3044\u305f\u82f1\u8a9e\n  [\/^from \u00a5([\\d,]+)$\/, '\u00a5$1\u301c'],\n  [\/^Today \u00b7 (.+)$\/, '\u4eca\u65e5 \u00b7 $1'],\n  [\/^Tomorrow \u00b7 (.+)$\/, '\u660e\u65e5 \u00b7 $1'],\n  \/\/ \u300c\u65e5\u672c\u8a9e \/ English\u300d\u306e\u4f75\u8a18\u306f\u65e5\u672c\u8a9e\u3060\u3051\u306b\u3059\u308b\n  [\/^([^A-Za-z]*[^\\x00-\\x7F][\\s\\S]*?) \\\/ [A-Z][\\s\\S]*$\/, '$1'],\n];\n\/\/ \u82f1\u8a9e\u306e\u6587\u8a00\u3092\u65e5\u672c\u8a9e\u306b\u3059\u308b\uff08\u8a72\u5f53\u3057\u306a\u3051\u308c\u3070 null\uff09\nfunction toJa(text) {\n  const s = text.trim();\n  if (!s || !\/[A-Za-z]\/.test(s)) return null;\n  let out = Object.prototype.hasOwnProperty.call(JA_EXACT, s) ? JA_EXACT[s] : null;\n  if (out === null) {\n    for (const [re, rep] of JA_RULES) {\n      if (re.test(s)) { out = typeof rep === 'function' ? rep(s) : s.replace(re, rep); break; }\n    }\n  }\n  if (out === null) return null;\n  out = out.replace(\/\\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{1,2})\\b\/g, (m, mo, d) => JA_MONTH[mo] + '\u6708' + d + '\u65e5');\n  return text.replace(s, out);\n}\nfunction translateJa(root) {\n  const tw = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n  const nodes = [];\n  let n;\n  while ((n = tw.nextNode())) nodes.push(n);\n  nodes.forEach((node) => { const r = toJa(node.textContent); if (r !== null && r !== node.textContent) node.textContent = r; });\n  root.querySelectorAll('[placeholder]').forEach((i) => { const r = toJa(i.placeholder); if (r !== null) i.placeholder = r; });\n}\n\/\/ \u63cf\u753b\u306e\u305f\u3073\u306b\u65e5\u672c\u8a9e\u3078\u7f6e\u304d\u63db\u3048\u308b\uff08\u81ea\u5206\u306e\u66f8\u304d\u63db\u3048\u3067\u518d\u5ea6\u547c\u3070\u308c\u306a\u3044\u3088\u3046\u3001\u7f6e\u304d\u63db\u3048\u4e2d\u306f\u76e3\u8996\u3092\u6b62\u3081\u308b\uff09\nfunction startJaTranslation() {\n  document.documentElement.lang = 'ja';\n  const root = document.querySelector('.booking-wrap') || document.body;\n  let pending = false;\n  const obs = new MutationObserver(() => { if (!pending) { pending = true; Promise.resolve().then(run); } });\n  function run() {\n    pending = false;\n    obs.disconnect();\n    translateJa(root);\n    obs.observe(root, { childList: true, subtree: true, characterData: true });\n  }\n  run();\n  \/\/ \u4e88\u7d04\u6b04\u306e\u5916\uff08\u30da\u30fc\u30b8\u898b\u51fa\u3057\u3068\u4e0b\u306e\u30ab\u30fc\u30c9\uff09\u306f\u9759\u7684\u306a\u306e\u30671\u56de\u3060\u3051\u7f6e\u304d\u63db\u3048\u308b\uff082026-10-01\uff09\n  \/\/ WordPress \u306e\u7d75\u6587\u5b57\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u5f8c\u304b\u3089\u6587\u5b57\u3092\u5dee\u3057\u66ff\u3048\u308b\u306e\u3067\u3001\u8aad\u307f\u8fbc\u307f\u5b8c\u4e86\u5f8c\u306b\u3082\u3046\u4e00\u5ea6\u304b\u3051\u308b\n  const staticJa = () => ['.page-header', '.entry-body'].forEach((sel) => { const e = document.querySelector(sel); if (e) translateJa(e); });\n  if (!window.frameElement) { staticJa(); window.addEventListener('load', () => { staticJa(); setTimeout(staticJa, 1500); }); }\n}\n\n\/\/ \u30c4\u30a2\u30fc\u306e\u6240\u8981\u6642\u9593\uff08\u5206\uff09\u3002GAS \u306e BOOKING_CONFIG.tours \u306e durationMin \u3068\u63c3\u3048\u308b\uff08\u7121\u3044\u3082\u306e\u306f3\u6642\u9593\uff09\u3002\nconst TOUR_DURATION_MIN = { 'craft-course1': 195, 'craft-course2': 230, 'craft-course3': 270, 'tatsuno-ebike': 300, 'craft-beer-tour': 310,\n  'himeji-bar-hopping': 180, 'healing-cave-yasutomi': 510, 'shiso-sake-cycle': 375 };\nfunction tourDurationText() {\n  const m = TOUR_DURATION_MIN[state.activity] || 180;\n  const h = Math.floor(m \/ 60), mm = m % 60;\n  return mm ? (h + ' h ' + mm + ' min tour') : (h + '-hour tour');\n}\nconst bi = (ja, en) => LANG_JA ? ja : (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) return null;\n  if (activityKind() === 'luggage') { const q = luggageQuote(); return q && q.ok ? q.total : null; }\n  const ppl = Math.max(1, Number(state.people) || 1);\n  if (activityKind() === 'rental') {\n    const p = RENTAL_CONFIG.plans.find((x) => x.code === state.plan);\n    return p ? p.price * ppl : null;\n  }\n  if (!state.availability || !state.availability[state.date]) return null;\n  const day = state.availability[state.date];\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  if (state.private && tour.privatePrice) return Number(tour.privatePrice);\n  const unit = tour.pricePerPerson + (state.lunch && tour.lunchPricePerPerson ? Number(tour.lunchPricePerPerson) : 0);\n  return (ppl === 1 && tour.soloPrice) ? tour.soloPrice : unit * 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' : activityKind() === 'luggage' ? 'Choose drop-off & pick-up dates' : '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 = activityPayFirst() ? 'Continue to payment' : (alg ? '\u4e88\u7d04\u3059\u308b \/ Confirm booking' : 'Confirm booking');\n  const pay = document.querySelector('#summary-section .muted.small');\n  if (pay) {\n    let t;\n    if (activityPayFirst()) {\n      \/\/ \u5148\u6255\u3044\u5236\uff1a\u73fe\u5730\u6255\u3044\u306e\u9078\u629e\u80a2\u306f\u7121\u3044\u3002\u9001\u4fe1\u5f8c\u306f\u5fc5\u305aPayPal\u306e\u6c7a\u6e08\u30da\u30fc\u30b8\u3078\u79fb\u52d5\u3059\u308b\u65e8\u3092\u660e\u78ba\u306b\u4f1d\u3048\u308b\u3002\n      t = 'You will be taken to PayPal to pay now. Your booking is confirmed once payment is completed.';\n    } else {\n      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    }\n    pay.textContent = t;\n    if (LANG_JA && activityPayFirst()) pay.textContent = '\u300c\u304a\u652f\u6255\u3044\u3078\u9032\u3080\u300d\u306fPayPal\u306e\u304a\u652f\u6255\u3044\u753b\u9762\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002\u300c' + storeLabelJa() + '\u300d\u3092\u9078\u3076\u3068\u305d\u306e\u5834\u3067\u3054\u4e88\u7d04\u304c\u78ba\u5b9a\u3057\u3001\u5f53\u65e5\u3001' + payPlaceJa() + '\u3067\u304a\u652f\u6255\u3044\u3044\u305f\u3060\u3051\u307e\u3059\uff08\u73fe\u91d1\u306a\u3069\uff09\u3002';\n  if (activityPayFirst()) pay.textContent += LANG_JA ? '\u3000\u203b\u304a\u652f\u6255\u3044\u304c\u3046\u307e\u304f\u3044\u304b\u306a\u3044\u5834\u5408\u306f\u3001comecomehimeji@gmail.com \u307e\u3067\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002' : ' If your payment does not go through, please email comecomehimeji@gmail.com and we will help you complete your booking.';\n  }\n  const storeBtn = $('#store-btn');\n  if (storeBtn) { storeBtn.hidden = !(LANG_JA && activityPayFirst()); storeBtn.textContent = storeLabelJa(); }\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\n\/\/ \u57cb\u3081\u8fbc\u307f(iframe, ?compact=1)\u6642\u306b\u3001\u67a0\u306e\u9ad8\u3055\u3092\u4e88\u7d04\u30d5\u30a9\u30fc\u30e0(.booking-wrap)\u306e\u9ad8\u3055\u3078\u81ea\u52d5\u3067\u5408\u308f\u305b\u308b\u3002\n\/\/ \u89aa\u30da\u30fc\u30b8\u306f\u540c\u3058\u30c9\u30e1\u30a4\u30f3\u306a\u306e\u3067 frameElement \u3092\u76f4\u63a5\u5909\u66f4\u3067\u304d\u308b\uff08\u5225\u30c9\u30e1\u30a4\u30f3\u306b\u57cb\u3081\u8fbc\u307e\u308c\u305f\u5834\u5408\u306f\u4f55\u3082\u3057\u306a\u3044\uff09\u3002\n\/\/ \u4e88\u7d04\u30d5\u30a9\u30fc\u30e0\u3088\u308a\u4e0b\u306b\u3042\u308b Availability \u30da\u30fc\u30b8\u81ea\u4f53\u306e\u6848\u5185\u6587\u306f\u3001\u67a0\u306e\u5916\u306b\u306a\u308b\u306e\u3067\u8868\u793a\u3055\u308c\u306a\u3044\u3002\nfunction autoFitFrame() {\n  let fe = null;\n  try { fe = window.frameElement; } catch (e) { fe = null; }\n  const wrap = document.querySelector('.booking-wrap');\n  if (!fe || !wrap || typeof ResizeObserver === 'undefined') return;\n  const fit = () => {\n    const h = Math.ceil(wrap.getBoundingClientRect().bottom + window.scrollY) + 24;\n    if (Math.abs(fe.offsetHeight - h) > 4) fe.style.height = h + 'px';\n  };\n  new ResizeObserver(fit).observe(wrap);\n  fit();\n}\n\nasync function init() {\n  const qs = new URLSearchParams(location.search);\n  if (LANG_JA) startJaTranslation();\n\n  if (!document.querySelector('meta[name=\"color-scheme\"]')) {\n    const meta = document.createElement('meta');\n    meta.name = 'color-scheme';\n    meta.content = 'light';\n    document.head.appendChild(meta);\n  }\n  document.documentElement.style.colorScheme = 'light';\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\n  \/\/ \u57cb\u3081\u8fbc\u307f\u30e2\u30fc\u30c9\uff08&compact=1 \u304b\u3064 activity \u6307\u5b9a\u3042\u308a\uff09: \u5404\u30c4\u30a2\u30fc\u30da\u30fc\u30b8\u306b iframe \u3067\u76f4\u63a5\u57cb\u3081\u8fbc\u3080\u7528\u3002\n  \/\/ \u30d8\u30c3\u30c0\u30fc\u3068\u300c\u4f55\u3092\u4e88\u7d04\u3057\u307e\u3059\u304b\u300d\u9078\u629e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u975e\u8868\u793a\u306b\u3057\u3001\u65e5\u4ed8\u9078\u629e\u304b\u3089\u5373\u8868\u793a\u3059\u308b\u3002\n  if (qs.get('compact') === '1') {\n    state.compactEmbed = true;\n    const style = document.createElement('style');\n    style.textContent = [\n      '#wpadminbar, #site-header, #breadcrumb, .site-footer, .page-header { display: none !important; }',\n      '#vk-mobile-nav-menu-btn, #vk-mobile-nav { display: none !important; }',\n      '.entry-body > *:not(.booking-embed), .site-body-bottom { display: none !important; }',\n      '.grecaptcha-badge { visibility: hidden !important; }',\n      '.site-body { padding-top: 0 !important; padding-bottom: 0 !important; }',\n      'html { margin-top: 0 !important; }',\n      'body { margin: 0 !important; padding-top: 0 !important; background: #fff !important; }',\n      '.site-body-container, .main-section, .entry-body { padding: 0 !important; margin: 0 !important; max-width: none !important; }',\n    ].join('\\n');\n    document.head.appendChild(style);\n\n    if (state.activity) {\n      const header = document.querySelector('.booking-wrap > .page-header');\n      if (header) header.hidden = true;\n      const pickerSection = document.querySelector('#form-body > section.block');\n      if (pickerSection) pickerSection.hidden = true;\n      state.showTourCalendar = true;\n    }\n    \/\/ reCAPTCHA \u30d0\u30c3\u30b8\u3092\u96a0\u3059\u4ee3\u308f\u308a\u306b\u3001Google\u898f\u7d04\u3069\u304a\u308a\u306e\u6ce8\u8a18\u3092\u5165\u308c\u308b\n    const privNote = document.querySelector('#privacy-note');\n    if (privNote) {\n      const rcNote = document.createElement('p');\n      rcNote.className = 'muted small';\n      if (LANG_JA) rcNote.innerHTML = '\u3053\u306e\u30b5\u30a4\u30c8\u306freCAPTCHA\u3067\u4fdd\u8b77\u3055\u308c\u3066\u304a\u308a\u3001Google\u306e<a href=\"https:\/\/policies.google.com\/privacy\" target=\"_blank\" rel=\"noopener\">\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u30dd\u30ea\u30b7\u30fc<\/a>\u3068<a href=\"https:\/\/policies.google.com\/terms\" target=\"_blank\" rel=\"noopener\">\u5229\u7528\u898f\u7d04<\/a>\u304c\u9069\u7528\u3055\u308c\u307e\u3059\u3002';\n      else rcNote.innerHTML = 'This site is protected by reCAPTCHA and the Google <a href=\"https:\/\/policies.google.com\/privacy\" target=\"_blank\" rel=\"noopener\">Privacy Policy<\/a> and <a href=\"https:\/\/policies.google.com\/terms\" target=\"_blank\" rel=\"noopener\">Terms of Service<\/a> apply.';\n      privNote.parentNode.insertBefore(rcNote, privNote.nextSibling);\n    }\n    autoFitFrame();\n  }\n  \/\/ \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u30fb\u8377\u7269\u9810\u304b\u308a\u304c\u4e8b\u524d\u306b\u9078\u3070\u308c\u3066\u3044\u308c\u3070\u3001\u4f11\u696d\u65e5\u306e\u53d6\u5f97\u3092\u4eca\u3059\u3050\u59cb\u3081\u308b\uff08availability \u3068\u4e26\u884c\uff09\n  if (state.activity && (activityKind() === 'luggage' || activityKind() === 'rental')) loadStoreClosed();\n  \/\/ \u30c4\u30a2\u30fc\u304c\u4e8b\u524d\u306b\u9078\u3070\u308c\u3066\u3044\u308c\u3070\u3001\u5019\u88dc\u65e5\u306e\u53d6\u5f97\u3082\u4eca\u3059\u3050\u59cb\u3081\u308b\uff08availability \u3068\u4e26\u884c\u30012026-09-29\uff09\n  if (state.activity && ['algueblue', 'luggage', 'rental'].indexOf(activityKind()) === -1) loadTourOpenDays(state.activity);\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\u3092\u4e26\u884c\u53d6\u5f97\u3002\n    \/\/ \u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u4ee5\u5916\u304c\u4e8b\u524d\u306b\u9078\u3070\u308c\u3066\u3044\u308b\u3068\u304d\u306f\u5019\u88dc\u65e5\u3092\u5f85\u305f\u305a\u306b\u8868\u793a\u3057\u3001\u5c4a\u3044\u305f\u3089\u53cd\u6620\u3059\u308b\uff082026-09-29\uff09\u3002\n    const openP = fetchJsonRetry(WEBAPP_URL + '?action=algueblueOpenDays&days=' + ALGUEBLUE_HORIZON_DAYS).catch(() => null);\n    const data = await fetchJsonRetry(WEBAPP_URL + '?action=availability');\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    const applyOpenDays = (od) => { if (od && od.ok) state.openDays = od.openDays || []; };\n    if (!state.activity || isAlg()) applyOpenDays(await openP);\n    else openP.then((od) => { applyOpenDays(od); if (isAlg()) renderDates(); });\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 check your connection and try again.';\n    const rl = el('button', 'choice', 'Reload');\n    rl.type = 'button';\n    rl.onclick = () => location.reload();\n    $('#status').appendChild(document.createElement('br'));\n    $('#status').appendChild(rl);\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.filter((a) => !a.hiddenFromPicker).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: '', lunch: false, endDate: null, endTime: null, large: 0, small: 0, lugMode: 'drop', 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\n\/\/ \u9078\u629e\u4e2d\u306e\u65e5\u4ed8\u30fb\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u306e tours \u30c7\u30fc\u30bf\uff08\u76f8\u4e57\u308a\u5224\u5b9a\u7528\u30012026-09-30\uff09\u3002\nfunction selectedDayTour_() { const d = state.availability && state.date && state.availability[state.date]; return (d && d.tours) ? d.tours[state.activity] : null; }\n\/\/ \u76f8\u4e57\u308a\uff08GAS\u304c joining:true \u3092\u8fd4\u3059\u65e5\uff09\u306f\u3001\u4e0a\u9650=\u6b8b\u308a\u5e2d\u3001\u4e0b\u9650=1\u540d\u3002\nfunction activityMaxPeople() { const a = ACTIVITIES.find((x) => x.code === state.activity); const base = (a && a.maxPeople) || 20; const t = selectedDayTour_(); return (t && t.joining) ? Math.min(base, t.capacity) : base; }\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 t = selectedDayTour_(); if (t && t.joining) return t.minPeople || 1; const a = ACTIVITIES.find((x) => x.code === state.activity); return (a && a.minPeople) || 1; }\n\/\/ \u9078\u629e\u4e2d\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u304c\u5148\u6255\u3044\u5236\uff08PayPal Orders v2\u3001\u9001\u4fe1\u5f8c\u306f\u5fc5\u305a\u6c7a\u6e08\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1d\u73fe\u5730\u6255\u3044\u9078\u629e\u80a2\u306a\u3057\uff09\u304b\u3002\nfunction activityPayFirst() { const a = ACTIVITIES.find((x) => x.code === state.activity); return !!(a && a.payFirst); }\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') { const calWrap = el('div', 'tour-calendar'); wrap.appendChild(calWrap); renderAlgueblueCalendar(calWrap); return; }\n  if (activityKind() === 'rental') { renderRentalDate(wrap); return; }\n  if (activityKind() === 'luggage') { renderLuggageDates(wrap); return; }\n  renderTourDates(wrap);\n}\n\n\/\/ \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u306f\u30b9\u30bf\u30c3\u30d5\u306e\u51fa\u52e4\u306b\u7d10\u3065\u304b\u306a\u3044\uff08\u30ac\u30a4\u30c9\u7121\u3057\u30fb\u81ea\u8d70\u306e\u305f\u3081\uff09\u306e\u3067\u3001\u5e97\u982d\u306e\u4f11\u696d\u65e5\u3060\u3051\u3092\u898b\u305f\n\/\/ Open\/Closed \u306e\u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u3067\u8cb8\u51fa\u65e5\u3092\u9078\u3076\uff082026-09-28\u5909\u66f4\u3001\u4ee5\u524d\u306f\u7d20\u6734\u306a\u65e5\u4ed8\u5165\u529b\uff09\u3002\n\/\/ \u5b9f\u969b\u306e\u5728\u5eab\u30c1\u30a7\u30c3\u30af(3\u53f0\u4e0a\u9650)\u3068\u4f11\u696d\u65e5\u306e\u6700\u7d42\u30c1\u30a7\u30c3\u30af\u306f\u9001\u4fe1\u6642\u306bguardRentalCycle_\u304c\u884c\u3046\u3002\nfunction renderRentalDate(wrap) {\n  if (!ensureStoreClosed(wrap)) return;\n  wrap.appendChild(el('p', 'muted small', 'Tap your pickup date. Grey days are closed.'));\n  const calWrap = el('div', 'tour-calendar');\n  wrap.appendChild(calWrap);\n  renderCalendarGrid(calWrap, STORE_HORIZON_DAYS, (ds) => state.storeClosed.indexOf(ds) === -1, selectRentalDate);\n}\n\nfunction selectRentalDate(ds) {\n  Object.assign(state, { date: ds, plan: null, start: null });\n  renderDates(); renderDetails(); renderSummary();\n}\n\n\/\/ \u5e97\u982d\u53d7\u4ed8\uff08\u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u30fb\u8377\u7269\u9810\u304b\u308a\uff09\u306e\u4f11\u696d\u65e5\u3092\u521d\u56de\u3060\u3051\u53d6\u5f97\u3002\u4f11\u696d\u65e5\u306fGoogle\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u5168\u4f11\u304b\u3089\n\/\/ GAS \u306e storeClosedDays \u304c\u8fd4\u3059\uff08\u65e5\u66dc\u30fb\u8d64\u3044\u65e5\u306e\u5168\u4f11\u306e\u307f\u3002\u5e73\u65e5\u30fb\u571f\u66dc\u306f\u5168\u4f11\u3067\u3082\u5e97\u982d\u53d7\u4ed8\u3042\u308a\uff09\u3002\n\/\/ \u53d6\u5f97\u6e08\u307f\u306a\u3089 true\u3002\u672a\u53d6\u5f97\u306a\u3089\u300c\u8aad\u307f\u8fbc\u307f\u4e2d\u300d\u3092\u51fa\u3057\u3066\u53d6\u5f97\u3092\u59cb\u3081\u3001\u53d6\u5f97\u5f8c\u306b\u65e5\u4ed8\u6b04\u3092\u63cf\u304d\u76f4\u3059\u3002\n\/\/ \u53d6\u5f97\u306b\u5931\u6557\u3057\u305f\u5834\u5408\u306f\u5168\u65e5 Open \u6271\u3044\uff08\u9001\u4fe1\u6642\u306b guardRentalCycle_\/guardLuggage_ \u304c\u540c\u3058\u5224\u5b9a\u3067\u6700\u7d42\u30c1\u30a7\u30c3\u30af\u3059\u308b\uff09\u3002\nfunction ensureStoreClosed(wrap) {\n  if (state.storeClosed) return true;\n  wrap.appendChild(el('p', 'muted small', 'Loading calendar\u2026'));\n  loadStoreClosed();\n  return false;\n}\n\n\/\/ \u4f11\u696d\u65e5\u306e\u53d6\u5f97\u3092\u59cb\u3081\u308b\uff08\u53d6\u5f97\u6e08\u307f\u30fb\u53d6\u5f97\u4e2d\u306a\u3089\u4f55\u3082\u3057\u306a\u3044\uff09\u3002\u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u30fb\u8377\u7269\u9810\u304b\u308a\u306e\u57cb\u3081\u8fbc\u307f\u3067\u306f init \u304b\u3089\u5148\u306b\u547c\u3073\u3001\n\/\/ availability \u3068\u4e26\u884c\u3057\u3066\u53d6\u5f97\u3059\u308b\u3002\u53d6\u5f97\u5f8c\u306e\u63cf\u304d\u76f4\u3057\u306f availability \u306e\u53d6\u5f97\u5f8c\u3060\u3051\u884c\u3046\uff08\u305d\u308c\u307e\u3067\u306f init \u304c\u63cf\u304f\uff09\u3002\nfunction loadStoreClosed() {\n  if (state.storeClosed || state.storeClosedLoading) return;\n  state.storeClosedLoading = true;\n  fetchJsonRetry(WEBAPP_URL + '?action=storeClosedDays&days=' + STORE_HORIZON_DAYS)\n    .then((d) => { state.storeClosed = (d && d.ok && d.closedDays) || []; })\n    .catch(() => { state.storeClosed = []; })\n    .then(() => { state.storeClosedLoading = false; if ((activityKind() === 'luggage' || activityKind() === 'rental') && state.availability) { renderDates(); renderDetails(); } });\n}\n\n\/\/ GAS \u304c\u307e\u308c\u306b JSON \u3067\u306a\u304f HTML \u306e\u30a8\u30e9\u30fc\u753b\u9762\u3092\u8fd4\u3059\u3053\u3068\u304c\u3042\u308b\u306e\u3067\u3001\u8aad\u3081\u306a\u3051\u308c\u30701\u79d2\u5f8c\u306b1\u56de\u3060\u3051\u53d6\u308a\u76f4\u3059\u3002\n\/\/ \u5fdc\u7b54\u304c\u8fd4\u3089\u306a\u3044\u307e\u307e\u6b62\u307e\u3089\u306a\u3044\u3088\u3046\u30018\u79d2\u30fb10\u79d2\u30fb25\u79d2\u3067\u6253\u3061\u5207\u3063\u3066\u6700\u59273\u56de\u307e\u3067\u53d6\u308a\u76f4\u3059\uff082026-09-29\u3002GAS\u306e\u5165\u53e3\u304c\u30e9\u30f3\u30c0\u30e0\u306b10\u301c30\u79d2\u8a70\u307e\u308b\uff0f404\u3092\u8fd4\u3059\u305f\u3081\u3002\n\/\/ GAS\u5074\u306e\u51e6\u7406\u81ea\u4f53\u306f1\u79d2\u4ee5\u5185\u306b\u7d42\u308f\u3063\u3066\u3044\u308b\u306e\u3067\u3001\u77ed\u304f\u533a\u5207\u3063\u3066\u53d6\u308a\u76f4\u3059\u307b\u3046\u304c\u65e9\u304f\u8868\u793a\u3067\u304d\u308b\uff09\u3002\n\/\/ \u8aad\u307f\u53d6\u308a\u306f WordPress \u5074\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\uff08act-booking\/v1\/gas\uff09\u3092\u5148\u306b\u4f7f\u3046\uff082026-09-30\uff09\u3002\u540c\u3058\u30b5\u30a4\u30c8\u5185\u306a\u306e\u3067\u901f\u304f\u3001\n\/\/ GAS \u306e\u5165\u53e3\u304c\u8a70\u307e\u3063\u3066\u3044\u3066\u3082\u5f85\u305f\u3055\u308c\u306a\u3044\u3002\u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u4f7f\u3048\u306a\u3044\u3068\u304d\u3060\u3051 GAS \u306b\u76f4\u63a5\u53d6\u308a\u306b\u884c\u304f\u3002\nconst READ_PROXY_URL = '\/local\/wp-json\/act-booking\/v1\/gas';\nfunction toReadProxy(url) {\n  if (url.indexOf(WEBAPP_URL + '?') !== 0) return null;\n  if (location.hostname !== 'www.travel-network-act.co.jp') return null;\n  return READ_PROXY_URL + url.slice(WEBAPP_URL.length);\n}\nfunction fetchJsonRetry(url) {\n  const once = (ms, u) => {\n    const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n    const timer = ac ? setTimeout(() => ac.abort(), ms) : null;\n    return fetch(u || url, { cache: 'no-store', signal: ac ? ac.signal : undefined })\n      .then((r) => r.json())\n      .finally(() => { if (timer) clearTimeout(timer); });\n  };\n  const proxied = toReadProxy(url);\n  if (proxied) {\n    return once(18000, proxied)\n      .then((d) => { if (!d || d.ok !== true) throw new Error('read cache unavailable'); return d; })\n      .catch(() => fetchJsonDirect_(once));\n  }\n  return fetchJsonDirect_(once);\n}\n\/\/ GAS \u306b\u76f4\u63a5\u53d6\u308a\u306b\u884c\u304f\uff088\u79d2\u30fb10\u79d2\u30fb25\u79d2\u30673\u56de\u307e\u3067\uff09\nfunction fetchJsonDirect_(once) {\n  const wait = () => new Promise((res) => setTimeout(res, 500));\n  return once(8000).catch(() => wait().then(() => once(10000))).catch(() => wait().then(() => once(25000)));\n}\n\n\/\/ \u8377\u7269\u9810\u304b\u308a\uff1aOpen\/Closed \u306e\u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u3067\u9810\u3051\u65e5\u2192\u53d7\u53d6\u65e5\u306e\u9806\u306b\u9078\u3076\u3002\n\/\/ \u53d7\u53d6\u65e5\u306f\u9810\u3051\u65e5\u301c\u9810\u3051\u65e5+(maxDays-1)\u65e5\u3002\nfunction renderLuggageDates(wrap) {\n  const lc = LUGGAGE_CONFIG;\n  if (!ensureStoreClosed(wrap)) return;\n  const picking = !!state.date && state.lugMode === 'pickup';\n  const steps = el('div', 'choices');\n  const b1 = el('button', 'choice' + (!picking ? ' selected' : ''), '1. Drop-off: ' + (state.date ? fmtDateLabel(state.date, -1) : '\u2014'));\n  b1.type = 'button';\n  b1.onclick = () => { state.lugMode = 'drop'; renderDates(); };\n  const b2 = el('button', 'choice' + (picking ? ' selected' : '') + (state.date ? '' : ' disabled'), '2. Pick-up: ' + (state.date ? fmtDateLabel(state.endDate || state.date, -1) : '\u2014'));\n  b2.type = 'button';\n  b2.disabled = !state.date;\n  b2.onclick = () => { state.lugMode = 'pickup'; renderDates(); };\n  steps.appendChild(b1); steps.appendChild(b2);\n  wrap.appendChild(steps);\n  wrap.appendChild(el('p', 'muted small', picking\n    ? 'Now tap your pick-up date. Same-day pick-up is fine (up to ' + lc.maxDays + ' days). Storage is charged per calendar day, drop-off and pick-up days included.'\n    : 'Tap your drop-off date. Grey days are closed.'));\n  const calWrap = el('div', 'tour-calendar');\n  wrap.appendChild(calWrap);\n  const isOpen = (ds) => {\n    if (state.storeClosed.indexOf(ds) !== -1) return false;\n    if (!picking) return true;\n    return ds >= state.date && ds <= luggageAddDays(state.date, lc.maxDays - 1);\n  };\n  const isSel = (ds) => !!state.date && ds >= state.date && ds <= (state.endDate || state.date);\n  renderCalendarGrid(calWrap, STORE_HORIZON_DAYS, isOpen, picking ? selectLuggagePickup : selectLuggageDropoff, isSel);\n}\n\nfunction selectLuggageDropoff(ds) {\n  state.date = ds;\n  if (!state.endDate || state.endDate < ds || state.endDate > luggageAddDays(ds, LUGGAGE_CONFIG.maxDays - 1)) state.endDate = ds;\n  state.start = null;\n  state.endTime = null;\n  state.lugMode = 'pickup';\n  renderDates(); renderDetails(); renderSummary();\n}\n\nfunction selectLuggagePickup(ds) {\n  state.endDate = ds;\n  if (!luggagePickupTimeValid()) state.endTime = null;\n  renderDates(); renderDetails(); renderSummary();\n}\n\n\/\/ \u5f53\u65e5\u53d7\u53d6\u306a\u3089\u53d7\u53d6\u6642\u523b\u306f\u9810\u3051\u6642\u523b\u3088\u308a\u5f8c\uff08\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 guardLuggage_ \u3068\u540c\u3058\u5224\u5b9a\uff09\nfunction luggagePickupTimeValid() {\n  if (!state.endTime) return false;\n  if ((state.endDate || state.date) !== state.date || !state.start) return true;\n  return state.endTime > state.start;\n}\n\n\/\/ 'YYYY-MM-DD' \u306b n \u65e5\u8db3\u3057\u305f\u65e5\u4ed8\uff08UTC\u8a08\u7b97\u3067\u7aef\u672bTZ\u306b\u4f9d\u5b58\u3057\u306a\u3044\uff09\nfunction luggageAddDays(ymd, n) {\n  const [y, m, d] = ymd.split('-').map(Number);\n  const t = new Date(Date.UTC(y, m - 1, d + n));\n  return t.getUTCFullYear() + '-' + ('0' + (t.getUTCMonth() + 1)).slice(-2) + '-' + ('0' + t.getUTCDate()).slice(-2);\n}\n\n\/\/ \u9810\u3051\u65e5\u301c\u53d7\u53d6\u65e5\u306e\u66a6\u65e5\u6570\uff08\u4e21\u7aef\u542b\u3080\uff09\u3068\u6599\u91d1\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 guardLuggage_ \u3068\u540c\u3058\u8a08\u7b97\u5f0f\u3002\nfunction luggageQuote() {\n  if (!state.date) return null;\n  const end = state.endDate || state.date;\n  const [y1, m1, d1] = state.date.split('-').map(Number);\n  const [y2, m2, d2] = end.split('-').map(Number);\n  const days = Math.round((Date.UTC(y2, m2 - 1, d2) - Date.UTC(y1, m1 - 1, d1)) \/ 86400000) + 1;\n  const large = Number(state.large) || 0, small = Number(state.small) || 0;\n  const [L, S] = LUGGAGE_CONFIG.sizes;\n  const perDay = large * L.price + small * S.price;\n  const ok = days >= 1 && days <= LUGGAGE_CONFIG.maxDays && large + small >= 1;\n  return { ok: ok, days: days, end: end, large: large, small: small, perDay: perDay, total: perDay * days };\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  \/\/ \u57cb\u3081\u8fbc\u307f\u6642\u306f\u300cToday \/ Tomorrow\u300d\u3068\u300cHide calendar\u300d\u3092\u51fa\u3055\u305a\u3001\u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u3060\u3051\u306b\u3059\u308b\uff08\u4eca\u65e5\u30fb\u660e\u65e5\u3082\u30ab\u30ec\u30f3\u30c0\u30fc\u304b\u3089\u9078\u3079\u308b\uff09\n  if (state.compactEmbed) {\n    state.showTourCalendar = true;\n    const calWrap = el('div', 'tour-calendar');\n    wrap.appendChild(calWrap);\n    renderTourCalendar(calWrap);\n    return;\n  }\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\/* ---- \u6708\u30ab\u30ec\u30f3\u30c0\u30fc\u5171\u901a\u90e8\u54c1\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u30fb\u30c4\u30a2\u30fc\u517c\u7528\u3002\u4eca\u65e5\u301chorizonDays\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\n\/\/ horizonDays: \u4eca\u65e5\u304b\u3089\u4f55\u65e5\u5148\u307e\u3067\u8868\u793a\u3059\u308b\u304b\uff08\u30a2\u30eb\u30b0\u30d6\u30eb\u30fc\u3068\u30c4\u30a2\u30fc\u3067\u4e0a\u9650\u304c\u7570\u306a\u308b\u305f\u3081\u547c\u3073\u51fa\u3057\u5074\u304b\u3089\u6e21\u3059\uff09\u3002\nfunction renderCalendarGrid(wrap, horizonDays, isOpenFn, onSelect, isSelectedFn) {\n  const today = todayYmd();\n  const endYmd = addDaysYmd(today, horizonDays - 1);\n  const todayD = ymdToDate(today), endD = ymdToDate(endYmd);\n  let skippedOpen = 0;\n  if (!state.calMonth) {\n    state.calMonth = { y: todayD.getFullYear(), m: todayD.getMonth() };\n    \/\/ \u6708\u672b\u3067\u4eca\u6708\u306b\u9078\u3079\u308b\u65e5\u304c\u307b\u3068\u3093\u3069\u7121\u3051\u308c\u3070\u3001\u7fcc\u6708\u304b\u3089\u8868\u793a\u3059\u308b\uff082026-09-29\uff09\n    const monthEnd = dateToYmd(new Date(todayD.getFullYear(), todayD.getMonth() + 1, 0));\n    const daysLeft = Math.round((ymdToDate(monthEnd) - todayD) \/ 86400000) + 1;\n    let openLeft = 0;\n    for (let ds = today; ds <= monthEnd && ds <= endYmd; ds = addDaysYmd(ds, 1)) if (isOpenFn(ds)) openLeft++;\n    \/\/ \u4eca\u65e5\u304c\u9078\u3079\u308b\uff08\u5f53\u65e5\u4e88\u7d04\u3067\u304d\u308b\uff09\u3068\u304d\u306f\u4eca\u6708\u306e\u307e\u307e\n    if (monthEnd < endYmd && !isOpenFn(today) && (openLeft === 0 || (daysLeft <= 7 && openLeft <= 2))) {\n      state.calMonth = (todayD.getMonth() === 11) ? { y: todayD.getFullYear() + 1, m: 0 } : { y: todayD.getFullYear(), m: todayD.getMonth() + 1 };\n      skippedOpen = openLeft;\n    }\n  }\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  if (skippedOpen) wrap.appendChild(el('p', 'muted small', 'A few dates are still open this month \u2014 tap \u2039 to see them.'));\n\n  const dow = el('div', 'cal-grid cal-dow');\n  \/\/ \u67a0\u304c\u72ed\u3044\u82f1\u8a9e\u8868\u793a\u3067\u306f\u300c\u571f\/Sa\u300d\u304c\u53ce\u307e\u3089\u306a\u3044\u306e\u3067\u82f1\u8a9e\u3060\u3051\u306b\u3059\u308b\uff082026-09-30\u3002\u65e5\u672c\u8a9e\u8868\u793a\u306f\u7ffb\u8a33\u30671\u6587\u5b57\u306b\u306a\u308b\uff09\n  const dowShort = !LANG_JA && document.documentElement.clientWidth < 330;\n  CAL_DOW.forEach((d) => dow.appendChild(el('div', 'cal-dowcell', dowShort ? d.split('\/')[1] : 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      + ((isSelectedFn ? isSelectedFn(ds) : 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, ALGUEBLUE_HORIZON_DAYS, 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    if (state.tourOpenDaysError && state.tourOpenDaysError[code]) {\n      \/\/ \u53d6\u5f97\u5931\u6557\u306f\u300c\u7a7a\u304d\u306a\u3057\u300d\u3068\u533a\u5225\u3057\u3066\u3001\u53d6\u308a\u76f4\u3057\u30dc\u30bf\u30f3\u3092\u51fa\u3059\uff082026-09-29\uff09\n      wrap.appendChild(el('p', 'muted small', 'Could not load available dates. Please check your connection and try again.'));\n      const rb = el('button', 'choice', 'Try again');\n      rb.type = 'button';\n      rb.onclick = () => { state.tourOpenDaysError[code] = false; loadTourOpenDays(code); renderDates(); };\n      wrap.appendChild(rb);\n      return;\n    }\n    wrap.appendChild(el('p', 'muted small', 'Loading available dates\u2026'));\n    loadTourOpenDays(code);\n    return;\n  }\n  renderCalendarGrid(wrap, TOUR_HORIZON_DAYS, isTourDayOpen, selectTourDate);\n  if (!(state.tourOpenDays[code] || []).length) {\n    wrap.appendChild(el('p', 'muted small', 'No open dates in the next ' + TOUR_HORIZON_DAYS + ' days.'));\n  }\n}\n\n\/\/ \u30c4\u30a2\u30fc\u306e\u5019\u88dc\u65e5\u306e\u53d6\u5f97\u3092\u59cb\u3081\u308b\uff08\u53d6\u5f97\u6e08\u307f\u30fb\u53d6\u5f97\u4e2d\u306a\u3089\u4f55\u3082\u3057\u306a\u3044\uff09\u3002\u53d6\u5f97\u5f8c\u3001availability \u304c\u63c3\u3063\u3066\u3044\u308c\u3070\u65e5\u4ed8\u6b04\u3092\u63cf\u304d\u76f4\u3059\u3002\nfunction loadTourOpenDays(code) {\n  state.tourOpenDaysLoading = state.tourOpenDaysLoading || {};\n  state.tourOpenDaysError = state.tourOpenDaysError || {};\n  if (state.tourOpenDays[code] || state.tourOpenDaysLoading[code]) return;\n  state.tourOpenDaysLoading[code] = true;\n  fetchJsonRetry(WEBAPP_URL + '?action=tourOpenDays&activity=' + encodeURIComponent(code) + '&days=' + TOUR_HORIZON_DAYS)\n    .then((d) => { if (!d || !d.ok) throw new Error((d && d.error) || 'load failed'); state.tourOpenDays[code] = d.openDays || []; })\n    .catch(() => { state.tourOpenDaysError[code] = true; })\n    .then(() => { state.tourOpenDaysLoading[code] = false; if (state.activity === code && state.availability && state.dates) renderDates(); });\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 data = await fetchJsonRetry(WEBAPP_URL + '?action=availability&date=' + ds);\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 data = await fetchJsonRetry(WEBAPP_URL + '?action=availability&date=' + ds);\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  \/\/ \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u306f\u30b9\u30bf\u30c3\u30d5\u51fa\u52e4\u306b\u7d10\u3065\u304b\u306a\u3044\u305f\u3081\u3001availability\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u8f09\u3063\u3066\u3044\u306a\u304f\u3066\u3082\u5e38\u306bOK\u6271\u3044\n  \/\/ \uff08\u5b9f\u969b\u306e3\u53f0\u4e0a\u9650\u30c1\u30a7\u30c3\u30af\u306f\u9001\u4fe1\u6642\u306bguardRentalCycle_\u304c\u884c\u3046\uff09\u3002\u4ed6\u306ekind\u3088\u308a\u5148\u306b\u5224\u5b9a\u3059\u308b\n  \/\/ \uff08\u30ad\u30e3\u30c3\u30b7\u30e5\u672a\u53d6\u5f97\u306e\u672a\u6765\u65e5\u3060\u3068\u5f8c\u7d9a\u306e`!day`\u30c1\u30a7\u30c3\u30af\u3067false\u306b\u306a\u3063\u3066\u3057\u307e\u3046\u305f\u3081\uff09\u3002\n  if (activityKind() === 'rental' || activityKind() === 'luggage') return true;\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 if (activityKind() === 'rental') renderRentalDetails(sec);\n  else if (activityKind() === 'luggage') renderLuggageDetails(sec);\n  else renderTourDetails(sec);\n  if (activityKind() !== 'luggage') renderPeople(sec);\n  if (selectedPrivatePrice_()) renderPrivate(sec); else state.private = false;\n  if (selectedLunchPrice_()) renderLunch(sec);\n  if (activityRequiresHeight()) renderHeight(sec);\n  renderContact(sec);\n}\n\n\/\/ 2026-10-21: \u8cb8\u5207\uff08\u65e7\u8857\u9053\u30fb\u98fe\u78e8\uff09\u3002GAS \u304c tours[code].privatePrice \u3092\u8fd4\u3059\u30c4\u30a2\u30fc\u3060\u3051\u51fa\u3059\u30021\u7d445\u540d\u307e\u3067\u5b9a\u984d\u30fb\u51fa\u767a\u67a0\u3092\u4e38\u3054\u3068\u5360\u6709\u3002\nfunction selectedPrivatePrice_() {\n  if (activityKind() !== 'tour' || !state.date || !state.availability || !state.availability[state.date]) return 0;\n  const t = (state.availability[state.date].tours || {})[state.activity];\n  return (t && t.privatePrice) ? Number(t.privatePrice) : 0;\n}\nfunction renderPrivate(sec) {\n  const price = selectedPrivatePrice_();\n  const t = selectedDayTour_();\n  const max = (t && t.capacity) || 5;\n  sec.appendChild(el('h3', 'step-title', bi('\u3054\u5229\u7528\u30bf\u30a4\u30d7', 'Tour type')));\n  const wrap = el('div', 'choices');\n  [[false, bi('\u901a\u5e38\uff08\u4ed6\u306e\u304a\u5ba2\u69d8\u3068\u540c\u3058\u51fa\u767a\u306b\u306a\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\uff09', 'Regular (you may ride with other guests)')], [true, bi('\u8cb8\u5207\uff081\u7d44' + max + '\u540d\u307e\u3067 \u00a5' + price.toLocaleString() + '\uff09', 'Private (up to ' + max + ' guests, \u00a5' + price.toLocaleString() + ' per group)')]].forEach(([v, label]) => {\n    const b = el('button', 'choice' + (!!state.private === v ? ' selected' : ''), label);\n    b.type = 'button';\n    b.onclick = () => { state.private = v; renderDetails(); renderSummary(); };\n    wrap.appendChild(b);\n  });\n  sec.appendChild(wrap);\n  if (state.private) sec.appendChild(el('p', 'muted small', bi('\u8cb8\u5207\u306f\u305d\u306e\u51fa\u767a\u6642\u9593\u30921\u7d44\u3067\u8cb8\u3057\u5207\u308a\u307e\u3059\uff08\u6599\u91d1\u306f\u4eba\u6570\u306b\u304b\u304b\u308f\u3089\u305a\u5b9a\u984d\uff09\u3002\u3059\u3067\u306b\u4ed6\u306e\u4e88\u7d04\u304c\u5165\u3063\u3066\u3044\u308b\u6642\u9593\u306f\u3054\u9078\u629e\u3044\u305f\u3060\u3051\u307e\u305b\u3093\u3002', 'A private tour reserves the whole departure for your group at a flat price, regardless of group size. It is not available for a time that already has other bookings.')));\n}\n\n\/\/ 2026-10-06: \u30e9\u30f3\u30c1\u8ffd\u52a0\u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u305f\u3064\u306e\uff09\u3002GAS \u304c tours[code].lunchPricePerPerson \u3092\u8fd4\u3059\u30c4\u30a2\u30fc\u3060\u3051\u51fa\u3059\u3002\u53c2\u52a0\u8005\u5168\u54e1\u306b\u4ed8\u3051\u308b\/\u4ed8\u3051\u306a\u3044\u306e2\u629e\u3002\nfunction selectedLunchPrice_() {\n  if (activityKind() !== 'tour' || !state.date || !state.availability || !state.availability[state.date]) return 0;\n  const t = (state.availability[state.date].tours || {})[state.activity];\n  return (t && t.lunchPricePerPerson) ? Number(t.lunchPricePerPerson) : 0;\n}\nfunction renderLunch(sec) {\n  const price = selectedLunchPrice_();\n  sec.appendChild(el('h3', 'step-title', bi('\u8336\u61d0\u77f3\u30e9\u30f3\u30c1', 'Tea-kaiseki lunch')));\n  const wrap = el('div', 'choices');\n  [[false, bi('\u30e9\u30f3\u30c1\u306a\u3057', 'Without lunch')], [true, bi('\u5168\u54e1\u306b\u30e9\u30f3\u30c1\u3092\u4ed8\u3051\u308b\uff08+\u00a5' + price.toLocaleString() + '\uff0f\u4eba\uff09', 'Add lunch for all participants (+\u00a5' + price.toLocaleString() + '\/person)')]].forEach(([v, label]) => {\n    const b = el('button', 'choice' + (!!state.lunch === v ? ' selected' : ''), label);\n    b.type = 'button';\n    b.onclick = () => { state.lunch = v; renderDetails(); renderSummary(); };\n    wrap.appendChild(b);\n  });\n  sec.appendChild(wrap);\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 (' + tourDurationText() + ')'));\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  \/\/ 2026-10-27 \u96c6\u5408\u6642\u523b\uff08\u5b89\u5bcc\u30fb\u5b8d\u7c9f: \u51fa\u767a\u306e15\u5206\u524d\uff09\u3002GAS\u306e meetingTime \u304c\u3042\u308b\u30c4\u30a2\u30fc\u3060\u3051\u8868\u793a\u3002\n  if (t.meetingTime && (t.starts || []).length) {\n    sec.appendChild(el('p', 'muted small', bi('\u96c6\u5408 ' + esc(t.meetingTime) + '\uff08\u51fa\u767a\u306e15\u5206\u524d\uff09\uff0f\u682a\u5f0f\u4f1a\u793e\u3042\u304f\u3068\uff08JR\u59eb\u8def\u99c5\u5357\u53e3\u304b\u3089\u5f92\u6b69\u7d042\u5206\uff09', 'Meeting time: ' + esc(t.meetingTime) + ' (15 minutes before departure) at ACT Co., Ltd. \u2014 2-3 min walk from JR Himeji Station South Exit')));\n  }\n}\n\nfunction renderLuggageDetails(sec) {\n  const lc = LUGGAGE_CONFIG;\n  sec.appendChild(el('h3', 'step-title', 'Number of items'));\n  lc.sizes.forEach((s) => {\n    const f = el('label', 'field');\n    f.appendChild(el('span', 'field-label', esc(s.label) + ' \u2014 \u00a5' + s.price.toLocaleString() + ' per item per day <span class=\"muted small\">(' + esc(s.note) + ')<\/span>'));\n    const input = el('input'); input.type = 'number'; input.min = '0'; input.max = String(lc.maxPerSize); input.value = state[s.key] || 0;\n    input.oninput = () => {\n      state[s.key] = Math.min(lc.maxPerSize, Math.max(0, Math.floor(Number(input.value) || 0)));\n      state.people = (Number(state.large) || 0) + (Number(state.small) || 0);\n      renderSummary();\n    };\n    input.onchange = () => { input.value = state[s.key]; };\n    f.appendChild(input);\n    sec.appendChild(f);\n  });\n  state.people = (Number(state.large) || 0) + (Number(state.small) || 0);\n  sec.appendChild(el('p', 'muted small', 'More than ' + lc.maxPerSize + ' items of one size, or hotel delivery? Please contact us at comecomehimeji@gmail.com.'));\n  sec.appendChild(el('p', 'muted small', 'Location: ' + esc(lc.location)));\n  sec.appendChild(el('h3', 'step-title', 'Drop-off time'));\n  sec.appendChild(el('p', 'muted small', 'Business hours ' + lc.openTime + '\u2013' + lc.closeTime + '.'));\n  const timeWrap = el('div', 'choices times');\n  const times = luggageTimeOptions();\n  times.forEach((t) => {\n    const b = el('button', 'choice time' + (state.start === t ? ' selected' : ''), esc(t));\n    b.type = 'button';\n    b.onclick = () => { state.start = t; if (!luggagePickupTimeValid()) state.endTime = null; renderDetails(); renderSummary(); };\n    timeWrap.appendChild(b);\n  });\n  if (!times.length) timeWrap.appendChild(el('p', 'muted', 'No drop-off times left today \u2014 please choose another date.'));\n  sec.appendChild(timeWrap);\n  if (!state.start) return;\n  \/\/ \u53d7\u53d6\u306e\u3060\u3044\u305f\u3044\u306e\u6642\u523b\uff082026-09-28\u8ffd\u52a0\uff09\u3002\u76ee\u5b89\u306a\u306e\u3067\u55b6\u696d\u6642\u9593\u5185\u306a\u3089\u3044\u3064\u6765\u3066\u3082\u3088\u3044\u65e8\u3092\u6dfb\u3048\u308b\u3002\n  sec.appendChild(el('h3', 'step-title', 'Pick-up time (approximate)'));\n  sec.appendChild(el('p', 'muted small', 'Roughly when will you pick up your luggage on ' + fmtDateLabel(state.endDate || state.date, -1) + '? Any time during business hours is fine \u2014 this just helps us have it ready.'));\n  const pickWrap = el('div', 'choices times');\n  const sameDay = (state.endDate || state.date) === state.date;\n  const pickTimes = luggageTimeOptions(true).filter((t) => !sameDay || t > state.start);\n  pickTimes.forEach((t) => {\n    const b = el('button', 'choice time' + (state.endTime === t ? ' selected' : ''), esc(t));\n    b.type = 'button';\n    b.onclick = () => { state.endTime = t; renderDetails(); renderSummary(); };\n    pickWrap.appendChild(b);\n  });\n  if (!pickTimes.length) pickWrap.appendChild(el('p', 'muted', 'No pick-up times left on this day \u2014 please choose a later pick-up date or an earlier drop-off time.'));\n  sec.appendChild(pickWrap);\n}\n\n\/\/ 09:30\u301c18:00\u306e30\u5206\u523b\u307f\u3002\u5f53\u65e5\u306f\u73fe\u5728\u6642\u523b\u3088\u308a\u524d\u306e\u67a0\u3092\u9664\u304f\uff08\u300c\u4eca\u65e5\u300d\u306f\u30b5\u30fc\u30d0\u30fc\u57fa\u6e96\u306e state.dates[0]\uff09\u3002\n\/\/ forPickup=true \u306f\u53d7\u53d6\u65e5\uff08state.endDate\uff09\u3092\u57fa\u6e96\u306b\u5224\u5b9a\u3059\u308b\u3002\nfunction luggageTimeOptions(forPickup) {\n  const openMin = rentalToMin_(LUGGAGE_CONFIG.openTime), closeMin = rentalToMin_(LUGGAGE_CONFIG.closeTime);\n  const today = (state.dates && state.dates[0]) || null;\n  const isToday = today && (forPickup ? (state.endDate || state.date) : state.date) === today;\n  const nowMin = isToday ? (new Date().getHours() * 60 + new Date().getMinutes()) : -1;\n  const out = [];\n  for (let t = openMin; t <= closeMin; t += 30) { if (isToday && t < nowMin) continue; out.push(rentalFromMin_(t)); }\n  return out;\n}\n\nfunction renderRentalDetails(sec) {\n  \/\/ 2026-09-29: \u53d7\u3051\u53d6\u308a\u6642\u523b \u2192 \u5229\u7528\u6642\u9593\uff08\u30d7\u30e9\u30f3\uff09\u306e\u9806\u306b\u5909\u66f4\uff08\u3057\u3087\u3046\u3061\u3083\u3093\u4f9d\u983c\uff09\n  sec.appendChild(el('h3', 'step-title', 'Pickup time'));\n  sec.appendChild(el('p', 'muted small',\n    'Business hours ' + RENTAL_CONFIG.openTime + '\u2013' + RENTAL_CONFIG.closeTime + '. Hourly rentals must be returned by ' + RENTAL_CONFIG.closeTime + '.'));\n  const times = rentalTimeOptions(null);\n  const timeWrap = el('div', 'choices times');\n  times.forEach((t) => {\n    const b = el('button', 'choice time' + (state.start === t ? ' selected' : ''), esc(t));\n    b.type = 'button';\n    b.onclick = () => {\n      state.start = t;\n      const cur = RENTAL_CONFIG.plans.find((x) => x.code === state.plan);\n      if (cur && !rentalPlanFits(cur, t)) state.plan = null;\n      renderDetails(); renderSummary();\n    };\n    timeWrap.appendChild(b);\n  });\n  if (!times.length) timeWrap.appendChild(el('p', 'muted', 'No pickup times left today \u2014 please choose another date.'));\n  sec.appendChild(timeWrap);\n  sec.appendChild(el('p', 'muted small', 'Pickup & return: ' + esc(RENTAL_CONFIG.meeting)));\n  if (!state.start) return;\n\n  sec.appendChild(el('h3', 'step-title', 'How long would you like to ride?'));\n  const planWrap = el('div', 'choices');\n  RENTAL_CONFIG.plans.forEach((p) => {\n    const fits = rentalPlanFits(p, state.start);\n    const closed = rentalReturnClosed(p);\n    const note = p.days ? 'return by ' + RENTAL_CONFIG.closeTime + ' on day ' + p.days : 'return by ' + rentalFromMin_(Math.min(rentalToMin_(state.start) + p.hours * 60, rentalToMin_(RENTAL_CONFIG.closeTime)));\n    const b = el('button', 'choice plan' + (state.plan === p.code ? ' selected' : ''),\n      '<strong>' + esc(p.label) + '<\/strong><span class=\"muted\">\u00a5' + Number(p.price).toLocaleString() + (fits && !closed ? ' \u00b7 ' + esc(note) : '') + '<\/span>');\n    b.type = 'button';\n    if (!fits || closed) { b.disabled = true; b.classList.add('disabled'); }\n    b.onclick = () => { state.plan = p.code; renderDetails(); renderSummary(); };\n    planWrap.appendChild(b);\n  });\n  sec.appendChild(planWrap);\n  if (RENTAL_CONFIG.plans.some((p) => !p.days && !rentalPlanFits(p, state.start))) sec.appendChild(el('p', 'muted small', 'Longer hourly plans are unavailable because bikes must be back by ' + RENTAL_CONFIG.closeTime + '. Choose an earlier pickup time for a longer ride.'));\n  if (RENTAL_CONFIG.plans.some(rentalReturnClosed)) sec.appendChild(el('p', 'muted small', 'Some multi-day plans are unavailable because we are closed on the return day.'));\n}\n\n\/\/ \u305d\u306e\u30d7\u30e9\u30f3\u304c\u53d7\u3051\u53d6\u308a\u6642\u523b\u304b\u3089\u55b6\u696d\u6642\u9593\u5185\u306b\u53ce\u307e\u308b\u304b\uff08\u6642\u9593\u8cb8\u3057\u306e\u307f\u5224\u5b9a\u3002\u5bbf\u6cca\u4ed8\u304d\u306f\u6700\u7d42\u65e518:00\u8fd4\u5374\u306a\u306e\u3067\u5e38\u306b\u53ef\uff09\nfunction rentalPlanFits(p, start) {\n  if (!p || p.days || !start) return true;\n  return rentalToMin_(start) + (p.minHours || p.hours) * 60 <= rentalToMin_(RENTAL_CONFIG.closeTime);\n}\n\n\/\/ 09:30\u301c18:00\u306e\u9593\u306730\u5206\u523b\u307f\u306e\u5019\u88dc\u6642\u523b\u3002\u6642\u9593\u8cb8\u3057\u30d7\u30e9\u30f3\u306f\u300c\u958b\u59cb+\u6240\u8981\u6642\u9593\u300d\u304c18:00\u3092\u8d85\u3048\u306a\u3044\u3082\u306e\u3060\u3051\u306b\u7d5e\u308b\n\/\/ \uff08\u5bbf\u6cca\u4ed8\u304d\u30d7\u30e9\u30f3\u306f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u5074\u3067\u6700\u7d42\u65e518:00\u8fd4\u5374\u3068\u3057\u3066\u8a08\u7b97\u3055\u308c\u308b\u305f\u3081\u3053\u306e\u7d5e\u308a\u8fbc\u307f\u306f\u4e0d\u8981\uff09\u3002\n\/\/ \u5f53\u65e5\u306f\u73fe\u5728\u6642\u523b\u3088\u308a\u524d\u306e\u67a0\u3092\u9664\u304f\uff08\u300c\u4eca\u65e5\u300d\u306e\u5224\u5b9a\u306f\u30b5\u30fc\u30d0\u30fc\u57fa\u6e96\u306e state.dates[0] \u3092\u4f7f\u3044\u7aef\u672bTZ\u306b\u4f9d\u5b58\u3057\u306a\u3044\uff09\u3002\nfunction rentalTimeOptions(plan) {\n  const openMin = rentalToMin_(RENTAL_CONFIG.openTime);\n  const closeMin = rentalToMin_(RENTAL_CONFIG.closeTime);\n  const today = (state.dates && state.dates[0]) || null;\n  const isToday = today && state.date === today;\n  const nowMin = isToday ? (new Date().getHours() * 60 + new Date().getMinutes()) : -1;\n  const out = [];\n  for (let t = openMin; t <= closeMin; t += 30) {\n    if (plan && !plan.days && t + (plan.minHours || plan.hours) * 60 > closeMin) break;\n    if (isToday && t < nowMin) continue;\n    out.push(rentalFromMin_(t));\n  }\n  return out;\n}\n\/\/ \u5bbf\u6cca\u4ed8\u304d\u30d7\u30e9\u30f3\uff08days \u3042\u308a\uff09\u306e\u8fd4\u5374\u65e5\uff08\u8cb8\u51fa\u65e5+days-1\uff09\u304c\u4f11\u696d\u65e5\u304b\nfunction rentalReturnClosed(p) {\n  return !!(p.days && state.date && (state.storeClosed || []).indexOf(addDaysYmd(state.date, p.days - 1)) !== -1);\n}\nfunction rentalToMin_(hhmm) { const [h, m] = String(hhmm).split(':').map(Number); return h * 60 + m; }\nfunction rentalFromMin_(mins) { const h = Math.floor(mins \/ 60), m = mins % 60; return ('0' + h).slice(-2) + ':' + ('0' + m).slice(-2); }\n\nfunction renderPeople(sec) {\n  const peopleLabel = activityKind() === 'rental' ? bi('\u53f0\u6570', 'Number of bikes') : bi('\u4eba\u6570', 'Number of people');\n  sec.appendChild(el('h3', 'step-title', peopleLabel));\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\u54045\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  const jt = selectedDayTour_();\n  if (jt && jt.joining) row.appendChild(el('p', 'muted small', bi('\u3053\u306e\u65e5\u306f\u307b\u304b\u306e\u304a\u5ba2\u69d8\u3068\u306e\u76f8\u4e57\u308a\u3067\u3059\uff08\u6b8b\u308a' + jt.capacity + '\u540d\uff09', 'Shared tour with other guests on this date (' + jt.capacity + ' spots left)')));\n  \/\/ \u65e7\u8857\u9053\u30fb\u98fe\u78e8: \u5b9a\u54e1\u3092\u8d85\u3048\u308b\u4eba\u6570\u306f\u304a\u554f\u3044\u5408\u308f\u305b\u3078\uff082026-09-30\uff09\u3002\u4e0a\u9650+1\u540d\u304b\u3089\u6848\u5185\u3059\u308b\u306e\u3067\u5b9a\u54e1\u5909\u66f4\u306b\u81ea\u52d5\u3067\u8ffd\u5f93\u3002\n  if (state.activity === 'ebike-castle' || state.activity === 'ebike-sea') {\n    const over = ((ACTIVITIES.find((x) => x.code === state.activity) || {}).maxPeople || 5) + 1;\n    row.appendChild(el('p', 'muted small', bi(over + '\u540d\u4ee5\u4e0a\u306e\u3054\u4e88\u7d04\u306f\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044', 'For groups of ' + over + ' or more, please contact us.')));\n  }\n  if (activityKind() === 'rental') row.appendChild(el('p', 'muted small', 'For ' + (maxPeople + 1) + '+ bikes, please contact us directly instead of booking online.'));\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  \/\/ \u30ec\u30f3\u30bf\u30b5\u30a4\u30af\u30eb\u306f\u8eab\u9577\u5e2f\u5225\u306e\u5728\u5eab(151cm\/153cm\/160cm\/165cm\u4ee5\u4e0a)\u304b\u3089\u73fe\u5730\u30b9\u30bf\u30c3\u30d5\u304c\u624b\u52d5\u3067\u9078\u3076\u305f\u3081\u3001\n  \/\/ \u30aa\u30f3\u30e9\u30a4\u30f3\u4e88\u7d04\u81ea\u4f53\u306f\u53f0\u6570\u306e\u307f\u78ba\u4fdd(guardRentalCycle_\u306b\u8eab\u9577\u30d1\u30e9\u30e1\u30fc\u30bf\u7121\u3057)\u3002\u5099\u8003\u6b04\u3067\u7533\u544a\u3057\u3066\u3082\u3089\u3046\u3002\n  const noteLabel = activityKind() === 'rental'\n    ? bi('\u5099\u8003\uff08\u540c\u4e57\u8005\u306e\u8eab\u9577\u306a\u3069\u30fb\u4efb\u610f\uff09', 'Note \u2014 e.g. rider height(s) for bike sizing (optional)')\n    : bi('\u5099\u8003\uff08\u4efb\u610f\uff09', 'Note (optional)');\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', noteLabel, '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 (activityKind() === 'luggage') {\n    const q = luggageQuote();\n    if (state.date) lines.push(['Drop-off', state.date + (state.start ? ' ' + state.start : '')]);\n    if (state.date) lines.push(['Pick-up', (state.endDate || state.date) + (state.endTime ? ' around ' + state.endTime : '')]);\n    if (!q || q.large + q.small === 0) lines.push([bi('\u500b\u6570', 'Items'), bi('\u8377\u7269\u306e\u500b\u6570\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044', 'Please enter the number of items')]);\n    if (q && q.large + q.small > 0) {\n      const parts = [];\n      if (q.large) parts.push('Large \u00d7 ' + q.large);\n      if (q.small) parts.push('Hand luggage \u00d7 ' + q.small);\n      lines.push(['Items', parts.join(', ')]);\n      lines.push(['Price', '\u00a5' + q.perDay.toLocaleString() + '\/day \u00d7 ' + q.days + (q.days === 1 ? ' day' : ' days') + ' = \u00a5' + q.total.toLocaleString()]);\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; { const sb_ = $('#store-btn'); if (sb_) sb_.disabled = !ready; }\n    return;\n  }\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 (activityKind() === 'rental' && state.plan) {\n    const p = RENTAL_CONFIG.plans.find((x) => x.code === state.plan);\n    if (p) lines.push(['Plan', p.label]);\n  }\n  if (state.start) lines.push([activityKind() === 'algueblue' ? bi('\u65bd\u8853\u958b\u59cb', 'Treatment start') : activityKind() === 'rental' ? 'Pickup time' : '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([activityKind() === 'rental' ? 'Bikes' : bi('\u4eba\u6570', 'People'), state.people]);\n  if (activityRequiresHeight() && state.height) lines.push(['Height (cm)', state.height]);\n  if (activityKind() === 'rental' && state.plan) {\n    const p = RENTAL_CONFIG.plans.find((x) => x.code === state.plan);\n    if (p) {\n      const bikes = Number(state.people) || 1;\n      lines.push(['Price', '\u00a5' + Number(p.price).toLocaleString() + '\/bike \u00d7 ' + bikes + ' = \u00a5' + Number(p.price * bikes).toLocaleString()]);\n    }\n  }\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 (state.private && tour.privatePrice) {\n        total = Number(tour.privatePrice); note = bi('\u8cb8\u5207\u30fb\u5b9a\u984d', 'Private, flat price');\n      } else if (ppl === 1 && tour.soloPrice) {\n        total = tour.soloPrice; note = bi('1\u540d', '1 person');\n      } else {\n        const unit = tour.pricePerPerson + (state.lunch && tour.lunchPricePerPerson ? Number(tour.lunchPricePerPerson) : 0);\n        total = unit * ppl;\n        note = '\u00a5' + Number(unit).toLocaleString() + bi('\uff0f\u4eba', '\/person') + ' \u00d7 ' + ppl;\n      }\n      if (tour.lunchPricePerPerson) lines.push([bi('\u30e9\u30f3\u30c1', 'Lunch'), state.lunch ? bi('\u8336\u61d0\u77f3\u30e9\u30f3\u30c1\u4ed8\u304d\uff08\u5168\u54e1\uff09', 'Tea-kaiseki lunch for all') : bi('\u306a\u3057', 'None')]);\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; { const sb_ = $('#store-btn'); if (sb_) sb_.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 (activityKind() === 'rental') {\n    return !!(state.plan && state.start);\n  }\n  if (activityKind() === 'luggage') {\n    const q = luggageQuote();\n    return !!(state.start && luggagePickupTimeValid() && q && q.ok);\n  }\n  if (!state.start) return false;\n  if (activityRequiresHeight() && !String(state.height || '').trim()) return false;\n  return true;\n}\n\nasync function submit(payAtStore) {\n  const atStore = (payAtStore === true) && LANG_JA;\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  { const sb_ = $('#store-btn'); if (sb_) sb_.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 || '', lunch: !!(state.lunch && selectedLunchPrice_()), private: !!(state.private && selectedPrivatePrice_()),\n    lang: LANG_JA ? 'ja' : '', payAtStore: atStore, endDate: state.endDate || '', endTime: state.endTime || '', large: Number(state.large) || 0, small: Number(state.small) || 0,\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.payAtStore) { showStoreDone(data); return; }\n    if (data.approveUrl) {\n      \/\/ \u57cb\u3081\u8fbc\u307f(iframe)\u6642\u306f\u89aa\u30da\u30fc\u30b8\u3054\u3068PayPal\u3078\u79fb\u52d5\u3059\u308b\uff08\u67a0\u5185\u3060\u3068\u30ed\u30b0\u30a4\u30f3\u30fb\u30ab\u30fc\u30c9\u5165\u529b\u304c\u7aae\u5c48\u3067\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u3088\u3063\u3066\u306f\u52d5\u304b\u306a\u3044\uff09\n      try { (window.top || window).location.href = data.approveUrl; } catch (e) { 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    { const sb_ = $('#store-btn'); if (sb_) sb_.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; scrollToDone_();\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; scrollToDone_();\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 payPlaceJa() { const k = activityKind(); return (k === 'rental' || k === 'luggage') ? '\u5e97\u982d' : '\u73fe\u5730'; }\nfunction storeLabelJa() { return payPlaceJa() === '\u5e97\u982d' ? '\u5e97\u982d\u3067\u652f\u6255\u3046\uff08\u4e88\u7d04\u78ba\u5b9a\uff09' : '\u5f53\u65e5\u73fe\u5730\u3067\u652f\u6255\u3046\uff08\u4e88\u7d04\u78ba\u5b9a\uff09'; }\n\n\/\/ \u5b8c\u4e86\u30fb\u78ba\u8a8d\u306e\u8868\u793a\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u304c\u6d88\u3048\u3066\u30da\u30fc\u30b8\u304c\u77ed\u304f\u306a\u308b\u3068\u753b\u9762\u306e\u4e0a\u306b\u5916\u308c\u308b\u305f\u3081\u3001\u8868\u793a\u4f4d\u7f6e\u3078\u79fb\u52d5\u3059\u308b\uff082026-10-19\uff09\nfunction scrollToDone_() {\n  requestAnimationFrame(() => { const e = $('#done'); if (e) { e.style.scrollMarginTop = '80px'; e.scrollIntoView({ block: 'start' }); } });\n}\n\nfunction showStoreDone(data) {\n  $('#form-body').hidden = true;\n  $('#done').hidden = false; scrollToDone_();\n  const amount = (data && Number(data.amount)) ? Number(data.amount) : bookingTotalYen();\n  $('#done').innerHTML =\n    '<div class=\"done-check\">\u2713<\/div>' +\n    '<h2>\u3054\u4e88\u7d04\u304c\u78ba\u5b9a\u3057\u307e\u3057\u305f<\/h2>' +\n    '<p>\u4e88\u7d04\u756a\u53f7: <b>' + esc(data.bookingId) + '<\/b><\/p>' +\n    '<p class=\"muted\">\u304a\u652f\u6255\u3044\u306f<strong>\u5f53\u65e5\u3001' + payPlaceJa() + '\u3067' + (amount ? ' \u00a5' + amount.toLocaleString() : '') + '<\/strong>\u3092\u304a\u9858\u3044\u3057\u307e\u3059\u3002\u78ba\u8a8d\u30e1\u30fc\u30eb\u3092\u304a\u9001\u308a\u3057\u307e\u3057\u305f\u3002<\/p>' +\n    '<p class=\"muted small\">\u30e1\u30fc\u30eb\u304c\u5c4a\u304b\u306a\u3044\u5834\u5408\u306f\u3001\u8ff7\u60d1\u30e1\u30fc\u30eb\u30d5\u30a9\u30eb\u30c0\u3092\u3054\u78ba\u8a8d\u306e\u3046\u3048\u3001<a href=\"mailto:comecomehimeji@gmail.com\">comecomehimeji@gmail.com<\/a> \u307e\u3067\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002<\/p>';\n}\n\nfunction showDone(data) {\n  $('#form-body').hidden = true;\n  $('#done').hidden = false; scrollToDone_();\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  if ($('#store-btn')) $('#store-btn').addEventListener('click', () => submit(true));\n  init();\n});\n\n<\/script>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-large-font-size wp-block-paragraph\"><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"has-regular-font-size wp-block-paragraph\">1.\ud83d\udeb2<a href=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/castle-town\/\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vk-color-primary-dark-color\">e-bike Ride around the Castle, Slurp Like a Local<\/mark><\/strong><\/a> from \u00a57,000<br>Perfect for history lovers\ud83d\udeb2<br>We won't go to inside of the Castle but we can enjoy a 360 degrees view around it. <br><br>2.\ud83d\udeb2<a href=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/tour-from-the-shikama-kaido-to-the-sea\/\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vk-color-primary-color\">e-bike Ride to the Sea- Slurp Like a Local<\/mark><\/strong><\/a> from \u00a57,000<br>Let's head towards the sea.<br>Perfect for lovers of nostalgic scenery\ud83d\udeb2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3.\ud83c\udfef<strong><a href=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/himeji-castle-guide-personal-tour\/\"><mark style=\"background-color:#ffffff\" class=\"has-inline-color has-vk-color-primary-dark-color\">Himeji castle guide<\/mark><\/a><mark style=\"background-color:#ffffff\" class=\"has-inline-color has-vk-color-primary-dark-color\">. <\/mark><\/strong>from \u00a59,800<br>Perfect for exploring with a fun guide.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We also offer \ud83d\udeb2<a href=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/rental-cycle\/\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vk-color-primary-color\">e-bike rentals<\/mark><\/strong><\/a> from \u00a5550<br>and cheap\ud83d\udcbc<a href=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/baggage-storage-and-hotel-delivery-in-himeji3-mins-from-station\/\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Baggage storage<\/mark><\/strong><\/a> from \u00a5500<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/access\/\"><strong><mark style=\"background-color:#ffffff\" class=\"has-inline-color has-vk-color-primary-dark-color\">Access<\/mark><\/strong><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can now <strong>book online<\/strong> directly from the cards above \u2014 just tap <strong>Book Now!<\/strong> Real-time spots for our e-bike tours, the Himeji Castle guide, and the Algueblue Thalassotherapy Spa can be booked online up to 6 months ahead. <br>Questions? Feel free to <a href=\"mailto:comecomehimeji@gmail.com\"><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">contact us<\/mark>.<\/a><br><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.instagram.com\/travel_network_act\/?hl=ja\"><img loading=\"lazy\" decoding=\"async\" width=\"390\" height=\"390\" src=\"https:\/\/www.travel-network-act.co.jp\/local\/wp-content\/uploads\/2026\/04\/\u30a4\u30f3\u30b9\u30bf\u30b0\u30e9\u30e0.jpg\" alt=\"\" class=\"wp-image-3827\" srcset=\"https:\/\/www.travel-network-act.co.jp\/local\/wp-content\/uploads\/2026\/04\/\u30a4\u30f3\u30b9\u30bf\u30b0\u30e9\u30e0.jpg 390w, https:\/\/www.travel-network-act.co.jp\/local\/wp-content\/uploads\/2026\/04\/\u30a4\u30f3\u30b9\u30bf\u30b0\u30e9\u30e0-300x300.jpg 300w, https:\/\/www.travel-network-act.co.jp\/local\/wp-content\/uploads\/2026\/04\/\u30a4\u30f3\u30b9\u30bf\u30b0\u30e9\u30e0-150x150.jpg 150w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Book Your Experience Algueblue Thalassotherapy Spa &middot; e-bike Tours &middot; Himeji Castle Guide What wou [&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-3820","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Availability - \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\/en\/we-still-have-spots-available-for-our-tours-and-etc\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Availability - \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 What wou [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/\" \/>\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-10-27T08:34:44+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data1\" content=\"159\u5206\" \/>\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\\\/en\\\/we-still-have-spots-available-for-our-tours-and-etc\\\/\",\"url\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/en\\\/we-still-have-spots-available-for-our-tours-and-etc\\\/\",\"name\":\"Availability - \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-05-02T00:00:00+00:00\",\"dateModified\":\"2026-10-27T08:34:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/en\\\/we-still-have-spots-available-for-our-tours-and-etc\\\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/en\\\/we-still-have-spots-available-for-our-tours-and-etc\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/en\\\/we-still-have-spots-available-for-our-tours-and-etc\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/www.travel-network-act.co.jp\\\/local\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Availability\"}]},{\"@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":"Availability - \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\/en\/we-still-have-spots-available-for-our-tours-and-etc\/","og_locale":"ja_JP","og_type":"article","og_title":"Availability - \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 What wou [&hellip;]","og_url":"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/","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-10-27T08:34:44+00:00","twitter_card":"summary_large_image","twitter_misc":{"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"159\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/","url":"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/","name":"Availability - \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-05-02T00:00:00+00:00","dateModified":"2026-10-27T08:34:44+00:00","breadcrumb":{"@id":"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.travel-network-act.co.jp\/local\/en\/we-still-have-spots-available-for-our-tours-and-etc\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/www.travel-network-act.co.jp\/local\/"},{"@type":"ListItem","position":2,"name":"Availability"}]},{"@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\/3820","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=3820"}],"version-history":[{"count":84,"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/pages\/3820\/revisions"}],"predecessor-version":[{"id":5019,"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/pages\/3820\/revisions\/5019"}],"wp:attachment":[{"href":"https:\/\/www.travel-network-act.co.jp\/local\/wp-json\/wp\/v2\/media?parent=3820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}