{"id":13,"date":"2025-08-24T05:45:56","date_gmt":"2025-08-24T05:45:56","guid":{"rendered":"https:\/\/your-testing-site.com\/cheakykea\/?page_id=13"},"modified":"2026-01-09T03:10:09","modified_gmt":"2026-01-09T03:10:09","slug":"home","status":"publish","type":"page","link":"https:\/\/your-testing-site.com\/cheakykea\/","title":{"rendered":"Cheeky Kea Transport, Tours and Travel | New Zealand"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row full_width=&#8221;stretch_row_content&#8221; css=&#8221;.vc_custom_1756106367850{padding-top: 0px !important;padding-right: 15px !important;padding-bottom: 0px !important;padding-left: 15px !important;}&#8221; el_id=&#8221;ck-hero&#8221;][vc_column]\t\t\t<rs-module-wrap id=\"rev_slider_error_1_wrapper\">\n\t\t\t\t<rs-module id=\"rev_slider_error_1\">\n\t\t\t\t\t<div class=\"rs_error_message_box\">\n\t\t\t\t\t\t<div class=\"rs_error_message_oops\">There is nothing to show here!<\/div>\n\t\t\t\t\t\t<div class=\"rs_error_message_content\">Slider with alias slider-1 not found.<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/rs-module>\n\t\t\t<\/rs-module-wrap>\n\t\t\t<script>\n\t\t\t\tvar rs_eslider = document.getElementById(\"rev_slider_error_1\");\n\t\t\t\trs_eslider.style.display = \"none\";\n\t\t\t\tconsole.log(\"Slider with alias slider-1 not found.\");\n\t\t\t<\/script>\n[vc_raw_html css=&#8221;&#8221;]JTNDZGl2JTIwY2xhc3MlM0QlMjJjay1yZXYtY291bnRlciUyMiUzRSUzQyUyRmRpdiUzRQ==[\/vc_raw_html][\/vc_column][\/vc_row][vc_row full_width=&#8221;stretch_row_content_no_spaces&#8221; full_height=&#8221;yes&#8221; equal_height=&#8221;yes&#8221; css=&#8221;.vc_custom_1766520103742{margin-top: 50px !important;}&#8221;][vc_column el_id=&#8221;get-your-quote&#8221;][vc_column_text css=&#8221;&#8221;]\n<section id=\"custom-mainform\">\n    <div class=\"custom-container\">\n        <div class=\"formcontentdiv\">\n            <h3>Get Your Quote<\/h3>\n            <h2>We Want To Know What You Need So We Can Organise It For You!<br>Please Give Us As Many Details As You Can.<\/h2>\n            <p class=\"newemailisd\"><strong>Email: <a href=\"mailto:transport@cheekykeatravel.com\">transport@cheekykeatravel.com<\/a><\/strong><\/p>\n            <p class=\"newemailisd\"><strong>Phone: <a href=\"tel:0800259532\">0800 259 532<\/a><\/strong><\/p>\n            <div class=\"trusttext\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/12\/five-starts.webp\"> Trusted by 1000's<\/div>\n        <\/div>\n\n        <div class=\"mapdiv\" id=\"mapContainer\" style=\"display:none;\">\n            <div id=\"routeMap\"><\/div>\n        <\/div>\n\n        <div class=\"formdiv\" id=\"quote\">\n            <h2>Get An Instant Online Quote<\/h2>\n            <div class=\"custom-tabs\">\n                <div class=\"tab-btn active\" data-tab=\"oneway\">Single Trip<\/div>\n                <div class=\"tab-btn\" data-tab=\"twoway\">Return<\/div>\n                <div class=\"tab-btn\" data-tab=\"multiday\">Multiday<\/div>\n            <\/div>\n\n            <!-- FIX #1: Google API Error Container -->\n            <div id=\"google-api-error\" style=\"display:none; background:#fff3cd; color:#856404; padding:12px; border-radius:6px; margin-bottom:15px; border:1px solid #ffeeba; font-weight:500;\"><\/div>\n\n            <!-- ===== SINGLE TRIP TAB ===== -->\n            <div id=\"oneway\" class=\"tab-content show\">\n                <form class=\"oneway-form\" id=\"onewayForm\">\n\n                    <!-- Step 1 -->\n                    <div id=\"step1\">\n                        <div class=\"field\">\n                            <label>Closest Depot<\/label>\n                            <select name=\"depot\">\n                                <option value=\"\">Select Depot<\/option>\n                                <option value=\"Auckland\">Auckland<\/option>\n                                <option value=\"Queenstown\">Queenstown<\/option>\n                                <option value=\"Christchurch\">Christchurch<\/option>\n                            <\/select>\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"field\">\n                            <label>Vehicle Type<\/label>\n                            <select name=\"vehicle\">\n                                <option value=\"\">Select Vehicle<\/option>\n                                <option value=\"SUV \/ Minivan (6 Seats)\">SUV \/ Minivan \u2013 6 Seats<\/option>\n                                <option value=\"Small Van (12 Seats)\">Small Van \u2013 12 Seats<\/option>\n                                <option value=\"Large Van (15-19 Seats)\">Large Van \u2013 15\u201319 Seats<\/option>\n                                <option value=\"Minibus (23-25 Seats)\">Minibus \u2013 23\u201325 Seats<\/option>\n                                <option value=\"Coach (35-41 Seats)\">Coach \u2013 35\u201341 Seats<\/option>\n                                <option value=\"Coach (45-51 Seats)\">Coach \u2013 45\u201351 Seats<\/option>\n                                <option value=\"City Bus (40 Seats)\">City Bus \u2013 40 Seats<\/option>\n                                <option value=\"City Bus (50 Seats)\">City Bus \u2013 50 Seats<\/option>\n                            <\/select>\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"dflexform\">\n                            <div class=\"field\">\n                                <label>Pickup Date<\/label>\n                                <input type=\"date\" name=\"pickup_date\">\n                                <div class=\"error-msg\"><\/div>\n                            <\/div>\n                            <div class=\"field\">\n                                <label>Pickup Time<\/label>\n                                <input type=\"time\" name=\"pickup_time\">\n                                <div class=\"error-msg\"><\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"pickuplocationdiv\" style=\"position:relative;\">\n                            <label>Pickup Location<\/label>\n                            <input type=\"text\" name=\"pickup\" placeholder=\"Enter Pickup Location\" id=\"oneway-pickup\" autocomplete=\"off\">\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <!-- STOPS SECTION -->\n                        <div class=\"stops-section\" id=\"oneway-stops-section\">\n                            <div class=\"stops-list\" id=\"oneway-stops-list\"><\/div>\n                            <button type=\"button\" class=\"add-stop-btn\" id=\"oneway-add-stop\">+ Add Stop<\/button>\n                        <\/div>\n\n                        <div class=\"destinationlocationdiv\" style=\"position:relative;\">\n                            <label>Destination Location<\/label>\n                            <input type=\"text\" name=\"destination\" placeholder=\"Enter Destination Location\" id=\"oneway-destination\" autocomplete=\"off\">\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <label style=\"margin-bottom:20px;\">\n                            <input type=\"checkbox\" name=\"trailer\"> Trailer Required\n                        <\/label>\n\n                        <button type=\"button\" class=\"quote-btn\" id=\"nextBtn\">Next<\/button>\n                    <\/div>\n\n                    <!-- Step 2 -->\n                    <div id=\"step2\" style=\"display:none;\">\n                        <button type=\"button\" class=\"back-btn\" id=\"backBtn1\">\u2190 Back<\/button>\n                        <h3>Trip Information<\/h3>\n                        <div class=\"trip-box\">\n                            <p><strong>Closest Depot:<\/strong> <span id=\"sumDepot\"><\/span><\/p>\n                            <p><strong>Vehicle Type:<\/strong> <span id=\"sumVehicle\"><\/span><\/p>\n                            <p><strong>Pickup Location:<\/strong> <span id=\"sumPickup\"><\/span><\/p>\n                            <div id=\"sumStopsBox\" style=\"display:none;\">\n                                <p><strong>Stops:<\/strong><\/p>\n                                <div id=\"sumStopsList\"><\/div>\n                            <\/div>\n                            <p><strong>Destination Location:<\/strong> <span id=\"sumDestination\"><\/span><\/p>\n                            <p><strong>Pickup Date & Time:<\/strong> <span id=\"sumDate\"><\/span><\/p>\n                            <p><strong>Trailer:<\/strong> <span id=\"sumTrailer\"><\/span><\/p>\n                            <p><strong>KMS:<\/strong> <span id=\"sumKilometer\"><\/span><\/p>\n                            <p><strong>Average Time:<\/strong><span id=\"averageTime\"><\/span><\/p>\n                            <p><strong>Total Quote:<\/strong> <span id=\"totalQuote\"><\/span><\/p>\n                        <\/div>\n                        <button type=\"button\" class=\"quote-btn\" id=\"goStep3\">Submit Quotation To Us!<\/button>\n                    <\/div>\n\n                    <!-- Step 3 -->\n                    <div id=\"step3\" style=\"display:none;\">\n                        <label>Contact Name<\/label>\n                        <input type=\"text\" name=\"name\" placeholder=\"Your Name\">\n                        <div class=\"error-msg\"><\/div>\n\n                        <label>Contact Email<\/label>\n                        <input type=\"email\" name=\"email\" placeholder=\"Your Email\">\n                        <div class=\"error-msg\"><\/div>\n\n                        <label>Contact Mobile Number<\/label>\n                        <input type=\"tel\" name=\"mobile\" placeholder=\"Your Mobile Number\">\n                        <div class=\"error-msg\"><\/div>\n\n                        <label>Special Requests & Further Information<\/label>\n                        <textarea name=\"info\" rows=\"4\" placeholder=\"Write here...\"><\/textarea>\n\n                        <label>Additional Notes<\/label>\n                        <textarea name=\"notes\" rows=\"3\" placeholder=\"Any additional notes...\"><\/textarea>\n\n                        <button type=\"submit\" class=\"quote-btn\" name=\"calculate\">Get Quote<\/button>\n                    <\/div>\n\n                <\/form>\n            <\/div>\n\n            <!-- ===== RETURN TAB ===== -->\n            <div id=\"twoway\" class=\"tab-content\">\n                <form class=\"twoway-form\" id=\"twowayForm\">\n\n                    <!-- Step 1 -->\n                    <div id=\"step1form2\">\n                        <div class=\"field\">\n                            <label>Closest Depot<\/label>\n                            <select name=\"depot\">\n                                <option value=\"\">Select Depot<\/option>\n                                <option value=\"Auckland\">Auckland<\/option>\n                                <option value=\"Queenstown\">Queenstown<\/option>\n                                <option value=\"Christchurch\">Christchurch<\/option>\n                            <\/select>\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"field\">\n                            <label>Vehicle Type<\/label>\n                            <select name=\"vehicle\">\n                                <option value=\"\">Select Vehicle<\/option>\n                                <option value=\"SUV \/ Minivan (6 Seats)\">SUV \/ Minivan \u2013 6 Seats<\/option>\n                                <option value=\"Small Van (12 Seats)\">Small Van \u2013 12 Seats<\/option>\n                                <option value=\"Large Van (15-19 Seats)\">Large Van \u2013 15\u201319 Seats<\/option>\n                                <option value=\"Minibus (23-25 Seats)\">Minibus \u2013 23\u201325 Seats<\/option>\n                                <option value=\"Coach (35-41 Seats)\">Coach \u2013 35\u201341 Seats<\/option>\n                                <option value=\"Coach (45-51 Seats)\">Coach \u2013 45\u201351 Seats<\/option>\n                                <option value=\"City Bus (40 Seats)\">City Bus \u2013 40 Seats<\/option>\n                                <option value=\"City Bus (50 Seats)\">City Bus \u2013 50 Seats<\/option>\n                            <\/select>\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"dflexform\">\n                            <div class=\"field\">\n                                <label>Pickup Date<\/label>\n                                <input type=\"date\" name=\"pickup_date\">\n                                <div class=\"error-msg\"><\/div>\n                            <\/div>\n                            <div class=\"field\">\n                                <label>Pickup Time<\/label>\n                                <input type=\"time\" name=\"pickup_time\">\n                                <div class=\"error-msg\"><\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"pickuplocationdiv\" style=\"position:relative;\">\n                            <label>Pickup Location<\/label>\n                            <input type=\"text\" name=\"pickup\" placeholder=\"Enter Pickup Location\" id=\"twoway-pickup\" autocomplete=\"off\">\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <!-- STOPS SECTION -->\n                        <div class=\"stops-section\" id=\"twoway-stops-section\">\n                            <div class=\"stops-list\" id=\"twoway-stops-list\"><\/div>\n                            <button type=\"button\" class=\"add-stop-btn\" id=\"twoway-add-stop\">+ Add Stop<\/button>\n                        <\/div>\n\n                        <div class=\"destinationlocationdiv\" style=\"position:relative;\">\n                            <label>Destination Location<\/label>\n                            <input type=\"text\" name=\"destination\" placeholder=\"Enter Destination Location\" id=\"twoway-destination\" autocomplete=\"off\">\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"dflexform\">\n                            <div class=\"field\">\n                                <label>Return Date<\/label>\n                                <input type=\"date\" name=\"return_date\">\n                                <div class=\"error-msg\"><\/div>\n                            <\/div>\n                            <div class=\"field\">\n                                <label>Departure Time from Destination<\/label>\n                                <input type=\"time\" name=\"return_time\">\n                                <div class=\"error-msg\"><\/div>\n                            <\/div>\n                        <\/div>\n\n                        <label style=\"margin-bottom:10px;\">\n                            <input type=\"checkbox\" name=\"trailer\"> Trailer Required\n                        <\/label>\n\n                        <button type=\"button\" class=\"quote-btn\" id=\"nextBtn2\">Next<\/button>\n                    <\/div>\n\n                    <!-- Step 2 -->\n                    <div id=\"step2form2\" style=\"display:none;\">\n                        <button type=\"button\" class=\"back-btn\" id=\"backBtn2\">\u2190 Back<\/button>\n                        <h3>Trip Information<\/h3>\n                        <div class=\"trip-box\">\n                            <p><strong>Closest Depot:<\/strong> <span id=\"sumDepot2\"><\/span><\/p>\n                            <p><strong>Vehicle Type:<\/strong> <span id=\"sumVehicle2\"><\/span><\/p>\n                            <p><strong>Pickup Location:<\/strong> <span id=\"sumPickup2\"><\/span><\/p>\n                            <div id=\"sumStopsBox2\" style=\"display:none;\">\n                                <p><strong>Stops:<\/strong><\/p>\n                                <div id=\"sumStopsList2\"><\/div>\n                            <\/div>\n                            <p><strong>Destination Location:<\/strong> <span id=\"sumDestination2\"><\/span><\/p>\n                            <p><strong>Pickup Date & Time:<\/strong> <span id=\"sumDate2\"><\/span><\/p>\n                            <p><strong>Departure from Destination:<\/strong> <span id=\"returnDate2\"><\/span><\/p>\n                            <p><strong>Trailer:<\/strong> <span id=\"sumTrailer2\"><\/span><\/p>\n                            <p><strong>KMS:<\/strong> <span id=\"sumKilometer2\"><\/span><\/p>\n                            <p><strong>Average Time:<\/strong><span id=\"averageTime2\"><\/span><\/p>\n                            <p><strong>Total Quote:<\/strong> <span id=\"totalQuote2\"><\/span><\/p>\n                        <\/div>\n                        <button type=\"button\" class=\"quote-btn2\" id=\"goStep3form2\">Submit Quotation To Us!<\/button>\n                    <\/div>\n\n                    <!-- Step 3 -->\n                    <div id=\"step3form2\" style=\"display:none;\">\n                        <label>Contact Name<\/label>\n                        <input type=\"text\" name=\"name\" placeholder=\"Your Name\">\n                        <div class=\"error-msg\"><\/div>\n\n                        <label>Contact Email<\/label>\n                        <input type=\"email\" name=\"email\" placeholder=\"Your Email\">\n                        <div class=\"error-msg\"><\/div>\n\n                        <label>Contact Mobile Number<\/label>\n                        <input type=\"tel\" name=\"mobile\" placeholder=\"Your Mobile Number\">\n                        <div class=\"error-msg\"><\/div>\n\n                        <label>Special Requests & Further Information<\/label>\n                        <textarea name=\"info\" rows=\"4\" placeholder=\"Write here...\"><\/textarea>\n\n                        <label>Additional Notes<\/label>\n                        <textarea name=\"notes\" rows=\"3\" placeholder=\"Any additional notes...\"><\/textarea>\n\n                        <button type=\"submit\" class=\"quote-btn2\" name=\"calculate\">Get Quote<\/button>\n                    <\/div>\n\n                <\/form>\n            <\/div>\n\n            <!-- ===== MULTIDAY TAB ===== -->\n            <div id=\"multiday\" class=\"tab-content\">\n                <form id=\"multidayForm\" class=\"multidayform\" method=\"POST\">\n                    <div id=\"step1-multiday\">\n                        <div class=\"field\">\n                            <label>Closest Depot<\/label>\n                            <select name=\"depot\">\n                                <option value=\"\">Select Depot<\/option>\n                                <option value=\"Auckland\">Auckland<\/option>\n                                <option value=\"Queenstown\">Queenstown<\/option>\n                                <option value=\"Christchurch\">Christchurch<\/option>\n                            <\/select>\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"field\">\n                            <label>Vehicle Type<\/label>\n                            <select name=\"vehicle\">\n                                <option value=\"\">Select Vehicle<\/option>\n                                <option value=\"SUV \/ Minivan (6 Seats)\">SUV \/ Minivan \u2013 6 Seats<\/option>\n                                <option value=\"Small Van (12 Seats)\">Small Van \u2013 12 Seats<\/option>\n                                <option value=\"Large Van (15-19 Seats)\">Large Van \u2013 15\u201319 Seats<\/option>\n                                <option value=\"Minibus (23-25 Seats)\">Minibus \u2013 23\u201325 Seats<\/option>\n                                <option value=\"Coach (35-41 Seats)\">Coach \u2013 35\u201341 Seats<\/option>\n                                <option value=\"Coach (45-51 Seats)\">Coach \u2013 45\u201351 Seats<\/option>\n                                <option value=\"City Bus (40 Seats)\">City Bus \u2013 40 Seats<\/option>\n                                <option value=\"City Bus (50 Seats)\">City Bus \u2013 50 Seats<\/option>\n                            <\/select>\n                            <div class=\"error-msg\"><\/div>\n                        <\/div>\n\n                        <div class=\"field\">\n                            <label>Trip Days<\/label>\n                            <table id=\"multidayTable\" border=\"1\" width=\"100%\">\n                                <thead>\n                                    <tr>\n                                        <th>Day<\/th>\n                                        <th>Pickup<\/th>\n                                        <th>Destination<\/th>\n                                        <th>Date<\/th>\n                                        <th>Time<\/th>\n                                    <\/tr>\n                                <\/thead>\n                                <tbody>\n                                    <tr id=\"noDaysRow\">\n                                        <td colspan=\"5\" style=\"text-align:center; padding:15px;\">Add days to travel<\/td>\n                                    <\/tr>\n                                <\/tbody>\n                            <\/table>\n                        <\/div>\n\n                        <button type=\"button\" class=\"quote-btn\" id=\"openAddDayPopup\">+ Add Day<\/button>\n\n                        <label style=\"margin-top:20px;display:flex;\">\n                            <input type=\"checkbox\" name=\"trailer\"> Trailer Required\n                        <\/label>\n\n                        <button type=\"button\" class=\"quote-btn\" id=\"nextBtnMulti\" disabled>Next<\/button>\n                    <\/div>\n\n                    <!-- Add Day Modal -->\n                    <div id=\"addDayModal\" style=\"display:none;\">\n                        <div class=\"modal-overlay\" id=\"closeModalOverlay\"><\/div>\n                        <div class=\"modal-box-img\">\n                            <button type=\"button\" id=\"closeModalBtn\" class=\"modal-close\">\u00d7<\/button>\n                            <h3>Add Trip Day<\/h3>\n                            <input type=\"hidden\" id=\"dayNumber\">\n                            <div class=\"pickuplocationdiv\" style=\"position:relative;\">\n                                <label>Pickup Location<\/label>\n                                <input type=\"text\" id=\"multi-pickup\" autocomplete=\"off\">\n                            <\/div>\n                            <div class=\"destinationlocationdiv\" style=\"position:relative;\">\n                                <label>Destination Location<\/label>\n                                <input type=\"text\" id=\"multi-destination\" autocomplete=\"off\">\n                            <\/div>\n                            <div class=\"dflexform\">\n                                <div class=\"field\">\n                                    <label>Pickup Date<\/label>\n                                    <input type=\"date\" id=\"multi-date\">\n                                <\/div>\n                                <div class=\"field\">\n                                    <label>Pickup Time<\/label>\n                                    <input type=\"time\" id=\"multi-time\">\n                                <\/div>\n                            <\/div>\n                            <button type=\"button\" class=\"quote-btn\" id=\"saveDayBtn\">Save Day<\/button>\n                        <\/div>\n                    <\/div>\n\n                    <!-- Multiday Step 2 -->\n                    <div id=\"multiday-step2\" style=\"display:none;\">\n                        <button type=\"button\" class=\"back-btn\" id=\"backBtnMulti\">\u2190 Back<\/button>\n                        <h3>Trip Summary<\/h3>\n                        <div id=\"multi-summary-days\"><\/div>\n                        <p><strong>Closest Depot:<\/strong> <span id=\"sumDepotMulti\"><\/span><\/p>\n                        <p><strong>Vehicle Type:<\/strong> <span id=\"selectedVehicleMulti\"><\/span><\/p>\n                        <p><strong>Total KM:<\/strong> <span id=\"sumKMmulti\"><\/span><\/p>\n                        <p><strong>Total Hours:<\/strong> <span id=\"sumHoursMulti\"><\/span><\/p>\n                        <p><strong>Total Quote:<\/strong> <span id=\"sumQuoteMulti\"><\/span><\/p>\n                        <button type=\"button\" id=\"goStep3multi\" class=\"quote-btn\" disabled>Submit Quotation To Us!<\/button>\n                    <\/div>\n\n                    <!-- Multiday Step 3 -->\n                    <div id=\"multiday-step3\" style=\"display:none;\">\n                        <div class=\"field\">\n                            <label>Name<\/label>\n                            <input type=\"text\" name=\"name\">\n                        <\/div>\n                        <div class=\"field\">\n                            <label>Email<\/label>\n                            <input type=\"email\" name=\"email\">\n                        <\/div>\n                        <div class=\"field\">\n                            <label>Phone<\/label>\n                            <input type=\"tel\" name=\"mobile\">\n                        <\/div>\n                        <div class=\"field\">\n                            <label>Special Requests & Further Information<\/label>\n                            <textarea name=\"info\"><\/textarea>\n                        <\/div>\n                        <div class=\"field\">\n                            <label>Additional Notes<\/label>\n                            <textarea name=\"notes\" rows=\"3\" placeholder=\"Any additional notes...\"><\/textarea>\n                        <\/div>\n                        <button type=\"submit\" class=\"quote-btn\">Get Quote<\/button>\n                    <\/div>\n                <\/form>\n            <\/div>\n\n        <\/div><!-- \/.formdiv -->\n    <\/div><!-- \/.custom-container -->\n<\/section>\n\n<script>\n\/\/ ============================================================\n\/\/ Pricing config from PHP (update in PHP function above)\n\/\/ ============================================================\nconst vehicleCosts = {\"SUV \\\/ Minivan (6 Seats)\":1.5,\"Small Van (12 Seats)\":1.8,\"Large Van (15-19 Seats)\":2,\"Minibus (23-25 Seats)\":2.2999999999999998,\"Coach (35-41 Seats)\":2.7999999999999998,\"Coach (45-51 Seats)\":3,\"City Bus (40 Seats)\":2.5,\"City Bus (50 Seats)\":2.7000000000000002};\nconst vehicleCosts2 = vehicleCosts;\nconst trailerBase   = 20;\nconst trailerPerKM  = 0.1;\nconst hourlyWage    = 35;\nconst extraTime     = 0.5;\nconst trailerBase2  = trailerBase;\nconst trailerPerKM2 = trailerPerKM;\nconst hourlyWage2   = hourlyWage;\nconst extraTime2    = extraTime;\n\n\/\/ ============================================================\n\/\/ Stops management\n\/\/ ============================================================\nlet oneWayStops  = [];\nlet twoWayStops  = [];\nlet stopAutocompletesOneWay = {};\nlet stopAutocompletesTwoWay = {};\n\/\/ Track resolved LatLng for each stop (keyed by formId-index)\nlet stopLatLngs = {};\n\/\/ Track resolved LatLng for main pickup\/destination fields\nlet resolvedLatLng = {\n    'oneway-pickup': null,\n    'oneway-destination': null,\n    'twoway-pickup': null,\n    'twoway-destination': null\n};\n\nfunction markFieldValid(input) {\n    const wrap = input.closest('.stop-location-wrap') || input.closest('.pickuplocationdiv') || input.closest('.destinationlocationdiv') || input.closest('.field');\n    if (!wrap) return;\n    let errEl = wrap.querySelector('.autocomplete-err');\n    if (errEl) errEl.remove();\n}\n\nfunction markFieldInvalid(input, msg) {\n    const wrap = input.closest('.stop-location-wrap') || input.closest('.pickuplocationdiv') || input.closest('.destinationlocationdiv') || input.closest('.field');\n    if (!wrap) return;\n    let errEl = wrap.querySelector('.autocomplete-err');\n    if (!errEl) {\n        errEl = document.createElement('div');\n        errEl.className = 'autocomplete-err error-msg';\n        errEl.style.cssText = 'color:#e74c3c;font-size:12px;margin-top:4px;';\n        wrap.appendChild(errEl);\n    }\n    errEl.textContent = msg;\n}\n\nfunction createStopRow(formId, index) {\n    const listId = formId === 'oneway' ? 'oneway-stops-list' : 'twoway-stops-list';\n    \/\/ Remove stale latLng for this index\n    delete stopLatLngs[`${formId}-${index}`];\n\n    const wrapper = document.createElement('div');\n    wrapper.className = 'stop-row';\n    wrapper.dataset.index = index;\n    wrapper.innerHTML = `\n        <div class=\"stop-row-inner\">\n            <div class=\"stop-location-wrap\" style=\"position:relative;\">\n                <label>Stop ${index + 1} \u2013 Location<\/label>\n                <input type=\"text\" id=\"${formId}-stop-loc-${index}\" placeholder=\"Enter stop location\" autocomplete=\"off\">\n            <\/div>\n            <div class=\"field\">\n                <label>Stop ${index + 1} \u2013 Time<\/label>\n                <input type=\"time\" id=\"${formId}-stop-time-${index}\">\n            <\/div>\n            <button type=\"button\" class=\"remove-stop-btn\" data-form=\"${formId}\" data-index=\"${index}\">\u2715 Remove<\/button>\n        <\/div>\n    `;\n    document.getElementById(listId).appendChild(wrapper);\n\n    \/\/ FIX #7: Check for google.maps.places (not just google.maps)\n    if (typeof google !== 'undefined' && google.maps && google.maps.places) {\n        bindStopAutocomplete(formId, index);\n    } else {\n        console.warn(\"\u26a0\ufe0f Google Maps Places not available for stop autocomplete\");\n        \/\/ Show visible error\n        const errorDiv = document.getElementById(\"google-api-error\");\n        if (errorDiv) {\n            errorDiv.style.display = \"block\";\n            errorDiv.innerHTML = \"\u26a0\ufe0f Address search temporarily unavailable. Please refresh the page.\";\n        }\n    }\n}\n\nfunction bindStopAutocomplete(formId, index) {\n    const input = document.getElementById(`${formId}-stop-loc-${index}`);\n    if (!input) return;\n    \n    try {\n        const ac = new google.maps.places.Autocomplete(input, {\n            fields: ['formatted_address', 'geometry'],\n            componentRestrictions: { country: 'nz' }\n        });\n        \/\/ When user picks a valid suggestion, store latLng and clear error\n        ac.addListener('place_changed', () => {\n            const p = ac.getPlace();\n            if (p && p.geometry) {\n                stopLatLngs[`${formId}-${index}`] = { lat: p.geometry.location.lat(), lng: p.geometry.location.lng() };\n                markFieldValid(input);\n            } else {\n                delete stopLatLngs[`${formId}-${index}`];\n            }\n        });\n        \/\/ If user types\/clears after picking, invalidate\n        input.addEventListener('input', () => {\n            delete stopLatLngs[`${formId}-${index}`];\n        });\n        if (formId === 'oneway') stopAutocompletesOneWay[index] = ac;\n        else stopAutocompletesTwoWay[index] = ac;\n    } catch (err) {\n        console.error(\"\u274c Error binding stop autocomplete:\", err);\n    }\n}\n\nfunction addStop(formId) {\n    const stops = formId === 'oneway' ? oneWayStops : twoWayStops;\n    const index = stops.length;\n    stops.push({ location: '', time: '' });\n    createStopRow(formId, index);\n}\n\ndocument.getElementById('oneway-add-stop').addEventListener('click', () => addStop('oneway'));\ndocument.getElementById('twoway-add-stop').addEventListener('click', () => addStop('twoway'));\n\ndocument.addEventListener('click', function(e) {\n    if (e.target.classList.contains('remove-stop-btn')) {\n        const formId = e.target.dataset.form;\n        const index  = parseInt(e.target.dataset.index);\n        const listId = formId === 'oneway' ? 'oneway-stops-list' : 'twoway-stops-list';\n        const stops  = formId === 'oneway' ? oneWayStops : twoWayStops;\n        stops.splice(index, 1);\n        \/\/ Clean up latLng store \u2014 rebuild keys\n        const newLatLngs = {};\n        Object.keys(stopLatLngs).forEach(k => {\n            const [fid, idx] = k.split('-');\n            if (fid !== formId) { newLatLngs[k] = stopLatLngs[k]; return; }\n            const i = parseInt(idx);\n            if (i < index) newLatLngs[k] = stopLatLngs[k];\n            else if (i > index) newLatLngs[`${formId}-${i-1}`] = stopLatLngs[k];\n        });\n        stopLatLngs = newLatLngs;\n        document.getElementById(listId).innerHTML = '';\n        stops.forEach((_, i) => createStopRow(formId, i));\n    }\n});\n\nfunction getStopsData(formId) {\n    const stops = formId === 'oneway' ? oneWayStops : twoWayStops;\n    return stops.map((_, i) => ({\n        location: (document.getElementById(`${formId}-stop-loc-${i}`)?.value || '').trim(),\n        latLng:   stopLatLngs[`${formId}-${i}`] || null,\n        time:     (document.getElementById(`${formId}-stop-time-${i}`)?.value || '').trim()\n    })).filter(s => s.location);\n}\n\n\/\/ Validate that all stop inputs with text have a resolved latLng\n\/\/ Returns true if valid, false + shows errors if not\nfunction validateStopsResolved(formId) {\n    const stops = formId === 'oneway' ? oneWayStops : twoWayStops;\n    let valid = true;\n    stops.forEach((_, i) => {\n        const input = document.getElementById(`${formId}-stop-loc-${i}`);\n        if (!input) return;\n        const val = input.value.trim();\n        if (val && !stopLatLngs[`${formId}-${i}`]) {\n            markFieldInvalid(input, 'Please select a valid address from the suggestions.');\n            valid = false;\n        }\n    });\n    return valid;\n}\n\nfunction renderStopsSummary(boxId, listId, stops) {\n    if (!stops.length) {\n        document.getElementById(boxId).style.display = 'none';\n        return;\n    }\n    document.getElementById(boxId).style.display = 'block';\n    document.getElementById(listId).innerHTML = stops\n        .map((s, i) => `<p style=\"margin:2px 0; padding-left:10px;\">Stop ${i+1}: ${s.location}${s.time ? ' at ' + s.time : ''}<\/p>`)\n        .join('');\n}\n\nfunction stopsToString(stops) {\n    return stops.map((s, i) => `Stop ${i+1}: ${s.location}${s.time ? ' at ' + s.time : ''}`).join(' | ');\n}\n\n\/\/ ============================================================\n\/\/ Maps\n\/\/ ============================================================\nlet map, directionsService, directionsRenderer;\n\nconst mapStyle = [\n    { elementType: \"geometry\", stylers: [{ color: \"#f5f5f5\" }] },\n    { elementType: \"labels.text.fill\", stylers: [{ color: \"#616161\" }] },\n    { elementType: \"labels.text.stroke\", stylers: [{ color: \"#f5f5f5\" }] },\n    { featureType: \"administrative\", elementType: \"geometry\", stylers: [{ visibility: \"off\" }] },\n    { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n    { featureType: \"road\", elementType: \"geometry\", stylers: [{ color: \"#ffffff\" }] },\n    { featureType: \"road\", elementType: \"geometry.stroke\", stylers: [{ color: \"#dddddd\" }] },\n    { featureType: \"road.highway\", elementType: \"geometry\", stylers: [{ color: \"#dadada\" }] },\n    { featureType: \"transit\", stylers: [{ visibility: \"off\" }] },\n    { featureType: \"water\", elementType: \"geometry\", stylers: [{ color: \"#c9d6df\" }] }\n];\n\nfunction initRouteMap() {\n    map = new google.maps.Map(document.getElementById(\"routeMap\"), {\n        zoom: 6,\n        center: { lat: -43.5, lng: 172.6 }, \/\/ NZ South Island default (neutral)\n        styles: mapStyle,\n        disableDefaultUI: true,\n        zoomControl: false,\n        gestureHandling: \"greedy\"\n    });\n    directionsService  = new google.maps.DirectionsService();\n    directionsRenderer = new google.maps.DirectionsRenderer({\n        map,\n        preserveViewport: false,\n        suppressMarkers: false\n    });\n}\n\n\/\/ Bind autocomplete for a text input, store latLng on pick, invalidate on manual type\nfunction bindMainAutocomplete(inputEl, key) {\n    const ac = new google.maps.places.Autocomplete(inputEl, {\n        fields: ['formatted_address', 'geometry'],\n        componentRestrictions: { country: 'nz' }\n    });\n    ac.addListener('place_changed', () => {\n        const p = ac.getPlace();\n        if (p && p.geometry) {\n            resolvedLatLng[key] = { lat: p.geometry.location.lat(), lng: p.geometry.location.lng() };\n            markFieldValid(inputEl);\n        } else {\n            resolvedLatLng[key] = null;\n        }\n    });\n    inputEl.addEventListener('input', () => { resolvedLatLng[key] = null; });\n    return ac;\n}\n\nfunction initGoogleAutocomplete() {\n    bindMainAutocomplete(document.getElementById(\"oneway-pickup\"),      'oneway-pickup');\n    bindMainAutocomplete(document.getElementById(\"oneway-destination\"), 'oneway-destination');\n}\n\nfunction initTwoWayAutocomplete() {\n    const pi = document.getElementById(\"twoway-pickup\");\n    const di = document.getElementById(\"twoway-destination\");\n    if (!pi || !di) return;\n    bindMainAutocomplete(pi, 'twoway-pickup');\n    bindMainAutocomplete(di, 'twoway-destination');\n}\n\n\/\/ Draw a road-following route with optional waypoints, using DirectionsService\n\/\/ Returns a Promise that resolves when done (or rejects on failure)\nfunction drawRouteWithWaypoints(originLatLng, destLatLng, waypointLatLngs, mapErrorContainerId) {\n    return new Promise((resolve, reject) => {\n        if (!originLatLng || !destLatLng) {\n            if (mapErrorContainerId) showMapError(mapErrorContainerId, 'Could not determine route \u2014 please re-select pickup and destination.');\n            reject('Missing origin or destination LatLng');\n            return;\n        }\n        const waypoints = (waypointLatLngs || []).map(ll => ({ location: new google.maps.LatLng(ll.lat, ll.lng), stopover: true }));\n        directionsService.route({\n            origin: new google.maps.LatLng(originLatLng.lat, originLatLng.lng),\n            destination: new google.maps.LatLng(destLatLng.lat, destLatLng.lng),\n            waypoints,\n            travelMode: google.maps.TravelMode.DRIVING\n        }, (result, status) => {\n            if (status === 'OK') {\n                directionsRenderer.setMap(map);\n                directionsRenderer.setDirections(result);\n                const bounds = result.routes[0].bounds;\n                map.fitBounds(bounds, { top: 50, right: 50, bottom: 50, left: 50 });\n                resolve(result);\n            } else {\n                if (mapErrorContainerId) showMapError(mapErrorContainerId, 'Route calculation failed. Please check the locations and try again.');\n                reject('Directions failed: ' + status);\n            }\n        });\n    });\n}\n\nfunction showMapError(containerId, msg) {\n    const el = document.getElementById(containerId);\n    if (!el) return;\n    el.innerHTML = `<div style=\"padding:16px;color:#e74c3c;background:#fff5f5;border-radius:6px;text-align:center;\">${msg}<\/div>`;\n}\n\n\/\/ ============================================================\n\/\/ Tab switching\n\/\/ ============================================================\nconst tabs     = document.querySelectorAll('.tab-btn');\nconst contents = document.querySelectorAll('.tab-content');\n\ntabs.forEach(tab => {\n    tab.addEventListener('click', () => {\n        const target = tab.getAttribute('data-tab');\n        tabs.forEach(t => t.classList.remove('active'));\n        tab.classList.add('active');\n        document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n        document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n        document.getElementById(\"mapContainer\").style.display = \"none\";\n        document.querySelector(\"form.oneway-form div#step1\").style.display    = \"flex\";\n        document.querySelector(\"form.oneway-form div#step2\").style.display    = \"none\";\n        document.querySelector(\"form.oneway-form div#step3\").style.display    = \"none\";\n        document.querySelector(\"form.twoway-form div#step1form2\").style.display = \"flex\";\n        document.querySelector(\"form.twoway-form div#step2form2\").style.display = \"none\";\n        document.querySelector(\"form.twoway-form div#step3form2\").style.display = \"none\";\n        document.querySelector(\"div#step1-multiday\").style.display  = \"block\";\n        document.querySelector(\"div#multiday-step2\").style.display  = \"none\";\n        document.querySelector(\"div#multiday-step3\").style.display  = \"none\";\n        contents.forEach(c => c.id === target ? c.classList.add('show') : c.classList.remove('show'));\n    });\n});\n\n\/\/ ============================================================\n\/\/ One Way form\n\/\/ ============================================================\nconst step1 = document.getElementById(\"step1\");\nconst step2 = document.getElementById(\"step2\");\nconst step3 = document.getElementById(\"step3\");\n\ndocument.getElementById(\"goStep3\").addEventListener(\"click\", function () {\n    step2.style.display = \"none\";\n    step3.style.display = \"flex\";\n});\n\n\/\/ Back button: Step 2 \u2192 Step 1 (Single Trip)\ndocument.getElementById(\"backBtn1\").addEventListener(\"click\", function () {\n    step2.style.display = \"none\";\n    step1.style.display = \"flex\";\n    document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n    document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n    document.getElementById(\"mapContainer\").style.display = \"none\";\n});\n\ndocument.getElementById(\"nextBtn\").addEventListener(\"click\", async function () {\n    let isValid = true;\n    const fields = step1.querySelectorAll(\"select, input[type=text], input[type=date], input[type=time]\");\n    fields.forEach(field => {\n        const errorDiv = field.parentElement.querySelector(\".error-msg\") || field.closest(\".field\")?.querySelector(\".error-msg\") || field.nextElementSibling;\n        if (!errorDiv) return;\n        if (field.tagName === \"SELECT\") {\n            if (!field.value) { errorDiv.textContent = \"This field is required\"; isValid = false; }\n            else errorDiv.textContent = \"\";\n        } else {\n            if (!field.value.trim()) { errorDiv.textContent = \"This field is required\"; isValid = false; }\n            else errorDiv.textContent = \"\";\n        }\n    });\n    if (!isValid) return;\n\n    \/\/ Validate pickup\/destination have resolved autocomplete\n    const pickupInput = step1.querySelector(\"input[name='pickup']\");\n    const destInput   = step1.querySelector(\"input[name='destination']\");\n    if (!resolvedLatLng['oneway-pickup']) {\n        markFieldInvalid(pickupInput, 'Please select a valid address from the suggestions.');\n        isValid = false;\n    }\n    if (!resolvedLatLng['oneway-destination']) {\n        markFieldInvalid(destInput, 'Please select a valid address from the suggestions.');\n        isValid = false;\n    }\n    \/\/ Validate stops\n    if (!validateStopsResolved('oneway')) isValid = false;\n    if (!isValid) return;\n\n    const pickupAddr  = pickupInput.value;\n    const destAddr    = destInput.value;\n    const vehicle     = step1.querySelector(\"select[name=vehicle]\").value;\n    const depotAddress= step1.querySelector(\"select[name='depot']\").value;\n    const trailerSelected = step1.querySelector(\"input[name=trailer]\").checked;\n    const pickupDate  = step1.querySelector(\"input[name=pickup_date]\").value;\n    const pickupTime  = step1.querySelector(\"input[name=pickup_time]\").value;\n    const stops       = getStopsData('oneway');\n\n    document.getElementById(\"sumDepot\").innerText      = depotAddress;\n    document.getElementById(\"sumVehicle\").innerText    = vehicle;\n    document.getElementById(\"sumPickup\").innerText     = pickupAddr;\n    document.getElementById(\"sumDestination\").innerText= destAddr;\n    document.getElementById(\"sumDate\").innerText       = pickupDate + \" \" + pickupTime;\n    document.getElementById(\"sumTrailer\").innerText    = trailerSelected ? \"Yes\" : \"No\";\n    renderStopsSummary('sumStopsBox', 'sumStopsList', stops);\n\n    document.getElementById(\"custom-mainform\").classList.add(\"map-active\");\n    document.querySelector(\".formcontentdiv\").classList.add(\"hide\");\n    document.getElementById(\"mapContainer\").style.display = \"block\";\n    step1.style.display = \"none\";\n    step2.style.display = \"flex\";\n\n    \/\/ Draw road-following route with stops as waypoints\n    const stopWaypoints = stops.map(s => s.latLng).filter(Boolean);\n    try {\n        await drawRouteWithWaypoints(\n            resolvedLatLng['oneway-pickup'],\n            resolvedLatLng['oneway-destination'],\n            stopWaypoints,\n            'routeMap'\n        );\n    } catch(e) { \/* error already shown in map container *\/ }\n\n    const goBtn = document.getElementById(\"goStep3\");\n    goBtn.disabled = true; goBtn.style.opacity = \"0.5\"; goBtn.style.pointerEvents = \"none\";\n\n    const kmSpan    = document.getElementById(\"sumKilometer\");\n    const timeSpan  = document.getElementById(\"averageTime\");\n    const quoteSpan = document.getElementById(\"totalQuote\");\n    kmSpan.innerText = timeSpan.innerText = quoteSpan.innerText = \"Calculating...\";\n\n    try {\n        \/\/ Log calculation start with all parameters\n        console.log(\"\ud83d\ude80 Starting Single Trip Distance Calculation...\", {\n            depot: depotAddress,\n            pickup: pickupAddr,\n            destination: destAddr,\n            stops: stops.length,\n            vehicle: vehicle,\n            trailer: trailerSelected\n        });\n\n        \/\/ VALIDATE ADDRESSES BEFORE SENDING TO GOOGLE\n        console.log(\"\ud83d\udd0d Validating addresses...\");\n        validateAddressForDistanceMatrix(depotAddress + \", New Zealand\", \"Depot\");\n        validateAddressForDistanceMatrix(pickupAddr, \"Pickup Location\");\n        validateAddressForDistanceMatrix(destAddr, \"Destination Location\");\n        stops.forEach((stop, i) => {\n            if (stop.location) {\n                validateAddressForDistanceMatrix(stop.location, `Stop ${i+1}`);\n            }\n        });\n        console.log(\"\u2705 All addresses are valid and specific enough\");\n\n        \/\/ FIX: Add \", New Zealand\" to depot to make it a proper address for Google\n        const route1 = await getDistanceAndDurationGoogle(depotAddress + \", New Zealand\", pickupAddr);\n        let totalKM = route1 ? route1.distance : 0;\n        let totalDuration = route1 ? route1.duration : 0;\n\n        console.log(\"\u2705 Depot \u2192 Pickup:\", totalKM.toFixed(2) + \" km\");\n\n        let prevPoint = pickupAddr;\n        for (let i = 0; i < stops.length; i++) {\n            const stop = stops[i];\n            if (stop.location) {\n                console.log(\"\ud83d\udccd Calculating Stop \" + (i+1) + \":\", stop.location);\n                const r = await getDistanceAndDurationGoogle(prevPoint, stop.location);\n                if (r) { \n                    totalKM += r.distance; \n                    totalDuration += r.duration;\n                    console.log(\"\u2705 Stop \" + (i+1) + \":\", r.distance.toFixed(2) + \" km\");\n                }\n                prevPoint = stop.location;\n            }\n        }\n\n        const route2 = await getDistanceAndDurationGoogle(prevPoint, destAddr);\n        if (route2) { \n            totalKM += route2.distance; \n            totalDuration += route2.duration;\n            console.log(\"\u2705 Final Leg to Destination:\", route2.distance.toFixed(2) + \" km\");\n        }\n        totalDuration += extraTime;\n\n        console.log(\"\ud83d\udcca FINAL TOTALS:\", {\n            totalKM: totalKM.toFixed(2),\n            totalDuration: totalDuration.toFixed(2)\n        });\n\n        kmSpan.innerText   = totalKM.toFixed(2) + \" KM\";\n        timeSpan.innerText = totalDuration.toFixed(2) + \" hrs\";\n\n        \/\/ Calculate quote\n        const vehicleCost = totalKM * (vehicleCosts[vehicle] || 1);\n        const trailerCost = trailerSelected ? (trailerBase + totalKM * trailerPerKM) : 0;\n        const wages       = totalDuration * hourlyWage;\n        let subtotal      = vehicleCost + trailerCost + wages;\n        subtotal         += subtotal * 0.1;  \/\/ GST 10%\n        const total       = subtotal * 1.2;  \/\/ Margin 20%\n        \n        console.log(\"\ud83d\udcb0 QUOTE:\", {\n            vehicleCost: vehicleCost.toFixed(2),\n            trailerCost: trailerCost.toFixed(2),\n            driverCost: wages.toFixed(2),\n            subtotal: subtotal.toFixed(2),\n            total: total.toFixed(2)\n        });\n        \n        quoteSpan.innerText = \"$\" + total.toFixed(2);\n        goBtn.disabled = false; \n        goBtn.style.opacity = \"1\"; \n        goBtn.style.pointerEvents = \"auto\";\n        \n        console.log(\"\u2705 Calculation successful - Submit button enabled\");\n    } catch(err) {\n        console.error(\"\u274c CALCULATION FAILED:\", err);\n        \n        \/\/ Show error to user\n        kmSpan.innerText = \"\u274c Error: \" + err;\n        timeSpan.innerText = \"N\/A\";\n        quoteSpan.innerText = \"\u274c Calculation Failed\";\n        \n        \/\/ CRITICAL: Keep submit button disabled\n        goBtn.disabled = true;\n        goBtn.style.opacity = \"0.5\";\n        goBtn.style.pointerEvents = \"none\";\n        \n        \/\/ Show error in visible error div for vague address errors\n        const errorDiv = document.getElementById(\"google-api-error\");\n        if (errorDiv && err.toString().includes(\"too vague\")) {\n            errorDiv.style.display = \"block\";\n            errorDiv.innerHTML = \"\u26a0\ufe0f Address too vague. Please enter a more specific address like 'Queen Street, Auckland' or 'Ellerslie, Auckland'.\";\n        }\n        \n        \/\/ Show error alert\n        alert(\"Calculation Error:\\n\\n\" + err + \"\\n\\nPlease check your addresses and try again.\");\n        \n        \/\/ CRITICAL: Return user to form step (don't stay on broken quote page)\n        console.log(\"Returning user to form...\");\n        step2.style.display = \"none\";\n        step1.style.display = \"flex\";\n        document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n        document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n        document.getElementById(\"mapContainer\").style.display = \"none\";\n    }\n});\n\ndocument.getElementById(\"onewayForm\").addEventListener(\"submit\", async function (e) {\n    e.preventDefault();\n    let isValid = true;\n    step3.querySelectorAll(\"input[type=text], input[type=email], input[type=tel]\").forEach(field => {\n        const errorDiv = field.nextElementSibling;\n        if (!field.value.trim()) { errorDiv.textContent = \"This field is required\"; isValid = false; }\n        else errorDiv.textContent = \"\";\n    });\n    if (!isValid) return;\n\n    const stops = getStopsData('oneway');\n    const formData = new FormData(this);\n    formData.append(\"calculate\", \"1\");\n    formData.append(\"depot\",       document.querySelector(\"#step1 select[name='depot']\").value);\n    formData.append(\"vehicle\",     document.getElementById(\"sumVehicle\").innerText);\n    formData.append(\"pickup\",      document.getElementById(\"sumPickup\").innerText);\n    formData.append(\"stops\",       stopsToString(stops));\n    formData.append(\"destination\", document.getElementById(\"sumDestination\").innerText);\n    formData.append(\"pickupdate\",  document.getElementById(\"sumDate\").innerText);\n    formData.append(\"trailer\",     document.getElementById(\"sumTrailer\").innerText);\n    formData.append(\"kms\",         document.getElementById(\"sumKilometer\").innerText);\n    formData.append(\"time\",        document.getElementById(\"averageTime\").innerText);\n    formData.append(\"quote\",       document.getElementById(\"totalQuote\").innerText);\n\n    try {\n        await fetch(\"index.php\", { method: \"POST\", body: formData });\n        alert(\"Quote submitted successfully!\");\n        window.location.reload();\n    } catch (err) {\n        alert(\"Something went wrong. Please try again.\");\n    }\n});\n\n\/\/ ============================================================\n\/\/ Return form\n\/\/ ============================================================\nconst step1form2 = document.getElementById(\"step1form2\");\nconst step2form2 = document.getElementById(\"step2form2\");\nconst step3form2 = document.getElementById(\"step3form2\");\n\ndocument.getElementById(\"goStep3form2\").addEventListener(\"click\", function () {\n    step2form2.style.display = \"none\";\n    step3form2.style.display = \"flex\";\n});\n\n\/\/ Back button: Step 2 \u2192 Step 1 (Return)\ndocument.getElementById(\"backBtn2\").addEventListener(\"click\", function () {\n    step2form2.style.display = \"none\";\n    step1form2.style.display = \"flex\";\n    document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n    document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n    document.getElementById(\"mapContainer\").style.display = \"none\";\n});\n\ndocument.getElementById(\"nextBtn2\").addEventListener(\"click\", async function () {\n    let isValid = true;\n    step1form2.querySelectorAll(\"select, input[type=text], input[type=date], input[type=time]\").forEach(field => {\n        const errorDiv = field.parentElement.querySelector(\".error-msg\") || field.nextElementSibling;\n        if (!errorDiv) return;\n        if (!field.value.trim()) { errorDiv.textContent = \"This field is required\"; isValid = false; }\n        else errorDiv.textContent = \"\";\n    });\n    if (!isValid) return;\n\n    \/\/ Validate pickup\/destination have resolved autocomplete\n    const pickupInput = step1form2.querySelector(\"input[name='pickup']\");\n    const destInput   = step1form2.querySelector(\"input[name='destination']\");\n    if (!resolvedLatLng['twoway-pickup']) {\n        markFieldInvalid(pickupInput, 'Please select a valid address from the suggestions.');\n        isValid = false;\n    }\n    if (!resolvedLatLng['twoway-destination']) {\n        markFieldInvalid(destInput, 'Please select a valid address from the suggestions.');\n        isValid = false;\n    }\n    if (!validateStopsResolved('twoway')) isValid = false;\n    if (!isValid) return;\n\n    const pickupAddr  = pickupInput.value;\n    const destAddr    = destInput.value;\n    const vehicle     = step1form2.querySelector(\"select[name=vehicle]\").value;\n    const depotAddress= step1form2.querySelector(\"select[name='depot']\").value;\n    const trailerSelected = step1form2.querySelector(\"input[name=trailer]\").checked;\n    const pickupDate  = step1form2.querySelector(\"input[name=pickup_date]\").value;\n    const pickupTime  = step1form2.querySelector(\"input[name=pickup_time]\").value;\n    const returnDate  = step1form2.querySelector(\"input[name=return_date]\").value;\n    const returnTime  = step1form2.querySelector(\"input[name=return_time]\").value;\n    const stops       = getStopsData('twoway');\n\n    document.getElementById(\"sumDepot2\").innerText      = depotAddress;\n    document.getElementById(\"sumVehicle2\").innerText    = vehicle;\n    document.getElementById(\"sumPickup2\").innerText     = pickupAddr;\n    document.getElementById(\"sumDestination2\").innerText= destAddr;\n    document.getElementById(\"sumDate2\").innerText       = pickupDate + \" \" + pickupTime;\n    document.getElementById(\"returnDate2\").innerText    = returnDate + \" \" + returnTime;\n    document.getElementById(\"sumTrailer2\").innerText    = trailerSelected ? \"Yes\" : \"No\";\n    renderStopsSummary('sumStopsBox2', 'sumStopsList2', stops);\n\n    document.getElementById(\"custom-mainform\").classList.add(\"map-active\");\n    document.querySelector(\".formcontentdiv\").classList.add(\"hide\");\n    document.getElementById(\"mapContainer\").style.display = \"block\";\n    step1form2.style.display = \"none\";\n    step2form2.style.display = \"flex\";\n\n    \/\/ Draw road-following route with stops as waypoints\n    const stopWaypoints = stops.map(s => s.latLng).filter(Boolean);\n    try {\n        await drawRouteWithWaypoints(\n            resolvedLatLng['twoway-pickup'],\n            resolvedLatLng['twoway-destination'],\n            stopWaypoints,\n            'routeMap'\n        );\n    } catch(e) { \/* error already shown in map container *\/ }\n\n    const goBtn = document.getElementById(\"goStep3form2\");\n    goBtn.disabled = true; goBtn.style.opacity = \"0.5\"; goBtn.style.pointerEvents = \"none\";\n\n    const kmSpan    = document.getElementById(\"sumKilometer2\");\n    const timeSpan  = document.getElementById(\"averageTime2\");\n    const quoteSpan = document.getElementById(\"totalQuote2\");\n    kmSpan.innerText = timeSpan.innerText = quoteSpan.innerText = \"Calculating...\";\n\n    try {\n        console.log(\"\ud83d\ude80 Starting Return Trip Distance Calculation...\", {\n            depot: depotAddress,\n            pickup: pickupAddr,\n            destination: destAddr,\n            stops: stops.length,\n            vehicle: vehicle,\n            trailer: trailerSelected\n        });\n\n        \/\/ VALIDATE ADDRESSES BEFORE SENDING TO GOOGLE\n        console.log(\"\ud83d\udd0d Validating addresses...\");\n        validateAddressForDistanceMatrix(depotAddress + \", New Zealand\", \"Depot\");\n        validateAddressForDistanceMatrix(pickupAddr, \"Pickup Location\");\n        validateAddressForDistanceMatrix(destAddr, \"Destination Location\");\n        stops.forEach((stop, i) => {\n            if (stop.location) {\n                validateAddressForDistanceMatrix(stop.location, `Stop ${i+1}`);\n            }\n        });\n        console.log(\"\u2705 All addresses are valid and specific enough\");\n\n        \/\/ FIX: Add \", New Zealand\" to depot\n        const route1 = await getDistanceAndDurationGoogle(depotAddress + \", New Zealand\", pickupAddr);\n        let totalKM = route1 ? route1.distance : 0;\n        let totalDuration = route1 ? route1.duration : 0;\n\n        console.log(\"\u2705 Depot \u2192 Pickup:\", totalKM.toFixed(2) + \" km\");\n\n        let prevPoint = pickupAddr;\n        for (let i = 0; i < stops.length; i++) {\n            const stop = stops[i];\n            if (stop.location) {\n                console.log(\"\ud83d\udccd Calculating Stop \" + (i+1) + \":\", stop.location);\n                const r = await getDistanceAndDurationGoogle(prevPoint, stop.location);\n                if (r) { totalKM += r.distance; totalDuration += r.duration; }\n                prevPoint = stop.location;\n            }\n        }\n        \n        const route2 = await getDistanceAndDurationGoogle(prevPoint, destAddr);\n        const route3 = await getDistanceAndDurationGoogle(destAddr, pickupAddr);\n        if (route2) { \n            totalKM += route2.distance; \n            totalDuration += route2.duration;\n            console.log(\"\u2705 To Destination:\", route2.distance.toFixed(2) + \" km\");\n        }\n        if (route3) { \n            totalKM += route3.distance; \n            totalDuration += route3.duration;\n            console.log(\"\u2705 Return Trip:\", route3.distance.toFixed(2) + \" km\");\n        }\n        totalDuration += extraTime2;\n\n        console.log(\"\ud83d\udcca Return Trip TOTAL:\", {\n            totalKM: totalKM.toFixed(2),\n            totalDuration: totalDuration.toFixed(2)\n        });\n\n        kmSpan.innerText   = totalKM.toFixed(2) + \" KM\";\n        timeSpan.innerText = totalDuration.toFixed(2) + \" hrs\";\n\n        const vehicleRate = vehicleCosts2[vehicle] || 1;\n        const vehicleCost = totalKM * vehicleRate;\n        const trailerCost = trailerSelected ? trailerBase2 + totalKM * trailerPerKM2 : 0;\n        const wages       = totalDuration * hourlyWage2;\n        let subtotal      = vehicleCost + trailerCost + wages;\n        subtotal         += subtotal * 0.1;\n        const total       = subtotal * 1.2;\n        \n        \/\/ QA DEBUG: Log all values\n        console.log(\"\ud83d\udd0d RETURN TRIP DETAILED CALCULATION:\", {\n            totalKM: totalKM.toFixed(2),\n            totalDuration: totalDuration.toFixed(2),\n            vehicle: vehicle,\n            vehicleRate: vehicleRate,\n            hourlyWage2: hourlyWage2,\n            vehicleCost: vehicleCost.toFixed(2),\n            trailerCost: trailerCost.toFixed(2),\n            wages: wages.toFixed(2),\n            subtotalBeforeTax: vehicleCost + trailerCost + wages,\n            subtotalAfterGST: subtotal.toFixed(2),\n            finalTotal: total.toFixed(2),\n            gstMultiplier: \"1.1\",\n            marginMultiplier: \"1.2\"\n        });\n        \n        console.log(\"\ud83d\udcb0 Return Trip QUOTE:\", {\n            vehicleCost: vehicleCost.toFixed(2),\n            trailerCost: trailerCost.toFixed(2),\n            driverCost: wages.toFixed(2),\n            subtotal: subtotal.toFixed(2),\n            total: total.toFixed(2)\n        });\n        \n        quoteSpan.innerText = \"$\" + total.toFixed(2);\n        goBtn.disabled = false; goBtn.style.opacity = \"1\"; goBtn.style.pointerEvents = \"auto\";\n        \n        console.log(\"\u2705 Return Trip Calculation successful\");\n    } catch(err) {\n        console.error(\"\u274c Return Trip CALCULATION FAILED:\", err);\n        kmSpan.innerText = \"\u274c Error: \" + err;\n        timeSpan.innerText = \"N\/A\";\n        quoteSpan.innerText = \"\u274c Calculation Failed\";\n        goBtn.disabled = true;\n        goBtn.style.opacity = \"0.5\";\n        goBtn.style.pointerEvents = \"none\";\n        \n        \/\/ Show error in visible error div for vague address errors\n        const errorDiv = document.getElementById(\"google-api-error\");\n        if (errorDiv && err.toString().includes(\"too vague\")) {\n            errorDiv.style.display = \"block\";\n            errorDiv.innerHTML = \"\u26a0\ufe0f Address too vague. Please enter a more specific address like 'Queen Street, Auckland' or 'Ellerslie, Auckland'.\";\n        }\n        \n        alert(\"Calculation Error:\\n\\n\" + err + \"\\n\\nPlease check your addresses and try again.\");\n        \n        \/\/ FIX #1: Return to RETURN TRIP form (step1form2), not Single Trip (step1)\n        step2form2.style.display = \"none\";\n        step1form2.style.display = \"flex\";\n        document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n        document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n        document.getElementById(\"mapContainer\").style.display = \"none\";\n        \n        \/\/ FIX #3: Make sure Return Trip tab is active - use correct selectors\n        document.querySelectorAll(\".tab-btn\").forEach(tab => tab.classList.remove(\"active\"));\n        const returnTab = document.querySelector('.tab-btn[data-tab=\"twoway\"]');\n        if (returnTab) returnTab.classList.add(\"active\");\n    }\n});\n\ndocument.getElementById(\"twowayForm\").addEventListener(\"submit\", async function (e) {\n    e.preventDefault();\n    let isValid = true;\n    step3form2.querySelectorAll(\"input[type=text], input[type=email], input[type=tel]\").forEach(field => {\n        const errorDiv = field.nextElementSibling;\n        if (!field.value.trim()) { errorDiv.textContent = \"This field is required\"; isValid = false; }\n        else errorDiv.textContent = \"\";\n    });\n    if (!isValid) return;\n\n    const stops = getStopsData('twoway');\n    const formData = new FormData(this);\n    formData.append(\"calculate\", \"1\");\n    formData.append(\"depot\",       document.querySelector(\"#step1form2 select[name='depot']\").value);\n    formData.append(\"vehicle\",     document.getElementById(\"sumVehicle2\").innerText);\n    formData.append(\"pickup\",      document.getElementById(\"sumPickup2\").innerText);\n    formData.append(\"stops\",       stopsToString(stops));\n    formData.append(\"destination\", document.getElementById(\"sumDestination2\").innerText);\n    formData.append(\"pickupdate\",  document.getElementById(\"sumDate2\").innerText);\n    formData.append(\"returndate\",  document.getElementById(\"returnDate2\").innerText);\n    formData.append(\"trailer\",     document.getElementById(\"sumTrailer2\").innerText);\n    formData.append(\"kms\",         document.getElementById(\"sumKilometer2\").innerText);\n    formData.append(\"time\",        document.getElementById(\"averageTime2\").innerText);\n    formData.append(\"quote\",       document.getElementById(\"totalQuote2\").innerText);\n\n    try {\n        await fetch(\"index.php\", { method: \"POST\", body: formData });\n        alert(\"Quote submitted successfully!\");\n        window.location.reload();\n    } catch (err) {\n        alert(\"Something went wrong. Please try again.\");\n    }\n});\n\n\/\/ ============================================================\n\/\/ Date validation\n\/\/ ============================================================\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n    const today = new Date().toISOString().split(\"T\")[0];\n\n    const oneWayForm = document.getElementById(\"onewayForm\");\n    if (oneWayForm) {\n        const pd = oneWayForm.querySelector(\"input[name='pickup_date']\");\n        if (pd) pd.min = today;\n    }\n\n    const twoWayForm = document.getElementById(\"twowayForm\");\n    if (twoWayForm) {\n        const pd = twoWayForm.querySelector(\"input[name='pickup_date']\");\n        const rd = twoWayForm.querySelector(\"input[name='return_date']\");\n        const pt = twoWayForm.querySelector(\"input[name='pickup_time']\");\n        const rt = twoWayForm.querySelector(\"input[name='return_time']\");\n        if (pd) pd.min = today;\n        if (rd) rd.min = today;\n        if (pd && rd) {\n            pd.addEventListener(\"change\", function () {\n                if (this.value) {\n                    rd.min = this.value;\n                    if (rd.value && rd.value < this.value) { rd.value = \"\"; if (rt) rt.value = \"\"; }\n                }\n            });\n        }\n        if (pd && rd && pt && rt) {\n            rt.addEventListener(\"change\", function () {\n                if (pd.value && rd.value && pt.value && rt.value && pd.value === rd.value && rt.value <= pt.value) {\n                    alert(\"Return Time should be greater than Pickup Time\");\n                    rt.value = \"\";\n                }\n            });\n        }\n    }\n});\n\n\/\/ ============================================================\n\/\/ Multiday form\n\/\/ ============================================================\nlet dayCount = 0, lastPickupDate = \"\", lastDestination = \"\";\n\ndocument.getElementById(\"openAddDayPopup\").onclick = () => {\n    initMultiDayAutocomplete();\n    dayCount++;\n    document.getElementById(\"dayNumber\").value = dayCount;\n    const dateInput = document.getElementById(\"multi-date\");\n    document.getElementById(\"multi-pickup\").value      = dayCount > 1 && lastDestination ? lastDestination : \"\";\n    document.getElementById(\"multi-destination\").value = \"\";\n    document.getElementById(\"multi-date\").value        = \"\";\n    document.getElementById(\"multi-time\").value        = \"\";\n    if (dayCount > 1 && lastPickupDate) {\n        const nd = new Date(lastPickupDate); nd.setDate(nd.getDate() + 1);\n        dateInput.min = nd.toISOString().split(\"T\")[0];\n    } else {\n        dateInput.min = new Date().toISOString().split(\"T\")[0];\n    }\n    document.getElementById(\"addDayModal\").style.display = \"flex\";\n};\n\ndocument.getElementById(\"saveDayBtn\").onclick = () => {\n    const pickup = document.getElementById(\"multi-pickup\").value;\n    const dest   = document.getElementById(\"multi-destination\").value;\n    const date   = document.getElementById(\"multi-date\").value;\n    const time   = document.getElementById(\"multi-time\").value;\n    if (!pickup || !dest || !date || !time) { alert(\"All fields required\"); return; }\n    lastPickupDate = date;\n    const emptyRow = document.getElementById(\"noDaysRow\");\n    if (emptyRow) emptyRow.remove();\n    const table = document.querySelector(\"#multidayTable tbody\");\n    table.innerHTML += `<tr><td>Day ${dayCount}<\/td><td>${pickup}<\/td><td>${dest}<\/td><td>${date}<\/td><td>${time}<\/td><\/tr>`;\n    lastDestination = dest;\n    document.getElementById(\"nextBtnMulti\").disabled = false;\n    document.getElementById(\"addDayModal\").style.display = \"none\";\n};\n\ndocument.getElementById(\"closeModalBtn\").onclick     = closeModal;\ndocument.getElementById(\"closeModalOverlay\").onclick = closeModal;\nfunction closeModal() {\n    if (!document.getElementById(\"multi-date\").value) dayCount--;\n    document.getElementById(\"addDayModal\").style.display = \"none\";\n}\n\nlet multiPickupLatLng = null, multiDestinationLatLng = null;\nfunction initMultiDayAutocomplete() {\n    const pi = document.getElementById(\"multi-pickup\");\n    const di = document.getElementById(\"multi-destination\");\n    if (!pi || !di) return;\n    \n    \/\/ FIX #6: Complete Google Places check with visible error handling\n    if (typeof google === 'undefined' || !google.maps || !google.maps.places) {\n        console.error(\"\u274c Google Maps Places API not available for multi-day autocomplete\");\n        \n        \/\/ Show visible error to user\n        const errorDiv = document.getElementById(\"google-api-error\");\n        if (errorDiv) {\n            errorDiv.style.display = \"block\";\n            errorDiv.innerHTML = \"\u26a0\ufe0f Google address search could not load. Please refresh the page or contact support.\";\n        }\n        \n        \/\/ Disable form\n        pi.disabled = true;\n        di.disabled = true;\n        \n        return;\n    }\n\n    try {\n        const pa = new google.maps.places.Autocomplete(pi, { fields: [\"formatted_address\",\"geometry\"], componentRestrictions: { country: \"nz\" } });\n        const da = new google.maps.places.Autocomplete(di, { fields: [\"formatted_address\",\"geometry\"], componentRestrictions: { country: \"nz\" } });\n        pa.addListener(\"place_changed\", () => { const p = pa.getPlace(); if (p.geometry) multiPickupLatLng = { lat: p.geometry.location.lat(), lng: p.geometry.location.lng() }; });\n        da.addListener(\"place_changed\", () => { const p = da.getPlace(); if (p.geometry) multiDestinationLatLng = { lat: p.geometry.location.lat(), lng: p.geometry.location.lng() }; });\n    } catch (err) {\n        console.error(\"\u274c Error initializing multi-day autocomplete:\", err);\n        \n        \/\/ Show error to user\n        const errorDiv = document.getElementById(\"google-api-error\");\n        if (errorDiv) {\n            errorDiv.style.display = \"block\";\n            errorDiv.innerHTML = \"\u26a0\ufe0f Address search error. Please refresh the page.\";\n        }\n    }\n}\n\ndocument.getElementById(\"nextBtnMulti\").addEventListener(\"click\", async function () {\n    const vehicleSelect = document.querySelector(\"div#step1-multiday select[name='vehicle']\");\n    const depotSelect   = document.querySelector(\"div#step1-multiday select[name='depot']\");\n    let isValid = true;\n    if (!depotSelect.value.trim())   { depotSelect.nextElementSibling.textContent   = \"This field is required\"; depotSelect.nextElementSibling.style.color   = \"red\"; isValid = false; }\n    else depotSelect.nextElementSibling.textContent = \"\";\n    if (!vehicleSelect.value.trim()) { vehicleSelect.nextElementSibling.textContent = \"This field is required\"; vehicleSelect.nextElementSibling.style.color = \"red\"; isValid = false; }\n    else vehicleSelect.nextElementSibling.textContent = \"\";\n    if (!isValid) return;\n\n    const rows = document.querySelectorAll(\"#multidayTable tbody tr:not(#noDaysRow)\");\n    if (!rows.length) { alert(\"Please add at least one travel day.\"); return; }\n\n    document.getElementById(\"step1-multiday\").style.display = \"none\";\n    document.getElementById(\"multiday-step2\").style.display = \"block\";\n    document.getElementById(\"custom-mainform\").classList.add(\"map-active\");\n    document.querySelector(\".formcontentdiv\").classList.add(\"hide\");\n    document.getElementById(\"mapContainer\").style.display = \"block\";\n\n    const summaryDiv = document.getElementById(\"multi-summary-days\");\n    let output = `<table id=\"tripeinformationtable\" border=\"1\" width=\"100%\" style=\"margin-top:10px;\"><thead><tr><th>Day<\/th><th>Pickup<\/th><th>Destination<\/th><th>Date<\/th><th>Time<\/th><\/tr><\/thead><tbody>`;\n    rows.forEach(row => {\n        const c = row.querySelectorAll(\"td\");\n        output += `<tr><td>${c[0].innerText}<\/td><td>${c[1].innerText}<\/td><td>${c[2].innerText}<\/td><td>${c[3].innerText}<\/td><td>${c[4].innerText}<\/td><\/tr>`;\n    });\n    output += `<\/tbody><\/table>`;\n    summaryDiv.innerHTML = output;\n\n    document.getElementById(\"sumKMmulti\").innerText = document.getElementById(\"sumHoursMulti\").innerText = document.getElementById(\"sumQuoteMulti\").innerText = \"Calculating...\";\n    document.getElementById(\"goStep3multi\").disabled = true;\n\n    \/\/ FIX #4: Wrap ALL Multi-day calculations in one try\/catch\n    try {\n        \/\/ Initialize map\n        initMultiDayMap();\n        \/\/ Draw routes\n        await drawMultiDayRoutes();\n        \/\/ Calculate quote\n        await calculateMultiDayQuote();\n        \/\/ Only enable submit button if ALL steps succeed\n        document.getElementById(\"goStep3multi\").disabled = false;\n    } catch (err) {\n        console.error(\"\u274c Multi-day calculation error:\", err);\n        document.getElementById(\"sumKMmulti\").innerText = \"\u274c Error: \" + err;\n        document.getElementById(\"sumHoursMulti\").innerText = \"N\/A\";\n        document.getElementById(\"sumQuoteMulti\").innerText = \"\u274c Calculation Failed\";\n        \n        \/\/ Keep submit button DISABLED on any error\n        document.getElementById(\"goStep3multi\").disabled = true;\n        \n        \/\/ FIX #4: Return user to editable Multi-day form, not broken summary\n        document.getElementById(\"multiday-step2\").style.display = \"none\";\n        document.getElementById(\"step1-multiday\").style.display = \"block\";\n        \n        \/\/ Reset map display\n        document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n        document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n        document.getElementById(\"mapContainer\").style.display = \"none\";\n        \n        \/\/ Show visible error message\n        alert(\"Sorry, we could not calculate this multi-day route. Please check the addresses and try again.\");\n        \n        console.log(\"User returned to Multi-day editable form due to calculation error\");\n    }\n});\n\nasync function calculateMultiDayQuote() {\n    const vehicle      = document.querySelector(\"form#multidayForm select[name='vehicle']\").value;\n    const depotAddress = document.querySelector(\"form#multidayForm select[name='depot']\").value;\n    const trailer      = document.querySelector(\"form#multidayForm input[name='trailer']\").checked;\n    const rows         = document.querySelectorAll(\"#multidayTable tbody tr:not(#noDaysRow)\");\n\n    document.getElementById(\"sumDepotMulti\").innerText = depotAddress;\n\n    \/\/ FIX #5: Map depot names to full locations for Google Distance Matrix\n    const depotAddresses = {\n        \"Auckland\": \"Auckland, New Zealand\",\n        \"Christchurch\": \"Christchurch, New Zealand\",\n        \"Queenstown\": \"Queenstown, New Zealand\",\n        \"Wellington\": \"Wellington, New Zealand\",\n        \"Hamilton\": \"Hamilton, New Zealand\",\n        \"Rotorua\": \"Rotorua, New Zealand\"\n    };\n    const depotOrigin = depotAddresses[depotAddress] || (depotAddress + \", New Zealand\");\n\n    let totalKM = 0, totalHours = 0;\n    const firstPickup  = rows[0].children[1].innerText;\n    const startRoute   = await getDistanceAndDurationGoogle(depotOrigin, firstPickup);\n    totalKM    += startRoute.distance;\n    totalHours += startRoute.duration;\n\n    for (let i = 0; i < rows.length; i++) {\n        const pickup = rows[i].children[1].innerText;\n        const dest   = rows[i].children[2].innerText;\n        const r = await getDistanceAndDurationGoogle(pickup, dest);\n        totalKM    += r.distance;\n        totalHours += r.duration;\n    }\n\n    const vehicleCostM = totalKM * (vehicleCosts[vehicle] || 1);\n    const trailerCostM = trailer ? (20 + totalKM * 0.10) : 0;\n    const daysCount    = rows.length;\n    const driverCost   = daysCount * 375;\n    const accomCost    = daysCount * 50;\n    const wages        = driverCost + accomCost;\n    let subtotal = vehicleCostM + trailerCostM + wages;\n    subtotal    += subtotal * 0.10;\n    const finalTotal = subtotal * 1.20;\n\n    document.getElementById(\"selectedVehicleMulti\").innerText = vehicle;\n    document.getElementById(\"sumKMmulti\").innerText           = totalKM.toFixed(2) + \" KM\";\n    document.getElementById(\"sumHoursMulti\").innerText        = totalHours.toFixed(2) + \" hrs\";\n    document.getElementById(\"sumQuoteMulti\").innerText        = \"$\" + finalTotal.toFixed(2);\n    document.getElementById(\"goStep3multi\").disabled          = false;\n}\n\ndocument.getElementById(\"goStep3multi\").addEventListener(\"click\", function () {\n    document.getElementById(\"multiday-step2\").style.display = \"none\";\n    document.getElementById(\"multiday-step3\").style.display = \"block\";\n});\n\n\/\/ Back button: Multiday Step 2 \u2192 Step 1\ndocument.getElementById(\"backBtnMulti\").addEventListener(\"click\", function () {\n    document.getElementById(\"multiday-step2\").style.display = \"none\";\n    document.getElementById(\"step1-multiday\").style.display = \"block\";\n    document.getElementById(\"custom-mainform\").classList.remove(\"map-active\");\n    document.querySelector(\".formcontentdiv\").classList.remove(\"hide\");\n    document.getElementById(\"mapContainer\").style.display = \"none\";\n});\n\ndocument.getElementById(\"multidayForm\").addEventListener(\"submit\", async function (e) {\n    e.preventDefault();\n    let isValid = true;\n    [\"name\",\"email\",\"mobile\"].forEach(n => {\n        const field = document.querySelector(`form#multidayForm input[name='${n}']`);\n        let errorDiv = field.nextElementSibling;\n        if (!errorDiv || !errorDiv.classList.contains(\"error-msg\")) {\n            errorDiv = document.createElement(\"div\"); errorDiv.className = \"error-msg\"; field.parentElement.appendChild(errorDiv);\n        }\n        if (!field.value.trim()) { errorDiv.textContent = \"This field is required\"; errorDiv.style.color = \"red\"; isValid = false; }\n        else errorDiv.textContent = \"\";\n    });\n    if (!isValid) return;\n    await sendMultiDayEmail();\n});\n\nasync function sendMultiDayEmail() {\n    const formData = new FormData();\n    formData.append(\"name\",      document.querySelector(\"form#multidayForm input[name='name']\").value);\n    formData.append(\"email\",     document.querySelector(\"form#multidayForm input[name='email']\").value);\n    formData.append(\"phone\",     document.querySelector(\"form#multidayForm input[name='mobile']\").value);\n    formData.append(\"info\",      document.querySelector(\"form#multidayForm textarea[name='info']\").value);\n    formData.append(\"notes\",     document.querySelector(\"form#multidayForm textarea[name='notes']\").value);\n    formData.append(\"depot\",     document.querySelector(\"form#multidayForm select[name='depot']\").value);\n    formData.append(\"vehicle\",   document.getElementById(\"selectedVehicleMulti\").innerText);\n    formData.append(\"km\",        document.getElementById(\"sumKMmulti\").innerText);\n    formData.append(\"hours\",     document.getElementById(\"sumHoursMulti\").innerText);\n    formData.append(\"quote\",     document.getElementById(\"sumQuoteMulti\").innerText);\n    formData.append(\"days_html\", document.getElementById(\"multi-summary-days\").innerHTML);\n\n    await fetch(\"https:\/\/your-testing-site.com\/cheakykea\/wp-content\/plugins\/qa-plugin-fix\/send-multiday-email.php\", { method: \"POST\", body: formData });\n    alert(\"Quote submitted successfully!\");\n    window.location.reload();\n}\n\n\/\/ ============================================================\n\/\/ Multiday map\n\/\/ ============================================================\nlet multiMap, multiDirectionsService, multiRenderers = [];\n\nfunction initMultiDayMap() {\n    multiMap = new google.maps.Map(document.getElementById(\"routeMap\"), {\n        zoom: 6, center: { lat: -43.5, lng: 172.6 }, \/\/ NZ South Island neutral default\n        styles: mapStyle, zoomControl: false, gestureHandling: \"greedy\",\n        disableDefaultUI: true\n    });\n    multiDirectionsService = new google.maps.DirectionsService();\n}\n\nfunction clearMultiDayRoutes() { multiRenderers.forEach(r => r.setMap(null)); multiRenderers = []; }\n\nasync function drawMultiDayRoutes() {\n    clearMultiDayRoutes();\n    const rows = document.querySelectorAll(\"#multidayTable tbody tr:not(#noDaysRow)\");\n    if (!rows.length) return;\n    const bounds = new google.maps.LatLngBounds();\n    const depotVal = document.querySelector(\"form#multidayForm select[name='depot']\").value;\n    const depotAddresses = {\n        \"Auckland\":      \"Auckland, New Zealand\",\n        \"Christchurch\":  \"Christchurch, New Zealand\",\n        \"Queenstown\":    \"Queenstown, New Zealand\"\n    };\n    const depotOrigin = depotAddresses[depotVal] || depotVal + \", New Zealand\";\n    \/\/ Only draw depot\u2192first pickup leg silently (no renderer \u2014 it's background logistics)\n    \/\/ Then draw each day's actual route with a renderer\n    for (let i = 0; i < rows.length; i++) {\n        const pickup = rows[i].children[1].innerText;\n        const dest   = rows[i].children[2].innerText;\n        \/\/ Suppress markers on intermediate segments; show only on the actual day routes\n        await drawSingleRoute(pickup, dest, bounds, i === 0, i === rows.length - 1);\n    }\n    multiMap.fitBounds(bounds, { top: 55, right: 55, bottom: 55, left: 55 });\n}\n\nfunction drawSingleRoute(origin, destination, bounds, showOriginMarker, showDestMarker) {\n    return new Promise(resolve => {\n        multiDirectionsService.route({ origin, destination, travelMode: google.maps.TravelMode.DRIVING }, (result, status) => {\n            if (status === \"OK\") {\n                const renderer = new google.maps.DirectionsRenderer({\n                    map: multiMap,\n                    preserveViewport: true,\n                    suppressMarkers: false\n                });\n                renderer.setDirections(result);\n                multiRenderers.push(renderer);\n                result.routes[0].overview_path.forEach(p => bounds.extend(p));\n            }\n            resolve();\n        });\n    });\n}\n\n\/\/ ============================================================\n\/\/ Shared utility\n\/\/ ============================================================\n\/\/ ============================================================\n\/\/ Validate that addresses are specific enough for Google\n\/\/ ============================================================\nfunction isAddressSpecific(address) {\n    if (!address || typeof address !== 'string') return false;\n    \n    const address_lower = address.toLowerCase().trim();\n    \n    \/\/ Reject if it's ONLY a country name\n    const countries = ['new zealand', 'nz', 'australia', 'au', 'united states', 'usa', 'uk', 'united kingdom'];\n    if (countries.includes(address_lower)) {\n        return false;\n    }\n    \n    \/\/ Reject very short addresses (likely too vague)\n    if (address.length < 5) {\n        return false;\n    }\n    \n    \/\/ If address is just a single city name without any additional info, reject it\n    \/\/ Good: \"Wellington, New Zealand\" or \"Ellerslie, Auckland\" \n    \/\/ Bad: \"Auckland\" or \"Wellington\" (standing alone)\n    const single_cities = ['auckland', 'wellington', 'christchurch', 'hamilton', 'dunedin'];\n    if (single_cities.includes(address_lower)) {\n        return false; \/\/ Just a city name alone is too vague\n    }\n    \n    return true;\n}\n\nfunction validateAddressForDistanceMatrix(address, label) {\n    if (!isAddressSpecific(address)) {\n        throw new Error(\n            `Address too vague: \"${address}\"\\n\\n` +\n            `Please enter a more specific address. Examples of valid addresses:\\n` +\n            `\u2022 \"123 Queen Street, Auckland, New Zealand\"\\n` +\n            `\u2022 \"Ellerslie, Auckland, New Zealand\"\\n` +\n            `\u2022 \"Wellington, New Zealand\"\\n` +\n            `\u2022 \"Corner of Main and High, Auckland\"\\n\\n` +\n            `Invalid examples (too vague):\\n` +\n            `\u2717 \"New Zealand\" (country name only)\\n` +\n            `\u2717 \"Auckland\" (city name only - need suburb or street)\\n` +\n            `\u2717 \"Wellington\" (city name only)`\n        );\n    }\n    return true;\n}\n\nfunction getDistanceAndDurationGoogle(origin, destination) {\n    return new Promise((resolve, reject) => {\n        \/\/ Validate inputs\n        if (!origin || !destination) {\n            reject(\"Origin or destination is empty\");\n            return;\n        }\n\n        \/\/ Check if Google Maps API is loaded\n        if (typeof google === 'undefined' || !google.maps) {\n            reject(\"Google Maps API not loaded. Please refresh the page.\");\n            return;\n        }\n\n        try {\n            const service = new google.maps.DistanceMatrixService();\n            \n            \/\/ Log what we're sending to Google\n            console.log(\"\ud83d\udccd Distance Matrix Request:\", { origin, destination });\n            \n            service.getDistanceMatrix(\n                { origins: [origin], destinations: [destination], travelMode: google.maps.TravelMode.DRIVING, unitSystem: google.maps.UnitSystem.METRIC },\n                (response, status) => {\n                    try {\n                        console.log(\"\ud83d\udcca Distance Matrix Response Status:\", status);\n                        \n                        if (status !== \"OK\") { \n                            console.error(\"\u274c Distance Matrix Error:\", status);\n                            \n                            \/\/ Provide specific error messages based on status\n                            if (status === \"ZERO_RESULTS\") {\n                                reject(\"Could not find a route between these locations. Please check the addresses are valid.\");\n                            } else if (status === \"OVER_QUERY_LIMIT\") {\n                                reject(\"Google Maps quota exceeded. Please try again in a few moments.\");\n                            } else if (status === \"REQUEST_DENIED\") {\n                                reject(\"Google Maps request denied. API key may be invalid.\");\n                            } else if (status === \"INVALID_REQUEST\") {\n                                reject(\"Invalid location request. Please check addresses format.\");\n                            } else {\n                                reject(\"Distance calculation error: \" + status);\n                            }\n                            return; \n                        }\n                        \n                        const element = response.rows[0].elements[0];\n                        if (!element || element.status !== \"OK\") { \n                            console.error(\"\u274c Route element status:\", element?.status);\n                            reject(\"Could not calculate distance between these locations\"); \n                            return; \n                        }\n                        \n                        const distance = element.distance.value \/ 1000; \/\/ Convert to KM\n                        const duration = element.duration.value \/ 3600; \/\/ Convert to hours\n                        \n                        console.log(\"\u2705 Distance calculated:\", distance.toFixed(2) + \" km, Duration:\", duration.toFixed(2) + \" hours\");\n                        \n                        resolve({ distance, duration });\n                    } catch (err) {\n                        console.error(\"\u274c Error processing distance response:\", err);\n                        reject(\"Error processing distance response: \" + err.message);\n                    }\n                }\n            );\n        } catch (err) {\n            console.error(\"\u274c Distance Matrix error:\", err);\n            reject(\"Distance Matrix error: \" + err.message);\n        }\n    });\n}\n\n\/\/ FIX #2: Handle Google script load failure\nfunction showGoogleApiError() {\n    console.error(\"\u274c Google Maps script failed to load\");\n    const errorDiv = document.getElementById(\"google-api-error\");\n    if (errorDiv) {\n        errorDiv.style.display = \"block\";\n        errorDiv.innerHTML = \"\u26a0\ufe0f Google address search could not load. Please refresh the page or contact support. (Script load failed)\";\n    }\n    \n    \/\/ Disable address inputs\n    document.querySelectorAll('input[id*=\"pickup\"], input[id*=\"destination\"], input[id*=\"multi-pickup\"], input[id*=\"multi-destination\"]').forEach(input => {\n        input.disabled = true;\n        input.placeholder = \"Address search unavailable - please refresh\";\n    });\n    \n    \/\/ Disable Add Stop buttons\n    document.querySelectorAll('.add-stop-btn').forEach(btn => {\n        btn.disabled = true;\n        btn.title = \"Address search unavailable\";\n    });\n}\n\n\/\/ FIX #10: Handle Google Maps authentication\/script load failure\nwindow.gm_authFailure = function() {\n    console.error(\"\u274c Google Maps authentication failed\");\n    const errorDiv = document.getElementById(\"google-api-error\");\n    if (errorDiv) {\n        errorDiv.style.display = \"block\";\n        errorDiv.innerHTML = \"\u26a0\ufe0f Google address search could not load. Please refresh the page or contact support. (Authentication failed)\";\n    }\n    \n    \/\/ Disable all autocomplete inputs\n    document.querySelectorAll('input[id*=\"pickup\"], input[id*=\"destination\"]').forEach(input => {\n        input.disabled = true;\n        input.placeholder = \"Address search unavailable - please refresh\";\n    });\n};\n\nfunction initAll() {\n    \/\/ Check if Google Maps API is available\n    if (typeof google === 'undefined' || !google.maps) {\n        console.error(\"Google Maps API not loaded\");\n        return;\n    }\n\n    try {\n        initGoogleAutocomplete();\n        initTwoWayAutocomplete();\n        initRouteMap();\n        \/\/ Bind stop autocompletes if any already exist\n        oneWayStops.forEach((_, i) => bindStopAutocomplete('oneway', i));\n        twoWayStops.forEach((_, i) => bindStopAutocomplete('twoway', i));\n    } catch (err) {\n        console.error(\"Error initializing calculator: \" + err.message);\n    }\n}\n<\/script>\n\n<script\n    src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyBeod9XS09txJZGGNHYvtuqd4mlKNti2-A&libraries=places&callback=initAll\"\n    async\n    defer\n    onerror=\"if (typeof showGoogleApiError === 'function') showGoogleApiError();\"\n><\/script>\n\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row full_width=&#8221;stretch_row&#8221; equal_height=&#8221;yes&#8221; el_id=&#8221;ck-about-us&#8221; css=&#8221;.vc_custom_1756126752821{padding-right: 15px !important;padding-left: 15px !important;}&#8221;][vc_column css_animation=&#8221;fadeInUp&#8221; el_class=&#8221;ck-about-us-inner&#8221;][vc_row_inner equal_height=&#8221;yes&#8221; content_placement=&#8221;middle&#8221; el_class=&#8221;ck-about-us-row container&#8221;][vc_column_inner el_class=&#8221;ck-about-us-title-col&#8221; width=&#8221;1\/2&#8243;][vc_custom_heading text=&#8221;About Us&#8221; font_container=&#8221;tag:h4|font_size:72|text_align:left|color:%23FFFFFF&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;.vc_custom_1756096862789{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-custom-font&#8221;][vc_column_text css=&#8221;.vc_custom_1756096856732{margin-bottom: 15px !important;}&#8221; el_class=&#8221;ck-under-about-us-title&#8221;]With Cheeky Kea Transport[\/vc_column_text][vc_custom_heading text=&#8221;All your transport needs are in one place!&#8221; font_container=&#8221;tag:h2|font_size:42|text_align:left|color:%23FFFFFF|line_height:56px&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;.vc_custom_1756036301031{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-get-your-quote-col-title ck-about-us-title&#8221;][vc_btn title=&#8221;Contact Us&#8221; css=&#8221;&#8221; el_class=&#8221;ck-contact-us-btn ck-white-btn&#8221; link=&#8221;url:https%3A%2F%2Fyour-testing-site.com%2Fcheakykea%2Fcontact%2F&#8221;][\/vc_column_inner][vc_column_inner el_class=&#8221;ck-about-us-content-col&#8221; width=&#8221;1\/2&#8243;][vc_column_text css=&#8221;.vc_custom_1757039832871{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-about-us-content&#8221;]From tiny to large, and everything in between, Cheeky Kea Transport&#8217;s coachlines can supply the vehicles and the staff required to get you comfortably and safely from A to B. Whether you are looking for an airport transfer or a bus charter, we have clean and modern vehicles with features our competitors do not. Our fleet makes us the transport provider of choice for corporate functions, weddings, tours, schools, events, and much more.[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_section css=&#8221;.vc_custom_1756126856726{padding-top: 210px !important;padding-bottom: 160px !important;}&#8221; el_id=&#8221;ck-icon-box-section&#8221;][vc_row gap=&#8221;20&#8243; el_class=&#8221;ck-icon-box-wrapper&#8221;][vc_column css_animation=&#8221;fadeInLeft&#8221; width=&#8221;1\/3&#8243; el_class=&#8221;ck-icon-box-col&#8221;][vc_single_image image=&#8221;271&#8243; img_size=&#8221;full&#8221; css=&#8221;.vc_custom_1756096989753{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-icon&#8221;][vc_column_text css=&#8221;.vc_custom_1756096881981{margin-bottom: 8px !important;}&#8221; el_class=&#8221;ck-icon-box-sub-title&#8221;]Safety[\/vc_column_text][vc_custom_heading text=&#8221;Your safety is our priority&#8221; font_container=&#8221;tag:h2|font_size:42|text_align:left|color:%23000000|line_height:53px&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;.vc_custom_1756096905797{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-title&#8221;][vc_column_text css=&#8221;.vc_custom_1756096324349{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-icon-box-content&#8221;]We love having fun as much as you do but safety is not something we take lightly. That\u2019s why we constantly train our drivers to make sure you are always in safe hands.[\/vc_column_text][\/vc_column][vc_column css_animation=&#8221;fadeInUp&#8221; width=&#8221;1\/3&#8243; el_class=&#8221;ck-icon-box-col&#8221;][vc_single_image image=&#8221;272&#8243; img_size=&#8221;full&#8221; css=&#8221;.vc_custom_1756096993889{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-icon&#8221;][vc_column_text css=&#8221;.vc_custom_1756097086885{margin-bottom: 8px !important;}&#8221; el_class=&#8221;ck-icon-box-sub-title&#8221;]Competitive Prices[\/vc_column_text][vc_custom_heading text=&#8221;Price beat guaranteed&#8221; font_container=&#8221;tag:h2|font_size:42|text_align:left|color:%23000000|line_height:53px&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;.vc_custom_1756097121957{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-title&#8221;][vc_column_text css=&#8221;.vc_custom_1756097186580{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-icon-box-content&#8221;]We will beat the price of our competitors&#8217;\u00a0quotes for an equivalent vehicle and service without compromising our high-end quality[\/vc_column_text][\/vc_column][vc_column css_animation=&#8221;fadeInRight&#8221; width=&#8221;1\/3&#8243; el_class=&#8221;ck-icon-box-col&#8221;][vc_single_image image=&#8221;273&#8243; img_size=&#8221;full&#8221; css=&#8221;.vc_custom_1756096997825{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-icon&#8221;][vc_column_text css=&#8221;.vc_custom_1756097094020{margin-bottom: 8px !important;}&#8221; el_class=&#8221;ck-icon-box-sub-title&#8221;]Comfort &amp; Quality[\/vc_column_text][vc_custom_heading text=&#8221;Best quality services&#8221; font_container=&#8221;tag:h2|font_size:42|text_align:left|color:%23000000|line_height:53px&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;.vc_custom_1756097127156{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-title&#8221;][vc_column_text css=&#8221;.vc_custom_1756097202397{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-icon-box-content&#8221;]Not only do we take pride in the amazing products we offer, but the quality of the service we provide. That\u2019s why we constantly train our drivers so to maintain that quality service we are known for.[\/vc_column_text][\/vc_column][\/vc_row][\/vc_section][vc_row full_width=&#8221;stretch_row_content&#8221; equal_height=&#8221;yes&#8221; el_id=&#8221;ck-service&#8221; css=&#8221;.vc_custom_1756189270473{padding-right: 15px !important;padding-left: 15px !important;}&#8221;][vc_column css_animation=&#8221;fadeInUp&#8221; el_class=&#8221;ck-service-col-row&#8221;][vc_row_inner el_class=&#8221;ck-service-inner-row container&#8221;][vc_column_inner][vc_custom_heading text=&#8221;Our Services&#8221; font_container=&#8221;tag:h2|font_size:42|text_align:left|color:%23000000|line_height:53px&#8221; use_theme_fonts=&#8221;yes&#8221; css_animation=&#8221;fadeInUp&#8221; css=&#8221;.vc_custom_1756111248315{margin-bottom: 20px !important;}&#8221; el_class=&#8221;ck-icon-box-title&#8221;][vc_column_text css_animation=&#8221;fadeInUp&#8221; css=&#8221;.vc_custom_1759294381741{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-service-content ck-lets-talk-top-content&#8221;]From a quick trip down the road to a four-week New Zealand charter, we have the vehicles and trained staff to do it all.\u00a0Any time, anywhere, we can get you there.[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner equal_height=&#8221;yes&#8221; css=&#8221;.vc_custom_1756189188810{margin-bottom: 50px !important;}&#8221; el_class=&#8221;ck-service-inner-row ck-service-inner-row-wrap container&#8221;][vc_column_inner el_class=&#8221;ck-service-col&#8221; width=&#8221;1\/3&#8243;]    <div class=\"ck-service-item-wrapper\">\n        <div class=\"ck-service-item-inner\">\n            <div class=\"ck-service-item\">\n\t\t\t\t<div class=\"ck-service-item-img\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/your-testing-site.com\/cheakykea\/services\/#01\" target=\"_self\" rel=\"\">\n\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/your-testing-site.com\/cheakykea\/wp-content\/uploads\/2025\/08\/image.jpg\" alt=\"Airport shuttle\">\n\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t                <\/div>\n                <div class=\"ck-service-item-subtitle\">\n                    Airport transfer                <\/div>\n                <div class=\"ck-service-item-title\">\n                    <h4>Airport shuttle<\/h4>\n                <\/div>\n                <div class=\"ck-service-item-content\">\n                    <p>If you need transport to or from the airport, then you&#8217;re in the right place!<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    [\/vc_column_inner][vc_column_inner el_class=&#8221;ck-service-col&#8221; width=&#8221;1\/3&#8243;]    <div class=\"ck-service-item-wrapper\">\n        <div class=\"ck-service-item-inner\">\n            <div class=\"ck-service-item\">\n\t\t\t\t<div class=\"ck-service-item-img\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/your-testing-site.com\/cheakykea\/services\/#02\" target=\"_self\" rel=\"\">\n\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/your-testing-site.com\/cheakykea\/wp-content\/uploads\/2025\/08\/image-1.jpg\" alt=\"Vans &amp; Bus Charters\">\n\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t                <\/div>\n                <div class=\"ck-service-item-subtitle\">\n                    Vans &amp; Bus Charters                <\/div>\n                <div class=\"ck-service-item-title\">\n                    <h4>Vans &amp; Bus Charters<\/h4>\n                <\/div>\n                <div class=\"ck-service-item-content\">\n                    <p>If you want something more private or tailored to your needs then this is the right place for you. Cheeky Kea Transport also offers bus charter services for groups of various sizes anywhere around the South Island.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    [\/vc_column_inner][vc_column_inner el_class=&#8221;ck-service-col&#8221; width=&#8221;1\/3&#8243;]    <div class=\"ck-service-item-wrapper\">\n        <div class=\"ck-service-item-inner\">\n            <div class=\"ck-service-item\">\n\t\t\t\t<div class=\"ck-service-item-img\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/your-testing-site.com\/cheakykea\/services\/#03\" target=\"_self\" rel=\"\">\n\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/your-testing-site.com\/cheakykea\/wp-content\/uploads\/2025\/08\/image-2.jpg\" alt=\"School Trip Transport\">\n\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t                <\/div>\n                <div class=\"ck-service-item-subtitle\">\n                    School Trips                <\/div>\n                <div class=\"ck-service-item-title\">\n                    <h4>School Trip Transport<\/h4>\n                <\/div>\n                <div class=\"ck-service-item-content\">\n                    <p>We know\u00a0that organising a school trip is a big and stressful job.\u00a0 So let us make it easy for you.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    [\/vc_column_inner][\/vc_row_inner][vc_btn title=&#8221;View all Services&#8221; align=&#8221;center&#8221; css_animation=&#8221;fadeInUp&#8221; css=&#8221;&#8221; el_class=&#8221;ck-contact-us-btn ck-transparent-btn&#8221; link=&#8221;url:https%3A%2F%2Fyour-testing-site.com%2Fcheakykea%2Fservices%2F&#8221;][\/vc_column][\/vc_row][vc_section full_width=&#8221;stretch_row&#8221; el_id=&#8221;ck-lets-talk&#8221; css=&#8221;.vc_custom_1756212259993{padding-top: 160px !important;padding-bottom: 160px !important;}&#8221;][vc_row css=&#8221;.vc_custom_1762300594576{padding-left: 50px !important;}&#8221; el_class=&#8221;ck-lets-talk-row-left-padding&#8221;][vc_column css_animation=&#8221;fadeInLeft&#8221; width=&#8221;1\/2&#8243; css=&#8221;.vc_custom_1756120771879{padding-right: 60px !important;}&#8221; el_class=&#8221;ck-lets-talk-title-col&#8221;][vc_column_text css=&#8221;.vc_custom_1756119399537{margin-bottom: 8px !important;}&#8221; el_class=&#8221;ck-icon-box-sub-title&#8221;]Let&#8217;s talk about our fleet[\/vc_column_text][vc_custom_heading text=&#8221;All your transport needs are in one place!&#8221; font_container=&#8221;tag:h2|font_size:42|text_align:left|color:%23000000|line_height:53px&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;ck-icon-box-title&#8221;][vc_btn title=&#8221;Get a Quote&#8221; color=&#8221;white&#8221; css_animation=&#8221;none&#8221; css=&#8221;&#8221; el_class=&#8221;ck-contact-us-btn&#8221; link=&#8221;url:https%3A%2F%2Fyour-testing-site.com%2Fcheakykea%2F%23get-your-quote&#8221;][\/vc_column][vc_column css_animation=&#8221;fadeInRight&#8221; width=&#8221;1\/2&#8243; el_class=&#8221;ck-lets-talk-content-col&#8221; css=&#8221;.vc_custom_1762300743800{padding-top: 10px !important;padding-bottom: 75px !important;}&#8221;][vc_column_text css_animation=&#8221;none&#8221; css=&#8221;.vc_custom_1757041483893{margin-bottom: 0px !important;padding-right: 60px !important;}&#8221; el_class=&#8221;ck-service-content ck-lets-talk-top-content&#8221;]While we might pretend your customer experience is our priority, that\u2019s not entirely true. Safety is at the top of our priority list, which is why:[\/vc_column_text][vc_column_text css=&#8221;.vc_custom_1765255376358{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-lets-talk-list-item&#8221;]<\/p>\n<ul>\n<li>All vehicles have seatbelts<\/li>\n<li>Our drivers are first aid trained<\/li>\n<li>Drivers are regularly trained. We try to keep them up to speed with the latest required training, such as ski field training<\/li>\n<li>All vehicles have daytime running lights<\/li>\n<li>All vehicles are maintained to the highest standard<\/li>\n<\/ul>\n<p>[\/vc_column_text][\/vc_column][\/vc_row][\/vc_section][vc_section el_id=&#8221;ck-testimonial&#8221; css=&#8221;.vc_custom_1756188813067{padding-top: 180px !important;padding-bottom: 180px !important;}&#8221;][vc_row el_class=&#8221;ck-testimonial-row&#8221;][vc_column el_class=&#8221;ck-testimonial-col-wrap&#8221;][vc_column_text css=&#8221;.vc_custom_1756181352048{margin-bottom: 8px !important;}&#8221; el_class=&#8221;ck-testimonial-text&#8221;]<\/p>\n<p style=\"text-align: center;\">Testimonials<\/p>\n<p>[\/vc_column_text]    <div class=\"ck-testimonial-wrapper\">\n        \n                                                <div class=\"ck-testimonial-item\">\n                        <div class=\"ck-testimonial-item-content\">\n                            Such an awesome team! Super flexible and accommodating, great communication. Thanks!                        <\/div>\n                        <div class=\"ck-testimonial-item-title ck-custom-font\">\n                            Ann Marie Daniel                        <\/div>\n                    <\/div>\n                                    <div class=\"ck-testimonial-item\">\n                        <div class=\"ck-testimonial-item-content\">\n                            Highly recommend Cheeky Kea! Our car broke down and I called Cheeky Kea to see if I could get on one of their shuttles to Christchurch. My driver and was incredibly professional &amp; thoughtful. He went out of his way to make sure I could get to the airport to pick up a rental car.                        <\/div>\n                        <div class=\"ck-testimonial-item-title ck-custom-font\">\n                            Allie Z.                        <\/div>\n                    <\/div>\n                                    <div class=\"ck-testimonial-item\">\n                        <div class=\"ck-testimonial-item-content\">\n                            Service was outstanding. The punctual responses to our inquiries and requests (all met), to a great price, and our friendly driver on the day delivering our guests safely in a clean comfortable vehicle, offering to create our &quot;play list&quot; enroute home to give a good finale to the afternoon.                        <\/div>\n                        <div class=\"ck-testimonial-item-title ck-custom-font\">\n                             Alison Kerr                        <\/div>\n                    <\/div>\n                                    <div class=\"ck-testimonial-item\">\n                        <div class=\"ck-testimonial-item-content\">\n                            Outstanding experience. Jesse organised us a van the day before our event and made the entire process seamless. Rodger was a fantastic driver &amp; entertainer. He was welcoming and very accommodating throughout our whole journey. Highly recommend Cheeky Kea transport, thanks team!                        <\/div>\n                        <div class=\"ck-testimonial-item-title ck-custom-font\">\n                            Grace Davies                        <\/div>\n                    <\/div>\n                                    <div class=\"ck-testimonial-item\">\n                        <div class=\"ck-testimonial-item-content\">\n                            Excellent service, comfortable vans and buses, good value and well organised. Our wine tour in Waipara was a great experience with Cheeky Kea, AAA+\n                        <\/div>\n                        <div class=\"ck-testimonial-item-title ck-custom-font\">\n                            Dan Joines                        <\/div>\n                    <\/div>\n                                    \n        \n    <\/div>\n    <!-- Pagination -->\n    <div class=\"ck-testimonial-number-pagi\"><\/div>\n    [\/vc_column][\/vc_row][\/vc_section]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row full_width=&#8221;stretch_row_content&#8221; css=&#8221;.vc_custom_1756106367850{padding-top: 0px !important;padding-right: 15px !important;padding-bottom: 0px !important;padding-left: 15px !important;}&#8221; el_id=&#8221;ck-hero&#8221;][vc_column][vc_raw_html css=&#8221;&#8221;]JTNDZGl2JTIwY2xhc3MlM0QlMjJjay1yZXYtY291bnRlciUyMiUzRSUzQyUyRmRpdiUzRQ==[\/vc_raw_html][\/vc_column][\/vc_row][vc_row full_width=&#8221;stretch_row_content_no_spaces&#8221; full_height=&#8221;yes&#8221; equal_height=&#8221;yes&#8221; css=&#8221;.vc_custom_1766520103742{margin-top: 50px !important;}&#8221;][vc_column el_id=&#8221;get-your-quote&#8221;][vc_column_text css=&#8221;&#8221;][\/vc_column_text][\/vc_column][\/vc_row][vc_row full_width=&#8221;stretch_row&#8221; equal_height=&#8221;yes&#8221; el_id=&#8221;ck-about-us&#8221; css=&#8221;.vc_custom_1756126752821{padding-right: 15px !important;padding-left: 15px !important;}&#8221;][vc_column css_animation=&#8221;fadeInUp&#8221; el_class=&#8221;ck-about-us-inner&#8221;][vc_row_inner equal_height=&#8221;yes&#8221; content_placement=&#8221;middle&#8221; el_class=&#8221;ck-about-us-row container&#8221;][vc_column_inner el_class=&#8221;ck-about-us-title-col&#8221; width=&#8221;1\/2&#8243;][vc_custom_heading text=&#8221;About Us&#8221; font_container=&#8221;tag:h4|font_size:72|text_align:left|color:%23FFFFFF&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;.vc_custom_1756096862789{margin-bottom: 0px !important;}&#8221; el_class=&#8221;ck-custom-font&#8221;][vc_column_text css=&#8221;.vc_custom_1756096856732{margin-bottom: 15px !important;}&#8221; el_class=&#8221;ck-under-about-us-title&#8221;]With Cheeky Kea Transport[\/vc_column_text][vc_custom_heading text=&#8221;All your transport [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"0","ocean_second_sidebar":"0","ocean_disable_margins":"on","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"0","ocean_custom_header_template":"0","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"0","ocean_menu_typo_font_family":"0","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"0","footnotes":""},"class_list":["post-13","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/pages\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":161,"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/pages\/13\/revisions"}],"predecessor-version":[{"id":1135,"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/pages\/13\/revisions\/1135"}],"wp:attachment":[{"href":"https:\/\/your-testing-site.com\/cheakykea\/wp-json\/wp\/v2\/media?parent=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}