Football Schedules

2025 LHSAA
FOOTBALL SCHEDULES

2026 LHSAA
FOOTBALL SCHEDULES

Preseason schedules — dates and opponents remain subject to change.

5A
1-5A
2-5A
3-5A
4-5A
5-5A
6-5A
7-5A
8-5A
9-5A
4A
1-4A
2-4A
3-4A
4-4A
5-4A
6-4A
7-4A
8-4A
9-4A
10-4A
3A
1-3A
2-3A
3-3A
4-3A
5-3A
6-3A
7-3A
8-3A
9-3A
10-3A
11-3A
2A
1-2A
2-2A
3-2A
4-2A
5-2A
6-2A
7-2A
8-2A
9-2A
10-2A
11-2A
1A
1-1A
2-1A
3-1A
4-1A
5-1A
6-1A
7-1A
8-1A
9-1A
10-1A
' +'' +'' +''; (data.games||[]).forEach(game=>{ const opponent=game.opponent||''; const hasRecord=game.opp_wins!==null&&game.opp_wins!==undefined &&game.opp_losses!==null&&game.opp_losses!==undefined; const opponentLabel=opponent+(hasRecord?' ('+game.opp_wins+'-'+game.opp_losses+')':''); let opponentHtml=esc(opponentLabel); if(game.opponent_internal&&opponent){ const destination=new URL(window.location.href); destination.searchParams.set('season',root.dataset.season); destination.searchParams.set('school',opponent); destination.hash='school-'+normalize(opponent).replaceAll(' ','-'); opponentHtml=''+esc(opponentLabel)+''; } const points=game.total_pts===null||game.total_pts===undefined ? '' : Number(game.total_pts).toFixed(2); const rowClass=game.is_district?'is-district':'is-nondistrict'; const resultClass='result-'+String(game.result||'').toLowerCase(); const division=formatDivision(game.opp_division||game.district_class||''); const weekLabel=game.phase&&game.phase!=='Regular Season' ? game.phase : 'Wk'+esc(game.week||'')+(game.is_district?' D':''); html+=''; }); body.innerHTML=html+'
WeekDateH/AOpponentDistrictDivisionW/LScorePower Pts
'+esc(weekLabel)+'' +esc(formatDate(game.game_date))+''+esc(game.home_away||'') +''+opponentHtml+''+(game.is_district?'D':'') +''+esc(division)+'' +esc(game.result||'')+''+esc(game.score||'') +''+esc(points)+'
'; body.dataset.loaded='1'; }catch(error){ body.innerHTML='

Schedule temporarily unavailable.

'; }finally{ delete body.dataset.loading; } } async function openSchool(article){ root.querySelectorAll('.lvay-school-body').forEach(body=>body.hidden=true); root.querySelectorAll('.lvay-school-toggle').forEach(button=>button.setAttribute('aria-expanded','false')); let parent=article.parentElement; while(parent&&parent!==root){if(parent.tagName==='DETAILS')parent.open=true;parent=parent.parentElement} const body=article.querySelector('.lvay-school-body'); const button=article.querySelector('.lvay-school-toggle'); await renderSchoolBody(body); body.hidden=false;button.setAttribute('aria-expanded','true'); window.setTimeout(()=>article.scrollIntoView({behavior:'smooth',block:'center'}),50); } root.querySelectorAll('.lvay-school-toggle').forEach(button=>{ button.addEventListener('click',async()=>{ const body=button.nextElementSibling; if(body.hidden)await renderSchoolBody(body); body.hidden=!body.hidden; button.setAttribute('aria-expanded',String(!body.hidden)); }); }); root.addEventListener('click',async event=>{ const link=event.target.closest('.lvay-school td a'); if(!link)return; const destination=new URL(link.href,window.location.href); const opponent=destination.searchParams.get('school'); if(!opponent)return; const target=Array.from(root.querySelectorAll('.lvay-school')).find( article=>normalize(article.dataset.school)===normalize(opponent) ); if(!target)return; event.preventDefault(); await openSchool(target); history.replaceState(null,'',destination.pathname+destination.search+destination.hash); }); search.addEventListener('input',()=>{ const query=normalize(search.value); let matches=0; root.querySelectorAll('.lvay-school').forEach(article=>{ const match=!query||normalize(article.dataset.school).includes(query); article.hidden=!match; if(match&&query){matches++;let p=article.parentElement;while(p&&p!==root){if(p.tagName==='DETAILS')p.open=true;p=p.parentElement}} }); status.textContent=query?matches+' school'+(matches===1?'':'s')+' found':''; }); if(schoolParam){ const target=Array.from(root.querySelectorAll('.lvay-school')).find( article=>normalize(article.dataset.school)===normalize(schoolParam) ); if(target)openSchool(target); } })();