{"id":134,"date":"2024-04-03T15:49:47","date_gmt":"2024-04-03T15:49:47","guid":{"rendered":"https:\/\/www.buddyupgo.com\/?page_id=134"},"modified":"2024-04-03T15:49:47","modified_gmt":"2024-04-03T15:49:47","slug":"events","status":"publish","type":"page","link":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/events\/","title":{"rendered":"Events"},"content":{"rendered":"<div class=\"buddyUpPjaxContainer\" data-buddyup-pjax-container=\"1\"><style>.pinnacleMainNavBar .logo-wrapper img {\n    height: 75px !important;\n    width: auto;\n}\n\n.buddyUpHeaderWrapper {\n    justify-content: space-between;\n    margin-bottom: 1rem;\n}\n\n.buddyUpHeaderWrapper > * {\n    flex-grow: 0;\n}\n\nh1 {\n    padding-top: 0;\n    margin: 0 !important;\n}\n\n.buddyUpCreateEventButton {\n    margin: 0;\n}\n\n@media (max-width: 600px){\n    .buddyUpHeaderWrapper {\n        flex-direction: column;\n    }\n\n    .buddyUpHeaderWrapper > * {\n        padding-left: 8px;\n        padding-right: 8px;\n    }\n}\n\n\/* Filters *\/\n.eventsFiltersNav {\n    margin-bottom: 1rem;\n    padding: 0 8px;\n}\n\n.eventsFiltersNav > * {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n}\n\n#filterDateDropdown {\n    min-width: 200px;\n}\n\n.filterOr {\n    display: inline-block;\n    margin: 0 1rem;\n}\n\n.buddyUpFilterDropdownToggle {\n    width: 100%;\n    text-align: left;\n    margin-top: .35rem;\n    margin-bottom: .35rem;\n}\n\n.buddyUpFilterDropdownMenu {\n    border: 1px solid rgba(0,0,0,.12);\n    border-radius: var(--border-radius);\n    background: #fff;\n    max-height: 220px;\n    overflow: auto;\n    padding: .4rem .55rem;\n}\n\n.buddyUpFilterCheckboxList {\n    display: grid;\n    gap: .3rem;\n}\n\n.buddyUpFilterCheckboxItem {\n    display: flex;\n    align-items: center;\n    gap: .45rem;\n    font-size: .95rem;\n}\n\n[data-dateselected=\"true\"] {\n    \/* border: 1px solid black !important; *\/\n    box-shadow: 0 0 3px 1px rgba(0,0,0,0.15) !important;\n}\n\n\/* Events List *\/\n@media (max-width: 1000px){ \/* Mobile *\/\n    #eventSearchSidebar.buddyUpSearchSidebar {\n        padding-top: 35px;\n    }\n}\n\n\/* Mobile Filters *\/\n@media (max-width: 1000px) {\n    .mobileFilterButton {\n        float: right;\n    }\n}\n\n@media (max-width: 1000px){\n    #eventSearchSidebar.buddyUpSearchSidebar.buddyUpFiltersShelf {\n        padding-top: .75rem;\n    }\n\n    #eventDateOptionMobile {\n        margin: 0;\n    }\n\n    .eventsSearchbarWrapper {\n        display: block;\n    }\n\n    #eventSearchSidebar.buddyUpSearchSidebar #eventSearchButton, #eventSearchSidebar.buddyUpSearchSidebar #eventSearchByLocationButton {\n        display: none;\n    }\n\n    #eventSearchSidebar.buddyUpSearchSidebar .eventsSearchbarWrapper > input {\n        padding: .5rem 10px;\n        border-radius: var(--border-radius) !important;\n    }\n}\n\n@media (min-width: 601px){\n    .dateSearchMobile {\n        display: none;\n    }\n}\n\n@media (max-width: 600px){\n    #filterDateDropdown, .filterOr, #eventDateOption {\n        display: none;\n    }\n\n    .mobileFilterButton {\n        float: none;\n    }\n}<\/style><section id=\"buddyUpEventsSearchWrapper\" class=\"buddyUpContainer buddyUp\">\n    <div class=\"buddyUpHeaderWrapper flexWrapper\">\n        <h1 class=\"textH1\">Find events near you<\/h1>\n        <div><button id=\"buddyUpCreateEventButton\" class=\"buddyUpCreateEventButton buddyUpButton1 hidden\" aria-label=\"Create an event\" disabled=\"disabled\">Create an Event<\/button><\/div>\n    <\/div>\n    <div id=\"buddyUpEventsTabs\" class=\"buddyUpListTabs\">\n        <div class=\"buddyUpListTabButtons\" role=\"tablist\" aria-label=\"Events tabs\">\n            <button id=\"buddyUpEventsTabSearch\" type=\"button\" class=\"buddyUpButton1 buddyUpListTabButton isActive\" data-tab=\"search\" role=\"tab\" aria-selected=\"true\">Search<\/button>\n            <button id=\"buddyUpEventsTabMy\" type=\"button\" class=\"buddyUpButton3 buddyUpListTabButton\" data-tab=\"my\" role=\"tab\" aria-selected=\"false\">My<\/button>\n            <button id=\"buddyUpEventsTabJoined\" type=\"button\" class=\"buddyUpButton3 buddyUpListTabButton\" data-tab=\"joined\" role=\"tab\" aria-selected=\"false\">Joined<\/button>\n        <\/div>\n\n        <div class=\"buddyUpListTabPanels\">\n            <section class=\"buddyUpListTabPanel isActive\" data-tab-panel=\"search\" role=\"tabpanel\" aria-labelledby=\"buddyUpEventsTabSearch\">\n                <div class=\"flexWrapper buddyUpSearchWrapper\">\n                    <aside id=\"eventSearchSidebar\" class=\"buddyUpSearchSidebar buddyUpElWrapper buddyUpFiltersShelf\" aria-hidden=\"true\">\n                        <div class=\"dateSearchMobile\">\n                            <label for=\"eventsTextSearch\" aria-label=\"Type to search for events\">Select a Date<\/label>\n                            <input type=\"date\" id=\"eventDateOptionMobile\" name=\"eventDateOptionMobile\" style=\"width: 100%;\" value=\"2026-04-19\" min=\"2026-04-19\" max=\"2027-04-19\" \/>\n                        <\/div>\n\n                        <form id=\"eventsSearchForm\" class=\"buddyUpSearchSidebarSection\">\n                            <label for=\"eventsTextSearch\" aria-label=\"Type to search for events\">Search Events<\/label>\n                            <div class=\"eventsSearchbarWrapper buddyUpSearchButtonInput\">\n                                <input type=\"text\" id=\"eventsTextSearch\" name=\"eventsTextSearch\" aria-label=\"Type to search for events\" placeholder=\"Hiking\" required \/>\n                                <button type=\"submit\" id=\"eventSearchButton\" class=\"buddyUpButton1\" aria-label=\"Search for event\"><i class=\"fa fa-search\"><\/i><\/button>\n                            <\/div>\n                        <\/form>\n                        <form id=\"eventsSearchByLocationForm\" class=\"buddyUpSearchSidebarSection\">\n                            <label for=\"eventsTextSearchByLocation\" aria-label=\"Type to search for events\">Search By Location<\/label>\n                            <div class=\"eventsSearchbarWrapper buddyUpSearchButtonInput\">\n                                <input type=\"text\" id=\"eventsTextSearchByLocation\" name=\"eventsTextSearchByLocation\" aria-label=\"Type a location to search for nearby events\" placeholder=\"Address, city, state, or zip\" required \/>\n                                <button type=\"submit\" id=\"eventSearchByLocationButton\" class=\"buddyUpButton1\" aria-label=\"Search for event by location\"><i class=\"fa fa-search\"><\/i><\/button>\n                            <\/div>\n                            <input type=\"hidden\" id=\"eventsLocationLatitude\" value=\"\" \/>\n                            <input type=\"hidden\" id=\"eventsLocationLongitude\" value=\"\" \/>\n                            <div id=\"eventsLocationSearchHint\" class=\"textSmall\" style=\"margin-top:.35rem; opacity:.85;\"><\/div>\n                        <\/form>\n\n                        <div class=\"buddyUpSearchSidebarSection\">\n                            <label for=\"eventsFilterRadius\">Radius<\/label>\n                            <select id=\"eventsFilterRadius\">\n                                <option value=\"0\" selected>Any distance<\/option>\n                                <option value=\"10\">Within 10 miles<\/option>\n                                <option value=\"25\">Within 25 miles<\/option>\n                                <option value=\"50\">Within 50 miles<\/option>\n                                <option value=\"100\">Within 100 miles<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"buddyUpSearchSidebarSection\">\n                            <div class=\"buddyUpCheckboxWrapper\">\n                                <input type=\"checkbox\" id=\"eventsFilterMyInterests\" \/>\n                                <label for=\"eventsFilterMyInterests\">My interests<\/label>\n                            <\/div>\n                        <\/div>\n\n                        <div id=\"eventsSidebarInterestWrapper\" class=\"buddyUpSearchSidebarSection hidden\">\n                            <strong>Categories<\/strong><br\/>\n                            <button type=\"button\" id=\"eventsInterestsDropdownToggle\" class=\"buddyUpButton3 buddyUpFilterDropdownToggle\" aria-expanded=\"false\">Choose categories<\/button>\n                            <div id=\"eventsInterestsDropdownMenu\" class=\"buddyUpFilterDropdownMenu hidden\">\n                                <div id=\"interestsFilterList\" class=\"buddyUpFilterCheckboxList\"><\/div>\n                            <\/div>\n                        <\/div>\n\n                        <button id=\"filtersSearchMobile\" class=\"buddyUpButton1\">Search Events<\/button>\n                    <\/aside>\n\n                    <div class=\"eventsWrapper buddyUpSearchListWrapper\">\n                        <div class=\"eventsFiltersNav\">\n                            <select id=\"filterDateDropdown\" data-dateselected=\"true\">\n                                <option value=\"\" selected>Anytime<\/option>\n                                <option value=\"today\">Today<\/option>\n                                <option value=\"tomorrow\">Tomorrow<\/option>\n                                <option value=\"weekend\">This weekend<\/option>\n                            <\/select>\n                            <span class=\"filterOr\">or<\/span>\n                            <input type=\"date\" id=\"eventDateOption\" name=\"eventDateOption\" value=\"2026-04-19\" min=\"2026-04-19\" max=\"2027-04-19\" \/>\n\n                            <button class=\"mobileFilterButton buddyUpButton3 buddyUpMobileMenuToggle\" data-target=\"eventSearchSidebar\" aria-controls=\"eventSearchSidebar\" aria-expanded=\"false\"><i class=\"fa fa-filter\" aria-hidden=\"true\"><\/i> Filter Events<\/button>\n                        <\/div>\n                        <div id=\"eventsListWrapper\" class=\"buddyUpEventsList eventsList buddyUpSearchList\"><\/div>\n                    <\/div>\n                <\/div>\n            <\/section>\n\n            <section class=\"buddyUpListTabPanel\" data-tab-panel=\"my\" role=\"tabpanel\" aria-labelledby=\"buddyUpEventsTabMy\" hidden>\n                <div class=\"buddyUpElWrapper buddyUpMySection\">\n                    <div class=\"buddyUpMySectionHeader\">\n                        <h2 class=\"textHeading\" style=\"margin:0;\">My Events<\/h2>\n                        <div class=\"textSmall\" id=\"buddyUpMyEventsSummary\"><\/div>\n                    <\/div>\n                    <div id=\"buddyUpMyEventsOwnedList\" class=\"buddyUpMySectionList\"><\/div>\n                <\/div>\n            <\/section>\n\n            <section class=\"buddyUpListTabPanel\" data-tab-panel=\"joined\" role=\"tabpanel\" aria-labelledby=\"buddyUpEventsTabJoined\" hidden>\n                <div class=\"buddyUpElWrapper buddyUpMySection\">\n                    <div class=\"buddyUpMySectionHeader\">\n                        <h2 class=\"textHeading\" style=\"margin:0;\">Joined Events<\/h2>\n                    <\/div>\n                    <div id=\"buddyUpMyEventsJoinedList\" class=\"buddyUpMySectionList\"><\/div>\n                <\/div>\n            <\/section>\n        <\/div>\n    <\/div>\n\n    <button class=\"buddyUpSideTab\" data-target=\"eventSearchSidebar\" aria-controls=\"eventSearchSidebar\" aria-expanded=\"false\" aria-label=\"Open filters\">\n        <i class=\"fa-solid fa-sliders\" aria-hidden=\"true\"><\/i>\n        <span>Filters<\/span>\n    <\/button>\n<\/section><script>(async function () {\n    const currentUser = BUDDYUP.getCurrentUser();\n    const wrapper = document.getElementById('buddyUpEventsSearchWrapper');\n    const eventCreateButton = document.getElementById('buddyUpCreateEventButton');\n\n    if (!wrapper) return;\n\n    if (!currentUser || !currentUser.id) {\n        document.body.style.background = 'var(--buddyup-background)';\n        const errMessageContent = `<p>Please log in or register to search for events!<\/p>\n            <a href=\"${buddyUpVariables.login_link}\" class=\"buddyUpButton1\">Log in<\/a>\n            <a href=\"${buddyUpVariables.register_link}\" class=\"buddyUpButton1\" style=\"margin-left:.5rem;\">Sign Up<\/a>`;\n        wrapper.innerHTML = BUDDYUP.errorPage('Please log in', errMessageContent);\n        return;\n    }\n\n    const userId = Number(currentUser.id || 0);\n\n    const tabsRoot = document.getElementById('buddyUpEventsTabs');\n    const tabButtons = tabsRoot ? tabsRoot.querySelectorAll('.buddyUpListTabButton[data-tab]') : [];\n    const tabPanels = tabsRoot ? tabsRoot.querySelectorAll('.buddyUpListTabPanel[data-tab-panel]') : [];\n\n    const eventsListWrapper = document.getElementById('eventsListWrapper');\n    const mySummaryEl = document.getElementById('buddyUpMyEventsSummary');\n    const myOwnedEl = document.getElementById('buddyUpMyEventsOwnedList');\n    const joinedEl = document.getElementById('buddyUpMyEventsJoinedList');\n\n    let updateEventsTimer = null;\n    const eventsGeoCache = {};\n\n    const locationSearchEl = document.getElementById('eventsTextSearchByLocation');\n    const locationHintEl = document.getElementById('eventsLocationSearchHint');\n    const locationLatEl = document.getElementById('eventsLocationLatitude');\n    const locationLngEl = document.getElementById('eventsLocationLongitude');\n    const radiusSelectEl = document.getElementById('eventsFilterRadius');\n    const myInterestsEl = document.getElementById('eventsFilterMyInterests');\n    const interestsToggleBtn = document.getElementById('eventsInterestsDropdownToggle');\n    const interestsDropdownMenu = document.getElementById('eventsInterestsDropdownMenu');\n\n    const haversineMiles = (lat1, lon1, lat2, lon2) => {\n        const toRad = (d) => d * (Math.PI \/ 180);\n        const R = 3958.8;\n        const dLat = toRad(lat2 - lat1);\n        const dLon = toRad(lon2 - lon1);\n        const a = Math.sin(dLat \/ 2) * Math.sin(dLat \/ 2) +\n            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *\n            Math.sin(dLon \/ 2) * Math.sin(dLon \/ 2);\n        return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)));\n    };\n\n    const eventLocationText = (event) => {\n        const parts = [\n            event && event.address ? String(event.address) : '',\n            event && event.city ? String(event.city) : '',\n            event && event.state ? String(event.state) : '',\n            event && event.zip ? String(event.zip) : '',\n        ].filter(Boolean);\n\n        if (parts.length > 0) return parts.join(', ');\n        return event && event.location_name ? String(event.location_name) : '';\n    };\n\n    const resolveGeoText = async (text) => {\n        const q = String(text || '').trim();\n        if (q === '') return null;\n\n        const key = q.toLowerCase();\n        if (eventsGeoCache[key]) return eventsGeoCache[key];\n\n        const rows = await BUDDYUP.locationAutocompleteSearch(q);\n        if (!Array.isArray(rows) || rows.length === 0) return null;\n\n        const first = rows[0];\n        if (!first || !isFinite(Number(first.latitude)) || !isFinite(Number(first.longitude))) return null;\n\n        const point = {\n            latitude: Number(first.latitude),\n            longitude: Number(first.longitude),\n            label: String(first.label || q),\n        };\n        eventsGeoCache[key] = point;\n        return point;\n    };\n\n    const filterByRadius = async (rows, center, miles) => {\n        if (!Array.isArray(rows) || !center || !isFinite(Number(center.latitude)) || !isFinite(Number(center.longitude)) || !isFinite(Number(miles)) || Number(miles) <= 0) {\n            return Array.isArray(rows) ? rows : [];\n        }\n\n        const out = [];\n        for (let i = 0; i < rows.length; i++) {\n            const row = rows[i];\n            const text = eventLocationText(row);\n            if (!text) continue;\n\n            const point = await resolveGeoText(text);\n            if (!point) continue;\n\n            const distance = haversineMiles(\n                Number(center.latitude),\n                Number(center.longitude),\n                Number(point.latitude),\n                Number(point.longitude)\n            );\n\n            if (distance <= Number(miles)) {\n                out.push(row);\n            }\n        }\n\n        return out;\n    };\n\n    const activateTab = (tabName) => {\n        tabButtons.forEach((btn) => {\n            const active = btn.getAttribute('data-tab') === tabName;\n            btn.classList.toggle('isActive', active);\n            btn.classList.toggle('buddyUpButton1', active);\n            btn.classList.toggle('buddyUpButton3', !active);\n            btn.setAttribute('aria-selected', active ? 'true' : 'false');\n        });\n\n        tabPanels.forEach((panel) => {\n            const active = panel.getAttribute('data-tab-panel') === tabName;\n            panel.classList.toggle('isActive', active);\n            panel.hidden = !active;\n        });\n    };\n\n    tabButtons.forEach((btn) => {\n        btn.addEventListener('click', () => {\n            activateTab(String(btn.getAttribute('data-tab') || 'search'));\n        });\n    });\n\n    const normalizeEventId = (event) => {\n        const id = Number(event && (event.id || event.event_id || event.eventId || 0));\n        return Number.isFinite(id) && id > 0 ? id : 0;\n    };\n\n    const isOwnedEvent = (event) => {\n        if (!event) return false;\n\n        const organizerId = Number(\n            event.organizer_id ||\n            event.owner_id ||\n            (event.owner && event.owner.id) ||\n            event.user_id ||\n            0\n        );\n\n        if (organizerId > 0 && organizerId === userId) return true;\n\n        const organizers = Array.isArray(event.organizers) ? event.organizers : [];\n        return organizers.some((organizer) => Number(organizer && (organizer.id || organizer.user_id || 0)) === userId);\n    };\n\n    const isJoinedEvent = (event) => {\n        if (!event) return false;\n        if (event.is_joined === true || Number(event.is_joined) === 1) return true;\n\n        const attendees = Array.isArray(event.attendees_users) ? event.attendees_users : [];\n        return attendees.some((attendee) => Number(attendee && (attendee.id || attendee.user_id || 0)) === userId);\n    };\n\n    const renderEventList = (targetEl, events, emptyText, roleLabel) => {\n        if (!targetEl) return;\n\n        if (!Array.isArray(events) || events.length === 0) {\n            targetEl.innerHTML = `<div class=\"textSmall buddyUpMySectionEmpty\">${emptyText}<\/div>`;\n            return;\n        }\n\n        targetEl.innerHTML = events.map((event) => `\n            <div class=\"buddyUpMySectionItem\">\n                ${roleLabel ? `<div class=\"buddyUpMySectionRole\">${roleLabel}<\/div>` : ''}\n                ${BUDDYUP.eventCardElement(event)}\n            <\/div>\n        `).join('');\n    };\n\n    const accountEvents = (accountResp) => {\n        const eventsRoot = (accountResp && accountResp.events)\n            || (accountResp && accountResp.data && accountResp.data.events)\n            || {};\n\n        const upcoming = Array.isArray(eventsRoot.upcoming) ? eventsRoot.upcoming : [];\n        const past = Array.isArray(eventsRoot.past) ? eventsRoot.past : [];\n        return upcoming.concat(past);\n    };\n\n    async function loadConnectedEvents() {\n        if (!myOwnedEl || !joinedEl) return;\n\n        myOwnedEl.innerHTML = BUDDYUP.loading('Loading your events');\n        joinedEl.innerHTML = BUDDYUP.loading('Loading joined events');\n\n        const accountResp = await BUDDYUP.apiRequest('account-get', {\n            id: userId,\n            include: 'events',\n            fields: 'id,events'\n        });\n        if (!accountResp || accountResp.status !== 'success') {\n            renderEventList(myOwnedEl, [], 'Could not load your events right now.');\n            renderEventList(joinedEl, [], 'Could not load joined events right now.');\n            if (mySummaryEl) mySummaryEl.textContent = '';\n            return;\n        }\n\n        const rows = accountEvents(accountResp);\n        const seen = new Set();\n        const owned = [];\n        const joined = [];\n\n        rows.forEach((event) => {\n            const id = normalizeEventId(event);\n            if (!id || seen.has(id)) return;\n            seen.add(id);\n\n            if (isOwnedEvent(event)) {\n                owned.push(event);\n                return;\n            }\n\n            if (isJoinedEvent(event)) {\n                joined.push(event);\n            }\n        });\n\n        renderEventList(myOwnedEl, owned, 'You do not own any events yet.', 'Organizer');\n        renderEventList(joinedEl, joined, 'You have not joined any events yet.', 'Member');\n\n        if (mySummaryEl) {\n            mySummaryEl.textContent = `${owned.length} organizing \u2022 ${joined.length} joined`;\n        }\n    }\n\n    const normalizeEventsResponse = (resp) => {\n        if (resp && resp.status === 'success' && Array.isArray(resp.upcoming)) return resp.upcoming;\n        if (resp && resp.data && resp.data.status === 'success' && Array.isArray(resp.data.upcoming)) return resp.data.upcoming;\n        return [];\n    };\n\n    function updateEvents(timer) {\n        clearTimeout(updateEventsTimer);\n\n        if (!eventsListWrapper) return;\n\n        const placeholderCard = BUDDYUP.placeholderCardElement();\n        if (eventsListWrapper.loading !== true) {\n            eventsListWrapper.innerHTML = `${placeholderCard}${placeholderCard}${placeholderCard}${placeholderCard}${placeholderCard}${placeholderCard}`;\n            eventsListWrapper.loading = true;\n        }\n\n        const wait = timer ? timer : 1500;\n        updateEventsTimer = setTimeout(() => {\n            getEventsData();\n            clearTimeout(updateEventsTimer);\n        }, wait);\n    }\n\n    const getCheckedCategories = () => {\n        const checked = [];\n        document.querySelectorAll('.interestFilterCheckbox:checked').forEach((input) => {\n            const categoryName = input.getAttribute('data-type');\n            if (categoryName && categoryName !== '') checked.push(categoryName);\n        });\n        return checked;\n    };\n\n    async function getEventsData() {\n        if (!eventsListWrapper) return;\n\n        const filterParams = {\n            name: '',\n            location: '',\n            date: '',\n            categories: [],\n            radius: 0,\n        };\n\n        const textSearchEl = document.getElementById('eventsTextSearch');\n        if (textSearchEl) filterParams.name = textSearchEl.value;\n\n        if (locationSearchEl) filterParams.location = locationSearchEl.value;\n\n        const dateSelected = document.querySelector('[data-dateselected=\"true\"]');\n        if (dateSelected && dateSelected.value) filterParams.date = dateSelected.value;\n\n        filterParams.categories = getCheckedCategories();\n        filterParams.radius = Number(radiusSelectEl && radiusSelectEl.value ? radiusSelectEl.value : 0) || 0;\n\n        if (myInterestsEl && myInterestsEl.checked && Array.isArray(currentUser.interests)) {\n            currentUser.interests.forEach((interest) => {\n                const normalized = String(interest || '').trim().replace(\/\\s+\/g, '-');\n                if (!normalized || filterParams.categories.indexOf(normalized) >= 0) return;\n                filterParams.categories.push(normalized);\n            });\n        }\n\n        const mobileFilterMenuCheck = document.querySelectorAll('#eventSearchSidebar.buddyUpSearchSidebar.activeMobileMenu');\n        if (mobileFilterMenuCheck.length > 0) {\n            BUDDYUP.closeMobileMenu();\n        }\n\n        const eventsResp = await BUDDYUP.getEvents(filterParams, true);\n\n        if (eventCreateButton) {\n            eventCreateButton.removeAttribute('disabled');\n            eventCreateButton.classList.remove('hidden');\n        }\n\n        eventsListWrapper.innerHTML = '';\n        eventsListWrapper.loading = false;\n\n        const upcomingEvents = normalizeEventsResponse(eventsResp);\n        let filteredEvents = upcomingEvents;\n\n        if (filterParams.radius > 0 && String(filterParams.location || '').trim() !== '') {\n            const center = await resolveGeoText(filterParams.location);\n            if (center) {\n                if (locationLatEl) locationLatEl.value = String(center.latitude);\n                if (locationLngEl) locationLngEl.value = String(center.longitude);\n                if (locationHintEl) locationHintEl.innerText = `Radius filter: ${filterParams.radius} miles around ${center.label}.`;\n                filteredEvents = await filterByRadius(upcomingEvents, center, filterParams.radius);\n            } else if (locationHintEl) {\n                locationHintEl.innerText = 'Could not geocode this location for radius filtering.';\n            }\n        } else if (locationHintEl && String(filterParams.location || '').trim() === '') {\n            locationHintEl.innerText = '';\n        }\n\n        if (filteredEvents.length > 0) {\n            filteredEvents.forEach((event) => {\n                eventsListWrapper.innerHTML += BUDDYUP.eventCardElement(event);\n            });\n        } else {\n            eventsListWrapper.innerHTML = '<div style=\"text-align:center; padding: 3rem 1rem; background: rgba(0,0,0,0.035);\">No events found<\/div>';\n        }\n    }\n\n    async function loadSidebarInterests() {\n        const interestsWrapper = document.getElementById('eventsSidebarInterestWrapper');\n        const listEl = document.getElementById('interestsFilterList');\n        if (!interestsWrapper || !listEl) return;\n\n        const interestNames = [];\n        const seen = new Set();\n        let sourcedFromGroups = false;\n\n        try {\n            let groupsResp = await BUDDYUP.getGroups({}, true);\n            try { groupsResp = JSON.parse(groupsResp); } catch (e) {}\n\n            let groupsList = [];\n            if (groupsResp && Array.isArray(groupsResp.groups)) groupsList = groupsResp.groups;\n            else if (groupsResp && groupsResp.data && Array.isArray(groupsResp.data.groups)) groupsList = groupsResp.data.groups;\n\n            groupsList.forEach((group) => {\n                const categories = Array.isArray(group.categories) ? group.categories : [];\n                categories.forEach((cat) => {\n                    const name = String(cat || '').trim();\n                    const key = name.toLowerCase();\n                    if (!name || seen.has(key)) return;\n                    seen.add(key);\n                    interestNames.push(name);\n                });\n            });\n\n            sourcedFromGroups = interestNames.length > 0;\n        } catch (e) {}\n\n        if (interestNames.length === 0 && Array.isArray(currentUser.interests)) {\n            currentUser.interests.forEach((interest) => {\n                const name = String(interest || '').trim();\n                const key = name.toLowerCase();\n                if (!name || seen.has(key)) return;\n                seen.add(key);\n                interestNames.push(name);\n            });\n        }\n\n        if (interestNames.length === 0) return;\n\n        const interestEls = interestNames.map((name) => {\n            const dataType = name.replace(\/\\s+\/g, '-');\n            const rowId = `event_interest_${dataType.toLowerCase().replace(\/[^a-z0-9_\\-]\/g, '')}`;\n            return `<label class=\"buddyUpFilterCheckboxItem\" for=\"${rowId}\"><input type=\"checkbox\" id=\"${rowId}\" class=\"interestFilterCheckbox\" data-type=\"${dataType}\" \/> <span>${name}<\/span><\/label>`;\n        }).join('');\n\n        listEl.innerHTML = interestEls;\n        interestsWrapper.classList.remove('hidden');\n        interestsWrapper.querySelector('strong').textContent = sourcedFromGroups ? 'Filter by group interests' : 'Categories';\n\n        listEl.querySelectorAll('.interestFilterCheckbox').forEach((interestInput) => {\n            interestInput.addEventListener('change', () => {\n                const mobileCheck = document.querySelectorAll('#eventSearchSidebar.buddyUpSearchSidebar.activeMobileMenu');\n                if (mobileCheck.length === 0) updateEvents(1200);\n            });\n        });\n    }\n\n    if (eventCreateButton) {\n        eventCreateButton.addEventListener('click', async () => {\n            let canCreate = true;\n            try {\n                const limitsResp = await BUDDYUP.getUserLimits({ force: true });\n                const limit = Number(limitsResp?.limits?.events?.create_limit ?? 0);\n                const current = Number(limitsResp?.current?.events?.current_count ?? 0);\n                if (limit > 0 && current >= limit) canCreate = false;\n            } catch (e) {}\n\n            if (!canCreate) {\n                BUDDYUP.subscriptionModal('You have reached your event creation limit for this period. Upgrade to increase your limit.', 'Event limit reached');\n                return;\n            }\n\n            BUDDYUP.pjaxNavigate(`${buddyUpVariables.event_link}create`);\n        });\n    }\n\n    document.querySelectorAll('#eventsSearchForm, #eventsSearchByLocationForm').forEach((formEl) => {\n        formEl.addEventListener('submit', (e) => {\n            e.preventDefault();\n            activateTab('search');\n            updateEvents(1);\n        });\n    });\n\n    document.querySelectorAll('#filterDateDropdown, #eventDateOption').forEach((dateInput) => {\n        dateInput.addEventListener('change', () => {\n            document.querySelectorAll('#filterDateDropdown, #eventDateOption').forEach((input) => {\n                input.removeAttribute('data-dateselected');\n            });\n            dateInput.setAttribute('data-dateselected', 'true');\n            updateEvents(1200);\n        });\n    });\n\n    if (radiusSelectEl) {\n        radiusSelectEl.addEventListener('change', () => {\n            const mobileCheck = document.querySelectorAll('#eventSearchSidebar.buddyUpSearchSidebar.activeMobileMenu');\n            if (mobileCheck.length === 0) updateEvents(350);\n        });\n    }\n\n    if (myInterestsEl) {\n        myInterestsEl.addEventListener('change', () => {\n            const mobileCheck = document.querySelectorAll('#eventSearchSidebar.buddyUpSearchSidebar.activeMobileMenu');\n            if (mobileCheck.length === 0) updateEvents(350);\n        });\n    }\n\n    if (interestsToggleBtn && interestsDropdownMenu) {\n        interestsToggleBtn.addEventListener('click', (e) => {\n            e.preventDefault();\n            const opening = interestsDropdownMenu.classList.contains('hidden');\n            interestsDropdownMenu.classList.toggle('hidden', !opening);\n            interestsToggleBtn.setAttribute('aria-expanded', opening ? 'true' : 'false');\n        });\n\n        document.addEventListener('click', (e) => {\n            if (!interestsDropdownMenu.contains(e.target) && !interestsToggleBtn.contains(e.target)) {\n                interestsDropdownMenu.classList.add('hidden');\n                interestsToggleBtn.setAttribute('aria-expanded', 'false');\n            }\n        });\n    }\n\n    document.querySelectorAll('#filtersSearchMobile').forEach((button) => {\n        button.addEventListener('click', (e) => {\n            e.preventDefault();\n            updateEvents(1);\n        });\n    });\n\n    document.querySelectorAll('#eventDateOptionMobile, #eventDateOption').forEach((dateInput) => {\n        dateInput.addEventListener('change', () => {\n            if (dateInput.id === 'eventDateOptionMobile') {\n                const desktop = document.getElementById('eventDateOption');\n                if (desktop) desktop.value = dateInput.value;\n            } else {\n                const mobile = document.getElementById('eventDateOptionMobile');\n                if (mobile) mobile.value = dateInput.value;\n            }\n        });\n    });\n\n    BUDDYUP.setGlobalHandler('events.resize', window, 'resize', () => {\n        if (window.innerWidth >= 1000 && document.querySelector('.activeMobileMenu')) {\n            BUDDYUP.closeMobileMenu();\n        }\n    });\n\n    (function initEventsSwipe() {\n        const shelf = document.getElementById('eventSearchSidebar');\n        const tab = document.querySelector('.buddyUpSideTab[data-target=\"eventSearchSidebar\"]');\n        if (shelf && typeof BUDDYUP.initShelfSwipeGestures === 'function') {\n            BUDDYUP.initShelfSwipeGestures({\n                shelf: shelf,\n                tab: tab,\n                onOpen: function() { BUDDYUP.openFiltersShelf(shelf); },\n                onClose: function() { BUDDYUP.closeFiltersShelf(); },\n                isOpen: function() { return shelf.classList.contains('isOpen'); },\n                key: 'events.filterShelf',\n            });\n        }\n    })();\n\n    activateTab('search');\n    updateEvents(1);\n    await Promise.all([\n        loadConnectedEvents(),\n        loadSidebarInterests(),\n    ]);\n})();\n<\/script><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/full-width-no-header.php","meta":{"footnotes":""},"class_list":["post-134","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/pages\/134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/comments?post=134"}],"version-history":[{"count":0,"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/pages\/134\/revisions"}],"wp:attachment":[{"href":"https:\/\/buddyupapi-staging.us35.cdn-alpha.com\/api\/wp\/v2\/media?parent=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}