

{"id":1210,"date":"2023-08-23T17:45:07","date_gmt":"2023-08-23T17:45:07","guid":{"rendered":"https:\/\/corkandbeanoshawa.com\/oshawa\/?page_id=1210"},"modified":"2025-12-03T19:56:47","modified_gmt":"2025-12-03T19:56:47","slug":"live-music","status":"publish","type":"page","link":"https:\/\/corkandbean.ca\/oshawa\/live-music\/","title":{"rendered":"Live Music"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1210\" class=\"elementor elementor-1210\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cd073f8 elementor-section-full_width elementor-section-height-min-height elementor-section-height-default elementor-section-items-middle\" data-id=\"cd073f8\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5332c9b\" data-id=\"5332c9b\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-67336db elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"67336db\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-bf11b8b\" data-id=\"bf11b8b\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0bb4344 elementor-widget elementor-widget-heading\" data-id=\"0bb4344\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.16.0 - 09-10-2023 *\/\n.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}<\/style><h1 class=\"elementor-heading-title elementor-size-default\">Live Music every Friday and Saturday from 7pm - 10pm<\/h1>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c7b54ea elementor-section-full_width private-parties event-section active elementor-section-height-default elementor-section-height-default\" data-id=\"c7b54ea\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0073a44\" data-id=\"0073a44\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-ea53b8a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ea53b8a\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-80bb4ac\" data-id=\"80bb4ac\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d17c025 elementor-widget elementor-widget-text-editor\" data-id=\"d17c025\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.16.0 - 09-10-2023 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-8 text-message flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"14c748e7-567f-47d2-a862-4e0709bc762d\" data-message-model-slug=\"gpt-4o\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert dark\">\n<p>Are you a talented musician looking to perform at Cork &amp; Bean? Let us know your availability by filling out this form, and we\u2019ll be in touch soon!<\/p><\/div><\/div><\/div><\/div>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-acfbfca elementor-widget elementor-widget-shortcode\" data-id=\"acfbfca\" 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>\r\n      #cb-inquiry-form textarea{\r\n        width: 100%;\r\n            padding: 10px;\r\n            margin-bottom: 10px;\r\n            border: 1px solid #ccc;\r\n            border-radius: 4px;\r\n            resize:none;\r\n      }\r\n    <\/style>\r\n\r\n    <div id=\"cb-inquiry-form\">\r\n\r\n        \n    <style>\n        \/* Available nights read as available: bold with a gold wash, even\n           when they show in the next month's row; taken ones fade out *\/\n        .flatpickr-calendar .flatpickr-day:not(.flatpickr-disabled) { color: #1f1f1f; font-weight: 700; background: rgba(200, 161, 90, .16); border-color: transparent; }\n        .flatpickr-calendar .flatpickr-day.nextMonthDay:not(.flatpickr-disabled),\n        .flatpickr-calendar .flatpickr-day.prevMonthDay:not(.flatpickr-disabled) { color: #1f1f1f; }\n        .flatpickr-calendar .flatpickr-day:not(.flatpickr-disabled):hover { background: #c8a15a; border-color: #c8a15a; color: #1b1510; }\n        .flatpickr-calendar .flatpickr-day.selected,\n        .flatpickr-calendar .flatpickr-day.selected:hover { background: #c8a15a; border-color: #c8a15a; color: #1b1510; }\n        .flatpickr-calendar .flatpickr-day.flatpickr-disabled,\n        .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover { color: rgba(57, 57, 57, .2); background: transparent; font-weight: 400; }\n\n        \/* Styling remains consistent *\/\n        #cb-booking-form {\n            font-family: Arial, sans-serif;\n            max-width: 600px;\n            margin: 0 auto;\n            background: #fff;\n            padding: 20px;\n            border: 1px solid #ccc;\n            border-radius: 8px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        }\n        #cb-booking-form h2 {\n            font-size: 1.5em;\n            margin-bottom: 20px;\n            text-align: center;\n        }\n        #cb-booking-form label {\n            font-weight: bold;\n            display: block;\n            margin-bottom: 5px;\n        }\n        #cb-booking-form input {\n            width: 100%;\n            padding: 10px;\n            font-size: 1em;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n            margin-bottom: 5px;\n            box-sizing:border-box;\n        }\n        #cb-booking-form button {\n            background: #1e88e5;\n            color: #fff;\n            border: none;\n            padding: 10px 20px;\n            font-size: 1em;\n            border-radius: 4px;\n            cursor: pointer;\n            width: 100%;\n        }\n        #cb-booking-form button:disabled {\n            background: #ccc;\n            cursor: not-allowed;\n        }\n        #cb-booking-form button:hover:enabled {\n            background: #155a9f;\n        }\n        #cb-email-feedback {\n            font-size: 0.9em;\n            margin-top: 5px;\n            color: green;\n        }\n        #cb-booking-form .cb-missing { border-color: #c62828 !important; box-shadow: 0 0 0 3px rgba(198, 40, 40, .15); }\n        #cb-booking-form .cb-missing-label { color: #c62828; }\n        #cb-booking-response.cb-error { color: #c62828; font-weight: 600; padding: 12px 14px; border: 1px solid rgba(198, 40, 40, .35); border-radius: 8px; background: rgba(198, 40, 40, .06); max-width: 600px; margin-left: auto; margin-right: auto; }\n        #cb-email-feedback.error {\n            color: red;\n        }\n\n        #cb-calendar-overlay {\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background-color: rgba(255, 255, 255, 0.8);\n            z-index: 1000;\n            display: none;\n            align-items: center;\n            justify-content: center;\n        }\n\n        #cb-calendar-overlay .spinner {\n            border: 4px solid #ccc;\n            border-top: 4px solid #1e88e5;\n            border-radius: 50%;\n            width: 40px;\n            height: 40px;\n            animation: spin 1s linear infinite;\n            margin:auto;\n            transform:translateY(-50%);\n            top:50%;\n            position:relative;\n        }\n\n        .flatpickr-innerContainer{\n            position:relative;\n        }\n        \n        @keyframes spin {\n            from {\n                transform: rotate(0deg);\n            }\n            to {\n                transform: rotate(360deg);\n            }\n        }\n\n    <\/style>\n\n    <form id=\"cb-booking-form\" method=\"post\" action=\"\" novalidate>\n    <div id=\"cb-calendar-overlay\">\n        <div class=\"spinner\"><\/div>\n    <\/div>\n\n            <p>\n        <label for=\"cb-name\">Name:<\/label>\n            <input type=\"text\" id=\"cb_name\" name=\"cb_name\" required>\n        <\/p>\n        \n    <p>\n    <label for=\"cb_musician_email\">Your Email:<\/label>\n    <input type=\"email\" id=\"cb_musician_email\" name=\"cb_musician_email\" placeholder=\"Enter your email\" required>\n    <span id=\"cb-email-feedback\" style=\"display:none;\"><\/span>\n    <\/p>\n\n        \n                <label for=\"cb-youtube\">Link to a video or your music:<\/label>\n                <input type=\"url\" id=\"cb_youtube\" name=\"cb_youtube\" placeholder=\"YouTube, Instagram, Spotify, SoundCloud...\" required>\n                \n                <p>\n                <label for=\"cb-description\">In a few words, describe your act:<\/label>\n                <textarea id=\"cb_description\" name=\"cb_description\" rows=\"4\" required><\/textarea>\n                <\/p>\n\n                <p class=\"cb-promo-field\">\n                <label for=\"cb_promo\">Poster or promo photo:<\/label>\n                <input type=\"file\" id=\"cb_promo\" name=\"cb_promo\" accept=\"image\/jpeg,image\/png,image\/webp,application\/pdf\" required>\n                <span class=\"cb-promo-help\" style=\"display:block;font-size:.85em;opacity:.75\">A photo from your phone is fine (we shrink it), or a PDF under 2 MB.<\/span>\n                <\/p>\n\n                                    <p>\n            <label for=\"cb_performance_date\">Which night would you like? <span style=\"font-weight:normal\">(Fridays and Saturdays, 7 to 10; open nights are highlighted)<\/span><\/label>\n            <input type=\"text\" id=\"cb_performance_date\" name=\"cb_performance_date\" placeholder=\"Select a date\" required>\n        <\/p>\n        <p>\n            <button type=\"submit\" id=\"cb-submit-button\">Submit Request<\/button>\n        <\/p>\n    <\/form>\n\n    <div id=\"cb-booking-response\" style=\"display:none; margin-top:20px;\"><\/div>\n\n    <script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n    const nameField = document.getElementById(\"cb_name\");\n    const emailField = document.getElementById(\"cb_musician_email\");\n    const dateField = document.getElementById(\"cb_performance_date\");\n    const descriptionField = document.getElementById(\"cb_description\");\n    const youtubeField = document.getElementById(\"cb_youtube\");\n    const promoField = document.getElementById(\"cb_promo\");\n    const submitButton = document.getElementById(\"cb-submit-button\");\n    const feedbackSpan = document.getElementById(\"cb-email-feedback\");\n    const responseDiv = document.getElementById(\"cb-booking-response\");\n    let unavailableDates = []; \/\/ To store unavailable dates dynamically fetched\n\n    \/\/ The server takes 2 MB per upload and phone photos are often 5 to 12 MB,\n    \/\/ so images get resized to a sharp JPG (about 1 MB) before sending.\n    window.cbpShrinkImage = window.cbpShrinkImage || function (file) {\n        return new Promise(function (resolve) {\n            if (!file || !\/^image\\\/(jpeg|png|webp)$\/.test(file.type) || file.size <= 1.5 * 1024 * 1024) { resolve(file); return; }\n            var url = URL.createObjectURL(file);\n            var img = new Image();\n            img.onload = function () {\n                var max = 2000, w = img.naturalWidth, h = img.naturalHeight, s = Math.min(1, max \/ Math.max(w, h));\n                var c = document.createElement('canvas');\n                c.width = Math.round(w * s); c.height = Math.round(h * s);\n                var ctx = c.getContext('2d');\n                ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, c.width, c.height);\n                ctx.drawImage(img, 0, 0, c.width, c.height);\n                URL.revokeObjectURL(url);\n                var attempt = function (q) {\n                    c.toBlob(function (blob) {\n                        if (!blob) { resolve(file); return; }\n                        if (blob.size > 1.8 * 1024 * 1024 && q > 0.5) { attempt(q - 0.15); return; }\n                        resolve(new File([blob], file.name.replace(\/\\.[^.]+$\/, '') + '.jpg', { type: 'image\/jpeg' }));\n                    }, 'image\/jpeg', q);\n                };\n                attempt(0.85);\n            };\n            img.onerror = function () { URL.revokeObjectURL(url); resolve(file); };\n            img.src = url;\n        });\n    };\n\n    \/\/ Function to check if a date is valid (Thu, Fri, Sat only)\n    function isValidDate(date) {\n        const day = date.getDay(); \/\/ 0 = Sunday, 6 = Saturday\n        return \/*day === 4 || *\/day === 5 || day === 6; \/\/ Thursday, Friday, Saturday\n    }\n\n    \/\/ Normalize date to 'YYYY-MM-DD' format\n    function normalizeDate(dateStr) {\n        const date = new Date(dateStr);\n        const options = { timeZone: \"America\/New_York\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" };\n\n        \/\/ Format the date to EST and extract the date components\n        const estDate = new Intl.DateTimeFormat(\"en-US\", options).format(date);\n\n        \/\/ Return the formatted date in YYYY-MM-DD format\n        const [month, day, year] = estDate.split(\"\/\");\n        return `${year}-${month}-${day}`;\n    }\n\n    \/\/ Fetch unavailable dates for a specific month range\n    function fetchUnavailableDates(startDate, endDate) {\n        \/\/ Fetch events in range\n\n        jQuery('.flatpickr-innerContainer').append(jQuery('#cb-calendar-overlay'));\n        jQuery('#cb-calendar-overlay').show();\n\n\n        jQuery.ajax({\n            url: 'https:\/\/corkandbean.ca\/oshawa\/wp-admin\/admin-ajax.php',\n            type: 'POST',\n            data: {\n                action: 'fetch_events_in_range',\n                start_time: startDate,\n                end_time: endDate,\n                calendar_id: 'c_8686d3644292b6c7372d68b5a7a11da07f49dac75c3a68eb6b4f6ce3ba7c4b0f@group.calendar.google.com',\n            },\n            dataType: 'json',\n        })\n            .done(function (response) {\n                if (response.success) {\n                    const eventDates = response.data.map(event => normalizeDate(event.start));\n                    console.log(\"unvail gcal dates\", response.data);\n\n                    \/\/ Fetch blocked dates separately\n                    jQuery.ajax({\n                        url: 'https:\/\/corkandbean.ca\/oshawa\/wp-admin\/admin-ajax.php',\n                        type: 'POST',\n                        data: {\n                            action: 'fetch_blocked_dates',\n                        },\n                        dataType: 'json',\n                    })\n                        .done(function (blockedResponse) {\n                            console.log(blockedResponse);\n                            if (blockedResponse.success) {\n                                const blockedDates = blockedResponse.data.map(date => normalizeDate(date.start));\n\n                                jQuery('#cb-calendar-overlay').hide()\n\n                                \/\/ Merge event dates and blocked dates\n                                unavailableDates = [...new Set([...eventDates, ...blockedDates])];\n\n                                \/\/ Update Flatpickr with merged unavailable dates\n                                calendar.set(\"disable\", [\n                                    function (date) {\n                                        const today = new Date(); \/\/ Current date\n                                        today.setHours(0, 0, 0, 0); \/\/ Set to midnight for comparison\n                                        const formattedDate = date.toISOString().split(\"T\")[0];\n                                        \/\/ Disable past dates and unavailable dates\n                                        return date.getTime() < today.getTime() || !isValidDate(date) || unavailableDates.includes(formattedDate);\n                                    }\n                                ]);\n                            } else {\n                                jQuery('#cb-calendar-overlay').hide();\n                            }\n                        })\n                        .fail(function () {\n                            jQuery('#cb-calendar-overlay').hide();\n                        });\n                } else {\n                    jQuery('#cb-calendar-overlay').hide();\n                }\n            })\n            .fail(function () {\n                \/\/ Calendar lookup failed: still let them pick; the server\n                \/\/ double checks the date when they submit\n                jQuery('#cb-calendar-overlay').hide();\n            });\n    }\n\n\n    \/\/ Initialize Flatpickr\n    const calendar = flatpickr(\"#cb_performance_date\", {\n        dateFormat: \"Y-m-d\",\n        disable: [\n            function (date) {\n                const today = new Date(); \/\/ Current date\n                today.setHours(0, 0, 0, 0); \/\/ Set to midnight for comparison\n                const formattedDate = date.toISOString().split(\"T\")[0];\n                \/\/ Disable past dates and unavailable dates\n                return date.getTime() < today.getTime() || !isValidDate(date) || unavailableDates.includes(formattedDate);\n            },\n        ],\n        onMonthChange: function (selectedDates, dateStr, instance) {\n            const currentMonth = instance.currentMonth; \/\/ Zero-based month\n            const currentYear = instance.currentYear;\n\n            const startOfMonth = new Date(currentYear, currentMonth, 1).toISOString();\n            let endOfMonth = new Date(currentYear, currentMonth + 1, 0);\n            endOfMonth.setHours(23, 59, 59, 999); \/\/ Ensure the time is set to the end of the day\n            endOfMonth = endOfMonth.toISOString();\n\n            fetchUnavailableDates(startOfMonth, endOfMonth);\n        },\n        onYearChange: function (selectedDates, dateStr, instance) {\n            const currentMonth = instance.currentMonth; \/\/ Zero-based month\n            const currentYear = instance.currentYear;\n\n            const startOfMonth = new Date(currentYear, currentMonth, 1).toISOString();\n            let endOfMonth = new Date(currentYear, currentMonth + 1, 0);\n            endOfMonth.setHours(23, 59, 59, 999); \/\/ Ensure the time is set to the end of the day\n            endOfMonth = endOfMonth.toISOString();\n\n            fetchUnavailableDates(startOfMonth, endOfMonth);\n        },\n    });\n\n    \/\/ Validate email\n    emailField.addEventListener(\"input\", function () {\n\n        if(jQuery(\"#cb-inquiry-form\").length > 0){\n            return;\n        }\n\n        const email = emailField.value.trim();\n\n        if (email) {\n            fetch('https:\/\/corkandbean.ca\/oshawa\/wp-admin\/admin-ajax.php?action=cb_validate_email&email=' + encodeURIComponent(email))\n                .then(response => response.json())\n                .then(data => {\n                    if (data.success) {\n                        feedbackSpan.textContent = \"Email was found on the musician roster\";\n                        feedbackSpan.classList.remove(\"error\");\n                        feedbackSpan.style.display = \"block\";\n                        validateForm(); \/\/ Ensure form validation is checked\n                    } else {\n                        feedbackSpan.textContent = \"Email not found on the musician roster.\";\n                        feedbackSpan.classList.add(\"error\");\n                        feedbackSpan.style.display = \"block\";\n                        submitButton.disabled = true; \/\/ Disable button\n                    }\n                });\n        } else {\n            feedbackSpan.style.display = \"none\";\n            submitButton.disabled = true; \/\/ Disable button\n        }\n    });\n\n    \/\/ Enable the button only when email and date are valid\n    function validateForm() {\n        const name = nameField && nameField.value.trim();\n        const email = emailField && emailField.value.trim();\n        const date = dateField && dateField.value.trim();\n        const description = descriptionField && descriptionField.value.trim();\n        const youtubeUrl = youtubeField && youtubeField.value.trim();\n\n        let isValid = null;\n        if(jQuery(\"#cb-inquiry-form\").length > 0){\n            const promoFile = promoField && promoField.files ? promoField.files[0] : null;\n            \/\/ Photos of any size are fine (shrunk before sending); PDFs can't be shrunk\n            const pdfTooBig = !!promoFile && promoFile.type === \"application\/pdf\" && promoFile.size > 1.9 * 1024 * 1024;\n            const promoOk = !!promoFile && !pdfTooBig;\n            if (pdfTooBig) {\n                responseDiv.style.display = \"block\";\n                responseDiv.textContent = \"That PDF is over 2 MB. Send a JPG or PNG instead (any size works, we shrink it).\";\n            } else if (responseDiv.textContent.indexOf(\"2 MB\") !== -1) {\n                responseDiv.style.display = \"none\";\n                responseDiv.textContent = \"\";\n            }\n            \/\/ The apply button stays clickable (it says what's missing);\n            \/\/ here we just clear the red marks as fields get filled in\n            [[nameField, name], [emailField, email], [dateField, date], [descriptionField, description], [youtubeField, youtubeUrl], [promoField, promoOk]].forEach(function (pair) {\n                if (pair[0] && pair[1]) { pair[0].classList.remove(\"cb-missing\"); }\n            });\n            if (responseDiv.classList.contains(\"cb-error\") && name && email && date && description && youtubeUrl && promoOk) {\n                responseDiv.style.display = \"none\";\n                responseDiv.classList.remove(\"cb-error\");\n            }\n            return;\n        }\n        else{\n            console.log(\"test\", feedbackSpan.textContent);\n            isValid = feedbackSpan.textContent.includes(\"Email was found\") && date;\n            console.log(isValid, date);\n        }\n        \n        submitButton.disabled = !isValid;\n    }\n\n    \/\/dateField.addEventListener(\"input\", validateForm);\n    jQuery('#cb-booking-form input').on('change input', validateForm);\n    jQuery('#cb-booking-form textarea').on('change input', validateForm);\n\n    \/\/ Handle form submission. Waits for the server before showing the thank\n    \/\/ you, so a rejected upload (too big, wrong type) is never silently lost.\n    document.getElementById(\"cb-booking-form\").addEventListener(\"submit\", function (e) {\n        e.preventDefault();\n\n        const form = document.getElementById(\"cb-booking-form\");\n        const isInquiry = jQuery(\"#cb-inquiry-form\").length > 0;\n\n        \/\/ Say exactly what's missing instead of silently doing nothing\n        if (isInquiry) {\n            const missing = [];\n            const mark = function (el, what) {\n                if (el) { el.classList.add(\"cb-missing\"); }\n                missing.push({ el: el, what: what });\n            };\n            form.querySelectorAll(\".cb-missing\").forEach(function (el) { el.classList.remove(\"cb-missing\"); });\n            const pf = promoField && promoField.files ? promoField.files[0] : null;\n            if (!nameField.value.trim()) { mark(nameField, \"your name\"); }\n            if (!\/^\\S+@\\S+\\.\\S+$\/.test(emailField.value.trim())) { mark(emailField, emailField.value.trim() ? \"a valid email address\" : \"your email\"); }\n            if (!youtubeField.value.trim()) { mark(youtubeField, \"a link to a video or your music\"); }\n            if (!descriptionField.value.trim()) { mark(descriptionField, \"a few words about your act\"); }\n            if (!pf) { mark(promoField, \"a poster or promo photo\"); }\n            else if (pf.type === \"application\/pdf\" && pf.size > 1.9 * 1024 * 1024) { mark(promoField, \"a smaller poster (PDFs must be under 2 MB, photos can be any size)\"); }\n            if (!dateField.value.trim()) { mark(dateField, \"the night you want\"); }\n            if (missing.length) {\n                const items = missing.map(function (m) { return m.what; });\n                const list = items.length > 1 ? items.slice(0, -1).join(\", \") + \" and \" + items[items.length - 1] : items[0];\n                responseDiv.textContent = \"Almost there. Please add \" + list + \".\";\n                responseDiv.classList.add(\"cb-error\");\n                responseDiv.style.display = \"block\";\n                const first = missing[0].el;\n                if (first) {\n                    first.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n                    if (first !== dateField) { first.focus({ preventScroll: true }); }\n                }\n                return;\n            }\n            \/\/ People often type \"instagram.com\/you\": make it a full link\n            if (!\/^https?:\\\/\\\/\/i.test(youtubeField.value.trim())) {\n                youtubeField.value = \"https:\/\/\" + youtubeField.value.trim();\n            }\n        }\n        responseDiv.classList.remove(\"cb-error\");\n\n        const label = submitButton.textContent;\n        submitButton.disabled = true;\n        submitButton.textContent = \"Sending...\";\n        responseDiv.style.display = \"none\";\n\n        const body = new FormData();\n        body.append(\"action\", \"confirm_music_booking\");\n        body.append(\"email\", form.querySelector(\"#cb_musician_email\").value.trim());\n        body.append(\"date\", form.querySelector(\"#cb_performance_date\").value.trim());\n        if (isInquiry) {\n            body.append(\"name\", form.querySelector(\"#cb_name\").value.trim());\n            body.append(\"description\", form.querySelector(\"#cb_description\").value.trim());\n            body.append(\"youtube_url\", form.querySelector(\"#cb_youtube\").value.trim());\n            body.append(\"booking_inquiry\", \"1\");\n        }\n        const rawPromo = promoField && promoField.files ? promoField.files[0] : null;\n        if (rawPromo) {\n            submitButton.textContent = \"Preparing your poster...\";\n        }\n\n        window.cbpShrinkImage(rawPromo)\n            .then(function (promo) {\n                if (promo) {\n                    body.append(\"promo\", promo);\n                }\n                submitButton.textContent = \"Sending...\";\n                return fetch('https:\/\/corkandbean.ca\/oshawa\/wp-admin\/admin-ajax.php', { method: \"POST\", body: body });\n            })\n            .then((response) => response.text().then((t) => {\n                try { return JSON.parse(t); } catch (err) { return { success: false, data: \"\" }; }\n            }).then((data) => (data && typeof data === \"object\") ? data : { success: false, data: response.status === 400 ? \"That upload was too big for our server. Try a smaller photo.\" : \"\" }))\n            .then((data) => {\n                if (!data.success) {\n                    submitButton.disabled = false;\n                    submitButton.textContent = label;\n                    responseDiv.style.display = \"block\";\n                    responseDiv.textContent = (data.data && typeof data.data === \"string\") ? data.data : \"Something went wrong. Please try again.\";\n                    responseDiv.classList.add(\"cb-error\");\n                    return;\n                }\n                const thankYouMessage = document.createElement(\"div\");\n                thankYouMessage.className = \"cb-thanks\";\n                thankYouMessage.style.textAlign = \"center\";\n                thankYouMessage.style.padding = \"20px\";\n                thankYouMessage.innerHTML = isInquiry\n                    ? '<div style=\"font-size:2em;margin-bottom:10px;\">&#10003;<\/div><p><strong>Got it, thanks!<\/strong><\/p><p>Your date is on hold for you. We just emailed you a copy, and we will get back to you within a few days.<\/p>'\n                    : '<div style=\"font-size:2em;margin-bottom:10px;\">&#10003;<\/div><p>Thank you! Your performance has been booked in!<\/p>';\n                Array.from(form.elements).forEach((el) => { el.style.display = \"none\"; });\n                form.querySelectorAll(\"label, .cb-promo-help\").forEach((el) => { el.style.display = \"none\"; });\n                jQuery(feedbackSpan).hide();\n                form.appendChild(thankYouMessage);\n            })\n            .catch(() => {\n                submitButton.disabled = false;\n                submitButton.textContent = label;\n                responseDiv.style.display = \"block\";\n                responseDiv.textContent = \"Could not reach the server. Check your connection and try again.\";\n            });\n    });\n\n\n    \/\/ Fetch events for the current month on load\n    \/\/ Open on the month of the first open night (the rest of this month\n    \/\/ may already be taken), and load that month's availability\n    const firstOpen = '2026-10-24';\n    const now = firstOpen ? new Date(firstOpen + 'T12:00:00') : new Date();\n    if (firstOpen) {\n        calendar.jumpToDate(firstOpen);\n    }\n    const startOfCurrentMonth = new Date(now.getFullYear(), now.getMonth(), 1).toISOString();\n    let endOfCurrentMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);\n    endOfCurrentMonth.setHours(23, 59, 59, 999); \/\/ Ensure the time is set to the end of the day\n    endOfCurrentMonth = endOfCurrentMonth.toISOString();\n\n    fetchUnavailableDates(startOfCurrentMonth, endOfCurrentMonth);\n});\n\n\n<\/script>\n\n\n    \r\n        <div id=\"cb-response\"><\/div>\r\n    <\/div>\r\n    \n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-03cfbac elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"03cfbac\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-a008eb0\" data-id=\"a008eb0\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7b2ec3b elementor-widget elementor-widget-text-editor\" data-id=\"7b2ec3b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5edd6c9 elementor-section-full_width private-parties event-section active elementor-section-height-default elementor-section-height-default\" data-id=\"5edd6c9\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-34cccb7\" data-id=\"34cccb7\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-1863971 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1863971\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-706915a\" data-id=\"706915a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-12c4a8f elementor-widget elementor-widget-text-editor\" data-id=\"12c4a8f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2><span style=\"color: #ffffff;\"><strong>Upcoming Live Music<\/strong><\/span><\/h2>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2369899 elementor-widget elementor-widget-eael-event-calendar\" data-id=\"2369899\" data-element_type=\"widget\" data-widget_type=\"eael-event-calendar.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"eael-event-calendar-wrapper\"><div id=\"eael-event-calendar-2369899\" class=\"eael-event-calendar-cls\"\n            data-cal_id = \"2369899\"\n            data-locale = \"en\"\n            data-translate = \"{&quot;today&quot;:&quot;Today&quot;,&quot;tomorrow&quot;:&quot;Tomorrow&quot;}\"\n            data-defaultview = \"listMonth\"\n            data-defaultdate = \"2026-10-17\"\n            data-time_format = \"\"\n            data-event_limit = \"100\"\n            data-events=\"[{&quot;id&quot;:1,&quot;title&quot;:&quot;Live Music: Jane Barber&quot;,&quot;description&quot;:&quot;&quot;,&quot;start&quot;:&quot;2026-11-07T19:00:00-05:00&quot;,&quot;end&quot;:&quot;2026-11-07T22:00:00-05:00&quot;,&quot;borderColor&quot;:&quot;#10ecab&quot;,&quot;textColor&quot;:&quot;#ffffff&quot;,&quot;color&quot;:&quot;#5725ff&quot;,&quot;url&quot;:&quot;&quot;,&quot;allDay&quot;:&quot;&quot;,&quot;external&quot;:&quot;on&quot;,&quot;nofollow&quot;:&quot;on&quot;},{&quot;id&quot;:2,&quot;title&quot;:&quot;Live: Ryan Harlock&quot;,&quot;description&quot;:&quot;Live music by Ryan Harlock (booked by the music team)&quot;,&quot;start&quot;:&quot;2026-11-06T19:00:00-05:00&quot;,&quot;end&quot;:&quot;2026-11-06T22:00:00-05:00&quot;,&quot;borderColor&quot;:&quot;#10ecab&quot;,&quot;textColor&quot;:&quot;#ffffff&quot;,&quot;color&quot;:&quot;#5725ff&quot;,&quot;url&quot;:&quot;&quot;,&quot;allDay&quot;:&quot;&quot;,&quot;external&quot;:&quot;on&quot;,&quot;nofollow&quot;:&quot;on&quot;},{&quot;id&quot;:3,&quot;title&quot;:&quot;Live: Ace Perry-Brady&quot;,&quot;description&quot;:&quot;Live music by Ace Perry-Brady (booked by the music team)&quot;,&quot;start&quot;:&quot;2026-10-23T19:00:00-04:00&quot;,&quot;end&quot;:&quot;2026-10-23T22:00:00-04:00&quot;,&quot;borderColor&quot;:&quot;#10ecab&quot;,&quot;textColor&quot;:&quot;#ffffff&quot;,&quot;color&quot;:&quot;#5725ff&quot;,&quot;url&quot;:&quot;&quot;,&quot;allDay&quot;:&quot;&quot;,&quot;external&quot;:&quot;on&quot;,&quot;nofollow&quot;:&quot;on&quot;},{&quot;id&quot;:4,&quot;title&quot;:&quot;Live: Victoria Tate (band name: Avaline)&quot;,&quot;description&quot;:&quot;Live music by Victoria Tate (band name: Avaline) (booked by the musician)&quot;,&quot;start&quot;:&quot;2026-12-04T19:00:00-05:00&quot;,&quot;end&quot;:&quot;2026-12-04T22:00:00-05:00&quot;,&quot;borderColor&quot;:&quot;#10ecab&quot;,&quot;textColor&quot;:&quot;#ffffff&quot;,&quot;color&quot;:&quot;#5725ff&quot;,&quot;url&quot;:&quot;&quot;,&quot;allDay&quot;:&quot;&quot;,&quot;external&quot;:&quot;on&quot;,&quot;nofollow&quot;:&quot;on&quot;}]\"\n            data-first_day=\"0\"><\/div>\n            <div id=\"eaelecModal\" class=\"eaelec-modal eael-zoom-in\">\n            <div class=\"eael-ec-modal-bg\"><\/div>\n            <div class=\"eaelec-modal-content\">\n                <div class=\"eaelec-modal-header\">\n                    <div class=\"eaelec-modal-close\"><span><i class=\"fas fa-times\"><\/i><\/span><\/div>\n                    <h2 class=\"eael-ec-modal-title\"><\/h2>\n                    <span class=\"eaelec-event-date-start eaelec-event-popup-date\"><\/span>\n                    <span class=\"eaelec-event-date-end eaelec-event-popup-date\"><\/span>\n                <\/div>\n                <div class=\"eaelec-modal-body\">\n                    <p><\/p>\n                <\/div>\n                <div class=\"eaelec-modal-footer\">\n                    <a class=\"eaelec-event-details-link\">Event Details<\/a>\n                <\/div>\n            <\/div>\n        <\/div>\n        <\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a7a8ac5 elementor-section-full_width public-events event-section elementor-section-height-default elementor-section-height-default\" data-id=\"a7a8ac5\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b8fec1d\" data-id=\"b8fec1d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-5abe468 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5abe468\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-81bc22c\" data-id=\"81bc22c\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bbafc6c elementor-widget elementor-widget-text-editor\" data-id=\"bbafc6c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2><strong>Host your Public Event at the Cork and Bean!<\/strong><\/h2>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-326a921 elementor-widget elementor-widget-text-editor\" data-id=\"326a921\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Wine and paints, crochet workshops, book clubs are only a few of the different types of events that have been hosted at the Cork and Bean. Host yours today!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4ec6a98 elementor-widget elementor-widget-heading\" data-id=\"4ec6a98\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Some of our Upcoming Public Events<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7269698 elementor-widget elementor-widget-text-editor\" data-id=\"7269698\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>[wfea]<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-04f3c2d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"04f3c2d\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-a5f7290\" data-id=\"a5f7290\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e966249 elementor-widget elementor-widget-heading\" data-id=\"e966249\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">How it works<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-88bf458 elementor-widget elementor-widget-text-editor\" data-id=\"88bf458\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul><li>We help you promote your event and sell tickets to through our Eventbrite page.<\/li><li>We charge a space rental fee plus a small marketing fee.\u00a0<\/li><\/ul><h3>Party Room Public Event: $60\/hour (space rental) + $20\/hour (marketing) = $80\/hour.<\/h3><ul><li>With this package, you will get access to our Party Room.\u00a0<\/li><\/ul><h3>Full Store Public Event: $200\/hour (space rental) + $20\/hour (marketing) = $220\/hour.<\/h3><p>\u00a0<\/p><p><strong>* 2 hour minimum required for all bookings *\u00a0<\/strong><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d22b3d6 elementor-widget elementor-widget-button\" data-id=\"d22b3d6\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-lg\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-text\">Book Now!<\/span>\n\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Live Music every Friday and Saturday from 7pm &#8211; 10pm Are you a talented musician looking to perform at Cork &amp; Bean? Let us know your availability by filling out this form, and we\u2019ll be in touch soon! Upcoming Live Music Event Details Host your Public Event at the Cork and Bean! Wine and paints, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1210","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/pages\/1210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/comments?post=1210"}],"version-history":[{"count":103,"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/pages\/1210\/revisions"}],"predecessor-version":[{"id":4176,"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/pages\/1210\/revisions\/4176"}],"wp:attachment":[{"href":"https:\/\/corkandbean.ca\/oshawa\/wp-json\/wp\/v2\/media?parent=1210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}