1<!DOCTYPE html><!-- Last Published: Fri Sep 25 2026 14:52:11 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="dugas-park-mnb.webflow.io" data-wf-page="698cb900e0bc7b7d105a505c" data-wf-site="698cb8fee0bc7b7d105a4e80" lang="en" data-wf-collection="698cb900e0bc7b7d105a5003" data-wf-item-slug="norrofest"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Norrofest 2026 | Dugas Park</title><meta content="Oct 17, 2026 Join us on Saturday, October 17 at Dugas Park in Scottsville, Kentucky, for an incredible lineup featuring The Kentucky Headhunters, Wood Box Heroes, and Jonell Mosser, along with food vendors, local brews, festival experiences, and more." name="description"/><meta content="Norrofest 2026 | Dugas Park" property="og:title"/><meta content="Oct 17, 2026 Join us on Saturday, October 17 at Dugas Park in Scottsville, Kentucky, for an incredible lineup featuring The Kentucky Headhunters, Wood Box Heroes, and Jonell Mosser, along with food vendors, local brews, festival experiences, and more." property="og:description"/><meta content="https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled.jpg" property="og:image"/><meta content="Norrofest 2026 | Dugas Park" name="twitter:title"/><meta content="Oct 17, 2026 Join us on Saturday, October 17 at Dugas Park in Scottsville, Kentucky, for an incredible lineup featuring The Kentucky Headhunters, Wood Box Heroes, and Jonell Mosser, along with food vendors, local brews, festival experiences, and more." name="twitter:description"/><meta content="https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled.jpg" name="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="eENZYEwfV-oAjYvRPZyVqT7qOGyBoGzPWE6HFqryTpY" name="google-site-verification"/><link href="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/css/dugas-park-mnb.shared.2f189e192.min.css" rel="stylesheet" type="text/css" integrity="sha384-LxieGSoVE/WseUwfNYg/jjel758Boy5HlWyE0+j8lfqUoF6Stk1itLWGFM1RR3Mm" crossorigin="anonymous"/>
1<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
1<link href="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69c466496546dc70da521a47_dp-favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69c437225d9e0af0e9e453e5_dp-webclip.jpeg" rel="apple-touch-icon"/><link href="https://www.dugaspark.org/event/norrofest" rel="canonical"/><meta name="apple-mobile-web-app-title" content="Dugas Park"> 2<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69c43b865dae874dc198c46b_dp-web-app-icon.png"> 3 4<link rel="stylesheet" href="https://use.typekit.net/uie2hba.css"> 5 6<link rel="preconnect" href="https://fonts.googleapis.com"> 7<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 8<link rel="preload" as="style" 9 href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;400;500&display=swap" 10 onload="this.onload=null;this.rel='stylesheet'"> 11<noscript> 12 <link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;400;500&display=swap" rel="stylesheet"> 13</noscript> 14 15<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 15-16
15 16<script async src="https://www.googletagmanager.com/gtag/js?id=
16G-PB568CXJ14
vendor: 12 bytes, line 16
16"></script>
17<script> 18
vendor: 134 bytes, lines 18-22
18window.dataLayer = window.dataLayer || []; 19 function gtag(){dataLayer.push(arguments);} 20 gtag('js', new Date()); 21 22 gtag('config', '
22G-PB568CXJ14
vendor: 4 bytes, line 22
22');
23</script>
23 24
25<script> 26function trimStringFromEnd(str) { 27 if (str.length <= 100) { 28 return str; 29 } else { 30 return str.slice(-100); 31 } 32} 33 34window.onerror = function(message, source, lineno, colno, error) { 35 const errorString = `${source}:${lineno}:${colno}`; 36 37 gtag("event","js_error", 38 { 39 event_category: "js_error", 40 event_label: message, 41 value: trimStringFromEnd(errorString) 42 } 43 ); 44}; 45</script>
45 46
47<script> 48(()=>{const t=6048e5,e=o=>`alert_hide_until:${o}`,n=()=>Date.now(),l=o=>{try{const t=localStorage.getItem(e(o));if(!t)return 0;const n=Number(t);return Number.isFinite(n)?n:0}catch{return 0}},i=(o,l=t)=>{try{localStorage.setItem(e(o),String(n()+l))}catch{}},r=o=>{try{localStorage.removeItem(e(o))}catch{}},c=o=>{const t=l(o);return t<=0||t<=n()?(t>0&&r(o),!0):!1},s=o=>{o.setAttribute("hidden",""),o.setAttribute("aria-hidden","true")},a=o=>{o.removeAttribute("hidden"),o.setAttribute("aria-hidden","false")},d=o=>{const t=o.getAttribute("data-alert-slug")?.trim();if(!t)return;c(t)?a(o):s(o),o.addEventListener("click",e=>{if(!e.target.closest("[data-alert-close]"))return;e.preventDefault(),i(t),s(o)})},u=()=>{document.querySelectorAll("[data-alert]").forEach(d)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",u):u()})(); 49</script>
49 50 51<style> 52 body { 53 font-family: Ubuntu,Helvetica,sans-serif; 54 } 55 56 h1, h2,h3, h4, h5, h6 { 57 font-family: polymath, system-ui, sans-serif; 58 } 59 60 .navbar:not(.navbar[data-wf--navbar--variant="dark"]) .menu-wrap:hover .nav-dropdown-toggle, 61 .navbar:not(.navbar[data-wf--navbar--variant="dark"]) .menu-wrap:hover .nav-link { 62 color: var(--gray); 63 } 64 65 .navbar:not(.navbar[data-wf--navbar--variant="dark"]) .menu-wrap .nav-dropdown-toggle:hover, 66 .navbar:not(.navbar[data-wf--navbar--variant="dark"]) .menu-wrap .nav-dropdown-toggle.w--open, 67 .navbar:not(.navbar[data-wf--navbar--variant="dark"]) .menu-wrap .nav-link:hover { 68 color: var(--white); 69 } 70 71 .nav-dropdown-list:hover a.nav-dropdown-link { 72 color: var(--dark-gray); 73 } 74 75 .nav-dropdown-list a.nav-dropdown-link:hover { 76 color: var(--white); 77 } 78 79 .w-nav-overlay { 80 overflow: visible; 81 } 82 83 .weather-widget svg { 84 height: 25px; 85 width: 25px; 86 } 87 88 .home-video-banner, .map { 89 min-height: 100vh; 90 min-height: 100svh; 91 } 92</style>
92<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/global/luxon.min.js" integrity="sha256-iwHGzfeSAG3GVYJLvrpKaSk5cHAIlwWIJGYGBbeX49U=" crossorigin="anonymous" defer=""></script>
92 93 94<style> 95.ical-button:hover .ical-options { 96 display: flex; 97} 98 99.ical-options:hover { 100 display: flex; 101} 102</style> 103 104
105<script type="text/javascript">window.__WEBFLOW_CURRENCY_SETTINGS = {"currencyCode":"USD","symbol":"$","decimal":".","fractionDigits":2,"group":",","template":"{{wf {\"path\":\"symbol\",\"type\":\"PlainText\"} }} {{wf {\"path\":\"amount\",\"type\":\"CommercePrice\"} }} {{wf {\"path\":\"currencyCode\",\"type\":\"PlainText\"} }}","hideDecimalForWholeNumbers":false};</script>
105</head><body><div data-animation="over-left" class="navbar w-nav" data-wf--navbar--variant="base" data-easing2="ease" data-easing="ease" data-collapse="medium" role="banner" data-duration="400" data-doc-height="1"><div data-wf--alerts--variant="base" class="alerts-wrapper w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="w-dyn-item"><section id="alert-notice" data-alert-slug="norrofest-2026" data-alert="" hidden="" data-alert-closed="false" class="section-alert"><div class="w-layout-blockcontainer nav-container w-container"><div data-w-id="815e062f-f574-2237-9a62-670df5fc05b9" class="alert-info"><div class="subtitle-alert">NorroFest 2026</div><a href="/event/norrofest" aria-current="page" class="alert-link w-inline-block w--current"><p class="paragraph-alert message">Come see The Kentucky Headhunters live October 17th. Get tickets now!</p></a><img data-w-id="815e062f-f574-2237-9a62-670df5fc05bc" data-alert-close="" alt="icon" src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/698cb900e0bc7b7d105a51bd_close-btn.svg" loading="lazy" class="close-alert"/></div></div></section></div></div></div><div class="nav-shadow"><div class="nav-container w-container"><div class="nav-menu-wrapper"><a href="/" class="brand w-nav-brand"><img src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69b9b916a9e8f5d91248f7b6_DP-Nav2.svg" loading="eager" alt="Dugas Park Header Logo" class="nav-logo"/></a><nav role="navigation" class="nav-menu w-nav-menu"><div class="tablet-menu"><a href="/" class="brand-tablet w-nav-brand"><img src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69b9b916a9e8f5d91248f7b6_DP-Nav2.svg" loading="lazy" alt="Mobile Menu Logo"/></a><div class="close-menu-button w-nav-button"><img src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/698cb900e0bc7b7d105a51bd_close-btn.svg" loading="lazy" alt="icon" class="nav-close-icon"/></div></div><div class="menu-wrap"><div data-hover="true" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-dropdown-toggle w-dropdown-toggle"><div class="nav-dropdown-icon w-icon-dropdown-toggle"></div><div>Visit</div></div><nav class="nav-dropdown-list w-dropdown-list"><div class="nav-dropdown-link-wrapper"><a href="/guide" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Park Guide</div></a><a href="/trails" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Trails</a><a href="/events" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Events/Calendar</a><a href="/things-for-kids" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Things for Kids</a><a href="/alerts" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Alerts & Closures</div></a><a href="/map" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Map</a></div></nav></div><div data-hover="true" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-dropdown-toggle w-dropdown-toggle"><div class="nav-dropdown-icon w-icon-dropdown-toggle"></div><div>Discover</div></div><nav class="nav-dropdown-list w-dropdown-list"><div class="w-dyn-list"><div role="list" class="nav-dropdown-link-wrapper w-dyn-items"><div role="listitem" class="nav-dropdown-collection-item w-dyn-item"><a href="/discover/amphitheater" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Amphitheater</div></a></div><div role="listitem" class="nav-dropdown-collection-item w-dyn-item"><a href="/discover/pavilion" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Pavilion</div></a></div><div role="listitem" class="nav-dropdown-collection-item w-dyn-item"><a href="/discover/oxbow-campground" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Oxbow Campground</div></a></div><div role="listitem" class="nav-dropdown-collection-item w-dyn-item"><a href="/discover/civil-war-artillery" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Civil War Artillery</div></a></div><div role="listitem" class="nav-dropdown-collection-item w-dyn-item"><a href="/discover/dog-park" class="nav-dropdown-link w-inline-block"><div class="nav-dropdown-link-line"></div><div class="nav-dropdown-text">Dog Park (Coming Soon)</div></a></div></div></div><div class="nav-dropdown-link-wrapper"><a href="/trails" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Trails</a></div></nav></div><div data-hover="true" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-dropdown-toggle w-dropdown-toggle"><div class="nav-dropdown-icon w-icon-dropdown-toggle"></div><div>Resources</div></div><nav class="nav-dropdown-list w-dropdown-list"><div class="nav-dropdown-link-wrapper"><a href="/rentals" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Rentals</a><a href="/vendors" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Vendors</a><a href="/press" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>Press/Media</a></div></nav></div><div data-hover="true" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-dropdown-toggle w-dropdown-toggle"><div class="nav-dropdown-icon w-icon-dropdown-toggle"></div><div>About</div></div><nav class="nav-dropdown-list w-dropdown-list"><div class="nav-dropdown-link-wrapper"><a href="/about-us" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>About Us</a><a href="/history" class="nav-dropdown-link w-dropdown-link"><span class="nav-dropdown-link-line"> </span>History</a></div></nav></div><a href="/get-involved" class="nav-link">Get Involved</a><div class="nav-button-hidden-desktop">
105<a href="/contact" class="primary-button nav w-button">Contact Us</a></div></div></nav><div class="nav-cta-wrapper"><div class="nav-button-hidden-tablet"><a href="/contact" class="primary-button nav w-button">Contact</a></div><div class="menu-button w-nav-button"><img src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/698cb900e0bc7b7d105a51b6_menu-btn.svg" loading="lazy" alt="icon" height="16" class="image-burger"/></div></div></div></div></div></div><div class="event-banner"><img alt="" src="https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled.jpg" sizes="100vw" srcset="https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled-p-500.jpg 500w, https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled-p-800.jpg 800w, https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled-p-1080.jpg 1080w, https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled-p-1600.jpg 1600w, https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled-p-2000.jpg 2000w, https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled.jpg 2560w" class="pages-banner-image"/><div class="bkg-overlay _30perc"></div><div class="event-banner-content"><div data-w-id="36522c69-96c3-67e5-996b-cdf46b8c3cc5" style="opacity:0" class="home-baner-content-columns"><div><h1 class="event-banner-title title-shadow">Norrofest 2026</h1></div></div><div class="home-baner-content-columns right"></div></div></div><div class="section"><div class="container w-container"><div class="event-sidebar-wrapper"><div class="event-details-content-wrapper"><div data-w-id="36522c69-96c3-67e5-996b-cdf46b8c3ccb" style="opacity:0" class="info-event-contacts"><div data-w-id="36522c69-96c3-67e5-996b-cdf46b8c3cd1" style="opacity:0" class="info-sidebar-wrap"><p class="info-icon">ï</p><p data-ticket-link="" data-event-starttime="10/17/2026 3:00 PM" data-event-endtime="" class="field-lable event-date">October 17, 2026</p><p class="field-lable starttime">3:00 pm</p></div><div data-w-id="36522c69-96c3-67e5-996b-cdf46b8c3ccc" style="opacity:0" class="info-sidebar-wrap"><p class="info-icon">ï
</p><p id="location" class="field-lable">Amphitheater</p></div></div><div data-w-id="cfaac9d6-44da-dafa-afad-1ea4d4969195" style="opacity:0" class="info-sidebar-wrap"><div data-title="Norrofest 2026" data-start="2026-10-17 3:00 pm" data-end="" data-description="Join us on Saturday, October 17 at Dugas Park in Scottsville, Kentucky, for an incredible lineup featuring The Kentucky Headhunters, Wood Box Heroes, and Jonell Mosser, along with food vendors, local brews, festival experiences, and more." class="primary-button small ical-button"><div>Add to Calendar</div><div class="ical-options"><div class="ical-options-wrapper"><a href="#" class="ical-option w-inline-block"><div>Apple</div></a><a href="#" class="ical-option w-inline-block"><div>Google</div></a><a href="#" class="ical-option w-inline-block"><div>Outlook</div></a><a href="#" class="ical-option w-inline-block"><div>ICS</div></a></div></div></div><a href="#" class="primary-button small share-button w-button">Share</a></div><div class="detail-page-rich-text w-richtext"><p>Get ready for one unforgettable day of live music, great food, and Kentucky hospitality at <strong>NorroFest 2026</strong>!</p><p>Join us on <strong>Saturday, October 17</strong> at <strong>Dugas Park in Scottsville, Kentucky</strong>, for an incredible lineup featuring <strong>The Kentucky Headhunters</strong>, <strong>Woodbox Heroes</strong>, and <strong>Jonell Mosser</strong>, along with food vendors, local brews, festival experiences, and more.</p><p>Whether you're a longtime fan or discovering your next favorite artist, NorroFest brings together nationally recognized talent and the welcoming spirit of South Central Kentucky for a festival experience you won't want to miss in the beautiful, scenic Dugas Park.</p><p><strong>General Admission Includes:</strong></p><ul role="list"><li>Full-day access to NorroFest 2026</li><li>Live performances by The Kentucky Headhunters, Wood Box Heroes, and Jonell Mosser</li><li>Access to food trucks, vendors, and festival activities</li><li>Free parking</li></ul><p>Upgrade your experience with <strong>The Back Porch Experience</strong>
105 for premium viewing, exclusive hospitality, and VIP amenities.</p><p>Grab your tickets now and join us for one of Kentucky's can't-miss music events of the year!</p><figure style="max-width:1819px" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4ebb2756e79d6b7b16f4dc_2026-NORROFEST-LINEUP%404x.jpg" loading="lazy"/></div></figure></div><div class="rich-results-embed w-embed w-script">
105<script> 106document.addEventListener("DOMContentLoaded",function(){ 107 function setRichEvent() { 108 const eventDateEl = document.querySelector('.event-date'); 109 const eventStartTime = eventDateEl.getAttribute('data-event-starttime'); 110 const { DateTime } = luxon; 111 const strucDataEventStart = DateTime.fromFormat(eventStartTime, "M/d/yyyy h:mm a", { zone: "America/Chicago" }).toUTC().toISO(); 112 const eventEndTime = eventDateEl.getAttribute('data-event-endtime'); 113 const strucAddress = "336 North Bedelia Street"; 114 const strucCity = "Scottsville"; 115 const strucState = "Ky"; 116 const description = "Join us on Saturday, October 17 at Dugas Park in Scottsville, Kentucky, for an incredible lineup featuring The Kentucky Headhunters, Wood Box Heroes, and Jonell Mosser, along with food vendors, local brews, festival experiences, and more."; 117 const previewImage = "https://cdn.prod.website-files.com/698cb900e0bc7b7d105a4fb8/6a4c298a24e9776dd282241e_KYHH_byAshNewell_b-w_lrg-scaled.jpg"; 118 const ticketLink = eventDateEl.getAttribute('data-ticket-link'); 119 120 const eventStructure = { 121 "@context": "https://schema.org", 122 "@type": "Event", 123 "name": "Norrofest 2026", 124 "startDate": strucDataEventStart, 125 "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode", 126 "eventStatus": "https://schema.org/EventScheduled", 127 "location": { 128 "@type": "Place", 129 "name": "Dugas Park Amphitheater", 130 "address": { 131 "@type": "PostalAddress", 132 "streetAddress": strucAddress, 133 "addressLocality": strucCity, 134 "addressRegion": strucState, 135 "postalCode": "42164", 136 "addressCountry": "US" 137 } 138 }, 139 "image": [previewImage], 140 "description": description 141 }; 142 143 if (eventEndTime) { 144 eventStructure["endDate"] = DateTime.fromFormat(eventEndTime, "M/d/yyyy h:mm a", { zone: "America/Chicago" }).toUTC().toISO(); 145 } 146 147 if (ticketLink) { 148 eventStructure["offers"] = { 149 "@type": "Offer", 150 "url": ticketLink, 151 "availability": "https://schema.org/InStock" 152 }; 153 } 154 155 const eventScript = document.createElement("script"); 156 eventScript.type = "application/ld+json"; 157 eventScript.textContent = JSON.stringify(eventStructure, null, 2); 158 159 document.querySelector('.rich-results-embed').appendChild(eventScript); 160 } 161 setRichEvent(); 162}); 163</script>
163</div></div><div class="event-sidebar-right-wrapper"><div class="event-sidebar-sticky"><div class="event-sidebar-richtext"><div class="w-richtext"><div class="w-embed w-script"><!-- Ticket Tailor Widget. Paste this into your website where you want the widget to appear. Do not change the code or the widget may not work properly. --> 164<div class="tt-widget"><div class="tt-widget-fallback"><p><a href="https://tickets.acsarts.org/checkout/new-session/id/8617902/chk/521c24726e164d703df8ba4c4505214b/?ref=website_widget&show_search_filter=true&show_date_filter=true&show_sort=true&show_event_filter=false" target="_blank">Click here to buy tickets</a><br /><small><a href="https://www.tickettailor.com?rf=wdg_103445" class="tt-widget-powered">Sell tickets online with Ticket Tailor</a></small></p></div>
164<script src="https://cdn.tickettailor.com/js/widgets/min/widget.js" data-url="https://tickets.acsarts.org/checkout/new-session/id/8617902/chk/521c24726e164d703df8ba4c4505214b/?ref=website_widget&show_search_filter=true&show_date_filter=true&show_sort=true&show_event_filter=false" data-type="inline" data-inline-minimal="true" data-inline-show-logo="false" data-inline-bg-fill="true" data-inline-inherit-ref-from-url-param="" data-inline-ref="website_widget"></script>
164</div><!-- End of Ticket Tailor Widget --></div></div></div></div></div></div></div></div><section data-wf--calendar--variant="base" class="section white"><div class="w-layout-blockcontainer container w-container"><div class="calender-heading-flex"><h2>Calendar</h2></div><div class="w-embed w-iframe w-script"><div style="position:relative;min-height:75vh"> 165 <iframe style="position:absolute;inset:0;width:100%;height:100%;border:1px solid #aaa;border-radius:12px;" 166 frameborder="0" scrolling="no" 167 loading="lazy" 168 title="Google Calendar" 169 id="calendarFrame" 170 data-src="https://calendar.google.com/calendar/embed?height=600&wkst=1&ctz=America%2FChicago&showPrint=0&src=Y185OTZhODYwY2QwM2Y5MTIxY2JjYjk4MGIzMTUyODk1MTFhYWJiYTJiZWE0NjU1ZWI4NzFkMzFhODJmMzNkNzQ4QGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20&mode=AGENDA"></iframe> 171</div> 172<!--
173<script> 174document.addEventListener("DOMContentLoaded", function () { 175 const iframe = document.getElementById("calendarFrame"); 176 if (!iframe) return; 177 178 const observer = new IntersectionObserver((entries, obs) => { 179 entries.forEach(entry => { 180 if (!entry.isIntersecting) return; 181 182 iframe.src = iframe.dataset.src; 183 obs.unobserve(iframe); 184 }); 185 }, { 186 root: null, 187 rootMargin: "400px 0px", 188 threshold: 0 189 }); 190 191 observer.observe(iframe); 192}); 193</script>
193 194--></div></div></section><section class="section review"><img sizes="(max-width: 1439px) 100vw, 1440px" srcset="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69bb63f764a5170b8e9f9535_dp-fog-p-500.jpg 500w, https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69bb63f764a5170b8e9f9535_dp-fog-p-800.jpg 800w, https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69bb63f764a5170b8e9f9535_dp-fog-p-1080.jpg 1080w, https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69bb63f764a5170b8e9f9535_dp-fog.jpg 1440w" alt="Foggy landscape with a wooden fence, green grass, and a covered wooden pavilion on the right." src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69bb63f764a5170b8e9f9535_dp-fog.jpg" loading="lazy" class="bkg-image"/><div class="bkg-overlay"></div><div class="w-layout-blockcontainer container w-container"><div class="review-flex"><h2 class="text-white title-shadow">Love the Park?</h2><p class="text-white title-shadow">Leave us a review on Google, it helps more people find us.</p><a href="https://search.google.com/local/writereview?placeid=ChIJ0TzxCxl3ZogR9fLrflAjIuM" target="_blank" class="primary-button outline-white w-button">Leave a Review</a></div></div></section><div class="footer"><div class="container w-container"><div class="footer-wrapper"><div id="w-node-f1debaa1-143f-58ac-f2dd-d3abe99c2d7d-634f2c73" class="footer-column footer-brand-col"><a href="/" class="footer-brand w-nav-brand"><img src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/69bb0f94feed9daed162d980_DP-FooterNav_1.svg" loading="lazy" alt="Dugas Park Footer Logo"/></a><p class="paragraph-footer">A 346-acre nonprofit park established in 2014 by the Dugas Family in Scottsville Kentucky.<br/></p></div><div class="footer-column menu"><div class="footer-menu-left"><div class="subtitle-footer">Site Links</div><div class="footer-links-wrapper"><a href="/press" class="footer-link">Press/Media</a><a href="https://search.google.com/local/writereview?placeid=ChIJ0TzxCxl3ZogR9fLrflAjIuM" target="_blank" class="footer-link">Leave Review</a><a href="/policies" class="footer-link">Terms & Privacy</a><a href="/alerts" class="footer-link">Alerts</a><a href="https://forms.gle/zhqiW9tgbR6Sn44MA" target="_blank" class="footer-link">Submit Photos</a></div></div><div class="footer-menu-right"><div class="subtitle-footer">Get Involved</div><div class="w-dyn-list"><div role="list" class="footer-links-wrapper w-dyn-items"><div role="listitem" class="w-dyn-item"><a href="/get-involved#donate" class="footer-link">Donate</a></div><div role="listitem" class="w-dyn-item"><a href="/get-involved#volunteer" class="footer-link">Volunteer</a></div><div role="listitem" class="w-dyn-item"><a href="/get-involved#be-a-friend" class="footer-link">Be a Friend</a></div><div role="listitem" class="w-dyn-item"><a href="/get-involved#tribute-and-memorials" class="footer-link">Tribute & Memorial Gifts</a></div><div role="listitem" class="w-dyn-item"><a href="/get-involved#in-kind-donations" class="footer-link">In-Kind Donations</a></div></div></div></div></div><div class="footer-column contact"><div class="subtitle-footer">Contacts</div><div class="footer-links-wrapper"><div class="footer-location-wrapper"><div class="contacts-detail"><p class="contacts-icon mobile-p-hidden">ï </p><a href="https://maps.app.goo.gl/3gT3S8Mr3BUKjVTBA" target="_blank" class="links-footer">336 North Bedelia Street<br/>Scottsville, Ky  42164</a></div><div class="contacts-detail"><p class="contacts-icon mobile-p-hidden">ï </p><a href="https://maps.app.goo.gl/xzHF1ZJzM1Kir1L88" target="_blank" class="links-footer">Office:  480 New Glasgow Road<br/>Scottsville, KY  42164</a></div><div class="contacts-detail"><p class="contacts-icon mobile-p-hidden"></p><a href="tel:270-622-4029" class="links-footer">(270) 622-4029</a></div><div class="contacts-detail"><p class="contacts-icon mobile-p-hidden">ï </p><a href="mailto:[email protected]" class="links-footer">[email protected]</a></div></div></div></div></div><div class="footer-bottom-wrapper"><div class="footer-copyright">© Friends of Dugas Community Park Inc.</div><div class="footer-social-icons-wrapper"><a href="https://www.facebook.com/DugasPark" target="_blank" class="footer-social-icon">ï</a><a href="https://www.instagram.com/dugaspark/" target="_blank" class="footer-social-icon">ï </a><a href="https://www.linkedin.com/company/dugaspark/" target="_blank" class="footer-social-icon">ï¡</a></div><div class="footer-rights-wrapper"><div class="footer-rights">Site by<a href="https://www.olivercreative.co/" target="_blank" class="footer-copyright-link">Oliver Creative</a></div></div></div></div></div>
194<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=698cb8fee0bc7b7d105a4e80" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
194<script src="https://cdn.prod.website-files.com/698cb8fee0bc7b7d105a4e80/js/dugas-park-mnb.a3815cb6.7416fc7e43a6754b.js" type="text/javascript" integrity="sha384-n4lCa7WQAIuAUS6fk3sMRDFQVhQXuNvOzXHmAB5+zJKF6qFuYF+CxOzQiT2S4a5m" crossorigin="anonymous"></script>
194<script> 195function checkWeather(){let e=document.querySelector(".weather-widget");if(!e)return;let t=document.querySelector(".weather-temp"),i=document.querySelector(".weather-image");if(!t||!i)return;let r={sun:` 196 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 197 <circle cx="12" cy="12" r="4.6" fill="#F6C945"/> 198 <path d="M12 3v2.2M12 18.8V21M3 12h2.2M18.8 12H21 199 M5.2 5.2l1.6 1.6M17.2 17.2l1.6 1.6 200 M18.8 5.2l-1.6 1.6M6.8 17.2l-1.6 1.6" 201 stroke="#F2B705" stroke-width="2" stroke-linecap="round"/> 202 </svg>`,moon:` 203 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 204 <path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8Z" 205 fill="#6FA8FF" 206 stroke="#4F83E3" 207 stroke-width="1.5" 208 stroke-linejoin="round"/> 209 </svg>`,cloud:` 210 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 211 <path d="M7.6 18.5h9.3a4.1 4.1 0 0 0 .4-8.2 212 A5.8 5.8 0 0 0 6.2 12.1 213 A3.5 3.5 0 0 0 7.6 18.5Z" 214 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 215 </svg>`,partly:` 216 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 217 <path d="M9.5 6.2a3.6 3.6 0 1 1 0 7.2a3.6 3.6 0 0 1 0-7.2Z" fill="#F6C945"/> 218 <path d="M9.5 4.5v1.4M9.5 13.1v1.4M4.5 9.8h1.4M13.1 9.8h1.4 219 M6.1 6.4l1 1M11.9 12.2l1 1 220 M12.9 6.4l-1 1M7.1 12.2l-1 1" 221 stroke="#F2B705" stroke-width="1.8" stroke-linecap="round"/> 222 <path d="M8.1 19h9.1a3.8 3.8 0 0 0 .3-7.6 223 A5.2 5.2 0 0 0 7.4 12.9 224 A3.2 3.2 0 0 0 8.1 19Z" 225 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 226 </svg>`,rain:` 227 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 228 <path d="M7.7 15.2h9a4 4 0 0 0 .4-8 229 A5.7 5.7 0 0 0 6.4 9.2 230 A3.5 3.5 0 0 0 7.7 15.2Z" 231 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 232 <path d="M9 18.2l-.6 1.6M13 18.2l-.6 1.6M17 18.2l-.6 1.6" 233 stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/> 234 </svg>`,drizzle:` 235 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 236 <path d="M7.7 15.2h9a4 4 0 0 0 .4-8 237 A5.7 5.7 0 0 0 6.4 9.2 238 A3.5 3.5 0 0 0 7.7 15.2Z" 239 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 240 <path d="M10 18.2l-.35 1.0M14 18.2l-.35 1.0M18 18.2l-.35 1.0" 241 stroke="#60A5FA" stroke-width="2" stroke-linecap="round"/> 242 </svg>`,thunder:` 243 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 244 <path d="M7.7 14.8h9a4 4 0 0 0 .4-8 245 A5.7 5.7 0 0 0 6.4 8.8 246 A3.5 3.5 0 0 0 7.7 14.8Z" 247 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 248 <path d="M12.6 14.6l-2.2 4.2h2.1l-1.1 3.4 3.2-5h-2.2l1.2-2.6Z" 249 fill="#F6C945" stroke="#F2B705" stroke-width="0.8" stroke-linejoin="round"/> 250 </svg>`,hail:` 251 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 252 <path d="M7.7 14.8h9a4 4 0 0 0 .4-8 253 A5.7 5.7 0 0 0 6.4 8.8 254 A3.5 3.5 0 0 0 7.7 14.8Z" 255 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 256 <circle cx="10" cy="19" r="1.2" fill="#93C5FD"/> 257 <circle cx="14" cy="19.6" r="1.2" fill="#93C5FD"/> 258 <circle cx="18" cy="18.9" r="1.2" fill="#93C5FD"/> 259 </svg>`,fog:` 260 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 261 <path d="M7.8 11.8h9a3.8 3.8 0 0 0 .2-7.6 262 A5.2 5.2 0 0 0 7 6.2 263 A3.2 3.2 0 0 0 7.8 11.8Z" 264 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 265 <path d="M6 15h12M4.5 18h15M7.5 21h9" 266 stroke="rgba(255,255,255,0.85)" stroke-width="2" stroke-linecap="round"/> 267 </svg>`,snow:` 268 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 269 <path d="M7.7 14.8h9a4 4 0 0 0 .4-8 270 A5.7 5.7 0 0 0 6.4 8.8 271 A3.5 3.5 0 0 0 7.7 14.8Z" 272 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 273 <path d="M10 18.5v3M14 18.5v3M18 18.5v3" 274 stroke="#93C5FD" stroke-width="2" stroke-linecap="round"/> 275 <path d="M9.4 19.6l1.2.6M10.6 19.6l-1.2.6M13.4 19.6l1.2.6M14.6 19.6l-1.2.6M17.4 19.6l1.2.6M18.6 19.6l-1.2.6" 276 stroke="#93C5FD" stroke-width="1.4" stroke-linecap="round"/> 277 </svg>`,ice:` 278 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 279 <path d="M7.7 14.8h9a4 4 0 0 0 .4-8 280 A5.7 5.7 0 0 0 6.4 8.8 281 A3.5 3.5 0 0 0 7.7 14.8Z" 282 fill="#FFFFFF" stroke="rgba(255,255,255,0.75)" stroke-width="1.5" stroke-linejoin="round"/> 283 <path d="M9.2 18.6l1.2 1.2l-1.2 1.2l-1.2-1.2l1.2-1.2Z 284 M14.2 18.2l1.4 1.4l-1.4 1.4l-1.4-1.4l1.4-1.4Z 285 M18.2 18.6l1.2 1.2l-1.2 1.2l-1.2-1.2l1.2-1.2Z" 286 fill="#93C5FD" opacity="0.9"/> 287 </svg>`,wind:` 288 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" style="display:block"> 289 <path d="M4 10h10.5a2.5 2.5 0 1 0-2.4-3.2" 290 stroke="#93C5FD" stroke-width="2" stroke-linecap="round"/> 291 <path d="M4 14h14.2a2.2 2.2 0 1 1-2.1 2.8" 292 stroke="#60A5FA" stroke-width="2" stroke-linecap="round"/> 293 <path d="M4 18h8.2" 294 stroke="#93C5FD" stroke-width="2" stroke-linecap="round"/> 295 </svg>`}
295,n="parkWeather:36.759,-86.198";function l({temp:n,code:l,isDay:o,gustMph:a}){t.textContent=`${Math.round(n)}\xb0`,i.innerHTML=function e({code:t,isDay:i,gustMph:n}){return"number"==typeof n&&n>=25?r.wind:0===t?i?r.sun:r.moon:1===t||2===t?i?r.partly:r.cloud:3===t?r.cloud:45===t||48===t?r.fog:51===t||53===t||55===t?r.drizzle:56===t||57===t?r.ice:61===t||63===t||65===t?r.rain:66===t||67===t?r.ice:71===t||73===t||75===t||77===t?r.snow:80===t||81===t||82===t?r.rain:85===t||86===t?r.snow:95===t?r.thunder:96===t||99===t?r.hail:r.cloud}({code:l,isDay:o,gustMph:a}),e.classList.add("active")}async function o(){let e=function e(){try{let t=localStorage.getItem(n);if(!t)return null;let{ts:i,data:r}=JSON.parse(t);if(!i||!r||Date.now()-i>6e5)return null;return r}catch{return null}}();e&&l(e);let t=`https://api.open-meteo.com/v1/forecast?latitude=${encodeURIComponent(36.7586193)}&longitude=${encodeURIComponent(-86.1977269)}¤t=temperature_2m,weather_code,is_day,wind_gusts_10m&temperature_unit=fahrenheit&wind_speed_unit=mph&timezone=auto`,i=await fetch(t,{cache:"no-store"});if(!i.ok)throw Error("Weather fetch failed");let r=await i.json(),o=r?.current?.temperature_2m,a=r?.current?.weather_code,s=r?.current?.is_day===1,_=r?.current?.wind_gusts_10m;if("number"==typeof o&&"number"==typeof a){let d={temp:o,code:a,isDay:s,gustMph:"number"==typeof _?_:void 0};l(d),function e(t){try{localStorage.setItem(n,JSON.stringify({ts:Date.now(),data:t}))}catch{}}(d)}}o().catch(()=>{}),setInterval(()=>o().catch(()=>{}),6e5)}function getManualClosure(e="#park-closure"){let t=document.querySelector(e);if(!t)return null;let i=(t.dataset.alertClosed||"").toLowerCase();return"true"===i||"1"===i||"yes"===i?{status:"closed",reason:"manual",message:t.dataset.message?.trim()||"The park is temporarily closed. <a href='/alerts' style='color:#fff;text-decoration:underline'>Learn more</a>."}:null}function ymdInTimeZone(e=new Date,t="America/Chicago"){let i=new Intl.DateTimeFormat("en-US",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),r=i.find(e=>"year"===e.type).value,n=i.find(e=>"month"===e.type).value,l=i.find(e=>"day"===e.type).value;return`${r}-${n}-${l}`}function addDaysInTimeZone(e=new Date,t=1){let i=new Date(e);return i.setHours(12,0,0,0),i.setDate(i.getDate()+t),i}function getCacheKey(e,t,i){return`civil_twilight_${e}_${t}_${i}`}function getCachedTwilight(e){try{let t=localStorage.getItem(e);if(!t)return null;let i=JSON.parse(t);return{dawn:new Date(i.dawn),dusk:new Date(i.dusk),dateStr:i.dateStr}}catch{return null}}function setCachedTwilight(e,t){try{localStorage.setItem(e,JSON.stringify({dawn:t.dawn.toISOString(),dusk:t.dusk.toISOString(),dateStr:t.dateStr}))}catch{}}function cleanOldTwilightCache(e,t,i="America/Chicago"){let r=ymdInTimeZone(new Date,i),n=ymdInTimeZone(addDaysInTimeZone(new Date,1),i);Object.keys(localStorage).forEach(i=>{!i.startsWith(`civil_twilight_${e}_${t}_`)||i.includes(r)||i.includes(n)||localStorage.removeItem(i)})}async function getCivilTwilight(e,t,{timeZone:i="America/Chicago",dayOffset:r=0}={}){let n=0===r?new Date:addDaysInTimeZone(new Date,r),l=ymdInTimeZone(n,i),o=getCacheKey(e,t,l),a=getCachedTwilight(o);if(a)return a;let s=`https://api.sunrise-sunset.org/json?lat=${e}&lng=${t}&date=${l}&formatted=0`,_=await fetch(s),d=await _.json(),$={dawn:new Date(d.results.civil_twilight_begin),dusk:new Date(d.results.civil_twilight_end),dateStr:l};return setCachedTwilight(o,$),$}function formatTime(e,t="America/Chicago"){return e.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0,timeZone:t})}async function getParkStatus({lat:e,lng:t,timeZone:i="America/Chicago",closureSelector:r="#alert-notice"}={}){let n=getManualClosure(r);if(n)return n;let l=new Date,o=await getCivilTwilight(e,t,{timeZone:i,dayOffset:0}),a=formatTime(o.dawn,i),s=formatTime(o.dusk,i);if(l<o.dawn)return{status:"closed",reason:"before_dawn",opensAt:a,closesAt:s,message:`Park is currently closed. Opens at ${a}.`};if(l>=o.dusk){let _=await getCivilTwilight(e,t,{timeZone:i,dayOffset:1}),d=formatTime(_.dawn,i);return{status:"closed",reason:"after_dusk",opensAt:a,closesAt:s,message:`Park is now closed. Opens tomorrow at ${d}.`}}let $=o.dusk-l,c=Math.ceil($/6e4);return c<=60?{status:"open",reason:"closing_soon",opensAt:a,closesAt:s,minutesUntilClose:c,message:`Park is open. Closing soon in ${c} minute${1===c?"":"s"}.`}:{status:"open",reason:"open",opensAt:a,closesAt:s,message:`Park is open. Closes at ${s} today.`}}async function renderParkStatus(){let e=document.querySelector("#park-status");if(!e)return;let t="America/Chicago";cleanOldTwilightCache(36.762277,-86.200504,t);let i=await getParkStatus({lat:36.762277,lng:-86.200504,timeZone:t,closureSelector:"#alert-notice"}),r=document.querySelector("#map-welcome-tag");"closed"===i.status&&r&&(r.style.display="none"),e.innerHTML=`Gates open from 7:30 AM to dusk (${i.closesAt}).`,e.classList.add("active")}document.addEventListener("DOMContentLoaded",function(){let e=document.querySelector(".section-alert"),t=document.querySelector(".pages-banner");if(e&&t){let i=parseFloat(window.getComputedStyle(t).paddingTop),r=e.offsetHeight;t.style.paddingTop=i+r+"px"}let n=document.querySelector(".navbar"),l=document.querySelector(".menu-button"),o=window.pageYOffset||document.documentElement.scrollTop,a=Date.now(),s,_,d;function $(){d=Math.abs((s=window.pageYOffset||document.documentElement.scrollTop)-o)/((_=Date.now())-a),s<300||l&&l.classList.contains("w--open")?n.classList.remove("hide"):s>o?n.classList.add("hide"):d>1.3&&n.classList.remove("hide"),o=s,a=_}n&&($(),window.addEventListener("scroll",$)),renderParkStatus(),checkWeather()}); 296</script>
vendor: 1 bytes, line 296
296
297<script> 298document.addEventListener("DOMContentLoaded", function () { 299 const lazyElements = document.querySelectorAll("[data-src]"); 300 301 if (!lazyElements.length) return; 302 303 const observer = new IntersectionObserver((entries, obs) => { 304 entries.forEach(entry => { 305 if (!entry.isIntersecting) return; 306 307 const el = entry.target; 308 309 // Set src 310 if (el.dataset.src) { 311 el.src = el.dataset.src; 312 } 313 314 // Optional: handle srcset 315 if (el.dataset.srcset) { 316 el.srcset = el.dataset.srcset; 317 } 318 319 // Optional: background images 320 if (el.dataset.bg) { 321 el.style.backgroundImage = `url(${el.dataset.bg})`; 322 } 323 324 el.removeAttribute("data-src"); 325 obs.unobserve(el); 326 }); 327 }, { 328 root: null, 329 rootMargin: "300px 0px", // start loading before visible 330 threshold: 0 331 }); 332 333 lazyElements.forEach(el => observer.observe(el)); 334}); 335</script>
335<script> 336document.addEventListener("DOMContentLoaded",function(){ 337 338 const { DateTime } = luxon; 339 340 function isWebView() { 341 let ua = navigator.userAgent || navigator.vendor || window.opera; 342 343 // Detect popular WebView browsers 344 return /FBAN|FBAV|Instagram|Snapchat|TikTok|Twitter|LinkedIn|Discord|Reddit|WeChat|Line|Pinterest/i.test(ua); 345 } 346 347 function isChromeOnIOS() { 348 let ua = navigator.userAgent; 349 return /CriOS/i.test(ua) && /iPhone|iPad|iPod/i.test(ua); 350 } 351 352 function formatICSMulti(description, maxLength = 75) { 353 // Escape required special characters per RFC 5545 354 let escapedText = description 355 .replace(/\\/g, '\\\\') 356 .replace(/;/g, '\\;') 357 .replace(/,/g, '\\,') 358 .replace(/\n/g, '\\n'); 359 360 // Apply line folding (75 characters max per line) 361 let result = ""; 362 for (let i = 0; i < escapedText.length; i += maxLength) { 363 result += (i > 0 ? " " : "") + escapedText.substring(i, i + maxLength) + "\r\n"; 364 } 365 366 return result.trim(); // Remove last newline 367 } 368 369 function addToCalendar(eventData, buttonType) { 370 if (isWebView()) { 371 gtag("event","calendar_disabled", 372 { 373 event_category: "calendar_disabled", 374 event_label: 'WebView', 375 value: navigator.userAgent 376 } 377 ); 378 379 return alert("â ï¸ To add calendar event, tap three dots in corner for external browser."); 380 } 381 382 383 let { title, start, end, location, description } = eventData; 384 385 // Convert dates to iCalendar format (YYYYMMDDTHHMMSSZ) 386 const startUTC = new Date(start).toISOString().replace(/[-:]/g, "").split(".")[0] + "Z"; 387 const endUTC = new Date(end).toISOString().replace(/[-:]/g, "").split(".")[0] + "Z"; 388 const icsDescription = formatICSMulti(description); 389 const icsLocation = formatICSMulti(location); 390 const icsTitle = formatICSMulti(title); 391 const version = buttonType.toLowerCase(); 392 393 const outlookStart = DateTime.fromISO(start).toFormat("yyyy-MM-dd'T'HH:mm:ss"); 394 const outlookEnd = DateTime.fromISO(end).toFormat("yyyy-MM-dd'T'HH:mm:ss"); 395 396 397 // Google Calendar Link (Best for online use) 398 let googleCalURL = `https://www.google.com/calendar/render?action=TEMPLATE&text=${encodeURIComponent(title)}&dates=${startUTC}/${endUTC}&details=${encodeURIComponent(description)}&location=${encodeURIComponent(location)}`; 399 400 // Outlook (Live & Office365) Link 401 let outlookCalURL = `https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&subject=${encodeURIComponent(title)}&startdt=${outlookStart}&enddt=${outlookEnd}&location=${encodeURIComponent(location)}&body=${encodeURIComponent(description)}`; 402 403 // Generate .ICS content 404 let icsData = `BEGIN:VCALENDAR\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\nSUMMARY:${icsTitle}\r\nDTSTART:${startUTC}\r\nDTEND:${endUTC}\r\nLOCATION:${icsLocation}\r\nDESCRIPTION:${icsDescription}\r\nEND:VEVENT\r\nEND:VCALENDAR`; 405 406 // Detect Browser & Platform 407 //let userAgent = navigator.userAgent.toLowerCase(); 408 409 if (version == 'google') { 410 // Open Google Calendar (Best for Chrome & Android) 411 window.open(googleCalURL, "_blank", "noopener,noreferrer"); 412 } else if (version == 'outlook') { 413 // Open Outlook (Best for Windows users) 414 window.open(outlookCalURL, "_blank", "noopener,noreferrer"); 415 } else if (version == 'apple') { 416 // iPhone & Safari: Use `data:text/calendar` (iOS workaround) 417 let icsURL = "data:text/calendar;charset=utf8," + encodeURIComponent(icsData); 418 let link = document.createElement("a"); 419 link.href = icsURL; 420 link.download = "event.ics"; 421 document.body.appendChild(link); 422 link.click(); 423 document.body.removeChild(link); 424 } else { 425 // Default (Chrome, Firefox, MacOS, Edge): Download .ICS file 426 let blob = new Blob([icsData], { type: "text/calendar" }); 427 let icsFileURL = URL.createObjectURL(blob); 428 let link = document.createElement("a"); 429 link.href = icsFileURL; 430 link.download = "event.ics"; 431 document.body.appendChild(link); 432 link.click(); 433 document.body.removeChild(link); 434 } 435 } 436 437 function convertTo24HourISO(dateString, defaultEnd = false) { 438 // Extract date and time components 439 let [datePart, timePart, period] = dateString.split(' '); 440 let [year, month, day] = datePart.split("-"); 441 let [hours, minutes] = timePart.split(':').map(Number); 442 443 if (defaultEnd) { 444 //hours = (hours == 11 && period.toLowerCase() === "pm") ? hours : hours+1; 445 446 if (hours == 11 && period.toLowerCase() === "pm") { 447 minutes = 59; 448 } else { 449 hours = hours + 1; 450
451 if (hours === 12) period = 'pm'; 452 } 453 } 454 455 // Convert 12-hour format to 24-hour format 456 if (period.toLowerCase() === "pm" && hours !== 12) hours += 12; 457 if (period.toLowerCase() === "am" && hours === 12) hours = 0; 458 459 // Format output manually in "YYYY-MM-DDTHH:MM:SS" 460 let formattedDate = `${year}-${month}-${day}T${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:00`; 461 462 return formattedDate; 463 } 464 465 function getEndDate(endDate, luxonStart) { 466 if (endDate) { 467 const luxonEnd = DateTime.fromFormat(endDate, "yyyy-MM-dd h:mm a", { zone: "America/Chicago" }); 468 469 if (luxonEnd > luxonStart) { 470 return luxonEnd.toUTC().toISO(); 471 } 472 } 473 474 return luxonStart.plus({ hours: 1 }).toUTC().toISO(); 475 } 476 477 function connectActionButtons() { 478 479 const calButton = document.querySelector('.ical-button'); 480 const startDate = calButton.getAttribute('data-start'); 481 const endDate = calButton.getAttribute('data-end'); 482 const parkLocal = document.querySelector('#location').textContent; 483 const location = `Dugas Park ${parkLocal}, 336 North Bedelia Street, Scottsville, Ky 42164`; 484 const luxonStart = DateTime.fromFormat(startDate, 'yyyy-MM-dd h:mm a', { zone: "America/Chicago" }); 485 486 // Example Event Data 487 const eventDetails = { 488 title: calButton.getAttribute('data-title'), 489 start: luxonStart.toUTC().toISO(), 490 end: getEndDate(endDate, luxonStart), 491 location: location, 492 description: calButton.getAttribute('data-description') 493 }; 494 495 // Attach to Button Click 496 const iCalButtons = document.querySelectorAll('.ical-button .ical-option'); 497 498 iCalButtons.forEach(btn => { 499 btn.addEventListener('click', function(e) { 500 addToCalendar(eventDetails, e.currentTarget.textContent); 501 502 gtag("event","calendar_add_click", 503 { 504 event_category: "calendar_add", 505 event_label: e.currentTarget.textContent, 506 value: eventDetails.title 507 } 508 ); 509 }); 510 }); 511 } 512 513 connectActionButtons(); 514 515 const ticketButtons = document.querySelectorAll('.ticket-button'); 516 517 ticketButtons.forEach((btn) => { 518 btn.target = "_blank"; 519 }); 520 521 const shareButton = document.querySelector('.share-button'); 522 523 if (shareButton && navigator.share) { 524 const data = { 525 title: document.title, 526 url: window.location.href 527 } 528 529 shareButton.addEventListener("click", async () => { 530 try { 531 await navigator.share(data); 532 533 gtag("event","share_click", 534 { 535 event_category: "share", 536 event_label: document.title, 537 value: window.location.pathname 538 } 539 ); 540 } catch(error) { 541 console.log('Error sharing:', error); 542 543 gtag("event","share_error", 544 { 545 event_category: "share", 546 event_label: window.location.pathname, 547 value: error 548 } 549 ); 550 } 551 }); 552 } else if (shareButton) { 553 shareButton.style.display = 'none'; 554 555 gtag("event","share_inactive", 556 { 557 event_category: "share", 558 event_label: 'browser_user_agent', 559 value: navigator.userAgent 560 } 561 ); 562 } 563}); 564</script>
564</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.