
{"id":1079840,"date":"2025-06-09T08:15:52","date_gmt":"2025-06-09T14:15:52","guid":{"rendered":"https:\/\/awmi2.wpenginepowered.com\/?page_id=1079840"},"modified":"2026-04-24T11:15:37","modified_gmt":"2026-04-24T17:15:37","slug":"broadcast-schedule","status":"publish","type":"page","link":"https:\/\/www.awmi.net\/broadcast-schedule\/","title":{"rendered":"Broadcast Schedule"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1079840\" class=\"elementor elementor-1079840\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6fde7f1f e-con-full e-ecs-flex e-flex e-con e-parent\" data-id=\"6fde7f1f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-e68d8c2 e-ecs-flex e-flex e-con-boxed e-con e-child\" data-id=\"e68d8c2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2643c002 e-con-full e-ecs-flex e-flex e-con e-child\" data-id=\"2643c002\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4949c147 elementor-widget elementor-widget-heading\" data-id=\"4949c147\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Broadcast Times and Channels<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-60a49b44 elementor-widget elementor-widget-text-editor\" data-id=\"60a49b44\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Explore broadcast times and channels for The Gospel Truth with Andrew Wommack, Life Foundations with Carrie Pickett, and more.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-70dc90c elementor-widget elementor-widget-text-editor\" data-id=\"70dc90c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Use the dropdowns below to find out when the show airs on your local station<\/b>\u2014and don\u2019t stop there. Discover more powerful programs from Andrew\u2019s ministry, created to help you grow in faith and walk in truth every day.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4937a17e e-con-full e-transform e-ecs-flex e-flex e-con e-child\" data-id=\"4937a17e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_transform_translateX_effect_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:5,&quot;sizes&quot;:[]},&quot;ecs_container_type&quot;:&quot;flex&quot;,&quot;_transform_translateX_effect&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_translateX_effect_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_translateY_effect&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_translateY_effect_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_translateY_effect_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-691a5793 dce_masking-none elementor-widget elementor-widget-image\" data-id=\"691a5793\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp\" title=\"\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-39b78052 e-ecs-flex e-flex e-con-boxed e-con e-parent\" data-id=\"39b78052\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5809a234 elementor-widget elementor-widget-html\" data-id=\"5809a234\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n\n<style>\n    .broadcast-schedule-main-container {\n        font-family: 'Montserrat', sans-serif;\n        background-color: #FFFFFF;\n        color: #1a202c;\n        padding: 2rem;\n        border-radius: 0.5rem;\n        \/*box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);*\/\n        width: 100%;\n        max-width: 1250px; \n        margin-left: auto;\n        margin-right: auto;\n        box-sizing: border-box;\n        position: relative;\n    }\n\n    .schedule-header {\n        text-align: center;\n        margin-bottom: 1rem;\n        min-height: 1px; \/* Keep minimal header space *\/\n    }\n    .schedule-header h1 {\n        font-size: 2rem;\n        font-weight: 700;\n        color: #227AAD;\n        margin-top: 0;\n        margin-bottom: 0.5rem;\n        text-align: center;\n    }\n    .schedule-header p {\n        color: #4a5568;\n        margin-top: 0.5rem;\n        font-size: 1.5rem;\n    }\n\n    \/* Preemption Schedule Styles *\/\n    .preemption-schedule-section {\n        margin-bottom: 4.5rem;\n        margin-top: 3rem;\n        padding: 1.5rem;\n        \/* background-color: #f8fafc; *\/\n        \/* border: 2px solid #227AAD; *\/\n        border-radius: 0.5rem;\n        \/* box-shadow: 0 2px 8px rgba(34, 122, 173, 0.1); *\/\n        position: relative;\n    }\n\n    \/* .preemption-divider {\n        width: 95%;\n        max-width: 100%;\n        height: 2px;\n        background: linear-gradient(90deg, #227AAD 0%, #1e6092 100%);\n        border-radius: 1px;\n        margin: 3.5rem auto 0 auto !important;\n        border: none;\n        display: block;\n        position: relative;\n    } *\/\n\n    .preemption-header {\n        text-align: center;\n        margin-bottom: 1.5rem;\n        margin-top: 1rem;\n    }\n\n    .preemption-title {\n        font-size: 2rem;\n        font-weight: 700;\n        color: #227AAD;\n        margin: 0 0 0.5rem 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0.5rem;\n    }\n\n    .preemption-subtitle {\n        color: #4a5568;\n        margin: 0;\n        font-size: 0.875rem;\n        font-weight: 500;\n    }\n\n    .preemption-table-container {\n        overflow-x: auto;\n        background-color: #ffffff;\n        border-radius: 8px;\n        padding: 0;\n        box-shadow: 0 1px 3px rgba(34, 122, 173, 0.1);\n        border: 1px solid #227AAD;\n        margin: 0 auto;\n        width: fit-content;\n        max-width: 100%;\n        \/* Custom scrollbar styling to match main table *\/\n        scrollbar-width: thin;\n        scrollbar-color: #227AAD #e2e8f0;\n        scrollbar-gutter: stable;\n        -webkit-overflow-scrolling: touch;\n        padding-bottom: 12px;\n        margin-bottom: -4px;\n        overflow-y: hidden;\n    }\n\n    .preemption-table {\n        width: 100%;\n        border-collapse: collapse;\n        table-layout: auto;\n        font-size: 16px;\n        background-color: #ffffff;\n        margin: 0;\n    }\n\n    .preemption-table th,\n    .preemption-table td {\n        text-align: left;\n        padding: 0.75rem 1rem;\n        border-bottom: 1px solid #e2e8f0;\n        border-right: 1px solid #e2e8f0;\n        color: #374151;\n        height: auto;\n        vertical-align: middle;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        position: relative;\n        box-sizing: border-box;\n        background-color: #ffffff;\n        font-size: 16px;\n    }\n\n    \/* Remove right border from last column *\/\n    .preemption-table th:last-child,\n    .preemption-table td:last-child {\n        border-right: none;\n    }\n\n    .preemption-table th {\n        background-color: #f1f5f9;\n        color: #227AAD;\n        font-weight: 700;\n        text-transform: uppercase;\n        font-size: 16px;\n        letter-spacing: 0.05em;\n        border-bottom: 2px solid #227AAD;\n    }\n\n    .preemption-table tbody tr {\n        transition: background-color 0.15s ease-in-out;\n    }\n\n    .preemption-table tbody tr td {\n        background-color: #ffffff;\n    }\n\n    .preemption-table tbody tr:hover td {\n        background-color: #f0f8ff !important;\n    }\n\n    .preemption-table tbody tr:nth-child(even) td {\n        background-color: #fafbfc;\n    }\n\n    .preemption-table tbody tr:nth-child(even):hover td {\n        background-color: #f0f8ff !important;\n    }\n\n    .preemption-table tr:last-child td {\n        border-bottom: none;\n    }\n\n    \/* Preemption table scrollbar styling - match main table *\/\n    .preemption-table-container::-webkit-scrollbar {\n        height: 14px;\n        -webkit-appearance: none;\n        background: #e2e8f0;\n        border-radius: 7px;\n        display: block !important;\n    }\n\n    .preemption-table-container::-webkit-scrollbar-track {\n        background: #e2e8f0 !important;\n        border-radius: 7px;\n        -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.1);\n        opacity: 1 !important;\n        visibility: visible !important;\n        -webkit-transition: none !important;\n        transition: none !important;\n    }\n\n    .preemption-table-container::-webkit-scrollbar-thumb {\n        background: #227AAD !important;\n        border-radius: 7px;\n        min-width: 40px;\n        -webkit-appearance: none;\n        opacity: 1 !important;\n        visibility: visible !important;\n        -webkit-transition: none !important;\n        transition: none !important;\n        border: 1px solid #1e6092;\n    }\n\n    .preemption-table-container::-webkit-scrollbar-thumb:hover {\n        background: #1e6092 !important;\n    }\n\n    .dropdown-rows-container {\n        display: flex;\n        flex-direction: column;\n        gap: 1.5rem;\n        margin-bottom: 2rem;\n    }\n\n    .dropdown-row {\n        display: grid;\n        gap: 1rem;\n        align-items: end;\n    }\n\n    \/* First row: Select Language (centered, single column) *\/\n    .dropdown-row-show {\n        grid-template-columns: 1fr;\n        max-width: 350px;\n        width: 100%;\n        margin: 0 auto;\n    }\n\n    \/* Second row: Show and 4 other dropdowns in one row *\/\n    .dropdown-row-all {\n        grid-template-columns: 1fr;\n        gap: 1rem;\n    }\n    @media (min-width: 1024px) {\n        .dropdown-row-all {\n            grid-template-columns: repeat(5, 1fr);\n            gap: 1rem;\n        }\n    }\n\n    .filter-group {\n        position: relative;\n        display: flex;\n        flex-direction: column;\n    }\n    .filter-group label {\n        display: block;\n        font-size: 16px;\n        font-weight: 500;\n        color: #6b7280;\n        margin-bottom: 0.5rem;\n        text-align: left;\n    }\n\n    \/* Clean dropdown styling to match target design exactly *\/\n    .custom-select-wrapper {\n        position: relative;\n        width: 100%;\n        border: 1px solid #000000;\n        border-radius: 3px;\n    }\n\n    .custom-select-button {\n        background-color: #ffffff;\n        border: 1px solid #d1d5db;\n        color: #374151;\n        border-radius: 0.25rem;\n        padding: 0.5rem 2rem 0.5rem 0.75rem;\n        width: 100%;\n        line-height: 1.5;\n        text-align: left;\n        cursor: pointer;\n        position: relative;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        font-size: 16px;\n        font-weight: 400;\n        transition: all 0.2s ease-in-out;\n        min-height: 2.5rem;\n        box-sizing: border-box;\n    }\n    .custom-select-button:hover {\n        border-color: #9ca3af;\n    }\n    .custom-select-button:focus {\n        outline: none;\n        border-color: #227AAD;\n        box-shadow: 0 0 0 2px rgba(34, 122, 173, 0.1);\n    }\n    .custom-select-button.disabled {\n        background-color: #f9fafb;\n        opacity: 0.6;\n        cursor: not-allowed;\n        color: #9ca3af;\n        border-color: #e5e7eb;\n    }\n    .custom-select-button.disabled:hover {\n        border-color: #e5e7eb;\n    }\n    .custom-select-button-text {\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        flex-grow: 1;\n        font-size: 15px;\n    }\n    .custom-select-arrow {\n        pointer-events: none;\n        width: 14px;\n        height: 14px;\n        stroke: #9ca3af;\n        stroke-width: 2;\n        stroke-linecap: round;\n        stroke-linejoin: round;\n        fill: none;\n        position: absolute;\n        right: 0.75rem;\n        top: 50%;\n        transform: translateY(-50%);\n        transition: transform 0.2s ease-in-out;\n    }\n    .custom-select-button.expanded .custom-select-arrow {\n        transform: translateY(-50%) rotate(180deg);\n    }\n\n    .custom-select-panel {\n        position: absolute;\n        top: calc(100% + 4px);\n        left: 0;\n        right: 0;\n        background-color: #ffffff;\n        border: 1px solid #d1d5db;\n        border-radius: 0.25rem;\n        z-index: 1050;\n        max-height: 200px;\n        overflow-y: auto;\n        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n    }\n\n    .custom-select-search-input {\n        width: calc(100% - 1rem);\n        padding: 0.5rem;\n        margin: 0.5rem;\n        background-color: #f9fafb;\n        border: 1px solid #d1d5db;\n        color: #374151;\n        border-radius: 0.25rem;\n        box-sizing: border-box;\n        font-size: 16px;\n    }\n    .custom-select-search-input:focus {\n        outline: none;\n        border-color: #227AAD;\n    }\n\n    .custom-select-options {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n    }\n    .custom-select-options li {\n        padding: 0.5rem 0.75rem;\n        color: #374151;\n        cursor: pointer;\n        font-size: 16px;\n        transition: background-color 0.15s ease-in-out;\n    }\n    .custom-select-options li:hover,\n    .custom-select-options li.selected-option {\n        background-color: #f3f4f6;\n        color: #227AAD;\n    }\n    .custom-select-options li.no-options-message {\n        color: #6b7280;\n        cursor: default;\n        text-align: center;\n        padding: 0.75rem;\n        font-style: italic;\n    }\n    .custom-select-options li.hidden-option {\n        display: none;\n    }\n\n    #customTooltip {\n        position: absolute;\n        background-color: #1f2937;\n        color: #ffffff;\n        padding: 0.5rem 0.75rem;\n        border-radius: 0.25rem;\n        font-size: 16px;\n        z-index: 1100;\n        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n        visibility: hidden;\n        opacity: 0;\n        transition: opacity 0.15s ease-in-out, visibility 0s linear 0.15s;\n        white-space: nowrap;\n        pointer-events: none;\n    }\n    #customTooltip::after {\n        content: \"\";\n        position: absolute;\n        top: 100%;\n        left: 50%;\n        margin-left: -4px;\n        border-width: 4px;\n        border-style: solid;\n        border-color: #1f2937 transparent transparent transparent;\n    }\n    #customTooltip.visible {\n        visibility: visible;\n        opacity: 1;\n        transition-delay: 0s;\n    }\n\n    .hidden-element { display: none !important; }\n    \n    \/* Hide mobile scroll hint on desktop *\/\n    .mobile-scroll-hint {\n        display: none;\n    }\n    .loader {\n        border: 4px solid #e5e7eb;\n        border-top: 4px solid #227AAD;\n        border-radius: 50%;\n        width: 40px;\n        height: 40px;\n        animation: spin 1s linear infinite;\n        margin: 2rem auto;\n    }\n    @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n    \n    .results-display-area { \n        margin-top: 2rem; \n        text-align: left;\n    }\n    \n    .results-header {\n        font-size: 35px;\n        font-weight: 700;\n        color: #227AAD;\n        margin-bottom: 1rem;\n        text-align: left;\n    }\n    \n    \/* Clean table design to match target *\/\n    .dynamic-table-container {\n        overflow-x: auto; \/* Show scrollbar only when content overflows *\/\n        background-color: #EEE;\n        border-radius: 10px;\n        padding: 0;\n        box-shadow: none;\n        border: 1px solid #e2e8f0;\n        margin-left: 0;\n        margin-right: auto;\n        width: 100%;\n        max-width: 100%;\n        box-sizing: border-box;\n        \/* Custom scrollbar styling *\/\n        scrollbar-width: thin;\n        scrollbar-color: #227AAD #e2e8f0;\n        \/* Ensure scrollbar never covers content *\/\n        scrollbar-gutter: stable;\n        \/* Prevent scrollbar from auto-hiding *\/\n        -webkit-overflow-scrolling: touch;\n        \/* Add bottom padding to ensure scrollbar doesn't cover content *\/\n        padding-bottom: 12px;\n        margin-bottom: -4px; \/* Offset the extra padding visually *\/\n        \/* Force scrollbar to always be visible when content overflows *\/\n        overflow-y: hidden; \/* Prevent vertical scrollbar interference *\/\n    }\n    \n    \/* Alternative approach - force scroll behavior *\/\n    .dynamic-table-container.has-overflow {\n        overflow-x: scroll !important; \/* Force scroll when we detect overflow *\/\n    }\n    \n    \/* Webkit scrollbar styling - force always visible when content overflows *\/\n    .dynamic-table-container::-webkit-scrollbar {\n        height: 14px; \/* Even larger to ensure visibility *\/\n        -webkit-appearance: none;\n        background: #e2e8f0; \/* Give scrollbar track a background *\/\n        border-radius: 7px;\n        \/* Force scrollbar to never auto-hide *\/\n        display: block !important;\n    }\n    .dynamic-table-container::-webkit-scrollbar-track {\n        background: #e2e8f0 !important;\n        border-radius: 7px;\n        -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.1);\n        \/* Ensure track is always visible *\/\n        opacity: 1 !important;\n        visibility: visible !important;\n        \/* Prevent any hiding animations *\/\n        -webkit-transition: none !important;\n        transition: none !important;\n    }\n    .dynamic-table-container::-webkit-scrollbar-thumb {\n        background: #227AAD !important;\n        border-radius: 7px;\n        min-width: 40px; \/* Even larger minimum width *\/\n        \/* Force thumb to always be visible *\/\n        -webkit-appearance: none;\n        opacity: 1 !important;\n        visibility: visible !important;\n        \/* Prevent any hiding animations *\/\n        -webkit-transition: none !important;\n        transition: none !important;\n        \/* Add a subtle border to make it more visible *\/\n        border: 1px solid #1e6092;\n    }\n    .dynamic-table-container::-webkit-scrollbar-thumb:hover {\n        background: #1e6092 !important;\n    }\n    .dynamic-table-container::-webkit-scrollbar-corner {\n        background: #e2e8f0;\n    }\n    \n    \/* Additional webkit-specific rules to prevent auto-hiding *\/\n    @media screen and (-webkit-min-device-pixel-ratio: 0) {\n        .dynamic-table-container {\n            scrollbar-width: thin; \/* For Firefox *\/\n        }\n        \n        \/* Force scrollbar visibility on webkit browsers *\/\n        .dynamic-table-container::-webkit-scrollbar {\n            -webkit-appearance: none !important;\n            width: auto;\n            height: 14px !important;\n            background: #e2e8f0 !important;\n            border-radius: 7px;\n        }\n        \n        .dynamic-table-container::-webkit-scrollbar-track {\n            -webkit-appearance: none !important;\n            background: #e2e8f0 !important;\n            border-radius: 7px;\n            opacity: 1 !important;\n            visibility: visible !important;\n        }\n        \n        .dynamic-table-container::-webkit-scrollbar-thumb {\n            -webkit-appearance: none !important;\n            background: #227AAD !important;\n            border-radius: 7px;\n            opacity: 1 !important;\n            visibility: visible !important;\n            border: 1px solid #1e6092 !important;\n        }\n        \n        \/* Prevent auto-hiding behavior with animation override *\/\n        .dynamic-table-container::-webkit-scrollbar-thumb,\n        .dynamic-table-container::-webkit-scrollbar-track {\n            -webkit-transition: none !important;\n            transition: none !important;\n            -webkit-transform: none !important;\n            transform: none !important;\n        }\n        \n        \/* Override any system-level auto-hiding *\/\n        .dynamic-table-container::-webkit-scrollbar-thumb:window-inactive {\n            opacity: 1 !important;\n            visibility: visible !important;\n        }\n    }\n    \n    \/* iOS-specific scrollbar fixes *\/\n    @supports (-webkit-touch-callout: none) {\n        \/* This targets iOS Safari specifically *\/\n        .dynamic-table-container {\n            -webkit-overflow-scrolling: touch !important;\n            overflow-x: scroll !important; \/* Force scroll on iOS *\/\n                                \/* iOS-specific properties *\/\n                    -webkit-transform: translateZ(0); \/* Force hardware acceleration *\/\n                    transform: translateZ(0); \/* Standard property for compatibility *\/\n                    will-change: scroll-position;\n        }\n        \n        .dynamic-table-container::-webkit-scrollbar {\n            -webkit-appearance: none !important;\n            height: 16px !important; \/* Larger on iOS for visibility *\/\n            background: #e2e8f0 !important;\n            border-radius: 8px !important;\n            \/* Force display on iOS *\/\n            display: block !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n        }\n        \n        .dynamic-table-container::-webkit-scrollbar-track {\n            -webkit-appearance: none !important;\n            background: #e2e8f0 !important;\n            border-radius: 8px !important;\n            opacity: 1 !important;\n            visibility: visible !important;\n            \/* Prevent iOS auto-hiding *\/\n            -webkit-transition: none !important;\n            transition: none !important;\n            \/* Force visibility with box-shadow *\/\n            box-shadow: inset 0 0 1px rgba(0,0,0,0.3) !important;\n        }\n        \n        .dynamic-table-container::-webkit-scrollbar-thumb {\n            -webkit-appearance: none !important;\n            background: #227AAD !important;\n            border-radius: 8px !important;\n            opacity: 1 !important;\n            visibility: visible !important;\n            border: 2px solid #1e6092 !important;\n            min-width: 44px !important; \/* iOS touch target minimum *\/\n            \/* Prevent iOS auto-hiding *\/\n            -webkit-transition: none !important;\n            transition: none !important;\n            \/* Force visibility *\/\n            box-shadow: 0 0 2px rgba(0,0,0,0.3) !important;\n        }\n        \n        \/* Force scrollbar to always be visible on iOS *\/\n        .dynamic-table-container.has-overflow {\n            overflow-x: scroll !important;\n            -webkit-overflow-scrolling: touch !important;\n        }\n        \n        \/* Additional iOS webkit overrides *\/\n        .dynamic-table-container::-webkit-scrollbar-thumb:active,\n        .dynamic-table-container::-webkit-scrollbar-thumb:hover {\n            background: #1e6092 !important;\n            opacity: 1 !important;\n            visibility: visible !important;\n        }\n    }\n    \n    #scheduleResultsTable { \n        width: max-content;\n        min-width: 100%;\n        border-collapse: collapse; \n        table-layout: fixed;\n        font-size: 18px;\n        background-color: #EEE;\n        margin: 0;\n    }\n    \n    #scheduleResultsTable th, #scheduleResultsTable td {\n        text-align: left;\n        padding: 0.75rem 1rem;\n        border-bottom: 1px solid #d1d5db;\n        border-right: 1px solid #d1d5db; \/* Add vertical gridlines *\/\n        color: #374151;\n        height: auto;\n        vertical-align: middle;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        position: relative;\n        box-sizing: border-box;\n        background-color: #EEE;\n        font-size: 18px;\n    }\n    \n    \/* Remove right border from last column to avoid double border on table edge *\/\n    #scheduleResultsTable th:last-child, \n    #scheduleResultsTable td:last-child {\n        border-right: none;\n    }\n    \n    \/* Seamless table header - same background, slightly larger font *\/\n    #scheduleResultsTable th {\n        background-color: #EEE;\n        color: #374151;\n        font-weight: 700;\n        text-transform: uppercase;\n        font-size: 20px;\n        letter-spacing: 0.05em;\n        border-bottom: 1px solid #d1d5db;\n    }\n    \n    \/* Clean table body - no alternating colors, seamless appearance *\/\n    #scheduleResultsTable tbody tr {\n        transition: background-color 0.15s ease-in-out;\n    }\n    \n    #scheduleResultsTable tbody tr td { \n        background-color: #EEE; \n    }\n    \n    #scheduleResultsTable tbody tr:hover td {\n        background-color: #e0f2fe !important;\n    }\n    \n    #scheduleResultsTable tr:last-child td { \n        border-bottom: none; \n    }\n    \n    .no-results-message {\n        text-align: center;\n        color: #6b7280;\n        margin-top: 2rem;\n        padding: 2rem;\n        font-size: 1rem;\n        font-style: italic;\n    }\n    \n    .pagination-controls {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 1rem;\n        margin-top: 2rem;\n        color: #374151;\n    }\n    \n    .pagination-button {\n        background-color: #ffffff;\n        border: 1px solid #d1d5db;\n        color: #374151;\n        border-radius: 0.25rem;\n        padding: 0.5rem 1rem;\n        cursor: pointer;\n        transition: all 0.2s ease-in-out;\n        font-weight: 500;\n        font-size: 16px;\n    }\n    \n    .pagination-button:hover:not(:disabled) { \n        background-color: #f9fafb;\n        border-color: #227AAD;\n        color: #227AAD;\n    }\n    \n    .pagination-button:disabled { \n        opacity: 0.5; \n        cursor: not-allowed;\n    }\n    \n    #pageInfo { \n        font-size: 17px;\n        font-weight: 500;\n        color: #374151;\n    }\n\n    \/* Mobile responsive styles *\/\n    @media (max-width: 1023px) {\n        .broadcast-schedule-main-container {\n            padding: 1rem;\n        }\n        \n        .dropdown-rows-container {\n            gap: 1rem;\n        }\n        \n        \/* Keep language dropdown centered on mobile *\/\n        .dropdown-row-show {\n            max-width: none;\n        }\n        \n        \/* Stack the show + 4 other dropdowns on mobile\/tablet *\/\n        .dropdown-row-all {\n            grid-template-columns: 1fr !important;\n            gap: 1rem;\n        }\n        \n        .schedule-header h1 {\n            font-size: 1.75rem;\n        }\n        \n        .schedule-header p {\n            font-size: 1.25rem;\n        }\n        \n        .results-header {\n            font-size: 1.25rem;\n        }\n        \n        .custom-select-button {\n            padding: 0.625rem 2rem 0.625rem 0.75rem;\n            font-size: 0.875rem;\n        }\n        \n        \/* Mobile table styling *\/\n        .dynamic-table-container {\n            overflow-x: auto;\n            margin: 0 -0.5rem;\n        }\n        \n        #scheduleResultsTable {\n            min-width: 480px; \/* Reduced for better mobile fit *\/\n        }\n        \n        #scheduleResultsTable th, #scheduleResultsTable td {\n            padding: 0.4rem 0.6rem; \/* Tighter padding for more data *\/\n            font-size: 14px; \/* Smaller font for more content *\/\n            white-space: nowrap;\n        }\n        \n        #scheduleResultsTable th {\n            font-size: 16px;\n        }\n        \n        \/* Mobile scroll hint *\/\n        .mobile-scroll-hint {\n            display: block;\n            text-align: center;\n            color: #6b7280;\n            font-size: 0.75rem;\n            margin-bottom: 0.5rem;\n            font-style: italic;\n        }\n        \n        .results-header {\n            font-size: 35px !important;\n        }\n        \n        \/* Mobile preemption schedule styles *\/\n        .preemption-schedule-section {\n            padding: 1rem;\n            margin-bottom: 1.5rem;\n            margin-top: 2rem;\n        }\n        \n        .preemption-title {\n            font-size: 1.25rem;\n        }\n\n        .preemption-title::before {\n            font-size: 1rem;\n        }\n        \n        .preemption-subtitle {\n            font-size: 0.75rem;\n        }\n        \n        .preemption-table-container {\n            margin: 0 -0.5rem 1rem -0.5rem;\n        }\n        \n        .preemption-table {\n            min-width: 480px; \/* Reduced for better mobile fit *\/\n        }\n        \n        .preemption-table th,\n        .preemption-table td {\n            padding: 0.4rem 0.6rem; \/* Tighter padding for more data *\/\n            font-size: 13px; \/* Smaller font for more content *\/\n            white-space: nowrap;\n        }\n        \n        .preemption-table th {\n            font-size: 14px;\n        }\n    }\n<\/style>\n\n<div class=\"broadcast-schedule-main-container\">\n    <header class=\"schedule-header\">\n        <!-- Header text removed as requested -->\n    <\/header>\n\n    <!-- Preemption Schedule Section -->\n    <div id=\"preemptionScheduleSection\" class=\"preemption-schedule-section hidden-element\">\n        <div class=\"preemption-header\">\n            <h2 class=\"preemption-title\">Schedule Changes & Preemptions<\/h2>\n            <p class=\"preemption-subtitle\">Important updates to regular broadcast times<\/p>\n        <\/div>\n        <div class=\"mobile-scroll-hint\">Scroll right to see all columns<\/div>\n        <div id=\"preemptionTableContainer\" class=\"preemption-table-container\">\n            <table id=\"preemptionTable\" class=\"preemption-table\">\n                <thead><\/thead>\n                <tbody><\/tbody>\n            <\/table>\n        <\/div>\n        <div id=\"preemptionLoader\" class=\"loader hidden-element\"><\/div>\n        <p id=\"noPreemptionsMessage\" class=\"no-results-message hidden-element\">No schedule changes at this time.<\/p>\n        <!-- <hr class=\"preemption-divider\"> -->\n    <\/div>\n\n    <div class=\"dropdown-rows-container\">\n        <!-- First Row: Select Language (centered) -->\n        <div class=\"dropdown-row dropdown-row-show\">\n            <div class=\"filter-group\" id=\"languageFilterGroup\">\n                <label for=\"customLanguage\">Language<\/label>\n                <div class=\"custom-select-wrapper\">\n                    <button type=\"button\" class=\"custom-select-button\" id=\"customLanguage-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"custom-select-button-text\">English<\/span>\n                        <svg class=\"custom-select-arrow\" viewBox=\"0 0 20 20\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\n                    <\/button>\n                    <div class=\"custom-select-panel\" id=\"customLanguage-panel\" role=\"listbox\" style=\"display: none;\">\n                        <input type=\"text\" class=\"custom-select-search-input\" style=\"display: none;\">\n                        <ul class=\"custom-select-options\"><\/ul>\n                    <\/div>\n                <\/div>\n                <input type=\"hidden\" id=\"customLanguage\" data-placeholder=\"Select Language...\">\n            <\/div>\n        <\/div>\n\n        <!-- Second Row: Show and all other dropdowns in one row -->\n        <div class=\"dropdown-row dropdown-row-all\">\n            <div class=\"filter-group\" id=\"showFilterGroup\">\n                <label for=\"customShow\">Select Show<\/label>\n                <div class=\"custom-select-wrapper\">\n                    <button type=\"button\" class=\"custom-select-button\" id=\"customShow-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"custom-select-button-text\">Life Foundations<\/span>\n                        <svg class=\"custom-select-arrow\" viewBox=\"0 0 20 20\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\n                    <\/button>\n                    <div class=\"custom-select-panel\" id=\"customShow-panel\" role=\"listbox\" style=\"display: none;\">\n                        <input type=\"text\" class=\"custom-select-search-input\" style=\"display: none;\">\n                        <ul class=\"custom-select-options\"><\/ul>\n                    <\/div>\n                <\/div>\n                <input type=\"hidden\" id=\"customShow\" data-placeholder=\"Select Show...\">\n            <\/div>\n            <div class=\"filter-group\" id=\"broadcastTypeContainer\">\n                <label for=\"customBroadcastType\">How do you want to watch?<\/label>\n                <div class=\"custom-select-wrapper\">\n                    <button type=\"button\" class=\"custom-select-button\" id=\"customBroadcastType-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"custom-select-button-text\">TV<\/span>\n                        <svg class=\"custom-select-arrow\" viewBox=\"0 0 20 20\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\n                    <\/button>\n                    <div class=\"custom-select-panel\" id=\"customBroadcastType-panel\" role=\"listbox\" style=\"display: none;\">\n                        <input type=\"text\" class=\"custom-select-search-input\" style=\"display: none;\">\n                        <ul class=\"custom-select-options\"><\/ul>\n                    <\/div>\n                <\/div>\n                <input type=\"hidden\" id=\"customBroadcastType\" data-placeholder=\"Select Type...\">\n            <\/div>\n            <div id=\"countryContainer\" class=\"filter-group\">\n                <label for=\"customCountry\">Country \/ Area<\/label>\n                <div class=\"custom-select-wrapper\">\n                    <button type=\"button\" class=\"custom-select-button\" id=\"customCountry-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"custom-select-button-text\">United States<\/span>\n                        <svg class=\"custom-select-arrow\" viewBox=\"0 0 20 20\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\n                    <\/button>\n                    <div class=\"custom-select-panel\" id=\"customCountry-panel\" role=\"listbox\" style=\"display: none;\">\n                        <input type=\"text\" class=\"custom-select-search-input\" style=\"display: none;\">\n                        <ul class=\"custom-select-options\"><\/ul>\n                    <\/div>\n                <\/div>\n                <input type=\"hidden\" id=\"customCountry\" data-placeholder=\"Select Country...\">\n            <\/div>\n            <div id=\"stateProvinceContainer\" class=\"filter-group\">\n                <label for=\"customStateProvince\">State \/ Province<\/label>\n                <div class=\"custom-select-wrapper\">\n                    <button type=\"button\" class=\"custom-select-button\" id=\"customStateProvince-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"custom-select-button-text\">Alabama<\/span>\n                        <svg class=\"custom-select-arrow\" viewBox=\"0 0 20 20\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\n                    <\/button>\n                    <div class=\"custom-select-panel\" id=\"customStateProvince-panel\" role=\"listbox\" style=\"display: none;\">\n                        <input type=\"text\" class=\"custom-select-search-input\" style=\"display: none;\">\n                        <ul class=\"custom-select-options\"><\/ul>\n                    <\/div>\n                <\/div>\n                <input type=\"hidden\" id=\"customStateProvince\" data-placeholder=\"Select State\/Province...\">\n            <\/div>\n            <div id=\"cityContainer\" class=\"filter-group\">\n                <label for=\"customCity\">Nearest City<\/label>\n                <div class=\"custom-select-wrapper\">\n                    <button type=\"button\" class=\"custom-select-button\" id=\"customCity-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"custom-select-button-text\">Birmingham<\/span>\n                        <svg class=\"custom-select-arrow\" viewBox=\"0 0 20 20\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\n                    <\/button>\n                    <div class=\"custom-select-panel\" id=\"customCity-panel\" role=\"listbox\" style=\"display: none;\">\n                        <input type=\"text\" class=\"custom-select-search-input\" style=\"display: none;\">\n                        <ul class=\"custom-select-options\"><\/ul>\n                    <\/div>\n                <\/div>\n                <input type=\"hidden\" id=\"customCity\" data-placeholder=\"Select City...\">\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"loader\" class=\"loader hidden-element\"><\/div>\n\n    <div id=\"resultsDisplayArea\" class=\"results-display-area hidden-element\">\n        <h2 id=\"resultsHeader\" class=\"results-header\"><\/h2>\n        <div class=\"mobile-scroll-hint\">Scroll right to see all columns<\/div>\n        <div id=\"dynamicTableContainer\" class=\"dynamic-table-container\">\n            <table id=\"scheduleResultsTable\">\n                <thead><\/thead>\n                <tbody><\/tbody>\n            <\/table>\n        <\/div>\n        <p id=\"noResultsMessage\" class=\"no-results-message hidden-element\">No stations found matching your criteria.<\/p>\n    <\/div>\n    \n    <div id=\"paginationControls\" class=\"pagination-controls hidden-element\">\n        <button id=\"prevPageButton\" class=\"pagination-button\" disabled>Previous<\/button>\n        <span id=\"pageInfo\">Page 1 of 1<\/span>\n        <button id=\"nextPageButton\" class=\"pagination-button\" disabled>Next<\/button>\n    <\/div>\n\n    <div id=\"customTooltip\">Tooltip message here<\/div>\n<\/div>\n\n<script>\n    document.addEventListener('DOMContentLoaded', () => {\n        \/\/====================================================================\n        \/\/ CONFIGURATION SECTION\n        \/\/ This section contains all the constants and configuration objects\n        \/\/ that control how the application behaves and connects to data sources\n        \/\/====================================================================\n        \n        \/* AWS S3\/CloudFront CDN Configuration *\/\n        \/\/ Primary CDN URL - Update this to match your CloudFront CDN endpoint\n        const CDN_BASE_URL = 'https:\/\/cdn.awmi.net\/awmi\/web-projects\/broadcast-schedule\/JSON';\n\n\n        \/* JSON File Configuration - Dynamic Timestamped Files *\/\n        \/\/ These will be populated from current.json pointer file\n        let JSON_FILES = {\n            'USA Local Stations': null,\n            'Satellite Stations': null,\n            'Internet': null,\n            'International': null,\n            'Life Foundations': null,\n            'Preemption Schedule': null\n        };\n\n        \/* Column Name Constants - Data Structure Definition *\/\n        \/\/ These constants define the exact column headers expected in the Google Sheets\n        \/\/ Using constants prevents typos and makes column name changes easier to manage\n        const COL_LANGUAGE = 'Language';                        \/\/ What language the broadcast is in\n        const COL_SHOW = 'Show';                               \/\/ Name of the TV show\n        const COL_BROADCAST_TYPE = 'Broadcast_Type';           \/\/ How to watch (TV, online, etc.)\n        const COL_CONTINENT = 'Continent';                     \/\/ Geographic region\n        const COL_COUNTRY = 'Country';                         \/\/ Country where broadcast is available\n        const COL_STATE_PROVINCE = 'State_Province_Region';           \/\/ State or province within country\n        const COL_CITY = 'City';                              \/\/ Specific city where available\n        const COL_NETWORK_NAME = 'Network_Name';              \/\/ Name of the broadcasting network\n        const COL_STATION_CHANNEL_NAME = 'Station_Channel_Name'; \/\/ Specific station or channel name\n        const COL_NETWORK_WEBSITE = 'Network_Website';         \/\/ URL for online broadcasts\n        const COL_NETWORK_WEBSITE_LABEL = 'Network_Website_LABEL'; \/\/ Display text for website links\n        const COL_DAYS = 'Days';                              \/\/ Which days the show airs\n        const COL_BROADCAST_TIME = 'Broadcast_Time';          \/\/ What time the show airs\n        const COL_TIMEZONE = 'Timezone';                       \/\/ Timezone for the broadcast\n        const COL_STATUS = 'Status';                          \/\/ Active\/Inactive status for filtering\n\n        \/* Display Configuration for Different Broadcast Types *\/\n        \/\/ This object defines what columns to show in the results table for each broadcast type\n        \/\/ Different broadcast types may need different information displayed to users\n        const displayColumnsConfig = {\n            \/\/ Local US stations show basic station info\n            \"USA Local Stations\": { \n                headers: [\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"], \n                dataKeys: [COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE] \n            },\n            \/\/ International stations show same format as local\n            \"International TV Stations\": { \n                headers: [\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"], \n                dataKeys: [COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE] \n            },\n            \/\/ Satellite stations include network information\n            \"Satellite TV Stations\": { \n                headers: [\"Network\", \"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"], \n                dataKeys: [COL_NETWORK_NAME, COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE] \n            },\n            \/\/ Satellite stations use same format as local stations\n            \"Satellite Stations\": { \n                headers: [\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"], \n                dataKeys: [COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE] \n            },\n            \/\/ Online broadcasts show network, station, website links, and schedule\n            \"Online\/Web Broadcasts\": {\n                headers: [\"Network\", \"Station \/ Channel\", \"Network Website\", \"Days\", \"Broadcast Time\", \"Timezone\"],\n                dataKeys: [COL_NETWORK_NAME, COL_STATION_CHANNEL_NAME, COL_NETWORK_WEBSITE, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE]\n            },\n            \/\/ Fallback configuration for any unrecognized broadcast types\n            \"Default\": { \n                headers: [\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"], \n                dataKeys: [COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE] \n            }\n        };\n\n        \/\/====================================================================\n        \/\/ DOM ELEMENT REFERENCES\n        \/\/ This section stores references to all the HTML elements the JavaScript needs to interact with\n        \/\/ Organizing these references makes the code cleaner and improves performance by avoiding repeated DOM queries\n        \/\/====================================================================\n\n        \/* Custom Dropdown Elements *\/\n        \/\/ Each dropdown has multiple components: input (hidden), button (visible), panel (popup), options list, search input, and button text\n        \/\/ This structure allows for rich custom dropdown functionality while maintaining accessibility\n        const dropdownElements = {\n            \/\/ Language selection - first dropdown in the chain, auto-selects English if available\n            language: {\n                input: document.getElementById('customLanguage'),                    \/\/ Hidden input that stores the selected value\n                button: document.getElementById('customLanguage-button'),           \/\/ Clickable button that users see\n                panel: document.getElementById('customLanguage-panel'),             \/\/ Dropdown panel that appears when opened\n                optionsList: document.getElementById('customLanguage-panel').querySelector('.custom-select-options'), \/\/ List of selectable options\n                searchInput: document.getElementById('customLanguage-panel').querySelector('.custom-select-search-input'), \/\/ Search box for filtering options\n                buttonText: document.getElementById('customLanguage-button').querySelector('.custom-select-button-text') \/\/ Text display in the button\n            },\n            \/\/ Show selection - populated based on selected language\n            show: {\n                input: document.getElementById('customShow'),\n                button: document.getElementById('customShow-button'),\n                panel: document.getElementById('customShow-panel'),\n                optionsList: document.getElementById('customShow-panel').querySelector('.custom-select-options'),\n                searchInput: document.getElementById('customShow-panel').querySelector('.custom-select-search-input'),\n                buttonText: document.getElementById('customShow-button').querySelector('.custom-select-button-text')\n            },\n            \/\/ Broadcast type selection - populated based on selected language and show\n            broadcastType: {\n                input: document.getElementById('customBroadcastType'),\n                button: document.getElementById('customBroadcastType-button'),\n                panel: document.getElementById('customBroadcastType-panel'),\n                optionsList: document.getElementById('customBroadcastType-panel').querySelector('.custom-select-options'),\n                searchInput: document.getElementById('customBroadcastType-panel').querySelector('.custom-select-search-input'),\n                buttonText: document.getElementById('customBroadcastType-button').querySelector('.custom-select-button-text')\n            },\n            \/\/ Geographic filters - these are conditionally shown\/hidden based on broadcast type\n            \/\/ Country selection - used for international and some domestic broadcasts\n            country: {\n                input: document.getElementById('customCountry'),\n                button: document.getElementById('customCountry-button'),\n                panel: document.getElementById('customCountry-panel'),\n                optionsList: document.getElementById('customCountry-panel').querySelector('.custom-select-options'),\n                searchInput: document.getElementById('customCountry-panel').querySelector('.custom-select-search-input'),\n                buttonText: document.getElementById('customCountry-button').querySelector('.custom-select-button-text')\n            },\n            \/\/ State\/Province selection - narrows down to specific regions within a country\n            stateProvince: {\n                input: document.getElementById('customStateProvince'),\n                button: document.getElementById('customStateProvince-button'),\n                panel: document.getElementById('customStateProvince-panel'),\n                optionsList: document.getElementById('customStateProvince-panel').querySelector('.custom-select-options'),\n                searchInput: document.getElementById('customStateProvince-panel').querySelector('.custom-select-search-input'),\n                buttonText: document.getElementById('customStateProvince-button').querySelector('.custom-select-button-text')\n            },\n            \/\/ City selection - final geographic filter for precise location targeting\n            city: {\n                input: document.getElementById('customCity'),\n                button: document.getElementById('customCity-button'),\n                panel: document.getElementById('customCity-panel'),\n                optionsList: document.getElementById('customCity-panel').querySelector('.custom-select-options'),\n                searchInput: document.getElementById('customCity-panel').querySelector('.custom-select-search-input'),\n                buttonText: document.getElementById('customCity-button').querySelector('.custom-select-button-text')\n            }\n        };\n\n        \/* Dropdown Container Elements *\/\n        \/\/ These containers can be shown\/hidden based on the selected broadcast type\n        \/\/ This allows the UI to adapt and only show relevant geographic filters\n        const dropdownContainerElements = {\n            country: document.getElementById('countryContainer'),           \/\/ Container for country dropdown\n            stateProvince: document.getElementById('stateProvinceContainer'), \/\/ Container for state\/province dropdown\n            city: document.getElementById('cityContainer')                  \/\/ Container for city dropdown\n        };\n        \n        \/* Additional UI Element References *\/\n        \/\/ These elements control the overall application state and user feedback\n        const customTooltipElement = document.getElementById('customTooltip');        \/\/ Custom tooltip for disabled dropdowns\n        const resultsDisplayArea = document.getElementById('resultsDisplayArea');     \/\/ Main container for search results\n        const resultsHeader = document.getElementById('resultsHeader');              \/\/ Header text above results table\n        const dynamicTableContainer = document.getElementById('dynamicTableContainer'); \/\/ Container for the results table\n        const scheduleResultsTableThead = document.querySelector('#scheduleResultsTable thead'); \/\/ Table header section\n        const scheduleResultsTableTbody = document.querySelector('#scheduleResultsTable tbody'); \/\/ Table body section\n        const noResultsMessage = document.getElementById('noResultsMessage');        \/\/ Message shown when no results found\n        const loader = document.getElementById('loader');                           \/\/ Loading spinner element\n\n        \/* Pagination Control References *\/\n        \/\/ These elements handle breaking large result sets into manageable pages\n        const paginationControls = document.getElementById('paginationControls');   \/\/ Container for all pagination controls\n        const prevPageButton = document.getElementById('prevPageButton');           \/\/ Button to go to previous page\n        const nextPageButton = document.getElementById('nextPageButton');           \/\/ Button to go to next page\n        const pageInfo = document.getElementById('pageInfo');                       \/\/ Text showing current page info\n\n        \/* Preemption Schedule Element References *\/\n        \/\/ These elements control the preemption schedule display\n        const preemptionScheduleSection = document.getElementById('preemptionScheduleSection');\n        const preemptionTableContainer = document.getElementById('preemptionTableContainer');\n        const preemptionTable = document.getElementById('preemptionTable');\n        const preemptionTableThead = document.querySelector('#preemptionTable thead');\n        const preemptionTableTbody = document.querySelector('#preemptionTable tbody');\n        const preemptionLoader = document.getElementById('preemptionLoader');\n        const noPreemptionsMessage = document.getElementById('noPreemptionsMessage');\n\n        \/* State Variables *\/\n        \/\/ These variables track the application's current state and data\n        let allSheetData = [];                    \/\/ All data loaded from JSON files (combined from all files)\n        let preemptionData = [];                  \/\/ Data specifically from the Preemption Schedule file\n        let dataFullyFetched = false;            \/\/ Flag indicating whether initial data load is complete\n        let currentPage = 1;                     \/\/ Current page number for pagination (1-indexed)\n        const itemsPerPage = 10;                 \/\/ How many results to show per page\n        let currentFilteredDataForPagination = []; \/\/ Filtered results for the current search (used for pagination)\n        let dataLastUpdated = null;              \/\/ Timestamp of when data was last updated\n        let manualPushCheckInterval = null;      \/\/ Interval for checking manual pushes\n\n        \/\/====================================================================\n        \/\/ BROADCAST TYPE CONFIGURATION\n        \/\/ This section defines how the UI should behave for different types of broadcasts\n        \/\/ Each broadcast type has different requirements for geographic filtering\n        \/\/====================================================================\n\n        \/* Broadcast Type Action Configuration *\/\n        \/\/ This configuration object controls which dropdowns are shown\/hidden for each broadcast type\n        \/\/ It also defines auto-population logic and default values for specific scenarios\n        const broadcastTypeActions = {\n            \/\/ Satellite TV: No geographic filtering needed, just show all satellite options\n            \"Satellite TV Stations\": {\n                showContainers: [],                    \/\/ Don't show any geographic dropdowns\n                hideContainers: ['country', 'stateProvince', 'city'], \/\/ Hide all geographic filters\n                initialPopulation: null,               \/\/ No special population logic needed\n                setNATargets: ['country', 'stateProvince', 'city'], \/\/ Set geographic fields to \"N\/A\"\n                autoSetFields: []                      \/\/ No fields are auto-populated\n            },\n            \/\/ USA Local Stations: Show geographic filters but auto-select United States\n            \"USA Local Stations\": {\n                showContainers: ['country', 'stateProvince', 'city'], \/\/ Show all geographic filters\n                hideContainers: [],                    \/\/ Don't hide any containers\n                autoSetFields: [{                      \/\/ Auto-select United States for country\n                    targetDropdownKey: 'country', \n                    value: 'United States', \n                    tooltip: 'United States (auto-selected)' \/\/ Explain why it's auto-selected\n                }],\n                initialPopulation: null,               \/\/ No special population needed\n                setNATargets: []                       \/\/ Don't set any fields to N\/A\n            },\n            \/\/ International TV: Show geographic filters and populate country options\n            \"International TV Stations\": {\n                showContainers: ['country', 'stateProvince', 'city'], \/\/ Show all geographic filters\n                hideContainers: [],                    \/\/ Don't hide any containers\n                initialPopulation: {                   \/\/ Auto-populate country dropdown with available options\n                    targetDropdownKey: 'country',      \/\/ Which dropdown to populate\n                    sourceDataColumn: COL_COUNTRY,     \/\/ Which data column to use for options\n                    placeholder: 'Select Country...'   \/\/ Placeholder text to show\n                },\n                setNATargets: [],                      \/\/ Don't set any fields to N\/A\n                autoSetFields: []                      \/\/ No auto-selected fields\n            },\n            \/\/ TV Broadcasts: Same behavior as International TV\n            \"TV Broadcasts\": { \n                showContainers: ['country', 'stateProvince', 'city'],\n                hideContainers: [],\n                initialPopulation: {\n                    targetDropdownKey: 'country',\n                    sourceDataColumn: COL_COUNTRY,\n                    placeholder: 'Select Country...'\n                },\n                setNATargets: [],\n                autoSetFields: []\n            },\n            \/\/ Online\/Web Broadcasts: No geographic filtering needed, it's all online\n            \"Online\/Web Broadcasts\": {\n                showContainers: [],                    \/\/ Don't show any geographic dropdowns\n                hideContainers: ['country', 'stateProvince', 'city'], \/\/ Hide all geographic filters\n                initialPopulation: null,               \/\/ No population logic needed\n                setNATargets: ['country', 'stateProvince', 'city'], \/\/ Set all geographic to N\/A\n                autoSetFields: []                      \/\/ No auto-selected fields\n            },\n            \/\/ Satellite Stations: Similar to online, no geographic filtering\n            \"Satellite Stations\": { \n                showContainers: [],                    \n                hideContainers: ['country', 'stateProvince', 'city'],\n                initialPopulation: null,\n                setNATargets: ['country', 'stateProvince', 'city'],\n                autoSetFields: []\n            },\n            \/\/ Default fallback: Hide geographic filters and set to N\/A\n            \"Default\": { \n                showContainers: [], \n                hideContainers: ['country', 'stateProvince', 'city'],\n                initialPopulation: null, \n                setNATargets: ['country', 'stateProvince', 'city'], \n                autoSetFields: []\n            }\n        };\n\n        \/\/====================================================================\n        \/\/ UTILITY FUNCTIONS\n        \/\/ This section contains small helper functions that support the main application logic\n        \/\/ These functions handle UI state changes, tooltips, and other common operations\n        \/\/====================================================================\n\n        \/* UI State Management Functions *\/\n        \/\/ Simple functions to show\/hide the loading spinner\n        function showLoader() { \n            if (loader) loader.classList.remove('hidden-element'); \n        }\n        function hideLoader() { \n            if (loader) loader.classList.add('hidden-element'); \n        }\n\n        \/* Custom Tooltip Functions *\/\n        \/\/ These functions manage the custom tooltip that appears when dropdowns are disabled\n        \/\/ The tooltip explains to users why a dropdown is disabled and what they need to do next\n        function showCustomTooltip(targetElement, message) {\n            \/\/ Safety checks to ensure all required elements exist\n            if (!customTooltipElement || !targetElement || !message) return;\n            \n            \/\/ Set the tooltip message\n            customTooltipElement.textContent = message;\n            \n            \/\/ Calculate position relative to the main container (not the viewport)\n            \/\/ This ensures the tooltip stays within the application bounds\n            const mainContainer = document.querySelector('.broadcast-schedule-main-container');\n            if (!mainContainer) return;\n            const mainContainerRect = mainContainer.getBoundingClientRect();\n            const targetRect = targetElement.getBoundingClientRect();\n            \n            \/\/ Position tooltip above the target element with some padding\n            let top = (targetRect.top - mainContainerRect.top) - customTooltipElement.offsetHeight - 8;\n            let left = (targetRect.left - mainContainerRect.left) + (targetRect.width \/ 2);\n            \n            \/\/ Apply positioning and center horizontally\n            customTooltipElement.style.top = `${top}px`;\n            customTooltipElement.style.left = `${left}px`;\n            customTooltipElement.style.transform = 'translateX(-50%)'; \/\/ Center horizontally\n            \n            \/\/ Make tooltip visible with CSS class\n            customTooltipElement.classList.add('visible');\n        }\n\n        function hideCustomTooltip() {\n            \/\/ Simply hide the tooltip by removing the visible class\n            if (!customTooltipElement) return;\n            customTooltipElement.classList.remove('visible');\n        }\n        \n        \/\/====================================================================\n        \/\/ DATA FETCHING FUNCTIONS\n        \/\/====================================================================\n\n        \/* Generate Cache-Busting Parameters *\/\n        \/\/ Creates cache-busting parameters - more aggressive for recent manual pushes\n        \/\/ Since we can't use custom headers (CORS limitation), we rely entirely on URL parameters\n        function generateCacheBuster(isManualPushRecent = false) {\n            const timestamp = new Date().getTime();\n            const random = Math.random().toString(36).substring(2);\n            const dateStr = new Date().toISOString().replace(\/[:.]\/g, '');\n            const sessionId = Math.random().toString(36).substring(2, 15);\n            \n            if (isManualPushRecent) {\n                \/\/ Super aggressive cache-busting for manual pushes\n                \/\/ Multiple random parameters to ensure cache bypass\n                return `v=${timestamp}&r=${random}&t=${dateStr}&nocache=1&manual=1&force=${Math.random()}&session=${sessionId}&bust=${Date.now()}`;\n            } else {\n                \/\/ Normal cache-busting for automatic updates\n                return `v=${timestamp}&r=${random}&t=${dateStr}&nocache=1&session=${sessionId}`;\n            }\n        }\n        \n        \/* Check if Manual Push is Recent *\/\n        \/\/ Determines if a manual push happened in the last 15 minutes\n        function isManualPushRecent(currentData) {\n            if (!currentData || !currentData.isManualPush || !currentData.manualPushTimestamp) {\n                return false;\n            }\n            \n            const now = new Date().getTime();\n            const pushTime = currentData.manualPushTimestamp;\n            const fifteenMinutes = 15 * 60 * 1000; \/\/ 15 minutes in milliseconds\n            \n            return (now - pushTime) < fifteenMinutes;\n        }\n        \n        \/* Check for New Manual Pushes *\/\n        \/\/ Periodically checks if a new manual push has occurred\n        async function checkForNewManualPush() {\n            try {\n                const cacheBuster = generateCacheBuster(true); \/\/ Always use aggressive cache-busting for this check\n                const currentUrl = `${CDN_BASE_URL}\/current.json?${cacheBuster}`;\n                \n                const response = await fetch(currentUrl, { \n                    cache: 'no-cache'\n                    \/\/ Removed custom headers to avoid CORS preflight requests\n                });\n                \n                if (response.ok) {\n                    const currentData = await response.json();\n                    const wasManualPushRecent = window.isManualPushRecent || false;\n                    const isNowManualPushRecent = isManualPushRecent(currentData);\n                    \n                    \/\/ If manual push status changed from false to true, reload data\n                    if (!wasManualPushRecent && isNowManualPushRecent) {\n                        console.log('\ud83d\ude80 New manual push detected! Reloading data...');\n                        window.isManualPushRecent = true;\n                        \n                        \/\/ Reload all data with aggressive cache-busting\n                        await fetchSheetData();\n                        \n                        console.log('\u2705 Data reloaded after manual push detection');\n                    } else if (wasManualPushRecent && !isNowManualPushRecent) {\n                        \/\/ Manual push window expired, return to normal caching\n                        console.log('\ud83d\udcc5 Manual push window expired, returning to normal caching');\n                        window.isManualPushRecent = false;\n                    }\n                }\n            } catch (error) {\n                console.warn('Could not check for manual pushes:', error);\n            }\n        }\n        \n        \/* Start Manual Push Monitoring *\/\n        \/\/ Starts periodic checking for new manual pushes\n        function startManualPushMonitoring() {\n            \/\/ Check every 30 seconds for new manual pushes\n            if (manualPushCheckInterval) {\n                clearInterval(manualPushCheckInterval);\n            }\n            \n            manualPushCheckInterval = setInterval(checkForNewManualPush, 30000);\n            console.log('\ud83d\udce1 Started monitoring for manual pushes (every 30 seconds)');\n        }\n        \n        \/* Stop Manual Push Monitoring *\/\n        \/\/ Stops periodic checking for new manual pushes\n        function stopManualPushMonitoring() {\n            if (manualPushCheckInterval) {\n                clearInterval(manualPushCheckInterval);\n                manualPushCheckInterval = null;\n                console.log('\u23f9\ufe0f Stopped monitoring for manual pushes');\n            }\n        }\n\n        \/* Load Current File Mappings *\/\n        \/\/ Loads the current.json pointer file to get the latest timestamped filenames\n        async function loadCurrentFileMapping() {\n            try {\n                \/\/ First, try to load current.json to check for manual pushes\n                const initialCacheBuster = generateCacheBuster();\n                const currentUrl = `${CDN_BASE_URL}\/current.json?${initialCacheBuster}`;\n                \n                console.log('Loading current file mappings...');\n                const response = await fetch(currentUrl, { \n                    cache: 'no-cache'\n                    \/\/ Removed custom headers to avoid CORS preflight requests\n                });\n                \n                if (!response.ok) {\n                    throw new Error(`Failed to fetch current.json: ${response.status} ${response.statusText}`);\n                }\n                \n                const currentData = await response.json();\n                \n                \/\/ Validate structure\n                if (!currentData.files || typeof currentData.files !== 'object') {\n                    throw new Error('Invalid current.json format - missing files object');\n                }\n                \n                \/\/ Check if this is a recent manual push\n                const isRecentManualPush = isManualPushRecent(currentData);\n                \n                if (isRecentManualPush) {\n                    console.log('\ud83d\ude80 Recent manual push detected! Using aggressive cache-busting...');\n                    console.log(`Manual push timestamp: ${new Date(currentData.manualPushTimestamp).toLocaleString()}`);\n                    \n                    \/\/ Show a subtle visual indicator in the console for testing\n                    console.log('%c\u2728 INSTANT UPDATE MODE ACTIVE \u2728', 'color: #00ff00; font-weight: bold; font-size: 14px;');\n                } else {\n                    console.log('\ud83d\udcc5 Using normal cache behavior for automatic update');\n                }\n                \n                \/\/ Map the timestamped filenames to our broadcast types\n                JSON_FILES['USA Local Stations'] = currentData.files['usa-local-stations.json'];\n                JSON_FILES['Satellite Stations'] = currentData.files['satellite-stations.json'];\n                JSON_FILES['Internet'] = currentData.files['internet.json'];\n                JSON_FILES['International'] = currentData.files['international.json'];\n                JSON_FILES['Life Foundations'] = currentData.files['life-foundations.json'];\n                JSON_FILES['Preemption Schedule'] = currentData.files['preemption-schedule.json'];\n                \n                console.log('Successfully loaded current file mappings:', JSON_FILES);\n                console.log(`Data last updated: ${new Date(currentData.lastUpdated).toLocaleString()}`);\n                \n                \/\/ Store the manual push status for use in data fetching\n                window.isManualPushRecent = isRecentManualPush;\n                \n                return true;\n                \n            } catch (error) {\n                console.error('Error loading current file mappings:', error);\n                \n                \/\/ Fallback to simple filenames if current.json fails\n                console.warn('Falling back to simple filenames...');\n                JSON_FILES = {\n                    'USA Local Stations': 'usa-local-stations.json',\n                    'Satellite Stations': 'satellite-stations.json',\n                    'Internet': 'internet.json',\n                    'International': 'international.json',\n                    'Life Foundations': 'life-foundations.json',\n                    'Preemption Schedule': 'preemption-schedule.json'\n                };\n                \n                return false;\n            }\n        }\n\n        \/* Fetch Data from Single JSON File *\/\n        \/\/ This function fetches data from one specific JSON file from the CDN\n        \/\/ It uses aggressive cache-busting to ensure fresh data\n        async function fetchSingleTabData(tabName) {\n            \/\/ Get the corresponding JSON filename\n            const jsonFilename = JSON_FILES[tabName];\n            if (!jsonFilename) {\n                console.warn(`No JSON file configured for tab \"${tabName}\".`);\n                return [];\n            }\n            \n            const url = `${CDN_BASE_URL}\/${jsonFilename}`;\n            \n            try {\n                \/\/ Use aggressive cache-busting if manual push is recent\n                const isRecentManualPush = window.isManualPushRecent || false;\n                const cacheBuster = generateCacheBuster(isRecentManualPush);\n                \n                const fetchOptions = {\n                    cache: 'no-cache'\n                    \/\/ Removed custom headers to avoid CORS preflight requests\n                    \/\/ Cache-busting is now handled entirely through URL parameters\n                };\n                \n                if (isRecentManualPush) {\n                    console.log(`\ud83d\ude80 Using aggressive cache-busting for ${jsonFilename}`);\n                } else {\n                    console.log(`\ud83d\udcc5 Using normal cache behavior for ${jsonFilename}`);\n                }\n                \n                const response = await fetch(`${url}?${cacheBuster}`, fetchOptions);\n                \n                if (!response.ok) {\n                    throw new Error(`Failed to fetch ${jsonFilename}: ${response.status} ${response.statusText}`);\n                }\n                \n                const data = await response.json();\n                \n                \/\/ Validate that we received an array\n                if (!Array.isArray(data)) {\n                    console.warn(`Invalid data format in ${jsonFilename} - expected array`);\n                    return [];\n                }\n                \n                \/\/ Process the data to ensure it has the expected structure\n                const processedData = data.map(item => {\n                    \/\/ Ensure all expected properties exist\n                    const processedItem = { ...item };\n                    \n                    \/\/ Handle website URL processing if needed\n                    if (item[COL_NETWORK_WEBSITE] && !item[COL_NETWORK_WEBSITE_LABEL]) {\n                        processedItem[COL_NETWORK_WEBSITE_LABEL] = item[COL_NETWORK_WEBSITE];\n                    }\n                    \n                    return processedItem;\n                }).filter(obj => {\n                    \/\/ Only return rows with show data and active status\n                    if (!obj || !obj[COL_SHOW]) return false;\n                    \n                    \/\/ Filter by status - only include \"active\" records (case-insensitive)\n                    \/\/ If no status column exists, assume active for backward compatibility\n                    const status = obj[COL_STATUS];\n                    if (status && typeof status === 'string') {\n                        return status.toLowerCase().trim() === 'active';\n                    }\n                    \n                    \/\/ If no status column or empty status, assume active (backward compatibility)\n                    return true;\n                });\n                \n                console.log(`Successfully loaded ${processedData.length} records from ${jsonFilename}`);\n                return processedData;\n                \n            } catch (error) {\n                console.error(`Error fetching data from ${jsonFilename}:`, error);\n                \n                \/\/ If CDN fails, show user-friendly error\n                if (error.message.includes('Failed to fetch')) {\n                    console.warn(`Could not load data from CDN. This might be due to:\n` +\n                               `1. Data is still being updated (every 20 minutes)\n` +\n                               `2. Network connectivity issues\n` +\n                               `3. CDN configuration\n` +\n                               `Please try refreshing the page in a few moments.`);\n                }\n                \n                return []; \/\/ Return empty array to prevent total application failure\n            }\n        }\n\n        \/* Fetch Data from All JSON Files *\/\n        \/\/ This function coordinates fetching data from all configured JSON files\n        \/\/ It combines all the data into a single array while handling partial failures gracefully\n        async function fetchAllTabsData() {\n            showLoader(); \/\/ Show loading indicator\n            const allData = [];\n            const fileErrors = [];\n            \n            try {\n                \/\/ Fetch data from each configured JSON file in parallel for better performance\n                const fetchPromises = [];\n                const broadcastTypes = [];\n                \n                for (const [broadcastType, jsonFilename] of Object.entries(JSON_FILES)) {\n                    \/\/ Skip the Preemption Schedule file - it's handled separately\n                    if (broadcastType === 'Preemption Schedule') {\n                        continue;\n                    }\n                    \n                    console.log(`Fetching data from file: ${jsonFilename}`);\n                    fetchPromises.push(fetchSingleTabData(broadcastType));\n                    broadcastTypes.push(broadcastType);\n                }\n                \n                \/\/ Wait for all files to load\n                const results = await Promise.all(fetchPromises);\n                \n                \/\/ Process results\n                results.forEach((tabData, index) => {\n                    const broadcastType = broadcastTypes[index];\n                    \n                    if (tabData.length > 0) {\n                        \/\/ Add broadcast type to each record since it's implicit in the file structure\n                        tabData.forEach(record => {\n                            \/\/ Track which file this data came from\n                            record._sourceTab = broadcastType;\n                            \n                            \/\/ Only set broadcast type if it's not already explicitly set in the data\n                            if (!record[COL_BROADCAST_TYPE] || record[COL_BROADCAST_TYPE].trim() === '') {\n                                record[COL_BROADCAST_TYPE] = broadcastType;\n                            }\n                        });\n                        allData.push(...tabData); \/\/ Add all records to the combined dataset\n                        console.log(`Successfully loaded ${tabData.length} records from ${JSON_FILES[broadcastType]}`);\n                    } else {\n                        fileErrors.push(JSON_FILES[broadcastType]);\n                        console.warn(`No data loaded from file: ${JSON_FILES[broadcastType]}`);\n                    }\n                });\n                \n                \/\/ Check if we got any data at all\n                if (allData.length > 0) {\n                    console.log(`Total records loaded: ${allData.length}`);\n                    return allData;\n                } else {\n                    throw new Error('No data could be loaded from any JSON files. Please check that the CDN is set up correctly and data has been uploaded.');\n                }\n                \n            } catch (error) {\n                console.error('Error in fetchAllTabsData:', error);\n                if (fileErrors.length > 0) {\n                    console.error('Failed files:', fileErrors);\n                }\n                throw error; \/\/ Re-throw to be handled by calling function\n            }\n        }\n\n\n        \/* Main Data Fetch Function *\/\n        \/\/ This is the entry point for all data loading\n        \/\/ It loads current file mappings then fetches timestamped data files\n        async function fetchSheetData() {\n            try {\n                console.log('Loading broadcast schedule data...');\n                \n                \/\/ First, load the current file mappings\n                await loadCurrentFileMapping();\n                \n                \/\/ Fetch all data from timestamped JSON files\n                allSheetData = await fetchAllTabsData();\n                dataFullyFetched = true; \/\/ Mark data as fully loaded\n                \n                \/\/ Initialize the dropdowns now that we have data\n                populateInitialShowDropdown();\n                \n                \/\/ Load and display preemption data\n                await loadPreemptionData();\n                \n                \/\/ Start monitoring for manual pushes\n                startManualPushMonitoring();\n            } catch (error) {\n                console.error('Error fetching data from CDN:', error);\n                \n                \/\/ Show user-friendly error message\n                let errorMessage = 'Failed to load broadcast schedule data. ';\n                if (error.message.includes('CDN') || error.message.includes('JSON files')) {\n                    errorMessage += 'This might be because the data is currently being updated (every 20 minutes). Please try refreshing the page in a few moments.';\n                } else {\n                    errorMessage += 'Please check your internet connection and try again.';\n                }\n                \n                alert(errorMessage);\n            } finally {\n                hideLoader(); \/\/ Always hide loader, even if there was an error\n            }\n        }\n\n        \/* Load Preemption Data *\/\n        \/\/ Fetch and display preemption schedule data\n        \/\/ NOTE: Preemption schedule is NEVER filtered by dropdown selections\n        \/\/ It shows ALL data from the preemption tab when available, or hides completely when empty\n        async function loadPreemptionData() {\n            try {\n                \/\/ Show preemption loader\n                if (preemptionLoader) preemptionLoader.classList.remove('hidden-element');\n                \n                \/\/ Fetch data from Preemption Schedule JSON file\n                preemptionData = await fetchSingleTabData('Preemption Schedule');\n                \n                \/\/ Check if we have any preemption data\n                if (preemptionData && preemptionData.length > 0) {\n                    \/\/ Filter out any completely empty rows\n                    const validPreemptions = preemptionData.filter(item => {\n                        return Object.values(item).some(value => \n                            value && typeof value === 'string' && value.trim() !== ''\n                        );\n                    });\n                    \n                    if (validPreemptions.length > 0) {\n                        \/\/ Always display ALL valid preemption data - never filter by dropdown selections\n                        displayPreemptionData(validPreemptions);\n                        preemptionScheduleSection.classList.remove('hidden-element');\n                        console.log(`Preemption schedule displayed with ${validPreemptions.length} entries`);\n                    } else {\n                        \/\/ No valid preemption data, hide the section\n                        preemptionScheduleSection.classList.add('hidden-element');\n                        console.log('Preemption schedule hidden - no valid data found');\n                    }\n                } else {\n                    \/\/ No preemption data, hide the section\n                    preemptionScheduleSection.classList.add('hidden-element');\n                    console.log('Preemption schedule hidden - no data in preemption tab');\n                }\n            } catch (error) {\n                console.error('Error loading preemption data:', error);\n                \/\/ Hide the section on error\n                preemptionScheduleSection.classList.add('hidden-element');\n            } finally {\n                \/\/ Hide preemption loader\n                if (preemptionLoader) preemptionLoader.classList.add('hidden-element');\n            }\n        }\n\n        \/* Display Preemption Data *\/\n        \/\/ Render the preemption schedule table\n        \/\/ NOTE: This function always displays ALL preemption data passed to it\n        \/\/ It is never filtered by dropdown selections - shows complete preemption schedule\n        function displayPreemptionData(data) {\n            if (!data || data.length === 0) {\n                if (noPreemptionsMessage) {\n                    noPreemptionsMessage.classList.remove('hidden-element');\n                    noPreemptionsMessage.textContent = 'No schedule changes at this time.';\n                }\n                if (preemptionTableContainer) preemptionTableContainer.style.display = 'none';\n                return;\n            }\n\n            \/\/ Hide no results message\n            if (noPreemptionsMessage) noPreemptionsMessage.classList.add('hidden-element');\n            \n            \/\/ Show table container\n            if (preemptionTableContainer) preemptionTableContainer.style.display = 'block';\n\n            \/\/ Define the specific columns we want to display in the specified order\n            const desiredColumns = [\n                { key: COL_SHOW, display: 'Show' },\n                { key: COL_STATION_CHANNEL_NAME, display: 'Station\/Channel' },\n                { key: 'Date', display: 'Date' }, \/\/ Note: \"Date\" not \"Days\"\n                { key: COL_BROADCAST_TIME, display: 'Time' },\n                { key: COL_TIMEZONE, display: 'Time Zone' },\n                { key: COL_COUNTRY, display: 'Country' },\n                { key: COL_STATE_PROVINCE, display: 'State\/Province' },\n                { key: COL_BROADCAST_TYPE, display: 'Broadcast Type' }\n            ];\n\n            \/\/ Filter to only include columns that exist in the data\n            const availableColumns = desiredColumns.filter(col => {\n                return data.some(item => item[col.key] && item[col.key].toString().trim() !== '');\n            });\n\n            \/\/ Create table headers\n            preemptionTableThead.innerHTML = '';\n            const headerRow = preemptionTableThead.insertRow();\n            availableColumns.forEach(col => {\n                const th = document.createElement('th');\n                th.textContent = col.display;\n                headerRow.appendChild(th);\n            });\n\n            \/\/ Create table body\n            preemptionTableTbody.innerHTML = '';\n            data.forEach(item => {\n                const row = preemptionTableTbody.insertRow();\n                availableColumns.forEach(col => {\n                    const cell = row.insertCell();\n                    const cellContent = item[col.key] || 'N\/A';\n                    cell.textContent = cellContent;\n                    \n                    \/\/ Add tooltip for long content\n                    if (cellContent.length > 30) {\n                        cell.title = cellContent;\n                    }\n                });\n            });\n        }\n\n        \/* Filter Preemption Data Based on Current Selections *\/\n        \/\/ NOTE: This function is disabled - preemption schedule should always show all data\n        \/\/ and not be affected by filter dropdown selections\n        function filterPreemptionData() {\n            \/\/ Preemption schedule is no longer filtered by dropdown selections\n            \/\/ It always shows all available preemption data when present\n            \/\/ The visibility is controlled only by loadPreemptionData() function\n            return;\n        }\n\n        \/\/====================================================================\n        \/\/ DROPDOWN MANAGEMENT FUNCTIONS\n        \/\/====================================================================\n\n        \/* Filter Dropdown Options Based on Search Input *\/\n        function filterCustomDropdownOptions(ddKey) {\n            const dd = dropdownElements[ddKey];\n            const searchTerm = dd.searchInput.value.toLowerCase();\n            const options = dd.optionsList.getElementsByTagName('li');\n            let visibleOptions = 0;\n            for (let i = 0; i < options.length; i++) {\n                const option = options[i];\n                if (option.classList.contains('no-options-message') || \n                    option.classList.contains('option-group-separator')) continue; \n\n                const optionText = option.textContent.toLowerCase();\n                if (optionText.includes(searchTerm)) {\n                    option.style.display = '';\n                    option.classList.remove('hidden-option');\n                    visibleOptions++;\n                } else {\n                    option.style.display = 'none';\n                    option.classList.add('hidden-option');\n                }\n            }\n            const noOptMsg = dd.optionsList.querySelector('.no-options-message');\n            if (noOptMsg) {\n                noOptMsg.style.display = visibleOptions === 0 ? '' : 'none';\n            }\n            \n            \/\/ Show\/hide separator based on whether N\/A option is visible\n            const separator = dd.optionsList.querySelector('.option-group-separator');\n            const naOption = dd.optionsList.querySelector('[data-value=\"N\/A\"]');\n            if (separator && naOption) {\n                separator.style.display = naOption.style.display === 'none' ? 'none' : '';\n            }\n        }\n        \n        \/* Reset and Disable Dropdown with Tooltip *\/\n        function resetAndDisableDropdown(ddKey, placeholderText, tooltipMessage) {\n            const dd = dropdownElements[ddKey];\n            const originalInputValue = dd.input.value;\n            const originalButtonText = dd.buttonText.textContent;\n            const originalDisabledState = dd.button.disabled;\n\n            dd.buttonText.textContent = placeholderText;\n            dd.input.value = \"\"; \n            dd.button.disabled = true;\n            dd.button.classList.add('disabled');\n            dd.button.dataset.tooltipMessage = tooltipMessage;\n            dd.panel.style.display = 'none';\n            dd.button.setAttribute('aria-expanded', 'false');\n            dd.button.classList.remove('expanded');\n            dd.optionsList.innerHTML = ''; \n            dd.searchInput.style.display = 'none'; \n            dd.searchInput.value = ''; \n\n            if (originalInputValue !== \"\" || \n                originalButtonText !== placeholderText || \n                originalDisabledState !== true \n            ) {\n                dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n            }\n        }\n\n        \/* Populate Dropdown with Values *\/\n        function populateDropdown(ddKey, values, promptText) {\n            const dd = dropdownElements[ddKey];\n            const originalInputValue = dd.input.value;\n            const originalButtonText = dd.buttonText.textContent;\n            const originalDisabledState = dd.button.disabled;\n\n            dd.optionsList.innerHTML = ''; \n            dd.buttonText.textContent = promptText; \n            dd.input.value = ''; \n\n            \/\/ Get all unique values including N\/A\n            const allUniqueValues = [...new Set(\n                values\n                    .map(val => String(val || '').trim())\n                    .filter(val => val)\n            )].sort();\n\n            \/\/ Separate N\/A and valid options\n            const naValues = allUniqueValues.filter(val => val.toLowerCase() === 'n\/a');\n            const validOptions = allUniqueValues.filter(val => val.toLowerCase() !== 'n\/a');\n\n            if (allUniqueValues.length === 0) {\n                resetAndDisableDropdown(ddKey, \"N\/A\", \"No options available for this selection.\");\n                return;\n            }\n\n            \/\/ Only auto-select if there's truly only one option total (including N\/A)\n            if (allUniqueValues.length === 1) {\n                const singleValue = allUniqueValues[0];\n                dd.buttonText.textContent = singleValue;\n                dd.input.value = singleValue;\n                dd.button.disabled = true;\n                dd.button.classList.add('disabled');\n                dd.button.dataset.tooltipMessage = \"Only one option available for this selection.\";\n                dd.searchInput.style.display = 'none'; \n                \n                if (originalInputValue !== dd.input.value || originalButtonText !== dd.buttonText.textContent || originalDisabledState !== dd.button.disabled) {\n                    dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n                }\n                return;\n            }\n\n            \/\/ Multiple options available - add \"Show All\" and individual options\n            const hasNAValues = naValues.length > 0;\n            const hasValidValues = validOptions.length > 0;\n\n            \/\/ Only add \"Show All\" option for geographic dropdowns (country, state, city)\n            \/\/ Do not add \"Show All\" for Show or Broadcast Type dropdowns\n            const allowShowAll = ['country', 'stateProvince', 'city'].includes(ddKey);\n            \n            \/\/ Special handling for Life Foundations: exclude \"Show All\" from country dropdown\n            \/\/ Users don't need to see all countries at once for Life Foundations\n            const selectedShow = dropdownElements.show.input.value;\n            const isLifeFoundationsCountry = (ddKey === 'country' && selectedShow === 'Life Foundations');\n            \n            \/\/ For geographic dropdowns, show \"Show All\" when there are multiple options (2 or more)\n            \/\/ For other dropdowns, only show \"Show All\" when there are both N\/A and valid values\n            \/\/ Exception: Never show \"Show All\" for country dropdown when Life Foundations is selected\n            const shouldShowAll = allowShowAll && !isLifeFoundationsCountry ? \n                (validOptions.length >= 2 || (hasNAValues && hasValidValues)) : \n                (hasNAValues && hasValidValues);\n            \n            if (shouldShowAll && allowShowAll && !isLifeFoundationsCountry) {\n                const showAllLi = document.createElement('li');\n                showAllLi.textContent = \"Show All\";\n                showAllLi.dataset.value = \"SHOW_ALL\";\n                showAllLi.setAttribute('role', 'option');\n                showAllLi.style.fontWeight = 'bold';\n                showAllLi.style.borderBottom = '1px solid #cbd5e0';\n                showAllLi.style.marginBottom = '0.25rem';\n                showAllLi.addEventListener('click', () => {\n                    dd.buttonText.textContent = \"Show All\";\n                    dd.input.value = \"SHOW_ALL\";\n                    dd.panel.style.display = 'none';\n                    dd.button.setAttribute('aria-expanded', 'false');\n                    dd.button.classList.remove('expanded');\n                    dd.searchInput.style.display = 'none'; \n                    dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n                });\n                dd.optionsList.appendChild(showAllLi);\n            }\n\n            \/\/ Add valid options\n            validOptions.forEach(value => {\n                const li = document.createElement('li');\n                li.textContent = value;\n                li.dataset.value = value;\n                li.setAttribute('role', 'option');\n                li.addEventListener('click', () => {\n                    dd.buttonText.textContent = value;\n                    dd.input.value = value; \n                    dd.panel.style.display = 'none';\n                    dd.button.setAttribute('aria-expanded', 'false');\n                    dd.button.classList.remove('expanded');\n                    dd.searchInput.style.display = 'none'; \n                    dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n                });\n                dd.optionsList.appendChild(li);\n            });\n\n            \/\/ Add N\/A option if it exists\n            if (hasNAValues) {\n                \/\/ Add separator for N\/A option group\n                const separatorLi = document.createElement('li');\n                separatorLi.className = 'option-group-separator';\n                separatorLi.innerHTML = '<hr style=\"margin: 0.5rem 0; border: none; border-top: 1px solid #cbd5e0;\"><span style=\"font-size: 0.75rem; color: #6b7280; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; padding: 0 0.75rem;\">Special Options<\/span>';\n                separatorLi.style.pointerEvents = 'none';\n                separatorLi.style.cursor = 'default';\n                dd.optionsList.appendChild(separatorLi);\n\n                \/\/ Customize text and tooltip based on dropdown type\n                const isShowDropdown = ddKey === 'show';\n                const displayText = isShowDropdown ? \"Misc. (No specific show)\" : \"N\/A (No specific location)\";\n                const buttonDisplayText = isShowDropdown ? \"Misc.\" : \"N\/A\";\n                const tooltipMessage = isShowDropdown ? \n                    \"Shows broadcasts that don't have specific show information available\" :\n                    \"Shows stations that don't have specific location information available\";\n\n                const naLi = document.createElement('li');\n                naLi.textContent = displayText;\n                naLi.dataset.value = \"N\/A\";\n                naLi.setAttribute('role', 'option');\n                naLi.style.fontStyle = 'italic';\n                naLi.style.color = '#6b7280';\n                naLi.style.backgroundColor = '#f9fafb'; \/\/ Subtle background to distinguish it\n                \n                \/\/ Add special tooltip for N\/A option\n                naLi.addEventListener('mouseenter', (e) => {\n                    showCustomTooltip(e.currentTarget, tooltipMessage);\n                });\n                naLi.addEventListener('mouseleave', hideCustomTooltip);\n                \n                naLi.addEventListener('click', () => {\n                    dd.buttonText.textContent = buttonDisplayText;\n                    dd.input.value = \"N\/A\";\n                    dd.panel.style.display = 'none';\n                    dd.button.setAttribute('aria-expanded', 'false');\n                    dd.button.classList.remove('expanded');\n                    dd.searchInput.style.display = 'none'; \n                    hideCustomTooltip(); \/\/ Hide tooltip when selecting\n                    dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n                });\n                dd.optionsList.appendChild(naLi);\n            }\n\n            \/\/ Add \"No matching options\" message\n            const noOptMsg = document.createElement('li');\n            noOptMsg.textContent = \"No matching options\";\n            noOptMsg.className = 'no-options-message';\n            noOptMsg.style.display = 'none';\n            dd.optionsList.appendChild(noOptMsg);\n\n            \/\/ Enable dropdown\n            dd.button.disabled = false;\n            dd.button.classList.remove('disabled');\n            delete dd.button.dataset.tooltipMessage;\n\n            \/\/ Restore previous value if it still exists in options\n            if (originalInputValue && allUniqueValues.includes(originalInputValue)) {\n                dd.input.value = originalInputValue;\n                if (originalInputValue === \"N\/A\") {\n                    \/\/ Show \"Misc.\" for show dropdown, \"N\/A\" for others\n                    dd.buttonText.textContent = ddKey === 'show' ? \"Misc.\" : \"N\/A\";\n                } else {\n                    dd.buttonText.textContent = originalInputValue;\n                }\n            } else if (originalInputValue === \"SHOW_ALL\" && shouldShowAll && allowShowAll && !isLifeFoundationsCountry) {\n                dd.input.value = \"SHOW_ALL\";\n                dd.buttonText.textContent = \"Show All\";\n            }\n            \n            if (originalInputValue !== dd.input.value ||\n                originalButtonText !== dd.buttonText.textContent ||\n                originalDisabledState !== dd.button.disabled) {\n                dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n            }\n        }\n        \n        \/* Populate Initial Language and Show Dropdowns *\/\n        function populateInitialShowDropdown() {\n            \/\/ First populate Language dropdown\n            const languages = allSheetData.map(item => item[COL_LANGUAGE]).filter(Boolean);\n            populateDropdown('language', languages, dropdownElements.language.input.dataset.placeholder);\n            \n            \/\/ Auto-select English if available\n            const uniqueLanguages = [...new Set(languages.map(lang => String(lang || '').trim()).filter(lang => lang && lang.toLowerCase() !== 'n\/a'))];\n            const englishOption = uniqueLanguages.find(lang => lang.toLowerCase() === 'english');\n            if (englishOption) {\n                dropdownElements.language.input.value = englishOption;\n                dropdownElements.language.buttonText.textContent = englishOption;\n                \/\/ Trigger change event to populate shows for English\n                dropdownElements.language.input.dispatchEvent(new Event('change', { bubbles: true }));\n            } else {\n                \/\/ If no English, disable show dropdown until language is selected\n                resetAndDisableDropdown('show', dropdownElements.show.input.dataset.placeholder, \"Please select a Language first.\");\n            }\n\n            resetAndDisableDropdown('broadcastType', dropdownElements.broadcastType.input.dataset.placeholder, \"Please select a Language and Show first.\");\n            resetAndDisableDropdown('country', dropdownElements.country.input.dataset.placeholder, \"Please complete previous selections.\");\n            resetAndDisableDropdown('stateProvince', dropdownElements.stateProvince.input.dataset.placeholder, \"Please complete previous selections.\");\n            resetAndDisableDropdown('city', dropdownElements.city.input.dataset.placeholder, \"Please complete previous selections.\");\n\n            \/\/ Always show all dropdown containers - they will be disabled with tooltips instead of hidden\n            Object.values(dropdownContainerElements).forEach(container => container.classList.remove('hidden-element'));\n            \n            if (resultsDisplayArea) resultsDisplayArea.classList.add('hidden-element');\n            if (dynamicTableContainer) dynamicTableContainer.style.display = 'none';\n            if (paginationControls) paginationControls.classList.add('hidden-element');\n        }\n\n        \/* Get Effective Dropdown Value (handles N\/A placeholders and SHOW_ALL) *\/\n        function getEffectiveDropdownValue(ddKey) {\n            const dd = dropdownElements[ddKey];\n            if (dd.button.disabled && dd.buttonText.textContent.toLowerCase() === 'n\/a') {\n                 return \"N\/A_PLACEHOLDER\";\n            }\n            \/\/ Handle case where city dropdown is disabled with \"All Cities\" when state is \"SHOW_ALL\"\n            if (dd.button.disabled && dd.buttonText.textContent === 'All Cities') {\n                return \"SHOW_ALL\";\n            }\n            return dd.input.value; \n        }\n\n        \/* Apply Broadcast Type Configuration and Show\/Hide Containers *\/\n        function applyBroadcastTypeConfig(selectedBroadcastType) {\n            const config = broadcastTypeActions[selectedBroadcastType] || broadcastTypeActions[\"Default\"]; \n            const selectedLanguage = dropdownElements.language.input.value;\n            const selectedShow = dropdownElements.show.input.value;\n\n            \/\/ Always keep all containers visible - disable dropdowns with tooltips instead of hiding\n            Object.values(dropdownContainerElements).forEach(container => container.classList.remove('hidden-element'));\n            \n            if(selectedBroadcastType){ \n                ['country', 'stateProvince', 'city'].forEach(key => {\n                    if (!config.showContainers?.includes(key) && \n                        !config.setNATargets?.includes(key) && \n                        !config.autoSetFields?.find(f => f.targetDropdownKey === key)) {\n                         resetAndDisableDropdown(key, dropdownElements[key].input.dataset.placeholder, \"Not needed for this broadcast type.\");\n                    }\n                });\n            }\n\n            \/\/ Instead of hiding containers, disable dropdowns that aren't needed for this broadcast type\n            ['country', 'stateProvince', 'city'].forEach(key => {\n                if (config.hideContainers?.includes(key)) {\n                    resetAndDisableDropdown(key, 'Not Applicable', 'Not needed for this broadcast type.');\n                }\n            });\n            \n            config.setNATargets?.forEach(key => {\n                if (dropdownElements[key]) {\n                    resetAndDisableDropdown(key, 'N\/A', 'Not applicable for this broadcast type.');\n                }\n            });\n\n            let autoSetTriggeredPopulation = false;\n            config.autoSetFields?.forEach(autoSetRule => {\n                const dd = dropdownElements[autoSetRule.targetDropdownKey];\n                if (dd) {\n                    const oldValue = dd.input.value;\n                    const oldDisabled = dd.button.disabled;\n                    const oldButtonText = dd.buttonText.textContent;\n\n                    dd.buttonText.textContent = autoSetRule.value;\n                    dd.input.value = autoSetRule.value;\n                    dd.button.disabled = true;\n                    dd.button.classList.add('disabled');\n                    dd.button.dataset.tooltipMessage = autoSetRule.tooltip;\n                    dd.searchInput.style.display = 'none'; \n                    \n                    if (oldValue !== dd.input.value || oldDisabled !== dd.button.disabled || oldButtonText !== dd.buttonText.textContent) {\n                        dd.input.dispatchEvent(new Event('change', { bubbles: true }));\n                    }\n                    autoSetTriggeredPopulation = true; \n                }\n            });\n\n            if (config.initialPopulation && selectedShow && !autoSetTriggeredPopulation) {\n                const popRule = config.initialPopulation;\n                const targetDdKey = popRule.targetDropdownKey;\n                if (dropdownElements[targetDdKey]) {\n                    const values = allSheetData\n                        .filter(item => item[COL_LANGUAGE] === selectedLanguage && \n                                item[COL_SHOW] === selectedShow && \n                                item[COL_BROADCAST_TYPE] === selectedBroadcastType && \n                                item[popRule.sourceDataColumn])\n                        .map(item => item[popRule.sourceDataColumn]);\n                    populateDropdown(targetDdKey, values, popRule.placeholder);\n                }\n            } else if (!selectedShow && config.initialPopulation) { \n                 const popRule = config.initialPopulation;\n                 const targetDdKey = popRule.targetDropdownKey;\n                 if (dropdownElements[targetDdKey]) {\n                    resetAndDisableDropdown(targetDdKey, popRule.placeholder, \"Please select a Language and Show first.\");\n                 }\n            }\n            if (selectedBroadcastType) { \n                checkAndDisplayResults(); \n            }\n        }\n\n        \/\/====================================================================\n        \/\/ EVENT LISTENER SETUP\n        \/\/ This section sets up all the interactive behavior for the custom dropdown system\n        \/\/ and coordinates the cascading logic that updates dependent dropdowns when selections change\n        \/\/====================================================================\n\n        \/* Setup Custom Dropdown Event Listeners *\/\n        \/\/ Loop through each dropdown (language, show, broadcastType, country, stateProvince, city)\n        \/\/ and attach all necessary event handlers for proper dropdown functionality\n        Object.keys(dropdownElements).forEach(ddKey => {\n            const dd = dropdownElements[ddKey];\n\n            \/\/ ==================== CLICK HANDLER FOR DROPDOWN BUTTONS ====================\n            \/\/ This handles opening\/closing dropdown panels when the user clicks the dropdown button\n            dd.button.addEventListener('click', (event) => {\n                event.stopPropagation(); \/\/ Prevent event from bubbling up to document click handler\n                \n                \/\/ Don't do anything if the dropdown is disabled (shows tooltip instead)\n                if (dd.button.disabled) return;\n                \n                \/\/ Check if this dropdown is currently open\n                const isCurrentlyOpen = dd.panel.style.display === 'block';\n                \n                \/\/ CLOSE ALL OTHER DROPDOWNS - only one dropdown should be open at a time\n                \/\/ This ensures a clean UI where multiple dropdowns aren't competing for attention\n                Object.keys(dropdownElements).forEach(otherDdKey => {\n                    if (otherDdKey !== ddKey) { \/\/ Don't close the current dropdown yet\n                        dropdownElements[otherDdKey].panel.style.display = 'none';\n                        dropdownElements[otherDdKey].button.setAttribute('aria-expanded', 'false');\n                        dropdownElements[otherDdKey].button.classList.remove('expanded');\n                        dropdownElements[otherDdKey].searchInput.style.display = 'none';\n                    }\n                });\n                \n                \/\/ TOGGLE THE CURRENT DROPDOWN - close if open, open if closed\n                if (isCurrentlyOpen) {\n                    \/\/ Close the dropdown\n                    dd.panel.style.display = 'none';\n                    dd.button.setAttribute('aria-expanded', 'false'); \/\/ Accessibility attribute\n                    dd.button.classList.remove('expanded'); \/\/ CSS class for styling (rotates arrow)\n                    dd.searchInput.style.display = 'none'; \/\/ Hide search box\n                } else {\n                    \/\/ Open the dropdown\n                    dd.panel.style.display = 'block';\n                    dd.button.setAttribute('aria-expanded', 'true'); \/\/ Accessibility attribute\n                    dd.button.classList.add('expanded'); \/\/ CSS class for styling (rotates arrow)\n                    \n                    \/\/ SMART SEARCH BOX DISPLAY - only show search if there are many options\n                    \/\/ Count actual option items (exclude \"no options\" message and separators)\n                    const optionsCount = Array.from(dd.optionsList.children).filter(li => !li.classList.contains('no-options-message')).length;\n                    \n                    if (optionsCount >= 10) {\n                        \/\/ Show search box for dropdowns with many options to improve usability\n                        dd.searchInput.style.display = 'block';\n                        dd.searchInput.value = ''; \/\/ Clear any previous search\n                        filterCustomDropdownOptions(ddKey); \/\/ Reset filter to show all options\n                        setTimeout(() => dd.searchInput.focus(), 0); \/\/ Focus search box for immediate typing\n                    } else {\n                        \/\/ Hide search box for dropdowns with few options to keep UI clean\n                        dd.searchInput.style.display = 'none';\n                    }\n                }\n            });\n            \n            \/\/ ==================== SEARCH INPUT HANDLERS ====================\n            \/\/ Handle real-time filtering as user types in the search box\n            dd.searchInput.addEventListener('input', () => filterCustomDropdownOptions(ddKey));\n            \n            \/\/ Prevent search box clicks from bubbling up and closing the dropdown\n            dd.searchInput.addEventListener('click', (event) => event.stopPropagation()); \n\n            \/\/ ==================== TOOLTIP HANDLERS FOR DISABLED DROPDOWNS ====================\n            \/\/ Show helpful tooltips when users hover over disabled dropdowns\n            \/\/ This explains why a dropdown is disabled and what they need to do next\n            dd.button.addEventListener('mouseover', (event) => {\n                if (dd.button.disabled && dd.button.dataset.tooltipMessage) {\n                    showCustomTooltip(event.currentTarget, dd.button.dataset.tooltipMessage);\n                }\n            });\n            dd.button.addEventListener('mouseout', hideCustomTooltip);\n            dd.button.addEventListener('focus', hideCustomTooltip); \/\/ Hide on keyboard focus\n\n            \/\/ ==================== DROPDOWN CHANGE EVENT - THE CASCADING LOGIC ====================\n            \/\/ This is the heart of the dropdown system - when one dropdown changes, it updates all dependent dropdowns\n            \/\/ The logic flows: Language \u2192 Show \u2192 Broadcast Type \u2192 Country \u2192 State \u2192 City\n            \/\/ Each change resets and repopulates the dropdowns that depend on it\n            dd.input.addEventListener('change', () => {\n                \/\/ Find which dropdown triggered this change event\n                const currentDdKey = Object.keys(dropdownElements).find(key => dropdownElements[key].input === dd.input);\n                if (!currentDdKey) return;\n\n                \/\/ ========== LANGUAGE DROPDOWN CHANGED ==========\n                \/\/ When language changes, reset everything else and populate shows for the new language\n                if (currentDdKey === 'language') {\n                    const selectedLanguage = dd.input.value;\n                    \n                    \/\/ Reset all dependent dropdowns (everything except language)\n                    resetAndDisableDropdown('show', dropdownElements.show.input.dataset.placeholder, \"Please select a Language first.\");\n                    resetAndDisableDropdown('broadcastType', dropdownElements.broadcastType.input.dataset.placeholder, \"Please complete previous selections.\");\n                    resetAndDisableDropdown('country', dropdownElements.country.input.dataset.placeholder, \"Please complete previous selections.\");\n                    resetAndDisableDropdown('stateProvince', dropdownElements.stateProvince.input.dataset.placeholder, \"Please complete previous selections.\");\n                    resetAndDisableDropdown('city', dropdownElements.city.input.dataset.placeholder, \"Please complete previous selections.\");\n                    \n                    \/\/ Keep all dropdown containers visible (we disable dropdowns, don't hide containers)\n                    Object.values(dropdownContainerElements).forEach(container => container.classList.remove('hidden-element'));\n                    \n                    \/\/ If a language was selected, populate the show dropdown with shows available in that language\n                    if (selectedLanguage) {\n                        const shows = allSheetData\n                            .filter(item => item[COL_LANGUAGE] === selectedLanguage && item[COL_SHOW])\n                            .map(item => item[COL_SHOW]);\n                        populateDropdown('show', shows, dropdownElements.show.input.dataset.placeholder);\n                    }\n                    checkAndDisplayResults(); \/\/ Check if we can show any results yet\n                    \/\/ Note: Preemption schedule is not affected by filter selections\n                    \n                \/\/ ========== SHOW DROPDOWN CHANGED ==========\n                \/\/ When show changes, reset broadcast type and geographic dropdowns, then populate broadcast types\n                } else if (currentDdKey === 'show') {\n                    const selectedLanguage = dropdownElements.language.input.value;\n                    const selectedShow = dd.input.value;\n                    \n                    \/\/ Reset all dropdowns that depend on show selection\n                    resetAndDisableDropdown('broadcastType', dropdownElements.broadcastType.input.dataset.placeholder, \"Please select a Show first.\");\n                    resetAndDisableDropdown('country', dropdownElements.country.input.dataset.placeholder, \"Complete previous selections first.\");\n                    resetAndDisableDropdown('stateProvince', dropdownElements.stateProvince.input.dataset.placeholder, \"Complete previous selections first.\");\n                    resetAndDisableDropdown('city', dropdownElements.city.input.dataset.placeholder, \"Complete previous selections first.\");\n                    \n                    \/\/ Keep all containers visible\n                    Object.values(dropdownContainerElements).forEach(container => container.classList.remove('hidden-element'));\n                    \n                    \/\/ If both language and show are selected, populate broadcast types\n                    if (selectedLanguage && selectedShow) {\n                        const broadcastTypes = allSheetData\n                            .filter(item => item[COL_LANGUAGE] === selectedLanguage && item[COL_SHOW] === selectedShow && item[COL_BROADCAST_TYPE])\n                            .map(item => item[COL_BROADCAST_TYPE]);\n                        populateDropdown('broadcastType', broadcastTypes, dropdownElements.broadcastType.input.dataset.placeholder);\n                        \n                        \/\/ Handle edge case where broadcast type might already be selected\n                        if (!dropdownElements.broadcastType.input.value && dropdownElements.broadcastType.button.textContent !== dropdownElements.broadcastType.input.dataset.placeholder) {\n                            \/\/ Do nothing - broadcast type is being populated\n                        } else if (!dropdownElements.broadcastType.input.value) {\n                             checkAndDisplayResults(); \/\/ Check if we can show results with current selections\n                        }\n                    } else { \n                        \/\/ If show is cleared, reset dependent dropdowns and keep containers visible\n                        Object.values(dropdownContainerElements).forEach(container => container.classList.remove('hidden-element'));\n                        ['country', 'stateProvince', 'city'].forEach(keyToReset => {\n                             resetAndDisableDropdown(keyToReset, dropdownElements[keyToReset].input.dataset.placeholder, \"Complete previous selections first.\");\n                        });\n                        checkAndDisplayResults(); \n                    }\n                    \/\/ Note: Preemption schedule is not affected by filter selections\n                    \n                \/\/ ========== BROADCAST TYPE DROPDOWN CHANGED ==========\n                \/\/ When broadcast type changes, apply the configuration that determines which geographic dropdowns to show\n                } else if (currentDdKey === 'broadcastType') {\n                    const selectedLanguage = dropdownElements.language.input.value;\n                    const selectedShow = dropdownElements.show.input.value;\n                    const selectedType = dd.input.value;\n                    \n                    \/\/ Reset geographic dropdowns\n                    resetAndDisableDropdown('country', dropdownElements.country.input.dataset.placeholder, \"Complete previous selections first.\");\n                    resetAndDisableDropdown('stateProvince', dropdownElements.stateProvince.input.dataset.placeholder, \"Complete previous selections first.\");\n                    resetAndDisableDropdown('city', dropdownElements.city.input.dataset.placeholder, \"Complete previous selections first.\");\n                    \n                    \/\/ If all required fields are selected, apply broadcast type specific configuration\n                    if (selectedType && selectedLanguage && selectedShow) { \n                        applyBroadcastTypeConfig(selectedType); \/\/ This function handles showing\/hiding geographic dropdowns\n                    } else { \n                        \/\/ Keep all containers visible and check for results\n                        Object.values(dropdownContainerElements).forEach(container => container.classList.remove('hidden-element'));\n                        checkAndDisplayResults(); \n                    }\n                    \/\/ Note: Preemption schedule is not affected by filter selections\n                    \n                \/\/ ========== COUNTRY DROPDOWN CHANGED ==========\n                \/\/ When country changes, populate states\/provinces for that country\n                } else if (currentDdKey === 'country') {\n                    const selectedLanguage = dropdownElements.language.input.value;\n                    const selectedShow = dropdownElements.show.input.value;\n                    const selectedType = dropdownElements.broadcastType.input.value;\n                    const effectiveCountry = getEffectiveDropdownValue('country');\n                    \n                    \/\/ Reset dependent dropdowns\n                    resetAndDisableDropdown('stateProvince', dropdownElements.stateProvince.input.dataset.placeholder, \"Please select a Country first.\");\n                    resetAndDisableDropdown('city', dropdownElements.city.input.dataset.placeholder, \"Please complete previous selections.\");\n                    \n                    \/\/ If all required fields are selected and we have a real country (not a placeholder)\n                    if (selectedLanguage && selectedShow && selectedType && effectiveCountry && effectiveCountry !== 'N\/A_PLACEHOLDER') {\n                        \/\/ Determine if this broadcast type needs state\/province selection\n                        const needsStatePopulation = (selectedType === \"International TV Stations\") || (selectedType === \"TV Broadcasts\") ||\n                                                   (selectedType === \"USA Local Stations\" && effectiveCountry.toLowerCase() === \"united states\") ||\n                                                   (selectedShow === \"Life Foundations\" && selectedType !== \"Online\/Web Broadcasts\");\n                        \n                        if (needsStatePopulation) {\n                            \/\/ Filter data and extract unique states\/provinces for the selected country\n                            const states = allSheetData\n                                .filter(item => {\n                                    \/\/ Apply all the necessary filters\n                                    const languageMatch = item[COL_LANGUAGE] === selectedLanguage;\n                                    const showMatch = item[COL_SHOW] === selectedShow;\n                                    const typeMatch = item[COL_BROADCAST_TYPE] === selectedType;\n                                    const countryMatch = (selectedType === \"USA Local Stations\" || item[COL_COUNTRY] === effectiveCountry);\n                                    const hasState = item[COL_STATE_PROVINCE] && item[COL_STATE_PROVINCE].trim() !== '';\n                                    \n                                    \/\/ Special handling for Life Foundations show - only use data from Life Foundations tab\n                                    const isValidSource = selectedShow !== \"Life Foundations\" || item._sourceTab === \"Life Foundations\";\n                                    \n                                    return languageMatch && showMatch && typeMatch && countryMatch && hasState && isValidSource;\n                                })\n                                .map(item => item[COL_STATE_PROVINCE]);\n                            populateDropdown('stateProvince', states, dropdownElements.stateProvince.input.dataset.placeholder);\n                        }\n                    }\n                    checkAndDisplayResults();\n                    \n                \/\/ ========== STATE\/PROVINCE DROPDOWN CHANGED ==========\n                \/\/ When state changes, populate cities for that state or handle \"Show All\" selection\n                } else if (currentDdKey === 'stateProvince') {\n                    const selectedLanguage = dropdownElements.language.input.value;\n                    const selectedShow = dropdownElements.show.input.value;\n                    const selectedType = dropdownElements.broadcastType.input.value;\n                    const effectiveCountry = getEffectiveDropdownValue('country');\n                    const effectiveState = getEffectiveDropdownValue('stateProvince');\n                    \n                    \/\/ Reset city dropdown first\n                    resetAndDisableDropdown('city', dropdownElements.city.input.dataset.placeholder, \"Please select a State\/Province first.\");\n                    \n                    \/\/ Handle \"Show All\" states - disable city dropdown and show results for all states\n                    if (effectiveState === \"SHOW_ALL\") {\n                        resetAndDisableDropdown('city', 'All Cities', 'Showing all cities for all states.');\n                        checkAndDisplayResults();\n                    } \n                    \/\/ Handle specific state selection - populate cities for that state\n                    else if (selectedLanguage && selectedShow && selectedType && effectiveState && effectiveState !== 'N\/A_PLACEHOLDER') {\n                        \/\/ Determine if this broadcast type needs city selection\n                        const needsCityPopulation = (selectedType === \"International TV Stations\") || (selectedType === \"TV Broadcasts\") ||\n                                                  (selectedType === \"USA Local Stations\") ||\n                                                  (selectedShow === \"Life Foundations\" && selectedType !== \"Online\/Web Broadcasts\" && effectiveCountry && effectiveCountry !== 'N\/A_PLACEHOLDER');\n                        \n                        if (needsCityPopulation) {\n                            \/\/ Filter data and extract unique cities for the selected state\n                            const cities = allSheetData\n                                .filter(item => {\n                                    const languageMatch = item[COL_LANGUAGE] === selectedLanguage;\n                                    const showMatch = item[COL_SHOW] === selectedShow;\n                                    const typeMatch = item[COL_BROADCAST_TYPE] === selectedType;\n                                    const countryMatch = (selectedType === \"USA Local Stations\" || item[COL_COUNTRY] === effectiveCountry);\n                                    const stateMatch = item[COL_STATE_PROVINCE] === effectiveState;\n                                    const hasCity = item[COL_CITY] && item[COL_CITY].trim() !== '';\n                                    const isValidSource = selectedShow !== \"Life Foundations\" || item._sourceTab === \"Life Foundations\";\n                                    \n                                    return languageMatch && showMatch && typeMatch && countryMatch && stateMatch && hasCity && isValidSource;\n                                })\n                                .map(item => item[COL_CITY]);\n                            populateDropdown('city', cities, dropdownElements.city.input.dataset.placeholder);\n                        }\n                        checkAndDisplayResults();\n                    } \n                    \/\/ Handle N\/A state selection - show cities that don't have state data\n                    else if (effectiveState === 'N\/A_PLACEHOLDER') { \n                         const citiesForNAState = allSheetData \n                                .filter(item => {\n                                    const languageMatch = item[COL_LANGUAGE] === selectedLanguage;\n                                    const showMatch = item[COL_SHOW] === selectedShow;\n                                    const typeMatch = item[COL_BROADCAST_TYPE] === selectedType;\n                                    const countryMatch = (selectedType === \"USA Local Stations\" || item[COL_COUNTRY] === effectiveCountry);\n                                    const stateIsNA = ((item[COL_STATE_PROVINCE] || '').trim() === '' || (item[COL_STATE_PROVINCE] || '').toLowerCase() === 'n\/a');\n                                    const hasCity = item[COL_CITY] && item[COL_CITY].trim() !== '';\n                                    const isValidSource = selectedShow !== \"Life Foundations\" || item._sourceTab === \"Life Foundations\";\n                                    \n                                    return languageMatch && showMatch && typeMatch && countryMatch && stateIsNA && hasCity && isValidSource;\n                                })\n                                .map(item => item[COL_CITY]);\n                            populateDropdown('city', citiesForNAState, dropdownElements.city.input.dataset.placeholder);\n                            checkAndDisplayResults();\n                    } else {\n                        \/\/ State selection cleared or invalid - just check for results\n                        checkAndDisplayResults();\n                    }\n                    \n                \/\/ ========== CITY DROPDOWN CHANGED ==========\n                \/\/ When city changes, just check if we can display results (no further dropdowns to populate)\n                } else { \n                    checkAndDisplayResults(); \n                }\n            });\n        });\n        \n        \/* Setup Global Click Handler for Dropdown Closure *\/\n        \/\/ ==================== GLOBAL CLICK HANDLER - CLOSE DROPDOWNS WHEN CLICKING OUTSIDE ====================\n        \/\/ This event listener closes any open dropdown when the user clicks anywhere outside of dropdown elements\n        \/\/ It provides intuitive UX behavior where dropdowns close when you click elsewhere on the page\n        document.addEventListener('click', (event) => {\n            \/\/ Check if the user clicked inside any dropdown (button or panel)\n            let clickedInsideADropdown = false;\n            Object.values(dropdownElements).forEach(dd => {\n                \/\/ If click was on the dropdown button or anywhere inside the dropdown panel, don't close\n                if (dd.button.contains(event.target) || dd.panel.contains(event.target)) {\n                    clickedInsideADropdown = true;\n                }\n            });\n            \n            \/\/ If the click was outside all dropdowns, close them all\n            if (!clickedInsideADropdown) {\n                Object.values(dropdownElements).forEach(dd => {\n                    dd.panel.style.display = 'none';                    \/\/ Hide the dropdown panel\n                    dd.button.setAttribute('aria-expanded', 'false');   \/\/ Update accessibility attribute\n                    dd.button.classList.remove('expanded');             \/\/ Remove CSS class (rotates arrow back)\n                    dd.searchInput.style.display = 'none';              \/\/ Hide search box\n                });\n            }\n        });\n\n        \/\/====================================================================\n        \/\/ RESULTS DISPLAY FUNCTIONS\n        \/\/====================================================================\n\n        \/* Check if All Required Selections are Made and Display Results *\/\n        function checkAndDisplayResults() {\n            const languageVal = dropdownElements.language.input.value;\n            const showVal = dropdownElements.show.input.value;\n            const typeVal = dropdownElements.broadcastType.input.value;\n            if (!languageVal || !showVal || !typeVal) { \n                resultsDisplayArea.classList.add('hidden-element');\n                dynamicTableContainer.style.display = 'none';\n                if (noResultsMessage) noResultsMessage.classList.add('hidden-element');\n                if (resultsHeader) resultsHeader.classList.add('hidden-element');\n                if (paginationControls) paginationControls.classList.add('hidden-element');\n                return;\n            }\n            const countryVal = getEffectiveDropdownValue('country');\n            const stateVal = getEffectiveDropdownValue('stateProvince');\n            const cityVal = getEffectiveDropdownValue('city'); \n            let isPathComplete = false;\n            const config = broadcastTypeActions[typeVal] || broadcastTypeActions[\"Default\"];\n            \n            if (config.showContainers?.includes('country')) { \n                if (typeVal === \"USA Local Stations\") {\n                    \/\/ For USA Local Stations, state and city are required (can be values, N\/A, or SHOW_ALL)\n                    if ((stateVal && (stateVal !== \"\" || stateVal === \"N\/A_PLACEHOLDER\" || stateVal === \"SHOW_ALL\")) && \n                        (cityVal && (cityVal !== \"\" || cityVal === \"N\/A_PLACEHOLDER\" || cityVal === \"SHOW_ALL\"))) {\n                        isPathComplete = true;\n                    }\n                } else if (typeVal === \"International TV Stations\" || typeVal === \"TV Broadcasts\" || (showVal === \"Life Foundations\" && typeVal !== \"Online\/Web Broadcasts\")) { \n                    \/\/ For International stations, country, state, and city are required\n                    if ((countryVal && countryVal !== \"N\/A_PLACEHOLDER\" && countryVal !== \"\") && \n                        (stateVal && (stateVal !== \"\" || stateVal === \"N\/A_PLACEHOLDER\" || stateVal === \"SHOW_ALL\")) && \n                        (cityVal && (cityVal !== \"\" || cityVal === \"N\/A_PLACEHOLDER\" || cityVal === \"SHOW_ALL\"))) {\n                        isPathComplete = true;\n                    }\n                }\n            } else { \n                isPathComplete = true; \n            }\n\n            if (isPathComplete) { applyTableFilters(); } \n            else {\n                resultsDisplayArea.classList.add('hidden-element');\n                dynamicTableContainer.style.display = 'none';\n                if (noResultsMessage) noResultsMessage.classList.add('hidden-element');\n                if (resultsHeader) resultsHeader.classList.add('hidden-element');\n                if (paginationControls) paginationControls.classList.add('hidden-element');\n            }\n        }\n\n        \/* Check if the filtered result set has network names *\/\n        function hasNetworkNameInResults(items) {\n            return items.some(item => {\n                const networkName = item[COL_NETWORK_NAME];\n                return networkName && String(networkName).trim() !== '';\n            });\n        }\n\n        function getOptionalNetworkName(item) {\n            const networkName = item[COL_NETWORK_NAME];\n            return networkName && String(networkName).trim() !== '' ? networkName : '';\n        }\n\n        \/* Get Dynamic Table Columns Based on Broadcast Type *\/\n        function getDynamicTableColumns(selectedBroadcastTypeKey, filteredItems = currentFilteredDataForPagination) {\n            const config = displayColumnsConfig[selectedBroadcastTypeKey] || displayColumnsConfig[\"Default\"];\n            const countryVal = getEffectiveDropdownValue('country');\n            const stateVal = getEffectiveDropdownValue('stateProvince');\n            const cityVal = getEffectiveDropdownValue('city');\n            let headers = [];\n            let dataKeys = [];\n            const showNetworkColumn = [\"USA Local Stations\", \"International TV Stations\", \"TV Broadcasts\"].includes(selectedBroadcastTypeKey) && hasNetworkNameInResults(filteredItems);\n            const addNetworkColumn = () => {\n                if (showNetworkColumn) {\n                    headers.push(\"Network\");\n                    dataKeys.push(COL_NETWORK_NAME);\n                }\n            };\n            \n            if (selectedBroadcastTypeKey === \"International TV Stations\" || selectedBroadcastTypeKey === \"TV Broadcasts\") {\n                if (countryVal === \"N\/A\") {\n                    headers = [\"Continent\"];\n                    dataKeys = [COL_CONTINENT];\n                    addNetworkColumn();\n                    headers.push(\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\");\n                    dataKeys.push(COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE);\n                } else if (countryVal === \"SHOW_ALL\") {\n                    headers = [\"Country\"];\n                    dataKeys = [COL_COUNTRY];\n                    addNetworkColumn();\n                    headers.push(\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\");\n                    dataKeys.push(COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE);\n                } else if (stateVal === \"SHOW_ALL\") {\n                    headers = [\"State \/ Province\"];\n                    dataKeys = [COL_STATE_PROVINCE];\n                    addNetworkColumn();\n                    headers.push(\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\");\n                    dataKeys.push(COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE);\n                } else if (cityVal === \"SHOW_ALL\") {\n                    headers = [\"City\"];\n                    dataKeys = [COL_CITY];\n                    addNetworkColumn();\n                    headers.push(\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\");\n                    dataKeys.push(COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE);\n                } else {\n                    headers = [];\n                    dataKeys = [];\n                    addNetworkColumn();\n                    headers.push(...config.headers);\n                    dataKeys.push(...config.dataKeys);\n                }\n            } else if (selectedBroadcastTypeKey === \"USA Local Stations\") {\n                if (stateVal === \"SHOW_ALL\") {\n                    headers = [\"State \/ Province\", \"City\"];\n                    dataKeys = [COL_STATE_PROVINCE, COL_CITY];\n                    addNetworkColumn();\n                    headers.push(\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\");\n                    dataKeys.push(COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE);\n                } else if (cityVal === \"SHOW_ALL\") {\n                    headers = [\"City\"];\n                    dataKeys = [COL_CITY];\n                    addNetworkColumn();\n                    headers.push(\"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\");\n                    dataKeys.push(COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE);\n                } else {\n                    headers = [];\n                    dataKeys = [];\n                    addNetworkColumn();\n                    headers.push(...config.headers);\n                    dataKeys.push(...config.dataKeys);\n                }\n            } else if (selectedBroadcastTypeKey === \"Life Foundations\") {\n                \/\/ Handle Life Foundations show which can have geographic filtering\n                \/\/ Note: \"Show All\" is not available for country dropdown in Life Foundations\n                if (stateVal === \"SHOW_ALL\") {\n                    headers = [\"State \/ Province\", \"City\", \"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"];\n                    dataKeys = [COL_STATE_PROVINCE, COL_CITY, COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE];\n                } else if (cityVal === \"SHOW_ALL\") {\n                    headers = [\"City\", \"Station \/ Channel\", \"Days\", \"Broadcast Time\", \"Timezone\"];\n                    dataKeys = [COL_CITY, COL_STATION_CHANNEL_NAME, COL_DAYS, COL_BROADCAST_TIME, COL_TIMEZONE];\n                } else {\n                    headers = config.headers;\n                    dataKeys = config.dataKeys;\n                }\n            } else {\n                headers = config.headers;\n                dataKeys = config.dataKeys;\n            }\n\n            return { headers, dataKeys };\n        }\n\n        \/* Update Dynamic Table Headers Based on Broadcast Type *\/\n        function updateDynamicTableHeaders(selectedBroadcastTypeKey, filteredItems = currentFilteredDataForPagination) {\n            const columns = getDynamicTableColumns(selectedBroadcastTypeKey, filteredItems);\n            \n            scheduleResultsTableThead.innerHTML = '';\n            const tr = scheduleResultsTableThead.insertRow();\n            currentColumnWidths = [];\n            currentColumnMaxWidths = [];\n            \n            \/\/ Create the header cells\n            columns.headers.forEach(headerText => { \n                const th = document.createElement('th'); \n                th.textContent = headerText; \n                tr.appendChild(th); \n            });\n        }\n        \n        \/* Render Current Page of Table Results *\/\n        function renderTablePage() {\n            scheduleResultsTableTbody.innerHTML = ''; \n            const typeVal = dropdownElements.broadcastType.input.value; \n            const startIndex = (currentPage - 1) * itemsPerPage;\n            const endIndex = startIndex + itemsPerPage;\n            const paginatedItems = currentFilteredDataForPagination.slice(startIndex, endIndex);\n            const tableColumns = getDynamicTableColumns(typeVal);\n            \n            if (paginatedItems.length > 0) {\n                paginatedItems.forEach(item => {\n                    const tr = scheduleResultsTableTbody.insertRow();\n                    \n                    \/\/ Render cells based on determined data keys\n                    tableColumns.dataKeys.forEach(key => {\n                        const cell = tr.insertCell();\n                        if (typeVal === \"Online\/Web Broadcasts\" && key === COL_NETWORK_WEBSITE) {\n                            const actualUrl = item[COL_NETWORK_WEBSITE]; \n                            const label = item[COL_NETWORK_WEBSITE_LABEL] || actualUrl; \n                            if (actualUrl && typeof actualUrl === 'string' && actualUrl.trim() !== '') {\n                                const link = document.createElement('a');\n                                let urlToUse = actualUrl.trim();\n                                if (!urlToUse.match(\/^[a-zA-Z]+:\\\/\\\/\/i) && !urlToUse.startsWith('#') && !urlToUse.startsWith('mailto:')) { \n                                    urlToUse = `http:\/\/${urlToUse}`; \n                                }\n                                link.href = urlToUse; \n                                link.textContent = label; \n                                link.target = \"_blank\"; \n                                link.style.color = \"#227AAD\"; \n                                link.style.textDecoration = \"underline\"; \n                                cell.appendChild(link);\n                                \n                                \/\/ Add hover tooltip for the link\n                                addCellTooltip(cell, label || 'N\/A');\n                            } else { \n                                const cellContent = label || 'N\/A';\n                                cell.textContent = cellContent;\n                                addCellTooltip(cell, cellContent);\n                            }\n                        } else { \n                            const isOptionalNetworkColumn = [\"USA Local Stations\", \"International TV Stations\", \"TV Broadcasts\"].includes(typeVal) && key === COL_NETWORK_NAME;\n                            const cellContent = isOptionalNetworkColumn ? getOptionalNetworkName(item) : (item[key] || 'N\/A');\n                            cell.textContent = cellContent;\n                            \n                            \/\/ Add hover tooltip for overflow content\n                            addCellTooltip(cell, cellContent);\n                        }\n                    });\n                });\n                if (noResultsMessage) noResultsMessage.classList.add('hidden-element');\n            } else if (currentFilteredDataForPagination.length === 0) { \n                 if (noResultsMessage) { noResultsMessage.classList.remove('hidden-element'); noResultsMessage.textContent = 'No stations found matching your criteria.'; }\n                if (dynamicTableContainer) dynamicTableContainer.style.display = 'none';\n            }\n             updatePaginationControls(); \n             \n             \/\/ Set simple default column widths that can be resized\n             setTimeout(() => setDefaultColumnWidths(), 0);\n        }\n\n        \/* Update Pagination Controls *\/\n        function updatePaginationControls() {\n            const totalItems = currentFilteredDataForPagination.length;\n            const totalPages = Math.ceil(totalItems \/ itemsPerPage);\n            if (totalPages <= 1) { paginationControls.classList.add('hidden-element'); return; }\n            paginationControls.classList.remove('hidden-element');\n            pageInfo.textContent = `Page ${currentPage} of ${totalPages}`;\n            prevPageButton.disabled = currentPage === 1;\n            nextPageButton.disabled = currentPage === totalPages;\n        }\n\n        \/\/====================================================================\n        \/\/ PAGINATION EVENT HANDLERS\n        \/\/====================================================================\n\n        \/* Setup Pagination Event Listeners *\/\n        prevPageButton.addEventListener('click', () => { if (currentPage > 1) { currentPage--; renderTablePage(); } });\n        nextPageButton.addEventListener('click', () => { const totalPages = Math.ceil(currentFilteredDataForPagination.length \/ itemsPerPage); if (currentPage < totalPages) { currentPage++; renderTablePage(); } });\n\n        \/\/====================================================================\n        \/\/ TABLE FILTERING FUNCTIONS\n        \/\/====================================================================\n\n        \/* Apply Table Filters and Display Results *\/\n        function applyTableFilters() {\n            if (!dataFullyFetched) return;\n            showLoader();\n            const languageVal = dropdownElements.language.input.value;\n            const showVal = dropdownElements.show.input.value;\n            const typeVal = dropdownElements.broadcastType.input.value;\n            const effectiveCountry = getEffectiveDropdownValue('country');\n            const effectiveState = getEffectiveDropdownValue('stateProvince');\n            const effectiveCity = getEffectiveDropdownValue('city'); \n            const filteredData = allSheetData.filter(item => {\n                const itemLanguageLower = (item[COL_LANGUAGE] || '').trim().toLowerCase();\n                const itemShowLower = (item[COL_SHOW] || '').trim().toLowerCase();\n                const itemTypeLower = (item[COL_BROADCAST_TYPE] || '').trim().toLowerCase();\n                const itemCountryLower = (item[COL_COUNTRY] || '').trim().toLowerCase();\n                const itemStateLower = (item[COL_STATE_PROVINCE] || '').trim().toLowerCase();\n                const itemCityLower = (item[COL_CITY] || '').trim().toLowerCase();\n                const selectedLanguageLower = languageVal ? languageVal.trim().toLowerCase() : '';\n                const selectedShowLower = showVal ? showVal.trim().toLowerCase() : '';\n                const selectedTypeLower = typeVal ? typeVal.trim().toLowerCase() : '';\n                \n                \/\/ Handle SHOW_ALL selections\n                let selectedCountryFilter = null;\n                if (effectiveCountry === \"SHOW_ALL\") {\n                    selectedCountryFilter = \"SHOW_ALL\";\n                } else if (effectiveCountry && effectiveCountry !== \"N\/A_PLACEHOLDER\") {\n                    selectedCountryFilter = effectiveCountry.trim().toLowerCase();\n                } else if (effectiveCountry === \"N\/A_PLACEHOLDER\") {\n                    selectedCountryFilter = \"n\/a\";\n                }\n\n                let selectedStateFilter = null;\n                if (effectiveState === \"SHOW_ALL\") {\n                    selectedStateFilter = \"SHOW_ALL\";\n                } else if (effectiveState && effectiveState !== \"N\/A_PLACEHOLDER\") {\n                    selectedStateFilter = effectiveState.trim().toLowerCase();\n                } else if (effectiveState === \"N\/A_PLACEHOLDER\") {\n                    selectedStateFilter = \"n\/a\";\n                }\n\n                let selectedCityFilter = null;\n                if (effectiveCity === \"SHOW_ALL\") {\n                    selectedCityFilter = \"SHOW_ALL\";\n                } else if (effectiveCity && effectiveCity !== \"N\/A_PLACEHOLDER\") {\n                    selectedCityFilter = effectiveCity.trim().toLowerCase();\n                } else if (effectiveCity === \"N\/A_PLACEHOLDER\") {\n                    selectedCityFilter = \"n\/a\";\n                }\n\n                if (selectedLanguageLower && itemLanguageLower !== selectedLanguageLower) return false;\n                if (selectedShowLower && itemShowLower !== selectedShowLower) return false;\n                if (selectedTypeLower && itemTypeLower !== selectedTypeLower) return false;\n                const config = broadcastTypeActions[typeVal] || broadcastTypeActions[\"Default\"];\n                \n                if (config.showContainers?.includes('country')){ \n                    if (selectedTypeLower === \"international tv stations\" || selectedTypeLower === \"tv broadcasts\" || (selectedShowLower === \"life foundations\" && selectedTypeLower !== \"online\/web broadcasts\")) {\n                        \/\/ Country filtering\n                        if (selectedCountryFilter) {\n                            if (selectedCountryFilter === \"SHOW_ALL\") {\n                                \/\/ SHOW_ALL includes everything - no filtering needed for country\n                            } else if (selectedCountryFilter === \"n\/a\") {\n                                if (itemCountryLower !== 'n\/a' && itemCountryLower !== '') return false;\n                            } else {\n                                if (itemCountryLower !== selectedCountryFilter) return false;\n                            }\n                        } else { \n                            return false; \n                        }\n                        \n                        \/\/ State filtering\n                        if (selectedStateFilter) {\n                            if (selectedStateFilter === \"SHOW_ALL\") {\n                                \/\/ SHOW_ALL includes everything - no filtering needed for state\n                                \/\/ But we still need to filter city properly\n                            } else if (selectedStateFilter === \"n\/a\") {\n                                if (itemStateLower !== 'n\/a' && itemStateLower !== '') return false;\n                            } else {\n                                if (itemStateLower !== selectedStateFilter) return false;\n                            }\n                        } else { \n                            return false; \n                        }\n                        \n                        \/\/ City filtering - only filter by city if state is not \"SHOW_ALL\" or city is specifically selected\n                        if (selectedCityFilter) {\n                            if (selectedCityFilter === \"SHOW_ALL\") {\n                                \/\/ SHOW_ALL includes everything - no filtering needed for city\n                            } else if (selectedCityFilter === \"n\/a\") {\n                                if (itemCityLower !== 'n\/a' && itemCityLower !== '') return false;\n                            } else {\n                                if (itemCityLower !== selectedCityFilter) return false;\n                            }\n                        } else if (selectedStateFilter !== \"SHOW_ALL\" && !selectedCityFilter && effectiveCity !== \"\") { \n                            \/\/ Only require city selection if state is not \"SHOW_ALL\"\n                            return false; \n                        }\n                    } else if (selectedTypeLower === \"usa local stations\") {\n                        if (itemCountryLower !== '' && itemCountryLower !== 'n\/a' && itemCountryLower !== \"united states\" && itemCountryLower !== \"usa\") return false;\n                        \n                        \/\/ State filtering for USA Local Stations\n                        if (selectedStateFilter) {\n                            if (selectedStateFilter === \"SHOW_ALL\") {\n                                \/\/ SHOW_ALL includes everything - no filtering needed for state\n                            } else if (selectedStateFilter === \"n\/a\") {\n                                if (itemStateLower !== 'n\/a' && itemStateLower !== '') return false;\n                            } else if (itemStateLower !== selectedStateFilter) {\n                                return false;\n                            }\n                        } else { \n                            return false; \n                        }\n                        \n                        \/\/ City filtering for USA Local Stations - only filter by city if state is not \"SHOW_ALL\" or city is specifically selected\n                        if (selectedCityFilter) {\n                            if (selectedCityFilter === \"SHOW_ALL\") {\n                                \/\/ SHOW_ALL includes everything - no filtering needed for city\n                            } else if (selectedCityFilter === \"n\/a\") {\n                                if (itemCityLower !== 'n\/a' && itemCityLower !== '') return false;\n                            } else if (itemCityLower !== selectedCityFilter) {\n                                return false;\n                            }\n                        } else if (selectedStateFilter !== \"SHOW_ALL\" && !selectedCityFilter && effectiveCity !== \"\") { \n                            \/\/ Only require city selection if state is not \"SHOW_ALL\"\n                            return false; \n                        }\n                    }\n                }\n                return true;\n            });\n            \/\/ Sort the filtered data based on \"Show All\" selections\n            const sortedData = [...filteredData];\n            if (effectiveState === \"SHOW_ALL\") {\n                \/\/ Sort by state first, then by city\n                sortedData.sort((a, b) => {\n                    const stateA = (a[COL_STATE_PROVINCE] || '').trim().toLowerCase();\n                    const stateB = (b[COL_STATE_PROVINCE] || '').trim().toLowerCase();\n                    if (stateA !== stateB) {\n                        return stateA.localeCompare(stateB);\n                    }\n                    const cityA = (a[COL_CITY] || '').trim().toLowerCase();\n                    const cityB = (b[COL_CITY] || '').trim().toLowerCase();\n                    return cityA.localeCompare(cityB);\n                });\n            } else if (effectiveCity === \"SHOW_ALL\") {\n                \/\/ Sort by city only\n                sortedData.sort((a, b) => {\n                    const cityA = (a[COL_CITY] || '').trim().toLowerCase();\n                    const cityB = (b[COL_CITY] || '').trim().toLowerCase();\n                    return cityA.localeCompare(cityB);\n                });\n            } else if (effectiveCountry === \"SHOW_ALL\") {\n                \/\/ Sort by country first, then by state, then by city\n                sortedData.sort((a, b) => {\n                    const countryA = (a[COL_COUNTRY] || '').trim().toLowerCase();\n                    const countryB = (b[COL_COUNTRY] || '').trim().toLowerCase();\n                    if (countryA !== countryB) {\n                        return countryA.localeCompare(countryB);\n                    }\n                    const stateA = (a[COL_STATE_PROVINCE] || '').trim().toLowerCase();\n                    const stateB = (b[COL_STATE_PROVINCE] || '').trim().toLowerCase();\n                    if (stateA !== stateB) {\n                        return stateA.localeCompare(stateB);\n                    }\n                    const cityA = (a[COL_CITY] || '').trim().toLowerCase();\n                    const cityB = (b[COL_CITY] || '').trim().toLowerCase();\n                    return cityA.localeCompare(cityB);\n                });\n            }\n            \n            currentFilteredDataForPagination = sortedData; \n            currentPage = 1; \n            updateDynamicTableHeaders(typeVal, currentFilteredDataForPagination);\n            if (dynamicTableContainer) dynamicTableContainer.style.display = 'block';\n            if (resultsDisplayArea) resultsDisplayArea.classList.remove('hidden-element');\n            if (resultsHeader) resultsHeader.classList.remove('hidden-element');\n            if (currentFilteredDataForPagination.length > 0) { if (noResultsMessage) noResultsMessage.classList.add('hidden-element'); } \n            else { if (noResultsMessage) { noResultsMessage.classList.remove('hidden-element'); noResultsMessage.textContent = 'No stations found matching your criteria.'; } if (dynamicTableContainer) dynamicTableContainer.style.display = 'none';  }\n            renderTablePage(); \n            let headerTextParts = [];\n            const displayCountry = (effectiveCountry && effectiveCountry !== \"N\/A_PLACEHOLDER\" && effectiveCountry !== \"SHOW_ALL\") ? effectiveCountry : null;\n            const displayState = (effectiveState && effectiveState !== \"N\/A_PLACEHOLDER\" && effectiveState !== \"SHOW_ALL\") ? effectiveState : null;\n            const displayCity = (effectiveCity && effectiveCity !== \"N\/A_PLACEHOLDER\" && effectiveCity !== \"SHOW_ALL\") ? effectiveCity : null;\n            const currentBroadcastConfig = broadcastTypeActions[typeVal] || broadcastTypeActions[\"Default\"];\n            if (currentBroadcastConfig.showContainers?.includes('country')) { \n                if (displayCity) headerTextParts.push(displayCity); \n                if (displayState && !headerTextParts.includes(displayState)) headerTextParts.push(displayState);\n                if (displayCountry && displayCountry.toLowerCase() !== \"united states\" && displayCountry.toLowerCase() !== \"usa\" && !headerTextParts.includes(displayCountry)) {\n                     if (headerTextParts.length > 0 && (displayState || displayCity)) headerTextParts.unshift(displayCountry); else headerTextParts.push(displayCountry);\n                }\n                if (headerTextParts.length === 0 && showVal) headerTextParts.push(showVal);\n                if (headerTextParts.length === 0 && typeVal) headerTextParts.push(typeVal);\n            } else { if (showVal) headerTextParts.push(showVal); else headerTextParts.push(typeVal || \"Results\"); }\n            if (headerTextParts.length === 0 && currentFilteredDataForPagination.length === 0) headerTextParts.push(\"No Results\");\n            resultsHeader.textContent = headerTextParts.join(', ') || (currentFilteredDataForPagination.length > 0 ? \"Available Stations\" : \"No Results Found\");\n            hideLoader();\n        }\n        \n        \/\/====================================================================\n        \/\/ APPLICATION INITIALIZATION\n        \/\/====================================================================\n\n        \/* Initialize Application *\/\n        fetchSheetData(); \n        if (resultsDisplayArea) resultsDisplayArea.classList.add('hidden-element'); \n        if (dynamicTableContainer) dynamicTableContainer.style.display = 'none'; \n        if (paginationControls) paginationControls.classList.add('hidden-element');\n        if (preemptionScheduleSection) preemptionScheduleSection.classList.add('hidden-element');\n        \n        \/\/ Initialize column resizing functionality\n        initializeColumnResizing();\n\n        \/* Force Scrollbar Visibility Function *\/\n        \/\/ This function ensures scrollbars remain visible when content overflows\n        function forceScrollbarVisibility() {\n            const tableContainer = document.getElementById('dynamicTableContainer');\n            if (!tableContainer) return;\n            \n            \/\/ Detect iOS devices\n            const isIOS = \/iPad|iPhone|iPod\/.test(navigator.userAgent) || \n                         (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n            \n            \/\/ Check if content overflows horizontally\n            const hasHorizontalOverflow = tableContainer.scrollWidth > tableContainer.clientWidth;\n            \n            if (hasHorizontalOverflow) {\n                \/\/ Add class to force scroll behavior\n                tableContainer.classList.add('has-overflow');\n                \n                \/\/ Additional DOM manipulation to prevent auto-hiding\n                const containerStyle = tableContainer.style;\n                containerStyle.setProperty('overflow-x', 'scroll', 'important');\n                containerStyle.setProperty('scrollbar-width', 'thin', 'important');\n                \n                \/\/ iOS-specific aggressive fixes\n                if (isIOS) {\n                    \/\/ Force scroll behavior on iOS\n                    containerStyle.setProperty('-webkit-overflow-scrolling', 'touch', 'important');\n                    containerStyle.setProperty('-webkit-transform', 'translateZ(0)', 'important');\n                    containerStyle.setProperty('will-change', 'scroll-position', 'important');\n                    \n                    \/\/ Create a more aggressive iOS maintenance cycle\n                    let iosScrollbarTimer;\n                    const maintainIOSScrollbar = () => {\n                        clearTimeout(iosScrollbarTimer);\n                        \n                        \/\/ Force a micro-scroll to keep scrollbar visible\n                        const currentScroll = tableContainer.scrollLeft;\n                        tableContainer.scrollLeft = currentScroll + 0.01;\n                        tableContainer.scrollLeft = currentScroll;\n                        \n                        \/\/ More frequent updates for iOS\n                        iosScrollbarTimer = setTimeout(maintainIOSScrollbar, 1000); \/\/ Every 1 second for iOS\n                    };\n                    \n                    \/\/ Start aggressive iOS maintenance\n                    maintainIOSScrollbar();\n                    \n                    \/\/ Additional iOS event listeners\n                    tableContainer.addEventListener('touchstart', () => {\n                        clearTimeout(iosScrollbarTimer);\n                        maintainIOSScrollbar();\n                    }, { passive: true });\n                    \n                    tableContainer.addEventListener('touchend', () => {\n                        clearTimeout(iosScrollbarTimer);\n                        maintainIOSScrollbar();\n                    }, { passive: true });\n                    \n                    tableContainer.addEventListener('scroll', () => {\n                        clearTimeout(iosScrollbarTimer);\n                        maintainIOSScrollbar();\n                    }, { passive: true });\n                    \n                    \/\/ Force initial visibility on iOS\n                    setTimeout(() => {\n                        tableContainer.scrollLeft = 1;\n                        tableContainer.scrollLeft = 0;\n                    }, 100);\n                    \n                } else if ('WebkitAppearance' in containerStyle) {\n                    \/\/ Non-iOS webkit browsers (Android Chrome, desktop)\n                    let scrollbarTimer;\n                    const maintainScrollbar = () => {\n                        clearTimeout(scrollbarTimer);\n                        \n                        scrollbarTimer = setTimeout(() => {\n                            const currentScroll = tableContainer.scrollLeft;\n                            tableContainer.scrollLeft = currentScroll + 0.1;\n                            tableContainer.scrollLeft = currentScroll;\n                            maintainScrollbar();\n                        }, 2000); \/\/ Every 2 seconds for non-iOS\n                    };\n                    \n                    maintainScrollbar();\n                    \n                    tableContainer.addEventListener('scroll', () => {\n                        clearTimeout(scrollbarTimer);\n                        maintainScrollbar();\n                    }, { passive: true });\n                }\n            } else {\n                tableContainer.classList.remove('has-overflow');\n            }\n        }\n        \n        \/\/ Call the function after table renders and when window resizes\n        const originalRenderTablePage = renderTablePage;\n        renderTablePage = function() {\n            originalRenderTablePage.call(this);\n            setTimeout(forceScrollbarVisibility, 100);\n        };\n        \n        \/\/ Monitor window resize to adjust scrollbar visibility\n        let resizeTimeout;\n        window.addEventListener('resize', () => {\n            clearTimeout(resizeTimeout);\n            resizeTimeout = setTimeout(forceScrollbarVisibility, 100);\n        });\n\n        \/* Measure Text Width Helper - Improved *\/\n        function measureTextWidth(text, fontSize, fontWeight = '400') {\n            \/\/ Create a temporary canvas element for accurate text measurement\n            const canvas = document.createElement('canvas');\n            const context = canvas.getContext('2d');\n            context.font = `${fontWeight} ${fontSize} Montserrat, sans-serif`;\n            return Math.ceil(context.measureText(text).width);\n        }\n\n        \/* Enhanced Table Cell Tooltip Functions *\/\n        \/\/ Add hover tooltip to table cells that might have overflow content\n        function addCellTooltip(cell, fullContent) {\n            if (!fullContent || fullContent === 'N\/A') return;\n            \n            cell.addEventListener('mouseenter', (e) => {\n                \/\/ Check if content is actually truncated by comparing scroll width with client width\n                \/\/ Add a small buffer (2px) to account for sub-pixel rendering\n                if (cell.scrollWidth > cell.clientWidth + 2) {\n                    showCustomTooltip(e.currentTarget, fullContent);\n                }\n            });\n            \n            cell.addEventListener('mouseleave', hideCustomTooltip);\n        }\n\n        \/* Dynamic Station Column Detection *\/\n        function findStationColumnIndex() {\n            const table = document.getElementById('scheduleResultsTable');\n            if (!table) return -1;\n            \n            const headers = table.querySelectorAll('thead th');\n            for (let i = 0; i < headers.length; i++) {\n                const headerText = headers[i].textContent.trim().toLowerCase();\n                if (headerText.includes('station') || headerText.includes('channel')) {\n                    return i;\n                }\n            }\n            return -1; \/\/ Station column not found\n        }\n\n        \/* Apply Dynamic Station Column Styling *\/\n        function applyStationColumnStyling() {\n            const table = document.getElementById('scheduleResultsTable');\n            const stationColumnIndex = findStationColumnIndex();\n            \n            if (!table || stationColumnIndex === -1) return;\n            \n            \/\/ Apply max-width to station column header\n            const headers = table.querySelectorAll('thead th');\n            if (headers[stationColumnIndex]) {\n                headers[stationColumnIndex].style.maxWidth = '440px';\n            }\n            \n            \/\/ Apply max-width to station column cells\n            const bodyRows = table.querySelectorAll('tbody tr');\n            bodyRows.forEach(row => {\n                const cell = row.children[stationColumnIndex];\n                if (cell) {\n                    cell.style.maxWidth = '440px';\n                }\n            });\n        }\n\n        \/* Column Resizing Functions *\/\n        let isResizing = false;\n        let currentColumn = null;\n        let startX = 0;\n        let startWidth = 0;\n        let currentColumnWidths = [];\n        let currentColumnMaxWidths = [];\n        const columnWidthsBySignature = {};\n\n        function getCurrentColumnSignature() {\n            const headers = Array.from(document.querySelectorAll('#scheduleResultsTable thead th'));\n            return headers.map(header => header.textContent.trim()).join('|');\n        }\n\n        function getColumnWidthConfig(headerText) {\n            const text = headerText.toLowerCase();\n            if (text.includes('station') || text.includes('channel')) {\n                return { default: 280, max: 440 };\n            } else if (text === 'network') {\n                return { default: 220, max: 420 };\n            } else if (text.includes('network website') || text.includes('website')) {\n                return { default: 350, max: 500 };\n            } else if (text.includes('days')) {\n                return { default: 120, max: 200 };\n            } else if (text.includes('time')) {\n                return { default: 180, max: 250 };\n            } else if (text.includes('timezone')) {\n                return { default: 80, max: 120 };\n            } else if (text.includes('continent') || text.includes('country')) {\n                return { default: 150, max: 200 };\n            }\n            return { default: 100, max: 150 };\n        }\n\n        function applyColumnWidths(widths, maxWidths = currentColumnMaxWidths) {\n            const table = document.getElementById('scheduleResultsTable');\n            if (!table || !widths || widths.length === 0) return;\n\n            let colgroup = table.querySelector('colgroup');\n            if (!colgroup) {\n                colgroup = document.createElement('colgroup');\n                table.insertBefore(colgroup, table.firstChild);\n            }\n\n            colgroup.innerHTML = '';\n            widths.forEach(width => {\n                if (!Number.isFinite(width)) return;\n                const col = document.createElement('col');\n                col.style.width = width + 'px';\n                colgroup.appendChild(col);\n            });\n\n            const totalWidth = widths.reduce((sum, width) => sum + (Number.isFinite(width) ? width : 0), 0);\n            table.style.width = totalWidth + 'px';\n            table.style.minWidth = '100%';\n\n            const headers = table.querySelectorAll('thead th');\n            const bodyRows = table.querySelectorAll('tbody tr');\n            widths.forEach((width, columnIndex) => {\n                const maxWidth = maxWidths[columnIndex] || width;\n                const header = headers[columnIndex];\n                if (header) {\n                    header.style.width = width + 'px';\n                    header.style.minWidth = width + 'px';\n                    header.style.maxWidth = maxWidth + 'px';\n                }\n\n                bodyRows.forEach(row => {\n                    const cell = row.children[columnIndex];\n                    if (cell) {\n                        cell.style.width = width + 'px';\n                        cell.style.minWidth = width + 'px';\n                        cell.style.maxWidth = maxWidth + 'px';\n                    }\n                });\n            });\n        }\n\n        function initializeColumnResizing() {\n            const table = document.getElementById('scheduleResultsTable');\n            if (!table) return;\n\n            \/\/ Add resize functionality to table headers\n            table.addEventListener('mousedown', (e) => {\n                const targetHeader = e.target instanceof Element ? e.target.closest('th') : null;\n                if (targetHeader && table.contains(targetHeader)) {\n                    const rect = targetHeader.getBoundingClientRect();\n                    const resizeAreaWidth = 8; \/\/ Wider resize area for easier targeting\n                    \n                    \/\/ Check if click is in the resize area (right edge of header)\n                    if (e.clientX >= rect.right - resizeAreaWidth) {\n                        const headers = table.querySelectorAll('thead th');\n                        if (currentColumnWidths.length !== headers.length || !currentColumnWidths.every(width => Number.isFinite(width))) {\n                            setDefaultColumnWidths();\n                        }\n\n                        isResizing = true;\n                        currentColumn = targetHeader;\n                        startX = e.clientX;\n                        startWidth = currentColumn.getBoundingClientRect().width;\n                        \n                        \/\/ Add resizing class for visual feedback\n                        currentColumn.classList.add('resizing');\n                        \n                        \/\/ Prevent text selection during resize\n                        e.preventDefault();\n                        document.body.style.cursor = 'col-resize';\n                        document.body.style.userSelect = 'none';\n                    }\n                }\n            });\n\n            document.addEventListener('mousemove', (e) => {\n                if (isResizing && currentColumn) {\n                    const deltaX = e.clientX - startX;\n                    const newWidth = startWidth + deltaX;\n                    \n                    \/\/ Get the column index and determine max width based on column type\n                    const columnIndex = Array.from(currentColumn.parentNode.children).indexOf(currentColumn);\n                    const headerText = currentColumn.textContent.trim();\n                    const maxAllowedWidth = getColumnWidthConfig(headerText).max;\n                    \n                    \/\/ Respect minimum and maximum width constraints\n                    const finalWidth = Math.max(44, Math.min(maxAllowedWidth, newWidth));\n                    currentColumnWidths[columnIndex] = finalWidth;\n                    currentColumnMaxWidths[columnIndex] = maxAllowedWidth;\n                    const signature = getCurrentColumnSignature();\n                    if (signature) {\n                        columnWidthsBySignature[signature] = currentColumnWidths.slice();\n                    }\n                    applyColumnWidths(currentColumnWidths);\n                    \n                    e.preventDefault();\n                }\n            });\n\n            document.addEventListener('mouseup', () => {\n                if (isResizing) {\n                    isResizing = false;\n                    if (currentColumn) {\n                        currentColumn.classList.remove('resizing');\n                        currentColumn = null;\n                    }\n                    document.body.style.cursor = '';\n                    document.body.style.userSelect = '';\n                    forceScrollbarVisibility();\n                }\n            });\n\n            \/\/ Add visual feedback on hover\n            table.addEventListener('mousemove', (e) => {\n                const targetHeader = e.target instanceof Element ? e.target.closest('th') : null;\n                if (!isResizing && targetHeader && table.contains(targetHeader)) {\n                    const rect = targetHeader.getBoundingClientRect();\n                    const resizeAreaWidth = 8;\n                    \n                    if (e.clientX >= rect.right - resizeAreaWidth) {\n                        targetHeader.style.cursor = 'col-resize';\n                    } else {\n                        targetHeader.style.cursor = 'default';\n                    }\n                }\n            });\n\n            \/\/ Reset cursor when leaving table\n            table.addEventListener('mouseleave', (e) => {\n                if (!isResizing) {\n                    const headers = table.querySelectorAll('th');\n                    headers.forEach(th => th.style.cursor = 'default');\n                }\n            });\n        }\n\n        \/* Set Dynamic Default Column Widths *\/\n        function setDefaultColumnWidths() {\n            const table = document.getElementById('scheduleResultsTable');\n            if (!table) return;\n\n            const headers = table.querySelectorAll('thead th');\n            const bodyRows = table.querySelectorAll('tbody tr');\n            const stationColumnIndex = findStationColumnIndex();\n            const signature = getCurrentColumnSignature();\n\n            if (columnWidthsBySignature[signature] && columnWidthsBySignature[signature].length === headers.length) {\n                currentColumnWidths = columnWidthsBySignature[signature].slice();\n                currentColumnMaxWidths = Array.from(headers).map(header => getColumnWidthConfig(header.textContent.trim()).max);\n                applyColumnWidths(currentColumnWidths);\n                applyStationColumnStyling();\n                return;\n            }\n    \n            currentColumnWidths = [];\n            currentColumnMaxWidths = [];\n\n            headers.forEach((header, columnIndex) => {\n                const headerText = header.textContent.trim();\n                const widthConfig = getColumnWidthConfig(headerText);\n                let targetWidth = widthConfig.default;\n                const maxWidth = widthConfig.max;\n                \n                \/\/ For the station column, try to auto-size based on content but cap at 440px\n                if (columnIndex === stationColumnIndex) {\n                    let maxContentWidth = 0;\n                    \n                    \/\/ Check header width\n                    const headerWidth = measureTextWidth(headerText, '20px', '700') + 32; \/\/ padding\n                    maxContentWidth = Math.max(maxContentWidth, headerWidth);\n                    \n                    \/\/ Check a sample of body cell widths (first 5 rows for performance)\n                    const sampleRows = Array.from(bodyRows).slice(0, 5);\n                    sampleRows.forEach(row => {\n                        const cell = row.children[columnIndex];\n                        if (cell) {\n                            const cellWidth = measureTextWidth(cell.textContent, '18px', '400') + 32; \/\/ padding\n                            maxContentWidth = Math.max(maxContentWidth, cellWidth);\n                        }\n                    });\n                    \n                    \/\/ Use the larger of default or content width, but cap at maxWidth\n                    targetWidth = Math.min(Math.max(targetWidth, maxContentWidth), maxWidth);\n                }\n                \n                currentColumnWidths[columnIndex] = targetWidth;\n                currentColumnMaxWidths[columnIndex] = maxWidth;\n            });\n\n            if (signature) {\n                columnWidthsBySignature[signature] = currentColumnWidths.slice();\n            }\n\n            applyColumnWidths(currentColumnWidths);\n            \n            \/\/ Apply station column specific styling\n            applyStationColumnStyling();\n        }\n    });\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-109b8ffa e-ecs-flex e-flex e-con-boxed e-con e-parent\" data-id=\"109b8ffa\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-dce-background-color=\"#E6EEF2\" class=\"elementor-element elementor-element-5fba1eb5 e-con-full e-ecs-flex e-flex e-con e-child\" data-id=\"5fba1eb5\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-73c3f26f e-con-full e-ecs-flex e-flex e-con e-child\" data-id=\"73c3f26f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t<div data-dce-title-color=\"#227AAD\" class=\"elementor-element elementor-element-88fd820 elementor-position-inline-start elementor-mobile-position-inline-start elementor-widget__width-initial elementor-widget-mobile__width-initial e-transform elementor-view-default elementor-widget elementor-widget-icon-box\" data-id=\"88fd820\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_transform_translateX_effect&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;_transform_translateY_effect&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:-8,&quot;sizes&quot;:[]},&quot;_transform_translateY_effect_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;_transform_translateX_effect_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_translateX_effect_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_translateY_effect_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"icon-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-tv\"><\/i>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tCan\u2019t catch your show on TV? Watch anytime, anywhere online!\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tStream now on GTN \u2014 no cable required.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-408384d3 e-con-full e-ecs-flex e-flex e-con e-child\" data-id=\"408384d3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-653545e0 elementor-widget elementor-widget-button\" data-id=\"653545e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/www.gtntv.com\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">VISIT GTNTV.COM<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\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\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Broadcast Times and Channels Explore broadcast times and channels for The Gospel Truth with Andrew Wommack, Life Foundations with Carrie Pickett, and more. Use the dropdowns below to find out&#8230;<\/p>\n","protected":false},"author":98,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"class_list":["post-1079840","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v26.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Broadcast Schedule - Andrew Wommack Ministries<\/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.awmi.net\/broadcast-schedule\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Broadcast Schedule\" \/>\n<meta property=\"og:description\" content=\"Broadcast Times and Channels Explore broadcast times and channels for The Gospel Truth with Andrew Wommack, Life Foundations with Carrie Pickett, and more. Use the dropdowns below to find out...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.awmi.net\/broadcast-schedule\/\" \/>\n<meta property=\"og:site_name\" content=\"Andrew Wommack Ministries\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AWMinistries\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-24T17:15:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@andrewwommack\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.awmi.net\/broadcast-schedule\/\",\"url\":\"https:\/\/www.awmi.net\/broadcast-schedule\/\",\"name\":\"Broadcast Schedule - Andrew Wommack Ministries\",\"isPartOf\":{\"@id\":\"https:\/\/www.awmi.net\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.awmi.net\/broadcast-schedule\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.awmi.net\/broadcast-schedule\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp\",\"datePublished\":\"2025-06-09T14:15:52+00:00\",\"dateModified\":\"2026-04-24T17:15:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.awmi.net\/broadcast-schedule\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.awmi.net\/broadcast-schedule\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.awmi.net\/broadcast-schedule\/#primaryimage\",\"url\":\"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp\",\"contentUrl\":\"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.awmi.net\/broadcast-schedule\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.awmi.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Broadcast Schedule\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.awmi.net\/#website\",\"url\":\"https:\/\/www.awmi.net\/\",\"name\":\"Andrew Wommack Ministries\",\"description\":\"Teaching God&#039;s Unconditional Love and Grace\",\"publisher\":{\"@id\":\"https:\/\/www.awmi.net\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.awmi.net\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.awmi.net\/#organization\",\"name\":\"Andrew Wommack Ministries, Inc.\",\"alternateName\":\"AWMI\",\"url\":\"https:\/\/www.awmi.net\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.awmi.net\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.awmi.net\/wp-content\/uploads\/2018\/08\/awm-logo-standard.jpg\",\"contentUrl\":\"https:\/\/www.awmi.net\/wp-content\/uploads\/2018\/08\/awm-logo-standard.jpg\",\"width\":250,\"height\":115,\"caption\":\"Andrew Wommack Ministries, Inc.\"},\"image\":{\"@id\":\"https:\/\/www.awmi.net\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/AWMinistries\/\",\"https:\/\/x.com\/andrewwommack\",\"https:\/\/www.instagram.com\/andrewwommack\/\",\"https:\/\/www.pinterest.com\/andrewwommack\/\",\"https:\/\/www.youtube.com\/user\/andrewwommackmin\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Broadcast Schedule - Andrew Wommack Ministries","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.awmi.net\/broadcast-schedule\/","og_locale":"en_US","og_type":"article","og_title":"Broadcast Schedule","og_description":"Broadcast Times and Channels Explore broadcast times and channels for The Gospel Truth with Andrew Wommack, Life Foundations with Carrie Pickett, and more. Use the dropdowns below to find out...","og_url":"https:\/\/www.awmi.net\/broadcast-schedule\/","og_site_name":"Andrew Wommack Ministries","article_publisher":"https:\/\/www.facebook.com\/AWMinistries\/","article_modified_time":"2026-04-24T17:15:37+00:00","og_image":[{"url":"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_site":"@andrewwommack","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.awmi.net\/broadcast-schedule\/","url":"https:\/\/www.awmi.net\/broadcast-schedule\/","name":"Broadcast Schedule - Andrew Wommack Ministries","isPartOf":{"@id":"https:\/\/www.awmi.net\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.awmi.net\/broadcast-schedule\/#primaryimage"},"image":{"@id":"https:\/\/www.awmi.net\/broadcast-schedule\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp","datePublished":"2025-06-09T14:15:52+00:00","dateModified":"2026-04-24T17:15:37+00:00","breadcrumb":{"@id":"https:\/\/www.awmi.net\/broadcast-schedule\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.awmi.net\/broadcast-schedule\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.awmi.net\/broadcast-schedule\/#primaryimage","url":"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp","contentUrl":"https:\/\/cdn.awmi.net\/awmi-images\/broadcast-schedule-image-2.webp"},{"@type":"BreadcrumbList","@id":"https:\/\/www.awmi.net\/broadcast-schedule\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.awmi.net\/"},{"@type":"ListItem","position":2,"name":"Broadcast Schedule"}]},{"@type":"WebSite","@id":"https:\/\/www.awmi.net\/#website","url":"https:\/\/www.awmi.net\/","name":"Andrew Wommack Ministries","description":"Teaching God&#039;s Unconditional Love and Grace","publisher":{"@id":"https:\/\/www.awmi.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.awmi.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.awmi.net\/#organization","name":"Andrew Wommack Ministries, Inc.","alternateName":"AWMI","url":"https:\/\/www.awmi.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.awmi.net\/#\/schema\/logo\/image\/","url":"https:\/\/www.awmi.net\/wp-content\/uploads\/2018\/08\/awm-logo-standard.jpg","contentUrl":"https:\/\/www.awmi.net\/wp-content\/uploads\/2018\/08\/awm-logo-standard.jpg","width":250,"height":115,"caption":"Andrew Wommack Ministries, Inc."},"image":{"@id":"https:\/\/www.awmi.net\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/AWMinistries\/","https:\/\/x.com\/andrewwommack","https:\/\/www.instagram.com\/andrewwommack\/","https:\/\/www.pinterest.com\/andrewwommack\/","https:\/\/www.youtube.com\/user\/andrewwommackmin"]}]}},"recent_event_archives":{"recent_event_0":"69ceed37c4ff6ddd257138eb","recent_event_1":"690e3304c280371d67ce0a62","recent_event_2":"68c1d259bddacf31993d94d7","recent_event_3":"68923eb2ad30930001d6541d"},"_links":{"self":[{"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/pages\/1079840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/users\/98"}],"replies":[{"embeddable":true,"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/comments?post=1079840"}],"version-history":[{"count":0,"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/pages\/1079840\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.awmi.net\/wp-json\/wp\/v2\/media?parent=1079840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}