1 2 3<!doctype html><html class="no-js" lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta property="og:type" content="website" /><meta property="og:title" content="City of Harlan"/><meta property="og:image" content="https://www.cityofharlan.com/opengraph.png?v=180717" /> 4<title>City of Harlan</title><style> 5 table.socs-accordion-builder { 6 display: none !important; 7 } 8 9 10 .panel-group.socs-accordion-builder > .panel { 11 overflow: hidden; 12 } 13 .panel-group.socs-accordion-builder [data-toggle="collapse"] { 14 display: block; 15 text-decoration: none !important; 16 } 17 .panel-group.socs-accordion-builder [data-toggle="collapse"] > span { 18 font-size: 85%; 19 font-style: italic; 20 margin-left: 1em; 21 } 22 .panel-group.socs-accordion-builder .sab-toggle-indicator { 23 float: left; 24 margin-right: 20px; 25 } 26 .panel-group.socs-accordion-builder .list-group-flush { 27 border-radius: 0; 28 margin-bottom: 0; 29 } 30 .panel-group.socs-accordion-builder .list-group-flush > .list-group-item { 31 border-width: 0 0 1px; 32 margin-bottom: 0; 33 } 34 .panel-group.socs-accordion-builder .list-group-flush > .list-group-item:last-child { 35 border-bottom-width: 0; 36 } 37 </style> 38<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Libre+Baskerville:400,400i,700"> 39<link rel="stylesheet" href="/css/backend/fontawesome/6.5.2-pro/css/all.min.css"> 40<link rel="stylesheet" href="/css/L17/subPage.min.css?v=230921"><link rel="stylesheet" href="/css/L17/navStyle2.min.css?v=230921">
40<script src="/javascripts/modernizr/modernizr-custom-3.6.0.js"></script>
40 41
41<script src="/javascripts/jquery/jquery-3.7.1.min.js"></script>
41<link rel="stylesheet" href="/javascripts/bxslider/4.2.15/dist/jquery.bxslider.css">
42<script src="/javascripts/bxslider/4.2.15/dist/jquery.bxslider.min.js"></script>
vendor: 1 bytes, line 42
42
43<script type="text/javascript">var socsSignedIn = 0;</script>
43<script src="/javascripts/min/L17/L17-head.min.js"></script>
43<link rel="stylesheet" href="/javascripts/addtohomescreen/addtohomescreen.min.css">
43<script src="/javascripts/addtohomescreen/addtohomescreen.min.js"></script>
43<script> 44 ;(function($) { 45 'use strict'; 46 addToHomescreen({ 47 skipFirstVisit: false, 48 maxDisplayCount: 1, 49 lifespan: 0 50 }); 51 })(jQuery); 52 </script>
52<script type="text/javascript"> 53var display_private_sections = 0; 54var allowed_section_ids = "" 55</script>
55<script> 56 var _gaq = _gaq || [], tempOStype = "n/a"; 57 58 var val = Cookies.get('socsapp'); 59 tempOStype = (val == undefined) ? 'no' : val; 60 61 _gaq.push( 62 ['_setCustomVar',1,'siteURL','https://cityofharlan.socs.net'], 63 ['_setCustomVar',2,'template','L17'], 64 ['_setCustomVar',3,'protocol',document.location.protocol], 65 ['_setCustomVar',4,'socsApp',tempOStype], 66 ['_setAccount', 'UA-36782344-1'], 67 ['_trackPageview'], 68 ['_deleteCustomVar',1], 69 ['_deleteCustomVar',2], 70 ['_deleteCustomVar',3], 71 ['_deleteCustomVar',4] 72 ); 73 74 (function() { 75 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 76 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 77 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 78 })(); 79 80</script>
80 81</head> 82 83<body class="ns2 sub-page body-masthead-style-3 fluid-jumbotron "><div class="sr-only">Quick Links</div><a class="sr-only sr-only-focusable" href="#mainContent" title="Skips to the main content.">Skip to main content</a><a class="sr-only sr-only-focusable" href="#navigation" title="Skips to the main menu.">Skip to navigation</a> 84<div class="container-masthead"><div class="container"><div class="masthead-print visible-print-block"><h2>City of Harlan</h2></div><div class="masthead-style-3 hidden-print clearfix"><div class="weather extra-links hidden-xs"><ul class="ns2-menu-wrapper"></ul> 85<div class="weather-forecast"><div class="wForecast"><em>Current conditions as of 2 Oct 07:35 am CDT</em><h3>Fair</h3><table><tbody><tr><td class="stats"><dl><dt>Location:</dt><dd>Harlan</dd><dt>Feels like:</dt><dd>NA°</dd><dt>Humidity:</dt><dd>100</dd><dt>Wind:</dt><dd>N 0 mph</dd></dl></td><td class="weatherForecastGraphic"><img src="https://forecast.weather.gov/newimages/medium/sct.png" alt="Fair"></td><td class="weatherForecastTemp">41°</td></tr></tbody></table><div class="today textforecast"><div class="textforecast-title">Today</div><div>Sunny, with a high near 62. North northeast wind around 6 mph becoming light and variable in the afternoon. </div></div><div class="today textforecast"><div class="textforecast-title">Tonight</div><div>Clear, with a low around 44. Light south southeast wind. </div></div><div class="today textforecast"><div class="textforecast-title">Saturday</div><div>Sunny, with a high near 66. South wind 6 to 11 mph, with gusts as high as 20 mph. </div></div><div class="provider">Weather forecast provided by weather.gov.</div></div></div>
86<script> 87;(function($){ 88 'use strict'; 89 $(function() { 90 91 if ($('.weather > .weather-link').length == 0) { 92 // Create the HTML for the weather and setup the hover events 93 if ($('.weather > .ns2-menu-wrapper').length) { 94 $('.weather > .ns2-menu-wrapper').after('<a class="weather-link" href="http://forecast.weather.gov/MapClick.php?lat=41.6760825&lon=-95.3520876" rel="noopener" target="_blank">41° <em class="fa fa-angle-down"><\/em><\/a>'); 95 } else { 96 $('.weather').prepend('<a class="weather-link" href="http://forecast.weather.gov/MapClick.php?lat=41.6760825&lon=-95.3520876" rel="noopener" target="_blank">41° <em class="fa fa-angle-down"><\/em><\/a>'); 97 } 98 } 99 100 if ($('html').hasClass('no-touchevents')) { 101 $('.weather-link').hover(function(e) { 102 $(this).next().addClass('show-weather-forecast'); 103 }, function(e) { 104 $(this).next().removeClass('show-weather-forecast'); 105 }); 106 } 107 108 $('.textforecast').each(function() { 109 if ($.trim($(this).text()).length === 0) $(this).css('display', 'none'); 110 }); 111 112 113 }); 114})(jQuery); 115</script>
115 116<a class="socs-sign-in-link" href="/vcalendar/?FROMPAGE=Nav_Signin" title="Sign In"><em class="fas fa-sign-in fa-lg fa-fw"></em><em class="sr-only">Sign In Link</em></a></div>
116<script>;(function($){'use strict';var parent = '.masthead-style-3'; 117 // Change Sign In to Sign Out IF user is signed in 118 if (socsSignedIn) { 119 $('.socs-sign-in-link').replaceWith('<a href="/vcalendar/?FROMPAGE=Nav_Signout" title="Sign Out - signed in as ' + socsUserFullName + '"><em class="fas fa-sign-out fa-lg fa-fw"></em><em class="sr-only">Sign Out</em></a>'); 120 } 121 122 // Search Icon - toggle search field 123 $(parent + ' .icon-search').on('click', function(e) { 124 e.preventDefault(); 125 var $sh = $('.search-header'); 126 if ($sh.hasClass('show-search')) { 127 $('#Fkeywords').blur(); 128 $sh.removeClass('show-search'); 129 } else { 130 $('#Fkeywords').focus(); 131 $sh.addClass('show-search'); 132 } 133 }); 134 135})(jQuery); 136</script>
136 137</div> 138</div></div><div class="container-nav"><div class="container"><div class="hidden"><a name="navigation"></a>Main Navigation</div><nav class="navbar navbar-default" role="navigation"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><div class="weather extra-links"><ul class="ns2-menu-wrapper"></ul><div class="weather-forecast"><div class="wForecast"><em>Current conditions as of 2 Oct 07:35 am CDT</em><h3>Fair</h3><table><tbody><tr><td class="stats"><dl><dt>Location:</dt><dd>Harlan</dd><dt>Feels like:</dt><dd>NA°</dd><dt>Humidity:</dt><dd>100</dd><dt>Wind:</dt><dd>N 0 mph</dd></dl></td><td class="weatherForecastGraphic"><img src="https://forecast.weather.gov/newimages/medium/sct.png" alt="Fair"></td><td class="weatherForecastTemp">41°</td></tr></tbody></table><div class="today textforecast"><div class="textforecast-title">Today</div><div>Sunny, with a high near 62. North northeast wind around 6 mph becoming light and variable in the afternoon. </div></div><div class="today textforecast"><div class="textforecast-title">Tonight</div><div>Clear, with a low around 44. Light south southeast wind. </div></div><div class="today textforecast"><div class="textforecast-title">Saturday</div><div>Sunny, with a high near 66. South wind 6 to 11 mph, with gusts as high as 20 mph. </div></div><div class="provider">Weather forecast provided by weather.gov.</div></div></div>
139<script> 140;(function($){ 141 'use strict'; 142 $(function() { 143 144 if ($('.weather > .weather-link').length == 0) { 145 // Create the HTML for the weather and setup the hover events 146 if ($('.weather > .ns2-menu-wrapper').length) { 147 $('.weather > .ns2-menu-wrapper').after('<a class="weather-link" href="http://forecast.weather.gov/MapClick.php?lat=41.6760825&lon=-95.3520876" rel="noopener" target="_blank">41° <em class="fa fa-angle-down"><\/em><\/a>'); 148 } else { 149 $('.weather').prepend('<a class="weather-link" href="http://forecast.weather.gov/MapClick.php?lat=41.6760825&lon=-95.3520876" rel="noopener" target="_blank">41° <em class="fa fa-angle-down"><\/em><\/a>'); 150 } 151 } 152 153 if ($('html').hasClass('no-touchevents')) { 154 $('.weather-link').hover(function(e) { 155 $(this).next().addClass('show-weather-forecast'); 156 }, function(e) { 157 $(this).next().removeClass('show-weather-forecast'); 158 }); 159 } 160 161 $('.textforecast').each(function() { 162 if ($.trim($(this).text()).length === 0) $(this).css('display', 'none'); 163 }); 164 165 166 }); 167})(jQuery); 168</script>
168 169<a class="socs-sign-in-link" href="/vcalendar/?FROMPAGE=Nav_Signin" title="Sign In"><em class="fas fa-sign-in fa-lg fa-fw"></em><em class="sr-only">Sign In Link</em></a></div>
169<script>;(function($){'use strict';var parent = '.navbar-header'; 170 // Change Sign In to Sign Out IF user is signed in 171 if (socsSignedIn) { 172 $('.socs-sign-in-link').replaceWith('<a href="/vcalendar/?FROMPAGE=Nav_Signout" title="Sign Out - signed in as ' + socsUserFullName + '"><em class="fas fa-sign-out fa-lg fa-fw"></em><em class="sr-only">Sign Out</em></a>'); 173 } 174 175 // Search Icon - toggle search field 176 $(parent + ' .icon-search').on('click', function(e) { 177 e.preventDefault(); 178 var $sh = $('.search-header'); 179 if ($sh.hasClass('show-search')) { 180 $('#Fkeywords').blur(); 181 $sh.removeClass('show-search'); 182 } else { 183 $('#Fkeywords').focus(); 184 $sh.addClass('show-search'); 185 } 186 }); 187 188})(jQuery); 189</script>
189 190</div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav"><li><a href="/" accesskey="1" title="Home Link"><em class="fa fa-home fa-lg fa-fw" style="margin-right: 0.5em;"></em>Home</a></li>
190<script> 191 if (Cookies.get('device_uuid')) document.write('<li><a href=' + 192 '"/vnotifier/?page=setupnotifications' + 193 '&backUrl=' + encodeURIComponent(window.location.href) + 194 '&device_uuid=' + Cookies.get('device_uuid') + '">' + 195 '<em class="fa fa-cog fa-lg fa-fw"></em><span class="hidden-sm hidden-md hidden-lg">Settings</span></a></li>'); 196 </script>
196<li><a href="https://www.elocallink.tv/m/v/Redesign4/?pid=w2wzy5x3&fp=iahar24_wel_rev_iwd" target="_blank">Welcome to Harlan - Video Tour</a></li><li class="dropdown socs-no-mm "><a href="/vnews/display.v/SEC/General">General</a><a href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li><a href="/vnews/display.v/SEC/General%7CAbout%20Us"><em class="sr-only">General - </em>About Us</a></li><li><a href="/vnews/display.v/SEC/General%7CMayor/City%20Council%20Members"><em class="sr-only">General - </em>Mayor/City Council Members</a></li><li><a href="/vnews/display.v/SEC/General%7CAdministration"><em class="sr-only">General - </em>Administration</a></li><li class="dropdown-submenu "><a href="/vnews/display.v/SEC/General%7CCouncil%20Agenda%20%26%20Minutes"><em class="sr-only">General - </em>Council Agenda & Minutes</a><a class="submenu-toggle" href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li><a href="/vnews/display.v/SEC/General%7CCouncil%20Agenda%20%26%20Minutes%3E%3EPrevious%20Council%20Minutes"><em class="sr-only">General - Council Agenda & Minutes - </em>Previous Council Minutes</a></li><li><a href="/vnews/display.v/SEC/General%7CCouncil%20Agenda%20%26%20Minutes%3E%3EOther%20Committee%20Minutes"><em class="sr-only">General - Council Agenda & Minutes - </em>Other Committee Minutes</a></li><li><a href="/vnews/display.v/SEC/General%7CCouncil%20Agenda%20%26%20Minutes%3E%3EPrevious%20Committee%20Minutes"><em class="sr-only">General - Council Agenda & Minutes - </em>Previous Committee Minutes</a></li></ul></li><li><a href="/vnews/display.v/SEC/General%7CBoards%20%26%20Commission%20Members"><em class="sr-only">General - </em>Boards & Commission Members</a></li><li><a href="/vnews/display.v/SEC/General%7CEmployment%20Opportunities"><em class="sr-only">General - </em>Employment Opportunities</a></li></ul></li><li class="dropdown socs-no-mm "><a href="/vnews/display.v/SEC/Departments%20%26%20Services">Departments & Services</a><a href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CC.G.%20Therkildsen%20Activity%20Center"><em class="sr-only">Departments & Services - </em>C.G. Therkildsen Activity Center</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CCity%20Hall"><em class="sr-only">Departments & Services - </em>City Hall</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CFire%20Department"><em class="sr-only">Departments & Services - </em>Fire Department</a></li><li><a href="https://www.harlan.lib.ia.us/" target="_blank"><em class="sr-only">Departments & Services - </em>Library</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CMunicipal%20Airport"><em class="sr-only">Departments & Services - </em>Municipal Airport</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CParks%20and%20Recreation"><em class="sr-only">Departments & Services - </em>Parks and Recreation</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CStreet%20Department"><em class="sr-only">Departments & Services - </em>Street Department</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CVeteran%27s%20Memorial%20Auditorium"><em class="sr-only">Departments & Services - </em>Veteran's Memorial Auditorium</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CWastewater%20Treatment%20Plant"><em class="sr-only">Departments & Services - </em>Wastewater Treatment Plant</a></li><li><a href="/vnews/display.v/SEC/Departments%20%26%20Services%7CYard%20Waste%20Site"><em class="sr-only">Departments & Services - </em>Yard Waste Site</a></li></ul></li><li class="dropdown socs-no-mm "><a href="/vnews/display.v/SEC/Codes%2C%20Permits%20%26%20Licenses">Codes, Permits & Licenses</a><a href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li><a href="/vnews/display.v/SEC/Codes%2C%20Permits%20%26%20Licenses%7CCity%20Code"><em class="sr-only">Codes, Permits & Licenses - </em>City Code</a></li><li><a href="/vnews/display.v/SEC/Codes%2C%20Permits%20%26%20Licenses%7CPermits"><em class="sr-only">Codes, Permits & Licenses - </em>Permits</a></li><li><a href="/vnews/display.v/SEC/Codes%2C%20Permits%20%26%20Licenses%7CAnimal%20Control%20%26%20Licensing"><em class="sr-only">Codes, Permits & Licenses - </em>Animal Control & Licensing</a></li><li><a href="/vnews/display.v/SEC/Codes%2C%20Permits%20%26%20Licenses%7CHome%20Business%20Licensing"><em class="sr-only">Codes, Permits & Licenses - </em>Home Business Licensing</a></li></ul></li><li class="dropdown socs-no-mm "><a href="/vnews/display.v/SEC/Community">Community</a><a href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li><a href="/vnews/display.v/SEC/Community%7CCommunity%20Links"><em class="sr-only">Community - </em>Community Links</a></li><li><a href="/vnews/display.v/SEC/Community%7CHousing"><em class="sr-only">Community - </em>Housing</a></li><li><a href="/vnews/display.v/SEC/Community%7CMaps"><em class="sr-only">Community - </em>Maps</a></li></ul></li><li><a href="/vnews/display.v/SEC/Harlan%20Public%20Notices%20%26%20Forms">Harlan Public Notices & Forms</a></li><li class="dropdown socs-no-mm "><a href="/vnews/display.v/SEC/RAGBRAI">RAGBRAI</a><a href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li class="dropdown-submenu "><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026"><em class="sr-only">RAGBRAI - </em>RAGBRAI LIII 2026</a><a class="submenu-toggle" href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Toggle Dropdown"><em class="fas fa-caret-down" aria-hidden="true"></em></a><ul class="dropdown-menu dropdown-menu-with-lines "><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EColoring%20Contest"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Coloring Contest</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EFAQs"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>FAQs</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EFundraising"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Fundraising</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EMaps"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Maps</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EVolunteers"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Volunteers</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EHousing"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Housing</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EVendors"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Vendors</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EEntertainment"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Entertainment</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3EMerch"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Merch</a></li><li><a href="/vnews/display.v/SEC/RAGBRAI%7CRAGBRAI%20LIII%202026%3E%3ESponsorship"><em class="sr-only">RAGBRAI - RAGBRAI LIII 2026 - </em>Sponsorship</a></li></ul></li></ul></li> </ul><input type="hidden" id="megaMenuMin" name="megaMenuMin" value="20"><input type="hidden" id="megaMenuMax" name="megaMenuMax" value="30"><input type="hidden" id="seeMoreNumber" name="seeMoreNumber" value="5"></div></div></nav> 197
198<script> 199;(function() { 'use strict'; 200 const path = window.location.pathname, page = 'list', activeNav = document.querySelector('li.extra-nav.active'); 201 let el = null; 202 203 if (activeNav) activeNav.classList.remove('active'); 204 205 if (path.includes('/vparentteacher/')) { 206 el = document.querySelector('li.extra-nav > a[href="/vparentteacher/"]'); 207 } else if (path.includes('/vcalendar/')) { 208 el = document.querySelector('li.extra-nav > a[href="/vcalendar/"]'); 209 } else if (path.includes('/display.v/ContactUs')) { 210 el = document.querySelector('li.extra-nav > a[href="/vnews/display.v/ContactUs"]'); 211 } else if (path.includes('/display.v/StaffDirectory')) { 212 el = document.querySelector('li.extra-nav > a[href="/vnews/display.v/StaffDirectory"]'); 213 } else if (page === 'archive') { 214 el = document.querySelector('li.extra-nav > a[href="/vnews/display.v/ARC?submit=search"]'); 215 } else if (path.includes('/display.v/RMS')) { 216 el = document.querySelector('li.extra-nav > a[href="/vnews/display.v/RMS"]'); 217 } 218 if (el) el.parentElement.classList.add('active'); 219})(); 220</script>
220 221
222<script> 223(function($){ 'use strict'; 224 var ids = ''; 225 226 if (ids) { 227 ids = ids.replace(/,$/g, ''); 228 $(ids).addClass('hidden'); 229 } 230 231 // Convert pixels to ems - https://raw.githubusercontent.com/arasbm/jQuery-Pixel-Em-Converter/master/pxem.jQuery.js 232 $.fn.toEm = function(settings){ 233 settings = jQuery.extend({ 234 scope: 'body' 235 }, settings); 236 var that = parseInt(this[0],10), 237 scopeTest = jQuery('<div style="display: none; font-size: 1em; margin: 0; padding:0; height: auto; line-height: 1; border:0;"> </div>').appendTo(settings.scope), 238 scopeVal = scopeTest.height(); 239 scopeTest.remove(); 240 return (that / scopeVal).toFixed(8); 241 }; 242 243 function moveMegaMenu($el, winWidth) { 244 var to = $el.offset(), bottom = to.top + $el.height(), 245 $menu = $el.find('> .dropdown-menu'), mo = $menu.offset(), diff = 0; 246 247 // If the menu has already been moved, leave 248 if (mo.top == bottom) return false; 249 250 // Reset the top margin before calculating because breakpoints may have changed menu positions 251 $menu.css('margin-top', ''); 252 mo = $menu.offset(); 253 diff = bottom - mo.top; 254 255 // Use the top margin of the dropdown menu to "move" it to just below the parent menu 256 $menu.css('margin-top', diff); 257 258 } 259 260 function adjustMegaMenuHeight($this) { 261 262 // A "data" attribute will exist if we've already made this adjustment - if so, leave 263 if ($this.attr('data-height')) return false; 264 265 // Should the "extra" content use the entire column or share it with the rest of the nav items? 266 var extraShareColumn = false; 267 268 // Min height for the mega menu in ems 269 var minHeight = 13; 270 271 // Cache some DOM finds that are used more than once... 272 var $megaMenuExtraContent = $this.find('.mega-menu-extra-content'), 273 $megaMenuExtra = $this.find('.mega-menu-extra'), 274 $megaMenu = $this.find('> .dropdown-menu'); 275 276 277 // Will be changed to true if there is "extra" content in the mega menu 278 var extraColumn = false; 279 280 // Height of the extra column 281 var extraHeight = 0; 282 283 // How many <ul> tags are in the mega menu at the 2nd level? 284 // They have a bottom margin (.5em) so they need to be included in the height calculation 285 var ulCount = $this.find('> ul > .dropdown-submenu > ul:visible').length; 286 287 // How many VISIBLE sections are in the mega menu - all levels 288 var liCount = $this.find('li:visible').length; 289 290 // Loop through all of the <li> tags and build a total 291 var totalLiHeight = 0, liHeight = 0; 292 $this.find('li:visible').each(function() { 293 liHeight = $(this).find('> a:not(.hidden-sm)').outerHeight(); 294 295 // IE sometimes returns the wrong height...so reset to a single line at the largest font 296 if (liHeight > 100) liHeight = 27; 297 298 totalLiHeight += liHeight; 299 }); 300 301 // If the "extra" content <div> is NOT empty, there's an extra column 302 if ( ! $megaMenuExtraContent.is(':empty')) { 303 extraColumn = true; 304 305 var megaMenuExtraWidth = $megaMenuExtra.outerWidth(true); 306 307 // Clone the extra content and append it to the body - visible, but off screen so that we can get a RELIABLE height 308 $megaMenuExtra.clone().css({ 309 'position': 'absolute', 310 'left': '-99999em', 311 'width': megaMenuExtraWidth 312 }).appendTo('body'); 313 extraHeight = $('body > .mega-menu-extra').outerHeight(true); 314 315 // Firefox reporting height 20px shorter than Chrome or IE 316 extraHeight += 20; 317 318 // Once we have the height, remove the clone 319 $('body > .mega-menu-extra').remove(); 320 321 // If the "extra" content is sharing the column, add it's height to the <li> total height 322 if (extraShareColumn) totalLiHeight += extraHeight; 323 } 324 325 // Convert the <li> total height from pixels to ems 326 var calcHeight = $(totalLiHeight).toEm(); 327 328 // Add the bottom margins for the <ul> tags to the total 329 calcHeight = parseFloat(calcHeight) + (ulCount / 2); 330 331 if ( ! extraColumn) { 332 // If the "extra" content is empty, divide by the default 4.25 columns 333 calcHeight /= 4.25; 334 } else { 335 // The "extra" content is NOT empty... 336 337 // If it's NOT sharing the column, divide by one less column (5 column display - 4.25 "safe" number) 338 if ( ! extraShareColumn) { 339 calcHeight /= 3.25; 340 } else { 341 calcHeight /= 4.25; 342 } 343 } 344 345 // Convert the extra content height to ems 346 if (extraColumn) extraHeight = parseFloat($(extraHeight).toEm()); 347 348 var megaMenuHeight = 0; 349 if (calcHeight > minHeight) { 350 megaMenuHeight = calcHeight; 351 } else { 352 megaMenuHeight = minHeight; 353 } 354 355 if (extraHeight > (megaMenuHeight - 1)) { 356 $megaMenu.css('height', (extraHeight + 1) + 'em'); 357 $megaMenuExtra.css('height', extraHeight + 'em'); 358 359 // Write the height as a "data" attribute, so we don't do this adjustment more than once 360 $this.attr('data-height', extraHeight); 361 } else { 362 $megaMenu.css('height', megaMenuHeight + 'em'); 363 $this.attr('data-height', megaMenuHeight); 364 if (calcHeight < minHeight || ! extraShareColumn) { 365 $megaMenuExtra.css('height', (megaMenuHeight - 1) + 'em'); 366 } else { 367 if (extraShareColumn) $megaMenuExtraContent.addClass('mega-menu-extra-share'); 368 } 369 } 370 371 } 372 373 function addSeeMoreLinks($ul, seeMoreNumber) { 374 375 // Hide <li> tags beyond the "seeMoreNumber" 376 $ul.find('> li:nth-child(n+ ' + (seeMoreNumber + 1) + ')').addClass('hidden-lg'); 377 378 // Add "See more..." links to those <ul> tags where the <li> count has exceeded the "seeMoreNumber". 379 // Those <ul> tags will have <li> tags with the "hidden-lg" class as a result of the nth-child code above. 380 $ul.each(function() { 381 var $this = $(this); 382 383 if ($this.find('> li.hidden-lg').length) { 384 // Grab the href from the parent link and use that for the "See more..." link 385 var smhref = $this.prev('a').prop('href'); 386 387 // Insert it before the first hidden <li> tag 388 $this.find('> li.hidden-lg:first').before('<li class="hidden-md hidden-sm hidden-xs"><a href="' + smhref + '">See more...</a></li>'); 389 } 390 }); 391 392 } 393 394 function getSeeMoreTotals($ul, liCount) { 395 var total = 0; 396 397 if ( ! liCount) return total; 398 399 if ($ul.length === 1) { 400 total = (liCount > seeMoreNumber) ? seeMoreNumber : liCount; 401 } else { 402 $ul.each(function() { 403 var cnt = $(this).find('> li:visible').length; 404 total += (cnt > seeMoreNumber) ? seeMoreNumber : cnt; 405 }); 406 } 407 408 return total; 409 } 410 411 function fillMegaMenu($this) { 412 413 // Only want to do this if the config entry > 0 414 if (megaMenuMin <= 0) return false;
415 416 // Only want to do this work once per top-level menu, so if it has already been "filled", leave 417 if ($this.hasClass('socs-mm-filled')) return false; 418 $this.addClass('socs-mm-filled'); 419 420 // Get the number of visible <li> and <ul> tags at each level within the mega menu 421 var liLevel1 = $this.find('> .dropdown-menu > li:visible').length, 422 liLevel2 = $this.find('> ul > .dropdown-submenu > ul > li:visible').length, 423 liLevel3 = $this.find('> ul ul ul li:visible').length, 424 $ulLevel2 = $this.find('> ul > .dropdown-submenu > ul:visible'), 425 $ulLevel3 = $this.find('> ul ul ul:visible'); 426 427 // How many visible items are in the mega menu - all levels 428// var liTotal = $this.find('li:visible').length; 429 var liTotal = liLevel1 + liLevel2 + liLevel3; 430 431/* 432console.log('-------------------------------'); 433console.log('liLevel1 = ' + liLevel1); 434console.log('liLevel2 = ' + liLevel2); 435console.log('liLevel3 = ' + liLevel3); 436console.log('liTotal = ' + liTotal); 437console.log('ulLevel2 = ' + $ulLevel2.length); 438console.log('ulLevel3 = ' + $ulLevel3.length); 439*/ 440 441 // Short-circuit if ALL of the items will fit or there aren't any 2nd level items 442 if (liTotal <= megaMenuMax || liLevel2 === 0) return false; 443 444 // 1st level items >= the min - hide 2nd and 3rd level items and leave 445 if (liLevel1 >= megaMenuMin) { 446 $this.find('> ul ul').addClass('socs-mm-hide'); 447 return false; 448 } 449 450 // The "seeMoreNumber" may limit the number of <li> tags that are visible within each <ul> at the 2nd and 3rd levels 451 // Total <li> tags at 2nd and 3rd level AFTER the "seeMoreNumber" limit has been applied on each <ul> 452 var liLevel2SeeMore = getSeeMoreTotals($ulLevel2, liLevel2); 453 var liLevel3SeeMore = getSeeMoreTotals($ulLevel3, liLevel3); 454 455/* 456console.log('liLevel2SeeMore = ' + liLevel2SeeMore); 457console.log('liLevel3SeeMore = ' + liLevel3SeeMore); 458console.log('fillMegaMenu - doing the work'); 459*/ 460 461 var showAllLevel2 = ((liLevel1 + liLevel2) <= megaMenuMax) ? true : false; 462 var showReducedLevel2 = ((liLevel1 + liLevel2SeeMore) <= megaMenuMax) ? true : false; 463 464 // If 2nd level won't fit under the max (all or reduced) - hide 2nd and 3rd level items and leave 465 if ( ! showReducedLevel2) { 466 $this.find('> ul ul').addClass('socs-mm-hide'); 467 return false; 468 } 469 470 // If all 2nd level won't fit but the reduced 2nd level will... 471 if ( ! showAllLevel2 && showReducedLevel2) addSeeMoreLinks($ulLevel2, seeMoreNumber); 472 473 // Are there any 3rd level items? 474 if (liLevel3) { 475 // Which 2nd level number was used? Use it for 3rd level calculations 476 var liLevel2Used = liLevel2SeeMore; 477 if (showAllLevel2) liLevel2Used = liLevel2; 478 479 var showAllLevel3 = ((liLevel1 + liLevel2Used + liLevel3) <= megaMenuMax) ? true : false; 480 var showReducedLevel3 = ((liLevel1 + liLevel2Used + liLevel3SeeMore) <= megaMenuMax) ? true : false; 481 482 // If 3rd level won't fit under the max (all or reduced) - hide 3rd level items and leave 483 if ( ! showReducedLevel3) { 484 $ulLevel3.addClass('socs-mm-hide'); 485 return false; 486 } 487 488 // If all 3rd level won't fit but the reduced 3rd level will... 489 if ( ! showAllLevel3 && showReducedLevel3) addSeeMoreLinks($ulLevel3, seeMoreNumber); 490 } 491 492 } 493 494 function clearMenus() { 495 // Remove the "open/show" classes from all dropdowns and reset all aria attributes 496 $('#navbar .open').removeClass('open'); 497 $('#navbar .show').removeClass('show'); 498 $('#navbar [aria-expanded]').attr('aria-expanded', 'false'); 499 } 500 501 502 // Homemade support for multi-level dropdown menus - https://stackoverflow.com/questions/44467377/bootstrap-4-multilevel-dropdown-inside-navigation 503 $('#navbar').on('click', '.submenu-toggle', function(e) { 504 var $this = $(this), $dropdownMenu = $this.parent().find('> .dropdown-menu'); 505 506 if ($dropdownMenu.hasClass('show')) { 507 $this.closest('.dropdown-submenu').removeClass('show').find('> a[aria-expanded]').attr('aria-expanded', 'false'); 508 $dropdownMenu.removeClass('show'); 509 } else { 510 // Close any open submenus outside of this parent before opening 511 $this.parents('.dropdown-menu').first().find('.show').removeClass('show').children('a[aria-expanded]').attr('aria-expanded', 'false'); 512 513 $this.closest('.dropdown-submenu').addClass('show'); 514 $this.attr('aria-expanded', 'true'); 515 $dropdownMenu.addClass('show'); 516 } 517 518 return false;
519 }); 520 521 $('#navbar').on('hidden.bs.dropdown', function(e) { 522 // Close submenus when the parent dropdown closes 523 $(e.target).find('.show').removeClass('show').children('a[aria-expanded]').attr('aria-expanded', 'false'); 524 }); 525 526 // Keyboard activity ------------------------------------------------------ 527 528 // Close any previously opened dropdown menus as the user tabs to a new 1st-level navbar item 529 $('#navbar').on('focus', '.nav > li > a', function(e) { 530 if ( ! $(this).parent().hasClass('open')) clearMenus(); 531 }); 532 533 // Close any previously opened dropdown menu as the user tabs to a new 2nd-level+ item 534 $('#navbar').on('focus', '.dropdown-menu > li > a', function(e) { 535 if ( ! $(this).parent().hasClass('show')) { 536 $(this).closest('.dropdown-menu').find('.show').removeClass('show').children('a[aria-expanded]').attr('aria-expanded', 'false'); 537 } 538 }); 539 540})(jQuery); 541</script>
541 542</div></div><div class="container-rotator container-rotator-fluid"><div class="container"><div class="img-rotator-wrapper hidden-print pager-align-right"><div class="img-rotator-inner"><div class="img-fader"></div><img id="img-rotator-placeholder" src="/pages/image_rotator_L17/1%20harlan%20collage.png" alt="" class="img-responsive invisible"><div class="img-rotator invisible"><div><img src="/pages/image_rotator_L17/1%20harlan%20collage.png" alt=""></div><div><img src="/pages/image_rotator_L17/2%20country%20club%20area.JPG" alt=""></div><div><img src="/pages/image_rotator_L17/3%20east%20downtown.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/4%20north%20town.JPG" alt=""></div><div><img src="/pages/image_rotator_L17/6%20south%20downtown.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/7%20college%20blvd.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/8%20theater.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/9%20fountain.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/10%20north%20downtown.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/11%20west%20town.JPG" alt=""></div><div><img src="/pages/image_rotator_L17/15%20flag2.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/bikenight2.jpg" alt=""></div><div><img src="/pages/image_rotator_L17/RAGBRAI%20LIII%20ROUTE%20619670301_1380028954164469_6435077329392977929_n.jpg" alt=""></div></div></div><div class="img-rotator-mask"></div><a class="img-rotator-logo" href="/" title="Home"><h1 class="sr-only">City of Harlan Logo</h1></a></div><div class="hidden-print masthead-buttons"><nav class="navbar navbar-default"><div class="container"><div class="collapse navbar-collapse in"><ul class="nav navbar-nav"><li><a href="/vcalendar/"><em class="fa-fw fa-lg far fa-calendar"></em><span>Calendar</span></a></li><li><a href="/vnews/display.v/ContactUs"><em class="fa-fw fa-lg far fa-phone"></em><span>Contact Us</span></a></li><li><a href="/vnews/display.v/ARC?submit=search"><em class="fa-fw fa-lg fas fa-box-archive"></em><span>Archives</span></a></li></ul></div></div> </nav></div>
542<script> 543;(function($) { 'use strict'; 544 $(function() { 545 var maxTop = 0, t = 0; 546 547 // Trying to find menu items in the bottom "row" of the dropdown menu and turn off their bottom border 548 549 // Run the code after the dropdown menu has opened 550 $('.masthead-buttons .dropdown').on('shown.bs.dropdown', function() { 551 552 // Only do this once...and only at "sm" or larger breakpoint 553 if ($(this).data('maxTop') === undefined && window.matchMedia('(min-width: 768px)').matches) { 554 $('.masthead-buttons .dropdown-menu > li').each(function() { 555 t = $(this).offset().top; 556 if (t > maxTop) maxTop = t; 557 $(this).data('offsetTop', t); 558 }); 559 560 // Save this so this code will only run once 561 $(this).data('maxTop', maxTop); 562 563 // Loop through all of the <li>s and remove the bottom border from those at the bottom of the dropdown menu. 564 $('.masthead-buttons .dropdown-menu > li').each(function() { 565 t = $(this).data('offsetTop'); 566 if (t === maxTop) $(this).find('a').addClass('border-bottom-0'); 567 }); 568 } 569 570 }); 571 572 }); 573})(jQuery); 574</script>
574 575
576<script> 577;(function($){ 'use strict'; 578 579 var imgCount = 13, ir_pauseTime = parseInt('8000') || 5000, ir_animSpeed = parseInt('6000') || 1000, 580 ir_indicators = '1', ir_controls = '0', useVibrant = '1'; 581 582 // Background color for the jumbotron overlay: Vibrant, Muted, DarkVibrant, DarkMuted, LightVibrant 583 // https://jariz.github.io/vibrant.js/ 584 var swatch = 'Vibrant'; 585 586 useVibrant = (useVibrant === '1') ? true : false; 587 588 589 590 591 $(function() { 592 593 if (imgCount >= 2) { 594 ir_indicators = (ir_indicators === '0') ? false : true; 595 ir_controls = (ir_controls === '0') ? false : true; 596 } else { 597 ir_indicators = false; 598 ir_controls = false; 599 } 600 601 var overlayExists = false, vibrant = null, swatches = null, rgb = null, rgbaFade = '0.7', pagerBG = null; 602 603 overlayExists = ($('.jumbotron-overlay').length && ! $('.jumbotron-overlay').hasClass('hidden')) ? true : false; 604 605 function getVibrantData($el) { 606 var vHex = null; 607 608 if ($el.data('vibrant') === undefined) { 609 vibrant = new Vibrant($el.get(0)); 610 swatches = vibrant.swatches(); 611 612 // For some reason the Vibrant code may not always work with EVERY image, so need a fallback 613 if (swatches.hasOwnProperty(swatch) && swatches[swatch]) { 614 rgb = swatches[swatch].getRgb(); 615 616 vHex = swatches[swatch].getHex(); 617 618 // Save calculated data to element so we only have to do this work once for each image in the rotator 619 $el.data('vibrant', { 620 success: true, 621 rgb: rgb, 622 rgba: 'rgba(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ',' + rgbaFade + ')', 623 vibrant: vHex, 624 muted: swatches['Muted'] ? swatches['Muted'].getHex() : vHex, 625 darkVibrant: swatches['DarkVibrant'] ? swatches['DarkVibrant'].getHex() : vHex, 626 darkMuted: swatches['DarkMuted'] ? swatches['DarkMuted'].getHex() : vHex, 627 lightVibrant: swatches['LightVibrant'] ? swatches['LightVibrant'].getHex() : vHex, 628 titleTextColor: swatches[swatch].getTitleTextColor(), 629 bodyTextColor: swatches[swatch].getBodyTextColor() 630 }); 631 632 } else { 633 $el.data('vibrant', { 634 success: false 635 }); 636 } 637 } 638 } 639 640 function changeColors($el, nthChild) { 641 642 // Use the data from Vibrant to change colors... 643 644 $('.jumbotron-overlay').css({ 645 'background': $el.data('vibrant').rgba, 646 'color': $el.data('vibrant').bodyTextColor 647 }); 648 649 if (ir_indicators && ! $('.img-rotator-wrapper.pager-align-below').length) { 650 if ($el.data('vibrant').bodyTextColor === '#fff') { 651 pagerBG = $el.data('vibrant').darkMuted; 652 } else { 653 pagerBG = $el.data('vibrant').lightVibrant; 654 } 655 $('.bx-wrapper .bx-pager a').css({ 656 'background': pagerBG, 657 'border-color': $el.data('vibrant').bodyTextColor 658 }); 659 $('.bx-wrapper .bx-pager-item:nth-child(' + nthChild + ') a').css({ 660 'background': $el.data('vibrant').bodyTextColor 661 }); 662 } 663 } 664 665 function resetColors($el, nthChild) { 666 667 // Reset colors by removing inline styles... 668 669 $('.jumbotron-overlay').css({ 670 'background': '', 671 'color': '' 672 }); 673 if (ir_indicators && ! $('.img-rotator-wrapper.pager-align-below').length) { 674 $('.bx-wrapper .bx-pager a').css({ 675 'background': '', 676 'border-color': '' 677 }); 678 $('.bx-wrapper .bx-pager-item:nth-child(' + nthChild + ') a').css({ 679 'background': '' 680 }); 681 } 682 } 683 684 function changeOverlayBackground($el, newIndex) { 685 686 getVibrantData($el); 687 688 if ($el.data('vibrant').success) { 689 changeColors($el, newIndex + 1); 690 } else { 691 resetColors($el, newIndex + 1); 692 } 693 } 694 695 $('.img-rotator').bxSlider({ 696 // Config options 697 speed: ir_animSpeed, 698 pause: ir_pauseTime, 699 pager: ir_indicators, 700 controls: ir_controls, 701 702 // Hard-coded options 703 auto: true, 704 keyboardEnabled: true, 705 mode: 'fade', 706 707 // Don't auto start the slider and provide controls for starting and stopping 708/* 709 autoStart: false, 710 autoControls: true, 711 autoControlsCombine: true, 712 startText: '<em class="fas fa-play"></em><span class="sr-only">Start Player</span>', 713 stopText: '<em class="fas fa-pause"></em><span class="sr-only">Pause Player</span>', 714*/ 715 716 // Replace the default bxSlider images with Font Awesome icons and some accessibility text 717 prevText: '<em class="fal fa-angle-left"></em><span class="sr-only">
717Previous Slide</span>', 718 nextText: '<em class="fal fa-angle-right"></em><span class="sr-only">Next Slide</span>', 719 720 // Can't scroll the page on iOS or Android when "touching" the images in the slider - so turn off touch until they fix it. 721 touchEnabled: false, 722 723 onSliderLoad: function(currentIndex) { 724 // Unhide the bxSlider once it has finished loading. 725 $('.img-rotator').removeClass('invisible'); 726 727 if (useVibrant && overlayExists) changeOverlayBackground($('.img-rotator div[aria-hidden="false"] img'), currentIndex); 728 729 // Remove the placeholder img once we no longer need it. 730 $('#img-rotator-placeholder').remove(); 731 }, 732 onSlideBefore: function($slideElement, oldIndex, newIndex) { 733 // Remove focus from indicators so that only the active indicator is "selected" 734 $('.bx-pager-link').blur(); 735 736 if (useVibrant && overlayExists) changeOverlayBackground($slideElement.find('img'), newIndex); 737 } 738 }); 739 740 $('.img-rotator').imagesLoaded(function() { 741 $('.img-fader').fadeOut(); 742 }); 743 744 }); 745})(jQuery); 746</script>
746 747 748</div></div><div class="container-section-header"><div class="container"><div class="section-header"><h2 class="section-header-title">Notifications</h2><ol class="breadcrumb hidden-print"><li><a href="/" title="Home"><em class="fas fa-home"></em><span class="sr-only">Home Link</span></a></li><li class="active">Notifications</li></ol></div> 749</div></div><div class="container-body"><div class="container"><a name="mainContent" accesskey="2"></a><div class="form-group"><label for="groups">Select a Group:</label><select id="groups" name="groups" class="form-control"><option value="" selected>all</option><option value="1">Test</option></select></div><p class="notifier-count"><strong>Notifications: <b class="label label-primary">2</b></strong></p><div class="table-responsive"><table class="table table-striped table-bordered notifier-table"><thead><th>Notification Sent</th><th>Notification</th></thead><tbody><tr><td class="notifier-text-date"><a href="/vnotifier/?page=listmessage&message_id=165"><div>Wednesday, September 30, 2026</div><div>at 2:21pm</div></a></td><td class="notifier-text-msg">Harlan Fire Department Association Breakfast on Sunday, October 4, 2026! Dine-in from 7:00-11:00 AM at 906 Cyclone Aveâcall 755-5354 Sunday for delivery service. Enjoy biscuits & gravy, scrambled eggs, pancakes, bacon. Free will donation, proceeds towards a new gator. </td></tr><tr><td class="notifier-text-date"><a href="/vnotifier/?page=listmessage&message_id=164"><div>Wednesday, September 30, 2026</div><div>at 11:51am</div></a></td><td class="notifier-text-msg">City Hall will be closed from 12:00 PM (noon) to 1:00 PM today, Wednesday, September 30, 2026. Thank you for your understanding. </td></tr></tbody></table></div>
749<script>;(function($) { 'use strict';var groupID = '';/**/if (groupID === '-') {window.location.href = '/vnotifier/?page=listmessages&group_id=';} else {$('#groups').on('change', function(e) {window.location.href = '/vnotifier/?page=listmessages&group_id=' + $(this).val();});}})(jQuery);</script>
749 750</div></div><div class="container-calendar-highlights"><div class="container"></div></div><div class="container-right-banners"><div class="container"></div></div> 751<div class="container-poll hidden-print"><div class="container"></div></div><div class="container-footer container-footer-row-2 footer-style-1"><div class="container"><footer class="row"><div class="col-sm-8 col-md-9"><div class="school-address"><span>City of Harlan</span><span>Physical Address: 711 Durant Street</span><span>Mailing Address: PO Box 650</span><span>Harlan, IA 51537</span></div> 752</div><div class="col-sm-4 col-md-3"><div class="social-media"><a href="https://www.facebook.com/cityofharlaniowa/" title="Like us on Facebook" target="_blank"><em class="fab fa-2x fa-facebook"></em><span class="sr-only">Facebook</span></a><a href="https://twitter.com/CityofHarlan" title="Follow us on Twitter" target="_blank"><em class="fab fa-2x fa-x-twitter"></em><span class="sr-only">Twitter</span></a><div style="margin-top: 1em;"><div>PH: 712-755-5137</div><div>FAX: 712-755-5138</div><div>
752Email: [email protected]</div></div></div> 753</div><div class="col-sm-8 col-md-9"><div class="copyright"><a href="https://www.filamentservices.org/websites/" target="_blank" title="SOCS-Simplified Online Communication System (socs02)"><img class="hidden-print" src="//socshelp.socs.net/sharedimages/socs_banner_white.png" alt="SOCS-Simplified Online Communication System (socs02)"><img class="visible-print-inline" src="//socshelp.socs.net/sharedimages/socs_banner_black.png" alt="SOCS-Simplified Online Communication System (socs02)"><span class="sr-only">SOCS Logo Link</span></a><a href="/">© 2026 City of Harlan</a><a href="https://www.filamentservices.org/accessibilitystatement/" target="_blank" accesskey="0">Accessibility</a><a href="https://www.filamentservices.org/privacypolicy/" target="_blank">Privacy Pledge</a></div><div class="copyright"><a href="https://www.filamentservices.org/usda/" target="_blank">This institution is an equal opportunity provider.</a></div> 754</div><div class="col-sm-4 col-md-3"><div id="google_translate_element" class="hidden-print"></div>
754<script>function googleTranslateElementInit() {const defaultLanguages = "sq,ar,hy,bs,yue,zh-HK,zh-CN,zh-TW,hr,cs,da,nl,tl,fi,fr,fr-CA,de,el,haw,iw,hi,hu,id,ga,it,ja,ko,no,pl,pt,pt-PT,pa,pa-Arab,ro,sr,sk,sl,so,es,su,sv,th,tr,uk,vi,yi";new google.translate.TranslateElement({pageLanguage: 'en',includedLanguages: defaultLanguages,layout: google.translate.TranslateElement.InlineLayout.SIMPLE/*layout: google.translate.TranslateElement.InlineLayout.VERTICAL*/}, 'google_translate_element');googleAddMissingLabels();}function googleAddMissingLabels() {/**/if ($('#goog-gt-votingForm input').length && $('#goog-gt-votingForm label').length === 0) {const $googleForm = $('#goog-gt-votingForm');let html = '';$googleForm.find('input').each(function() {const id = $(this).prop('id');/**/if ($googleForm.find('label[for="' + id + '"]').length === 0) html += `<label for="${ id }">${ id }</label>`;/**/if ( ! $(this).attr('title')) $(this).attr('title', 'a non-empty title attribute for input ' + id);});if (html) $googleForm.append(html);}}</script>
754<script src="/javascripts/sri_google_translate.js?cb=googleTranslateElementInit"></script>
754 755</div></footer></div></div> 756 757
758<script src="/javascripts/min/L17/L17-footer.min.js"></script>
758 759
760<script> 761;(function($){ 'use strict'; 762 const bsVersion = '3', counterText = '', showToggleIndicators = '1'; 763 764 let accordionID = 'socsAccordionBuilder-', counterHtml = '', counterValue = 0, toggleHtml = '', tmp = '', collapseID = 0; 765 766 if (counterText) { 767 switch (bsVersion) { 768 case '2': 769 case '3': 770 counterHtml = `<span><span class="counter-text">No</span> ${counterText}</span>`; 771 break; 772 case '4': 773 counterHtml = `<small class="ml-3 font-italic"><span class="counter-text">No</span> ${counterText}</small>`; 774 break; 775 } 776 } 777 778 if (showToggleIndicators) { 779 if (bsVersion === '4') { 780 toggleHtml = '<em class="sab-toggle-indicator fa-solid fa-plus ml-auto" aria-hidden="true"></em>'; 781 } else { 782 toggleHtml = '<em class="sab-toggle-indicator fa-solid fa-plus" aria-hidden="true"></em>'; 783 } 784 } 785 786 function buildHeading(title, idx, accordionID) { 787 788 switch (bsVersion) { 789 case '2': 790 return ` 791<div class="accordion-group"> 792 <div class="accordion-heading"> 793 <a class="accordion-toggle" data-toggle="collapse" data-parent="#${accordionID}" href="#collapse${idx}">${title}${counterHtml}${toggleHtml}</a> 794 </div> 795 <div id="collapse${idx}" class="accordion-body collapse"> 796 <div class="accordion-inner"> 797 <ul class="list-group list-group-flush"> 798`; 799 break; 800 case '3': 801 return ` 802<div class="panel panel-default"> 803 <div class="panel-heading" role="tab" id="heading${idx}"> 804 <h4 class="panel-title"> 805 <a role="button" data-toggle="collapse" data-parent="#${accordionID}" href="#collapse${idx}" 806 aria-expandedtruue" aria-controls="collapse${idx}">${title}${counterHtml}${toggleHtml}</a> 807 </h4> 808 </div> 809 <div id="collapse${idx}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading${idx}"> 810 <div class="panel-body" id="panel-body-id"> 811 <ul class="list-group list-group-flush"> 812`; 813 break; 814 case '4': 815 return ` 816<div class="card"> 817 <div class="card-header" id="heading${idx}"> 818 <h3 class="mb-0"> 819 <a href="#" class="d-flex align-items-center text-decoration-none" data-toggle="collapse" data-target="#collapse${idx}" 820 aria-expanded="false" aria-controls="collapse${idx}">${title}${counterHtml}${toggleHtml}</a> 821 </h3> 822 </div> 823 <div id="collapse${idx}" class="collapse" aria-labelledby="heading${idx}" data-parent="#${accordionID}"> 824 <div class="card-body"> 825 <ul class="list-group list-group-flush"> 826`; 827 break; 828 } 829 830 } 831 832 $('table.socs-accordion-builder').each(function(i, el) { 833 const $table = $(el); 834 let html = ''; 835 836 accordionID += i; 837 switch (bsVersion) { 838 case '2': 839 html = '<div class="accordion socs-accordion-builder" id="' + accordionID + '">'; 840 break; 841 case '3': 842 html = '<div class="panel-group socs-accordion-builder" id="' + accordionID + '" role="tablist" aria-multiselectable="true">'; 843 break; 844 case '4': 845 html = '<div class="socs-accordion-builder accordion my-3" id="' + accordionID + '">'; 846 break; 847 } 848 849 $table.find('tbody > tr').each(function(j, el) { 850 const $tr = $(el); 851 let rowHtml = ''; 852 853 if ($tr.find('td > h3').length) { 854 if (j > 0) html += '</ul></div></div></div>'; 855 856 html += buildHeading($tr.find('td > h3').text(), collapseID++, accordionID); 857 858 } else { 859 html += '<li class="list-group-item">' + $tr.find('td').html() + '</li>'; 860 } 861 }); 862 863 html += '</div></div></div>'; 864 865 $table.after(html); 866 867 if (showToggleIndicators) { 868 switch (bsVersion) { 869 case '2': 870 $('#' + accordionID).on('show', function(e) { 871 $(e.target).closest('.accordion-group').find('.sab-toggle-indicator').addClass('fa-minus').removeClass('fa-plus'); 872 }).on('hide', function(e) { 873 $(e.target).closest('.accordion-group').find('.sab-toggle-indicator').addClass('fa-plus').removeClass('fa-minus'); 874 }); 875 break; 876 case '3': 877 case '4': 878 tmp = (bsVersion === '3') ? '.panel' : '.card'; 879 $('#' + accordionID).on('show.bs.collapse', function(e) { 880 $(e.target).closest(tmp).find('.sab-toggle-indicator').addClass('fa-minus').removeClass('fa-plus'); 881 }).on('hide.bs.collapse', function(e) { 882 $(e.target).closest(tmp).find('.sab-toggle-indicator').addClass('fa-plus').removeClass('fa-minus'); 883 }); 884 break; 885 } 886 } 887 888 if (counterText) { 889 $('#' + accordionID + ' > div').each(function() { 890 const $card = $(this); 891 counterValue = $card.find('.list-group-item').length; 892 $card.find('.counter-text').text(counterValue); 893 }); 894 } 895 $('#' + accordionID + ' > div:first-child [data-toggle]').click(); 896 }); 897 898})(jQuery); 899</script>
899 900 901
902<script> 903;(function($) { 'use strict'; 904 905 let scrollToContent = false; 906 /**/ 907 if ( ! window.location.hash) { 908 scrollToContent = true; 909 } 910 if (scrollToContent) { 911 /**/ 912 $('.container-rotator').imagesLoaded(function() { 913 window.scrollTo(0, $('.container-body').offset().top); 914 }); 915 } 916 917 if ($('.masthead-style-1 .vbuttons').length) { 918 /**/ 919 $('.masthead-style-1 .vbuttons').clone().prependTo('.navbar-header .ns2-menu-wrapper'); 920 } 921 922 923})(jQuery); 924</script>
924 925 926 927 </body> 928</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.