{"id":797,"date":"2024-11-15T04:10:10","date_gmt":"2024-11-15T04:10:10","guid":{"rendered":"https:\/\/escapeintime.vn\/?page_id=797"},"modified":"2025-01-23T09:00:55","modified_gmt":"2025-01-23T02:00:55","slug":"book-appointment","status":"publish","type":"page","link":"https:\/\/escapeintime.vn\/en\/book-appointment\/","title":{"rendered":"Book now"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"797\" class=\"elementor elementor-797\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6e79b75 e-flex e-con-boxed e-con e-parent\" data-id=\"6e79b75\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-33eebef elementor-widget elementor-widget-shortcode\" data-id=\"33eebef\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-shortcode\"><style>\n        .container {\n            max-width: 800px;\n            margin: 0 auto;\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n        }\n        h1,h2 {\n            color:white !important;\n            text-align: center;\n            margin-bottom: 20px;\n        }\n        label {\n            display: block;\n            margin: 10px 0 5px;\n            font-weight: bold;\n        }\n        input, select, textarea {\n            width: 100%;\n            padding: 10px;\n            margin-bottom: 15px;\n            border: 1px solid #ccc;\n            border-radius: 5px;\n        }\n        .tabs {\n            display: flex;\n            margin-bottom: 20px;\n        }\n        .tab {\n            flex: 1;\n            text-align: center;\n            padding: 10px;\n            border: 1px solid #ccc;\n            background: #f9f9f9;\n            cursor: pointer;\n            transition: background 0.3s;\n        }\n        .tab.active {\n            background: #ddd;\n            font-weight: bold;\n        }\n        .tab:hover {\n            background: #e9e9e9;\n        }\n        .tab-content {\n            display: none;\n        }\n        .tab-content.active {\n            display: block;\n        }\n        .time-slots {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n        }\n        .time-slot {\n            flex: 1 0 calc(33.33% - 10px);\n            padding: 10px;\n            border: 1px solid #ccc;\n            text-align: center;\n            cursor: pointer;\n            border-radius: 5px;\n            background: #f9f9f9;\n            transition: background 0.3s;\n        }\n        .time-slot.booked {\n            background: #E23125;\n            cursor: not-allowed;\n        }\n        .time-slot.selected {\n            background: #E23125;\n            color: white;\n        }\n        .time-slot:hover:not(.booked) {\n            background: #e0e0e0;\n        }\n        button {\n            background: #E23125;\n            color: white;\n            padding: 10px 20px;\n            border: none;\n            border-radius: 5px;\n            cursor: pointer;\n            font-size: 16px;\n            transition: background 0.3s;\n        }\n        button:hover {\n            background: #0056b3;\n        }\n\t.form-container {\n    display: flex;\n    gap: 20px;\n\talign-items:center;\n}\n\n.form-column {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n}\n\n.button-container {\n    display: flex;\n    justify-content: center; \/* Horizontally center *\/\n    align-items: center;    \/* Vertically center *\/\n    margin-top: 20px;       \/* Add spacing from the form *\/\n}\n.hidden {\n    display: none;\n}\n\n.tab-content {\n    display: none;\n}\n\n.tab-content.active {\n    display: block;\n}\n\n.tab {\n    cursor: pointer;\n}\n\n.tab.active {\n    font-weight: bold;\n    background-color: #ddd;\n}\n\n    <\/style>\n<div class=\"container\">\n    <h1>Room Booking<\/h1>\n\n    <form id=\"booking-form\">\n        <!-- User Information Form -->\n        <div class=\"form-container\">\n            <div class=\"form-column\">\n                <label for=\"name\">Name:<\/label>\n                <input type=\"text\" id=\"name\" placeholder=\"Enter your name\" required>\n\n                <label for=\"phone\">Phone Number:<\/label>\n                <input type=\"tel\" id=\"phone\" placeholder=\"Enter your phone number\" required>\n            <\/div>\n\n            <div class=\"form-column\">\n                <label for=\"email\">Email Address:<\/label>\n                <input type=\"email\" id=\"email\" placeholder=\"Enter your email address\" required>\n\n                <label for=\"user-type\">You are:<\/label>\n                <select name=\"user-type\" id=\"user-type\" required>\n                    <option value=\"\" disabled selected>--Select type--<\/option>\n                    <option value=\"student\">Student<\/option>\n                    <option value=\"non-student\">Non-student<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <!-- Form Section: Location first, then Room -->\n        <div class=\"form-container\">\n            <div class=\"form-column\">\n                <label for=\"location-select\">Select location<\/label>\n                <select id=\"location-select\" required>\n                    <option value=\"\" disabled selected>-- Select location --<\/option>\n                    <option value=\"ngoquyen\">377 Ng\u00f4 Quy\u1ec1n, An H\u1ea3i, \u0110\u00e0 N\u1eb5ng<\/option>\n                    <option value=\"nguyenchithanh\">133 Nguyen Chi Thanh, Hai Chau, Da Nang<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"form-column\">\n                <label for=\"room-select\">Select Room:<\/label>\n                <select id=\"room-select\" required disabled>\n                    <option value=\"\" disabled selected>-- Select location first --<\/option>\n                    <option value=\"Room 1704\" data-location=\"ngoquyen\" data-max-participants=\"10\">Room 1704<\/option>\n                    <option value=\"Blood Dragon\" data-location=\"ngoquyen\" data-max-participants=\"8\">Blood Dragon<\/option>\n                    <option value=\"SawCantation\" data-location=\"ngoquyen\" data-max-participants=\"11\">SawCantation<\/option>\n                    <option value=\"Forbidden Magic\" data-location=\"nguyenchithanh\" data-max-participants=\"10\">Forbidden Magic<\/option>\n                    <option value=\"Haunted Love\" data-location=\"nguyenchithanh\" data-max-participants=\"8\">Haunted Love<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n        <div class=\"form-container\">\n            <div class=\"form-column\">\n                <label for=\"participants\">Players:<\/label>\n                <select id=\"participants\" required>\n                    <option value=\"\" disabled selected>- Number of People<\/option>\n                <\/select>\n            <\/div>\n\n            <div class=\"form-column\">\n                <label for=\"date\">Choose date<\/label>\n                <input type=\"date\" id=\"date\" required class=\"styled-date\">\n            <\/div>\n        <\/div>\n\n        <!-- Tabs for 60 min and 120 min options -->\n        <div class=\"tabs hidden\">\n            <div class=\"tab active\" data-target=\"60min\">60 minutes<\/div>\n            <div class=\"tab\" data-target=\"120min\">120 minutes<\/div>\n        <\/div>\n\n        <!-- Time Slot Sections -->\n        <div id=\"60min\" class=\"tab-content hidden\">\n            <h2>60 minutes<\/h2>\n            <div class=\"time-slots\" id=\"slots-60min\"><\/div>\n        <\/div>\n        <div id=\"120min\" class=\"tab-content hidden\">\n            <h2>120 minutes<\/h2>\n            <div class=\"time-slots\" id=\"slots-120min\"><\/div>\n        <\/div>\n\n        <div class=\"button-container\">\n            <button type=\"submit\">Book now<\/button>\n        <\/div>\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>\n<\/div>\n\n\n<script>\n\/\/ document.getElementById('date').min = new Date().toISOString().split('T')[0];\n\ndocument.addEventListener('DOMContentLoaded', () => {\n        const locationSelect = document.getElementById('location-select');\n        const roomSelect = document.getElementById('room-select');\n        const participantsSelect = document.getElementById('participants');\n        const dateInput = document.getElementById('date');\n        const today = new Date().toISOString().split('T')[0];\n        dateInput.setAttribute('min', today);\n        const dateLockNotice = document.getElementById('date-lock-notice');\n\n        dateInput.addEventListener('change', () => {\n            if (dateInput.value && dateInput.value < today) {\n                dateInput.value = today;\n            }\n            if (roomSelect.value === 'Forbidden Magic' && dateInput.value === LOCKED_DATE_FORBIDDEN_MAGIC) {\n                dateInput.value = '';\n                if (dateLockNotice) dateLockNotice.style.display = 'block';\n                alert('Ng\u00e0y 6\/2\/2026 kh\u00f4ng kh\u1ea3 d\u1ee5ng cho \u0111\u1ecba \u0111i\u1ec3m 133 Nguy\u1ec5n Ch\u00ed Thanh, H\u1ea3i Ch\u00e2u, \u0110\u00e0 N\u1eb5ng. Vui l\u00f2ng ch\u1ecdn ng\u00e0y kh\u00e1c.');\n            }\n        });\n\n        \/\/ Store room options by location (clone so we can repopulate)\n        const roomOptionsByLocation = { ngoquyen: [], nguyenchithanh: [] };\n        roomSelect.querySelectorAll('option[data-location]').forEach((opt) => {\n            const loc = opt.getAttribute('data-location');\n            if (roomOptionsByLocation[loc]) roomOptionsByLocation[loc].push(opt.cloneNode(true));\n        });\n        roomSelect.innerHTML = '';\n        const placeholders = { none: '-- Ch\u1ecdn \u0111\u1ecba \u0111i\u1ec3m tr\u01b0\u1edbc --', chosen: '-- Ch\u1ecdn ph\u00f2ng --' };\n\n        function setRoomOptionsForLocation(loc) {\n            roomSelect.innerHTML = '';\n            const ph = document.createElement('option');\n            ph.value = '';\n            ph.disabled = true;\n            ph.selected = true;\n            ph.textContent = loc ? placeholders.chosen : placeholders.none;\n            roomSelect.appendChild(ph);\n            if (loc && roomOptionsByLocation[loc]) {\n                roomOptionsByLocation[loc].forEach((cloned) => roomSelect.appendChild(cloned.cloneNode(true)));\n                roomSelect.disabled = false;\n            } else {\n                roomSelect.disabled = true;\n            }\n            roomSelect.value = '';\n            participantsSelect.innerHTML = '<option value=\"\" disabled selected>-- Ch\u1ecdn s\u1ed1 ng\u01b0\u1eddi --<\/option>';\n        }\n        setRoomOptionsForLocation(locationSelect.value);\n\n        locationSelect.addEventListener('change', () => {\n            setRoomOptionsForLocation(locationSelect.value);\n            roomSelect.dispatchEvent(new Event('change'));\n        });\n\n        \/\/ Function to populate participant options based on room\n        const updateParticipantsOptions = (maxParticipants) => {\n            participantsSelect.innerHTML = '<option value=\"\" disabled selected>-- Ch\u1ecdn s\u1ed1 ng\u01b0\u1eddi --<\/option>';\n            for (let i = 2; i <= maxParticipants; i++) {\n                const option = document.createElement('option');\n                option.value = i;\n                option.textContent = i;\n                participantsSelect.appendChild(option);\n            }\n        };\n\n        \/\/ Event listener for room selection (do not reset location)\n        roomSelect.addEventListener('change', () => {\n            const selectedRoom = roomSelect.options[roomSelect.selectedIndex];\n            const maxParticipants = selectedRoom.getAttribute('data-max-participants');\n            if (maxParticipants) updateParticipantsOptions(parseInt(maxParticipants, 10));\n            if (dateLockNotice) {\n                dateLockNotice.style.display = (roomSelect.value === 'Forbidden Magic') ? 'block' : 'none';\n            }\n            if (roomSelect.value === 'Forbidden Magic' && dateInput.value === LOCKED_DATE_FORBIDDEN_MAGIC) {\n                dateInput.value = '';\n            }\n        });\n    });\n\n\/\/ Generate time slots with fixed intervals\nfunction generateFixedTimeSlots(room) {\n    const baseSlots = [\n        \"09:45\",\n        \"11:00\",\n        \"12:15\",\n        \"13:30\",\n        \"14:45\",\n        \"16:00\",\n        \"17:15\",\n        \"18:30\",\n        \"19:45\",\n        \"21:00\",\n    ];\n\n    \/\/ Forbidden Magic: 9:30 - 22:00, same ~75 min spacing\n    if (room === 'Forbidden Magic') {\n        return [\n            \"09:30\", \"10:45\", \"12:00\", \"13:15\", \"14:30\", \"15:45\",\n            \"17:00\", \"18:15\", \"19:30\", \"20:45\"\n        ];\n    }\n\n    \/\/ Haunted Love: 09:30 - 21:45, 75-min spacing\n    if (room === 'Haunted Love') {\n        return [\n            \"09:30\", \"10:45\", \"12:00\", \"13:15\", \"14:30\", \"15:45\",\n            \"17:00\", \"18:15\", \"19:30\", \"20:45\"\n        ];\n    }\n\n    if (room === 'SawCantation') {\n        return baseSlots.map((t) => adjustTimeByMinutes(t, -15));\n    }\n\n    return baseSlots;\n}\n\n\/\/ Adjust a HH:MM time string by a number of minutes (can be negative)\nfunction adjustTimeByMinutes(time, deltaMinutes) {\n    const [hours, minutes] = time.split(':').map(Number);\n    const total = hours * 60 + minutes + deltaMinutes;\n    const normalized = Math.max(0, total); \/\/ prevent negative times\n    const newHours = Math.floor(normalized \/ 60);\n    const newMinutes = normalized % 60;\n    return `${String(newHours).padStart(2, '0')}:${String(newMinutes).padStart(2, '0')}`;\n}\n\/\/ Check if a slot conflicts with booked slots\nfunction isSlotConflicting(startTime, duration, bookedSlots) {\n    const slotEndTime = calculateEndTime(startTime, duration);\n\n    return bookedSlots.some((bookedSlot) => {\n        const [bookedStart, bookedEnd] = bookedSlot.split(' - ');\n        return (\n            (startTime >= bookedStart && startTime < bookedEnd) || \/\/ Starts within a booked slot\n            (slotEndTime > bookedStart && slotEndTime <= bookedEnd) || \/\/ Ends within a booked slot\n            (startTime <= bookedStart && slotEndTime >= bookedEnd) \/\/ Completely overlaps a booked slot\n        );\n    });\n}\n\t\n\t\/\/ Calculate end time based on duration\nfunction calculateEndTime(startTime, duration) {\n    const [hours, minutes] = startTime.split(':').map(Number);\n    const endMinutes = minutes + duration;\n    const endHours = hours + Math.floor(endMinutes \/ 60);\n    const finalMinutes = endMinutes % 60;\n    return `${String(endHours).padStart(2, '0')}:${String(finalMinutes).padStart(2, '0')}`;\n}\n\/\/ Render slots dynamically\nfunction renderSlots(containerId, slots, room, bookedSlots, duration) {\n    const container = document.getElementById(containerId);\n    container.innerHTML = ''; \/\/ Clear previous slots\n\n    slots.forEach((startTime) => {\n        const slotEndTime = calculateEndTime(startTime, duration);\n        const slotLabel = `${startTime} - ${slotEndTime}`;\n\n        const isConflicting = isSlotConflicting(startTime, duration, bookedSlots);\n\n        const slotDiv = document.createElement('div');\n        slotDiv.className = 'time-slot';\n        slotDiv.textContent = startTime; \/\/ Display only start time\n        slotDiv.dataset.slot = slotLabel;\n        slotDiv.dataset.room = room;\n\n        if (isConflicting) {\n            slotDiv.classList.add('booked');\n            slotDiv.style.pointerEvents = 'none';\n        } else {\n            slotDiv.addEventListener('click', () => selectSlot(slotDiv));\n        }\n\n        container.appendChild(slotDiv);\n    });\n}\n\n\/\/ Select a slot\nfunction selectSlot(element) {\n    document.querySelectorAll('.time-slot.selected').forEach((el) => el.classList.remove('selected'));\n    element.classList.add('selected');\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n    const locationSelect = document.getElementById('location-select');\n    const roomSelect = document.getElementById('room-select');\n    const participantsSelect = document.getElementById('participants');\n    const dateInput = document.getElementById('date');\n    const tabs = document.querySelector('.tabs');\n    const tabContents = document.querySelectorAll('.tab-content');\n    const firstTab = document.querySelector('.tab[data-target=\"60min\"]');\n    const firstTabContent = document.getElementById('60min');\n\n    \/\/ Function to check if the form is fully filled (location, room, participants, date)\n    function validateForm() {\n        const location = locationSelect.value;\n        const room = roomSelect.value;\n        const participants = participantsSelect.value;\n        const date = dateInput.value;\n\n        if (location && room && participants && date) {\n            tabs.classList.remove('hidden');\n            tabContents.forEach((content) => content.classList.remove('hidden'));\n\n            \/\/ Always activate the first tab and its content\n            document.querySelectorAll('.tab').forEach((tab) => tab.classList.remove('active'));\n            document.querySelectorAll('.tab-content').forEach((content) => content.classList.remove('active'));\n\n            firstTab.classList.add('active');\n            firstTabContent.classList.add('active');\n        } else {\n            tabs.classList.add('hidden');\n            tabContents.forEach((content) => content.classList.add('hidden'));\n        }\n    }\n\n    \/\/ Add event listeners to form fields\n    locationSelect.addEventListener('change', validateForm);\n    roomSelect.addEventListener('change', validateForm);\n    participantsSelect.addEventListener('change', validateForm);\n    dateInput.addEventListener('input', validateForm);\n\n    \/\/ Tab switching logic\n    document.querySelectorAll('.tab').forEach((tab) => {\n        tab.addEventListener('click', () => {\n            document.querySelectorAll('.tab').forEach((t) => t.classList.remove('active'));\n            document.querySelectorAll('.tab-content').forEach((content) => content.classList.remove('active'));\n\n            tab.classList.add('active');\n            const targetContent = document.getElementById(tab.dataset.target);\n            if (targetContent) {\n                targetContent.classList.add('active');\n            }\n        });\n    });\n});\n\n\n\n\/\/ Fetch booked slots from the server\nasync function fetchBookedSlots(room, date) {\n    try {\n        const response = await fetch(`https:\/\/escapeintime.vn\/wp-admin\/admin-ajax.php?action=get_booked_slots&room=${room}&date=${date}`);\n        if (!response.ok) {\n            throw new Error('Failed to fetch booked slots.');\n        }\n        return await response.json();\n    } catch (error) {\n        console.error(error);\n        alert('Unable to fetch booked slots. Please try again.');\n        return [];\n    }\n}\n\n\/\/ Update time slots dynamically\nasync function updateSlots(room, date) {\n    const bookedSlots = await fetchBookedSlots(room, date);\n    const fixedSlots = generateFixedTimeSlots(room);\n    \/\/ Forbidden Magic: 120-min slots now include 20:45 and 21:00 starts\n    const slots120 = (room === 'Forbidden Magic')\n        ? fixedSlots.filter((start) => start <= '21:00')\n        : (room === 'Haunted Love')\n            ? fixedSlots.filter((start) => start <= '20:30')\n            : fixedSlots;\n\n    renderSlots('slots-60min', fixedSlots, room, bookedSlots, 60);\n    renderSlots('slots-120min', slots120, room, bookedSlots, 120);\n}\n\n\/\/ Initialize the booking system\nasync function initBookingSystem() {\n    const roomSelect = document.getElementById('room-select');\n    const dateInput = document.getElementById('date');\n\n    const initialRoom = roomSelect.value;\n    const initialDate = dateInput.value;\n\n    if (initialRoom && initialDate) {\n        await updateSlots(initialRoom, initialDate);\n    }\n\n    roomSelect.addEventListener('change', async () => {\n        const room = roomSelect.value;\n        const date = dateInput.value;\n        if (room && date) {\n            await updateSlots(room, date);\n        }\n    });\n\n    dateInput.addEventListener('change', async () => {\n        const date = dateInput.value;\n        const room = roomSelect.value;\n        if (room && date) {\n            await updateSlots(room, date);\n        }\n    });\n}\n\n\/\/ Handle form submission with validation\nasync function handleFormSubmission() {\n    document.querySelector(\"button[type='submit']\").addEventListener('click', async (event) => {\n        event.preventDefault();\n\n        \/\/ Validate required fields\n        if (!validateForm()) return; \/\/ Stop if validation fails\n\n        const room = document.getElementById('room-select').value;\n        const date = document.getElementById('date').value;\n        if (room === 'Forbidden Magic' && date === LOCKED_DATE_FORBIDDEN_MAGIC) {\n            alert('Ng\u00e0y 6\/2\/2026 kh\u00f4ng kh\u1ea3 d\u1ee5ng cho \u0111\u1ecba \u0111i\u1ec3m 133 Nguy\u1ec5n Ch\u00ed Thanh. Vui l\u00f2ng ch\u1ecdn ng\u00e0y kh\u00e1c.');\n            return;\n        }\n\n        const selectedSlot = document.querySelector('.time-slot.selected');\n        if (!selectedSlot) {\n            alert('Please select a time slot.');\n            return;\n        }\n\n        const formData = new FormData();\n        formData.append('action', 'process_booking');\n        formData.append('name', document.getElementById('name').value);\n        formData.append('email', document.getElementById('email').value);\n        formData.append('phone', document.getElementById('phone').value);\n        formData.append('date', document.getElementById('date').value);\n        formData.append('room', document.getElementById('room-select').value);\n        formData.append('participants', document.getElementById('participants').value);\n        formData.append('userType', document.getElementById('user-type').value);\n        formData.append('slot', selectedSlot.dataset.slot);\n\n        try {\n            const response = await fetch(\"https:\/\/escapeintime.vn\/wp-admin\/admin-ajax.php\", {\n                method: 'POST',\n                body: formData,\n            });\n\n            const result = await response.json();\n            if (result.success) {\n                alert(result.message || 'Booking processed successfully.');\n                const room = document.getElementById('room-select').value;\n                const date = document.getElementById('date').value;\n                await updateSlots(room, date); \/\/ Refresh slots after booking\n            } else {\n                alert(result.message || 'Booking failed.');\n            }\n        } catch (error) {\n            console.error('Error submitting booking:', error);\n            alert('An error occurred. Please try again.');\n        }\n    });\n}\n\n\/\/ Locked date for Forbidden Magic (133 Nguy\u1ec5n Ch\u00ed Thanh) - not available for booking\nconst LOCKED_DATE_FORBIDDEN_MAGIC = '2026-02-06';\n\n\/\/ Validate required form fields\nfunction validateForm() {\n    const requiredFields = ['name', 'email', 'phone', 'date', 'location-select', 'room-select', 'participants', 'user-type'];\n    let isValid = true;\n\n    requiredFields.forEach(field => {\n        const element = document.getElementById(field);\n        if (!element.value.trim()) {\n            isValid = false;\n            element.style.border = \"2px solid red\"; \/\/ Highlight empty fields\n            element.setCustomValidity(\"This field is required.\");\n        } else {\n            element.style.border = \"\"; \/\/ Reset border if field is filled\n            element.setCustomValidity(\"\");\n        }\n    });\n\n    if (!isValid) {\n        alert(\"Please fill in all required fields before submitting.\");\n    }\n\n    return isValid;\n}\n\n\/\/ Initialize the booking system\ninitBookingSystem();\nhandleFormSubmission();\n\n<\/script>\n\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-797","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u0110\u1eb7t ph\u00f2ng - Escape In Time<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/escapeintime.vn\/en\/book-appointment\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0110\u1eb7t ph\u00f2ng - Escape In Time\" \/>\n<meta property=\"og:url\" content=\"https:\/\/escapeintime.vn\/en\/book-appointment\/\" \/>\n<meta property=\"og:site_name\" content=\"Escape In Time\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/escapeintime.vn\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-23T02:00:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/escapeintime.vn\/wp-content\/uploads\/2025\/03\/481051932_122136945770577148_7613651333272878880_n.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1958\" \/>\n\t<meta property=\"og:image:height\" content=\"745\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/escapeintime.vn\/book-appointment\/\",\"url\":\"https:\/\/escapeintime.vn\/book-appointment\/\",\"name\":\"\u0110\u1eb7t ph\u00f2ng - Escape In Time\",\"isPartOf\":{\"@id\":\"https:\/\/escapeintime.vn\/#website\"},\"datePublished\":\"2024-11-15T04:10:10+00:00\",\"dateModified\":\"2025-01-23T02:00:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/escapeintime.vn\/book-appointment\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/escapeintime.vn\/book-appointment\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/escapeintime.vn\/book-appointment\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Trang ch\u1ee7\",\"item\":\"https:\/\/escapeintime.vn\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0110\u1eb7t ph\u00f2ng\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/escapeintime.vn\/#website\",\"url\":\"https:\/\/escapeintime.vn\/\",\"name\":\"Escape In Time\",\"description\":\"Escape Room T\u1ea1i \u0110\u00e0 N\u1eb5ng\",\"publisher\":{\"@id\":\"https:\/\/escapeintime.vn\/#organization\"},\"alternateName\":\"Escape Room in Danang\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/escapeintime.vn\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/escapeintime.vn\/#organization\",\"name\":\"Escape In Time\",\"url\":\"https:\/\/escapeintime.vn\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/escapeintime.vn\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/escapeintime.vn\/wp-content\/uploads\/2024\/09\/cropped-non_backgrd.png\",\"contentUrl\":\"https:\/\/escapeintime.vn\/wp-content\/uploads\/2024\/09\/cropped-non_backgrd.png\",\"width\":512,\"height\":512,\"caption\":\"Escape In Time\"},\"image\":{\"@id\":\"https:\/\/escapeintime.vn\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/escapeintime.vn\",\"https:\/\/www.instagram.com\/escapeintime.vn\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u0110\u1eb7t ph\u00f2ng - Escape In Time","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/escapeintime.vn\/en\/book-appointment\/","og_locale":"en_US","og_type":"article","og_title":"\u0110\u1eb7t ph\u00f2ng - Escape In Time","og_url":"https:\/\/escapeintime.vn\/en\/book-appointment\/","og_site_name":"Escape In Time","article_publisher":"https:\/\/www.facebook.com\/escapeintime.vn","article_modified_time":"2025-01-23T02:00:55+00:00","og_image":[{"width":1958,"height":745,"url":"https:\/\/escapeintime.vn\/wp-content\/uploads\/2025\/03\/481051932_122136945770577148_7613651333272878880_n.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/escapeintime.vn\/book-appointment\/","url":"https:\/\/escapeintime.vn\/book-appointment\/","name":"\u0110\u1eb7t ph\u00f2ng - Escape In Time","isPartOf":{"@id":"https:\/\/escapeintime.vn\/#website"},"datePublished":"2024-11-15T04:10:10+00:00","dateModified":"2025-01-23T02:00:55+00:00","breadcrumb":{"@id":"https:\/\/escapeintime.vn\/book-appointment\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/escapeintime.vn\/book-appointment\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/escapeintime.vn\/book-appointment\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Trang ch\u1ee7","item":"https:\/\/escapeintime.vn\/"},{"@type":"ListItem","position":2,"name":"\u0110\u1eb7t ph\u00f2ng"}]},{"@type":"WebSite","@id":"https:\/\/escapeintime.vn\/#website","url":"https:\/\/escapeintime.vn\/","name":"Escape In Time","description":"Escape Room T\u1ea1i \u0110\u00e0 N\u1eb5ng","publisher":{"@id":"https:\/\/escapeintime.vn\/#organization"},"alternateName":"Escape Room in Danang","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/escapeintime.vn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/escapeintime.vn\/#organization","name":"Escape In Time","url":"https:\/\/escapeintime.vn\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/escapeintime.vn\/#\/schema\/logo\/image\/","url":"https:\/\/escapeintime.vn\/wp-content\/uploads\/2024\/09\/cropped-non_backgrd.png","contentUrl":"https:\/\/escapeintime.vn\/wp-content\/uploads\/2024\/09\/cropped-non_backgrd.png","width":512,"height":512,"caption":"Escape In Time"},"image":{"@id":"https:\/\/escapeintime.vn\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/escapeintime.vn","https:\/\/www.instagram.com\/escapeintime.vn\/"]}]}},"_links":{"self":[{"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/pages\/797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/comments?post=797"}],"version-history":[{"count":23,"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/pages\/797\/revisions"}],"predecessor-version":[{"id":1286,"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/pages\/797\/revisions\/1286"}],"wp:attachment":[{"href":"https:\/\/escapeintime.vn\/en\/wp-json\/wp\/v2\/media?parent=797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}