`);const n={};e.forEach(e=>{const t=new Date(e.date),s=t.getFullYear(),i=t.getMonth(),r=`${s}-${i.toString().padStart(2,\"0\")}`,l=\"en\"===a.Kl?\"en-US\":\"de-AT\",d=t.toLocaleString(l,{month:\"long\"}),c=(0,o.sn)(t);n[s]||(n[s]={year:s,months:{}}),n[s].months[r]||(n[s].months[r]={name:d,year:s,monthIndex:i,count:0,total:0,weeks:{}}),n[s].months[r].weeks[c]||(n[s].months[r].weeks[c]={label:\"en\"===a.Kl?`CW ${c}`:`KW ${c}`,items:[],count:0,total:0});(e.items||[]).forEach(t=>{const a=parseFloat(t.price||e.total||0);n[s].months[r].weeks[c].items.push({date:e.date,name:t.name||\"Men\u00fc\",price:a,state:e.order_state}),9!==e.order_state&&(n[s].months[r].weeks[c].count++,n[s].months[r].weeks[c].total+=a,n[s].months[r].count++,n[s].months[r].total+=a)})}),t.innerHTML=\"\";Object.keys(n).sort((e,t)=>t-e).forEach(e=>{const o=n[e],s=document.createElement(\"div\");s.className=\"history-year-group\";const i=document.createElement(\"h2\");i.className=\"history-year-header\",i.textContent=o.year,s.appendChild(i);Object.keys(o.months).sort((e,t)=>t.localeCompare(e)).forEach(e=>{const t=o.months[e],n=document.createElement(\"div\");n.className=\"history-month-group\";const i=document.createElement(\"div\");i.className=\"history-month-header\",i.setAttribute(\"tabindex\",\"0\"),i.setAttribute(\"role\",\"button\"),i.setAttribute(\"aria-expanded\",\"false\"),i.setAttribute(\"title\",(0,l.t)(\"historyMonthToggle\"));const r=document.createElement(\"div\");r.style.display=\"flex\",r.style.flexDirection=\"column\",r.style.gap=\"4px\";const d=document.createElement(\"span\");d.textContent=t.name,r.appendChild(d);const c=document.createElement(\"div\");c.className=\"history-month-summary\";const u=document.createElement(\"span\");u.innerHTML=`${t.count} ${(0,l.t)(\"orders\")} • \u20ac${t.total.toFixed(2)}`,c.appendChild(u),r.appendChild(c),i.appendChild(r);const g=document.createElement(\"span\");g.className=\"material-icons-round\",g.textContent=\"expand_more\",i.appendChild(g),i.addEventListener(\"click\",()=>{const e=i.parentElement;e.classList.contains(\"open\")?(e.classList.remove(\"open\"),i.setAttribute(\"aria-expanded\",\"false\")):(e.classList.add(\"open\"),i.setAttribute(\"aria-expanded\",\"true\"))}),n.appendChild(i);const m=document.createElement(\"div\");m.className=\"history-month-content\";Object.keys(t.weeks).sort((e,t)=>parseInt(t)-parseInt(e)).forEach(e=>{const n=t.weeks[e],o=document.createElement(\"div\");o.className=\"history-week-group\";const s=document.createElement(\"div\");s.className=\"history-week-header\";const i=document.createElement(\"strong\");i.textContent=n.label,s.appendChild(i);const r=document.createElement(\"span\");r.innerHTML=`${n.count} ${(0,l.t)(\"orders\")} • \u20ac${n.total.toFixed(2)}`,s.appendChild(r),o.appendChild(s),n.items.forEach(e=>{const t=new Date(e.date),n=\"en\"===a.Kl?\"en-US\":\"de-AT\",s=t.toLocaleDateString(n,{weekday:\"short\",day:\"2-digit\",month:\"2-digit\"}),i=document.createElement(\"div\");i.className=\"history-item\",9===e.state&&i.classList.add(\"history-item-cancelled\");const r=document.createElement(\"div\");r.style.fontSize=\"0.85rem\",r.style.color=\"var(--text-secondary)\",r.textContent=s,i.appendChild(r);const d=document.createElement(\"div\");d.className=\"history-item-details\";const c=document.createElement(\"span\");c.className=\"history-item-name\",c.textContent=e.name,d.appendChild(c);const u=document.createElement(\"div\"),g=document.createElement(\"span\");g.className=\"history-item-status\",9===e.state?g.textContent=(0,l.t)(\"stateCancelled\"):8===e.state?g.textContent=(0,l.t)(\"stateCompleted\"):g.textContent=(0,l.t)(\"stateTransferred\"),u.appendChild(g),d.appendChild(u),i.appendChild(d);const m=document.createElement(\"div\");m.className=\"history-item-price\",9===e.state&&m.classList.add(\"history-item-price-cancelled\"),m.textContent=`\u20ac${e.price.toFixed(2)}`,i.appendChild(m),o.appendChild(i)}),m.appendChild(o)}),n.appendChild(m),s.appendChild(n)}),t.appendChild(s)})}async function h(e,t,n,o,r){if(a.gX)try{const c=await fetch(`${s.tE}/auth/user/`,{headers:(0,i.H)(a.gX)});if(!c.ok)return void H(\"Fehler: Benutzerdaten konnten nicht geladen werden\",\"error\");const g=await c.json(),m=(new Date).toISOString(),h={uuid:crypto.randomUUID(),created:m,updated:m,order_type:7,items:[{article:t,course_group:null,modifiers:[],uuid:crypto.randomUUID(),name:n,description:r||\"\",price:String(parseFloat(o)),amount:1,vat:\"10.00\",comment:\"\"}],table:null,total:parseFloat(o),tip:0,currency:\"EUR\",venue:s.eW,states:[],order_state:1,date:`${e}T10:30:00Z`,payment_method:\"payroll\",customer:{first_name:g.first_name,last_name:g.last_name,email:g.email,newsletter:!1},preorder:!0,delivery_fee:0,cash_box_table_name:null,take_away:!1},p=await fetch(`${s.tE}/user/orders/`,{method:\"POST\",headers:(0,i.H)(a.gX),body:JSON.stringify(h)});if(p.ok||201===p.status)H(`${(0,l.t)(\"orderSuccess\")}: ${n}`,\"success\"),d=null,await u();else{const e=await p.json();H(`Fehler: ${e.detail||e.non_field_errors?.[0]||\"Bestellung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Order error:\",e),H(\"Netzwerkfehler bei Bestellung\",\"error\")}}async function p(e,t,n){if(!a.gX)return;const o=`${e}_${t}`,r=a.L.get(o);if(!r||0===r.length)return;const c=r[r.length-1];try{const e=await fetch(`${s.tE}/user/orders/${c}/cancel/`,{method:\"PATCH\",headers:(0,i.H)(a.gX),body:JSON.stringify({})});if(e.ok)H(`${(0,l.t)(\"cancelSuccess\")}: ${n}`,\"success\"),d=null,await u();else{H(`Fehler: ${(await e.json()).detail||\"Stornierung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Cancel error:\",e),H(\"Netzwerkfehler bei Stornierung\",\"error\")}}function f(){localStorage.setItem(\"kantine_flags\",JSON.stringify([...a.BY]))}async function v(){if(0===a.BY.size)return;const e=a.gX||s.f9,t=new Set;for(const e of a.BY){const[n]=e.split(\"_\");t.add(n)}let n=!1;const o=document.getElementById(\"alarm-bell\");o&&o.classList.add(\"refreshing\");try{for(const o of t)try{const t=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${o}/`,{headers:(0,i.H)(e)});if(!t.ok)continue;const r=(await t.json()).results||[],l=new Map;for(const e of r)if(e.items&&Array.isArray(e.items))for(const t of e.items)l.set(t.id,t);for(let e of a.p_){if(!e.days)continue;const t=e.days.find(e=>e.date===o);if(t&&t.items)for(let e=0;e0;s.available=e||t,s.availableAmount=parseInt(r.available_amount)||0,s.amountTracking=!1!==r.amount_tracking,n=!0}}}}catch(e){console.error(\"Error refreshing flag date\",o,e)}n&&B(),localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)(),(0,r.OR)(),H(`${a.BY.size} ${1===a.BY.size?(0,l.t)(\"menuSingular\"):(0,l.t)(\"menuPlural\")} ${(0,l.t)(\"menuChecked\")}`,\"info\")}finally{o&&o.classList.remove(\"refreshing\")}}function y(e,t,n,o){const s=`${e}_${t}`;let i=!1;a.BY.has(s)?(a.BY.delete(s),H(`${(0,l.t)(\"flagRemoved\")} ${n}`,\"success\")):(a.BY.add(s),i=!0,H(`${(0,l.t)(\"flagActivated\")} ${n}`,\"success\"),\"default\"===Notification.permission&&Notification.requestPermission()),f(),(0,r.Mb)(),(0,r.OR)(),i&&v()}function b(){const e=new Date,t=e.toISOString().split(\"T\")[0];let n=!1;for(const o of[...a.BY]){const[s]=o.split(\"_\");let i=!1;if(s=t&&(i=!0)}i&&(a.BY.delete(o),n=!0)}n&&f()}function w(){a.K8||a.gX&&(0,a.cc)(setInterval(()=>async function(){if(0===a.BY.size||!a.gX)return;for(const e of a.BY){const[t,n]=e.split(\"_\"),o=parseInt(n);try{const e=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(a.gX)});if(!e.ok)continue;const n=(await e.json()).results||[];let r=null;for(const e of n)if(e.items&&(r=e.items.find(e=>e.id===o||e.article===o),r))break;if(r){if(!1===r.amount_tracking||parseInt(r.available_amount)>0){const e=r.name||\"Unbekannt\";H(`${e} ist jetzt verf\u00fcgbar!`,\"success\"),\"granted\"===Notification.permission&&new Notification(\"Kantine Wrapper\",{body:`${e} ist jetzt verf\u00fcgbar!`,icon:\"\ud83c\udf7d\ufe0f\"}),O()}}}catch(t){console.error(`Poll error for ${e}:`,t),await new Promise(e=>setTimeout(e,200))}}localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)()}(),s.fv))}function E(){a.K8&&(clearInterval(a.K8),(0,a.cc)(null))}function A(){localStorage.setItem(\"kantine_highlightTags\",JSON.stringify(a.yz)),(0,r.OR)(),(0,r.gJ)()}function k(e){if((e=e.trim().toLowerCase())&&!a.yz.includes(e)){const t=[...a.yz,e];return(0,a.iw)(t),A(),!0}return!1}function L(){const e=document.getElementById(\"tags-list\");e.innerHTML=\"\",a.yz.forEach(t=>{const n=document.createElement(\"span\");n.className=\"tag-badge\",n.innerHTML=`${t} ×`,e.appendChild(n)}),e.querySelectorAll(\".tag-remove\").forEach(e=>{e.addEventListener(\"click\",e=>{!function(e){const t=a.yz.filter(t=>t!==e);(0,a.iw)(t),A()}(e.target.dataset.tag),L()})})}function S(e){return e?(e=e.toLowerCase(),a.yz.filter(t=>e.includes(t))):[]}const I=\"kantine_menuCache\",C=\"kantine_menuCacheTs\";function B(){try{localStorage.setItem(I,JSON.stringify(a.p_)),localStorage.setItem(C,(new Date).toISOString())}catch(e){console.warn(\"Failed to cache menu data:\",e)}}function T(){try{const e=localStorage.getItem(I),t=localStorage.getItem(C);if(e){(0,a.tn)(JSON.parse(e)),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),t&&N(t);try{const e=new Set;a.p_.forEach(t=>{(t.days||[]).forEach(t=>{(t.items||[]).forEach(t=>{let n=(t.description||\"\").replace(/\\s+/g,\" \").trim();n&&n.includes(\" / \")&&e.add(n)})})})}catch(e){}return!0}}catch(e){console.warn(\"Failed to load cached menu:\",e)}return!1}function D(){const e=localStorage.getItem(C);if(!e)return!1;if(Date.now()-new Date(e).getTime()>36e5)return!1;const t=(0,o.sn)(new Date),n=(0,o.Ao)(new Date);return a.p_.some(e=>e.weekNumber===t&&e.year===n&&e.days&&e.days.length>0)}async function O(){const e=document.getElementById(\"loading\"),t=document.getElementById(\"progress-modal\"),l=document.getElementById(\"progress-fill\"),d=document.getElementById(\"progress-percent\"),u=document.getElementById(\"progress-message\");e.classList.remove(\"hidden\");const g=a.gX||s.f9;try{t.classList.remove(\"hidden\"),u.textContent=\"Hole verf\u00fcgbare Daten...\",l.style.width=\"0%\",d.textContent=\"0%\";const e=await fetch(`${s.tE}/venues/${s.eW}/menu/dates/`,{headers:(0,i.H)(g)});if(!e.ok)throw new Error(`Failed to fetch dates: ${e.status}`);let n=(await e.json()).results||[];const m=new Date;m.setDate(m.getDate()-7);const h=m.toISOString().split(\"T\")[0];n=n.filter(e=>e.date>=h).sort((e,t)=>e.date.localeCompare(t.date)).slice(0,30);const p=n.length;u.textContent=`${p} Tage gefunden. Lade Details...`;const f=[];let v=0;const y=5;for(let e=0;e
{const t=e.date;let n=null;try{const a=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(g)});if(a.ok){const o=(await a.json()).results||[];let s=[];for(const e of o)e.items&&Array.isArray(e.items)&&(s=s.concat(e.items));s.length>0&&(n={date:t,menu_items:s,orders:e.orders||[]})}}catch(e){console.error(`Failed to fetch details for ${t}:`,e)}finally{v++;const e=Math.round(v/p*100);l.style.width=`${e}%`,d.textContent=`${e}%`,u.textContent=`Lade Men\u00fc f\u00fcr ${t}...`}return n}));for(const e of a)e&&f.push(e)}const b=new Map;a.p_&&a.p_.length>0&&a.p_.forEach(e=>{const t=`${e.year}-${e.weekNumber}`;try{b.set(t,{year:e.year,weekNumber:e.weekNumber,days:e.days?e.days.map(e=>({...e,items:e.items?[...e.items]:[]})):[]})}catch(e){console.warn(\"Error hydrating week:\",e)}});for(const e of f){const t=new Date(e.date),n=(0,o.sn)(t),a=(0,o.Ao)(t),s=`${a}-${n}`;b.has(s)||b.set(s,{year:a,weekNumber:n,days:[]});const i=b.get(s),r=t.toLocaleDateString(\"en-US\",{weekday:\"long\"}),l=new Date(e.date);l.setHours(10,0,0,0);const d={date:e.date,weekday:r,orderCutoff:l.toISOString(),items:e.menu_items.map(t=>{const n=!1===t.amount_tracking,a=parseInt(t.available_amount)>0;return{id:`${e.date}_${t.id}`,articleId:t.id,name:t.name||\"Unknown\",description:t.description||\"\",price:parseFloat(t.price)||0,available:n||a,availableAmount:parseInt(t.available_amount)||0,amountTracking:!1!==t.amount_tracking}})},c=i.days.findIndex(t=>t.date===e.date);c>=0?i.days[c]=d:i.days.push(d)}const w=Array.from(b.values()).sort((e,t)=>e.year!==t.year?e.year-t.year:e.weekNumber-t.weekNumber);w.forEach(e=>{e.days&&e.days.sort((e,t)=>e.date.localeCompare(t.date))}),(0,a.tn)(w),B(),N((new Date).toISOString()),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),c(),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),u.textContent=\"Fertig!\",setTimeout(()=>t.classList.add(\"hidden\"),500)}catch(e){console.error(\"Error fetching menu:\",e),t.classList.add(\"hidden\"),Promise.resolve().then(n.bind(n,842)).then(t=>{t.showErrorModal(\"Keine Verbindung\",`Die Men\u00fcdaten konnten nicht geladen werden. M\u00f6glicherweise besteht keine Verbindung zur API oder zur Bessa-Webseite.
${(0,o.ZD)(e.message)}`,\"Zur Original-Seite\",\"https://web.bessa.app/knapp-kantine\")})}finally{e.classList.add(\"hidden\")}}let M=null,x=null;function N(e){const t=document.getElementById(\"last-updated-subtitle\");if(e){M=e,localStorage.setItem(\"kantine_last_updated\",e),localStorage.setItem(\"kantine_last_checked\",e);try{const n=new Date(e),a=n.toLocaleTimeString(\"de-DE\",{hour:\"2-digit\",minute:\"2-digit\"}),s=n.toLocaleDateString(\"de-DE\",{day:\"2-digit\",month:\"2-digit\"}),i=(0,o.gs)(n);t.textContent=`Aktualisiert: ${s} ${a} (${i})`}catch(e){t.textContent=\"\"}x||(x=setInterval(()=>{M&&(N(M),(0,r.Mb)())},6e4))}}function H(e,t=\"info\"){let n=document.getElementById(\"toast-container\");n||(n=document.createElement(\"div\"),n.id=\"toast-container\",document.body.appendChild(n));const a=document.createElement(\"div\");a.className=`toast toast-${t}`;const s=\"success\"===t?\"check_circle\":\"error\"===t?\"error\":\"info\";a.innerHTML=`${s}${(0,o.ZD)(e)}`,n.appendChild(a),requestAnimationFrame(()=>a.classList.add(\"show\")),setTimeout(()=>{a.classList.remove(\"show\"),setTimeout(()=>a.remove(),300)},3e3)}},672(e,t,n){n.d(t,{H:()=>o,O:()=>s});var a=n(521);function o(e){return{Authorization:`Token ${e||a.f9}`,Accept:\"application/json\",\"Content-Type\":\"application/json\",\"X-Client-Version\":a.fZ}}function s(){return{Accept:\"application/vnd.github.v3+json\"}}},521(e,t,n){n.d(t,{LS:()=>g,YU:()=>r,d_:()=>u,eW:()=>i,f9:()=>o,fZ:()=>s,fv:()=>l,pe:()=>c,tE:()=>a});const a=\"https://api.bessa.app/v1\",o=\"c3418725e95a9f90e3645cbc846b4d67c7c66131\",s=\"v1.6.18\",i=591,r=7,l=3e5,d=\"TauNeutrino/kantine-overview\",c=`https://api.github.com/repos/${d}`,u=`https://htmlpreview.github.io/?https://github.com/${d}/blob`,g={AUTH_TOKEN:\"kantine_authToken\",CURRENT_USER:\"kantine_currentUser\",FIRST_NAME:\"kantine_firstName\",LAST_NAME:\"kantine_lastName\",LANG:\"kantine_lang\",FLAGS:\"kantine_flags\",FLAGGED_LAST_CHECKED:\"kantine_flagged_items_last_checked\",LAST_CHECKED:\"kantine_last_checked\",MENU_CACHE:\"kantine_menuCache\",MENU_CACHE_TS:\"kantine_menuCacheTs\",HISTORY_CACHE:\"kantine_history_cache\",HIGHLIGHT_TAGS:\"kantine_highlightTags\",LAST_UPDATED:\"kantine_last_updated\",VERSION_CACHE:\"kantine_version_cache\",DEV_MODE:\"kantine_dev_mode\"}},646(e,t,n){n.d(t,{t:()=>s});var a=n(901);const o={de:{thisWeek:\"Diese Woche\",nextWeek:\"N\u00e4chste Woche\",nextWeekTooltipDefault:\"Men\u00fc n\u00e4chster Woche anzeigen\",thisWeekTooltip:\"Men\u00fc dieser Woche anzeigen\",appTitle:\"Kantinen \u00dcbersicht\",updatedAt:\"Aktualisiert\",langTooltip:\"Sprache der Men\u00fcbeschreibung\",weekLabel:\"Woche\",refresh:\"Men\u00fcdaten neu laden\",history:\"Bestellhistorie\",highlights:\"Pers\u00f6nliche Highlights verwalten\",themeTooltip:\"Erscheinungsbild (Hell/Dunkel) wechseln\",login:\"Anmelden\",loginTooltip:\"Mit Bessa.app Account anmelden\",logout:\"Abmelden\",logoutTooltip:\"Von Bessa.app abmelden\",loginTitle:\"Login\",employeeId:\"Mitarbeiternummer\",employeeIdPlaceholder:\"z.B. 2041\",employeeIdHelp:\"Deine offizielle Knapp Mitarbeiternummer.\",password:\"Passwort\",passwordPlaceholder:\"Bessa Passwort\",passwordHelp:\"Das Passwort f\u00fcr deinen Bessa Account.\",loginButton:\"Einloggen\",loggingIn:\"Wird eingeloggt...\",highlightsTitle:\"Meine Highlights\",highlightsDesc:\"Markiere Men\u00fcs automatisch, wenn sie diese Schlagw\u00f6rter enthalten.\",tagInputPlaceholder:\"z.B. Schnitzel, Vegetarisch...\",tagInputTooltip:\"Neues Schlagwort zum Hervorheben eingeben\",addTag:\"Hinzuf\u00fcgen\",addTagTooltip:\"Schlagwort zur Liste hinzuf\u00fcgen\",removeTagTooltip:\"Schlagwort entfernen\",historyTitle:\"Bestellhistorie\",loadingHistory:\"Lade Historie...\",noOrders:\"Keine Bestellungen gefunden.\",orders:\"Bestellungen\",historyMonthToggle:\"Klicken, um die Bestellungen f\u00fcr diesen Monat ein-/auszublenden\",available:\"Verf\u00fcgbar\",soldOut:\"Ausverkauft\",ordered:\"Bestellt\",orderButton:\"Bestellen\",orderAgainTooltip:\"nochmal bestellen\",orderTooltip:\"bestellen\",cancelOrder:\"Bestellung stornieren\",cancelOneOrder:\"Eine Bestellung stornieren\",flagActivate:\"Benachrichtigen wenn verf\u00fcgbar\",flagDeactivate:\"Benachrichtigung deaktivieren\",alarmTooltipNone:\"Keine beobachteten Men\u00fcs\",alarmLastChecked:\"Zuletzt gepr\u00fcft\",versionsTitle:\"\ud83d\udce6 Versionen\",currentVersion:\"Aktuell\",devModeLabel:\"Dev-Mode (alle Tags anzeigen)\",loadingVersions:\"Lade Versionen...\",noVersions:\"Keine Versionen gefunden.\",installed:\"\u2713 Installiert\",newVersion:\"\u2b06 Neu!\",installLink:\"Installieren\",reportBug:\"Fehler melden\",reportBugTooltip:\"Melde einen Fehler auf GitHub\",featureRequest:\"Feature vorschlagen\",featureRequestTooltip:\"Schlage ein neues Feature auf GitHub vor\",clearCache:\"Lokalen Cache leeren\",clearCacheTooltip:\"L\u00f6scht alle lokalen Daten & erzwingt einen Neuladen\",clearCacheConfirm:\"M\u00f6chtest du wirklich alle lokalen Daten (inkl. Login-Session, Cache und Einstellungen) l\u00f6schen? Die Seite wird danach neu geladen.\",versionMenuTooltip:\"Klick f\u00fcr Versionsmen\u00fc\",progressTitle:\"Men\u00fcdaten aktualisieren\",progressInit:\"Initialisierung...\",noMenuData:\"Keine Men\u00fcdaten f\u00fcr KW\",noMenuDataHint:\"Versuchen Sie eine andere Woche oder schauen Sie sp\u00e4ter vorbei.\",costLabel:\"Gesamt\",orderDeadline:\"Bestellschluss\",flagRemoved:\"Flag entfernt f\u00fcr\",flagActivated:\"Benachrichtigung aktiviert f\u00fcr\",menuChecked:\"gepr\u00fcft\",menuSingular:\"Men\u00fc\",menuPlural:\"Men\u00fcs\",newMenuDataAvailable:\"Neue Men\u00fcdaten f\u00fcr n\u00e4chste Woche verf\u00fcgbar!\",orderSuccess:\"Bestellt\",cancelSuccess:\"Storniert\",bgSyncFailed:\"Hintergrund-Synchronisation fehlgeschlagen\",historyLoadError:\"Fehler beim Laden der Historie.\",historyLoadingFull:\"Lade Bestellhistorie...\",historyLoadingDelta:\"Suche nach neuen Bestellungen...\",historyLoadingItem:\"Lade Bestellung\",historyLoadingOf:\"von\",historyLoadingNew:\"neue/ge\u00e4nderte Bestellungen gefunden...\",badgeOrdered:\"bestellt\",badgeOrderable:\"bestellbar\",badgeTotal:\"gesamt\",badgeHighlights:\"Highlights gefunden\",stateCancelled:\"Storniert\",stateCompleted:\"Abgeschlossen\",stateTransferred:\"\u00dcbertragen\",close:\"Schlie\u00dfen\",noConnection:\"Keine Verbindung\",toOriginalPage:\"Zur Original-Seite\",loggedIn:\"Angemeldet\"},en:{thisWeek:\"This Week\",nextWeek:\"Next Week\",nextWeekTooltipDefault:\"Show next week's menu\",thisWeekTooltip:\"Show this week's menu\",appTitle:\"Canteen Overview\",updatedAt:\"Updated\",langTooltip:\"Menu description language\",weekLabel:\"Week\",refresh:\"Reload menu data\",history:\"Order history\",highlights:\"Manage personal highlights\",themeTooltip:\"Toggle appearance (Light/Dark)\",login:\"Sign in\",loginTooltip:\"Sign in with Bessa.app account\",logout:\"Sign out\",logoutTooltip:\"Sign out from Bessa.app\",loginTitle:\"Login\",employeeId:\"Employee ID\",employeeIdPlaceholder:\"e.g. 2041\",employeeIdHelp:\"Your official Knapp employee number.\",password:\"Password\",passwordPlaceholder:\"Bessa password\",passwordHelp:\"The password for your Bessa account.\",loginButton:\"Log in\",loggingIn:\"Logging in...\",highlightsTitle:\"My Highlights\",highlightsDesc:\"Automatically highlight menus containing these keywords.\",tagInputPlaceholder:\"e.g. Schnitzel, Vegetarian...\",tagInputTooltip:\"Enter new keyword to highlight\",addTag:\"Add\",addTagTooltip:\"Add keyword to list\",removeTagTooltip:\"Remove keyword\",historyTitle:\"Order History\",loadingHistory:\"Loading history...\",noOrders:\"No orders found.\",orders:\"Orders\",historyMonthToggle:\"Click to expand/collapse orders for this month\",available:\"Available\",soldOut:\"Sold out\",ordered:\"Ordered\",orderButton:\"Order\",orderAgainTooltip:\"order again\",orderTooltip:\"order\",cancelOrder:\"Cancel order\",cancelOneOrder:\"Cancel one order\",flagActivate:\"Notify when available\",flagDeactivate:\"Deactivate notification\",alarmTooltipNone:\"No flagged menus\",alarmLastChecked:\"Last checked\",versionsTitle:\"\ud83d\udce6 Versions\",currentVersion:\"Current\",devModeLabel:\"Dev mode (show all tags)\",loadingVersions:\"Loading versions...\",noVersions:\"No versions found.\",installed:\"\u2713 Installed\",newVersion:\"\u2b06 New!\",installLink:\"Install\",reportBug:\"Report a bug\",reportBugTooltip:\"Report a bug on GitHub\",featureRequest:\"Request a feature\",featureRequestTooltip:\"Suggest a new feature on GitHub\",clearCache:\"Clear local cache\",clearCacheTooltip:\"Deletes all local data & forces a reload\",clearCacheConfirm:\"Do you really want to delete all local data (including login session, cache, and settings)? The page will reload afterwards.\",versionMenuTooltip:\"Click for version menu\",progressTitle:\"Updating menu data\",progressInit:\"Initializing...\",noMenuData:\"No menu data for CW\",noMenuDataHint:\"Try another week or check back later.\",costLabel:\"Total\",orderDeadline:\"Order deadline\",flagRemoved:\"Flag removed for\",flagActivated:\"Notification activated for\",menuChecked:\"checked\",menuSingular:\"menu\",menuPlural:\"menus\",newMenuDataAvailable:\"New menu data available for next week!\",orderSuccess:\"Ordered\",cancelSuccess:\"Cancelled\",bgSyncFailed:\"Background synchronisation failed\",historyLoadError:\"Error loading history.\",historyLoadingFull:\"Loading order history...\",historyLoadingDelta:\"Checking for new orders...\",historyLoadingItem:\"Loading order\",historyLoadingOf:\"of\",historyLoadingNew:\"new/updated orders found...\",badgeOrdered:\"ordered\",badgeOrderable:\"orderable\",badgeTotal:\"total\",badgeHighlights:\"highlights found\",stateCancelled:\"Cancelled\",stateCompleted:\"Completed\",stateTransferred:\"Transferred\",close:\"Close\",noConnection:\"No connection\",toOriginalPage:\"Go to original page\",loggedIn:\"Logged in\"}};function s(e){const t=\"en\"===a.Kl?\"en\":\"de\";return o[t][e]||o.de[e]||e}},901(e,t,n){n.d(t,{BT:()=>i,BY:()=>g,K8:()=>m,Kl:()=>h,L:()=>u,Ny:()=>c,O5:()=>b,UD:()=>S,Xt:()=>v,cc:()=>A,di:()=>E,gX:()=>d,iw:()=>k,lt:()=>w,pK:()=>y,p_:()=>s,qo:()=>L,sw:()=>l,tn:()=>f,vW:()=>r,yz:()=>p});var a=n(413),o=n(521);let s=[],i=(0,a.sn)(new Date),r=(new Date).getFullYear(),l=\"this-week\",d=localStorage.getItem(o.LS.AUTH_TOKEN),c=localStorage.getItem(o.LS.CURRENT_USER),u=new Map,g=new Set(JSON.parse(localStorage.getItem(o.LS.FLAGS)||\"[]\")),m=null,h=localStorage.getItem(o.LS.LANG)||\"de\",p=JSON.parse(localStorage.getItem(o.LS.HIGHLIGHT_TAGS)||\"[]\");function f(e){s=e}function v(e){i=e}function y(e){r=e}function b(e){d=e}function w(e){c=e}function E(e){u=e}function A(e){m=e}function k(e){p=e}function L(e){\"this-week\"===e||\"next-week\"===e?l=e:console.warn(`[state] Invalid displayMode: \"${e}\". Ignoring.`)}function S(e){[\"de\",\"en\",\"all\"].includes(e)?h=e:console.warn(`[state] Invalid langMode: \"${e}\". Ignoring.`)}},842(e,t,n){n.d(t,{Gk:()=>m,Mb:()=>v,OR:()=>c,Ux:()=>g,gJ:()=>d,showErrorModal:()=>f});var a=n(901),o=n(413),s=n(521),i=n(672),r=n(367),l=n(646);function d(){const e=document.getElementById(\"btn-next-week\");let t=a.BT+1,n=a.vW;t>52&&(t=1,n++);const o=a.p_.find(e=>e.weekNumber===t&&e.year===n);let s=0,i=0,d=0,c=0;o&&o.days&&o.days.forEach(e=>{if(e.items&&e.items.length>0){s++;const t=e.items.some(e=>e.available);t&&i++;let n=!1;e.items.forEach(t=>{const o=t.articleId||parseInt(t.id.split(\"_\")[1]),s=`${e.date}_${o}`;a.L.has(s)&&a.L.get(s).length>0&&(n=!0)}),n&&d++;const o=new Date(e.date).getDay();o>=1&&o<=4&&t&&!n&&c++}});const u=e.querySelector(\".nav-badge\");if(u&&u.remove(),s>0){let a=0;o&&o.days&&o.days.forEach(e=>{e.items.forEach(e=>{const t=(0,r.BM)(e.name),n=(0,r.BM)(e.description);(t.length>0||n.length>0)&&a++})});let u=[`${d} ${(0,l.t)(\"badgeOrdered\")} / ${i} ${(0,l.t)(\"badgeOrderable\")} / ${s} ${(0,l.t)(\"badgeTotal\")}`];if(a>0&&u.push(`${a} ${(0,l.t)(\"badgeHighlights\")}`),e.title=u.join(\" \u2022 \"),c>0){e.classList.add(\"new-week-available\");const a=`kantine_notified_nextweek_${n}_${t}`;localStorage.getItem(a)||(localStorage.setItem(a,\"true\"),(0,r.P0)((0,l.t)(\"newMenuDataAvailable\"),\"info\"))}else e.classList.remove(\"new-week-available\")}else e.title=(0,l.t)(\"nextWeekTooltipDefault\"),e.classList.remove(\"new-week-available\")}function c(){const e=document.getElementById(\"menu-container\");if(!e)return;e.innerHTML=\"\";let t=a.BT,n=a.vW;\"next-week\"===a.sw&&(t++,t>52&&(t=1,n++));const s=a.p_.flatMap(e=>e.days||[]).filter(e=>{const a=new Date(e.date);return(0,o.sn)(a)===t&&(0,o.Ao)(a)===n});if(0===s.length)return e.innerHTML=`\\n
`);const n={};e.forEach(e=>{const t=new Date(e.date),s=t.getFullYear(),i=t.getMonth(),r=`${s}-${i.toString().padStart(2,\"0\")}`,l=\"en\"===a.Kl?\"en-US\":\"de-AT\",d=t.toLocaleString(l,{month:\"long\"}),c=(0,o.sn)(t);n[s]||(n[s]={year:s,months:{}}),n[s].months[r]||(n[s].months[r]={name:d,year:s,monthIndex:i,count:0,total:0,weeks:{}}),n[s].months[r].weeks[c]||(n[s].months[r].weeks[c]={label:\"en\"===a.Kl?`CW ${c}`:`KW ${c}`,items:[],count:0,total:0});(e.items||[]).forEach(t=>{const a=parseFloat(t.price||e.total||0);n[s].months[r].weeks[c].items.push({date:e.date,name:t.name||\"Men\u00fc\",price:a,state:e.order_state}),9!==e.order_state&&(n[s].months[r].weeks[c].count++,n[s].months[r].weeks[c].total+=a,n[s].months[r].count++,n[s].months[r].total+=a)})}),t.innerHTML=\"\";Object.keys(n).sort((e,t)=>t-e).forEach(e=>{const o=n[e],s=document.createElement(\"div\");s.className=\"history-year-group\";const i=document.createElement(\"h2\");i.className=\"history-year-header\",i.textContent=o.year,s.appendChild(i);Object.keys(o.months).sort((e,t)=>t.localeCompare(e)).forEach(e=>{const t=o.months[e],n=document.createElement(\"div\");n.className=\"history-month-group\";const i=document.createElement(\"div\");i.className=\"history-month-header\",i.setAttribute(\"tabindex\",\"0\"),i.setAttribute(\"role\",\"button\"),i.setAttribute(\"aria-expanded\",\"false\"),i.setAttribute(\"title\",(0,l.t)(\"historyMonthToggle\"));const r=document.createElement(\"div\");r.style.display=\"flex\",r.style.flexDirection=\"column\",r.style.gap=\"4px\";const d=document.createElement(\"span\");d.textContent=t.name,r.appendChild(d);const c=document.createElement(\"div\");c.className=\"history-month-summary\";const u=document.createElement(\"span\");u.innerHTML=`${t.count} ${(0,l.t)(\"orders\")} • \u20ac${t.total.toFixed(2)}`,c.appendChild(u),r.appendChild(c),i.appendChild(r);const g=document.createElement(\"span\");g.className=\"material-icons-round\",g.textContent=\"expand_more\",i.appendChild(g),i.addEventListener(\"click\",()=>{const e=i.parentElement;e.classList.contains(\"open\")?(e.classList.remove(\"open\"),i.setAttribute(\"aria-expanded\",\"false\")):(e.classList.add(\"open\"),i.setAttribute(\"aria-expanded\",\"true\"))}),n.appendChild(i);const m=document.createElement(\"div\");m.className=\"history-month-content\";Object.keys(t.weeks).sort((e,t)=>parseInt(t)-parseInt(e)).forEach(e=>{const n=t.weeks[e],o=document.createElement(\"div\");o.className=\"history-week-group\";const s=document.createElement(\"div\");s.className=\"history-week-header\";const i=document.createElement(\"strong\");i.textContent=n.label,s.appendChild(i);const r=document.createElement(\"span\");r.innerHTML=`${n.count} ${(0,l.t)(\"orders\")} • \u20ac${n.total.toFixed(2)}`,s.appendChild(r),o.appendChild(s),n.items.forEach(e=>{const t=new Date(e.date),n=\"en\"===a.Kl?\"en-US\":\"de-AT\",s=t.toLocaleDateString(n,{weekday:\"short\",day:\"2-digit\",month:\"2-digit\"}),i=document.createElement(\"div\");i.className=\"history-item\",9===e.state&&i.classList.add(\"history-item-cancelled\");const r=document.createElement(\"div\");r.style.fontSize=\"0.85rem\",r.style.color=\"var(--text-secondary)\",r.textContent=s,i.appendChild(r);const d=document.createElement(\"div\");d.className=\"history-item-details\";const c=document.createElement(\"span\");c.className=\"history-item-name\",c.textContent=e.name,d.appendChild(c);const u=document.createElement(\"div\"),g=document.createElement(\"span\");g.className=\"history-item-status\",9===e.state?g.textContent=(0,l.t)(\"stateCancelled\"):8===e.state?g.textContent=(0,l.t)(\"stateCompleted\"):g.textContent=(0,l.t)(\"stateTransferred\"),u.appendChild(g),d.appendChild(u),i.appendChild(d);const m=document.createElement(\"div\");m.className=\"history-item-price\",9===e.state&&m.classList.add(\"history-item-price-cancelled\"),m.textContent=`\u20ac${e.price.toFixed(2)}`,i.appendChild(m),o.appendChild(i)}),m.appendChild(o)}),n.appendChild(m),s.appendChild(n)}),t.appendChild(s)})}async function h(e,t,n,o,r){if(a.gX)try{const c=await fetch(`${s.tE}/auth/user/`,{headers:(0,i.H)(a.gX)});if(!c.ok)return void H(\"Fehler: Benutzerdaten konnten nicht geladen werden\",\"error\");const g=await c.json(),m=(new Date).toISOString(),h={uuid:crypto.randomUUID(),created:m,updated:m,order_type:7,items:[{article:t,course_group:null,modifiers:[],uuid:crypto.randomUUID(),name:n,description:r||\"\",price:String(parseFloat(o)),amount:1,vat:\"10.00\",comment:\"\"}],table:null,total:parseFloat(o),tip:0,currency:\"EUR\",venue:s.eW,states:[],order_state:1,date:`${e}T10:30:00Z`,payment_method:\"payroll\",customer:{first_name:g.first_name,last_name:g.last_name,email:g.email,newsletter:!1},preorder:!0,delivery_fee:0,cash_box_table_name:null,take_away:!1},p=await fetch(`${s.tE}/user/orders/`,{method:\"POST\",headers:(0,i.H)(a.gX),body:JSON.stringify(h)});if(p.ok||201===p.status)H(`${(0,l.t)(\"orderSuccess\")}: ${n}`,\"success\"),d=null,await u();else{const e=await p.json();H(`Fehler: ${e.detail||e.non_field_errors?.[0]||\"Bestellung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Order error:\",e),H(\"Netzwerkfehler bei Bestellung\",\"error\")}}async function p(e,t,n){if(!a.gX)return;const o=`${e}_${t}`,r=a.L.get(o);if(!r||0===r.length)return;const c=r[r.length-1];try{const e=await fetch(`${s.tE}/user/orders/${c}/cancel/`,{method:\"PATCH\",headers:(0,i.H)(a.gX),body:JSON.stringify({})});if(e.ok)H(`${(0,l.t)(\"cancelSuccess\")}: ${n}`,\"success\"),d=null,await u();else{H(`Fehler: ${(await e.json()).detail||\"Stornierung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Cancel error:\",e),H(\"Netzwerkfehler bei Stornierung\",\"error\")}}function f(){localStorage.setItem(\"kantine_flags\",JSON.stringify([...a.BY]))}async function v(){if(0===a.BY.size)return;const e=a.gX||s.f9,t=new Set;for(const e of a.BY){const[n]=e.split(\"_\");t.add(n)}let n=!1;const o=document.getElementById(\"alarm-bell\");o&&o.classList.add(\"refreshing\");try{for(const o of t)try{const t=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${o}/`,{headers:(0,i.H)(e)});if(!t.ok)continue;const r=(await t.json()).results||[],l=new Map;for(const e of r)if(e.items&&Array.isArray(e.items))for(const t of e.items)l.set(t.id,t);for(let e of a.p_){if(!e.days)continue;const t=e.days.find(e=>e.date===o);if(t&&t.items)for(let e=0;e0;s.available=e||t,s.availableAmount=parseInt(r.available_amount)||0,s.amountTracking=!1!==r.amount_tracking,n=!0}}}}catch(e){console.error(\"Error refreshing flag date\",o,e)}n&&B(),localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)(),(0,r.OR)(),H(`${a.BY.size} ${1===a.BY.size?(0,l.t)(\"menuSingular\"):(0,l.t)(\"menuPlural\")} ${(0,l.t)(\"menuChecked\")}`,\"info\")}finally{o&&o.classList.remove(\"refreshing\")}}function y(e,t,n,o){const s=`${e}_${t}`;let i=!1;a.BY.has(s)?(a.BY.delete(s),H(`${(0,l.t)(\"flagRemoved\")} ${n}`,\"success\")):(a.BY.add(s),i=!0,H(`${(0,l.t)(\"flagActivated\")} ${n}`,\"success\"),\"default\"===Notification.permission&&Notification.requestPermission()),f(),(0,r.Mb)(),(0,r.OR)(),i&&v()}function b(){const e=new Date,t=e.toISOString().split(\"T\")[0];let n=!1;for(const o of[...a.BY]){const[s]=o.split(\"_\");let i=!1;if(s=t&&(i=!0)}i&&(a.BY.delete(o),n=!0)}n&&f()}function w(){a.K8||a.gX&&(0,a.cc)(setInterval(()=>async function(){if(0===a.BY.size||!a.gX)return;for(const e of a.BY){const[t,n]=e.split(\"_\"),o=parseInt(n);try{const e=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(a.gX)});if(!e.ok)continue;const n=(await e.json()).results||[];let r=null;for(const e of n)if(e.items&&(r=e.items.find(e=>e.id===o||e.article===o),r))break;if(r){if(!1===r.amount_tracking||parseInt(r.available_amount)>0){const e=r.name||\"Unbekannt\";H(`${e} ist jetzt verf\u00fcgbar!`,\"success\"),\"granted\"===Notification.permission&&new Notification(\"Kantine Wrapper\",{body:`${e} ist jetzt verf\u00fcgbar!`,icon:\"\ud83c\udf7d\ufe0f\"}),O()}}}catch(t){console.error(`Poll error for ${e}:`,t),await new Promise(e=>setTimeout(e,200))}}localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)()}(),s.fv))}function E(){a.K8&&(clearInterval(a.K8),(0,a.cc)(null))}function A(){localStorage.setItem(\"kantine_highlightTags\",JSON.stringify(a.yz)),(0,r.OR)(),(0,r.gJ)()}function k(e){if((e=e.trim().toLowerCase())&&!a.yz.includes(e)){const t=[...a.yz,e];return(0,a.iw)(t),A(),!0}return!1}function L(){const e=document.getElementById(\"tags-list\");e.innerHTML=\"\",a.yz.forEach(t=>{const n=document.createElement(\"span\");n.className=\"tag-badge\",n.innerHTML=`${t} ×`,e.appendChild(n)}),e.querySelectorAll(\".tag-remove\").forEach(e=>{e.addEventListener(\"click\",e=>{!function(e){const t=a.yz.filter(t=>t!==e);(0,a.iw)(t),A()}(e.target.dataset.tag),L()})})}function S(e){return e?(e=e.toLowerCase(),a.yz.filter(t=>e.includes(t))):[]}const I=\"kantine_menuCache\",C=\"kantine_menuCacheTs\";function B(){try{localStorage.setItem(I,JSON.stringify(a.p_)),localStorage.setItem(C,(new Date).toISOString())}catch(e){console.warn(\"Failed to cache menu data:\",e)}}function T(){try{const e=localStorage.getItem(I),t=localStorage.getItem(C);if(e){(0,a.tn)(JSON.parse(e)),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),t&&N(t);try{const e=new Set;a.p_.forEach(t=>{(t.days||[]).forEach(t=>{(t.items||[]).forEach(t=>{let n=(t.description||\"\").replace(/\\s+/g,\" \").trim();n&&n.includes(\" / \")&&e.add(n)})})})}catch(e){}return!0}}catch(e){console.warn(\"Failed to load cached menu:\",e)}return!1}function D(){const e=localStorage.getItem(C);if(!e)return!1;if(Date.now()-new Date(e).getTime()>36e5)return!1;const t=(0,o.sn)(new Date),n=(0,o.Ao)(new Date);return a.p_.some(e=>e.weekNumber===t&&e.year===n&&e.days&&e.days.length>0)}async function O(){const e=document.getElementById(\"loading\"),t=document.getElementById(\"progress-modal\"),l=document.getElementById(\"progress-fill\"),d=document.getElementById(\"progress-percent\"),u=document.getElementById(\"progress-message\");e.classList.remove(\"hidden\");const g=a.gX||s.f9;try{t.classList.remove(\"hidden\"),u.textContent=\"Hole verf\u00fcgbare Daten...\",l.style.width=\"0%\",d.textContent=\"0%\";const e=await fetch(`${s.tE}/venues/${s.eW}/menu/dates/`,{headers:(0,i.H)(g)});if(!e.ok)throw new Error(`Failed to fetch dates: ${e.status}`);let n=(await e.json()).results||[];const m=new Date;m.setDate(m.getDate()-7);const h=m.toISOString().split(\"T\")[0];n=n.filter(e=>e.date>=h).sort((e,t)=>e.date.localeCompare(t.date)).slice(0,30);const p=n.length;u.textContent=`${p} Tage gefunden. Lade Details...`;const f=[];let v=0;const y=5;for(let e=0;e
{const t=e.date;let n=null;try{const a=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(g)});if(a.ok){const o=(await a.json()).results||[];let s=[];for(const e of o)e.items&&Array.isArray(e.items)&&(s=s.concat(e.items));s.length>0&&(n={date:t,menu_items:s,orders:e.orders||[]})}}catch(e){console.error(`Failed to fetch details for ${t}:`,e)}finally{v++;const e=Math.round(v/p*100);l.style.width=`${e}%`,d.textContent=`${e}%`,u.textContent=`Lade Men\u00fc f\u00fcr ${t}...`}return n}));for(const e of a)e&&f.push(e)}const b=new Map;a.p_&&a.p_.length>0&&a.p_.forEach(e=>{const t=`${e.year}-${e.weekNumber}`;try{b.set(t,{year:e.year,weekNumber:e.weekNumber,days:e.days?e.days.map(e=>({...e,items:e.items?[...e.items]:[]})):[]})}catch(e){console.warn(\"Error hydrating week:\",e)}});for(const e of f){const t=new Date(e.date),n=(0,o.sn)(t),a=(0,o.Ao)(t),s=`${a}-${n}`;b.has(s)||b.set(s,{year:a,weekNumber:n,days:[]});const i=b.get(s),r=t.toLocaleDateString(\"en-US\",{weekday:\"long\"}),l=new Date(e.date);l.setHours(10,0,0,0);const d={date:e.date,weekday:r,orderCutoff:l.toISOString(),items:e.menu_items.map(t=>{const n=!1===t.amount_tracking,a=parseInt(t.available_amount)>0;return{id:`${e.date}_${t.id}`,articleId:t.id,name:t.name||\"Unknown\",description:t.description||\"\",price:parseFloat(t.price)||0,available:n||a,availableAmount:parseInt(t.available_amount)||0,amountTracking:!1!==t.amount_tracking}})},c=i.days.findIndex(t=>t.date===e.date);c>=0?i.days[c]=d:i.days.push(d)}const w=Array.from(b.values()).sort((e,t)=>e.year!==t.year?e.year-t.year:e.weekNumber-t.weekNumber);w.forEach(e=>{e.days&&e.days.sort((e,t)=>e.date.localeCompare(t.date))}),(0,a.tn)(w),B(),N((new Date).toISOString()),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),c(),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),u.textContent=\"Fertig!\",setTimeout(()=>t.classList.add(\"hidden\"),500)}catch(e){console.error(\"Error fetching menu:\",e),t.classList.add(\"hidden\"),Promise.resolve().then(n.bind(n,842)).then(t=>{t.showErrorModal(\"Keine Verbindung\",`Die Men\u00fcdaten konnten nicht geladen werden. M\u00f6glicherweise besteht keine Verbindung zur API oder zur Bessa-Webseite.
${(0,o.ZD)(e.message)}`,\"Zur Original-Seite\",\"https://web.bessa.app/knapp-kantine\")})}finally{e.classList.add(\"hidden\")}}let M=null,x=null;function N(e){const t=document.getElementById(\"last-updated-subtitle\");if(e){M=e,localStorage.setItem(\"kantine_last_updated\",e),localStorage.setItem(\"kantine_last_checked\",e);try{const n=new Date(e),a=n.toLocaleTimeString(\"de-DE\",{hour:\"2-digit\",minute:\"2-digit\"}),s=n.toLocaleDateString(\"de-DE\",{day:\"2-digit\",month:\"2-digit\"}),i=(0,o.gs)(n);t.textContent=`Aktualisiert: ${s} ${a} (${i})`}catch(e){t.textContent=\"\"}x||(x=setInterval(()=>{M&&(N(M),(0,r.Mb)())},6e4))}}function H(e,t=\"info\"){let n=document.getElementById(\"toast-container\");n||(n=document.createElement(\"div\"),n.id=\"toast-container\",document.body.appendChild(n));const a=document.createElement(\"div\");a.className=`toast toast-${t}`;const s=\"success\"===t?\"check_circle\":\"error\"===t?\"error\":\"info\";a.innerHTML=`${s}${(0,o.ZD)(e)}`,n.appendChild(a),requestAnimationFrame(()=>a.classList.add(\"show\")),setTimeout(()=>{a.classList.remove(\"show\"),setTimeout(()=>a.remove(),300)},3e3)}},672(e,t,n){n.d(t,{H:()=>o,O:()=>s});var a=n(521);function o(e){return{Authorization:`Token ${e||a.f9}`,Accept:\"application/json\",\"Content-Type\":\"application/json\",\"X-Client-Version\":a.fZ}}function s(){return{Accept:\"application/vnd.github.v3+json\"}}},521(e,t,n){n.d(t,{LS:()=>g,YU:()=>r,d_:()=>u,eW:()=>i,f9:()=>o,fZ:()=>s,fv:()=>l,pe:()=>c,tE:()=>a});const a=\"https://api.bessa.app/v1\",o=\"c3418725e95a9f90e3645cbc846b4d67c7c66131\",s=\"v1.6.19\",i=591,r=7,l=3e5,d=\"TauNeutrino/kantine-overview\",c=`https://api.github.com/repos/${d}`,u=`https://htmlpreview.github.io/?https://github.com/${d}/blob`,g={AUTH_TOKEN:\"kantine_authToken\",CURRENT_USER:\"kantine_currentUser\",FIRST_NAME:\"kantine_firstName\",LAST_NAME:\"kantine_lastName\",LANG:\"kantine_lang\",FLAGS:\"kantine_flags\",FLAGGED_LAST_CHECKED:\"kantine_flagged_items_last_checked\",LAST_CHECKED:\"kantine_last_checked\",MENU_CACHE:\"kantine_menuCache\",MENU_CACHE_TS:\"kantine_menuCacheTs\",HISTORY_CACHE:\"kantine_history_cache\",HIGHLIGHT_TAGS:\"kantine_highlightTags\",LAST_UPDATED:\"kantine_last_updated\",VERSION_CACHE:\"kantine_version_cache\",DEV_MODE:\"kantine_dev_mode\"}},646(e,t,n){n.d(t,{t:()=>s});var a=n(901);const o={de:{thisWeek:\"Diese Woche\",nextWeek:\"N\u00e4chste Woche\",nextWeekTooltipDefault:\"Men\u00fc n\u00e4chster Woche anzeigen\",thisWeekTooltip:\"Men\u00fc dieser Woche anzeigen\",appTitle:\"Kantinen \u00dcbersicht\",updatedAt:\"Aktualisiert\",langTooltip:\"Sprache der Men\u00fcbeschreibung\",weekLabel:\"Woche\",refresh:\"Men\u00fcdaten neu laden\",history:\"Bestellhistorie\",highlights:\"Pers\u00f6nliche Highlights verwalten\",themeTooltip:\"Erscheinungsbild (Hell/Dunkel) wechseln\",login:\"Anmelden\",loginTooltip:\"Mit Bessa.app Account anmelden\",logout:\"Abmelden\",logoutTooltip:\"Von Bessa.app abmelden\",loginTitle:\"Login\",employeeId:\"Mitarbeiternummer\",employeeIdPlaceholder:\"z.B. 2041\",employeeIdHelp:\"Deine offizielle Knapp Mitarbeiternummer.\",password:\"Passwort\",passwordPlaceholder:\"Bessa Passwort\",passwordHelp:\"Das Passwort f\u00fcr deinen Bessa Account.\",loginButton:\"Einloggen\",loggingIn:\"Wird eingeloggt...\",highlightsTitle:\"Meine Highlights\",highlightsDesc:\"Markiere Men\u00fcs automatisch, wenn sie diese Schlagw\u00f6rter enthalten.\",tagInputPlaceholder:\"z.B. Schnitzel, Vegetarisch...\",tagInputTooltip:\"Neues Schlagwort zum Hervorheben eingeben\",addTag:\"Hinzuf\u00fcgen\",addTagTooltip:\"Schlagwort zur Liste hinzuf\u00fcgen\",removeTagTooltip:\"Schlagwort entfernen\",historyTitle:\"Bestellhistorie\",loadingHistory:\"Lade Historie...\",noOrders:\"Keine Bestellungen gefunden.\",orders:\"Bestellungen\",historyMonthToggle:\"Klicken, um die Bestellungen f\u00fcr diesen Monat ein-/auszublenden\",available:\"Verf\u00fcgbar\",soldOut:\"Ausverkauft\",ordered:\"Bestellt\",orderButton:\"Bestellen\",orderAgainTooltip:\"nochmal bestellen\",orderTooltip:\"bestellen\",cancelOrder:\"Bestellung stornieren\",cancelOneOrder:\"Eine Bestellung stornieren\",flagActivate:\"Benachrichtigen wenn verf\u00fcgbar\",flagDeactivate:\"Benachrichtigung deaktivieren\",alarmTooltipNone:\"Keine beobachteten Men\u00fcs\",alarmLastChecked:\"Zuletzt gepr\u00fcft\",versionsTitle:\"\ud83d\udce6 Versionen\",currentVersion:\"Aktuell\",devModeLabel:\"Dev-Mode (alle Tags anzeigen)\",loadingVersions:\"Lade Versionen...\",noVersions:\"Keine Versionen gefunden.\",installed:\"\u2713 Installiert\",newVersion:\"\u2b06 Neu!\",installLink:\"Installieren\",reportBug:\"Fehler melden\",reportBugTooltip:\"Melde einen Fehler auf GitHub\",featureRequest:\"Feature vorschlagen\",featureRequestTooltip:\"Schlage ein neues Feature auf GitHub vor\",clearCache:\"Lokalen Cache leeren\",clearCacheTooltip:\"L\u00f6scht alle lokalen Daten & erzwingt einen Neuladen\",clearCacheConfirm:\"M\u00f6chtest du wirklich alle lokalen Daten (inkl. Login-Session, Cache und Einstellungen) l\u00f6schen? Die Seite wird danach neu geladen.\",versionMenuTooltip:\"Klick f\u00fcr Versionsmen\u00fc\",progressTitle:\"Men\u00fcdaten aktualisieren\",progressInit:\"Initialisierung...\",noMenuData:\"Keine Men\u00fcdaten f\u00fcr KW\",noMenuDataHint:\"Versuchen Sie eine andere Woche oder schauen Sie sp\u00e4ter vorbei.\",costLabel:\"Gesamt\",orderDeadline:\"Bestellschluss\",flagRemoved:\"Flag entfernt f\u00fcr\",flagActivated:\"Benachrichtigung aktiviert f\u00fcr\",menuChecked:\"gepr\u00fcft\",menuSingular:\"Men\u00fc\",menuPlural:\"Men\u00fcs\",newMenuDataAvailable:\"Neue Men\u00fcdaten f\u00fcr n\u00e4chste Woche verf\u00fcgbar!\",orderSuccess:\"Bestellt\",cancelSuccess:\"Storniert\",bgSyncFailed:\"Hintergrund-Synchronisation fehlgeschlagen\",historyLoadError:\"Fehler beim Laden der Historie.\",historyLoadingFull:\"Lade Bestellhistorie...\",historyLoadingDelta:\"Suche nach neuen Bestellungen...\",historyLoadingItem:\"Lade Bestellung\",historyLoadingOf:\"von\",historyLoadingNew:\"neue/ge\u00e4nderte Bestellungen gefunden...\",badgeOrdered:\"bestellt\",badgeOrderable:\"bestellbar\",badgeTotal:\"gesamt\",badgeHighlights:\"Highlights gefunden\",stateCancelled:\"Storniert\",stateCompleted:\"Abgeschlossen\",stateTransferred:\"\u00dcbertragen\",close:\"Schlie\u00dfen\",noConnection:\"Keine Verbindung\",toOriginalPage:\"Zur Original-Seite\",loggedIn:\"Angemeldet\"},en:{thisWeek:\"This Week\",nextWeek:\"Next Week\",nextWeekTooltipDefault:\"Show next week's menu\",thisWeekTooltip:\"Show this week's menu\",appTitle:\"Canteen Overview\",updatedAt:\"Updated\",langTooltip:\"Menu description language\",weekLabel:\"Week\",refresh:\"Reload menu data\",history:\"Order history\",highlights:\"Manage personal highlights\",themeTooltip:\"Toggle appearance (Light/Dark)\",login:\"Sign in\",loginTooltip:\"Sign in with Bessa.app account\",logout:\"Sign out\",logoutTooltip:\"Sign out from Bessa.app\",loginTitle:\"Login\",employeeId:\"Employee ID\",employeeIdPlaceholder:\"e.g. 2041\",employeeIdHelp:\"Your official Knapp employee number.\",password:\"Password\",passwordPlaceholder:\"Bessa password\",passwordHelp:\"The password for your Bessa account.\",loginButton:\"Log in\",loggingIn:\"Logging in...\",highlightsTitle:\"My Highlights\",highlightsDesc:\"Automatically highlight menus containing these keywords.\",tagInputPlaceholder:\"e.g. Schnitzel, Vegetarian...\",tagInputTooltip:\"Enter new keyword to highlight\",addTag:\"Add\",addTagTooltip:\"Add keyword to list\",removeTagTooltip:\"Remove keyword\",historyTitle:\"Order History\",loadingHistory:\"Loading history...\",noOrders:\"No orders found.\",orders:\"Orders\",historyMonthToggle:\"Click to expand/collapse orders for this month\",available:\"Available\",soldOut:\"Sold out\",ordered:\"Ordered\",orderButton:\"Order\",orderAgainTooltip:\"order again\",orderTooltip:\"order\",cancelOrder:\"Cancel order\",cancelOneOrder:\"Cancel one order\",flagActivate:\"Notify when available\",flagDeactivate:\"Deactivate notification\",alarmTooltipNone:\"No flagged menus\",alarmLastChecked:\"Last checked\",versionsTitle:\"\ud83d\udce6 Versions\",currentVersion:\"Current\",devModeLabel:\"Dev mode (show all tags)\",loadingVersions:\"Loading versions...\",noVersions:\"No versions found.\",installed:\"\u2713 Installed\",newVersion:\"\u2b06 New!\",installLink:\"Install\",reportBug:\"Report a bug\",reportBugTooltip:\"Report a bug on GitHub\",featureRequest:\"Request a feature\",featureRequestTooltip:\"Suggest a new feature on GitHub\",clearCache:\"Clear local cache\",clearCacheTooltip:\"Deletes all local data & forces a reload\",clearCacheConfirm:\"Do you really want to delete all local data (including login session, cache, and settings)? The page will reload afterwards.\",versionMenuTooltip:\"Click for version menu\",progressTitle:\"Updating menu data\",progressInit:\"Initializing...\",noMenuData:\"No menu data for CW\",noMenuDataHint:\"Try another week or check back later.\",costLabel:\"Total\",orderDeadline:\"Order deadline\",flagRemoved:\"Flag removed for\",flagActivated:\"Notification activated for\",menuChecked:\"checked\",menuSingular:\"menu\",menuPlural:\"menus\",newMenuDataAvailable:\"New menu data available for next week!\",orderSuccess:\"Ordered\",cancelSuccess:\"Cancelled\",bgSyncFailed:\"Background synchronisation failed\",historyLoadError:\"Error loading history.\",historyLoadingFull:\"Loading order history...\",historyLoadingDelta:\"Checking for new orders...\",historyLoadingItem:\"Loading order\",historyLoadingOf:\"of\",historyLoadingNew:\"new/updated orders found...\",badgeOrdered:\"ordered\",badgeOrderable:\"orderable\",badgeTotal:\"total\",badgeHighlights:\"highlights found\",stateCancelled:\"Cancelled\",stateCompleted:\"Completed\",stateTransferred:\"Transferred\",close:\"Close\",noConnection:\"No connection\",toOriginalPage:\"Go to original page\",loggedIn:\"Logged in\"}};function s(e){const t=\"en\"===a.Kl?\"en\":\"de\";return o[t][e]||o.de[e]||e}},901(e,t,n){n.d(t,{BT:()=>i,BY:()=>g,K8:()=>m,Kl:()=>h,L:()=>u,Ny:()=>c,O5:()=>b,UD:()=>S,Xt:()=>v,cc:()=>A,di:()=>E,gX:()=>d,iw:()=>k,lt:()=>w,pK:()=>y,p_:()=>s,qo:()=>L,sw:()=>l,tn:()=>f,vW:()=>r,yz:()=>p});var a=n(413),o=n(521);let s=[],i=(0,a.sn)(new Date),r=(new Date).getFullYear(),l=\"this-week\",d=localStorage.getItem(o.LS.AUTH_TOKEN),c=localStorage.getItem(o.LS.CURRENT_USER),u=new Map,g=new Set(JSON.parse(localStorage.getItem(o.LS.FLAGS)||\"[]\")),m=null,h=localStorage.getItem(o.LS.LANG)||\"de\",p=JSON.parse(localStorage.getItem(o.LS.HIGHLIGHT_TAGS)||\"[]\");function f(e){s=e}function v(e){i=e}function y(e){r=e}function b(e){d=e}function w(e){c=e}function E(e){u=e}function A(e){m=e}function k(e){p=e}function L(e){\"this-week\"===e||\"next-week\"===e?l=e:console.warn(`[state] Invalid displayMode: \"${e}\". Ignoring.`)}function S(e){[\"de\",\"en\",\"all\"].includes(e)?h=e:console.warn(`[state] Invalid langMode: \"${e}\". Ignoring.`)}},842(e,t,n){n.d(t,{Gk:()=>m,Mb:()=>v,OR:()=>c,Ux:()=>g,gJ:()=>d,showErrorModal:()=>f});var a=n(901),o=n(413),s=n(521),i=n(672),r=n(367),l=n(646);function d(){const e=document.getElementById(\"btn-next-week\");let t=a.BT+1,n=a.vW;t>52&&(t=1,n++);const o=a.p_.find(e=>e.weekNumber===t&&e.year===n);let s=0,i=0,d=0,c=0;o&&o.days&&o.days.forEach(e=>{if(e.items&&e.items.length>0){s++;const t=e.items.some(e=>e.available);t&&i++;let n=!1;e.items.forEach(t=>{const o=t.articleId||parseInt(t.id.split(\"_\")[1]),s=`${e.date}_${o}`;a.L.has(s)&&a.L.get(s).length>0&&(n=!0)}),n&&d++;const o=new Date(e.date).getDay();o>=1&&o<=4&&t&&!n&&c++}});const u=e.querySelector(\".nav-badge\");if(u&&u.remove(),s>0){let a=0;o&&o.days&&o.days.forEach(e=>{e.items.forEach(e=>{const t=(0,r.BM)(e.name),n=(0,r.BM)(e.description);(t.length>0||n.length>0)&&a++})});let u=[`${d} ${(0,l.t)(\"badgeOrdered\")} / ${i} ${(0,l.t)(\"badgeOrderable\")} / ${s} ${(0,l.t)(\"badgeTotal\")}`];if(a>0&&u.push(`${a} ${(0,l.t)(\"badgeHighlights\")}`),e.title=u.join(\" \u2022 \"),c>0){e.classList.add(\"new-week-available\");const a=`kantine_notified_nextweek_${n}_${t}`;localStorage.getItem(a)||(localStorage.setItem(a,\"true\"),(0,r.P0)((0,l.t)(\"newMenuDataAvailable\"),\"info\"))}else e.classList.remove(\"new-week-available\")}else e.title=(0,l.t)(\"nextWeekTooltipDefault\"),e.classList.remove(\"new-week-available\")}function c(){const e=document.getElementById(\"menu-container\");if(!e)return;e.innerHTML=\"\";let t=a.BT,n=a.vW;\"next-week\"===a.sw&&(t++,t>52&&(t=1,n++));const s=a.p_.flatMap(e=>e.days||[]).filter(e=>{const a=new Date(e.date);return(0,o.sn)(a)===t&&(0,o.Ao)(a)===n});if(0===s.length)return e.innerHTML=`\\n
`);const n={};e.forEach(e=>{const t=new Date(e.date),s=t.getFullYear(),i=t.getMonth(),r=`${s}-${i.toString().padStart(2,\"0\")}`,l=\"en\"===a.Kl?\"en-US\":\"de-AT\",d=t.toLocaleString(l,{month:\"long\"}),c=(0,o.sn)(t);n[s]||(n[s]={year:s,months:{}}),n[s].months[r]||(n[s].months[r]={name:d,year:s,monthIndex:i,count:0,total:0,weeks:{}}),n[s].months[r].weeks[c]||(n[s].months[r].weeks[c]={label:\"en\"===a.Kl?`CW ${c}`:`KW ${c}`,items:[],count:0,total:0});(e.items||[]).forEach(t=>{const a=parseFloat(t.price||e.total||0);n[s].months[r].weeks[c].items.push({date:e.date,name:t.name||\"Men\u00fc\",price:a,state:e.order_state}),9!==e.order_state&&(n[s].months[r].weeks[c].count++,n[s].months[r].weeks[c].total+=a,n[s].months[r].count++,n[s].months[r].total+=a)})}),t.innerHTML=\"\";Object.keys(n).sort((e,t)=>t-e).forEach(e=>{const o=n[e],s=document.createElement(\"div\");s.className=\"history-year-group\";const i=document.createElement(\"h2\");i.className=\"history-year-header\",i.textContent=o.year,s.appendChild(i);Object.keys(o.months).sort((e,t)=>t.localeCompare(e)).forEach(e=>{const t=o.months[e],n=document.createElement(\"div\");n.className=\"history-month-group\";const i=document.createElement(\"div\");i.className=\"history-month-header\",i.setAttribute(\"tabindex\",\"0\"),i.setAttribute(\"role\",\"button\"),i.setAttribute(\"aria-expanded\",\"false\"),i.setAttribute(\"title\",(0,l.t)(\"historyMonthToggle\"));const r=document.createElement(\"div\");r.style.display=\"flex\",r.style.flexDirection=\"column\",r.style.gap=\"4px\";const d=document.createElement(\"span\");d.textContent=t.name,r.appendChild(d);const c=document.createElement(\"div\");c.className=\"history-month-summary\";const u=document.createElement(\"span\");u.innerHTML=`${t.count} ${(0,l.t)(\"orders\")} • \u20ac${t.total.toFixed(2)}`,c.appendChild(u),r.appendChild(c),i.appendChild(r);const g=document.createElement(\"span\");g.className=\"material-icons-round\",g.textContent=\"expand_more\",i.appendChild(g),i.addEventListener(\"click\",()=>{const e=i.parentElement;e.classList.contains(\"open\")?(e.classList.remove(\"open\"),i.setAttribute(\"aria-expanded\",\"false\")):(e.classList.add(\"open\"),i.setAttribute(\"aria-expanded\",\"true\"))}),n.appendChild(i);const m=document.createElement(\"div\");m.className=\"history-month-content\";Object.keys(t.weeks).sort((e,t)=>parseInt(t)-parseInt(e)).forEach(e=>{const n=t.weeks[e],o=document.createElement(\"div\");o.className=\"history-week-group\";const s=document.createElement(\"div\");s.className=\"history-week-header\";const i=document.createElement(\"strong\");i.textContent=n.label,s.appendChild(i);const r=document.createElement(\"span\");r.innerHTML=`${n.count} ${(0,l.t)(\"orders\")} • \u20ac${n.total.toFixed(2)}`,s.appendChild(r),o.appendChild(s),n.items.forEach(e=>{const t=new Date(e.date),n=\"en\"===a.Kl?\"en-US\":\"de-AT\",s=t.toLocaleDateString(n,{weekday:\"short\",day:\"2-digit\",month:\"2-digit\"}),i=document.createElement(\"div\");i.className=\"history-item\",9===e.state&&i.classList.add(\"history-item-cancelled\");const r=document.createElement(\"div\");r.style.fontSize=\"0.85rem\",r.style.color=\"var(--text-secondary)\",r.textContent=s,i.appendChild(r);const d=document.createElement(\"div\");d.className=\"history-item-details\";const c=document.createElement(\"span\");c.className=\"history-item-name\",c.textContent=e.name,d.appendChild(c);const u=document.createElement(\"div\"),g=document.createElement(\"span\");g.className=\"history-item-status\",9===e.state?g.textContent=(0,l.t)(\"stateCancelled\"):8===e.state?g.textContent=(0,l.t)(\"stateCompleted\"):g.textContent=(0,l.t)(\"stateTransferred\"),u.appendChild(g),d.appendChild(u),i.appendChild(d);const m=document.createElement(\"div\");m.className=\"history-item-price\",9===e.state&&m.classList.add(\"history-item-price-cancelled\"),m.textContent=`\u20ac${e.price.toFixed(2)}`,i.appendChild(m),o.appendChild(i)}),m.appendChild(o)}),n.appendChild(m),s.appendChild(n)}),t.appendChild(s)})}async function h(e,t,n,o,r){if(a.gX)try{const c=await fetch(`${s.tE}/auth/user/`,{headers:(0,i.H)(a.gX)});if(!c.ok)return void H(\"Fehler: Benutzerdaten konnten nicht geladen werden\",\"error\");const g=await c.json(),m=(new Date).toISOString(),h={uuid:crypto.randomUUID(),created:m,updated:m,order_type:7,items:[{article:t,course_group:null,modifiers:[],uuid:crypto.randomUUID(),name:n,description:r||\"\",price:String(parseFloat(o)),amount:1,vat:\"10.00\",comment:\"\"}],table:null,total:parseFloat(o),tip:0,currency:\"EUR\",venue:s.eW,states:[],order_state:1,date:`${e}T10:30:00Z`,payment_method:\"payroll\",customer:{first_name:g.first_name,last_name:g.last_name,email:g.email,newsletter:!1},preorder:!0,delivery_fee:0,cash_box_table_name:null,take_away:!1},p=await fetch(`${s.tE}/user/orders/`,{method:\"POST\",headers:(0,i.H)(a.gX),body:JSON.stringify(h)});if(p.ok||201===p.status)H(`${(0,l.t)(\"orderSuccess\")}: ${n}`,\"success\"),d=null,await u();else{const e=await p.json();H(`Fehler: ${e.detail||e.non_field_errors?.[0]||\"Bestellung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Order error:\",e),H(\"Netzwerkfehler bei Bestellung\",\"error\")}}async function p(e,t,n){if(!a.gX)return;const o=`${e}_${t}`,r=a.L.get(o);if(!r||0===r.length)return;const c=r[r.length-1];try{const e=await fetch(`${s.tE}/user/orders/${c}/cancel/`,{method:\"PATCH\",headers:(0,i.H)(a.gX),body:JSON.stringify({})});if(e.ok)H(`${(0,l.t)(\"cancelSuccess\")}: ${n}`,\"success\"),d=null,await u();else{H(`Fehler: ${(await e.json()).detail||\"Stornierung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Cancel error:\",e),H(\"Netzwerkfehler bei Stornierung\",\"error\")}}function f(){localStorage.setItem(\"kantine_flags\",JSON.stringify([...a.BY]))}async function v(){if(0===a.BY.size)return;const e=a.gX||s.f9,t=new Set;for(const e of a.BY){const[n]=e.split(\"_\");t.add(n)}let n=!1;const o=document.getElementById(\"alarm-bell\");o&&o.classList.add(\"refreshing\");try{for(const o of t)try{const t=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${o}/`,{headers:(0,i.H)(e)});if(!t.ok)continue;const r=(await t.json()).results||[],l=new Map;for(const e of r)if(e.items&&Array.isArray(e.items))for(const t of e.items)l.set(t.id,t);for(let e of a.p_){if(!e.days)continue;const t=e.days.find(e=>e.date===o);if(t&&t.items)for(let e=0;e0;s.available=e||t,s.availableAmount=parseInt(r.available_amount)||0,s.amountTracking=!1!==r.amount_tracking,n=!0}}}}catch(e){console.error(\"Error refreshing flag date\",o,e)}n&&B(),localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)(),(0,r.OR)(),H(`${a.BY.size} ${1===a.BY.size?(0,l.t)(\"menuSingular\"):(0,l.t)(\"menuPlural\")} ${(0,l.t)(\"menuChecked\")}`,\"info\")}finally{o&&o.classList.remove(\"refreshing\")}}function y(e,t,n,o){const s=`${e}_${t}`;let i=!1;a.BY.has(s)?(a.BY.delete(s),H(`${(0,l.t)(\"flagRemoved\")} ${n}`,\"success\")):(a.BY.add(s),i=!0,H(`${(0,l.t)(\"flagActivated\")} ${n}`,\"success\"),\"default\"===Notification.permission&&Notification.requestPermission()),f(),(0,r.Mb)(),(0,r.OR)(),i&&v()}function b(){const e=new Date,t=e.toISOString().split(\"T\")[0];let n=!1;for(const o of[...a.BY]){const[s]=o.split(\"_\");let i=!1;if(s=t&&(i=!0)}i&&(a.BY.delete(o),n=!0)}n&&f()}function w(){a.K8||a.gX&&(0,a.cc)(setInterval(()=>async function(){if(0===a.BY.size||!a.gX)return;for(const e of a.BY){const[t,n]=e.split(\"_\"),o=parseInt(n);try{const e=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(a.gX)});if(!e.ok)continue;const n=(await e.json()).results||[];let r=null;for(const e of n)if(e.items&&(r=e.items.find(e=>e.id===o||e.article===o),r))break;if(r){if(!1===r.amount_tracking||parseInt(r.available_amount)>0){const e=r.name||\"Unbekannt\";H(`${e} ist jetzt verf\u00fcgbar!`,\"success\"),\"granted\"===Notification.permission&&new Notification(\"Kantine Wrapper\",{body:`${e} ist jetzt verf\u00fcgbar!`,icon:\"\ud83c\udf7d\ufe0f\"}),O()}}}catch(t){console.error(`Poll error for ${e}:`,t),await new Promise(e=>setTimeout(e,200))}}localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)()}(),s.fv))}function E(){a.K8&&(clearInterval(a.K8),(0,a.cc)(null))}function A(){localStorage.setItem(\"kantine_highlightTags\",JSON.stringify(a.yz)),(0,r.OR)(),(0,r.gJ)()}function k(e){if((e=e.trim().toLowerCase())&&!a.yz.includes(e)){const t=[...a.yz,e];return(0,a.iw)(t),A(),!0}return!1}function L(){const e=document.getElementById(\"tags-list\");e.innerHTML=\"\",a.yz.forEach(t=>{const n=document.createElement(\"span\");n.className=\"tag-badge\",n.innerHTML=`${t} ×`,e.appendChild(n)}),e.querySelectorAll(\".tag-remove\").forEach(e=>{e.addEventListener(\"click\",e=>{!function(e){const t=a.yz.filter(t=>t!==e);(0,a.iw)(t),A()}(e.target.dataset.tag),L()})})}function S(e){return e?(e=e.toLowerCase(),a.yz.filter(t=>e.includes(t))):[]}const I=\"kantine_menuCache\",C=\"kantine_menuCacheTs\";function B(){try{localStorage.setItem(I,JSON.stringify(a.p_)),localStorage.setItem(C,(new Date).toISOString())}catch(e){console.warn(\"Failed to cache menu data:\",e)}}function T(){try{const e=localStorage.getItem(I),t=localStorage.getItem(C);if(e){(0,a.tn)(JSON.parse(e)),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),t&&N(t);try{const e=new Set;a.p_.forEach(t=>{(t.days||[]).forEach(t=>{(t.items||[]).forEach(t=>{let n=(t.description||\"\").replace(/\\s+/g,\" \").trim();n&&n.includes(\" / \")&&e.add(n)})})})}catch(e){}return!0}}catch(e){console.warn(\"Failed to load cached menu:\",e)}return!1}function D(){const e=localStorage.getItem(C);if(!e)return!1;if(Date.now()-new Date(e).getTime()>36e5)return!1;const t=(0,o.sn)(new Date),n=(0,o.Ao)(new Date);return a.p_.some(e=>e.weekNumber===t&&e.year===n&&e.days&&e.days.length>0)}async function O(){const e=document.getElementById(\"loading\"),t=document.getElementById(\"progress-modal\"),l=document.getElementById(\"progress-fill\"),d=document.getElementById(\"progress-percent\"),u=document.getElementById(\"progress-message\");e.classList.remove(\"hidden\");const g=a.gX||s.f9;try{t.classList.remove(\"hidden\"),u.textContent=\"Hole verf\u00fcgbare Daten...\",l.style.width=\"0%\",d.textContent=\"0%\";const e=await fetch(`${s.tE}/venues/${s.eW}/menu/dates/`,{headers:(0,i.H)(g)});if(!e.ok)throw new Error(`Failed to fetch dates: ${e.status}`);let n=(await e.json()).results||[];const m=new Date;m.setDate(m.getDate()-7);const h=m.toISOString().split(\"T\")[0];n=n.filter(e=>e.date>=h).sort((e,t)=>e.date.localeCompare(t.date)).slice(0,30);const p=n.length;u.textContent=`${p} Tage gefunden. Lade Details...`;const f=[];let v=0;const y=5;for(let e=0;e
{const t=e.date;let n=null;try{const a=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(g)});if(a.ok){const o=(await a.json()).results||[];let s=[];for(const e of o)e.items&&Array.isArray(e.items)&&(s=s.concat(e.items));s.length>0&&(n={date:t,menu_items:s,orders:e.orders||[]})}}catch(e){console.error(`Failed to fetch details for ${t}:`,e)}finally{v++;const e=Math.round(v/p*100);l.style.width=`${e}%`,d.textContent=`${e}%`,u.textContent=`Lade Men\u00fc f\u00fcr ${t}...`}return n}));for(const e of a)e&&f.push(e)}const b=new Map;a.p_&&a.p_.length>0&&a.p_.forEach(e=>{const t=`${e.year}-${e.weekNumber}`;try{b.set(t,{year:e.year,weekNumber:e.weekNumber,days:e.days?e.days.map(e=>({...e,items:e.items?[...e.items]:[]})):[]})}catch(e){console.warn(\"Error hydrating week:\",e)}});for(const e of f){const t=new Date(e.date),n=(0,o.sn)(t),a=(0,o.Ao)(t),s=`${a}-${n}`;b.has(s)||b.set(s,{year:a,weekNumber:n,days:[]});const i=b.get(s),r=t.toLocaleDateString(\"en-US\",{weekday:\"long\"}),l=new Date(e.date);l.setHours(10,0,0,0);const d={date:e.date,weekday:r,orderCutoff:l.toISOString(),items:e.menu_items.map(t=>{const n=!1===t.amount_tracking,a=parseInt(t.available_amount)>0;return{id:`${e.date}_${t.id}`,articleId:t.id,name:t.name||\"Unknown\",description:t.description||\"\",price:parseFloat(t.price)||0,available:n||a,availableAmount:parseInt(t.available_amount)||0,amountTracking:!1!==t.amount_tracking}})},c=i.days.findIndex(t=>t.date===e.date);c>=0?i.days[c]=d:i.days.push(d)}const w=Array.from(b.values()).sort((e,t)=>e.year!==t.year?e.year-t.year:e.weekNumber-t.weekNumber);w.forEach(e=>{e.days&&e.days.sort((e,t)=>e.date.localeCompare(t.date))}),(0,a.tn)(w),B(),N((new Date).toISOString()),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),c(),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),u.textContent=\"Fertig!\",setTimeout(()=>t.classList.add(\"hidden\"),500)}catch(e){console.error(\"Error fetching menu:\",e),t.classList.add(\"hidden\"),Promise.resolve().then(n.bind(n,842)).then(t=>{t.showErrorModal(\"Keine Verbindung\",`Die Men\u00fcdaten konnten nicht geladen werden. M\u00f6glicherweise besteht keine Verbindung zur API oder zur Bessa-Webseite.
${(0,o.ZD)(e.message)}`,\"Zur Original-Seite\",\"https://web.bessa.app/knapp-kantine\")})}finally{e.classList.add(\"hidden\")}}let M=null,x=null;function N(e){const t=document.getElementById(\"last-updated-subtitle\");if(e){M=e,localStorage.setItem(\"kantine_last_updated\",e),localStorage.setItem(\"kantine_last_checked\",e);try{const n=new Date(e),a=n.toLocaleTimeString(\"de-DE\",{hour:\"2-digit\",minute:\"2-digit\"}),s=n.toLocaleDateString(\"de-DE\",{day:\"2-digit\",month:\"2-digit\"}),i=(0,o.gs)(n);t.textContent=`Aktualisiert: ${s} ${a} (${i})`}catch(e){t.textContent=\"\"}x||(x=setInterval(()=>{M&&(N(M),(0,r.Mb)())},6e4))}}function H(e,t=\"info\"){let n=document.getElementById(\"toast-container\");n||(n=document.createElement(\"div\"),n.id=\"toast-container\",document.body.appendChild(n));const a=document.createElement(\"div\");a.className=`toast toast-${t}`;const s=\"success\"===t?\"check_circle\":\"error\"===t?\"error\":\"info\";a.innerHTML=`${s}${(0,o.ZD)(e)}`,n.appendChild(a),requestAnimationFrame(()=>a.classList.add(\"show\")),setTimeout(()=>{a.classList.remove(\"show\"),setTimeout(()=>a.remove(),300)},3e3)}},672(e,t,n){n.d(t,{H:()=>o,O:()=>s});var a=n(521);function o(e){return{Authorization:`Token ${e||a.f9}`,Accept:\"application/json\",\"Content-Type\":\"application/json\",\"X-Client-Version\":a.fZ}}function s(){return{Accept:\"application/vnd.github.v3+json\"}}},521(e,t,n){n.d(t,{LS:()=>g,YU:()=>r,d_:()=>u,eW:()=>i,f9:()=>o,fZ:()=>s,fv:()=>l,pe:()=>c,tE:()=>a});const a=\"https://api.bessa.app/v1\",o=\"c3418725e95a9f90e3645cbc846b4d67c7c66131\",s=\"v1.6.18\",i=591,r=7,l=3e5,d=\"TauNeutrino/kantine-overview\",c=`https://api.github.com/repos/${d}`,u=`https://htmlpreview.github.io/?https://github.com/${d}/blob`,g={AUTH_TOKEN:\"kantine_authToken\",CURRENT_USER:\"kantine_currentUser\",FIRST_NAME:\"kantine_firstName\",LAST_NAME:\"kantine_lastName\",LANG:\"kantine_lang\",FLAGS:\"kantine_flags\",FLAGGED_LAST_CHECKED:\"kantine_flagged_items_last_checked\",LAST_CHECKED:\"kantine_last_checked\",MENU_CACHE:\"kantine_menuCache\",MENU_CACHE_TS:\"kantine_menuCacheTs\",HISTORY_CACHE:\"kantine_history_cache\",HIGHLIGHT_TAGS:\"kantine_highlightTags\",LAST_UPDATED:\"kantine_last_updated\",VERSION_CACHE:\"kantine_version_cache\",DEV_MODE:\"kantine_dev_mode\"}},646(e,t,n){n.d(t,{t:()=>s});var a=n(901);const o={de:{thisWeek:\"Diese Woche\",nextWeek:\"N\u00e4chste Woche\",nextWeekTooltipDefault:\"Men\u00fc n\u00e4chster Woche anzeigen\",thisWeekTooltip:\"Men\u00fc dieser Woche anzeigen\",appTitle:\"Kantinen \u00dcbersicht\",updatedAt:\"Aktualisiert\",langTooltip:\"Sprache der Men\u00fcbeschreibung\",weekLabel:\"Woche\",refresh:\"Men\u00fcdaten neu laden\",history:\"Bestellhistorie\",highlights:\"Pers\u00f6nliche Highlights verwalten\",themeTooltip:\"Erscheinungsbild (Hell/Dunkel) wechseln\",login:\"Anmelden\",loginTooltip:\"Mit Bessa.app Account anmelden\",logout:\"Abmelden\",logoutTooltip:\"Von Bessa.app abmelden\",loginTitle:\"Login\",employeeId:\"Mitarbeiternummer\",employeeIdPlaceholder:\"z.B. 2041\",employeeIdHelp:\"Deine offizielle Knapp Mitarbeiternummer.\",password:\"Passwort\",passwordPlaceholder:\"Bessa Passwort\",passwordHelp:\"Das Passwort f\u00fcr deinen Bessa Account.\",loginButton:\"Einloggen\",loggingIn:\"Wird eingeloggt...\",highlightsTitle:\"Meine Highlights\",highlightsDesc:\"Markiere Men\u00fcs automatisch, wenn sie diese Schlagw\u00f6rter enthalten.\",tagInputPlaceholder:\"z.B. Schnitzel, Vegetarisch...\",tagInputTooltip:\"Neues Schlagwort zum Hervorheben eingeben\",addTag:\"Hinzuf\u00fcgen\",addTagTooltip:\"Schlagwort zur Liste hinzuf\u00fcgen\",removeTagTooltip:\"Schlagwort entfernen\",historyTitle:\"Bestellhistorie\",loadingHistory:\"Lade Historie...\",noOrders:\"Keine Bestellungen gefunden.\",orders:\"Bestellungen\",historyMonthToggle:\"Klicken, um die Bestellungen f\u00fcr diesen Monat ein-/auszublenden\",available:\"Verf\u00fcgbar\",soldOut:\"Ausverkauft\",ordered:\"Bestellt\",orderButton:\"Bestellen\",orderAgainTooltip:\"nochmal bestellen\",orderTooltip:\"bestellen\",cancelOrder:\"Bestellung stornieren\",cancelOneOrder:\"Eine Bestellung stornieren\",flagActivate:\"Benachrichtigen wenn verf\u00fcgbar\",flagDeactivate:\"Benachrichtigung deaktivieren\",alarmTooltipNone:\"Keine beobachteten Men\u00fcs\",alarmLastChecked:\"Zuletzt gepr\u00fcft\",versionsTitle:\"\ud83d\udce6 Versionen\",currentVersion:\"Aktuell\",devModeLabel:\"Dev-Mode (alle Tags anzeigen)\",loadingVersions:\"Lade Versionen...\",noVersions:\"Keine Versionen gefunden.\",installed:\"\u2713 Installiert\",newVersion:\"\u2b06 Neu!\",installLink:\"Installieren\",reportBug:\"Fehler melden\",reportBugTooltip:\"Melde einen Fehler auf GitHub\",featureRequest:\"Feature vorschlagen\",featureRequestTooltip:\"Schlage ein neues Feature auf GitHub vor\",clearCache:\"Lokalen Cache leeren\",clearCacheTooltip:\"L\u00f6scht alle lokalen Daten & erzwingt einen Neuladen\",clearCacheConfirm:\"M\u00f6chtest du wirklich alle lokalen Daten (inkl. Login-Session, Cache und Einstellungen) l\u00f6schen? Die Seite wird danach neu geladen.\",versionMenuTooltip:\"Klick f\u00fcr Versionsmen\u00fc\",progressTitle:\"Men\u00fcdaten aktualisieren\",progressInit:\"Initialisierung...\",noMenuData:\"Keine Men\u00fcdaten f\u00fcr KW\",noMenuDataHint:\"Versuchen Sie eine andere Woche oder schauen Sie sp\u00e4ter vorbei.\",costLabel:\"Gesamt\",orderDeadline:\"Bestellschluss\",flagRemoved:\"Flag entfernt f\u00fcr\",flagActivated:\"Benachrichtigung aktiviert f\u00fcr\",menuChecked:\"gepr\u00fcft\",menuSingular:\"Men\u00fc\",menuPlural:\"Men\u00fcs\",newMenuDataAvailable:\"Neue Men\u00fcdaten f\u00fcr n\u00e4chste Woche verf\u00fcgbar!\",orderSuccess:\"Bestellt\",cancelSuccess:\"Storniert\",bgSyncFailed:\"Hintergrund-Synchronisation fehlgeschlagen\",historyLoadError:\"Fehler beim Laden der Historie.\",historyLoadingFull:\"Lade Bestellhistorie...\",historyLoadingDelta:\"Suche nach neuen Bestellungen...\",historyLoadingItem:\"Lade Bestellung\",historyLoadingOf:\"von\",historyLoadingNew:\"neue/ge\u00e4nderte Bestellungen gefunden...\",badgeOrdered:\"bestellt\",badgeOrderable:\"bestellbar\",badgeTotal:\"gesamt\",badgeHighlights:\"Highlights gefunden\",stateCancelled:\"Storniert\",stateCompleted:\"Abgeschlossen\",stateTransferred:\"\u00dcbertragen\",close:\"Schlie\u00dfen\",noConnection:\"Keine Verbindung\",toOriginalPage:\"Zur Original-Seite\",loggedIn:\"Angemeldet\"},en:{thisWeek:\"This Week\",nextWeek:\"Next Week\",nextWeekTooltipDefault:\"Show next week's menu\",thisWeekTooltip:\"Show this week's menu\",appTitle:\"Canteen Overview\",updatedAt:\"Updated\",langTooltip:\"Menu description language\",weekLabel:\"Week\",refresh:\"Reload menu data\",history:\"Order history\",highlights:\"Manage personal highlights\",themeTooltip:\"Toggle appearance (Light/Dark)\",login:\"Sign in\",loginTooltip:\"Sign in with Bessa.app account\",logout:\"Sign out\",logoutTooltip:\"Sign out from Bessa.app\",loginTitle:\"Login\",employeeId:\"Employee ID\",employeeIdPlaceholder:\"e.g. 2041\",employeeIdHelp:\"Your official Knapp employee number.\",password:\"Password\",passwordPlaceholder:\"Bessa password\",passwordHelp:\"The password for your Bessa account.\",loginButton:\"Log in\",loggingIn:\"Logging in...\",highlightsTitle:\"My Highlights\",highlightsDesc:\"Automatically highlight menus containing these keywords.\",tagInputPlaceholder:\"e.g. Schnitzel, Vegetarian...\",tagInputTooltip:\"Enter new keyword to highlight\",addTag:\"Add\",addTagTooltip:\"Add keyword to list\",removeTagTooltip:\"Remove keyword\",historyTitle:\"Order History\",loadingHistory:\"Loading history...\",noOrders:\"No orders found.\",orders:\"Orders\",historyMonthToggle:\"Click to expand/collapse orders for this month\",available:\"Available\",soldOut:\"Sold out\",ordered:\"Ordered\",orderButton:\"Order\",orderAgainTooltip:\"order again\",orderTooltip:\"order\",cancelOrder:\"Cancel order\",cancelOneOrder:\"Cancel one order\",flagActivate:\"Notify when available\",flagDeactivate:\"Deactivate notification\",alarmTooltipNone:\"No flagged menus\",alarmLastChecked:\"Last checked\",versionsTitle:\"\ud83d\udce6 Versions\",currentVersion:\"Current\",devModeLabel:\"Dev mode (show all tags)\",loadingVersions:\"Loading versions...\",noVersions:\"No versions found.\",installed:\"\u2713 Installed\",newVersion:\"\u2b06 New!\",installLink:\"Install\",reportBug:\"Report a bug\",reportBugTooltip:\"Report a bug on GitHub\",featureRequest:\"Request a feature\",featureRequestTooltip:\"Suggest a new feature on GitHub\",clearCache:\"Clear local cache\",clearCacheTooltip:\"Deletes all local data & forces a reload\",clearCacheConfirm:\"Do you really want to delete all local data (including login session, cache, and settings)? The page will reload afterwards.\",versionMenuTooltip:\"Click for version menu\",progressTitle:\"Updating menu data\",progressInit:\"Initializing...\",noMenuData:\"No menu data for CW\",noMenuDataHint:\"Try another week or check back later.\",costLabel:\"Total\",orderDeadline:\"Order deadline\",flagRemoved:\"Flag removed for\",flagActivated:\"Notification activated for\",menuChecked:\"checked\",menuSingular:\"menu\",menuPlural:\"menus\",newMenuDataAvailable:\"New menu data available for next week!\",orderSuccess:\"Ordered\",cancelSuccess:\"Cancelled\",bgSyncFailed:\"Background synchronisation failed\",historyLoadError:\"Error loading history.\",historyLoadingFull:\"Loading order history...\",historyLoadingDelta:\"Checking for new orders...\",historyLoadingItem:\"Loading order\",historyLoadingOf:\"of\",historyLoadingNew:\"new/updated orders found...\",badgeOrdered:\"ordered\",badgeOrderable:\"orderable\",badgeTotal:\"total\",badgeHighlights:\"highlights found\",stateCancelled:\"Cancelled\",stateCompleted:\"Completed\",stateTransferred:\"Transferred\",close:\"Close\",noConnection:\"No connection\",toOriginalPage:\"Go to original page\",loggedIn:\"Logged in\"}};function s(e){const t=\"en\"===a.Kl?\"en\":\"de\";return o[t][e]||o.de[e]||e}},901(e,t,n){n.d(t,{BT:()=>i,BY:()=>g,K8:()=>m,Kl:()=>h,L:()=>u,Ny:()=>c,O5:()=>b,UD:()=>S,Xt:()=>v,cc:()=>A,di:()=>E,gX:()=>d,iw:()=>k,lt:()=>w,pK:()=>y,p_:()=>s,qo:()=>L,sw:()=>l,tn:()=>f,vW:()=>r,yz:()=>p});var a=n(413),o=n(521);let s=[],i=(0,a.sn)(new Date),r=(new Date).getFullYear(),l=\"this-week\",d=localStorage.getItem(o.LS.AUTH_TOKEN),c=localStorage.getItem(o.LS.CURRENT_USER),u=new Map,g=new Set(JSON.parse(localStorage.getItem(o.LS.FLAGS)||\"[]\")),m=null,h=localStorage.getItem(o.LS.LANG)||\"de\",p=JSON.parse(localStorage.getItem(o.LS.HIGHLIGHT_TAGS)||\"[]\");function f(e){s=e}function v(e){i=e}function y(e){r=e}function b(e){d=e}function w(e){c=e}function E(e){u=e}function A(e){m=e}function k(e){p=e}function L(e){\"this-week\"===e||\"next-week\"===e?l=e:console.warn(`[state] Invalid displayMode: \"${e}\". Ignoring.`)}function S(e){[\"de\",\"en\",\"all\"].includes(e)?h=e:console.warn(`[state] Invalid langMode: \"${e}\". Ignoring.`)}},842(e,t,n){n.d(t,{Gk:()=>m,Mb:()=>v,OR:()=>c,Ux:()=>g,gJ:()=>d,showErrorModal:()=>f});var a=n(901),o=n(413),s=n(521),i=n(672),r=n(367),l=n(646);function d(){const e=document.getElementById(\"btn-next-week\");let t=a.BT+1,n=a.vW;t>52&&(t=1,n++);const o=a.p_.find(e=>e.weekNumber===t&&e.year===n);let s=0,i=0,d=0,c=0;o&&o.days&&o.days.forEach(e=>{if(e.items&&e.items.length>0){s++;const t=e.items.some(e=>e.available);t&&i++;let n=!1;e.items.forEach(t=>{const o=t.articleId||parseInt(t.id.split(\"_\")[1]),s=`${e.date}_${o}`;a.L.has(s)&&a.L.get(s).length>0&&(n=!0)}),n&&d++;const o=new Date(e.date).getDay();o>=1&&o<=4&&t&&!n&&c++}});const u=e.querySelector(\".nav-badge\");if(u&&u.remove(),s>0){let a=0;o&&o.days&&o.days.forEach(e=>{e.items.forEach(e=>{const t=(0,r.BM)(e.name),n=(0,r.BM)(e.description);(t.length>0||n.length>0)&&a++})});let u=[`${d} ${(0,l.t)(\"badgeOrdered\")} / ${i} ${(0,l.t)(\"badgeOrderable\")} / ${s} ${(0,l.t)(\"badgeTotal\")}`];if(a>0&&u.push(`${a} ${(0,l.t)(\"badgeHighlights\")}`),e.title=u.join(\" \u2022 \"),c>0){e.classList.add(\"new-week-available\");const a=`kantine_notified_nextweek_${n}_${t}`;localStorage.getItem(a)||(localStorage.setItem(a,\"true\"),(0,r.P0)((0,l.t)(\"newMenuDataAvailable\"),\"info\"))}else e.classList.remove(\"new-week-available\")}else e.title=(0,l.t)(\"nextWeekTooltipDefault\"),e.classList.remove(\"new-week-available\")}function c(){const e=document.getElementById(\"menu-container\");if(!e)return;e.innerHTML=\"\";let t=a.BT,n=a.vW;\"next-week\"===a.sw&&(t++,t>52&&(t=1,n++));const s=a.p_.flatMap(e=>e.days||[]).filter(e=>{const a=new Date(e.date);return(0,o.sn)(a)===t&&(0,o.Ao)(a)===n});if(0===s.length)return e.innerHTML=`\\n
`);const n={};e.forEach(e=>{const t=new Date(e.date),s=t.getFullYear(),i=t.getMonth(),r=`${s}-${i.toString().padStart(2,\"0\")}`,l=\"en\"===a.Kl?\"en-US\":\"de-AT\",d=t.toLocaleString(l,{month:\"long\"}),c=(0,o.sn)(t);n[s]||(n[s]={year:s,months:{}}),n[s].months[r]||(n[s].months[r]={name:d,year:s,monthIndex:i,count:0,total:0,weeks:{}}),n[s].months[r].weeks[c]||(n[s].months[r].weeks[c]={label:\"en\"===a.Kl?`CW ${c}`:`KW ${c}`,items:[],count:0,total:0});(e.items||[]).forEach(t=>{const a=parseFloat(t.price||e.total||0);n[s].months[r].weeks[c].items.push({date:e.date,name:t.name||\"Men\u00fc\",price:a,state:e.order_state}),9!==e.order_state&&(n[s].months[r].weeks[c].count++,n[s].months[r].weeks[c].total+=a,n[s].months[r].count++,n[s].months[r].total+=a)})}),t.innerHTML=\"\";Object.keys(n).sort((e,t)=>t-e).forEach(e=>{const o=n[e],s=document.createElement(\"div\");s.className=\"history-year-group\";const i=document.createElement(\"h2\");i.className=\"history-year-header\",i.textContent=o.year,s.appendChild(i);Object.keys(o.months).sort((e,t)=>t.localeCompare(e)).forEach(e=>{const t=o.months[e],n=document.createElement(\"div\");n.className=\"history-month-group\";const i=document.createElement(\"div\");i.className=\"history-month-header\",i.setAttribute(\"tabindex\",\"0\"),i.setAttribute(\"role\",\"button\"),i.setAttribute(\"aria-expanded\",\"false\"),i.setAttribute(\"title\",(0,l.t)(\"historyMonthToggle\"));const r=document.createElement(\"div\");r.style.display=\"flex\",r.style.flexDirection=\"column\",r.style.gap=\"4px\";const d=document.createElement(\"span\");d.textContent=t.name,r.appendChild(d);const c=document.createElement(\"div\");c.className=\"history-month-summary\";const u=document.createElement(\"span\");u.innerHTML=`${t.count} ${(0,l.t)(\"orders\")} • \u20ac${t.total.toFixed(2)}`,c.appendChild(u),r.appendChild(c),i.appendChild(r);const g=document.createElement(\"span\");g.className=\"material-icons-round\",g.textContent=\"expand_more\",i.appendChild(g),i.addEventListener(\"click\",()=>{const e=i.parentElement;e.classList.contains(\"open\")?(e.classList.remove(\"open\"),i.setAttribute(\"aria-expanded\",\"false\")):(e.classList.add(\"open\"),i.setAttribute(\"aria-expanded\",\"true\"))}),n.appendChild(i);const m=document.createElement(\"div\");m.className=\"history-month-content\";Object.keys(t.weeks).sort((e,t)=>parseInt(t)-parseInt(e)).forEach(e=>{const n=t.weeks[e],o=document.createElement(\"div\");o.className=\"history-week-group\";const s=document.createElement(\"div\");s.className=\"history-week-header\";const i=document.createElement(\"strong\");i.textContent=n.label,s.appendChild(i);const r=document.createElement(\"span\");r.innerHTML=`${n.count} ${(0,l.t)(\"orders\")} • \u20ac${n.total.toFixed(2)}`,s.appendChild(r),o.appendChild(s),n.items.forEach(e=>{const t=new Date(e.date),n=\"en\"===a.Kl?\"en-US\":\"de-AT\",s=t.toLocaleDateString(n,{weekday:\"short\",day:\"2-digit\",month:\"2-digit\"}),i=document.createElement(\"div\");i.className=\"history-item\",9===e.state&&i.classList.add(\"history-item-cancelled\");const r=document.createElement(\"div\");r.style.fontSize=\"0.85rem\",r.style.color=\"var(--text-secondary)\",r.textContent=s,i.appendChild(r);const d=document.createElement(\"div\");d.className=\"history-item-details\";const c=document.createElement(\"span\");c.className=\"history-item-name\",c.textContent=e.name,d.appendChild(c);const u=document.createElement(\"div\"),g=document.createElement(\"span\");g.className=\"history-item-status\",9===e.state?g.textContent=(0,l.t)(\"stateCancelled\"):8===e.state?g.textContent=(0,l.t)(\"stateCompleted\"):g.textContent=(0,l.t)(\"stateTransferred\"),u.appendChild(g),d.appendChild(u),i.appendChild(d);const m=document.createElement(\"div\");m.className=\"history-item-price\",9===e.state&&m.classList.add(\"history-item-price-cancelled\"),m.textContent=`\u20ac${e.price.toFixed(2)}`,i.appendChild(m),o.appendChild(i)}),m.appendChild(o)}),n.appendChild(m),s.appendChild(n)}),t.appendChild(s)})}async function h(e,t,n,o,r){if(a.gX)try{const c=await fetch(`${s.tE}/auth/user/`,{headers:(0,i.H)(a.gX)});if(!c.ok)return void H(\"Fehler: Benutzerdaten konnten nicht geladen werden\",\"error\");const g=await c.json(),m=(new Date).toISOString(),h={uuid:crypto.randomUUID(),created:m,updated:m,order_type:7,items:[{article:t,course_group:null,modifiers:[],uuid:crypto.randomUUID(),name:n,description:r||\"\",price:String(parseFloat(o)),amount:1,vat:\"10.00\",comment:\"\"}],table:null,total:parseFloat(o),tip:0,currency:\"EUR\",venue:s.eW,states:[],order_state:1,date:`${e}T10:30:00Z`,payment_method:\"payroll\",customer:{first_name:g.first_name,last_name:g.last_name,email:g.email,newsletter:!1},preorder:!0,delivery_fee:0,cash_box_table_name:null,take_away:!1},p=await fetch(`${s.tE}/user/orders/`,{method:\"POST\",headers:(0,i.H)(a.gX),body:JSON.stringify(h)});if(p.ok||201===p.status)H(`${(0,l.t)(\"orderSuccess\")}: ${n}`,\"success\"),d=null,await u();else{const e=await p.json();H(`Fehler: ${e.detail||e.non_field_errors?.[0]||\"Bestellung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Order error:\",e),H(\"Netzwerkfehler bei Bestellung\",\"error\")}}async function p(e,t,n){if(!a.gX)return;const o=`${e}_${t}`,r=a.L.get(o);if(!r||0===r.length)return;const c=r[r.length-1];try{const e=await fetch(`${s.tE}/user/orders/${c}/cancel/`,{method:\"PATCH\",headers:(0,i.H)(a.gX),body:JSON.stringify({})});if(e.ok)H(`${(0,l.t)(\"cancelSuccess\")}: ${n}`,\"success\"),d=null,await u();else{H(`Fehler: ${(await e.json()).detail||\"Stornierung fehlgeschlagen\"}`,\"error\")}}catch(e){console.error(\"Cancel error:\",e),H(\"Netzwerkfehler bei Stornierung\",\"error\")}}function f(){localStorage.setItem(\"kantine_flags\",JSON.stringify([...a.BY]))}async function v(){if(0===a.BY.size)return;const e=a.gX||s.f9,t=new Set;for(const e of a.BY){const[n]=e.split(\"_\");t.add(n)}let n=!1;const o=document.getElementById(\"alarm-bell\");o&&o.classList.add(\"refreshing\");try{for(const o of t)try{const t=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${o}/`,{headers:(0,i.H)(e)});if(!t.ok)continue;const r=(await t.json()).results||[],l=new Map;for(const e of r)if(e.items&&Array.isArray(e.items))for(const t of e.items)l.set(t.id,t);for(let e of a.p_){if(!e.days)continue;const t=e.days.find(e=>e.date===o);if(t&&t.items)for(let e=0;e0;s.available=e||t,s.availableAmount=parseInt(r.available_amount)||0,s.amountTracking=!1!==r.amount_tracking,n=!0}}}}catch(e){console.error(\"Error refreshing flag date\",o,e)}n&&B(),localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)(),(0,r.OR)(),H(`${a.BY.size} ${1===a.BY.size?(0,l.t)(\"menuSingular\"):(0,l.t)(\"menuPlural\")} ${(0,l.t)(\"menuChecked\")}`,\"info\")}finally{o&&o.classList.remove(\"refreshing\")}}function y(e,t,n,o){const s=`${e}_${t}`;let i=!1;a.BY.has(s)?(a.BY.delete(s),H(`${(0,l.t)(\"flagRemoved\")} ${n}`,\"success\")):(a.BY.add(s),i=!0,H(`${(0,l.t)(\"flagActivated\")} ${n}`,\"success\"),\"default\"===Notification.permission&&Notification.requestPermission()),f(),(0,r.Mb)(),(0,r.OR)(),i&&v()}function b(){const e=new Date,t=e.toISOString().split(\"T\")[0];let n=!1;for(const o of[...a.BY]){const[s]=o.split(\"_\");let i=!1;if(s=t&&(i=!0)}i&&(a.BY.delete(o),n=!0)}n&&f()}function w(){a.K8||a.gX&&(0,a.cc)(setInterval(()=>async function(){if(0===a.BY.size||!a.gX)return;for(const e of a.BY){const[t,n]=e.split(\"_\"),o=parseInt(n);try{const e=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(a.gX)});if(!e.ok)continue;const n=(await e.json()).results||[];let r=null;for(const e of n)if(e.items&&(r=e.items.find(e=>e.id===o||e.article===o),r))break;if(r){if(!1===r.amount_tracking||parseInt(r.available_amount)>0){const e=r.name||\"Unbekannt\";H(`${e} ist jetzt verf\u00fcgbar!`,\"success\"),\"granted\"===Notification.permission&&new Notification(\"Kantine Wrapper\",{body:`${e} ist jetzt verf\u00fcgbar!`,icon:\"\ud83c\udf7d\ufe0f\"}),O()}}}catch(t){console.error(`Poll error for ${e}:`,t),await new Promise(e=>setTimeout(e,200))}}localStorage.setItem(\"kantine_flagged_items_last_checked\",(new Date).toISOString()),(0,r.Mb)()}(),s.fv))}function E(){a.K8&&(clearInterval(a.K8),(0,a.cc)(null))}function A(){localStorage.setItem(\"kantine_highlightTags\",JSON.stringify(a.yz)),(0,r.OR)(),(0,r.gJ)()}function k(e){if((e=e.trim().toLowerCase())&&!a.yz.includes(e)){const t=[...a.yz,e];return(0,a.iw)(t),A(),!0}return!1}function L(){const e=document.getElementById(\"tags-list\");e.innerHTML=\"\",a.yz.forEach(t=>{const n=document.createElement(\"span\");n.className=\"tag-badge\",n.innerHTML=`${t} ×`,e.appendChild(n)}),e.querySelectorAll(\".tag-remove\").forEach(e=>{e.addEventListener(\"click\",e=>{!function(e){const t=a.yz.filter(t=>t!==e);(0,a.iw)(t),A()}(e.target.dataset.tag),L()})})}function S(e){return e?(e=e.toLowerCase(),a.yz.filter(t=>e.includes(t))):[]}const I=\"kantine_menuCache\",C=\"kantine_menuCacheTs\";function B(){try{localStorage.setItem(I,JSON.stringify(a.p_)),localStorage.setItem(C,(new Date).toISOString())}catch(e){console.warn(\"Failed to cache menu data:\",e)}}function T(){try{const e=localStorage.getItem(I),t=localStorage.getItem(C);if(e){(0,a.tn)(JSON.parse(e)),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),t&&N(t);try{const e=new Set;a.p_.forEach(t=>{(t.days||[]).forEach(t=>{(t.items||[]).forEach(t=>{let n=(t.description||\"\").replace(/\\s+/g,\" \").trim();n&&n.includes(\" / \")&&e.add(n)})})})}catch(e){}return!0}}catch(e){console.warn(\"Failed to load cached menu:\",e)}return!1}function D(){const e=localStorage.getItem(C);if(!e)return!1;if(Date.now()-new Date(e).getTime()>36e5)return!1;const t=(0,o.sn)(new Date),n=(0,o.Ao)(new Date);return a.p_.some(e=>e.weekNumber===t&&e.year===n&&e.days&&e.days.length>0)}async function O(){const e=document.getElementById(\"loading\"),t=document.getElementById(\"progress-modal\"),l=document.getElementById(\"progress-fill\"),d=document.getElementById(\"progress-percent\"),u=document.getElementById(\"progress-message\");e.classList.remove(\"hidden\");const g=a.gX||s.f9;try{t.classList.remove(\"hidden\"),u.textContent=\"Hole verf\u00fcgbare Daten...\",l.style.width=\"0%\",d.textContent=\"0%\";const e=await fetch(`${s.tE}/venues/${s.eW}/menu/dates/`,{headers:(0,i.H)(g)});if(!e.ok)throw new Error(`Failed to fetch dates: ${e.status}`);let n=(await e.json()).results||[];const m=new Date;m.setDate(m.getDate()-7);const h=m.toISOString().split(\"T\")[0];n=n.filter(e=>e.date>=h).sort((e,t)=>e.date.localeCompare(t.date)).slice(0,30);const p=n.length;u.textContent=`${p} Tage gefunden. Lade Details...`;const f=[];let v=0;const y=5;for(let e=0;e
{const t=e.date;let n=null;try{const a=await fetch(`${s.tE}/venues/${s.eW}/menu/${s.YU}/${t}/`,{headers:(0,i.H)(g)});if(a.ok){const o=(await a.json()).results||[];let s=[];for(const e of o)e.items&&Array.isArray(e.items)&&(s=s.concat(e.items));s.length>0&&(n={date:t,menu_items:s,orders:e.orders||[]})}}catch(e){console.error(`Failed to fetch details for ${t}:`,e)}finally{v++;const e=Math.round(v/p*100);l.style.width=`${e}%`,d.textContent=`${e}%`,u.textContent=`Lade Men\u00fc f\u00fcr ${t}...`}return n}));for(const e of a)e&&f.push(e)}const b=new Map;a.p_&&a.p_.length>0&&a.p_.forEach(e=>{const t=`${e.year}-${e.weekNumber}`;try{b.set(t,{year:e.year,weekNumber:e.weekNumber,days:e.days?e.days.map(e=>({...e,items:e.items?[...e.items]:[]})):[]})}catch(e){console.warn(\"Error hydrating week:\",e)}});for(const e of f){const t=new Date(e.date),n=(0,o.sn)(t),a=(0,o.Ao)(t),s=`${a}-${n}`;b.has(s)||b.set(s,{year:a,weekNumber:n,days:[]});const i=b.get(s),r=t.toLocaleDateString(\"en-US\",{weekday:\"long\"}),l=new Date(e.date);l.setHours(10,0,0,0);const d={date:e.date,weekday:r,orderCutoff:l.toISOString(),items:e.menu_items.map(t=>{const n=!1===t.amount_tracking,a=parseInt(t.available_amount)>0;return{id:`${e.date}_${t.id}`,articleId:t.id,name:t.name||\"Unknown\",description:t.description||\"\",price:parseFloat(t.price)||0,available:n||a,availableAmount:parseInt(t.available_amount)||0,amountTracking:!1!==t.amount_tracking}})},c=i.days.findIndex(t=>t.date===e.date);c>=0?i.days[c]=d:i.days.push(d)}const w=Array.from(b.values()).sort((e,t)=>e.year!==t.year?e.year-t.year:e.weekNumber-t.weekNumber);w.forEach(e=>{e.days&&e.days.sort((e,t)=>e.date.localeCompare(t.date))}),(0,a.tn)(w),B(),N((new Date).toISOString()),(0,a.Xt)((0,o.sn)(new Date)),(0,a.pK)((new Date).getFullYear()),c(),(0,r.OR)(),(0,r.gJ)(),(0,r.Mb)(),u.textContent=\"Fertig!\",setTimeout(()=>t.classList.add(\"hidden\"),500)}catch(e){console.error(\"Error fetching menu:\",e),t.classList.add(\"hidden\"),Promise.resolve().then(n.bind(n,842)).then(t=>{t.showErrorModal(\"Keine Verbindung\",`Die Men\u00fcdaten konnten nicht geladen werden. M\u00f6glicherweise besteht keine Verbindung zur API oder zur Bessa-Webseite.
${(0,o.ZD)(e.message)}`,\"Zur Original-Seite\",\"https://web.bessa.app/knapp-kantine\")})}finally{e.classList.add(\"hidden\")}}let M=null,x=null;function N(e){const t=document.getElementById(\"last-updated-subtitle\");if(e){M=e,localStorage.setItem(\"kantine_last_updated\",e),localStorage.setItem(\"kantine_last_checked\",e);try{const n=new Date(e),a=n.toLocaleTimeString(\"de-DE\",{hour:\"2-digit\",minute:\"2-digit\"}),s=n.toLocaleDateString(\"de-DE\",{day:\"2-digit\",month:\"2-digit\"}),i=(0,o.gs)(n);t.textContent=`Aktualisiert: ${s} ${a} (${i})`}catch(e){t.textContent=\"\"}x||(x=setInterval(()=>{M&&(N(M),(0,r.Mb)())},6e4))}}function H(e,t=\"info\"){let n=document.getElementById(\"toast-container\");n||(n=document.createElement(\"div\"),n.id=\"toast-container\",document.body.appendChild(n));const a=document.createElement(\"div\");a.className=`toast toast-${t}`;const s=\"success\"===t?\"check_circle\":\"error\"===t?\"error\":\"info\";a.innerHTML=`${s}${(0,o.ZD)(e)}`,n.appendChild(a),requestAnimationFrame(()=>a.classList.add(\"show\")),setTimeout(()=>{a.classList.remove(\"show\"),setTimeout(()=>a.remove(),300)},3e3)}},672(e,t,n){n.d(t,{H:()=>o,O:()=>s});var a=n(521);function o(e){return{Authorization:`Token ${e||a.f9}`,Accept:\"application/json\",\"Content-Type\":\"application/json\",\"X-Client-Version\":a.fZ}}function s(){return{Accept:\"application/vnd.github.v3+json\"}}},521(e,t,n){n.d(t,{LS:()=>g,YU:()=>r,d_:()=>u,eW:()=>i,f9:()=>o,fZ:()=>s,fv:()=>l,pe:()=>c,tE:()=>a});const a=\"https://api.bessa.app/v1\",o=\"c3418725e95a9f90e3645cbc846b4d67c7c66131\",s=\"v1.6.19\",i=591,r=7,l=3e5,d=\"TauNeutrino/kantine-overview\",c=`https://api.github.com/repos/${d}`,u=`https://htmlpreview.github.io/?https://github.com/${d}/blob`,g={AUTH_TOKEN:\"kantine_authToken\",CURRENT_USER:\"kantine_currentUser\",FIRST_NAME:\"kantine_firstName\",LAST_NAME:\"kantine_lastName\",LANG:\"kantine_lang\",FLAGS:\"kantine_flags\",FLAGGED_LAST_CHECKED:\"kantine_flagged_items_last_checked\",LAST_CHECKED:\"kantine_last_checked\",MENU_CACHE:\"kantine_menuCache\",MENU_CACHE_TS:\"kantine_menuCacheTs\",HISTORY_CACHE:\"kantine_history_cache\",HIGHLIGHT_TAGS:\"kantine_highlightTags\",LAST_UPDATED:\"kantine_last_updated\",VERSION_CACHE:\"kantine_version_cache\",DEV_MODE:\"kantine_dev_mode\"}},646(e,t,n){n.d(t,{t:()=>s});var a=n(901);const o={de:{thisWeek:\"Diese Woche\",nextWeek:\"N\u00e4chste Woche\",nextWeekTooltipDefault:\"Men\u00fc n\u00e4chster Woche anzeigen\",thisWeekTooltip:\"Men\u00fc dieser Woche anzeigen\",appTitle:\"Kantinen \u00dcbersicht\",updatedAt:\"Aktualisiert\",langTooltip:\"Sprache der Men\u00fcbeschreibung\",weekLabel:\"Woche\",refresh:\"Men\u00fcdaten neu laden\",history:\"Bestellhistorie\",highlights:\"Pers\u00f6nliche Highlights verwalten\",themeTooltip:\"Erscheinungsbild (Hell/Dunkel) wechseln\",login:\"Anmelden\",loginTooltip:\"Mit Bessa.app Account anmelden\",logout:\"Abmelden\",logoutTooltip:\"Von Bessa.app abmelden\",loginTitle:\"Login\",employeeId:\"Mitarbeiternummer\",employeeIdPlaceholder:\"z.B. 2041\",employeeIdHelp:\"Deine offizielle Knapp Mitarbeiternummer.\",password:\"Passwort\",passwordPlaceholder:\"Bessa Passwort\",passwordHelp:\"Das Passwort f\u00fcr deinen Bessa Account.\",loginButton:\"Einloggen\",loggingIn:\"Wird eingeloggt...\",highlightsTitle:\"Meine Highlights\",highlightsDesc:\"Markiere Men\u00fcs automatisch, wenn sie diese Schlagw\u00f6rter enthalten.\",tagInputPlaceholder:\"z.B. Schnitzel, Vegetarisch...\",tagInputTooltip:\"Neues Schlagwort zum Hervorheben eingeben\",addTag:\"Hinzuf\u00fcgen\",addTagTooltip:\"Schlagwort zur Liste hinzuf\u00fcgen\",removeTagTooltip:\"Schlagwort entfernen\",historyTitle:\"Bestellhistorie\",loadingHistory:\"Lade Historie...\",noOrders:\"Keine Bestellungen gefunden.\",orders:\"Bestellungen\",historyMonthToggle:\"Klicken, um die Bestellungen f\u00fcr diesen Monat ein-/auszublenden\",available:\"Verf\u00fcgbar\",soldOut:\"Ausverkauft\",ordered:\"Bestellt\",orderButton:\"Bestellen\",orderAgainTooltip:\"nochmal bestellen\",orderTooltip:\"bestellen\",cancelOrder:\"Bestellung stornieren\",cancelOneOrder:\"Eine Bestellung stornieren\",flagActivate:\"Benachrichtigen wenn verf\u00fcgbar\",flagDeactivate:\"Benachrichtigung deaktivieren\",alarmTooltipNone:\"Keine beobachteten Men\u00fcs\",alarmLastChecked:\"Zuletzt gepr\u00fcft\",versionsTitle:\"\ud83d\udce6 Versionen\",currentVersion:\"Aktuell\",devModeLabel:\"Dev-Mode (alle Tags anzeigen)\",loadingVersions:\"Lade Versionen...\",noVersions:\"Keine Versionen gefunden.\",installed:\"\u2713 Installiert\",newVersion:\"\u2b06 Neu!\",installLink:\"Installieren\",reportBug:\"Fehler melden\",reportBugTooltip:\"Melde einen Fehler auf GitHub\",featureRequest:\"Feature vorschlagen\",featureRequestTooltip:\"Schlage ein neues Feature auf GitHub vor\",clearCache:\"Lokalen Cache leeren\",clearCacheTooltip:\"L\u00f6scht alle lokalen Daten & erzwingt einen Neuladen\",clearCacheConfirm:\"M\u00f6chtest du wirklich alle lokalen Daten (inkl. Login-Session, Cache und Einstellungen) l\u00f6schen? Die Seite wird danach neu geladen.\",versionMenuTooltip:\"Klick f\u00fcr Versionsmen\u00fc\",progressTitle:\"Men\u00fcdaten aktualisieren\",progressInit:\"Initialisierung...\",noMenuData:\"Keine Men\u00fcdaten f\u00fcr KW\",noMenuDataHint:\"Versuchen Sie eine andere Woche oder schauen Sie sp\u00e4ter vorbei.\",costLabel:\"Gesamt\",orderDeadline:\"Bestellschluss\",flagRemoved:\"Flag entfernt f\u00fcr\",flagActivated:\"Benachrichtigung aktiviert f\u00fcr\",menuChecked:\"gepr\u00fcft\",menuSingular:\"Men\u00fc\",menuPlural:\"Men\u00fcs\",newMenuDataAvailable:\"Neue Men\u00fcdaten f\u00fcr n\u00e4chste Woche verf\u00fcgbar!\",orderSuccess:\"Bestellt\",cancelSuccess:\"Storniert\",bgSyncFailed:\"Hintergrund-Synchronisation fehlgeschlagen\",historyLoadError:\"Fehler beim Laden der Historie.\",historyLoadingFull:\"Lade Bestellhistorie...\",historyLoadingDelta:\"Suche nach neuen Bestellungen...\",historyLoadingItem:\"Lade Bestellung\",historyLoadingOf:\"von\",historyLoadingNew:\"neue/ge\u00e4nderte Bestellungen gefunden...\",badgeOrdered:\"bestellt\",badgeOrderable:\"bestellbar\",badgeTotal:\"gesamt\",badgeHighlights:\"Highlights gefunden\",stateCancelled:\"Storniert\",stateCompleted:\"Abgeschlossen\",stateTransferred:\"\u00dcbertragen\",close:\"Schlie\u00dfen\",noConnection:\"Keine Verbindung\",toOriginalPage:\"Zur Original-Seite\",loggedIn:\"Angemeldet\"},en:{thisWeek:\"This Week\",nextWeek:\"Next Week\",nextWeekTooltipDefault:\"Show next week's menu\",thisWeekTooltip:\"Show this week's menu\",appTitle:\"Canteen Overview\",updatedAt:\"Updated\",langTooltip:\"Menu description language\",weekLabel:\"Week\",refresh:\"Reload menu data\",history:\"Order history\",highlights:\"Manage personal highlights\",themeTooltip:\"Toggle appearance (Light/Dark)\",login:\"Sign in\",loginTooltip:\"Sign in with Bessa.app account\",logout:\"Sign out\",logoutTooltip:\"Sign out from Bessa.app\",loginTitle:\"Login\",employeeId:\"Employee ID\",employeeIdPlaceholder:\"e.g. 2041\",employeeIdHelp:\"Your official Knapp employee number.\",password:\"Password\",passwordPlaceholder:\"Bessa password\",passwordHelp:\"The password for your Bessa account.\",loginButton:\"Log in\",loggingIn:\"Logging in...\",highlightsTitle:\"My Highlights\",highlightsDesc:\"Automatically highlight menus containing these keywords.\",tagInputPlaceholder:\"e.g. Schnitzel, Vegetarian...\",tagInputTooltip:\"Enter new keyword to highlight\",addTag:\"Add\",addTagTooltip:\"Add keyword to list\",removeTagTooltip:\"Remove keyword\",historyTitle:\"Order History\",loadingHistory:\"Loading history...\",noOrders:\"No orders found.\",orders:\"Orders\",historyMonthToggle:\"Click to expand/collapse orders for this month\",available:\"Available\",soldOut:\"Sold out\",ordered:\"Ordered\",orderButton:\"Order\",orderAgainTooltip:\"order again\",orderTooltip:\"order\",cancelOrder:\"Cancel order\",cancelOneOrder:\"Cancel one order\",flagActivate:\"Notify when available\",flagDeactivate:\"Deactivate notification\",alarmTooltipNone:\"No flagged menus\",alarmLastChecked:\"Last checked\",versionsTitle:\"\ud83d\udce6 Versions\",currentVersion:\"Current\",devModeLabel:\"Dev mode (show all tags)\",loadingVersions:\"Loading versions...\",noVersions:\"No versions found.\",installed:\"\u2713 Installed\",newVersion:\"\u2b06 New!\",installLink:\"Install\",reportBug:\"Report a bug\",reportBugTooltip:\"Report a bug on GitHub\",featureRequest:\"Request a feature\",featureRequestTooltip:\"Suggest a new feature on GitHub\",clearCache:\"Clear local cache\",clearCacheTooltip:\"Deletes all local data & forces a reload\",clearCacheConfirm:\"Do you really want to delete all local data (including login session, cache, and settings)? The page will reload afterwards.\",versionMenuTooltip:\"Click for version menu\",progressTitle:\"Updating menu data\",progressInit:\"Initializing...\",noMenuData:\"No menu data for CW\",noMenuDataHint:\"Try another week or check back later.\",costLabel:\"Total\",orderDeadline:\"Order deadline\",flagRemoved:\"Flag removed for\",flagActivated:\"Notification activated for\",menuChecked:\"checked\",menuSingular:\"menu\",menuPlural:\"menus\",newMenuDataAvailable:\"New menu data available for next week!\",orderSuccess:\"Ordered\",cancelSuccess:\"Cancelled\",bgSyncFailed:\"Background synchronisation failed\",historyLoadError:\"Error loading history.\",historyLoadingFull:\"Loading order history...\",historyLoadingDelta:\"Checking for new orders...\",historyLoadingItem:\"Loading order\",historyLoadingOf:\"of\",historyLoadingNew:\"new/updated orders found...\",badgeOrdered:\"ordered\",badgeOrderable:\"orderable\",badgeTotal:\"total\",badgeHighlights:\"highlights found\",stateCancelled:\"Cancelled\",stateCompleted:\"Completed\",stateTransferred:\"Transferred\",close:\"Close\",noConnection:\"No connection\",toOriginalPage:\"Go to original page\",loggedIn:\"Logged in\"}};function s(e){const t=\"en\"===a.Kl?\"en\":\"de\";return o[t][e]||o.de[e]||e}},901(e,t,n){n.d(t,{BT:()=>i,BY:()=>g,K8:()=>m,Kl:()=>h,L:()=>u,Ny:()=>c,O5:()=>b,UD:()=>S,Xt:()=>v,cc:()=>A,di:()=>E,gX:()=>d,iw:()=>k,lt:()=>w,pK:()=>y,p_:()=>s,qo:()=>L,sw:()=>l,tn:()=>f,vW:()=>r,yz:()=>p});var a=n(413),o=n(521);let s=[],i=(0,a.sn)(new Date),r=(new Date).getFullYear(),l=\"this-week\",d=localStorage.getItem(o.LS.AUTH_TOKEN),c=localStorage.getItem(o.LS.CURRENT_USER),u=new Map,g=new Set(JSON.parse(localStorage.getItem(o.LS.FLAGS)||\"[]\")),m=null,h=localStorage.getItem(o.LS.LANG)||\"de\",p=JSON.parse(localStorage.getItem(o.LS.HIGHLIGHT_TAGS)||\"[]\");function f(e){s=e}function v(e){i=e}function y(e){r=e}function b(e){d=e}function w(e){c=e}function E(e){u=e}function A(e){m=e}function k(e){p=e}function L(e){\"this-week\"===e||\"next-week\"===e?l=e:console.warn(`[state] Invalid displayMode: \"${e}\". Ignoring.`)}function S(e){[\"de\",\"en\",\"all\"].includes(e)?h=e:console.warn(`[state] Invalid langMode: \"${e}\". Ignoring.`)}},842(e,t,n){n.d(t,{Gk:()=>m,Mb:()=>v,OR:()=>c,Ux:()=>g,gJ:()=>d,showErrorModal:()=>f});var a=n(901),o=n(413),s=n(521),i=n(672),r=n(367),l=n(646);function d(){const e=document.getElementById(\"btn-next-week\");let t=a.BT+1,n=a.vW;t>52&&(t=1,n++);const o=a.p_.find(e=>e.weekNumber===t&&e.year===n);let s=0,i=0,d=0,c=0;o&&o.days&&o.days.forEach(e=>{if(e.items&&e.items.length>0){s++;const t=e.items.some(e=>e.available);t&&i++;let n=!1;e.items.forEach(t=>{const o=t.articleId||parseInt(t.id.split(\"_\")[1]),s=`${e.date}_${o}`;a.L.has(s)&&a.L.get(s).length>0&&(n=!0)}),n&&d++;const o=new Date(e.date).getDay();o>=1&&o<=4&&t&&!n&&c++}});const u=e.querySelector(\".nav-badge\");if(u&&u.remove(),s>0){let a=0;o&&o.days&&o.days.forEach(e=>{e.items.forEach(e=>{const t=(0,r.BM)(e.name),n=(0,r.BM)(e.description);(t.length>0||n.length>0)&&a++})});let u=[`${d} ${(0,l.t)(\"badgeOrdered\")} / ${i} ${(0,l.t)(\"badgeOrderable\")} / ${s} ${(0,l.t)(\"badgeTotal\")}`];if(a>0&&u.push(`${a} ${(0,l.t)(\"badgeHighlights\")}`),e.title=u.join(\" \u2022 \"),c>0){e.classList.add(\"new-week-available\");const a=`kantine_notified_nextweek_${n}_${t}`;localStorage.getItem(a)||(localStorage.setItem(a,\"true\"),(0,r.P0)((0,l.t)(\"newMenuDataAvailable\"),\"info\"))}else e.classList.remove(\"new-week-available\")}else e.title=(0,l.t)(\"nextWeekTooltipDefault\"),e.classList.remove(\"new-week-available\")}function c(){const e=document.getElementById(\"menu-container\");if(!e)return;e.innerHTML=\"\";let t=a.BT,n=a.vW;\"next-week\"===a.sw&&(t++,t>52&&(t=1,n++));const s=a.p_.flatMap(e=>e.days||[]).filter(e=>{const a=new Date(e.date);return(0,o.sn)(a)===t&&(0,o.Ao)(a)===n});if(0===s.length)return e.innerHTML=`\\n