{"id":1360,"date":"2026-03-13T02:17:56","date_gmt":"2026-03-13T02:17:56","guid":{"rendered":"https:\/\/gmwa-montgomeryal.com\/2026\/?page_id=1360"},"modified":"2026-03-17T12:40:08","modified_gmt":"2026-03-17T17:40:08","slug":"calendar","status":"publish","type":"page","link":"https:\/\/gmwa-montgomeryal.com\/2026\/calendar\/","title":{"rendered":"Calendar"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1360\" class=\"elementor elementor-1360\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a8098ee e-con-full e-flex e-con e-child\" data-id=\"a8098ee\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-524b151 elementor-widget elementor-widget-menu-anchor\" data-id=\"524b151\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"menu-anchor.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-menu-anchor\" id=\"schedule\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9ffbdf premium-header-block premium-title-second-noise-yes premium-lq__none premium-box-lq__none elementor-widget elementor-widget-premium-addon-dual-header\" data-id=\"a9ffbdf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"premium-addon-dual-header.default\">\n\t\t\t\t\t\n\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"premium-dual-header-first-header \"><span class=\"premium-dual-header-first-span\"> <\/span><span class=\"premium-dual-header-second-header \" data-text=\"Upcoming Events\">Upcoming Events<\/span><\/h2> \t\t\t\t<\/div>\n\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f45e752 e-con-full e-flex e-con e-child\" data-id=\"f45e752\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3f65d7c elementor-widget elementor-widget-shortcode\" data-id=\"3f65d7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <script>\n            let piecalAJAX = {\n            ajaxURL: \"https:\/\/gmwa-montgomeryal.com\/2026\/wp-admin\/admin-ajax.php\",\n            ajaxNonce: \"b603cef980\"\n            }\n\n            let alreadyExpandedOccurrences = [];\n\n            function piecalPrepareCustomViewsForCalendar( views ) {\n                let supportedEventHandlers = [\n                    'eventDataTransform',\n                    'dateClick',\n                    'eventClick', \n                    'eventDidMount', \n                    'dayCellDidMount', \n                    'viewDidMount', \n                    'viewWillUnmount',\n                    'dayHeaderContent',\n                    'dayHeaderDidMount'\n                ];\n\n                for( let view in views ) {\n                    let viewProps = views[view];\n\n                    for( let prop in viewProps ) {\n                        if( supportedEventHandlers.includes( prop ) ) {\n                            let eventHandlerCode = viewProps[prop];\n\n                            let handlerFunction = new Function( 'info', eventHandlerCode );\n\n                            viewProps[prop] = handlerFunction;\n                        }\n                    }\n\n                    \/\/ Remove customProps since we don't want those output inside the calendar object\n                    delete viewProps.customProps;\n\n                    \/\/ Add in the $atts['duration'] value if the view has a duration property.\n                    if( viewProps.duration ) {\n                        viewProps.duration = {\n                            months: 12                        };\n                    }\n                }\n\n                return views;\n            }\n            \n            document.addEventListener('DOMContentLoaded', function() {\n                var pieCalendarFirstLoad = true;\n                var calendarEl = document.getElementById('calendar');\n                var calendar = new FullCalendar.Calendar(calendarEl, {\n                    headerToolbar: false,\n                    initialView: \"listUpcoming\",\n                    editable: false,\n                    eventSources: [[{\"title\":\"An Evening with Quartet\",\"start\":\"2026-03-29T15:28:00\",\"end\":\"2026-03-29T16:28:00\",\"details\":\"March 29,2026 - A Evening with Quartet\\r\\n\\r\\n3 pm, New Birth Baptist Church,\\u00a0 \\u00a0 \\u00a0 \\u00a0 \\u00a0\\r\\n\\r\\n725 Augusta St, Montgomery AL\",\"permalink\":\"https:\\\/\\\/gmwa-montgomeryal.com\\\/2026\\\/an-evening-with-quartet\\\/\",\"postType\":\"Post\",\"postId\":1334},{\"title\":\"Good Friday Service\",\"start\":\"2026-04-03T18:00:00\",\"end\":\"2026-04-03T19:00:00\",\"details\":\"April 3, 2026 - Good Friday Service\\r\\n\\r\\n6 pm, Mt Zion AME Church\\r\\n\\r\\n455 W Fred D Gray Ave, Montgomery AL\",\"permalink\":\"https:\\\/\\\/gmwa-montgomeryal.com\\\/2026\\\/good-friday-service\\\/\",\"postType\":\"Post\",\"postId\":1338},{\"title\":\"One Night Revival\",\"start\":\"2026-04-10T18:30:00\",\"end\":\"2026-04-10T19:30:00\",\"details\":\"April 10, 2026 - One Night Revival \\r\\n\\r\\n6:30 pm, Mt Gillard Baptist Church\\r\\n\\r\\n3323 Day St, Montgomery AL\\r\\n\\r\\nSpecial Guest: Pastor Tonja A. Thomas,\\u00a0 Good News Ministries and Church Choir\",\"permalink\":\"https:\\\/\\\/gmwa-montgomeryal.com\\\/2026\\\/one-night-revival\\\/\",\"postType\":\"Post\",\"postId\":1340},{\"title\":\"42nd Anniversary\",\"start\":\"2026-04-25T16:00:00\",\"end\":\"2026-04-25T17:00:00\",\"details\":\"April 25, 2026 \\r\\n\\r\\nMontgomery Alabama Chapter 42nd Anniversary, 4 pm\\r\\n\\r\\nNew Hope Baptist Church\\r\\n\\r\\n4242 Birmingham Hwy, Montgomery AL,\\u00a0\",\"permalink\":\"https:\\\/\\\/gmwa-montgomeryal.com\\\/2026\\\/42nd-anniversary\\\/\",\"postType\":\"Post\",\"postId\":1342},{\"title\":\"Birmingham Mass Community Choir Anniversary\",\"start\":\"2026-06-27T15:00:00\",\"end\":\"2026-06-27T16:00:00\",\"details\":\"June 27, 2026 \\r\\n\\r\\nBirmingham Mass Community Choir Anniversary, TBA\",\"permalink\":\"https:\\\/\\\/gmwa-montgomeryal.com\\\/2026\\\/birmingham-mass-community-choir-anniversary\\\/\",\"postType\":\"Post\",\"postId\":1344}]],\n                    direction: \"ltr\",\n                    contentHeight: \"auto\",\n                    locale: \"en-US\",\n                    eventTimeFormat: {\"hour\":\"2-digit\",\"minute\":\"2-digit\"},\n                    dayHeaderFormat: { weekday: 'long' },\n                    views: piecalPrepareCustomViewsForCalendar({\"listUpcoming\":{\"type\":\"listMonth\",\"duration\":{\"months\":2},\"customProps\":{\"niceName\":\"List - Upcoming\"}}}),\n                    eventClick: function( info ) {\n                        info = piecalJS.eventClick( info, {\n                            appendOffset: false                        } );\n\n                                            },\n                    eventDataTransform: function(event) {  \n                        event = piecalJS.eventDataTransform( event );\n\n                        \n                        return event;  \n                    },\n                    dateClick: function( info ) {\n                        info = piecalJS.dateClick( info );\n\n                                            },\n                    eventDidMount: function( info ) {\n                        info = piecalJS.eventDidMount( info );\n\n                                            },\n                    dayCellDidMount: function( info ) {\n                        info = piecalJS.dayCellDidMount( info );\n\n                                            },\n                    dayHeaderContent: function( info ) {\n                        info = piecalJS.dayHeaderContent( info );\n\n                        \n                        return info.text;\n                    },\n                    dayHeaderDidMount: function( info ) {\n                        info = piecalJS.dayHeaderDidMount( info );\n\n                                            },\n                                    });\n                    calendar.render();\n                    window.calendar = calendar;\n            });\n\n            function piecalChangeView( view ) {\n                piecalCleanView( document.querySelector('.piecal-wrapper').getAttribute('data-view'), view );\n                document.querySelector('.piecal-wrapper').setAttribute('data-view', view);\n                window.calendar.changeView(view);\n                Alpine.store('calendarEngine').calendarView = view;\n                Alpine.store('calendarEngine').viewTitle = window.calendar.currentData.viewTitle;\n                Alpine.store('calendarEngine').viewSpec = window.calendar.currentData.viewSpec.buttonTextDefault;\n            }\n\n            \/\/ This function forces the calendar to re-render events when the view is changed, but only\n            \/\/ when necessary. This prevents artifacts from custom views from persisting between view changes\n            \/\/ when those views have the same or similar types, e.g. listMonth and listUpcoming.\n            function piecalCleanView( oldView, newView ) {\n                if( oldView.toLowerCase().includes( 'list' ) && newView.toLowerCase().includes( 'grid' ) ) {\n                    return false;\n                }\n\n                if( oldView.toLowerCase().includes( 'list' ) && newView.toLowerCase().includes( 'list' ) ) {\n                    window.calendar.changeView('dayGridMonth');\n                }\n\n                if( oldView.toLowerCase().includes( 'grid' ) && newView.toLowerCase().includes( 'grid' ) ) {\n                    window.calendar.changeView('listMonth');\n                }\n            }\n\n            function piecalGotoToday() {\n                console.log('today');\n            }\n\n            function piecalNextInView() {\n                window.calendar.next();\n            }\n\n            function piecalPreviousInView() {\n                console.log('prev');\n            }\n\n            function piecalSkipCalendar() {\n                let focusedCalendar = document.querySelector('.piecal-wrapper:focus-within');\n                let focusablesInCalendar = focusedCalendar.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]');\n                let lastFocusable = focusablesInCalendar[focusablesInCalendar.length - 1];\n\n                let focusablesInDocument = document.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]');\n                let targetFocusable = Array.prototype.indexOf.call(focusablesInDocument, lastFocusable) + 1;\n\n                focusablesInDocument[targetFocusable].focus();\n            }\n\n            document.addEventListener('alpine:init', () => {\n                Alpine.store('calendarEngine', {\n                    viewTitle: \"Loading\",\n                    viewSpec: \"Loading\",\n                    buttonText: {},\n                    showPopover: false,\n                    locale: \"en-US\",\n                    localeDateStringFormat: {\"hour\":\"2-digit\",\"minute\":\"2-digit\"},\n                    allDayLocaleDateStringFormat: [],\n                    calendarView: \"listUpcoming\",\n                    eventTitle: \"Loading...\",\n                    eventDetails: \"Loading...\",\n                    eventType: \"Loading...\",\n                    eventStart: \"Loading...\",\n                    eventAllDay: false,\n                    eventActualEnd: null,\n                    eventEnd: \"Loading...\",\n                    eventUrl: \"\/\",\n                    safeOutput( input ) {\n                        let scrubber = document.createElement('textarea');\n                        scrubber.innerHTML = input;\n                        return scrubber.value;\n                    }\n                })\n            })\n\n            window.addEventListener('DOMContentLoaded', () => {\n                Alpine.store('calendarEngine').viewTitle = window.calendar.currentData.viewTitle;\n                Alpine.store('calendarEngine').viewSpec = window.calendar.currentData.viewSpec.buttonTextDefault;\n                Alpine.store('calendarEngine').buttonText = window.calendar.currentData.localeDefaults.buttonText;\n            })\n\n            window.addEventListener('keydown', (e) => {\n                if( e.keyCode == 27 || e.key == 'Escape' ) Alpine.store('calendarEngine').showPopover = false;\n\n            })\n        <\/script>\n        <div\n        class=\"piecal-wrapper piecal-wrap-event-titles\"\n        data-view=\"listUpcoming\";\n        x-data\n        >\n            <div class=\"piecal-controls fc\">\n                <button\n                    class=\"piecal-controls__skip-calendar fc-button fc-button-primary\"\n                    onClick=\"piecalSkipCalendar()\">\n                        Skip Calendar                <\/button>\n                <div\n                class=\"piecal-controls__view-title\" \n                aria-live=\"polite\"\n                role=\"status\"\n                >\n                  <span class=\"visually-hidden\" x-text=\"$store.calendarEngine.viewTitle + ' - current view is ' + $store.calendarEngine.calendarView\"><\/span>\n                  <span aria-hidden=\"true\" x-text=\"$store.calendarEngine.viewTitle\"><\/span>\n                <\/div>\n                <button \n                    class=\"piecal-controls__back-to-month fc-button fc-button-primary\"\n                    aria-label=\"Back to full month view.\"\n                    onClick=\"piecalChangeView('dayGridMonth')\">\n                        Back To Full Month                <\/button>\n                <label class=\"piecal-controls__view-chooser\">\n                    Choose View                    <select x-model=\"$store.calendarEngine.calendarView\" @change=\"piecalChangeView($store.calendarEngine.calendarView)\">\n                                                    <option value=\"dayGridMonth\">\n                                Month - Classic                            <\/option>\n                                                    <option value=\"listMonth\">\n                                Month - List                            <\/option>\n                                                    <option value=\"timeGridWeek\">\n                                Week - Time Grid                            <\/option>\n                                                    <option value=\"listWeek\">\n                                Week - List                            <\/option>\n                                                    <option value=\"dayGridWeek\">\n                                Week - Day Grid                            <\/option>\n                                                    <option value=\"listDay\">\n                                Day - List                            <\/option>\n                                                    <option value=\"listUpcoming\">\n                                List - Upcoming                            <\/option>\n                                            <\/select>\n                <\/label>\n                <div class=\"piecal-controls__navigation-button-group\">\n                    <button \n                    class=\"fc-button fc-button-primary piecal-controls__today-button\"\n                    @click=\"window.calendar.today(); $store.calendarEngine.viewTitle = window.calendar.currentData.viewTitle\"\n                    x-text=\"$store.calendarEngine.buttonText.today ?? 'Today'\">\n                    <\/button>\n                    <button \n                    class=\"fc-button fc-button-primary piecal-controls__prev-button\"\n                    @click=\"window.calendar.prev(); $store.calendarEngine.viewTitle = window.calendar.currentData.viewTitle\"\n                    :aria-label=\"$store.calendarEngine.buttonText.prev + ' ' + $store.calendarEngine.viewSpec\"><<\/button>\n                    <button \n                    class=\"fc-button fc-button-primary piecal-controls__next-button\"\n                    @click=\"window.calendar.next(); $store.calendarEngine.viewTitle = window.calendar.currentData.viewTitle\" \n                    :aria-label=\"$store.calendarEngine.buttonText.next + ' ' + $store.calendarEngine.viewSpec\">><\/button>\n                <\/div>\n            <\/div>\n            <div id=\"calendar\"><\/div>\n            <div \n                class=\"piecal-popover\" \n                x-show=\"$store.calendarEngine.showPopover\"\n                style=\"display: none;\">\n                    <div \n                    class=\"piecal-popover__inner\" \n                    role=\"dialog\"\n                    aria-labelledby=\"piecal-popover__title--01\"\n                    aria-describedby=\"piecal-popover__details--01\"\n                    @click.outside=\"$store.calendarEngine.showPopover = false\"\n                    x-trap.noscroll=\"$store.calendarEngine.showPopover\">\n                        <button \n                        class=\"piecal-popover__close-button\" \n                        title=\"Close event details\"\n                        @click=\"$store.calendarEngine.showPopover = false\">\n                        <\/button>\n                                                <p class=\"piecal-popover__title\" id=\"piecal-popover__title--01\" x-text=\"$store.calendarEngine.safeOutput( $store.calendarEngine.eventTitle )\">Event Title<\/p>\n                                                <hr>\n                        <div class=\"piecal-popover__meta\">\n                                                        <p>\n                            Starts                            <\/p>\n                            <p \n                            aria-labelledby=\"piecal-event-start-date\" \n                            x-text=\"!$store.calendarEngine.eventAllDay ? new Date($store.calendarEngine.eventStart).toLocaleDateString( $store.calendarEngine.locale, $store.calendarEngine.localeDateStringFormat ) : new Date($store.calendarEngine.eventStart).toLocaleDateString( $store.calendarEngine.locale, $store.calendarEngine.allDayLocaleDateStringFormat )\"><\/p>\n                            <p x-show=\"$store.calendarEngine.eventEnd\">\n                            Ends                            <\/p>\n                            <p \n                            x-show=\"$store.calendarEngine.eventEnd\" \n                            x-text=\"!$store.calendarEngine.eventAllDay ? new Date($store.calendarEngine.eventEnd).toLocaleDateString( $store.calendarEngine.locale, $store.calendarEngine.localeDateStringFormat ) : new Date($store.calendarEngine.eventActualEnd).toLocaleDateString( $store.calendarEngine.locale, $store.calendarEngine.allDayLocaleDateStringFormat )\"><\/p>\n                                                    <\/div>\n                        <hr>\n                                                <p x-show=\"$store.calendarEngine.eventDetails\" class=\"piecal-popover__details\" id=\"piecal-popover__details--01\" x-text=\"$store.calendarEngine.safeOutput( $store.calendarEngine.eventDetails )\"><\/p>                                                                        <a x-show=\"$store.calendarEngine.eventUrl\" class=\"piecal-popover__view-link\" :href=\"$store.calendarEngine.eventUrl\">\n                        View                             <span x-text=\"$store.calendarEngine.eventType\"><\/span>\n                                                    <\/a>\n                                            <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"piecal-footer\">\n                    <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Upcoming Events<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_piecal_is_event":false,"_piecal_start_date":"","_piecal_end_date":"","_piecal_is_allday":false,"footnotes":""},"class_list":["post-1360","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/pages\/1360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/comments?post=1360"}],"version-history":[{"count":43,"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/pages\/1360\/revisions"}],"predecessor-version":[{"id":1582,"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/pages\/1360\/revisions\/1582"}],"wp:attachment":[{"href":"https:\/\/gmwa-montgomeryal.com\/2026\/wp-json\/wp\/v2\/media?parent=1360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}