(()=>{var o="__cadenceCustomScheduleRuntime__",e=window[o];if(e?.initialized)"function"==typeof e.refresh&&e.refresh({resetDate:!0,clearWeekCache:!0});else{let e=window[o]={initialized:!0,eventsBound:!1,hostBridgeBound:!1,refresh:null},s="https://cadence.nprstations.org/api/cadence/widget/",n="0dec512e-f616-4d6e-a217-e81ae3bef37b",r=250,t="https://www.knkx.org/cadence-schedule/v0",d=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],c={mode:"day",selectedDate:h(new Date),metadata:{},weekCache:new Map,weekTooltipMap:new Map,openTooltipKey:null,refreshPromise:null,hasRenderedRemoteDayData:!1},i=720,l=44,u=1200,p=30,m=44;function g(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function h(e){e=new Date(e);return e.setHours(0,0,0,0),e}function y(e,t){e=new Date(e);return e.setDate(e.getDate()+t),e}function v(e){return y(h(e),-h(e).getDay())}function w(e){e=h(e);return e.getFullYear()+`-${String(e.getMonth()+1).padStart(2,"0")}-`+String(e.getDate()).padStart(2,"0")}function f(e){return a[e.getMonth()]+" "+e.getDate()}function k(e){var t,a,e=String(e).match(/T(\d{2}):(\d{2})/);return e?(t=12<=(a=parseInt(e[1],10))?"PM":"AM",a=a%12||12,"00"===(e=e[2])?a+" "+t:a+`:${e} `+t):""}function $(e){var t=document.getElementById("content");t&&(t.dataset.prerendered=e?"true":"false")}function b(e){e=String(e).match(/T(\d{2}):(\d{2})/);return e?60*parseInt(e[1],10)+parseInt(e[2],10):null}function M(e="Loading...",t={}){var{replaceContent:t=!0}=t;t&&(D(!1),t=Array.from({length:6},()=>`\n    <div class="skeleton-program">\n      <div class="skeleton-thumb"></div>\n      <div class="skeleton-lines">\n        <div class="skeleton-line name"></div>\n        <div class="skeleton-line time"></div>\n      </div>\n    </div>\n  `).join(""),document.getElementById("content").innerHTML=`\n    <div class="state loading-state">\n      <div class="loading-status">\n        <div class="spinner" aria-hidden="true"></div>\n        <div>${g(e)}</div>\n      </div>\n      <div class="skeleton-list" aria-hidden="true">${t}</div>\n    </div>\n  `)}function D(e){var t=document.getElementById("scheduleFallback");t&&(t.classList.toggle("is-visible",e),t.setAttribute("aria-hidden",e?"false":"true"))}function A(e={}){var{preserveContent:e=!1}=e;D(!0),e||($(!1),document.getElementById("content").innerHTML='<div class="state">Could not load the live schedule. The fallback schedule is shown below. Please try again later or contact us at <a href="mailto:info@knkx.org">info@knkx.org</a>.</div>')}function T(e){var t,a=e?.episode||{},s=a.programId,n=c.metadata.programs?.[s]||{},e=Array.isArray(e?.hosts)?e.hosts:e?.hosts?[e.hosts]:[],e=0<e.length?e:Array.isArray(n.hosts)?n.hosts:[],r=b(a.start?.local),i=((e,t)=>{if(e=b(e),t=b(t),null===e||null===t)return 60;let a=t-e;return a<=0&&(a+=1440),a})(a.start?.local,a.end?.local),l=null===r?1440:Math.max(1,1440-r),l=null===r?i:Math.max(1,Math.min(i,l));return{id:s,name:a.programName||"Unknown Program",time:(s=a.start?.local,t=a.end?.local,k(s)+" \u2013 "+k(t)),startMinutes:r,durationMinutes:i,cappedDurationMinutes:l,imageUrl:n.imageUrl||"",description:n.description||"",hosts:e,genre:Array.isArray(n.genre)?n.genre:[],links:Array.isArray(n.links)?n.links:[],programUrl:(e=>{if(!Array.isArray(e)||0===e.length)return"";let a=e.filter(e=>e&&"string"==typeof e.url&&e.url.trim());return 0===a.length?"":((e=t=>a.find(e=>t(String(e.label||"").toLowerCase())))(e=>e.includes("program page"))||e(e=>e.includes("website"))||a[0]).url})(Array.isArray(n.links)?n.links:[]),isLive:((e,t)=>{try{var a=new Date,s=new Date(e),n=new Date(t);return s<=a&&a<n}catch(e){return!1}})(a.start?.utc,a.end?.utc)}}function B(e){I(),D(!1),e&&0!==e.length?(e=e.map(e=>{var e=T(e),t=`<h2 class="program-name">${e.programUrl?`<a href="${g(e.programUrl)}" class="program-name-link" target="_blank" rel="noopener noreferrer">${g(e.name)}</a>`:g(e.name)}</h2>`,a=e.isLive?'<span class="live-badge">Live</span>':"",a=`<div class="program-time-row"><h3 class="program-time">${g(e.time)}</h3>${a}</div>`,s=e.imageUrl?`<img src="${g(e.imageUrl)}" alt="Cover art for ${g(e.name)}" class="program-image" width="80" height="80" loading="lazy" decoding="async" onerror="this.style.display='none'" draggable="false">`:'<div class="program-image"></div>',n=e.hosts.length||e.description||e.genre.length||e.links.length,r=e.hosts.length?`\n      <section class="program-hosts">\n        <h3 class="program-hosts-label">Hosts</h3>\n        <ul class="program-hosts-list">${e.hosts.map(e=>`<li class="program-host">${g(e)}</li>`).join("")}</ul>\n      </section>\n    `:"",i=e.genre.length?`\n      <section class="program-genre">\n        <h3 class="program-genre-label">Genre</h3>\n        <ul class="program-genre-list">${e.genre.map(e=>`<li class="program-genre">${g(e)}</li>`).join("")}</ul>\n      </section>\n    `:"",n=n?`\n      <div class="program-details">\n        ${e.description?`<p class="program-description">${g(e.description)}</p>`:""}\n        ${r}\n        ${i}\n        ${e.links.length?`<ul class="program-links">${e.links.map(e=>`<li><a href="${g(e.url)}" target="_blank" rel="noopener noreferrer" class="program-link">${g(e.label)}<span class="program-icon-link material-symbols-outlined">arrow_outward</span></a></li>`).join("")}</ul>`:""}\n      </div>\n    `:"";return`<div class="program${e.isLive?" live":""}" data-program-id="${g(e.id)}"><div class="program-header">${s}<div class="program-info">${a}${t}</div><span class="program-toggle material-symbols-outlined">expand_circle_right</span></div>${n}</div>`}).join(""),$(!1),c.hasRenderedRemoteDayData=!0,document.getElementById("content").innerHTML=e):($(!1),document.getElementById("content").innerHTML='<div class="state">No programs scheduled for this day.</div>')}function E(e){I(),D(!1),$(!1),c.weekTooltipMap.clear();var t=e.days.filter(e=>e.failed).length,t=0<t?`<div class="weekly-warning">Some days failed to load (${t}/7). Showing all available schedule data.</div>`:"",e=e.days.map(e=>({day:e,models:e.items.map(e=>T(e)).sort((e,t)=>null===e.startMinutes&&null===t.startMinutes?0:null===e.startMinutes?1:null===t.startMinutes?-1:e.startMinutes-t.startMinutes)})),a=e.flatMap(e=>e.models.map(e=>e.cappedDurationMinutes)).filter(e=>Number.isFinite(e)&&0<e),a=a.length?Math.min(...a):60,a=Math.ceil(24*l*60/a);let o=Math.min(u,Math.max(i,a)),r=w(new Date);a=e.map(e=>{let{day:l,models:t}=e;var e=d[l.date.getDay()],a=f(l.date),s=l.dateKey===r,n=t.length?t.map((e,t)=>{var t=l.dateKey+"-"+t,a=(null===e.startMinutes?0:e.startMinutes)/1440*o,s=e.cappedDurationMinutes/1440*o,n=e.cappedDurationMinutes<p;let r=s,i=a;n&&(r=Math.max(m,s),i=a-r),(i=i<0?0:i)+r>o&&(r=Math.max(1,o-i));s=e.isLive?" live":"",a=n?" short-overlay":"";return c.weekTooltipMap.set(t,e),`<button class="weekly-item${s}${a}" type="button" data-tooltip-key="${g(t)}" style="--slot-top:${i}px;--slot-height:${r}px" aria-label="Show details for ${g(e.name)}"><span class="weekly-item-title">${g(e.name)}</span><span class="weekly-item-time">${g(e.time)}</span></button>`}).join(""):'<p class="weekly-empty-day">No programs scheduled.</p>';return`\n      <section class="week-day-column${s?" today":""}" aria-label="${g(e)} ${g(a)}">\n        <header class="week-day-header">\n          <h2 class="week-day-label">${g(e)}</h2>\n          <p class="week-day-date">${g(a)}</p>\n        </header>\n        <div class="week-day-list" style="--day-track-height:${o}px">${n}</div>\n      </section>\n    `}).join("");document.getElementById("content").innerHTML=t+`<div class="week-scroll"><div class="week-calendar"><aside class="week-axis" aria-hidden="true"><div class="week-axis-header"></div>${e=o,`<div class="week-axis-scale" style="--day-track-height:${e}px">${Array.from({length:23},(e,t)=>{var t=t+1;return`<span class="week-axis-tick" style="top:${t/24*100}%">${g((t=t,(t%12||12)+" "+(12<=t?"PM":"AM")))}</span>`}).join("")}</div>`}</aside><div class="week-grid">${a}</div></div></div>`}function L(a,e){var t,s,n,r=c.weekTooltipMap.get(e),i=document.getElementById("weeklyTooltip");if(r&&i){i.innerHTML=(l=(r=r).imageUrl?`<img src="${g(r.imageUrl)}" alt="Cover art for ${g(r.name)}" class="weekly-tooltip-image" width="72" height="72" loading="lazy" decoding="async" onerror="this.style.display='none'">`:'<div class="weekly-tooltip-image" aria-hidden="true"></div>',o=r.description?`<p class="weekly-tooltip-description">${g(r.description)}</p>`:'<p class="weekly-tooltip-empty">No description available.</p>',t=r.hosts.length?`<div><p class="weekly-tooltip-hosts-label">Hosts</p><ul class="weekly-tooltip-hosts-list">${r.hosts.map(e=>`<li>${g(e)}</li>`).join("")}</ul></div>`:"",s=r.genre.length?`<div><p class="weekly-tooltip-genre-label">Genre</p><ul class="weekly-tooltip-genre-list">${r.genre.map(e=>`<li>${g(e)}</li>`).join("")}</ul></div>`:"",n=r.links.length?`<div><p class="weekly-tooltip-links-label">Links</p><ul class="weekly-tooltip-links">${r.links.map(e=>`<li><a href="${g(e.url)}" target="_blank" rel="noopener noreferrer" class="weekly-tooltip-link">${g(e.label)}<span class="program-icon-link material-symbols-outlined">arrow_outward</span></a></li>`).join("")}</ul></div>`:"",`\n    <button type="button" class="weekly-tooltip-close" aria-label="Close details">\xd7</button>\n    <div class="weekly-tooltip-top">\n      ${l}\n      <div class="weekly-tooltip-heading">\n        <h3 class="weekly-tooltip-title">${g(r.name)}</h3>\n        <p class="weekly-tooltip-time">Airs: ${g(r.time)}</p>\n      </div>\n    </div>\n    ${o}\n    ${t}\n    ${s}\n    ${n}\n  `),i.hidden=!1,i.setAttribute("aria-hidden","false"),c.openTooltipKey=e;{var l=i,r=(r=a).getBoundingClientRect(),o=l.getBoundingClientRect();let e=r.left,t=r.bottom+8;(e=e+o.width>window.innerWidth-12?window.innerWidth-o.width-12:e)<12&&(e=12),(t=t+o.height>window.innerHeight-12?r.top-o.height-8:t)<12&&(t=12),l.style.left=e+"px",l.style.top=t+"px"}}}function I(){var e=document.getElementById("weeklyTooltip");e&&(e.hidden=!0,e.setAttribute("aria-hidden","true"),e.innerHTML="",c.openTooltipKey=null)}async function C(){try{var e=await fetch(t);if(e.ok)return void(c.metadata=await e.json());console.error(`Metadata request failed: HTTP ${e.status} `+e.statusText)}catch(e){console.error("Metadata request failed; rendering without program enrichment:",e)}c.metadata={}}async function S(e){var t,a={channelId:n,startDate:e,endDate:e,from:0,size:r,includeProgramDetails:!0,includeSongs:!1},a=await fetch(s,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),cache:"no-store"});if(a.ok)return t=await a.json(),Array.isArray(t)?t:Array.isArray(t?.episodes)?t.episodes:Array.isArray(t?.items)?t.items:Array.isArray(t?.data)?t.data:Object.values(t).find(e=>Array.isArray(e))??[];throw new Error(`HTTP ${a.status} for `+e)}async function x(){{let i=document.getElementById("tabs");if(i){i.innerHTML="";let n=v(c.selectedDate),r=h(c.selectedDate).getTime();d.forEach((e,t)=>{let a=y(n,t);var t=h(a).getTime()===r,s=document.createElement("button");s.className="tab"+(t?" active":""),s.innerHTML=`<span>${e}</span><span class="tab-date">${g(f(a))}</span>`,s.setAttribute("role","tab"),s.setAttribute("aria-selected",t?"true":"false"),s.addEventListener("click",async()=>{c.selectedDate=h(a),await H()}),i.appendChild(s)});var e=i.querySelector(".tab.active");e&&e.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})}}var t=!c.hasRenderedRemoteDayData&&!!(e=document.getElementById("content"))&&(t=Boolean(e.querySelector('[data-prerender-source="build"]')),"true"===e.dataset.prerendered)&&t;M("Loading day schedule...",{replaceContent:!t});try{B(await S(w(c.selectedDate)))}catch(e){console.error(`Daily schedule fetch failed for ${w(c.selectedDate)}:`,e),A({preserveContent:t})}}async function j(){M("Loading week schedule...");try{E(await(async e=>{let a=v(e);if(e=w(a),c.weekCache.has(e))return c.weekCache.get(e);var t=Array.from({length:7},(e,t)=>y(a,t));let s=await Promise.allSettled(t.map(e=>S(w(e))));return t={weekKey:e,days:t.map((e,t)=>{var t=s[t],a=w(e);return"rejected"===t.status&&console.error(`Schedule request failed for ${a}:`,t.reason),{date:e,dateKey:a,items:"fulfilled"===t.status?t.value:[],failed:"fulfilled"!==t.status}})},c.weekCache.set(e,t),t})(c.selectedDate))}catch(e){console.error(`Week schedule fetch failed for ${w(v(c.selectedDate))}:`,e),A()}}async function H(){var e,t,a,s;e="day"===c.mode,t=document.getElementById("modeDay"),a=document.getElementById("modeWeek"),s=document.querySelector(".tabs-wrapper"),t&&a&&s&&(t.classList.toggle("active",e),a.classList.toggle("active",!e),t.setAttribute("aria-selected",e?"true":"false"),a.setAttribute("aria-selected",e?"false":"true"),s.hidden=!e),I(),"day"===c.mode?await x():await j()}async function P(e){"day"!==e&&"week"!==e||c.mode!==e&&(c.mode=e,await H())}async function W(e={}){if(!Boolean(document.getElementById("modeDay")&&document.getElementById("modeWeek")&&document.getElementById("tabs")&&document.getElementById("content")&&document.getElementById("scheduleFallback")))return!1;let{resetDate:t=!0,reloadMetadata:a=!1,clearWeekCache:s=!0}=e;let n=(c.refreshPromise||Promise.resolve()).catch(()=>{}).then(async()=>(s&&c.weekCache.clear(),t&&(c.selectedDate=h(new Date)),a&&await C(),await H(),!0));return c.refreshPromise=n.finally(()=>{c.refreshPromise===n&&(c.refreshPromise=null)}),n}function _(){e.eventsBound||(e.eventsBound=!0,document.addEventListener("click",e=>{if(e.target.closest("#prevWeek"))(async()=>{"day"===c.mode&&(c.selectedDate=y(c.selectedDate,-1),await H())})();else if(e.target.closest("#nextWeek"))(async()=>{"day"===c.mode&&(c.selectedDate=y(c.selectedDate,1),await H())})();else if(e.target.closest("#modeDay"))P("day");else{var t,a;if(!e.target.closest("#modeWeek"))return(t=e.target.closest(".weekly-item"))?(a=t.getAttribute("data-tooltip-key"))?void(c.openTooltipKey===a?I():L(t,a)):void 0:(t=e.target.closest(".program-header"))?e.target.closest(".program-name-link")?void 0:void((a=t.closest(".program"))&&a.classList.toggle("expanded")):void((e.target.closest(".weekly-tooltip-close")||c.openTooltipKey&&!e.target.closest("#weeklyTooltip")&&!e.target.closest(".weekly-item"))&&I());P("week")}}),document.addEventListener("keydown",e=>{"Escape"===e.key&&I()}),window.addEventListener("resize",()=>{c.openTooltipKey&&I()}),window.addEventListener("pageshow",async e=>{var t=document.getElementById("content"),a=document.getElementById("scheduleFallback");(e.persisted||!t||!t.children.length||a&&a.classList.contains("is-visible"))&&await W()}))}(async()=>{_(),window.CadenceWidgets=window.CadenceWidgets||{},window.CadenceWidgets.customSchedule={refresh:e=>W(e)},e.hostBridgeBound||(window.addEventListener("cadence:schedule-refresh",()=>{W()}),e.hostBridgeBound=!0),e.refresh=W,await C(),await H()})()}})();