{"id":4792,"date":"2025-08-21T14:20:30","date_gmt":"2025-08-21T14:20:30","guid":{"rendered":"https:\/\/www.njfuture.org\/?page_id=4792"},"modified":"2025-10-21T11:53:48","modified_gmt":"2025-10-21T11:53:48","slug":"events","status":"publish","type":"page","link":"https:\/\/www.njfuture.org\/events\/","title":{"rendered":"Events"},"content":{"rendered":"\n<div class=\"bg-brand-jersey-blue text-white relative mb-10 overflow-hidden\">\n  <div class=\"container py-10 md:py-36 relative\">\n        <div\n      class=\"uppercase w-full md:w-[42%] font-gotham\">\n              <h2 class=\"text-3xl text-brand-grey\">Events<\/h2>\n                    <h2 class=\"text-h2 md:text-h1 font-bold mt-6\">\n           Join Us to Shape the Future        <\/h2>\n          <\/div>\n  <\/div>\n\n      <div class=\"max-md:hidden absolute top-0 h-full w-[50%] right-0\"\n      style=\"background-image: url('https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/08\/Rectangle-4057-scaled.webp'); background-size: cover; background-position: top; background-repeat: no-repeat;\">\n      <!-- w-[26.875rem] -->\n      <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Frame-1261152805.svg\" alt=\"hero-banner-vector\"\n        class=\"object-cover object-left absolute top-0 left-0 w-full h-full lg:h-full lg:w-auto   without-contrast-wave-image block\">\n\n      <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Frame-1261152805-1.svg\" alt=\"hero-banner-vector\"\n        class=\"object-cover object-left absolute top-0 left-0 w-full h-full lg:h-full lg:w-auto contrast-wave-image hidden\">\n    <\/div>\n    <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/08\/Rectangle-4057-scaled.webp\" alt=\"hero-banner-image\"\n      class=\"md:hidden w-full object-contain object-center h-[22rem]\">\n      <\/div>\n\n<style>\n  #event-subtabs-tabs-select-options .event-subtabs-dropdown-item {\n    border-bottom: none !important;\n  }\n<\/style>\n<section data-testid=\"section-event-cards\" data-browse-all-title=\"Upcoming Event\"\n  data-browse-all-description=\"&lt;div class=&quot;htmlBlock [&amp;&gt;p]:!text-brand-black text-brand-black htmlBlock-para-style&quot;&gt;\n&lt;p&gt;We look forward to seeing you at the next\u00a0&lt;strong&gt;Event!&lt;\/strong&gt; Stay tuned for more information.&lt;\/p&gt;\n&lt;\/div&gt;\n\"\n  data-browse-all-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/10\/NJF-FLOW-SmartGrowth101-SmartGrowthinYourTown-WalkabilityScorecardImage.webp\">\n        <div class=\"container mb-10 lg:px-10 px-5 grid w-full relative \n                grid-cols-1 md:grid-cols-[40%_60%] lg:grid-cols-[30%_70%]\">\n        <div class=\"w-full min-h-[18.75rem] max-md:h-[18rem] h-full relative bg-brand-light-green\">\n          <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/11\/PRC26-temp-logo.png\" alt=\"New Jersey Planning and Redevelopment Conference\"\n            class=\"object-contain h-full w-full absolute\">\n                  <\/div>\n        <div class=\"bg-brand-colbalt-blue px-9 md:py-12 py-8\">\n          <div\n            class=\"max-md:mx-auto w-max bg-brand-future-green rounded-[.3125rem] py-[.625rem] px-4 text-p3 font-tradeGothic font-normal text-white mb-6\">\n            Featured Event\n          <\/div>\n          <h4 class=\"text-white !text-h4 font-medium font-gotham max-md:text-center\">\n            New Jersey Planning and Redevelopment Conference          <\/h4>\n          <div class=\"w-full h-[.0625rem] bg-white my-6\"><\/div>\n          <div class=\"text-white text-p1 font-tradeGothic font-bold max-md:text-center\">\n            <span class=\"label\">Save the Date:<\/span>\n                          <span class=\"event-date\">Jun 10<\/span>\n                                              <\/div>\n          <a href=\"https:\/\/www.njfuture.org\/events\/new-jersey-planning-and-redevelopment-conference\/\"\n            class=\"max-md:mx-auto w-max mt-6 flex justify-center items-center py-3 px-5 rounded-[.3125rem] whitespace-nowrap bg-brand-gold group cursor-pointer\">\n            <span class=\"text-white text-p1 font-tradeGothic\">Find Out More<\/span>\n            <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/07\/Vector-14.svg\" alt=\"chevron-right-white\"\n              class=\"w-8 h-5 flex-shrink-0 group-hover:ml-2 transition-all duration-200\">\n          <\/a>\n        <\/div>\n      <\/div>\n            <section data-testid=\"event-sub-tabs\" class=\"container mb-10 scroll-mt-20\" id=\"single-event\">\n      <div\n        class=\"justify-center items-center gap-8 flex-wrap lg:flex hidden w-max mx-auto border-b-[.1875rem] border-brand-grey\">\n                  <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=browse-all\" data-tab=\"browse-all\"\n            data-event-tab=\"browse-all\" data-event-name=\"Browse All\"\n            data-event-description=\"&lt;p&gt;New Jersey Future\u2019s events bring together professionals and thought leaders from across sectors to highlight emerging trends and best practices throughout the state. Please consider sponsoring or joining us at one of these events.&lt;\/p&gt;\n\"\n            data-no-events-title=\"\"\n            data-no-events-description=\"\"\n            data-no-events-image=\"\"\n            class=\"event-tab-btn inline-block px-6 pb-[.875rem] !text-p2 hover:text-brand-future-green hover:border-brand-future-green font-tradeGothic font-medium !no-underline !mb-[-.35rem] cursor-pointer text-brand-future-green border-b-[.4375rem] border-brand-future-green\">\n            Browse All          <\/a>\n                  <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=conference\" data-tab=\"conference\"\n            data-event-tab=\"conference\" data-event-name=\"Planning &amp; Redevelopment Conferences\"\n            data-event-description=\"The New Jersey Planning &amp; Redevelopment Conference brings together bold ideas, innovative solutions, proven concepts, and best practices for creating stronger, more inclusive, and equitable places where people live, work, and play.\"\n            data-no-events-title=\"Upcoming Conference\"\n            data-no-events-description=\"&lt;p&gt;We look forward to seeing you at the next &lt;strong&gt;NJ Planning &amp; Redevelopment Conference!&lt;\/strong&gt; Save the dates for 2026: June 10-11 virtually and June 12 at the Hyatt Regency New Brunswick. Stay tuned for more information.&lt;\/p&gt;\n\"\n            data-no-events-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/49641035851_07942b5378_c.jpg\"\n            class=\"event-tab-btn inline-block px-6 pb-[.875rem] !text-p2 hover:text-brand-future-green hover:border-brand-future-green font-tradeGothic font-medium !no-underline !mb-[-.35rem] cursor-pointer text-brand-slate-grey border-b-[.4375rem] border-b-transparent\">\n            Planning &amp; Redevelopment Conferences          <\/a>\n                  <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=smart-growth-awards\" data-tab=\"smart-growth-awards\"\n            data-event-tab=\"smart-growth-awards\" data-event-name=\"Smart Growth Awards\"\n            data-event-description=\"Since 2002, New Jersey Future has honored smart planning and redevelopment in New Jersey through the Smart Growth Awards. The projects and plans represent some of the best examples of sustainable growth and redevelopment in the state.\"\n            data-no-events-title=\"No Upcoming Smart Growth Awards\"\n            data-no-events-description=\"&lt;p&gt;Thank you for attending this year\u2019s &lt;strong&gt;Smart Growth Awards&lt;\/strong&gt;. While we prepare for 2026, we invite you to explore past honorees and submit a nomination for a chance to be an award winner.&lt;\/p&gt;\n\"\n            data-no-events-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Rectangle-4062-1-scaled.webp\"\n            class=\"event-tab-btn inline-block px-6 pb-[.875rem] !text-p2 hover:text-brand-future-green hover:border-brand-future-green font-tradeGothic font-medium !no-underline !mb-[-.35rem] cursor-pointer text-brand-slate-grey border-b-[.4375rem] border-b-transparent\">\n            Smart Growth Awards          <\/a>\n                  <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=webinars\" data-tab=\"webinars\"\n            data-event-tab=\"webinars\" data-event-name=\"Webinars\"\n            data-event-description=\"New Jersey Future is committed to providing high-quality, accessible learning experiences through webinars designed to be informative and engaging. Our webinar offerings span a range of topics and are led by experienced industry leaders who bring real-world insights and cutting-edge knowledge.\"\n            data-no-events-title=\"No Upcoming Webinars\"\n            data-no-events-description=\"&lt;p&gt;No webinars are currently scheduled. While we develop new content, feel free to explore our archive of past webinar recordings and presentations.&lt;\/p&gt;\n\"\n            data-no-events-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Delaware-River-2-scaled.jpg\"\n            class=\"event-tab-btn inline-block px-6 pb-[.875rem] !text-p2 hover:text-brand-future-green hover:border-brand-future-green font-tradeGothic font-medium !no-underline !mb-[-.35rem] cursor-pointer text-brand-slate-grey border-b-[.4375rem] border-b-transparent\">\n            Webinars          <\/a>\n              <\/div>\n      <!-- Mobile Dropdown -->\n      <div class=\"block lg:hidden relative\">\n        <div id=\"event-subtabs-dropdown-cta\"\n          class=\"rounded-[.25rem] w-full bg-inherit border px-6 py-4 flex justify-between items-center gap-4\">\n          <span id=\"event-subtabs-selected-options\" class=\"text-p2 font-normal text-brand-slate-grey\">\n            Browse All          <\/span>\n          <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/themes\/new-jersey-production\/assets\/images\/right-arrow-down-black.svg\" alt=\"Dropdown\"\n            class=\"w-8 aspect-square\">\n        <\/div>\n        <div id=\"event-subtabs-tabs-select-options\"\n          class=\"absolute w-full rounded-md mt-2 bg-white z-[9999] overflow-hidden\" style=\"display: none;\">\n                      <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=browse-all\" data-tab=\"browse-all\"\n              data-event-tab=\"browse-all\" data-event-name=\"Browse All\"\n              data-event-description=\"&lt;p&gt;New Jersey Future\u2019s events bring together professionals and thought leaders from across sectors to highlight emerging trends and best practices throughout the state. Please consider sponsoring or joining us at one of these events.&lt;\/p&gt;\n\"\n              data-no-events-title=\"\"\n              data-no-events-description=\"\"\n              data-no-events-image=\"\" class=\"event-subtabs-dropdown-item px-4 py-4 block cursor-pointer no-underline text-p3 font-tradeGothic\n               bg-brand-future-green text-white\">\n              Browse All            <\/a>\n                      <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=conference\" data-tab=\"conference\"\n              data-event-tab=\"conference\" data-event-name=\"Planning &amp; Redevelopment Conferences\"\n              data-event-description=\"The New Jersey Planning &amp; Redevelopment Conference brings together bold ideas, innovative solutions, proven concepts, and best practices for creating stronger, more inclusive, and equitable places where people live, work, and play.\"\n              data-no-events-title=\"Upcoming Conference\"\n              data-no-events-description=\"&lt;p&gt;We look forward to seeing you at the next &lt;strong&gt;NJ Planning &amp; Redevelopment Conference!&lt;\/strong&gt; Save the dates for 2026: June 10-11 virtually and June 12 at the Hyatt Regency New Brunswick. Stay tuned for more information.&lt;\/p&gt;\n\"\n              data-no-events-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/49641035851_07942b5378_c.jpg\" class=\"event-subtabs-dropdown-item px-4 py-4 block cursor-pointer no-underline text-p3 font-tradeGothic\n               text-brand-slate-grey bg-white hover:bg-brand-future-green hover:text-white\">\n              Planning &amp; Redevelopment Conferences            <\/a>\n                      <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=smart-growth-awards\" data-tab=\"smart-growth-awards\"\n              data-event-tab=\"smart-growth-awards\" data-event-name=\"Smart Growth Awards\"\n              data-event-description=\"Since 2002, New Jersey Future has honored smart planning and redevelopment in New Jersey through the Smart Growth Awards. The projects and plans represent some of the best examples of sustainable growth and redevelopment in the state.\"\n              data-no-events-title=\"No Upcoming Smart Growth Awards\"\n              data-no-events-description=\"&lt;p&gt;Thank you for attending this year\u2019s &lt;strong&gt;Smart Growth Awards&lt;\/strong&gt;. While we prepare for 2026, we invite you to explore past honorees and submit a nomination for a chance to be an award winner.&lt;\/p&gt;\n\"\n              data-no-events-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Rectangle-4062-1-scaled.webp\" class=\"event-subtabs-dropdown-item px-4 py-4 block cursor-pointer no-underline text-p3 font-tradeGothic\n               text-brand-slate-grey bg-white hover:bg-brand-future-green hover:text-white\">\n              Smart Growth Awards            <\/a>\n                      <a href=\"\/wp-json\/wp\/v2\/pages\/4792?tab=webinars\" data-tab=\"webinars\"\n              data-event-tab=\"webinars\" data-event-name=\"Webinars\"\n              data-event-description=\"New Jersey Future is committed to providing high-quality, accessible learning experiences through webinars designed to be informative and engaging. Our webinar offerings span a range of topics and are led by experienced industry leaders who bring real-world insights and cutting-edge knowledge.\"\n              data-no-events-title=\"No Upcoming Webinars\"\n              data-no-events-description=\"&lt;p&gt;No webinars are currently scheduled. While we develop new content, feel free to explore our archive of past webinar recordings and presentations.&lt;\/p&gt;\n\"\n              data-no-events-image=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Delaware-River-2-scaled.jpg\" class=\"event-subtabs-dropdown-item px-4 py-4 block cursor-pointer no-underline text-p3 font-tradeGothic\n               text-brand-slate-grey bg-white hover:bg-brand-future-green hover:text-white\">\n              Webinars            <\/a>\n                  <\/div>\n      <\/div>\n    <\/section>\n    <div id=\"event-tab-description\"\n    class=\"htmlBlock !text-h4 text-brand-black text-center container lg:px-10 px-5 !font-gotham mb-10 mx-auto event-type-desc-styling\">\n    <p>New Jersey Future\u2019s events bring together professionals and thought leaders from across sectors to highlight emerging trends and best practices throughout the state. Please consider sponsoring or joining us at one of these events.<\/p>\n  <\/div>\n  <!-- Filters -->\n  <div class=\"bg-brand-light-steel-blue py-10 mb-10\">\n    <div class=\"container lg:px-10 px-5\">\n      <div class=\"flex flex-col xsm:flex-row gap-4 xsm:gap-6 items-center justify-center\">\n        <!-- Date Filter -->\n        <div class=\"relative w-full lg:w-[26rem] xsm:w-[50%] text-white bg-white rounded-[.375rem] \">\n          <input id=\"event-date\" type=\"text\" placeholder=\"Search by Date\"\n            class=\"relative z-[1] bg-transparent w-full pl-6 pr-14 py-6 border-none rounded-[.375rem] text-p2 text-brand-slate-grey placeholder-brand-slate-grey font-normal font-tradeGothic focus:outline-none cursor-pointer\">\n          <img decoding=\"async\" id=\"calendar-icon\"\n            src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Date.svg\"\n            class=\"absolute right-4 top-1\/2 transform -translate-y-1\/2 w-9 h-9 shrink-0 aspect-square cursor-pointer\"\n            alt=\"calendar-icon\">\n          <img decoding=\"async\" id=\"calendar-cross-icon\"\n            src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Button_-Close.svg\"\n            class=\"absolute right-4 top-1\/2 transform -translate-y-1\/2 w-8 h-8 shrink-0 aspect-square cursor-pointer hidden z-[2]\"\n            alt=\"calendar-cross-icon\">\n        <\/div>\n        <!-- Search Filter -->\n        <div class=\"relative w-full lg:w-[26rem] xsm:w-[50%]\">\n          <input id=\"event-search\" type=\"text\" placeholder=\"Search by Keyword\"\n            class=\"w-full pl-6 pr-14 py-6 border-none rounded-[.375rem] text-p2 text-brand-slate-grey font-normal font-tradeGothic focus:outline-none placeholder-brand-slate-grey\">\n          <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Search.svg\"\n            class=\"absolute right-4 top-1\/2 transform -translate-y-1\/2 w-9 h-9 shrink-0\" alt=\"search-icon\"\n            id=\"search-icon\">\n          <img decoding=\"async\"\n            src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Button_-Close.svg\"\n            class=\"absolute right-4 top-1\/2 transform -translate-y-1\/2 w-8 h-8 shrink-0 hidden cursor-pointer\"\n            alt=\"search-icon\" id=\"search-cross-icon\">\n        <\/div>\n      <\/div>\n      <div class=\"w-full h-[.0625rem] my-6 bg-white\"><\/div>\n      <div class=\"flex justify-center items-center sm:gap-10 gap-5 [@media(min-width:460px)]:flex-row flex-col\">\n        <div id=\"filter-toggle\"\n          class=\"flex items-center gap-3 sm:justify-end justify-center toggle-wrapper md:w-[18rem]\">\n          <span class=\"active text-white text-p2 font-normal\">Upcoming<\/span>\n          <button\n            class=\"event-toggle relative w-14 h-8 rounded-full bg-brand-gold transition-colors duration-300 flex items-center px-2\">\n            <span\n              class=\"toggle-knob absolute left-1 w-6 h-6 bg-white rounded-full shadow-md transform transition-transform duration-300\"><\/span>\n          <\/button>\n          <span class=\"inactive text-white text-p2 font-normal\">Past<\/span>\n        <\/div>\n        <div class=\"bg-white w-[.0938rem] h-[1.5rem] [@media(max-width:460px)]:hidden\"><\/div>\n        <!-- List \/ Calendar -->\n        <div id=\"view-toggle\"\n          class=\"flex items-center gap-3 sm:justify-start justify-center toggle-wrapper md:w-[18rem]\">\n          <span class=\"text-p2 font-normal text-white\">List View<\/span>\n          <button\n            class=\"event-toggle relative w-14 h-8 rounded-full bg-brand-gold transition-colors duration-300 flex items-center px-2\">\n            <span\n              class=\"toggle-knob absolute left-1 w-6 h-6 bg-white rounded-full shadow-md transform transition-transform duration-300\"><\/span>\n          <\/button>\n          <span class=\"text-white text-p2 font-normal\">Calendar View<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n  <!-- Dynamic Events -->\n\n  <div id=\"events-container\" class=\"event-grid-display auto-cols-max lg:gap-10 gap-5 container lg:px-10 px-5\">\n  <\/div>\n  <div class=\"container lg:px-10 px-5 mb-10 sm:relative\" style=\"display: none;\" id=\"calendar-container\">\n    <div id=\"calendar\"><\/div>\n    <div id=\"event-popup-modal\"\n      class=\"max-sm:!fixed absolute h-full sm:h-[calc(100%-17.375rem)] md:h-[calc(100%-9.375rem)] max-sm:inset-0 sm:bottom-0 lg:pl-10 sm:pl-5 left-[.6875rem] z-50 hidden max-sm:bg-brand-black max-sm:bg-opacity-50  p-4  items-center justify-center sm:items-start sm:justify-start\">\n      <div id=\"popup-content\"\n        class=\"w-full sm:max-w-2xl  sm:w-[32.3125rem] rounded-[0.3125rem] overflow-hidden bg-brand-jersey-blue shadow-sm  overflow-y-auto relative top-[inherit] sm:sticky sm:top-[5rem] \">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<script>\n  function debounce(func, wait) {\n    let timeout;\n    return function () {\n      const context = this,\n        args = arguments;\n      clearTimeout(timeout);\n      timeout = setTimeout(() => func.apply(context, args), wait);\n    };\n  }\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    const searchInput = document.getElementById(\"event-search\");\n    const dateFilterInput = document.getElementById(\"event-date\");\n    let calendarEl = document.getElementById(\"calendar\");\n    const calendarCrossIcon = document.getElementById(\"calendar-cross-icon\");\n    const calendarIcon = document.getElementById(\"calendar-icon\");\n    const searchCrossIcon = document.getElementById(\"search-cross-icon\");\n    const searchIcon = document.getElementById(\"search-icon\");\n    const dayEventId = document.getElementById(\"day-event-id\");\n    let datepicker;\n    let calendar = null;\n    \/\/ Store filter state\n    let isUpcoming = sessionStorage.getItem('eventFilterToggle') !== 'past';\n    let calendarView = sessionStorage.getItem('eventsView') !== 'calendar';\n    let startDate = null;\n    let endDate = null;\n    let selectedEventTypeName = null;\n    selectedEventTypeName = \"browse-all\";\n    let eventTabName = \"Events\";\n\n    function updateToggleVisualState(wrapper, isActive) {\n      const knob = wrapper.querySelector(\".toggle-knob\");\n      const activeText = wrapper.querySelector(\".active\");\n      const inactiveText = wrapper.querySelector(\".inactive\");\n      if (isActive) {\n        knob.style.transform = \"translateX(0)\";\n        activeText.classList.add('active');\n        activeText.classList.remove('inactive');\n        inactiveText.classList.add('inactive');\n        inactiveText.classList.remove('active');\n      } else {\n        knob.style.transform = \"translateX(100%)\";\n        activeText.classList.add('inactive');\n        activeText.classList.remove('active');\n        inactiveText.classList.add('active');\n        inactiveText.classList.remove('inactive');\n      }\n    }\n\n    function updateEventTabName(tabSlug) {\n      selectedEventTypeName = tabSlug;\n      const activeTab = document.querySelector(\n        `.event-tab-btn[data-event-tab=\"${tabSlug}\"], \n     .event-subtabs-dropdown-item[data-event-tab=\"${tabSlug}\"]`\n      );\n      if (activeTab) {\n        const eventTypeName = activeTab.getAttribute(\"data-event-name\");\n        if (tabSlug === \"browse-all\") {\n          eventTabName = \"Events\";\n        } else if (tabSlug === \"conference\") {\n          eventTabName = \"Conferences\";\n        } else {\n          eventTabName = eventTypeName;\n        }\n      }\n    }\n    document.querySelectorAll(\".event-tab-btn, .event-subtabs-dropdown-item\").forEach(btn => {\n      btn.addEventListener(\"click\", () => {\n        updateEventTabName(btn.dataset.eventTab);\n        setQueryParam(\"tab\", btn.dataset.eventTab);\n      });\n    });\n    let allEvents = [];\n\n    const popupModal = document.getElementById(\"event-popup-modal\");\n    const popupContent = document.getElementById(\"popup-content\");\n    popupContent.addEventListener('click', (e) => {\n      e.stopPropagation();\n    });\n\n    document.querySelectorAll(\".event-tab-btn, .event-subtabs-dropdown-item\").forEach(tab => {\n      tab.addEventListener(\"click\", () => {\n        const slug = tab.getAttribute(\"data-event-tab\");\n        selectedEventTypeName = slug;\n        document.querySelectorAll(\".event-tab-btn\").forEach(t => t.classList.remove(\"text-brand-future-green\",\n          \"border-b-[.4375rem]\", \"border-brand-future-green\"));\n        tab.classList.add(\"text-brand-future-green\", \"border-b-[.4375rem]\", \"border-brand-future-green\");\n        loadPosts();\n      });\n    });\n\n    setupEventListeners();\n\n    const initDatePicker = () => {\n      const isDesktop = window.matchMedia(\"(min-width: 768px)\").matches;\n\n      datepicker = flatpickr(\"#event-date\", {\n        mode: \"range\",\n        dateFormat: \"M d, Y\",\n        showMonths: isDesktop ? 2 : 1,\n        clickOpens: false,\n        onChange: function (selectedDates, dateStr, instance) {\n          if (selectedDates.length === 2) {\n            startDate = Math.floor(selectedDates[0].getTime() \/ 1000);\n            endDate = Math.floor(selectedDates[1].getTime() \/ 1000);\n            loadPosts();\n            calendarIcon.classList.add('hidden');\n            calendarCrossIcon.classList.remove('hidden');\n          } else if (selectedDates.length === 0) {\n            startDate = null;\n            endDate = null;\n            calendarIcon.classList.remove('hidden');\n            calendarCrossIcon.classList.add('hidden');\n            loadPosts();\n          }\n        }\n      });\n    };\n\n    initDatePicker();\n    const toggleDatepicker = (e) => {\n      e.preventDefault();\n      if (!datepicker) return;\n      datepicker.isOpen ? datepicker.close() : datepicker.open();\n    };\n\n    dateFilterInput.addEventListener('click', toggleDatepicker);\n    calendarIcon.addEventListener('click', toggleDatepicker);\n\n    window.addEventListener(\"resize\", () => {\n      if (datepicker) datepicker.destroy();\n      initDatePicker();\n    });\n\n    if (calendarIcon) {\n      calendarIcon.addEventListener(\"click\", () => {\n        if (datepicker) datepicker.open();\n      });\n    }\n    \/\/ Toggle logic\n\n    document.querySelectorAll(\".toggle-wrapper\").forEach(wrapper => {\n      const toggleBtn = wrapper.querySelector(\".event-toggle\");\n      const knob = wrapper.querySelector(\".toggle-knob\");\n      let isActive;\n      if (wrapper.id === \"filter-toggle\") {\n        isActive = isUpcoming;\n      } else if (wrapper.id === \"view-toggle\") {\n        isActive = calendarView;\n      } else {\n        isActive = true;\n      }\n      if (isActive) {\n        knob.style.transform = \"translateX(0)\";\n      } else {\n        knob.style.transform = \"translateX(100%)\";\n      }\n      if (wrapper.id === \"filter-toggle\") {\n        updateToggleVisualState(wrapper, isUpcoming);\n      }\n\n      toggleBtn.addEventListener(\"click\", () => {\n        isActive = !isActive;\n        if (isActive) {\n          knob.style.transform = \"translateX(0)\";\n        } else {\n          knob.style.transform = \"translateX(100%)\";\n        }\n\n        let payload = {};\n        if (wrapper.id === \"filter-toggle\") {\n          isUpcoming = isActive;\n          sessionStorage.setItem('eventFilterToggle', isUpcoming ? 'upcoming' : 'past');\n          updateToggleVisualState(wrapper, isUpcoming);\n          loadPosts();\n        } else if (wrapper.id === \"view-toggle\") {\n          calendarView = isActive;\n          sessionStorage.setItem('eventsView', calendarView ? 'list' : 'calendar');\n\n          payload = {\n            view: calendarView ? \"list\" : \"calendar\"\n          };\n          const listContainer = document.getElementById(\"events-container\");\n          const calendarContainer = document.getElementById(\"calendar-container\");\n\n          if (calendarView) {\n            listContainer.classList.add(\"event-grid-display\");\n            listContainer.style.display = \"\";\n            calendarContainer.style.display = \"none\";\n            if (calendar) {\n              calendar.destroy();\n              calendar = null;\n            }\n          } else {\n            listContainer.style.display = \"none\";\n            calendarContainer.style.display = \"\";\n            if (calendarEl) {\n              if (calendar) {\n                calendar.destroy();\n                calendar = null;\n              }\n              initCalendar();\n              loadPosts();\n            }\n          }\n        }\n        wrapper.dispatchEvent(new CustomEvent(\"toggleChange\", {\n          detail: payload\n        }));\n      });\n    });\n\n    const listContainer = document.getElementById(\"events-container\");\n    const calendarContainer = document.getElementById(\"calendar-container\");\n\n    if (calendarView) {\n      listContainer.classList.add(\"event-grid-display\");\n      listContainer.style.display = \"\";\n      calendarContainer.style.display = \"none\";\n    } else {\n      listContainer.style.display = \"none\";\n      calendarContainer.style.display = \"\";\n      if (calendarEl && !calendar) {\n        initCalendar();\n      }\n    }\n    const filterWrapper = document.getElementById('filter-toggle');\n    if (filterWrapper) {\n      updateToggleVisualState(filterWrapper, isUpcoming);\n    }\n\n    function toGoogleDateUTC(d) {\n      return d.toISOString().replace(\/[-:]\/g, \"\").split(\".\")[0] + \"Z\";\n    }\n\n    function toYMDUTC(d) {\n      return d.toISOString().slice(0, 10).replace(\/-\/g, \"\");\n    }\n\n    function stripHTML(html = \"\") {\n      const div = document.createElement(\"div\");\n      div.innerHTML = html;\n      return (div.textContent || div.innerText || \"\").trim();\n    }\n\n    function buildGoogleCalendarLinkFromEvent(eventData) {\n      const ts = Number(eventData.event_date);\n      const hasStartTime = !!eventData.event_start_time;\n\n      let start = hasStartTime ?\n        getDateTime(ts, eventData.event_start_time, false) :\n        new Date(ts * 1000);\n\n      let end = eventData.event_end_time ?\n        getDateTime(ts, eventData.event_end_time, true) :\n        (hasStartTime ? new Date(start.getTime() + 60 * 60 * 1000) : null);\n\n      const url = new URL(\"https:\/\/calendar.google.com\/calendar\/render\");\n      url.searchParams.set(\"action\", \"TEMPLATE\");\n      url.searchParams.set(\"text\", eventData.title || \"\");\n      url.searchParams.set(\"details\", stripHTML(eventData.description || \"\"));\n      url.searchParams.set(\"location\", \"\");\n\n      if (hasStartTime) {\n        url.searchParams.set(\"dates\", `${toGoogleDateUTC(start)}\/${toGoogleDateUTC(end)}`);\n      } else {\n        const startDay = toYMDUTC(start);\n        const endDay = toYMDUTC(new Date(start.getTime() + 24 * 60 * 60 * 1000));\n        url.searchParams.set(\"dates\", `${startDay}\/${endDay}`);\n      }\n\n      return url.toString();\n    }\n\n    function showEventPopup(eventData, eventIndex) {\n      const formattedDate = formatDate(eventData.date);\n      const monthDay = formattedDate ? formattedDate.monthDay : '';\n      const year = formattedDate ? formattedDate.year : '';\n      const googleCalendarLink = buildGoogleCalendarLinkFromEvent(eventData);\n      const upcoming = isEventUpcoming(eventData);\n      const formatTime = (time) => time ? time.replace(\/\\s(am|pm)$\/i, '$1') : '';\n      const popupHTML = `\n        <div class=\"flex flex-col w-full mx-auto relative\">\n          <a href=\"${eventData.permalink || '#'}\" class=\"bg-brand-jersey-blue p-6\">\n          <div class=\"flex gap-4 justify-between items-center mb-4\">\n           <div>\n           ${eventData.choose_event_type ? `<div class=\"w-max px-4 py-2 text-p3 font-normal bg-brand-future-green rounded-[0.3125rem] text-white font-tradeGothic font-normal max-sm:mx-auto\">\n          ${eventData.choose_event_type}<\/div>` : ''}\n           <\/div>\n           <div class=\"z-[60] w-[1.8rem] h-[1.8rem] bg-brand-gold flex-shrink-0 rounded-full flex items-center justify-center cursor-pointer golden-icon\" \n           onclick=\"event.preventDefault(); event.stopPropagation(); closeEventPopup()\">\n           <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"h-[1.1rem] w-[1.1rem] text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" \/>\n           <\/svg>\n           <\/div>\n           <\/div>\n            <div class=\"text-p2 font-bold text-white mb-4 max-sm:text-center\">${eventData.title}<\/div>\n            <div class=\"bg-white rounded-[.3125rem] p-4 mb-6\">\n              <div class=\"flex justify-between items-center gap-4\">\n                <span class='font-tradeGothic text-p3 font-bold text-brand-slate-grey'>${formattedDate ? formattedDate.monthDay + ', ' + formattedDate.year : ''}<\/span>\n                <p class='font-tradeGothic text-p3 font-bold text-brand-slate-grey lowercase'>\n                  ${eventData.event_start_time ? `<span>${formatTime(eventData.event_start_time)}<\/span>` : ''}\n                  ${eventData.event_end_time ? `<span>- <\/span><span>${formatTime(eventData.event_end_time)}<\/span>` : ''}\n                <\/p>\n              <\/div>\n              ${eventData.event_description ? `<div class=\"my-4 w-full h-[.0625rem] bg-brand-gold\"><\/div>` : ''}\n            ${eventData.event_description ? `<div class=\"htmlBlock !text-p3 [&#038;>p]:!text-p3 text-brand-slate-grey line-clamp-5 max-sm:[&>p]:!text-center\">${eventData.event_description}<\/div>` : ''}\n            <\/div>\n            <div class=\"flex items-center [@media(min-width:460px)]:gap-4 [@media(min-width:460px)]:justify-between justify-center [@media(min-width:460px)]:flex-row flex-col bg-brand-jersey-blue [@media(max-width:460px)]:mb-4 \">\n              <div\n                 class=\" w-max flex justify-center items-center py-3 px-5 rounded-[.3125rem] whitespace-nowrap bg-brand-gold group cursor-pointer\">\n                <span class=\"text-white text-p3 font-tradeGothic\">Learn More<\/span>\n               <img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/Vector-14.svg\"\n                  alt=\"chevron-right-white\" class=\"w-8 h-5 flex-shrink-0 group-hover:ml-2 transition-all duration-200\">\n              <\/div>\n                ${upcoming ? `<button type=\"button\"\n               onclick=\"event.preventDefault(); event.stopPropagation(); window.open('${googleCalendarLink}', '_blank')\"\n               class=\"group relative z-[60] font-tradeGothic text-p3 font-normal py-[0.625rem] text-white border-b-2 border-brand-gold flex justify-between items-center\">\n              <span>Add to calendar<\/span>\n              <img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/Vector-14.svg\"\n              alt=\"chevron-right-white\"\n              class=\"ml-2 w-8 h-5 flex-shrink-0 transition-transform duration-200 group-hover:translate-x-1\">\n              <\/button>\n               ` : ``}\n               <\/div>\n          <\/a>\n          <div class=\"w-full flex justify-between items-center py-4 px-6 gap-6 bg-brand-med-grey\">\n            <div class=\"w-full flex gap-3 items-center justify-between  ${eventIndex > 0 ? 'opacity-100 cursor-pointer' : 'opacity-50'}\" onclick=\"navigateEventPopup(${eventIndex > 0 ? eventIndex - 1 : 'null'})\">\n                <div class='w-full'>\n                <div class=\"text-p2 text-brand-slate-grey font-bold text-right\">Previous<\/div>\n              <\/div>\n               <img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/08\/1.svg\" alt=\"previous-icon\" class=\"rotate-180\">\n            <\/div>\n            <div class=\"w-[1.5rem] h-[1.5rem] bg-brand-gold flex-shrink-0 rounded-full flex items-center justify-center cursor-pointer golden-icon\" onclick=\"closeEventPopup()\">\n              <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"h-[1rem] w-[1rem] text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"w-full flex gap-3 items-center justify-between  ${eventIndex < allEvents.length - 1 ? 'opacity-100 cursor-pointer' : 'opacity-50 '}\" onclick=\"navigateEventPopup(${eventIndex < allEvents.length - 1 ? eventIndex + 1 : 'null'\n        })\">\n      <img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/08\/1.svg\" alt=\"next-icon\" >\n        <div class='w-full'>\n          <div class=\"text-p2 text-brand-slate-grey font-bold text-left \">Next<\/div>\n        <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n    `;\n\n      popupContent.innerHTML = popupHTML;\n      popupModal.classList.remove('hidden');\n      popupModal.classList.add('flex');\n      popupModal.scrollIntoView({\n        behavior: 'smooth',\n        block: 'center'\n      });\n    }\n\n    function closeEventPopup() {\n      popupModal.classList.add('hidden');\n      popupModal.classList.remove('flex');\n    }\n\n    function navigateEventPopup(index) {\n      if (index !== null && index >= 0 && index < allEvents.length) {\n        showEventPopup(allEvents[index], index);\n      }\n    }\n\n    window.closeEventPopup = closeEventPopup;\n    window.navigateEventPopup = navigateEventPopup;\n    window.addEventListener('click', (e) => {\n      if (popupContent && !popupContent.contains(e.target)) {\n        closeEventPopup();\n      }\n    });\n    document.addEventListener('click', (event) => {\n      const calendarDropdown = document.querySelector('.flatpickr-calendar');\n      const dateInput = document.getElementById('event-date');\n\n      if (datepicker && calendarDropdown && dateInput) {\n        if (\n          !calendarDropdown.contains(event.target) &&\n          event.target !== dateInput\n        ) {\n          datepicker.close();\n        }\n      }\n    });\n\n    \/\/ Close popup with Escape key\n    document.addEventListener('keydown', (e) => {\n      if (e.key === 'Escape' && !popupModal.classList.contains('hidden')) {\n        closeEventPopup();\n      }\n    });\n    \/\/ Initialize calendar function\n    function initCalendar() {\n      if (calendar) {\n        calendar.destroy();\n      }\n\n      function adjustColFrameWidths() {\n        const calendarWrapper = document.querySelector(\".fc-timeGridDay-view\");\n\n        if (calendarWrapper) {\n          calendarWrapper.querySelectorAll(\".fc-timegrid-col-events\").forEach(colEvents => {\n            const harnessCount = colEvents.querySelectorAll(\".fc-timegrid-event-harness\").length;\n            const colFrame = colEvents.closest(\".fc-timegrid-col\").querySelector(\".fc-timegrid-col-frame\");\n\n            if (colFrame && harnessCount > 0) {\n              const newWidth = 16.6 * harnessCount;\n              colFrame.style.width = `${newWidth}%`;\n            }\n          });\n        }\n      }\n\n      calendar = new FullCalendar.Calendar(calendarEl, {\n        initialView: 'dayGridMonth',\n        eventDisplay: 'block',\n        dayMaxEventRows: false,\n        height: \"auto\",\n        dayHighlight: true,\n        slotEventOverlap: false,\n        eventOverlap: false,\n        eventMinWidth: 60,\n        eventClassNames: 'custom-event-spacing',\n        headerToolbar: {\n          left: 'today prev,next',\n          center: 'title',\n          right: 'dayGridMonth,timeGridWeek,timeGridDay'\n        },\n        buttonText: {\n          today: 'Today',\n          prev: 'Previous',\n          next: 'Next',\n        },\n        allDaySlot: false,\n        events: [],\n\n        eventContent: function (arg) {\n          const {\n            event\n          } = arg;\n          if (event.allDay) {\n            return {\n              html: `\n            <div id='day-event-id' class=\"fc-event-custom fc-all-day-event\">\n              <div class=\"fc-event-title font-tradeGothic text-p3 font-normal text-brand-black !whitespace-normal !line-clamp-3\">${event.title || ''}<\/div>\n            <\/div>\n            `\n            };\n          } else {\n            let startStr = '';\n            let endStr = '';\n\n            if (event.start) {\n              startStr = event.start.toLocaleTimeString([], {\n                hour: 'numeric',\n                minute: '2-digit',\n                hour12: true\n              }).toLowerCase();\n            }\n            if (event.end) {\n              endStr = event.end.toLocaleTimeString([], {\n                hour: 'numeric',\n                minute: '2-digit',\n                hour12: true\n              }).toLowerCase();\n            }\n            const formatTime = (time) => {\n              return time ? time.replace(\/\\s(am|pm)$\/i, '$1') : '';\n            };\n            const start = formatTime(startStr);\n            const end = formatTime(endStr);\n            const timeText = start && end ? `${start} - ${end}` : start || '';\n\n            return {\n              html: `\n        <div id='day-event-id' class=\"fc-event-custom\">\n          <div class=\"font-tradeGothic text-p3 font-bold text-brand-future-green text-start mb-1 whitespace-break-spaces\">${timeText}<\/div>\n          <div class=\"fc-event-title font-tradeGothic text-p3 font-normal text-brand-black !whitespace-normal !line-clamp-3\">${event.title}<\/div>\n        <\/div>\n      `\n            };\n          }\n        },\n\n        eventClick: function (info) {\n          info.jsEvent.preventDefault();\n          info.jsEvent.stopPropagation();\n          const index = parseInt(info.event.id, 10);\n          if (!isNaN(index) && allEvents[index]) {\n            showEventPopup(allEvents[index], index);\n          }\n        },\n\n        eventDidMount: function () {\n          document.querySelectorAll(\".fc-v-event\").forEach(eventEl => {\n            const height = eventEl.getBoundingClientRect().height;\n            const titleEl = eventEl.querySelector(\".fc-event-title\");\n\n            if (titleEl) {\n              titleEl.classList.remove(\"!line-clamp-1\", \"!line-clamp-2\", \"!line-clamp-3\");\n\n              if (height <= 45) {\n                titleEl.classList.add(\"!line-clamp-1\");\n              } else if (height <= 65) {\n                titleEl.classList.add(\"!line-clamp-2\");\n              } else {\n                titleEl.classList.add(\"!line-clamp-3\");\n              }\n            }\n          });\n\n          adjustColFrameWidths();\n        },\n\n        datesSet: function () {\n          \/\/ re-run after view change (month\/week\/day switch)\n          setTimeout(() => {\n            document.querySelectorAll(\".fc-v-event\").forEach(eventEl => {\n              const height = eventEl.getBoundingClientRect().height;\n              const titleEl = eventEl.querySelector(\".fc-event-title\");\n\n              if (titleEl) {\n                titleEl.classList.remove(\"!line-clamp-1\", \"!line-clamp-2\", \"!line-clamp-3\");\n\n                if (height <= 45) {\n                  titleEl.classList.add(\"!line-clamp-1\");\n                } else if (height <= 65) {\n                  titleEl.classList.add(\"!line-clamp-2\");\n                } else {\n                  titleEl.classList.add(\"!line-clamp-3\");\n                }\n              }\n            });\n            adjustColFrameWidths();\n          }, 30);\n        }\n      });\n\n      calendar.render();\n    }\n\n    \/\/ Event rendering logic\n\n    function toggleSearchIcons() {\n      if (searchInput.value.trim() !== '') {\n        searchIcon.classList.add('hidden');\n        searchCrossIcon.classList.remove('hidden');\n      } else {\n        searchIcon.classList.remove('hidden');\n        searchCrossIcon.classList.add('hidden');\n      }\n    }\n\n    function setupEventListeners() {\n      if (searchInput) {\n        searchInput.addEventListener('input', debounce(() => {\n          loadPosts();\n        }, 300));\n      }\n\n      if (dateFilterInput) {\n        dateFilterInput.addEventListener('change', () => {\n          if (!dateFilterInput.value) {\n            startDate = null;\n            endDate = null;\n            calendarIcon.classList.remove('hidden');\n            calendarCrossIcon.classList.add('hidden');\n            loadPosts();\n          }\n        });\n      }\n\n      if (searchInput) {\n        searchInput.addEventListener('input', toggleSearchIcons);\n      }\n\n      searchCrossIcon.addEventListener('click', () => {\n        searchInput.value = '';\n        toggleSearchIcons();\n        loadPosts();\n        searchInput.focus();\n      });\n\n      document.addEventListener('click', function (e) {\n        if (e.target.closest('.browse-past-btn')) {\n          e.preventDefault();\n          const filterWrapper = document.getElementById('filter-toggle');\n          isUpcoming = false;\n          sessionStorage.setItem('eventFilterToggle', 'past');\n          updateToggleVisualState(filterWrapper, false);\n          loadPosts();\n        }\n      });\n\n      calendarCrossIcon.addEventListener('click', () => {\n        if (datepicker) {\n          datepicker.clear();\n        }\n        startDate = null;\n        endDate = null;\n        calendarIcon.classList.remove('hidden');\n        calendarCrossIcon.classList.add('hidden');\n        loadPosts();\n      });\n    }\n\n    function formatDate(dateStr) {\n      if (!dateStr) return null;\n      let date;\n      if (\/^\\d{2}\\\/\\d{2}\\\/\\d{4}$\/.test(dateStr)) {\n        const [day, month, year] = dateStr.split(\"\/\");\n        date = new Date(`${year}-${month}-${day}`);\n      } else {\n        date = new Date(dateStr);\n      }\n      if (isNaN(date)) return null;\n      return {\n        monthDay: date.toLocaleDateString(\"en-US\", {\n          month: \"short\",\n          day: \"numeric\"\n        }),\n        year: date.getFullYear(),\n        time: date.toLocaleTimeString(\"en-US\", {\n          hour: \"numeric\",\n          minute: \"2-digit\",\n          hour12: true\n        })\n      };\n    }\n\n    function generateEventHTML(events) {\n      if (!events.length) {\n        const eventsContainer = document.getElementById(\"events-container\");\n        if (!eventsContainer) return '';\n\n        const sectionContainer = document.querySelector('[data-testid=\"section-event-cards\"]');\n        const browseAllData = {\n          no_events_title: sectionContainer?.getAttribute('data-browse-all-title') || '',\n          no_events_description: sectionContainer?.getAttribute('data-browse-all-description') || '',\n          no_events_image: sectionContainer?.getAttribute('data-browse-all-image') || '',\n        };\n\n        let message = \"We couldn't find any events that match your search \u2014 please try again.\";\n\n        if (isUpcoming) {\n          if (selectedEventTypeName === \"browse-all\" || selectedEventTypeName === null) {\n            if (browseAllData.no_events_title || browseAllData.no_events_description || browseAllData\n              .no_events_image) {\n              message = generateMessageHTML(browseAllData);\n            }\n          } else if (selectedEventTypeName && selectedEventTypeName !== \"browse-all\") {\n            const activeTab = document.querySelector(\n              `.event-tab-btn[data-event-tab=\"${selectedEventTypeName}\"], \n         .event-subtabs-dropdown-item[data-event-tab=\"${selectedEventTypeName}\"]`\n            );\n\n            if (activeTab) {\n              const noEventsTitle = activeTab.getAttribute(\"data-no-events-title\");\n              const noEventsDescription = activeTab.getAttribute(\"data-no-events-description\");\n              const noEventsImage = activeTab.getAttribute(\"data-no-events-image\");\n              if (noEventsTitle || noEventsDescription || noEventsImage) {\n                message = generateMessageHTML({\n                  no_events_title: noEventsTitle,\n                  no_events_description: noEventsDescription,\n                  no_events_image: noEventsImage\n                });\n              } else {\n                const eventTypeName = activeTab.getAttribute(\"data-event-name\");\n                message = `No ${eventTypeName} Found`;\n              }\n            }\n          }\n        } else if (selectedEventTypeName && selectedEventTypeName !== \"browse-all\") {\n          const activeTab = document.querySelector(\n            `.event-tab-btn[data-event-tab=\"${selectedEventTypeName}\"], \n       .event-subtabs-dropdown-item[data-event-tab=\"${selectedEventTypeName}\"]`\n          );\n          const eventTypeName = activeTab?.getAttribute(\"data-event-name\") || \"\";\n          if (eventTypeName) message = `No ${eventTypeName} Found`;\n        }\n\n        return `<div class=\"text-center text-brand-black text-p1 pb-10 col-span-6\">${message}<\/div>`;\n      }\n\n      function generateMessageHTML(data) {\n        const {\n          no_events_title,\n          no_events_description,\n          no_events_image\n        } = data;\n        const hasImage = !!no_events_image;\n        return `\n       <div class=\"bg-brand-grey relative overflow-hidden\">\n          <div class=\"container py-10 md:py-14 bg-brand-grey\">\n          <div class=\"${hasImage ? 'w-full md:w-[54%]' : 'w-full'} font-gotham relative z-[80]\">\n          ${no_events_title ? `<h2 class=\"text-brand-jersey-blue !text-h2 font-medium mb-6  ${hasImage ? 'max-md:!text-center !text-start' : '[&#038;>p]:!text-center'}\">${no_events_title}<\/h2>` : ''}\n          ${no_events_description ? `\n            <div class=\"htmlBlock [&#038;>p]:!text-brand-black text-brand-black ${hasImage ? 'htmlBlock-para-style' : '[&>p]:!text-center'}\">\n              ${no_events_description}\n            <\/div> \n          ` : ''}\n          <button type=\"button\" class=\"browse-past-btn sm:w-max flex justify-center items-center py-3 px-5 rounded-[.3125rem] whitespace-normal sm:whitespace-nowrap bg-brand-gold group cursor-pointer mt-8 ${hasImage ? 'max-md:!mx-auto' : '!mx-auto'}\">\n            <span class=\"text-white text-p2 font-tradeGothic\">Browse Past ${eventTabName}<\/span>\n            <img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/Vector-14.svg\"\n                 alt=\"chevron-right-white\" class=\"w-8 h-5 flex-shrink-0 group-hover:ml-2 transition-all duration-200\">\n          <\/button>\n        <\/div>\n       <\/div>\n          ${hasImage ? `\n        <div class=\"max-md:hidden absolute top-0 h-full w-[50%] right-[-1.5rem]\"\n            style=\"background-image: url('${no_events_image}'); background-size: cover; background-position: center; background-repeat: no-repeat;\">\n          <img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/08\/Frame-1261152809.svg\" alt=\"banner-vector\"\n              class=\"object-cover object-left absolute top-0 left-[-0.0938rem] bottom-[-1rem] lg:bottom-[-8rem] h-full w-full\">\n        <\/div>\n        <img decoding=\"async\" src=\"${no_events_image}\" alt=\"banner-image\"\n            class=\"md:hidden w-full object-cover object-center h-[22rem]\">\n      ` : ''}\n    <\/div>\n  `;\n      }\n      return events?.filter(hit => hit?.document?.only_show_in_calendar !== '1')?.map((hit) => {\n        const event = hit.document;\n        const eventDate = formatDate(event.date);\n        \/\/ check if event is upcoming\n        const nowMs = Date.now();\n        let startDateObj = null;\n        try {\n          startDateObj = getDateTime(event.event_date, event.event_start_time);\n        } catch (e) {\n          startDateObj = null;\n        }\n        const startMs = startDateObj ? startDateObj.getTime() : (event.event_date ? event.event_date * 1000 :\n          null);\n        const isUpcoming = (startMs !== null) ? (startMs >= nowMs) : true;\n        const googleCalendarLink = typeof buildGoogleCalendarLinkFromEvent === 'function' ?\n          buildGoogleCalendarLinkFromEvent(event) :\n          '#';\n        let videoThumbnail = null;\n        if (event.choose_event_slug === \"webinars\" && event.video_url) {\n          const srcMatch = event.video_url.match(\/src=\"([^\"]+)\"\/);\n          if (srcMatch && srcMatch[1]) {\n            const srcUrl = srcMatch[1];\n            const idMatch = srcUrl.match(\/youtube\\.com\\\/embed\\\/([^\"?]+)\/);\n            if (idMatch && idMatch[1]) {\n              const videoId = idMatch[1];\n              videoThumbnail = `https:\/\/img.youtube.com\/vi\/${videoId}\/sddefault.jpg`;\n            }\n          }\n        }\n        const displayImage = videoThumbnail ||\n          event.preview_image ||\n          event.featured_image ||\n          `${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/NJF-Logo-Navigation.svg`;\n        return `\n      <a href=\"${event.permalink || '#'}\" target=\"_blank\" \n         class=\"event-grid-display-box block hover:scale-[1.02] transition-all duration-200\">\n          <div class=\"flex lg:flex-row flex-col md:gap-10 gap-5 pb-10 border-b border-brand-natural-grey\">\n            <div class=\"lg:w-[10%] w-full\">\n              ${eventDate && eventDate.monthDay ? `\n              <h3 class=\"!text-h4 font-gotham text-brand-jersey-blue font-medium max-lg:text-center whitespace-nowrap\">${eventDate.monthDay}<\/h3>\n              <div class=\"w-[3.875rem] h-[.0625rem] bg-brand-light-steel-blue my-[.625rem] max-lg:mx-auto\"><\/div>\n              <div class=\"text-brand-black font-tradeGothic font-normal max-lg:text-center\">${eventDate.year}<\/div>\n            ` : ''}\n            <\/div>\n            <div class=\"lg:w-[30%] w-full h-[22.5rem] bg-brand-light-green relative\">\n              <img decoding=\"async\"\n                src=\"${displayImage}\"\n                alt=\"${event.title}\"\n                class=\"h-full w-full object-contain\"\n              >\n              ${event.choose_event_slug === \"webinars\" && event.video_url\n            ? `<img decoding=\"async\" src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/Button_-Play.svg\"\n           alt=\"Play Button\"\n           class=\"absolute top-1\/2 left-1\/2 transform -translate-x-1\/2 -translate-y-1\/2 z-20 w-[3.6875rem] h-[3.6875rem]\" \/>`\n            : ''}\n\n            <\/div>\n            <div class=\"lg:w-[60%] w-full max-lg:text-center\">\n              <div class=\"text-p1 font-bold text-brand-jersey-blue mb-4\">${event.title}<\/div>\n              ${(event.show_tag !== '1' && event.choose_event_type)\n            ? `<div class=\"py-[.625rem] px-4 text-p3 mb-4 font-normal text-brand-future-green bg-[#D1F0CD] \n                  border rounded-[.3125rem] border-brand-soft-green w-max max-lg:mx-auto\">\n                  ${event.choose_event_type}\n                <\/div>`\n            : ''}\n              <div class=\"text-brand-future-green font-tradeGothic font-bold text-p2 lowercase\">\n               <span>${(event.event_start_time || '').replace(\/\\s(am|pm)\/i, '$1')}<\/span>\n               ${event.event_end_time ? `<span> - <\/span><span>${event.event_end_time.replace(\/\\s(am|pm)\/i, '$1')}<\/span>` : \"\"}\n               <\/div>\n              <div class=\"h-[.0625rem] w-full bg-brand-light-steel-blue my-4\"><\/div>\n              <div class=\"htmlBlock !text-p2 text-brand-black max-lg:[&#038;>p]:!text-center\">\n                ${event.event_description || ''}\n              <\/div>\n              <div class=\"max-lg:mx-auto mt-6 flex max-xsm:flex-wrap max-lg:justify-center items-center gap-6\">\n                <div class=\"flex justify-center items-center py-3 px-5 rounded-[.3125rem] whitespace-nowrap bg-brand-gold group cursor-pointer\">\n                  <span class=\"text-white text-p2 font-tradeGothic\">View Event<\/span>\n                  <img decoding=\"async\"\n                    src=\"${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/Vector-14.svg\"\n                    alt=\"chevron-right-white\"\n                    class=\"w-8 h-5 flex-shrink-0 group-hover:ml-2 transition-all duration-200\"\n                  >\n                <\/div>\n                ${isUpcoming ? `\n                <button type=\"button\" onclick=\"event.stopPropagation(); window.open('${googleCalendarLink}', '_blank')\" \n                  class=\"group font-tradeGothic text-p3 font-normal py-[0.625rem] text-white border-b-2 border-brand-gold flex justify-between items-center whitespace-nowrap\">\n                  <span class=\"text-brand-jersey-blue text-p2 font-tradeGothic\">Add to calendar<\/span>\n                      <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/themes\/new-jersey-production\/assets\/images\/icons\/arrow-right-blue.svg\"\n                      alt=\"chevron-right-white\"\n                       class=\"ml-2 w-8 h-5 flex-shrink-0 transition-transform duration-200 group-hover:translate-x-1\">\n                <\/button>\n              ` : ''}\n              <\/div>\n            <\/div>\n          <\/div>\n      <\/a>\n          `;\n      }).join('');\n    }\n\n    const getDateTime = (timestamp, timeStr, isEnd = false) => {\n      if (!timestamp) return null;\n\n      \/\/ Convert timestamp to Date object\n      let baseDate;\n      if (typeof timestamp === 'number') {\n        baseDate = new Date(timestamp * 1000);\n      } else if (typeof timestamp === 'string') {\n        baseDate = new Date(timestamp);\n      } else {\n        return null;\n      }\n      if (!timeStr || timeStr.trim() === '') return null;\n      const timeStrClean = timeStr.trim().toLowerCase();\n      let match;\n      if (timeStrClean.match(\/^\\d{1,2}:\\d{2}\\s?(am|pm)$\/)) {\n        match = timeStrClean.match(\/^(\\d{1,2}):(\\d{2})\\s?(am|pm)$\/);\n      } else if (timeStrClean.match(\/^\\d{1,2}\\s?(am|pm)$\/)) {\n        match = timeStrClean.match(\/^(\\d{1,2})\\s?(am|pm)$\/);\n      }\n\n      if (!match) return null;\n\n      let hour, minute;\n      if (match.length === 4) {\n        [, hour, minute, ampm] = match;\n        hour = parseInt(hour, 10);\n        minute = parseInt(minute, 10);\n      } else {\n        [, hour, ampm] = match;\n        hour = parseInt(hour, 10);\n        minute = 0;\n      }\n\n      if (ampm === \"pm\" && hour !== 12) hour += 12;\n      if (ampm === \"am\" && hour === 12) hour = 0;\n\n      const date = new Date(\n        baseDate.getFullYear(),\n        baseDate.getMonth(),\n        baseDate.getDate(),\n        hour,\n        minute,\n        0,\n        0\n      );\n      if (isEnd && hour === 0 && minute === 0) {\n        date.setDate(date.getDate() + 1);\n      }\n      return date;\n    };\n    const isEventUpcoming = (event) => {\n      const nowMs = Date.now();\n      const start = getDateTime(event.event_date, event.event_start_time);\n      const end = getDateTime(event.event_date, event.event_end_time, true);\n      if (start || end) {\n        return (start && start.getTime() >= nowMs) || (end && end.getTime() >= nowMs);\n      }\n      if (event.event_date) {\n        const dayStart = event.event_date * 1000;\n        const dayEnd = dayStart + (24 * 60 * 60 * 1000) - 1;\n        return dayEnd >= nowMs;\n      }\n      return true;\n    };\n\n    async function loadPosts() {\n      try {\n        const search = searchInput ? searchInput.value.trim() : '';\n        const now = Math.floor(Date.now() \/ 1000);\n        let filterParts = [];\n\n        if (startDate && endDate) {\n          const endOfDay = endDate + 86399;\n          filterParts.push(`event_date:[${startDate}..${endOfDay}]`);\n        }\n        if (selectedEventTypeName && selectedEventTypeName !== 'browse-all') {\n          filterParts.push(`choose_event_slug:=[${selectedEventTypeName}]`);\n        }\n        if (isUpcoming) {\n          filterParts.push(\n            `(event_start_timestamp:>=${now} || event_end_timestamp:>=${now})`\n          );\n        } else {\n          filterParts.push(`event_end_timestamp:<${now}`);\n        }\n\n        const filterString = filterParts.length > 0 ? filterParts.join(' && ') : \"\";\n\n        const response = await fetch(\n          `${envConfig.TYPESENSE_BASE_URL}:${envConfig.TYPESENSE_PORT}\/collections\/events\/documents\/search?` +\n          new URLSearchParams({\n            'q': search || '*',\n            'query_by': 'title,date,formatted_date,event_start_time,event_end_time,choose_event_type,choose_event_slug,event_description,content,date_label,event_date_and_location,location_label,event_location,past_conference_description,winners_description,sponsors_description,jury_description,attendees_description',\n            'sort_by': isUpcoming ? 'event_date:asc' : 'event_date:desc',\n            'per_page': 100,\n            'filter_by': filterString\n          }), {\n          headers: {\n            'X-TYPESENSE-API-KEY': envConfig.TYPESENSE_SEARCH_ONLY_KEY,\n            'Content-Type': 'application\/json'\n          },\n        });\n\n        if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n        const data = await response.json();\n        allEvents = data.hits?.map(hit => hit.document).filter(event => !event?.external_link || event\n          ?.external_link === \"\");\n        const filteredHits = (data.hits || []).filter(hit => {\n          const doc = hit.document;\n          return !doc?.external_link || doc?.external_link === \"\";\n        });\n        document.getElementById(\"events-container\").innerHTML =\n          generateEventHTML(filteredHits);\n        const calendarData = filteredHits?.map((hit, index) => {\n          const event = hit.document;\n          const startDate = getDateTime(event.event_date, event.event_start_time);\n          const endDate = getDateTime(event.event_date, event.event_end_time, true);\n          const hasStartDate = !!event.event_date;\n          const hasStartTime = event.event_start_time && event.event_start_time.trim() !== '';\n          const hasEndTime = event.event_end_time && event.event_end_time.trim() !== '';\n          if (!hasStartDate) {\n            return null;\n          }\n          if (!hasStartTime) {\n            let eventDate;\n            if (typeof event.event_date === 'number') {\n              eventDate = new Date(event.event_date * 1000);\n            } else if (typeof event.event_date === 'string') {\n              eventDate = new Date(event.event_date);\n            } else {\n              eventDate = new Date(event.date);\n            }\n            const nextDay = new Date(eventDate);\n            nextDay.setDate(nextDay.getDate() + 1);\n\n            return {\n              id: index,\n              title: event.title,\n              start: eventDate,\n              end: nextDay,\n              allDay: true,\n              url: event.permalink || '#',\n              description: event.description || '',\n              featured_image: event.featured_image || ''\n            };\n          } else {\n            let calculatedEndDate = endDate;\n            if (!hasEndTime && startDate) {\n              calculatedEndDate = new Date(startDate.getTime() + (60 * 60 * 1000)); \/\/ 1 hour default\n            }\n            return {\n              id: index,\n              title: event.title,\n              start: startDate,\n              end: calculatedEndDate,\n              allDay: false,\n              url: event.permalink || '#',\n              description: event.description || '',\n              featured_image: event.featured_image || ''\n            };\n          }\n        }).filter(event => event !== null);\n        if (calendar) {\n          calendar.removeAllEvents();\n          calendar.addEventSource(calendarData);\n          if (!isUpcoming && allEvents.length > 0) {\n            const validDates = allEvents\n              .map(event => {\n                if (!event.event_date) return null;\n                const timestamp =\n                  typeof event.event_date === \"number\" ?\n                    event.event_date * 1000 :\n                    Date.parse(event.event_date);\n\n                return isNaN(timestamp) ? null : new Date(timestamp);\n              })\n              .filter(date => date !== null);\n\n            if (validDates.length > 0) {\n              const firstPastEvent = validDates.reduce((earliest, date) =>\n                !earliest || date < earliest ? date : earliest\n              );\n\n              calendar.gotoDate(firstPastEvent);\n            }\n          }\n\n          calendar.render();\n        }\n      } catch (error) {\n        console.error(\"Error fetching events:\", error);\n      }\n    }\n\n    function updateActiveTabOnResize() {\n      const isDesktop = window.matchMedia(\"(min-width: 1024px)\").matches;\n      if (isDesktop) {\n        const mobileActive = document.querySelector(\n          '#event-subtabs-tabs-select-options .event-subtabs-dropdown-item.bg-brand-future-green');\n        document.querySelectorAll('.event-tab-btn').forEach(tab => {\n          tab.classList.remove('text-brand-future-green', 'border-b-[.4375rem]', 'border-brand-future-green');\n        });\n        if (mobileActive) {\n          const slug = mobileActive.getAttribute('data-event-tab');\n          const desktopTab = document.querySelector(`.event-tab-btn[data-event-tab=\"${slug}\"]`);\n          if (desktopTab) {\n            desktopTab.classList.add('text-brand-future-green', 'border-b-[.4375rem]', 'border-brand-future-green');\n          }\n        }\n      }\n    }\n\n    function setQueryParam(key, value) {\n      const url = new URL(window.location.href);\n      url.searchParams.set(key, value);\n      window.history.pushState({}, '', url);\n    }\n    const tabId = new URLSearchParams(window.location.search).get(\"tab\");\n    window.addEventListener('resize', updateActiveTabOnResize);\n    window.addEventListener('load', updateActiveTabOnResize);\n    updateEventTabName(tabId);\n    loadPosts();\n    toggleSearchIcons();\n  });\n<\/script>","protected":false},"excerpt":{"rendered":"","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-4792","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Events - New Jersey Future<\/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:\/\/www.njfuture.org\/events\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Events - New Jersey Future\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.njfuture.org\/events\/\" \/>\n<meta property=\"og:site_name\" content=\"New Jersey Future\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/NewJerseyFuture\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-21T11:53:48+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@NewJerseyFuture\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/events\\\/\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/events\\\/\",\"name\":\"Events - New Jersey Future\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#website\"},\"datePublished\":\"2025-08-21T14:20:30+00:00\",\"dateModified\":\"2025-10-21T11:53:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/events\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.njfuture.org\\\/events\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/events\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.njfuture.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#website\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/\",\"name\":\"New Jersey Future\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.njfuture.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#organization\",\"name\":\"New Jersey Future\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/NJF-Footer-Logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.njfuture.org\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/NJF-Footer-Logo.svg\",\"width\":354,\"height\":285,\"caption\":\"New Jersey Future\"},\"image\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/NewJerseyFuture\\\/\",\"https:\\\/\\\/x.com\\\/NewJerseyFuture\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Events - New Jersey Future","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:\/\/www.njfuture.org\/events\/","og_locale":"en_US","og_type":"article","og_title":"Events - New Jersey Future","og_url":"https:\/\/www.njfuture.org\/events\/","og_site_name":"New Jersey Future","article_publisher":"https:\/\/www.facebook.com\/NewJerseyFuture\/","article_modified_time":"2025-10-21T11:53:48+00:00","twitter_card":"summary_large_image","twitter_site":"@NewJerseyFuture","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.njfuture.org\/events\/","url":"https:\/\/www.njfuture.org\/events\/","name":"Events - New Jersey Future","isPartOf":{"@id":"https:\/\/www.njfuture.org\/#website"},"datePublished":"2025-08-21T14:20:30+00:00","dateModified":"2025-10-21T11:53:48+00:00","breadcrumb":{"@id":"https:\/\/www.njfuture.org\/events\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.njfuture.org\/events\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.njfuture.org\/events\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.njfuture.org\/"},{"@type":"ListItem","position":2,"name":"Events"}]},{"@type":"WebSite","@id":"https:\/\/www.njfuture.org\/#website","url":"https:\/\/www.njfuture.org\/","name":"New Jersey Future","description":"","publisher":{"@id":"https:\/\/www.njfuture.org\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.njfuture.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.njfuture.org\/#organization","name":"New Jersey Future","url":"https:\/\/www.njfuture.org\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.njfuture.org\/#\/schema\/logo\/image\/","url":"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/12\/NJF-Footer-Logo.svg","contentUrl":"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/12\/NJF-Footer-Logo.svg","width":354,"height":285,"caption":"New Jersey Future"},"image":{"@id":"https:\/\/www.njfuture.org\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/NewJerseyFuture\/","https:\/\/x.com\/NewJerseyFuture"]}]}},"_links":{"self":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages\/4792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/comments?post=4792"}],"version-history":[{"count":10,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages\/4792\/revisions"}],"predecessor-version":[{"id":15060,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages\/4792\/revisions\/15060"}],"wp:attachment":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/media?parent=4792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}