{"id":10,"date":"2026-03-31T20:35:45","date_gmt":"2026-03-31T20:35:45","guid":{"rendered":"https:\/\/bpr.williehowe.com\/index.php\/make-a-reservation\/"},"modified":"2026-03-31T20:35:45","modified_gmt":"2026-03-31T20:35:45","slug":"make-a-reservation","status":"publish","type":"page","link":"https:\/\/bpr.williehowe.com\/index.php\/make-a-reservation\/","title":{"rendered":"Make a Reservation"},"content":{"rendered":"<div class=\"bpr-reservation-wrap\" id=\"bpr-reservation-form\">\n\n    <!-- Persistent multi-booking cart -->\n    <div id=\"bpr-cart-bar\" style=\"display:none;\" class=\"bpr-cart-bar\" role=\"region\" aria-label=\"Booking cart\" aria-live=\"polite\">\n        <div class=\"bpr-cart-bar__inner\">\n            <span class=\"bpr-cart-bar__label\">\ud83d\uded2 <strong id=\"bpr-cart-count\">0<\/strong> rental(s) in your booking<\/span>\n            <span class=\"bpr-cart-bar__total\">Total: <strong id=\"bpr-cart-total\">$0.00<\/strong><\/span>\n            <button type=\"button\" class=\"bpr-btn bpr-btn-ghost bpr-btn-sm\" id=\"bpr-cart-view-btn\" aria-expanded=\"false\" aria-controls=\"bpr-cart-panel\">View Cart<\/button>\n        <\/div>\n        <section id=\"bpr-cart-panel\" class=\"bpr-cart-panel\" hidden tabindex=\"-1\" aria-labelledby=\"bpr-cart-panel-title\">\n            <div class=\"bpr-cart-panel__header\">\n                <div>\n                    <h2 id=\"bpr-cart-panel-title\">Your Rental Cart<\/h2>\n                    <p>All saved rentals remain here while you complete the reservation.<\/p>\n                <\/div>\n                <button type=\"button\" class=\"bpr-cart-panel__close\" id=\"bpr-cart-close-btn\" aria-label=\"Hide rental cart\">&times;<\/button>\n            <\/div>\n            <div id=\"bpr-cart-panel-items\" class=\"bpr-cart-panel__items\"><\/div>\n            <div class=\"bpr-cart-panel__footer\">\n                <span class=\"bpr-cart-panel__total\">Booking Total: <strong id=\"bpr-cart-panel-total\">$0.00<\/strong><\/span>\n                <div class=\"bpr-cart-panel__actions\">\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-secondary bpr-btn-sm\" id=\"bpr-cart-panel-add-another\">+ Add Another Facility<\/button>\n                <\/div>\n            <\/div>\n        <\/section>\n    <\/div>\n\n    <div class=\"bpr-step-indicator\" role=\"list\" aria-label=\"Reservation steps\">\n        <div class=\"bpr-step active\" data-step=\"1\" role=\"listitem\"><span aria-hidden=\"true\">1<\/span> Select Facility<\/div>\n        <div class=\"bpr-step \" data-step=\"2\" role=\"listitem\"><span aria-hidden=\"true\">2<\/span> Date &amp; Time<\/div>\n        <div class=\"bpr-step\" data-step=\"3\" role=\"listitem\"><span aria-hidden=\"true\">3<\/span> Your Details<\/div>\n        <div class=\"bpr-step\" data-step=\"4\" role=\"listitem\"><span aria-hidden=\"true\">4<\/span> Review &amp; Submit<\/div>\n    <\/div>\n\n    <form id=\"bpr-res-form\" novalidate data-bpr-controller=\"enhanced\"\n          data-min-date=\"2026-10-06\"\n          data-max-date=\"2027-10-05\"\n          data-resident-discount=\"0\">\n        <input type=\"hidden\" id=\"bpr_nonce\" name=\"bpr_nonce\" value=\"6cfa028fe0\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/index.php\/wp-json\/wp\/v2\/pages\/10\" \/>        <input type=\"hidden\" name=\"action\" value=\"bpr_submit_reservation\">\n        <input type=\"hidden\" name=\"paperwork_session\" value=\"206e0ed44bf70b038398a8133cb591b91ede849c7ff7967a\">\n        <input type=\"hidden\" name=\"booking_session\" value=\"206e0ed44bf70b038398a8133cb591b91ede849c7ff7967a\">\n        <div style=\"display:none\" aria-hidden=\"true\"><input type=\"text\" name=\"website_url\" tabindex=\"-1\" autocomplete=\"off\"><\/div>\n\n        <!-- STEP 1: Facility selection -->\n        <div class=\"bpr-form-step active\" data-step=\"1\" >\n            <h2 class=\"bpr-step-title\">Select a Facility<\/h2>\n            <p class=\"bpr-step-hint\">Need multiple facilities? Select one, add it to your booking, then add another.<\/p>\n\n            <section id=\"bpr-step1-cart-summary\" class=\"bpr-booking-progress\" hidden tabindex=\"-1\" aria-labelledby=\"bpr-step1-cart-heading\">\n                <div id=\"bpr-cart-feedback\" class=\"bpr-booking-progress__feedback\" role=\"status\" aria-live=\"polite\" hidden><\/div>\n                <div class=\"bpr-booking-progress__header\">\n                    <div>\n                        <h3 id=\"bpr-step1-cart-heading\">Your Booking<\/h3>\n                        <p id=\"bpr-step1-cart-description\">Your added rentals are saved below. Choose another facility or continue to your details.<\/p>\n                    <\/div>\n                    <strong id=\"bpr-step1-cart-total\" class=\"bpr-booking-progress__total\">$0.00<\/strong>\n                <\/div>\n                <div id=\"bpr-step1-cart-items\" class=\"bpr-booking-progress__items\"><\/div>\n                <div class=\"bpr-booking-progress__actions\">\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-secondary\" id=\"bpr-step1-add-another\">Choose Another Facility \u2193<\/button>\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-primary\" id=\"bpr-step1-cart-continue\">Continue with Saved Rentals \u2192<\/button>\n                <\/div>\n            <\/section>\n\n            <div class=\"bpr-facility-grid\" id=\"bpr-facility-grid\">\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"1\"\n                     data-hourly-rate=\"25.00\"\n                     data-min-hours=\"4\"\n                     data-type=\"clubhouse\"\n                     data-name=\"Alpha Park Clubhouse\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \ud83c\udfe0                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Alpha Park Clubhouse<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$25.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$100.00 minimum rental (4 hr minimum)<\/span>                                                                                        <span class=\"bpr-facility-min\">+$5.00 alcohol fee per rental (optional)<\/span>                            <span class=\"bpr-facility-cap\">Capacity: 70<\/span>                        <\/div>\n                        <p class=\"bpr-facility-desc\">The Clubhouse has six 8ft long folding tables, six 6ft long folding tables, and 60 folding chairs. Facility offers indoor restrooms, heat, air conditioning, accessible doors, small refrigerator, an ice machine, and two small microwaves. Table and chair set up and\/or take down is the responsibility of the renter and all tables and chairs should be wiped down and put away after use.<\/p>                                                <details class=\"bpr-facility-rental-directions\">\n                            <summary>Map &amp; Directions<\/summary>\n                                                                                    <p><a href=\"https:\/\/maps.app.goo.gl\/mNkdu8ytDvKWn2U86\" target=\"_blank\" rel=\"noopener noreferrer\" onclick=\"event.stopPropagation();\">Open Map &amp; Directions \u2197<\/a><\/p>                        <\/details>\n                                                                        <div class=\"bpr-facility-amenities\" aria-label=\"Amenities\">\n                            <span class=\"bpr-amenity-tag\">tables<\/span><span class=\"bpr-amenity-tag\">chairs<\/span><span class=\"bpr-amenity-tag\">restrooms<\/span><span class=\"bpr-amenity-tag\">AC\/Heat<\/span><span class=\"bpr-amenity-tag\">refrigerator<\/span><span class=\"bpr-amenity-tag\">ice machine<\/span><span class=\"bpr-amenity-tag\">microwave<\/span>                        <\/div>\n                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"2\"\n                     data-hourly-rate=\"8.00\"\n                     data-min-hours=\"4\"\n                     data-type=\"pavilion\"\n                     data-name=\"Alpha Park - Blanquart Pavilion\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-photo\" aria-hidden=\"true\">\n                        <img decoding=\"async\" src=\"https:\/\/bpr.williehowe.com\/wp-content\/uploads\/2026\/09\/IMG_E5644-600x400.jpg\" alt=\"\" loading=\"lazy\">\n                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Alpha Park - Blanquart Pavilion<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$8.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$32.00 minimum rental (4 hr minimum)<\/span>                                                                                                                                            <\/div>\n                        <p class=\"bpr-facility-desc\">The Blanquart Pavilion is located by the Swings, is equipped with a fireplace, a grill outside of the pavilion, holds 15 picnic tables and has handicap parking. Fee: $8 an hour<\/p>                                                                        <div class=\"bpr-facility-amenities\" aria-label=\"Amenities\">\n                            <span class=\"bpr-amenity-tag\">picnic tables<\/span><span class=\"bpr-amenity-tag\">fireplace<\/span><span class=\"bpr-amenity-tag\">grill<\/span><span class=\"bpr-amenity-tag\">parking<\/span><span class=\"bpr-amenity-tag\">near swings<\/span>                        <\/div>\n                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"3\"\n                     data-hourly-rate=\"8.00\"\n                     data-min-hours=\"4\"\n                     data-type=\"pavilion\"\n                     data-name=\"Alpha Park - Lions Club Pavilion\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-photo\" aria-hidden=\"true\">\n                        <img decoding=\"async\" src=\"https:\/\/bpr.williehowe.com\/wp-content\/uploads\/2026\/09\/IMG_5786-600x400.jpg\" alt=\"\" loading=\"lazy\">\n                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Alpha Park - Lions Club Pavilion<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$8.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$32.00 minimum rental (4 hr minimum)<\/span>                                                                                                                                            <\/div>\n                        <p class=\"bpr-facility-desc\">The Lions Club pavilion is next to the playground, holds 15 large picnic tables, has a grill outside of the pavilion and handicap parking.\nFee: $8 an hour<\/p>                                                                        <div class=\"bpr-facility-amenities\" aria-label=\"Amenities\">\n                            <span class=\"bpr-amenity-tag\">picnic tables<\/span><span class=\"bpr-amenity-tag\">fireplace<\/span><span class=\"bpr-amenity-tag\">grill<\/span><span class=\"bpr-amenity-tag\">parking<\/span><span class=\"bpr-amenity-tag\">near playground<\/span>                        <\/div>\n                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"4\"\n                     data-hourly-rate=\"8.00\"\n                     data-min-hours=\"4\"\n                     data-type=\"pavilion\"\n                     data-name=\"Lauterbach Pavilion\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26fa                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Lauterbach Pavilion<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$8.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$32.00 minimum rental (4 hr minimum)<\/span>                                                                                                                                            <\/div>\n                        <p class=\"bpr-facility-desc\">Located near a parking lot and the pickleball court. Is equipped with 3 large picnic tables and a grill outside of the pavilion. Fee: $8 an hour<\/p>                                                                    <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"5\"\n                     data-hourly-rate=\"8.00\"\n                     data-min-hours=\"4\"\n                     data-type=\"pavilion\"\n                     data-name=\"Zeller Pavilion\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26fa                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Zeller Pavilion<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$8.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$32.00 minimum rental (4 hr minimum)<\/span>                                                                                                                                            <\/div>\n                        <p class=\"bpr-facility-desc\">Small pavilion with 4 small picnic tables. Limited parking. No restrooms. Fee: $8 an hour<\/p>                                                                        <div class=\"bpr-facility-amenities\" aria-label=\"Amenities\">\n                            <span class=\"bpr-amenity-tag\">Picnic Tables<\/span>                        <\/div>\n                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"6\"\n                     data-hourly-rate=\"15.00\"\n                     data-min-hours=\"2\"\n                     data-type=\"diamond\"\n                     data-name=\"Ball Diamond 1\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26be                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Ball Diamond 1<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$15.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$30.00 minimum rental (2 hr minimum)<\/span>                                                                                                                                            <\/div>\n                                                                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"7\"\n                     data-hourly-rate=\"15.00\"\n                     data-min-hours=\"2\"\n                     data-type=\"diamond\"\n                     data-name=\"Ball Diamond 2\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26be                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Ball Diamond 2<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$15.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$30.00 minimum rental (2 hr minimum)<\/span>                                                                                                                                            <\/div>\n                                                                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"8\"\n                     data-hourly-rate=\"15.00\"\n                     data-min-hours=\"2\"\n                     data-type=\"diamond\"\n                     data-name=\"Ball Diamond 3\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26be                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Ball Diamond 3<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$15.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$30.00 minimum rental (2 hr minimum)<\/span>                                                                                                                                            <\/div>\n                                                                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"9\"\n                     data-hourly-rate=\"15.00\"\n                     data-min-hours=\"2\"\n                     data-type=\"diamond\"\n                     data-name=\"Ball Diamond 4\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26be                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Ball Diamond 4<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$15.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$30.00 minimum rental (2 hr minimum)<\/span>                                                                                                                                            <\/div>\n                                                                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"10\"\n                     data-hourly-rate=\"15.00\"\n                     data-min-hours=\"2\"\n                     data-type=\"diamond\"\n                     data-name=\"Ball Diamond 5\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \u26be                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Ball Diamond 5<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                                                        <span class=\"bpr-facility-rate\">$15.00\/hr<\/span>\n                                <span class=\"bpr-facility-min\">$30.00 minimum rental (2 hr minimum)<\/span>                                                                                                                                            <\/div>\n                                                                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"11\"\n                     data-hourly-rate=\"0.00\"\n                     data-min-hours=\"0\"\n                     data-type=\"trail\"\n                     data-name=\"Cross Country Trail\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \ud83e\udd7e                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Cross Country Trail<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                        <span class=\"bpr-facility-rate bpr-facility-free\">Free<\/span>                                                                                <\/div>\n                                                                                            <\/div>\n                <\/div>\n                                <div class=\"bpr-facility-card \"\n                     data-facility-id=\"12\"\n                     data-hourly-rate=\"0.00\"\n                     data-min-hours=\"0\"\n                     data-type=\"course\"\n                     data-name=\"Disc Golf Course\"\n                     role=\"radio\"\n                     aria-checked=\"false\"\n                     tabindex=\"0\">\n                                        <div class=\"bpr-facility-icon\" aria-hidden=\"true\">\n                        \ud83e\udd4f                    <\/div>\n                                        <div class=\"bpr-facility-card__body\">\n                        <h3 class=\"bpr-facility-name\">Disc Golf Course<\/h3>\n                        <div class=\"bpr-facility-meta\">\n                                                        <span class=\"bpr-facility-rate bpr-facility-free\">Free<\/span>                                                                                <\/div>\n                                                                                            <\/div>\n                <\/div>\n                            <\/div>\n\n            <input type=\"hidden\" id=\"bpr-facility-id\" name=\"facility_id\" required>\n            <div id=\"bpr-step1-actions\" style=\"display:none;\" class=\"bpr-step1-actions\">\n                <p class=\"bpr-step-nav\">\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-primary bpr-next-step\">Continue \u2192<\/button>\n                <\/p>\n            <\/div>\n            <p id=\"bpr-step1-prompt\" class=\"bpr-step-prompt\">Select a facility above to continue.<\/p>\n        <\/div>\n\n        <!-- STEP 2: Date & Time -->\n        <div class=\"bpr-form-step \" data-step=\"2\" style=\"display:none;\">\n            <h2 class=\"bpr-step-title\">Choose Date &amp; Time<\/h2>\n            <div class=\"bpr-selected-facility-summary\">\n                <p class=\"bpr-step-hint\" id=\"bpr-step2-facility-name\" aria-live=\"polite\"><\/p>\n                <button type=\"button\" class=\"bpr-btn bpr-btn-ghost bpr-btn-sm\" id=\"bpr-choose-different-facility\">Choose a Different Facility<\/button>\n            <\/div>\n\n            <div class=\"bpr-schedule-picker\">\n                <section class=\"bpr-date-picker\" id=\"bpr-date-picker\" tabindex=\"-1\" aria-labelledby=\"bpr-date-picker-title\">\n                    <div class=\"bpr-date-picker__heading\">\n                        <div>\n                            <span class=\"bpr-schedule-eyebrow\">Date<\/span>\n                            <h3 id=\"bpr-date-picker-title\">Choose a date <span aria-hidden=\"true\">*<\/span><\/h3>\n                        <\/div>\n                        <div class=\"bpr-calendar-nav\">\n                            <button type=\"button\" id=\"bpr-calendar-prev\" aria-label=\"Previous month\">&lsaquo;<\/button>\n                            <strong id=\"bpr-calendar-month\" aria-live=\"polite\"><\/strong>\n                            <button type=\"button\" id=\"bpr-calendar-next\" aria-label=\"Next month\">&rsaquo;<\/button>\n                        <\/div>\n                    <\/div>\n                    <div class=\"bpr-calendar-weekdays\" aria-hidden=\"true\">\n                        <span>Sun<\/span><span>Mon<\/span><span>Tue<\/span><span>Wed<\/span><span>Thu<\/span><span>Fri<\/span><span>Sat<\/span>\n                    <\/div>\n                    <div id=\"bpr-calendar-grid\" class=\"bpr-calendar-grid\" role=\"grid\" aria-labelledby=\"bpr-calendar-month\"><\/div>\n                    <input type=\"hidden\" id=\"bpr-start-date\" value=\"\">\n                    <small id=\"bpr-date-hint\" class=\"bpr-schedule-help\">\n                        Available from Oct 6, 2026 through Oct 5, 2027.                    <\/small>\n                <\/section>\n\n                <section class=\"bpr-time-picker\" aria-labelledby=\"bpr-time-picker-title\">\n                    <div class=\"bpr-time-picker__heading\">\n                        <span class=\"bpr-schedule-eyebrow\">Time<\/span>\n                        <h3 id=\"bpr-time-picker-title\">Choose a time range<\/h3>\n                        <p id=\"bpr-time-minimum\">Select a start and end time for this rental.<\/p>\n                    <\/div>\n                    <div class=\"bpr-time-range\">\n                        <fieldset class=\"bpr-field bpr-time-fieldset\" id=\"bpr-start-time-control\" data-time-control=\"start\" tabindex=\"-1\" aria-describedby=\"bpr-time-step-hint\">\n                            <legend>Start Time *<\/legend>\n                            <div class=\"bpr-time-parts\">\n                                <label class=\"bpr-screen-reader-text\" for=\"bpr-start-hour\">Start hour<\/label>\n                                <select id=\"bpr-start-hour\" class=\"bpr-time-part\" data-time-part=\"hour\" aria-label=\"Start hour\">\n                                    <option value=\"\">Hour<\/option>\n                                                                        <option value=\"1\">1<\/option>\n                                                                        <option value=\"2\">2<\/option>\n                                                                        <option value=\"3\">3<\/option>\n                                                                        <option value=\"4\">4<\/option>\n                                                                        <option value=\"5\">5<\/option>\n                                                                        <option value=\"6\">6<\/option>\n                                                                        <option value=\"7\">7<\/option>\n                                                                        <option value=\"8\">8<\/option>\n                                                                        <option value=\"9\">9<\/option>\n                                                                        <option value=\"10\">10<\/option>\n                                                                        <option value=\"11\">11<\/option>\n                                                                        <option value=\"12\">12<\/option>\n                                                                    <\/select>\n                                <label class=\"bpr-screen-reader-text\" for=\"bpr-start-minute\">Start minute<\/label>\n                                <select id=\"bpr-start-minute\" class=\"bpr-time-part\" data-time-part=\"minute\" aria-label=\"Start minute\">\n                                    <option value=\"\">Min<\/option>\n                                                                        <option value=\"00\">00<\/option>\n                                                                        <option value=\"15\">15<\/option>\n                                                                        <option value=\"30\">30<\/option>\n                                                                        <option value=\"45\">45<\/option>\n                                                                    <\/select>\n                                <div class=\"bpr-time-period\" role=\"group\" aria-label=\"Start time period\">\n                                    <button type=\"button\" data-time-period=\"AM\" aria-pressed=\"false\">AM<\/button>\n                                    <button type=\"button\" data-time-period=\"PM\" aria-pressed=\"false\">PM<\/button>\n                                <\/div>\n                            <\/div>\n                            <input type=\"hidden\" id=\"bpr-start-time\" value=\"\">\n                        <\/fieldset>\n                        <span class=\"bpr-time-range__arrow\" aria-hidden=\"true\">\u2192<\/span>\n                        <fieldset class=\"bpr-field bpr-time-fieldset\" id=\"bpr-end-time-control\" data-time-control=\"end\" tabindex=\"-1\" aria-describedby=\"bpr-time-step-hint\">\n                            <legend>End Time *<\/legend>\n                            <div class=\"bpr-time-parts\">\n                                <label class=\"bpr-screen-reader-text\" for=\"bpr-end-hour\">End hour<\/label>\n                                <select id=\"bpr-end-hour\" class=\"bpr-time-part\" data-time-part=\"hour\" aria-label=\"End hour\">\n                                    <option value=\"\">Hour<\/option>\n                                                                        <option value=\"1\">1<\/option>\n                                                                        <option value=\"2\">2<\/option>\n                                                                        <option value=\"3\">3<\/option>\n                                                                        <option value=\"4\">4<\/option>\n                                                                        <option value=\"5\">5<\/option>\n                                                                        <option value=\"6\">6<\/option>\n                                                                        <option value=\"7\">7<\/option>\n                                                                        <option value=\"8\">8<\/option>\n                                                                        <option value=\"9\">9<\/option>\n                                                                        <option value=\"10\">10<\/option>\n                                                                        <option value=\"11\">11<\/option>\n                                                                        <option value=\"12\">12<\/option>\n                                                                    <\/select>\n                                <label class=\"bpr-screen-reader-text\" for=\"bpr-end-minute\">End minute<\/label>\n                                <select id=\"bpr-end-minute\" class=\"bpr-time-part\" data-time-part=\"minute\" aria-label=\"End minute\">\n                                    <option value=\"\">Min<\/option>\n                                                                        <option value=\"00\">00<\/option>\n                                                                        <option value=\"15\">15<\/option>\n                                                                        <option value=\"30\">30<\/option>\n                                                                        <option value=\"45\">45<\/option>\n                                                                    <\/select>\n                                <div class=\"bpr-time-period\" role=\"group\" aria-label=\"End time period\">\n                                    <button type=\"button\" data-time-period=\"AM\" aria-pressed=\"false\">AM<\/button>\n                                    <button type=\"button\" data-time-period=\"PM\" aria-pressed=\"false\">PM<\/button>\n                                <\/div>\n                            <\/div>\n                            <input type=\"hidden\" id=\"bpr-end-time\" value=\"\">\n                        <\/fieldset>\n                    <\/div>\n                    <small id=\"bpr-time-step-hint\" class=\"bpr-schedule-help\">Times are shown in 15-minute increments.<\/small>\n\n                    <div id=\"bpr-schedule-selection\" class=\"bpr-schedule-selection\" hidden aria-live=\"polite\">\n                        <div><span>Date<\/span><strong id=\"bpr-selected-date\">\u2014<\/strong><\/div>\n                        <div><span>Time<\/span><strong id=\"bpr-selected-time\">\u2014<\/strong><\/div>\n                        <div><span>Duration<\/span><strong id=\"bpr-selected-duration\">\u2014<\/strong><\/div>\n                    <\/div>\n                <\/section>\n            <\/div>\n\n            <!-- Diamond add-ons (shown only when a diamond facility is selected) -->\n            <div id=\"bpr-diamond-addons\" style=\"display:none;\" class=\"bpr-diamond-addons\">\n                <h3>Ball Diamond Add-Ons<\/h3>\n                <div class=\"bpr-addons-grid\">\n                                        <label class=\"bpr-addon-card\">\n                        <input type=\"checkbox\" name=\"addon_lights\" id=\"bpr-addon-lights\" value=\"1\"\n                               data-fee=\"25\">\n                        <span class=\"bpr-addon-icon\" aria-hidden=\"true\">\ud83d\udca1<\/span>\n                        <span class=\"bpr-addon-label\">Field Lights<\/span>\n                        <span class=\"bpr-addon-price\">+$25.00<\/span>\n                    <\/label>\n                    <label class=\"bpr-addon-card\">\n                        <input type=\"checkbox\" name=\"addon_lined\" id=\"bpr-addon-lined\" value=\"1\"\n                               data-fee=\"20\">\n                        <span class=\"bpr-addon-icon\" aria-hidden=\"true\">\u26be<\/span>\n                        <span class=\"bpr-addon-label\">Lined Field (by staff)<\/span>\n                        <span class=\"bpr-addon-price\">+$20.00<\/span>\n                    <\/label>\n                    <label class=\"bpr-addon-card\">\n                        <input type=\"checkbox\" name=\"addon_clubhouse\" id=\"bpr-addon-clubhouse\" value=\"1\"\n                               data-fee=\"100\">\n                        <span class=\"bpr-addon-icon\" aria-hidden=\"true\">\ud83c\udfe0<\/span>\n                        <span class=\"bpr-addon-label\">Clubhouse<\/span>\n                        <span class=\"bpr-addon-price\">+$100.00<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n\n            <input type=\"hidden\" id=\"bpr-start-datetime\" name=\"start_datetime\">\n            <input type=\"hidden\" id=\"bpr-end-datetime\" name=\"end_datetime\">\n\n            <div id=\"bpr-availability-result\" class=\"bpr-availability-msg\" role=\"status\" aria-live=\"polite\"><\/div>\n\n            <!-- Fee preview with resident pricing -->\n            <div id=\"bpr-fee-preview\" class=\"bpr-fee-preview\" style=\"display:none;\" aria-live=\"polite\">\n                <div class=\"bpr-fee-row\"><span>Duration:<\/span><span id=\"bpr-fee-hours\">\u2014<\/span><\/div>\n                <div class=\"bpr-fee-row\"><span>Rental subtotal:<\/span><span id=\"bpr-fee-base\">\u2014<\/span><\/div>\n                <div class=\"bpr-fee-row\"><span id=\"bpr-fee-calculation\"><\/span><\/div>\n                                <div class=\"bpr-fee-row bpr-fee-row--total\"><span>Estimated Total:<\/span><strong id=\"bpr-fee-total\">\u2014<\/strong><\/div>\n            <\/div>\n\n            <p class=\"bpr-step-nav\">\n                <button type=\"button\" class=\"bpr-btn bpr-btn-secondary bpr-prev-step\">\u2190 Back<\/button>\n                <button type=\"button\" class=\"bpr-btn bpr-btn-secondary\" id=\"bpr-add-to-cart-btn\" disabled>Add to Booking &amp; Choose Another<\/button>\n                <button type=\"button\" class=\"bpr-btn bpr-btn-primary\" id=\"bpr-step2-next\" disabled>Continue with This Rental \u2192<\/button>\n            <\/p>\n        <\/div>\n\n        <!-- STEP 3: Renter Details -->\n        <div class=\"bpr-form-step\" data-step=\"3\" style=\"display:none;\">\n            <h2 class=\"bpr-step-title\">Your Details<\/h2>\n\n            \n            <div class=\"bpr-fields-grid\">\n                <div class=\"bpr-field\">\n                    <label for=\"bpr-first-name\">First Name *<\/label>\n                    <input type=\"text\" id=\"bpr-first-name\" name=\"first_name\" class=\"bpr-input\" required autocomplete=\"given-name\"\n                           value=\"\">\n                <\/div>\n                <div class=\"bpr-field\">\n                    <label for=\"bpr-last-name\">Last Name *<\/label>\n                    <input type=\"text\" id=\"bpr-last-name\" name=\"last_name\" class=\"bpr-input\" required autocomplete=\"family-name\"\n                           value=\"\">\n                <\/div>\n                <div class=\"bpr-field\">\n                    <label for=\"bpr-email\">Email Address *<\/label>\n                    <input type=\"email\" id=\"bpr-email\" name=\"email\" class=\"bpr-input\" required autocomplete=\"email\"\n                           value=\"\">\n                <\/div>\n                <div class=\"bpr-field\">\n                    <label for=\"bpr-phone\">Phone Number *<\/label>\n                    <input type=\"tel\" id=\"bpr-phone\" name=\"phone\" class=\"bpr-input\" required autocomplete=\"tel\">\n                <\/div>\n                <div class=\"bpr-field bpr-field--full\">\n                    <label for=\"bpr-event-name\">Event Name *<\/label>\n                    <input type=\"text\" id=\"bpr-event-name\" name=\"event_name\" class=\"bpr-input\" required placeholder=\"Birthday party, family reunion, practice\u2026\">\n                <\/div>\n                <div class=\"bpr-field\">\n                    <label for=\"bpr-guests\">Expected Guests<\/label>\n                    <input type=\"number\" id=\"bpr-guests\" name=\"guests_count\" class=\"bpr-input\" min=\"0\" value=\"0\">\n                <\/div>\n                <div class=\"bpr-field bpr-field--full bpr-paperwork-panel\">\n                    <label for=\"bpr-driver-license-copy\">Upload Driver&#039;s License or State ID Photo *<\/label>\n                    <input type=\"file\" id=\"bpr-driver-license-copy\" class=\"bpr-input bpr-private-upload\" accept=\".pdf,.jpg,.jpeg,.png\" data-file-type=\"driver_license\" data-token-field=\"driver_license_token\" required>\n                    <input type=\"hidden\" name=\"driver_license_token\" id=\"driver_license_token\">\n                    <small class=\"bpr-upload-status\" data-status-for=\"driver_license\">Required for every reservation. PDF, JPG, or PNG; maximum 10 MB. Stored privately for authorized staff only.<\/small>\n                <\/div>\n                <div class=\"bpr-field bpr-field--full\">\n                    <label class=\"bpr-checkbox-label\">\n                        <input type=\"checkbox\" id=\"bpr-alcohol\" name=\"alcohol\" value=\"1\">\n                        Alcohol will be present at my event                    <\/label>\n                    <small>Selecting alcohol adds any listed alcohol fee once to each facility rental in this booking. Fees appear in your cart and review total.<\/small>\n                    <div id=\"bpr-alcohol-notice\" style=\"display:none;\" class=\"bpr-notice bpr-notice--warning\" role=\"alert\">\n                        <strong>Alcohol Policy:<\/strong>\n                        A liquor liability certificate must be uploaded before this reservation can be submitted. Your identification is already collected once for the reservation. A separate liquor permit may also be required.                        <button type=\"button\" class=\"bpr-btn bpr-btn-secondary bpr-btn-sm\" id=\"bpr-open-alcohol-docs\">Upload Liquor Liability Certificate<\/button>\n                    <\/div>\n                <\/div>\n                <div class=\"bpr-field bpr-field--full\">\n                    <label class=\"bpr-checkbox-label\">\n                        <input type=\"checkbox\" id=\"bpr-outside-vendors\" name=\"form_data[outside_vendors]\" value=\"1\">\n                        I plan to bring an outside vendor (food truck, jump house, etc.)                    <\/label>\n                    <div id=\"bpr-vendor-paperwork\" class=\"bpr-paperwork-panel\" style=\"display:none;\">\n                        <p><strong>Outside Vendor Details<\/strong><\/p>\n                        <div class=\"bpr-paperwork-options\">\n                            <label><input type=\"checkbox\" name=\"form_data[vendor_types][]\" value=\"food_truck\"> Food truck<\/label>\n                            <label><input type=\"checkbox\" name=\"form_data[vendor_types][]\" value=\"jump_house\"> Jump house \/ inflatable<\/label>\n                            <label><input type=\"checkbox\" name=\"form_data[vendor_types][]\" value=\"other\"> Other outside vendor<\/label>\n                        <\/div>\n                        <label for=\"bpr-vendor-coi\">Certificate of Insurance (optional now)<\/label>\n                        <input type=\"file\" id=\"bpr-vendor-coi\" class=\"bpr-input bpr-private-upload\" accept=\".pdf,.jpg,.jpeg,.png\" data-file-type=\"vendor_coi\" data-token-field=\"vendor_coi_token\">\n                        <input type=\"hidden\" name=\"vendor_coi_token\" id=\"vendor_coi_token\">\n                        <small class=\"bpr-upload-status\" data-status-for=\"vendor_coi\">PDF, JPG, or PNG; maximum 10 MB. You can also upload this later from the secure link emailed with the reservation.<\/small>\n                    <\/div>\n                <\/div>\n                <div class=\"bpr-field bpr-field--full\">\n                    <label for=\"bpr-notes\">Additional Notes<\/label>\n                    <textarea id=\"bpr-notes\" name=\"notes\" class=\"bpr-input\" rows=\"3\"><\/textarea>\n                <\/div>\n            <\/div>\n\n            <p class=\"bpr-step-nav\">\n                <button type=\"button\" class=\"bpr-btn bpr-btn-secondary bpr-prev-step\">\u2190 Back<\/button>\n                <button type=\"button\" class=\"bpr-btn bpr-btn-primary bpr-next-step\">Review &amp; Submit \u2192<\/button>\n            <\/p>\n        <\/div>\n\n        <!-- STEP 4: Review & Submit -->\n        <div class=\"bpr-form-step\" data-step=\"4\" style=\"display:none;\">\n            <h2 class=\"bpr-step-title\">Review &amp; Submit<\/h2>\n            <div id=\"bpr-review-summary\" class=\"bpr-review-summary\" aria-live=\"polite\"><\/div>\n\n            <!-- Cart items (multi-booking) -->\n            <div id=\"bpr-cart-review\" style=\"display:none;\" class=\"bpr-cart-review\">\n                <h3>Rentals in This Booking<\/h3>\n                <div id=\"bpr-cart-items-list\"><\/div>\n            <\/div>\n\n            <div class=\"bpr-agreement-box\">\n                <h3>Rental Agreement<\/h3>\n                <div class=\"bpr-agreement-text\">\n                    <p>The renter is responsible for any damages beyond normal wear and tear to village property during the rental event.<\/p>\n                    <p>All trash must be taken to the dumpster and not left in receptacles at the facility. The facility must be cleaned before leaving.<\/p>\n                    <p>Violation of park rules is punishable by a fine of $150 to $750 per offense.<\/p>\n                <\/div>\n                <label class=\"bpr-checkbox-label bpr-required-check\">\n                    <input type=\"checkbox\" name=\"form_data[rental_agreement]\" value=\"1\" required>\n                    <span>I agree to the Rental Agreement *<\/span>\n                <\/label>\n            <\/div>\n\n            <div class=\"bpr-field\" style=\"margin-top:24px;\">\n                <label id=\"bpr-sig-label\">Renter Signature *<\/label>\n                <div class=\"bpr-signature-wrap\">\n                    <canvas class=\"bpr-signature-pad\" id=\"bpr-sig-canvas\" aria-labelledby=\"bpr-sig-label\" role=\"img\" tabindex=\"0\"><\/canvas>\n                    <input type=\"hidden\" id=\"bpr-signature\" name=\"form_data[signature]\" required>\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-sm bpr-btn-secondary\" id=\"bpr-sig-clear\" aria-label=\"Clear signature\">Clear<\/button>\n                <\/div>\n            <\/div>\n\n            <div id=\"bpr-submit-msg\" class=\"bpr-form-message\" role=\"alert\" aria-live=\"polite\"><\/div>\n            <p class=\"bpr-step-nav\">\n                <button type=\"button\" class=\"bpr-btn bpr-btn-secondary bpr-prev-step\">\u2190 Back<\/button>\n                <button type=\"submit\" class=\"bpr-btn bpr-btn-primary bpr-btn-lg\" id=\"bpr-submit-btn\">\n                    Submit Reservation                <\/button>\n            <\/p>\n        <\/div>\n\n        <!-- STEP 5: Confirmation -->\n        <div class=\"bpr-form-step bpr-confirmation\" data-step=\"5\" style=\"display:none;\" aria-live=\"polite\">\n            <div class=\"bpr-confirmation-icon\" aria-hidden=\"true\">\u2705<\/div>\n            <h2>Reservation Submitted!<\/h2>\n            <div id=\"bpr-confirmation-details\"><\/div>\n                    <\/div>\n\n        <div class=\"bpr-validation-modal\" id=\"bpr-validation-modal\" hidden role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bpr-validation-title\" aria-describedby=\"bpr-validation-description\">\n            <div class=\"bpr-validation-modal__card\" role=\"document\">\n                <div class=\"bpr-validation-modal__header\">\n                    <span class=\"bpr-validation-modal__icon\" aria-hidden=\"true\">!<\/span>\n                    <div>\n                        <span class=\"bpr-validation-modal__eyebrow\">Reservation Form<\/span>\n                        <h2 id=\"bpr-validation-title\" tabindex=\"-1\">Before You Continue<\/h2>\n                    <\/div>\n                    <button type=\"button\" class=\"bpr-validation-modal__close\" id=\"bpr-validation-close\" aria-label=\"Close and return to the reservation\">&times;<\/button>\n                <\/div>\n                <div class=\"bpr-validation-modal__body\">\n                    <p id=\"bpr-validation-description\">Please complete the required information below.<\/p>\n                    <ul id=\"bpr-validation-list\" class=\"bpr-validation-list\"><\/ul>\n                <\/div>\n                <div class=\"bpr-validation-modal__footer\">\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-primary\" id=\"bpr-validation-fix-first\">Fix First Missing Item \u2192<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"bpr-paperwork-modal\" id=\"bpr-alcohol-modal\" hidden role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bpr-alcohol-modal-title\">\n            <div class=\"bpr-paperwork-modal__card\">\n                <h2 id=\"bpr-alcohol-modal-title\">Alcohol Certificate Required<\/h2>\n                <p>Upload the liquor liability certificate before continuing. Your driver-license or state-ID photo is collected once in the main reservation form. Files are stored privately and are available only to authorized staff and the reservation owner.<\/p>\n                <div class=\"bpr-field\">\n                    <label for=\"bpr-alcohol-liability\">Liquor Liability Certificate of Insurance *<\/label>\n                    <input type=\"file\" id=\"bpr-alcohol-liability\" class=\"bpr-input bpr-private-upload\" accept=\".pdf,.jpg,.jpeg,.png\" data-file-type=\"alcohol_liability\" data-token-field=\"alcohol_liability_token\">\n                    <input type=\"hidden\" name=\"alcohol_liability_token\" id=\"alcohol_liability_token\">\n                    <small class=\"bpr-upload-status\" data-status-for=\"alcohol_liability\">PDF, JPG, or PNG; maximum 10 MB.<\/small>\n                <\/div>\n                <div id=\"bpr-alcohol-modal-error\" class=\"bpr-form-message\" role=\"alert\" aria-live=\"polite\"><\/div>\n                <div class=\"bpr-paperwork-modal__actions\">\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-secondary\" id=\"bpr-cancel-alcohol-docs\">Cancel Alcohol Selection<\/button>\n                    <button type=\"button\" class=\"bpr-btn bpr-btn-primary\" id=\"bpr-save-alcohol-docs\">Save Certificate &amp; Continue<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/form>\n<\/div>\n\n<script>\n(function(){\n'use strict';\nvar form         = document.getElementById('bpr-res-form');\nvar currentStep  = 1;\nvar selectedFacility = null;   \/\/ {id, rate, minHours, name}\nvar availabilityOk   = false;\nvar availabilityRequestId = 0;\nvar cartCount        = 0;\nvar cartTotal        = 0;\nvar cartItems        = [];\nvar cartPanelOpen    = false;\nvar cartQuoteRequestId = 0;\nvar cartQuotePending = false;\nvar cartQuoteError = false;\nvar validationModal  = document.getElementById('bpr-validation-modal');\nvar validationIssues = [];\nvar validationReturnFocus = null;\nvar sigCanvas, sigCtx, sigDrawing = false, sigHasData = false, sigPointerId = null;\nvar nonce = document.querySelector('[name=\"bpr_nonce\"]').value;\nvar bookingSession = document.querySelector('[name=\"booking_session\"]').value;\nvar ajax  = 'https:\/\/bpr.williehowe.com\/wp-admin\/admin-ajax.php';\nvar minDateValue = form.dataset.minDate;\nvar maxDateValue = form.dataset.maxDate;\nvar calendarCursor = parseLocalDate(minDateValue);\n\nfunction escHtml(value){\n    return String(value??'').replace(\/[&<>\"']\/g,function(char){\n        return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[char];\n    });\n}\n\n\/\/ \u2500\u2500 Reservation date and time picker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction parseLocalDate(value){\n    var parts = String(value || '').split('-').map(Number);\n    return new Date(parts[0], (parts[1] || 1) - 1, parts[2] || 1, 12, 0, 0);\n}\n\nfunction formatLocalDate(date){\n    return date.getFullYear() + '-' + String(date.getMonth() + 1).padStart(2,'0') + '-' + String(date.getDate()).padStart(2,'0');\n}\n\nfunction prettyScheduleDate(value){\n    if(!value) return 'Choose a date';\n    return parseLocalDate(value).toLocaleDateString('en-US',{weekday:'short',month:'short',day:'numeric',year:'numeric'});\n}\n\nfunction timeToMinutes(value){\n    if(!value) return -1;\n    var parts = value.split(':').map(Number);\n    return (parts[0] * 60) + parts[1];\n}\n\nfunction minutesToTime(minutes){\n    if(minutes < 0 || minutes >= 1440) return '';\n    return String(Math.floor(minutes \/ 60)).padStart(2,'0') + ':' + String(minutes % 60).padStart(2,'0');\n}\n\nfunction prettyScheduleTime(value){\n    var minutes = timeToMinutes(value);\n    if(minutes < 0) return '';\n    var hour24 = Math.floor(minutes \/ 60);\n    var hour12 = hour24 % 12 || 12;\n    return hour12 + ':' + String(minutes % 60).padStart(2,'0') + ' ' + (hour24 < 12 ? 'AM' : 'PM');\n}\n\nfunction prettyScheduleDuration(minutes){\n    if(minutes <= 0) return '\u2014';\n    var hours = Math.floor(minutes \/ 60);\n    var remainder = minutes % 60;\n    if(hours && remainder) return hours + ' hr ' + remainder + ' min';\n    if(hours) return hours + (hours === 1 ? ' hour' : ' hours');\n    return remainder + ' minutes';\n}\n\nfunction getTimeControl(name){\n    return document.getElementById('bpr-' + name + '-time-control');\n}\n\nfunction getTimeField(name){\n    return document.getElementById('bpr-' + name + '-time');\n}\n\nfunction timeControlValue(name){\n    var control = getTimeControl(name);\n    if(!control) return '';\n    var hourField = control.querySelector('[data-time-part=\"hour\"]');\n    var minuteField = control.querySelector('[data-time-part=\"minute\"]');\n    var hour = parseInt(hourField && hourField.value, 10);\n    var minute = minuteField ? minuteField.value : '';\n    var period = control.dataset.period || '';\n    if(!hour || minute === '' || !period) return '';\n    var hour24 = hour % 12 + (period === 'PM' ? 12 : 0);\n    return String(hour24).padStart(2,'0') + ':' + minute;\n}\n\nfunction setTimeControlValue(name, value){\n    var control = getTimeControl(name);\n    var field = getTimeField(name);\n    if(!control || !field) return;\n    var hourField = control.querySelector('[data-time-part=\"hour\"]');\n    var minuteField = control.querySelector('[data-time-part=\"minute\"]');\n    var minutes = timeToMinutes(value);\n    var period = '';\n    if(minutes >= 0){\n        var hour24 = Math.floor(minutes \/ 60);\n        hourField.value = String(hour24 % 12 || 12);\n        minuteField.value = String(minutes % 60).padStart(2,'0');\n        period = hour24 < 12 ? 'AM' : 'PM';\n        field.value = minutesToTime(minutes);\n    } else {\n        hourField.value = '';\n        minuteField.value = '';\n        field.value = '';\n    }\n    control.dataset.period = period;\n    control.querySelectorAll('[data-time-period]').forEach(function(button){\n        var selected = button.dataset.timePeriod === period;\n        button.classList.toggle('is-selected', selected);\n        button.setAttribute('aria-pressed', selected ? 'true' : 'false');\n    });\n}\n\nfunction syncTimeControl(name){\n    var control = getTimeControl(name);\n    var field = getTimeField(name);\n    if(!control || !field) return;\n    field.value = timeControlValue(name);\n    if(field.value){\n        control.classList.remove('bpr-error');\n        control.removeAttribute('aria-invalid');\n    }\n}\n\nfunction handleTimeControlChange(name){\n    var control = getTimeControl(name);\n    if(!control) return;\n    var hourField = control.querySelector('[data-time-part=\"hour\"]');\n    var minuteField = control.querySelector('[data-time-part=\"minute\"]');\n    if(hourField.value && !minuteField.value) minuteField.value = '00';\n    syncTimeControl(name);\n    syncEndTimeOptions(name === 'start');\n    updateScheduleSelection();\n    checkAvailabilityAndFee();\n}\n\nfunction renderScheduleCalendar(){\n    var grid = document.getElementById('bpr-calendar-grid');\n    var label = document.getElementById('bpr-calendar-month');\n    if(!grid || !label) return;\n    var year = calendarCursor.getFullYear();\n    var month = calendarCursor.getMonth();\n    var firstWeekday = new Date(year, month, 1, 12).getDay();\n    var daysInMonth = new Date(year, month + 1, 0, 12).getDate();\n    var selectedDate = document.getElementById('bpr-start-date').value;\n    var todayValue = formatLocalDate(new Date());\n    var cells = [];\n    var i;\n    label.textContent = calendarCursor.toLocaleDateString('en-US',{month:'long',year:'numeric'});\n    for(i = 0; i < firstWeekday; i++) cells.push('<span class=\"bpr-date-day bpr-date-day--empty\" aria-hidden=\"true\"><\/span>');\n    for(i = 1; i <= daysInMonth; i++){\n        var date = new Date(year, month, i, 12);\n        var value = formatLocalDate(date);\n        var disabled = value < minDateValue || value > maxDateValue;\n        var classes = ['bpr-date-day'];\n        if(value === selectedDate) classes.push('is-selected');\n        if(value === todayValue) classes.push('is-today');\n        cells.push('<button type=\"button\" class=\"' + classes.join(' ') + '\" data-date=\"' + value + '\" role=\"gridcell\" aria-label=\"' +\n            escHtml(date.toLocaleDateString('en-US',{weekday:'long',month:'long',day:'numeric',year:'numeric'})) + '\" aria-selected=\"' +\n            (value === selectedDate ? 'true' : 'false') + '\"' + (disabled ? ' disabled' : '') + '>' + i + '<\/button>');\n    }\n    while(cells.length % 7) cells.push('<span class=\"bpr-date-day bpr-date-day--empty\" aria-hidden=\"true\"><\/span>');\n    grid.innerHTML = cells.join('');\n    var previousMonthEnd = formatLocalDate(new Date(year, month, 0, 12));\n    var nextMonthStart = formatLocalDate(new Date(year, month + 1, 1, 12));\n    document.getElementById('bpr-calendar-prev').disabled = previousMonthEnd < minDateValue;\n    document.getElementById('bpr-calendar-next').disabled = nextMonthStart > maxDateValue;\n}\n\nfunction setScheduleDate(value){\n    if(!value || value < minDateValue || value > maxDateValue) return;\n    document.getElementById('bpr-start-date').value = value;\n    calendarCursor = new Date(parseLocalDate(value).getFullYear(), parseLocalDate(value).getMonth(), 1, 12);\n    var picker = document.getElementById('bpr-date-picker');\n    picker.classList.remove('bpr-error');\n    picker.removeAttribute('aria-invalid');\n    renderScheduleCalendar();\n    updateScheduleSelection();\n    checkAvailabilityAndFee();\n}\n\nfunction updateTimeMinimum(){\n    var hint = document.getElementById('bpr-time-minimum');\n    if(!hint) return;\n    if(selectedFacility && selectedFacility.minHours > 0){\n        var amount = selectedFacility.minHours;\n        hint.textContent = 'Minimum booking: ' + amount + (amount === 1 ? ' hour. ' : ' hours. ') + 'An end time will be suggested after you choose a start time.';\n    } else {\n        hint.textContent = 'Select a start and end time for this rental.';\n    }\n}\n\nfunction syncEndTimeOptions(suggestEnd){\n    var startField = document.getElementById('bpr-start-time');\n    var endField = document.getElementById('bpr-end-time');\n    var startMinutes = timeToMinutes(startField.value);\n    if(startMinutes < 0) return;\n    var endMinutes = timeToMinutes(endField.value);\n    if(suggestEnd && endMinutes <= startMinutes){\n        var minimumHours = selectedFacility && selectedFacility.minHours > 0 ? selectedFacility.minHours : 1;\n        var suggestedMinutes = startMinutes + (Math.ceil(minimumHours * 4) * 15);\n        setTimeControlValue('end', minutesToTime(suggestedMinutes));\n    } else if(endMinutes >= 0 && endMinutes <= startMinutes){\n        setTimeControlValue('end', '');\n    }\n}\n\nfunction updateScheduleSelection(){\n    var dateValue = document.getElementById('bpr-start-date').value;\n    var startValue = document.getElementById('bpr-start-time').value;\n    var endValue = document.getElementById('bpr-end-time').value;\n    var summary = document.getElementById('bpr-schedule-selection');\n    if(!summary) return;\n    summary.hidden = !(dateValue || startValue || endValue);\n    document.getElementById('bpr-selected-date').textContent = prettyScheduleDate(dateValue);\n    document.getElementById('bpr-selected-time').textContent = startValue && endValue\n        ? prettyScheduleTime(startValue) + ' \u2013 ' + prettyScheduleTime(endValue)\n        : (startValue ? prettyScheduleTime(startValue) + ' \u2013 Choose an end time' : 'Choose start and end times');\n    var duration = timeToMinutes(endValue) - timeToMinutes(startValue);\n    document.getElementById('bpr-selected-duration').textContent = startValue && endValue && duration > 0 ? prettyScheduleDuration(duration) : '\u2014';\n}\n\ndocument.getElementById('bpr-calendar-prev')?.addEventListener('click', function(){\n    calendarCursor = new Date(calendarCursor.getFullYear(), calendarCursor.getMonth() - 1, 1, 12);\n    renderScheduleCalendar();\n});\ndocument.getElementById('bpr-calendar-next')?.addEventListener('click', function(){\n    calendarCursor = new Date(calendarCursor.getFullYear(), calendarCursor.getMonth() + 1, 1, 12);\n    renderScheduleCalendar();\n});\ndocument.getElementById('bpr-calendar-grid')?.addEventListener('click', function(event){\n    var button = event.target.closest ? event.target.closest('.bpr-date-day[data-date]') : null;\n    if(button && !button.disabled) setScheduleDate(button.dataset.date);\n});\ndocument.querySelectorAll('.bpr-time-fieldset select').forEach(function(select){\n    select.addEventListener('change', function(){\n        handleTimeControlChange(this.closest('.bpr-time-fieldset').dataset.timeControl);\n    });\n});\ndocument.querySelectorAll('.bpr-time-period button').forEach(function(button){\n    button.addEventListener('click', function(){\n        var control = this.closest('.bpr-time-fieldset');\n        control.dataset.period = this.dataset.timePeriod;\n        control.querySelectorAll('[data-time-period]').forEach(function(periodButton){\n            var selected = periodButton === button;\n            periodButton.classList.toggle('is-selected', selected);\n            periodButton.setAttribute('aria-pressed', selected ? 'true' : 'false');\n        });\n        handleTimeControlChange(control.dataset.timeControl);\n    });\n});\nrenderScheduleCalendar();\nupdateScheduleSelection();\n\n\/\/ \u2500\u2500 Facility cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.querySelectorAll('.bpr-facility-card').forEach(function(card){\n    card.addEventListener('click', function(e){\n        if(e.target.closest && e.target.closest('a,button,details,summary')) return;\n        selectFacilityCard.call(this, true);\n    });\n    card.addEventListener('keydown', function(e){\n        if(e.key==='Enter'||e.key===' '){\n            e.preventDefault();\n            selectFacilityCard.call(this, true);\n        }\n    });\n});\n\nfunction selectFacilityCard(advanceToSchedule){\n    availabilityRequestId++;\n    document.querySelectorAll('.bpr-facility-card').forEach(function(c){ c.classList.remove('selected'); c.setAttribute('aria-checked','false'); });\n    this.classList.add('selected');\n    this.setAttribute('aria-checked','true');\n    var facilityMinimum = parseFloat(this.dataset.minHours);\n    selectedFacility = {\n        id:       this.dataset.facilityId,\n        rate:     parseFloat(this.dataset.hourlyRate)||0,\n        minHours: Number.isFinite(facilityMinimum) ? Math.max(0, facilityMinimum) : 1,\n        name:     this.dataset.name,\n        type:     this.dataset.type,\n    };\n    document.getElementById('bpr-facility-id').value = selectedFacility.id;\n    document.getElementById('bpr-step1-prompt').style.display = 'none';\n    document.getElementById('bpr-step1-actions').style.display = 'block';\n    document.getElementById('bpr-step2-facility-name').textContent = '\ud83d\udccd ' + selectedFacility.name;\n    \/\/ Show diamond add-ons only for diamond facilities\n    var addons = document.getElementById('bpr-diamond-addons');\n    if(addons) addons.style.display = selectedFacility.type === 'diamond' ? 'block' : 'none';\n    \/\/ Clear add-on checkboxes when switching facilities\n    document.querySelectorAll('[name^=\"addon_\"]').forEach(function(cb){ cb.checked = false; });\n    \/\/ Reset step 2\n    availabilityOk = false;\n    document.getElementById('bpr-step2-next').disabled = true;\n    document.getElementById('bpr-add-to-cart-btn').disabled = true;\n    document.getElementById('bpr-availability-result').textContent = '';\n    document.getElementById('bpr-fee-preview').style.display = 'none';\n    updateTimeMinimum();\n    syncEndTimeOptions(false);\n    updateScheduleSelection();\n    updateStep2ActionLabels();\n    if(document.getElementById('bpr-start-date').value && document.getElementById('bpr-start-time').value && document.getElementById('bpr-end-time').value){\n        checkAvailabilityAndFee();\n    }\n    if(advanceToSchedule && currentStep === 1){\n        goToStep(2);\n    }\n}\n\nvar preselectedCard = document.querySelector('.bpr-facility-card.selected');\nif(preselectedCard) selectFacilityCard.call(preselectedCard, false);\n\ndocument.getElementById('bpr-choose-different-facility')?.addEventListener('click', function(){\n    resetCurrentRental();\n    goToStep(1, true);\n});\n\n\/\/ \u2500\u2500 Save current rental (multi-site) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar addToCartBtn = document.getElementById('bpr-add-to-cart-btn');\nvar step2ContinueBtn = document.getElementById('bpr-step2-next');\nif(addToCartBtn) addToCartBtn.addEventListener('click', function(){ saveCurrentRental('another'); });\nif(step2ContinueBtn) step2ContinueBtn.addEventListener('click', function(){ saveCurrentRental('details'); });\n\nfunction saveCurrentRental(destination){\n    if(!selectedFacility) return;\n    var d = document.getElementById('bpr-start-date').value;\n    var s = document.getElementById('bpr-start-time').value;\n    var e = document.getElementById('bpr-end-time').value;\n    if(!d || !s || !e || !availabilityOk){\n        validateReservationStep(2);\n        return;\n    }\n    var startDt = d + ' ' + s + ':00';\n    var endDt   = d + ' ' + e + ':00';\n    var cartPayload = {\n        action:'bpr_cart_add', nonce:nonce, booking_session:bookingSession, facility_id:selectedFacility.id,\n        start_datetime:startDt, end_datetime:endDt,\n        addon_lights:document.getElementById('bpr-addon-lights')?.checked?'1':'0',\n        addon_lined:document.getElementById('bpr-addon-lined')?.checked?'1':'0',\n        addon_clubhouse:document.getElementById('bpr-addon-clubhouse')?.checked?'1':'0',\n        is_resident:document.getElementById('bpr-is-resident')?.checked?'1':'0',\n        alcohol:document.getElementById('bpr-alcohol')?.checked?'1':'0'\n    };\n    var addedFacilityName = selectedFacility.name;\n    ++cartQuoteRequestId;\n    cartQuotePending = true;\n    setRentalActionBusy(true, destination);\n    fetch(ajax, {method:'POST', headers:{'Content-Type':'application\/x-www-form-urlencoded'},\n        body: new URLSearchParams(cartPayload)\n    }).then(function(r){return r.json();}).then(function(res){\n        cartQuotePending = false;\n        if(res.success){\n            cartQuoteError = false;\n            updateCartBar(res.data);\n            resetCurrentRental();\n            if(destination === 'details'){\n                var feedback = document.getElementById('bpr-cart-feedback');\n                if(feedback) feedback.hidden = true;\n                goToStep(3, true);\n                setCartPanelOpen(true);\n            } else {\n                setCartPanelOpen(false);\n                goToStep(1, true);\n                showCartFeedback((res.data && res.data.message) || (addedFacilityName + ' was added to your booking.'));\n            }\n        }\n        else {\n            showAvail((res.data && res.data.message) || 'Could not add this rental to your booking.', false);\n        }\n    }).catch(function(){\n        cartQuotePending = false;\n        cartQuoteError = true;\n        showAvail('Could not add this rental because of a connection error. Please try again.', false);\n    }).finally(function(){\n        setRentalActionBusy(false, destination);\n    });\n}\n\ndocument.getElementById('bpr-step1-cart-continue')?.addEventListener('click', continueWithCart);\ndocument.getElementById('bpr-step1-add-another')?.addEventListener('click', function(){\n    var feedback = document.getElementById('bpr-cart-feedback');\n    if(feedback) feedback.hidden = true;\n    var firstCard = document.querySelector('.bpr-facility-card');\n    if(firstCard){\n        firstCard.scrollIntoView({behavior:'smooth', block:'center'});\n        try { firstCard.focus({preventScroll:true}); } catch(e) { firstCard.focus(); }\n    }\n});\ndocument.getElementById('bpr-cart-view-btn')?.addEventListener('click', function(){\n    setCartPanelOpen(!cartPanelOpen, true);\n});\ndocument.getElementById('bpr-cart-close-btn')?.addEventListener('click', function(){\n    setCartPanelOpen(false);\n    document.getElementById('bpr-cart-view-btn')?.focus();\n});\ndocument.getElementById('bpr-cart-panel-add-another')?.addEventListener('click', function(){\n    setCartPanelOpen(false);\n    resetCurrentRental();\n    goToStep(1, true);\n    var firstCard = document.querySelector('.bpr-facility-card');\n    if(firstCard) firstCard.scrollIntoView({behavior:'smooth', block:'center'});\n});\nfunction setCartPanelOpen(open, focusPanel){\n    var panel = document.getElementById('bpr-cart-panel');\n    var button = document.getElementById('bpr-cart-view-btn');\n    cartPanelOpen = !!open && cartCount > 0;\n    if(panel) panel.hidden = !cartPanelOpen;\n    if(button){\n        button.setAttribute('aria-expanded', cartPanelOpen ? 'true' : 'false');\n        button.textContent = cartPanelOpen ? 'Hide Cart' : 'View Cart';\n    }\n    if(cartPanelOpen && focusPanel && panel){\n        try { panel.focus({preventScroll:true}); } catch(e) { panel.focus(); }\n    }\n}\n\nfunction updateCartBar(data){\n    if((typeof data.is_resident === 'boolean' && data.is_resident !== !!document.getElementById('bpr-is-resident')?.checked) ||\n       (typeof data.alcohol === 'boolean' && data.alcohol !== !!document.getElementById('bpr-alcohol')?.checked)){\n        refreshCartQuote();\n        return;\n    }\n    cartItems = Array.isArray(data.cart) ? data.cart : [];\n    var count = cartItems.length;\n    cartCount = count;\n    cartTotal = parseFloat(data.total||0) || 0;\n    var bar   = document.getElementById('bpr-cart-bar');\n    document.getElementById('bpr-cart-count').textContent = count;\n    document.getElementById('bpr-cart-total').textContent = '$' + parseFloat(data.total||0).toFixed(2);\n    bar.style.display = count > 0 ? 'block' : 'none';\n    var savedContinueBtn = document.getElementById('bpr-step1-cart-continue');\n    if(savedContinueBtn) savedContinueBtn.textContent = count === 1 ? 'Continue with 1 Saved Rental \u2192' : 'Continue with ' + count + ' Saved Rentals \u2192';\n\n    var stepSummary = document.getElementById('bpr-step1-cart-summary');\n    var stepList = document.getElementById('bpr-step1-cart-items');\n    var stepTotal = document.getElementById('bpr-step1-cart-total');\n    var stepDescription = document.getElementById('bpr-step1-cart-description');\n    if(stepSummary) stepSummary.hidden = count === 0;\n    if(stepTotal) stepTotal.textContent = '$' + cartTotal.toFixed(2);\n    if(stepDescription && count){\n        stepDescription.textContent = count === 1\n            ? '1 rental is saved. Select another facility card to choose its date and time, or continue with only the saved rental.'\n            : count + ' rentals are saved. Select another facility card to choose its date and time, or continue with only the saved rentals.';\n    }\n    renderCartItems(stepList, cartItems);\n\n    \/\/ Keep the complete cart available beside every checkout step.\n    var panelList = document.getElementById('bpr-cart-panel-items');\n    var panelTotal = document.getElementById('bpr-cart-panel-total');\n    renderCartItems(panelList, cartItems);\n    if(panelTotal) panelTotal.textContent = '$' + cartTotal.toFixed(2);\n    setCartPanelOpen(cartPanelOpen);\n\n    \/\/ Update cart review panel\n    var list = document.getElementById('bpr-cart-items-list');\n    var reviewWrap = document.getElementById('bpr-cart-review');\n    if(list && cartItems.length){\n        renderCartItems(list, cartItems);\n        if(reviewWrap) reviewWrap.style.display='block';\n    } else if(reviewWrap) {\n        reviewWrap.style.display='none';\n        if(list) list.innerHTML='';\n    }\n    if(count === 0){\n        var feedback = document.getElementById('bpr-cart-feedback');\n        if(feedback) feedback.hidden = true;\n        cartPanelOpen = false;\n    }\n    if(currentStep === 4) buildReviewSummary();\n    updateStep2ActionLabels();\n}\n\nfunction renderCartItems(container, items){\n    if(!container) return;\n    if(!items.length){ container.innerHTML=''; return; }\n    container.innerHTML = items.map(function(item){\n        var date = item.start_datetime ? formatDt(item.start_datetime) : 'Date unavailable';\n        var startTime = item.start_datetime ? formatTime(item.start_datetime) : '\u2014';\n        var endTime = item.end_datetime ? formatTime(item.end_datetime) : '\u2014';\n        return '<div class=\"bpr-cart-item\">' +\n            '<span class=\"bpr-cart-item__details\"><strong>' + escHtml(item.facility_name) + '<\/strong>' +\n            '<small>' + escHtml(date) + ' \u00b7 ' + escHtml(startTime) + '\u2013' + escHtml(endTime) + '<\/small>' +\n            '<small>' + escHtml(item.pricing_summary || '') + '<\/small><\/span>' +\n            '<strong class=\"bpr-cart-item__fee\">$' + parseFloat(item.fee||0).toFixed(2) + '<\/strong>' +\n            '<button type=\"button\" class=\"bpr-btn bpr-btn-danger bpr-btn-xs bpr-cart-remove\" data-key=\"' + escHtml(item.key) + '\" aria-label=\"Remove ' + escHtml(item.facility_name) + ' from booking\">\u2715<\/button><\/div>';\n    }).join('');\n    container.querySelectorAll('.bpr-cart-remove').forEach(function(btn){\n        btn.addEventListener('click', function(){ removeCartItem(btn); });\n    });\n}\n\nfunction removeCartItem(btn){\n    btn.disabled = true;\n    ++cartQuoteRequestId;\n    cartQuotePending = true;\n    fetch(ajax, {method:'POST',headers:{'Content-Type':'application\/x-www-form-urlencoded'},\n        body: new URLSearchParams({action:'bpr_cart_remove', nonce:nonce, booking_session:bookingSession, key:btn.dataset.key, is_resident:document.getElementById('bpr-is-resident')?.checked?'1':'0', alcohol:document.getElementById('bpr-alcohol')?.checked?'1':'0'})\n    }).then(function(r){return r.json();}).then(function(res){\n        if(!res.success) throw new Error((res.data && res.data.message) || 'Could not remove this rental.');\n        cartQuotePending = false;\n        cartQuoteError = false;\n        updateCartBar(res.data);\n        if(cartCount === 0 && !selectedFacility && currentStep > 2){\n            goToStep(1, true);\n        }\n    }).catch(function(error){\n        cartQuotePending = false;\n        cartQuoteError = true;\n        btn.disabled = false;\n        showValidationError(error.message, document.getElementById('bpr-cart-panel'), {\n            title: 'Cart Update Needed',\n            description: 'The rental cart could not be updated.'\n        });\n    });\n}\n\nfunction continueWithCart(){\n    if(cartCount < 1) return;\n    var feedback = document.getElementById('bpr-cart-feedback');\n    if(feedback) feedback.hidden = true;\n    goToStep(3, true);\n    setCartPanelOpen(true);\n}\n\nfunction showCartFeedback(message){\n    var feedback = document.getElementById('bpr-cart-feedback');\n    var summary = document.getElementById('bpr-step1-cart-summary');\n    if(feedback){\n        feedback.textContent = '\u2713 ' + message + ' Select another facility card below to choose its date and time, or continue with the saved rental.';\n        feedback.hidden = false;\n    }\n    if(summary){\n        summary.classList.remove('bpr-booking-progress--updated');\n        void summary.offsetWidth;\n        summary.classList.add('bpr-booking-progress--updated');\n        try { summary.focus({preventScroll:true}); } catch(e) { summary.focus(); }\n    }\n}\n\nfunction setRentalActionBusy(isBusy, destination){\n    if(!addToCartBtn) return;\n    addToCartBtn.textContent = isBusy && destination === 'another' ? 'Adding Rental\u2026' : 'Add to Booking & Choose Another';\n    addToCartBtn.disabled = isBusy || !availabilityOk;\n    var continueBtn = document.getElementById('bpr-step2-next');\n    if(continueBtn){\n        continueBtn.disabled = isBusy || !availabilityOk;\n        if(isBusy && destination === 'details') continueBtn.textContent = 'Saving Rental\u2026';\n        else updateStep2ActionLabels();\n    }\n}\n\nfunction updateStep2ActionLabels(){\n    var continueBtn = document.getElementById('bpr-step2-next');\n    if(!continueBtn) return;\n    var rentalCount = cartCount + (selectedFacility ? 1 : 0);\n    continueBtn.textContent = rentalCount > 1\n        ? 'Continue with ' + rentalCount + ' Rentals \u2192'\n        : 'Continue with This Rental \u2192';\n}\n\nfunction resetCurrentRental(){\n    availabilityRequestId++;\n    selectedFacility = null;\n    availabilityOk = false;\n    document.querySelectorAll('.bpr-facility-card').forEach(function(card){ card.classList.remove('selected'); card.setAttribute('aria-checked','false'); });\n    document.getElementById('bpr-facility-id').value='';\n    document.getElementById('bpr-start-date').value='';\n    setTimeControlValue('start', '');\n    setTimeControlValue('end', '');\n    document.getElementById('bpr-start-datetime').value='';\n    document.getElementById('bpr-end-datetime').value='';\n    document.getElementById('bpr-step1-actions').style.display='none';\n    document.getElementById('bpr-step1-prompt').style.display='block';\n    document.getElementById('bpr-step2-next').disabled=true;\n    document.getElementById('bpr-add-to-cart-btn').disabled=true;\n    document.getElementById('bpr-availability-result').textContent='';\n    document.getElementById('bpr-fee-preview').style.display='none';\n    calendarCursor = parseLocalDate(minDateValue);\n    renderScheduleCalendar();\n    syncEndTimeOptions(false);\n    updateTimeMinimum();\n    updateScheduleSelection();\n    updateStep2ActionLabels();\n}\n\nfunction refreshCartQuote(){\n    var requestId = ++cartQuoteRequestId;\n    cartQuotePending = true;\n    cartQuoteError = false;\n    return fetch(ajax, {method:'POST', headers:{'Content-Type':'application\/x-www-form-urlencoded'},\n        body:new URLSearchParams({action:'bpr_cart_get', nonce:nonce, booking_session:bookingSession, is_resident:document.getElementById('bpr-is-resident')?.checked?'1':'0', alcohol:document.getElementById('bpr-alcohol')?.checked?'1':'0'})\n    }).then(function(r){return r.json();}).then(function(res){\n        if(requestId !== cartQuoteRequestId) return;\n        if(!res.success) throw new Error((res.data && res.data.message) || 'Could not update rental fees.');\n        cartQuotePending = false;\n        updateCartBar(res.data);\n    }).catch(function(error){\n        if(requestId !== cartQuoteRequestId) return;\n        cartQuotePending = false;\n        cartQuoteError = true;\n        showValidationError(error.message + ' Try again before submitting.', document.getElementById('bpr-cart-bar'));\n    });\n}\n\/\/ Load current rates, including any facility changes made since items were added.\nrefreshCartQuote();\n\n\/\/ \u2500\u2500 Availability check & fee calc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.querySelectorAll('[name^=\"addon_\"]').forEach(function(cb){\n    cb.addEventListener('change', recalcFee);\n});\n\ndocument.getElementById('bpr-is-resident')?.addEventListener('change', function(){\n    recalcFee();\n    refreshCartQuote();\n});\n\nfunction checkAvailabilityAndFee(){\n    var dateField  = document.getElementById('bpr-start-date');\n    var startField = document.getElementById('bpr-start-time');\n    var endField   = document.getElementById('bpr-end-time');\n    var d = dateField.value;\n    var s = startField.value;\n    var e = endField.value;\n    var requestId = ++availabilityRequestId;\n    availabilityOk = false;\n    document.getElementById('bpr-step2-next').disabled = true;\n    document.getElementById('bpr-add-to-cart-btn').disabled = true;\n    document.getElementById('bpr-start-datetime').value = '';\n    document.getElementById('bpr-end-datetime').value = '';\n    updateScheduleSelection();\n    if(!d || !s || !e || !selectedFacility){\n        document.getElementById('bpr-availability-result').textContent = '';\n        document.getElementById('bpr-fee-preview').style.display = 'none';\n        return;\n    }\n    if(d < minDateValue || d > maxDateValue){\n        showAvail('Choose a reservation date within the available range.', false);\n        return;\n    }\n\n    var startDt = d + ' ' + s + ':00';\n    var endDt   = d + ' ' + e + ':00';\n    if(startDt >= endDt){ showAvail('End time must be after start time.', false); return; }\n\n    document.getElementById('bpr-start-datetime').value = startDt;\n    document.getElementById('bpr-end-datetime').value   = endDt;\n\n    showAvail('Checking availability\u2026', null);\n    fetch(ajax, {method:'POST', headers:{'Content-Type':'application\/x-www-form-urlencoded'},\n        body:new URLSearchParams({action:'bpr_check_availability', nonce:nonce, facility_id:selectedFacility.id, start:startDt, end:endDt,\n            is_resident:document.getElementById('bpr-is-resident')?.checked?'1':'0',\n            alcohol:document.getElementById('bpr-alcohol')?.checked?'1':'0',\n            addon_lights:document.getElementById('bpr-addon-lights')?.checked?'1':'0',\n            addon_lined:document.getElementById('bpr-addon-lined')?.checked?'1':'0',\n            addon_clubhouse:document.getElementById('bpr-addon-clubhouse')?.checked?'1':'0'})\n    }).then(function(r){return r.json();}).then(function(res){\n            if(requestId !== availabilityRequestId) return;\n            availabilityOk = !!(res.success && res.data && res.data.available);\n            var message = availabilityOk\n                ? '\u2713 This time is available!'\n                : (res.success ? 'This facility is not available for the selected time.' : ((res.data && res.data.message) || 'Error checking availability.'));\n            showAvail(message, availabilityOk);\n            document.getElementById('bpr-step2-next').disabled = !availabilityOk;\n            document.getElementById('bpr-add-to-cart-btn').disabled = !availabilityOk;\n            if(availabilityOk) renderFeeQuote(res.data);\n            else document.getElementById('bpr-fee-preview').style.display='none';\n        }).catch(function(){\n            if(requestId !== availabilityRequestId) return;\n            availabilityOk = false;\n            showAvail('Could not check availability. Please try again.', false);\n        });\n}\n\nfunction recalcFee(){\n    var proofWrap = document.getElementById('bpr-resident-proof-wrap');\n    if(proofWrap) proofWrap.style.display = document.getElementById('bpr-is-resident')?.checked ? 'block' : 'none';\n    if(selectedFacility) checkAvailabilityAndFee();\n}\n\nfunction renderFeeQuote(quote){\n    var hours = Number(quote.hours);\n    document.getElementById('bpr-fee-hours').textContent = hours.toFixed(2).replace(\/\\.00$\/, '') + ' hrs';\n    document.getElementById('bpr-fee-base').textContent = '$' + Number(quote.subtotal).toFixed(2);\n    document.getElementById('bpr-fee-total').textContent = quote.fee > 0 ? quote.fee_formatted : 'Free';\n    document.getElementById('bpr-fee-calculation').textContent = quote.pricing_summary;\n\n    var discRow = document.getElementById('bpr-resident-row');\n    if(discRow){ discRow.style.display = quote.discount > 0 ? 'flex' : 'none'; }\n    var discEl = document.getElementById('bpr-fee-discount');\n    if(discEl) discEl.textContent = '-$' + Number(quote.discount).toFixed(2);\n\n    document.getElementById('bpr-fee-preview').style.display = 'flex';\n    if(currentStep === 4) buildReviewSummary();\n\n}\n\nfunction showAvail(msg, ok){\n    var el = document.getElementById('bpr-availability-result');\n    el.textContent = msg;\n    el.className = 'bpr-availability-msg ' + (ok===true?'bpr-avail--ok':ok===false?'bpr-avail--taken':'bpr-avail--checking');\n}\n\n\/\/ \u2500\u2500 Secure insurance and identification uploads \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar alcoholCheck = document.getElementById('bpr-alcohol');\nvar alcoholModal = document.getElementById('bpr-alcohol-modal');\nvar outsideVendors = document.getElementById('bpr-outside-vendors');\nvar uploadCount = 0;\n\nfunction setAlcoholModal(open){\n    alcoholModal.hidden = !open;\n    document.body.classList.toggle('bpr-modal-open', open);\n    if(open) document.getElementById('bpr-alcohol-liability').focus();\n}\nfunction clearAlcoholSelection(){\n    if(uploadCount){\n        alcoholCheck.checked = true;\n        document.getElementById('bpr-alcohol-notice').style.display = 'block';\n        showValidationError('Please wait for the document upload to finish before cancelling alcohol.', document.getElementById('bpr-alcohol-liability'), {\n            title: 'Upload in Progress',\n            description: 'The secure upload must finish before this window can close.'\n        });\n        return;\n    }\n    alcoholCheck.checked = false;\n    document.getElementById('bpr-alcohol-notice').style.display = 'none';\n    document.getElementById('alcohol_liability_token').value = '';\n    document.getElementById('bpr-alcohol-liability').value = '';\n    form.querySelector('[data-status-for=\"alcohol_liability\"]').textContent='PDF, JPG, or PNG; maximum 10 MB.';\n    setAlcoholModal(false);\n    recalcFee();\n    refreshCartQuote();\n}\n\nalcoholCheck?.addEventListener('change', function(){\n    document.getElementById('bpr-alcohol-notice').style.display = this.checked ? 'block' : 'none';\n    if(this.checked){ setAlcoholModal(true); recalcFee(); refreshCartQuote(); }\n    else clearAlcoholSelection();\n});\ndocument.getElementById('bpr-open-alcohol-docs')?.addEventListener('click', function(){ setAlcoholModal(true); });\ndocument.getElementById('bpr-cancel-alcohol-docs')?.addEventListener('click', clearAlcoholSelection);\ndocument.getElementById('bpr-save-alcohol-docs')?.addEventListener('click', function(){\n    var liability = document.getElementById('alcohol_liability_token').value;\n    var error = document.getElementById('bpr-alcohol-modal-error');\n    if(uploadCount){ error.textContent='Please wait for the document uploads to finish.'; return; }\n    if(!liability){ error.textContent='Upload the liquor liability certificate to continue.'; return; }\n    error.textContent='';\n    setAlcoholModal(false);\n});\n\noutsideVendors?.addEventListener('change', function(){\n    document.getElementById('bpr-vendor-paperwork').style.display = this.checked ? 'block' : 'none';\n    if(!this.checked){\n        document.querySelectorAll('[name=\"form_data[vendor_types][]\"]').forEach(function(cb){ cb.checked=false; });\n        document.getElementById('vendor_coi_token').value='';\n        document.getElementById('bpr-vendor-coi').value='';\n    }\n});\n\ndocument.querySelectorAll('.bpr-private-upload').forEach(function(input){\n    input.addEventListener('change', function(){\n        if(!input.files || !input.files[0]) return;\n        var fileType = input.dataset.fileType;\n        var status = form.querySelector('[data-status-for=\"'+fileType+'\"]');\n        var tokenField = document.getElementById(input.dataset.tokenField);\n        var payload = new FormData();\n        payload.append('action','bpr_upload_pending_paperwork');\n        payload.append('nonce',nonce);\n        payload.append('paperwork_session',form.querySelector('[name=\"paperwork_session\"]').value);\n        payload.append('file_type',fileType);\n        payload.append('file',input.files[0]);\n        uploadCount++;\n        input.dataset.uploading='1'; input.disabled=true;\n        status.textContent='Uploading securely\u2026'; status.className='bpr-upload-status bpr-upload-status--working';\n        fetch(ajax,{method:'POST',body:payload}).then(function(r){return r.json();}).then(function(res){\n            if(!res.success) throw new Error((res.data&&res.data.message)||'The document could not be uploaded.');\n            tokenField.value=res.data.file_token;\n            status.textContent='\u2713 '+res.data.file_name+' uploaded securely.'; status.className='bpr-upload-status bpr-upload-status--success';\n        }).catch(function(error){\n            tokenField.value=''; input.value='';\n            status.textContent=error.message; status.className='bpr-upload-status bpr-upload-status--error';\n        }).finally(function(){ uploadCount--; input.dataset.uploading='0'; input.disabled=false; });\n    });\n});\n\n\/\/ \u2500\u2500 Step navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.querySelectorAll('.bpr-next-step').forEach(function(btn){\n    btn.addEventListener('click', function(){ goToStep(currentStep + 1); });\n});\ndocument.querySelectorAll('.bpr-prev-step').forEach(function(btn){\n    btn.addEventListener('click', function(){\n        if(currentStep === 3 && cartCount > 0 && !selectedFacility){\n            goToStep(1, true);\n            return;\n        }\n        goToStep(currentStep - 1);\n    });\n});\n\nfunction goToStep(n, skipCurrentValidation){\n    if(n < 1 || n > 5) return;\n    if(n > currentStep && !skipCurrentValidation && !validateReservationStep(currentStep)) return;\n    document.querySelectorAll('.bpr-form-step').forEach(function(s){ s.style.display='none'; s.classList.remove('active'); });\n    document.querySelector('.bpr-form-step[data-step=\"'+n+'\"]').style.display='block';\n    document.querySelector('.bpr-form-step[data-step=\"'+n+'\"]').classList.add('active');\n    document.querySelectorAll('.bpr-step').forEach(function(s){\n        var sn = parseInt(s.dataset.step);\n        s.classList.toggle('active', sn===n);\n        s.classList.toggle('completed', sn<n);\n    });\n    currentStep = n;\n    if(n===4){ buildReviewSummary(); refreshCartQuote(); }\n    window.scrollTo({top: form.getBoundingClientRect().top + window.scrollY - 80, behavior:'smooth'});\n}\n\nfunction getFieldLabel(field){\n    var label = field && field.id ? form.querySelector('label[for=\"'+field.id+'\"]') : null;\n    if(!label && field && field.closest) label = field.closest('label');\n    return label ? label.textContent.replace(\/\\s*\\*\\s*$\/, '').trim() : 'Required field';\n}\n\nfunction markInvalidField(field){\n    if(!field) return;\n    field.classList.add('bpr-error');\n    field.setAttribute('aria-invalid','true');\n}\n\nfunction focusInvalidField(field){\n    if(!field) return;\n    markInvalidField(field);\n    var focusTarget = field;\n    if(field.classList.contains('bpr-time-fieldset')){\n        focusTarget = field.querySelector('select, button') || field;\n    } else if(field.id === 'bpr-facility-grid'){\n        focusTarget = field.querySelector('.bpr-facility-card') || field;\n    } else if(field.classList.contains('bpr-signature-wrap')){\n        focusTarget = field.querySelector('.bpr-signature-pad') || field;\n    }\n    var revealAndFocus = function(){\n        field.scrollIntoView({behavior:'smooth', block:'center'});\n        window.setTimeout(function(){\n            try { focusTarget.focus({preventScroll:true}); } catch(e) { focusTarget.focus(); }\n        }, 250);\n    };\n    var alcoholDialog = field.closest ? field.closest('#bpr-alcohol-modal') : null;\n    if(alcoholDialog && alcoholDialog.hidden){\n        setAlcoholModal(true);\n        window.setTimeout(revealAndFocus, 40);\n    } else {\n        revealAndFocus();\n    }\n}\n\nfunction closeValidationModal(issueIndex){\n    if(!validationModal || validationModal.hidden) return;\n    validationModal.hidden = true;\n    document.body.classList.remove('bpr-validation-open');\n    var issue = Number.isInteger(issueIndex) ? validationIssues[issueIndex] : null;\n    var returnTarget = validationReturnFocus;\n    validationIssues = [];\n    validationReturnFocus = null;\n    if(issue && issue.field){\n        focusInvalidField(issue.field);\n    } else if(returnTarget && document.contains(returnTarget)){\n        try { returnTarget.focus({preventScroll:true}); } catch(e) { returnTarget.focus(); }\n    }\n}\n\nfunction showValidationIssues(issues, options){\n    options = options || {};\n    validationIssues = (issues || []).filter(function(issue){ return issue && issue.message; });\n    if(!validationIssues.length) return false;\n    validationIssues.forEach(function(issue){ markInvalidField(issue.field); });\n    validationReturnFocus = document.activeElement;\n\n    var title = document.getElementById('bpr-validation-title');\n    var description = document.getElementById('bpr-validation-description');\n    var list = document.getElementById('bpr-validation-list');\n    title.textContent = options.title || 'Before You Continue';\n    description.textContent = options.description || (validationIssues.length === 1\n        ? 'One required item needs your attention.'\n        : 'Please complete these ' + validationIssues.length + ' required items.');\n    list.innerHTML = validationIssues.map(function(issue, index){\n        var message = '<span class=\"bpr-validation-list__mark\" aria-hidden=\"true\">!<\/span>' +\n            '<span class=\"bpr-validation-list__message\">' + escHtml(issue.message) + '<\/span>';\n        if(issue.field){\n            return '<li><button type=\"button\" data-validation-index=\"' + index + '\">' + message +\n                '<span class=\"bpr-validation-list__action\">Go to field \u2192<\/span><\/button><\/li>';\n        }\n        return '<li><div class=\"bpr-validation-list__item\">' + message + '<\/div><\/li>';\n    }).join('');\n\n    validationModal.hidden = false;\n    document.body.classList.add('bpr-validation-open');\n    window.setTimeout(function(){ title.focus(); }, 0);\n    return false;\n}\n\nfunction showValidationError(message, field, options){\n    return showValidationIssues([{message:message, field:field || null}], options);\n}\n\ndocument.getElementById('bpr-validation-list')?.addEventListener('click', function(event){\n    var button = event.target.closest ? event.target.closest('[data-validation-index]') : null;\n    if(button) closeValidationModal(parseInt(button.dataset.validationIndex, 10));\n});\ndocument.getElementById('bpr-validation-fix-first')?.addEventListener('click', function(){ closeValidationModal(0); });\ndocument.getElementById('bpr-validation-close')?.addEventListener('click', function(){ closeValidationModal(); });\nvalidationModal?.addEventListener('click', function(event){\n    if(event.target === validationModal) closeValidationModal();\n});\nvalidationModal?.addEventListener('keydown', function(event){\n    if(event.key === 'Escape'){\n        event.preventDefault();\n        closeValidationModal();\n        return;\n    }\n    if(event.key !== 'Tab') return;\n    var focusable = Array.from(validationModal.querySelectorAll('button:not([disabled])'));\n    if(!focusable.length) return;\n    var first = focusable[0];\n    var last = focusable[focusable.length - 1];\n    var title = document.getElementById('bpr-validation-title');\n    if(event.shiftKey && (document.activeElement === first || document.activeElement === title)){ event.preventDefault(); last.focus(); }\n    else if(!event.shiftKey && document.activeElement === last){ event.preventDefault(); first.focus(); }\n});\n\nfunction addValidationIssue(issues, message, field){\n    var duplicate = issues.some(function(issue){ return field && issue.field === field; });\n    if(!duplicate) issues.push({message:message, field:field || null});\n}\n\nfunction validateReservationStep(step){\n    if(step >= 3 && (cartQuotePending || cartQuoteError)){\n        if(cartQuoteError) refreshCartQuote();\n        return showValidationError('Rental fees are being refreshed. Please try again in a moment.', document.getElementById('bpr-cart-bar'));\n    }\n    if(step >= 3 && selectedFacility && !availabilityOk){\n        return showValidationError('Please wait for the current rental fee and availability to be confirmed before continuing.', document.getElementById('bpr-fee-preview'));\n    }\n    if(step===1 && !selectedFacility){\n        return showValidationError('Select a facility for your reservation.', document.getElementById('bpr-facility-grid'));\n    }\n\n    if(step===2){\n        var dateField  = document.getElementById('bpr-start-date');\n        var datePicker = document.getElementById('bpr-date-picker');\n        var startField = document.getElementById('bpr-start-time');\n        var endField   = document.getElementById('bpr-end-time');\n        var startControl = document.getElementById('bpr-start-time-control');\n        var endControl   = document.getElementById('bpr-end-time-control');\n        if(!dateField.value) return showValidationError('Please select a reservation date from the calendar.', datePicker);\n        if(dateField.value < minDateValue || dateField.value > maxDateValue){\n            return showValidationError('Please select a reservation date within the allowed date range.', datePicker);\n        }\n        if(!startField.value) return showValidationError('Please select a start time.', startControl);\n        if(!endField.value)   return showValidationError('Please select an end time.', endControl);\n        if(startField.value >= endField.value) return showValidationError('The end time must be after the start time.', endControl);\n        if(!availabilityOk) return showValidationError('Please choose an available reservation date and time before continuing.', datePicker);\n    }\n\n    if(step===3){\n        var issues = [];\n        var requiredFields = Array.from(form.querySelectorAll('[data-step=\"3\"] [required]'));\n        var missingFields = requiredFields.filter(function(field){ return !String(field.value || '').trim(); });\n        requiredFields.forEach(function(field){\n            var isMissing = missingFields.indexOf(field) !== -1;\n            field.classList.toggle('bpr-error', isMissing);\n            if(isMissing) field.setAttribute('aria-invalid','true');\n            else field.removeAttribute('aria-invalid');\n        });\n        missingFields.forEach(function(field){ addValidationIssue(issues, getFieldLabel(field), field); });\n\n        requiredFields.filter(function(field){\n            return missingFields.indexOf(field) === -1 && !field.checkValidity();\n        }).forEach(function(field){\n            var invalidMessage = field.type === 'email'\n                ? 'Enter a valid email address.'\n                : 'Enter a valid value for ' + getFieldLabel(field) + '.';\n            addValidationIssue(issues, invalidMessage, field);\n        });\n\n        if(uploadCount){\n            addValidationIssue(issues, 'Wait for the secure document upload to finish.', document.querySelector('.bpr-private-upload[data-uploading=\"1\"]'));\n        }\n        if(!document.getElementById('driver_license_token').value){\n            addValidationIssue(issues, \"Upload the renter's driver's license or state ID photo.\", document.getElementById('bpr-driver-license-copy'));\n        }\n        if(alcoholCheck.checked && !document.getElementById('alcohol_liability_token').value){\n            addValidationIssue(issues, 'Upload the liquor liability certificate of insurance.', document.getElementById('bpr-alcohol-liability'));\n        }\n        if(outsideVendors.checked && !form.querySelector('[name=\"form_data[vendor_types][]\"]:checked')){\n            addValidationIssue(issues, 'Select at least one outside vendor type.', form.querySelector('[name=\"form_data[vendor_types][]\"]'));\n        }\n        if(issues.length){\n            return showValidationIssues(issues, {\n                title: 'Before You Continue',\n                description: issues.length === 1\n                    ? 'Please complete this required item before reviewing your reservation.'\n                    : 'Please complete these ' + issues.length + ' required items before reviewing your reservation.'\n            });\n        }\n    }\n\n    return true;\n}\n\nfunction clearFieldValidationState(e){\n    if(e.target && e.target.classList && e.target.classList.contains('bpr-error')){\n        e.target.classList.remove('bpr-error');\n        e.target.removeAttribute('aria-invalid');\n    }\n}\nform.addEventListener('input', clearFieldValidationState);\nform.addEventListener('change', clearFieldValidationState);\n\nfunction buildReviewSummary(){\n    var d  = document.getElementById('bpr-start-datetime').value;\n    var e  = document.getElementById('bpr-end-datetime').value;\n    var fn = document.getElementById('bpr-first-name').value;\n    var ln = document.getElementById('bpr-last-name').value;\n    var em = document.getElementById('bpr-email').value;\n    var ph = document.getElementById('bpr-phone').value;\n    var ev = document.getElementById('bpr-event-name').value;\n    var g  = document.getElementById('bpr-guests').value;\n    var currentTotalText = document.getElementById('bpr-fee-total')?.textContent || '';\n    var currentTotal = selectedFacility ? (parseFloat(currentTotalText.replace(\/[^0-9.-]\/g,'')) || 0) : 0;\n    var combinedTotal = currentTotal + cartTotal;\n    var onlyCartItem = !selectedFacility && cartCount === 1 ? cartItems[0] : null;\n    var facilityLabel = selectedFacility\n        ? selectedFacility.name\n        : (onlyCartItem ? onlyCartItem.facility_name : (cartCount > 1 ? cartCount + ' rentals in booking' : '\u2014'));\n    var dateLabel = selectedFacility\n        ? formatDt(d)\n        : (onlyCartItem ? formatDt(onlyCartItem.start_datetime) : (cartCount > 1 ? 'See rentals below' : '\u2014'));\n    var timeLabel = selectedFacility\n        ? formatTime(d)+' \u2013 '+formatTime(e)\n        : (onlyCartItem ? formatTime(onlyCartItem.start_datetime)+' \u2013 '+formatTime(onlyCartItem.end_datetime) : (cartCount > 1 ? 'See rentals below' : '\u2014'));\n    document.getElementById('bpr-review-summary').innerHTML =\n        '<div class=\"bpr-review-row\"><span>Facility<\/span><strong>'+escHtml(facilityLabel)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Date<\/span><strong>'+escHtml(dateLabel)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Time<\/span><strong>'+escHtml(timeLabel)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Renter<\/span><strong>'+escHtml(fn+' '+ln)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Email<\/span><strong>'+escHtml(em)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Phone<\/span><strong>'+escHtml(ph)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Event<\/span><strong>'+escHtml(ev)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Guests<\/span><strong>'+escHtml(g)+'<\/strong><\/div>'+\n        '<div class=\"bpr-review-row\"><span>Alcohol<\/span><strong>'+(alcoholCheck.checked?'Yes':'No')+'<\/strong><\/div>'+\n        (selectedFacility?'<div class=\"bpr-review-row\"><span>Rental fees<\/span><strong>'+escHtml(document.getElementById('bpr-fee-calculation').textContent)+'<\/strong><\/div>':'')+\n        '<div class=\"bpr-review-row bpr-review-row--total\"><span>Est. Total<\/span><strong>$'+combinedTotal.toFixed(2)+'<\/strong><\/div>';\n    initSig();\n}\n\nfunction formatDt(dt){ if(!dt) return '\u2014'; var d=new Date(dt.replace(' ','T')); return d.toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'}); }\nfunction formatTime(dt){ if(!dt) return '\u2014'; var d=new Date(dt.replace(' ','T')); return d.toLocaleTimeString('en-US',{hour:'numeric',minute:'2-digit'}); }\n\n\/\/ \u2500\u2500 Signature pad \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction initSig(){\n    sigCanvas = document.getElementById('bpr-sig-canvas');\n    if(!sigCanvas || sigCanvas._initialized) return;\n    sigCanvas._initialized = true;\n    var ratio=Math.max(window.devicePixelRatio||1,1);\n    var rect=sigCanvas.getBoundingClientRect();\n    sigCanvas.width  = Math.max(1,Math.round((rect.width||400)*ratio));\n    sigCanvas.height = Math.round(150*ratio);\n    sigCtx = sigCanvas.getContext('2d');\n    sigCtx.setTransform(ratio,0,0,ratio,0,0);\n    sigCtx.strokeStyle = '#000'; sigCtx.lineWidth = 2; sigCtx.lineCap = 'round';\n\n    function getPos(ev){ var r=sigCanvas.getBoundingClientRect(); return {x:ev.clientX-r.left,y:ev.clientY-r.top}; }\n    function saveSignature(){\n        if(!sigHasData) return;\n        document.getElementById('bpr-signature').value=sigCanvas.toDataURL('image\/png');\n    }\n    function startSignature(e){\n        e.preventDefault();\n        var signatureWrap = sigCanvas.closest('.bpr-signature-wrap');\n        if(signatureWrap){ signatureWrap.classList.remove('bpr-error'); signatureWrap.removeAttribute('aria-invalid'); }\n        sigDrawing=true; sigPointerId=e.pointerId;\n        if(sigCanvas.setPointerCapture) sigCanvas.setPointerCapture(e.pointerId);\n        var p=getPos(e);\n        sigCtx.beginPath(); sigCtx.moveTo(p.x,p.y); sigCtx.lineTo(p.x+.01,p.y+.01); sigCtx.stroke();\n        sigHasData=true;\n    }\n    function moveSignature(e){\n        if(!sigDrawing||e.pointerId!==sigPointerId) return;\n        e.preventDefault();\n        var p=getPos(e); sigCtx.lineTo(p.x,p.y); sigCtx.stroke(); sigHasData=true;\n    }\n    function finishSignature(e){\n        if(!sigDrawing||(e&&e.pointerId!=null&&sigPointerId!=null&&e.pointerId!==sigPointerId)) return;\n        sigDrawing=false;\n        if(e&&sigCanvas.releasePointerCapture&&sigCanvas.hasPointerCapture&&sigCanvas.hasPointerCapture(e.pointerId)){\n            try{sigCanvas.releasePointerCapture(e.pointerId);}catch(ignore){}\n        }\n        sigPointerId=null; saveSignature();\n    }\n    sigCanvas.addEventListener('pointerdown',startSignature);\n    sigCanvas.addEventListener('pointermove',moveSignature);\n    sigCanvas.addEventListener('pointerup',finishSignature);\n    sigCanvas.addEventListener('pointercancel',finishSignature);\n    sigCanvas.addEventListener('lostpointercapture',finishSignature);\n    window.addEventListener('pointerup',finishSignature);\n    document.getElementById('bpr-sig-clear').addEventListener('click', function(){\n        sigDrawing=false; sigPointerId=null;\n        sigCtx.save(); sigCtx.setTransform(1,0,0,1,0,0); sigCtx.clearRect(0,0,sigCanvas.width,sigCanvas.height); sigCtx.restore();\n        sigHasData=false; document.getElementById('bpr-signature').value='';\n    });\n\n    \/\/ Store a complete image even if submission occurs immediately after the\n    \/\/ final stroke or the pointer is released just outside the canvas.\n    sigCanvas._saveSignature=saveSignature;\n}\n\n\/\/ \u2500\u2500 Form submission \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nform.addEventListener('submit', function(e){\n    e.preventDefault();\n    if(!validateReservationStep(4)) return;\n    var submitIssues = [];\n    var agreementField = document.querySelector('[name=\"form_data[rental_agreement]\"]');\n    if(!agreementField.checked){\n        addValidationIssue(submitIssues, 'Agree to the Rental Agreement.', agreementField);\n    }\n    if(sigCanvas&&sigCanvas._saveSignature) sigCanvas._saveSignature();\n    if(!sigHasData||!document.getElementById('bpr-signature').value){\n        addValidationIssue(submitIssues, 'Provide the renter signature.', document.querySelector('.bpr-signature-wrap'));\n    }\n    if(submitIssues.length){\n        showValidationIssues(submitIssues, {\n            title: 'Before You Submit',\n            description: submitIssues.length === 1\n                ? 'Please complete this final required item.'\n                : 'Please complete these final required items.'\n        });\n        return;\n    }\n\n    var btn = document.getElementById('bpr-submit-btn');\n    btn.disabled = true; btn.textContent = 'Submitting\u2026';\n\n    var data = new FormData(form);\n    data.set('nonce', nonce);\n    \/\/ Also submit cart items\n    fetch(ajax, { method:'POST', body: data })\n        .then(function(r){ return r.json(); })\n        .then(function(res){\n            btn.disabled=false; btn.textContent='Submit Reservation';\n            if(res.success){\n                var d = res.data;\n                var nums = Array.isArray(d.reservation_nums) ? d.reservation_nums : [d.reservation_num];\n                var html = '<p>' + escHtml(d.message || 'Your reservation has been submitted!') + '<\/p>';\n                html += '<div class=\"bpr-confirmation-nums\">' + nums.map(function(n){ return '<div class=\"bpr-confirmation-num\">Res #: <strong>'+escHtml(n)+'<\/strong><\/div>'; }).join('') + '<\/div>';\n                html += '<p>A confirmation email has been sent to your email address.<\/p>';\n                if(d.paperwork_url) html += '<p><a class=\"bpr-btn bpr-btn-secondary\" href=\"'+escHtml(d.paperwork_url)+'\">Manage Reservation Paperwork<\/a><\/p>';\n                if(Array.isArray(d.payment_urls) && d.payment_urls.length > 1){\n                    html += '<div class=\"bpr-payment-links\"><p><strong>Payment links for this booking:<\/strong><\/p>' +\n                        d.payment_urls.map(function(payment){ return '<p><a class=\"bpr-btn bpr-btn-primary\" href=\"'+escHtml(payment.url)+'\">Pay '+escHtml(payment.reservation_num)+'<\/a><\/p>'; }).join('') + '<\/div>';\n                }\n                document.getElementById('bpr-confirmation-details').innerHTML = html;\n                                goToStep(5);\n                updateCartBar({cart:[],total:0});\n            } else {\n                var msg = document.getElementById('bpr-submit-msg');\n                msg.textContent = res.data.message || 'Submission failed. Please try again.';\n                msg.className = 'bpr-form-message bpr-form-message--error';\n            }\n        }).catch(function(){\n            btn.disabled=false; btn.textContent='Submit Reservation';\n            document.getElementById('bpr-submit-msg').textContent='Network error. Please try again.';\n        });\n});\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/pages\/10","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/comments?post=10"}],"version-history":[{"count":0,"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/pages\/10\/revisions"}],"wp:attachment":[{"href":"https:\/\/bpr.williehowe.com\/index.php\/wp-json\/wp\/v2\/media?parent=10"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}