{"mappings":"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","sources":["","frontend/schedule/calendar.js"],"sourcesContent":["(function () {\nvar $cbde08bbb80927b6$exports = {};\nlet $cbde08bbb80927b6$var$all_data;\nconst $cbde08bbb80927b6$var$calendarElement = document.querySelector(\"#event-wrapper\");\nconst $cbde08bbb80927b6$var$nowBarElement = document.querySelector(\"#calendar-today #now\");\nconst $cbde08bbb80927b6$var$preferred_event_min_width = 200;\nconst $cbde08bbb80927b6$var$min_visible_width = 50;\nconst $cbde08bbb80927b6$var$min_event_height = 47.5;\nconst $cbde08bbb80927b6$var$padding = 5;\nconst $cbde08bbb80927b6$var$pixels_per_minute = 1.5;\nlet $cbde08bbb80927b6$var$startDate;\nlet $cbde08bbb80927b6$var$startTime;\nlet $cbde08bbb80927b6$var$endDate;\nlet $cbde08bbb80927b6$var$endTime;\nlet $cbde08bbb80927b6$var$events;\nlet $cbde08bbb80927b6$var$showNowBar = true;\nlet $cbde08bbb80927b6$var$backgroundColor = \"rgb(255, 255, 255)\";\nlet $cbde08bbb80927b6$var$textColor = \"black\";\n/// Place period boxes for a list of periods.\nfunction $cbde08bbb80927b6$var$place_boxes(data_unprocessed, date = current_date(), force = false, today = true) {\n $cbde08bbb80927b6$var$showNowBar = today;\n $cbde08bbb80927b6$var$calendarElement.innerHTML = \"\";\n if (data_unprocessed && (!$cbde08bbb80927b6$var$events || force)) {\n $cbde08bbb80927b6$var$calendarElement.style.height = \"auto\";\n if (!data_unprocessed.periods[0]) {\n $cbde08bbb80927b6$var$updateNowBar();\n return;\n }\n const data = replace_period(data_unprocessed.periods.filter((p)=>p.kind !== \"Passing\")).filter((v)=>v);\n $cbde08bbb80927b6$var$startDate = date_from_api(data[0].start, date);\n $cbde08bbb80927b6$var$startTime = $cbde08bbb80927b6$var$startDate.getTime() / 1000;\n $cbde08bbb80927b6$var$endDate = date_from_api(data[data.length - 1].end, date);\n $cbde08bbb80927b6$var$endTime = $cbde08bbb80927b6$var$endDate.getTime() / 1000;\n $cbde08bbb80927b6$var$updateNowBar();\n const sInDay = $cbde08bbb80927b6$var$endTime - $cbde08bbb80927b6$var$startTime;\n let containerHeight = sInDay / 60 * $cbde08bbb80927b6$var$pixels_per_minute;\n const lastColHeight = {};\n // Resolve rows so everything is mutually non-intersecting.\n $cbde08bbb80927b6$var$events = [];\n for (const [i, period] of data.sort((a, b)=>date_from_api(a.start, date) - date_from_api(b.start, date)).entries()){\n // Set up variables\n const start = date_from_api(period.start, date).getTime() / 1000;\n const end = date_from_api(period.end, date).getTime() / 1000;\n const duration = end - start;\n let heightChange = 0;\n const startPos = (start - $cbde08bbb80927b6$var$startTime) / 60 * $cbde08bbb80927b6$var$pixels_per_minute;\n let height = duration / 60 * $cbde08bbb80927b6$var$pixels_per_minute;\n const endPos = startPos + height;\n if (height < $cbde08bbb80927b6$var$min_event_height) {\n heightChange = $cbde08bbb80927b6$var$min_event_height - height;\n height = $cbde08bbb80927b6$var$min_event_height;\n }\n let col = 0;\n while($cbde08bbb80927b6$var$events.filter((event)=>event.col === col).some((event)=>startPos < event.endPos || endPos < event.startPos))col++;\n lastColHeight[col] = heightChange;\n $cbde08bbb80927b6$var$events.push({\n startPos: startPos,\n endPos: endPos,\n height: height,\n col: col,\n period: period\n });\n }\n containerHeight += Math.max(...Object.values(lastColHeight));\n $cbde08bbb80927b6$var$calendarElement.style.height = `${containerHeight}px`;\n }\n if (!$cbde08bbb80927b6$var$events) return;\n const indicatorDate = new Date(Math.ceil($cbde08bbb80927b6$var$startDate.getTime() / 1000 / 60 / 60) * 3600000);\n while(indicatorDate.getTime() < $cbde08bbb80927b6$var$endDate.getTime()){\n const time = indicatorDate.toLocaleTimeString(\"en-US\");\n const formatted = `${time.split(\":\")[0]} ${time.split(\" \")[1]}`;\n const top = (indicatorDate.getTime() / 1000 - $cbde08bbb80927b6$var$startTime) / 60 * $cbde08bbb80927b6$var$pixels_per_minute;\n const span = document.createElement(\"span\");\n span.classList.add(\"time\");\n span.textContent = formatted;\n span.style.top = `${top}px`;\n $cbde08bbb80927b6$var$calendarElement.append(span);\n indicatorDate.setTime(indicatorDate.getTime() + 3600000);\n }\n const number_cols = Math.max(...$cbde08bbb80927b6$var$events.map((event)=>event.col)) + 1;\n const colwidth = $cbde08bbb80927b6$var$calendarElement.clientWidth / number_cols;\n const percent = 1 / number_cols * 100;\n if (data_unprocessed) {\n $cbde08bbb80927b6$var$backgroundColor = data_unprocessed.color ? bytes_to_color(data_unprocessed.color) : \"#FFFFFF\";\n $cbde08bbb80927b6$var$textColor = black_or_white($cbde08bbb80927b6$var$backgroundColor);\n }\n for (const event of $cbde08bbb80927b6$var$events){\n let colspan = 1;\n while(event.col + colspan < number_cols && !$cbde08bbb80927b6$var$events.filter((e)=>e.col === event.col + colspan).some((e)=>[\n event.startPos,\n event.endPos\n ].some((p)=>p >= e.startPos && p <= e.endPos)))colspan++;\n let widthOffset = event.col === 0 ? 0 : $cbde08bbb80927b6$var$padding * -2;\n if (colwidth * colspan < $cbde08bbb80927b6$var$preferred_event_min_width && colspan < number_cols) {\n widthOffset = $cbde08bbb80927b6$var$preferred_event_min_width - colwidth * colspan;\n if (widthOffset > colwidth) widthOffset += colwidth - $cbde08bbb80927b6$var$min_visible_width;\n }\n const leftOffset = widthOffset * event.col;\n const element = document.createElement(\"div\");\n element.classList.add(\"event\");\n element.style.top = `${event.startPos - 3}px`;\n element.style.height = `${event.height}px`;\n element.style.left = `calc(${percent * event.col}% ${leftOffset < 0 ? \"+\" : \"-\"} ${Math.abs(leftOffset)}px)`;\n element.style.width = `calc(${percent * colspan}% ${widthOffset < 0 ? \"-\" : \"+\"} ${Math.abs(widthOffset)}px)`;\n element.style.zIndex = number_cols - event.col + 1;\n element.setAttribute(\"tabindex\", \"0\");\n element.addEventListener(\"focus\", ()=>{\n for (const element_ of document.querySelectorAll(\"#calendar-table .event.selected\"))element_.classList.remove(\"selected\");\n element.classList.add(\"selected\");\n });\n const childElement = document.createElement(\"div\");\n childElement.classList.add(\"event-child\");\n childElement.style.backgroundColor = $cbde08bbb80927b6$var$backgroundColor;\n childElement.style.color = $cbde08bbb80927b6$var$textColor;\n const nameElement = document.createElement(\"span\");\n nameElement.classList.add(\"event-name\");\n nameElement.innerHTML = period_html(event.period);\n childElement.append(nameElement);\n const timeElement = document.createElement(\"span\");\n timeElement.classList.add(\"event-time\");\n timeElement.innerHTML = `${human_time(event.period.start)} - ${human_time(event.period.end)} (${human_time_left(event.period.end, event.period.start, true)})`;\n childElement.append(timeElement);\n element.append(childElement);\n $cbde08bbb80927b6$var$calendarElement.append(element);\n }\n}\nwindow.addEventListener(\"resize\", ()=>$cbde08bbb80927b6$var$place_boxes());\nsetInterval($cbde08bbb80927b6$var$updateNowBar, 1000);\nfunction $cbde08bbb80927b6$var$updateNowBar() {\n const now = current_date().getTime() / 1000;\n if ($cbde08bbb80927b6$var$nowBarElement && $cbde08bbb80927b6$var$showNowBar && $cbde08bbb80927b6$var$startTime && $cbde08bbb80927b6$var$endTime && now >= $cbde08bbb80927b6$var$startTime && now <= $cbde08bbb80927b6$var$endTime) {\n $cbde08bbb80927b6$var$nowBarElement.style.top = `${(now - $cbde08bbb80927b6$var$startTime) / 60 * $cbde08bbb80927b6$var$pixels_per_minute + 10}px`;\n $cbde08bbb80927b6$var$nowBarElement.style.display = \"block\";\n } else $cbde08bbb80927b6$var$nowBarElement.style.display = \"none\";\n}\n$cbde08bbb80927b6$var$updateNowBar();\nObject.assign(window, {\n place_boxes: $cbde08bbb80927b6$var$place_boxes\n});\n\n})();\n//# sourceMappingURL=index.98845fc8.js.map\n","let all_data;\n\nconst calendarElement = document.querySelector('#event-wrapper');\nconst nowBarElement = document.querySelector('#calendar-today #now');\nconst preferred_event_min_width = 200;\nconst min_visible_width = 50;\nconst min_event_height = 47.5;\nconst padding = 5;\nconst pixels_per_minute = 1.5;\nlet startDate;\nlet startTime;\nlet endDate;\nlet endTime;\nlet events;\nlet showNowBar = true;\nlet backgroundColor = 'rgb(255, 255, 255)';\nlet textColor = 'black';\n\n/// Place period boxes for a list of periods.\nfunction place_boxes(data_unprocessed, date = current_date(), force = false, today = true) {\n\tshowNowBar = today;\n\n\tcalendarElement.innerHTML = '';\n\tif (data_unprocessed && (!events || force)) {\n\t\tcalendarElement.style.height = 'auto';\n\t\tif (!data_unprocessed.periods[0]) {\n\t\t\tupdateNowBar();\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = replace_period(data_unprocessed.periods.filter(p => p.kind !== 'Passing')).filter(v => v);\n\t\tstartDate = date_from_api(data[0].start, date);\n\t\tstartTime = startDate.getTime() / 1000;\n\t\tendDate = date_from_api(data[data.length - 1].end, date);\n\t\tendTime = endDate.getTime() / 1000;\n\t\tupdateNowBar();\n\t\tconst sInDay = endTime - startTime;\n\t\tlet containerHeight = (sInDay / 60) * pixels_per_minute;\n\t\tconst lastColHeight = {};\n\n\t\t// Resolve rows so everything is mutually non-intersecting.\n\t\tevents = [];\n\n\t\tfor (const [i, period] of data.sort((a, b) => date_from_api(a.start, date) - date_from_api(b.start, date)).entries()) {\n\t\t\t// Set up variables\n\t\t\tconst start = date_from_api(period.start, date).getTime() / 1000;\n\t\t\tconst end = date_from_api(period.end, date).getTime() / 1000;\n\t\t\tconst duration = end - start;\n\t\t\tlet heightChange = 0;\n\n\t\t\tconst startPos = ((start - startTime) / 60) * pixels_per_minute;\n\t\t\tlet height = (duration / 60) * pixels_per_minute;\n\t\t\tconst endPos = startPos + height;\n\t\t\tif (height < min_event_height) {\n\t\t\t\theightChange = min_event_height - height;\n\t\t\t\theight = min_event_height;\n\t\t\t}\n\n\t\t\tlet col = 0;\n\n\t\t\twhile (events.filter(event => event.col === col).some(event => startPos < event.endPos || endPos < event.startPos)) {\n\t\t\t\tcol++;\n\t\t\t}\n\n\t\t\tlastColHeight[col] = heightChange;\n\n\t\t\tevents.push({\n\t\t\t\tstartPos,\n\t\t\t\tendPos,\n\t\t\t\theight,\n\t\t\t\tcol,\n\t\t\t\tperiod,\n\t\t\t});\n\t\t}\n\n\t\tcontainerHeight += Math.max(...Object.values(lastColHeight));\n\t\tcalendarElement.style.height = `${containerHeight}px`;\n\t}\n\n\tif (!events) {\n\t\treturn;\n\t}\n\n\tconst indicatorDate = new Date(Math.ceil(startDate.getTime() / 1000 / 60 / 60) * 1000 * 60 * 60);\n\twhile (indicatorDate.getTime() < endDate.getTime()) {\n\t\tconst time = indicatorDate.toLocaleTimeString('en-US');\n\t\tconst formatted = `${time.split(':')[0]} ${time.split(' ')[1]}`;\n\t\tconst top = ((indicatorDate.getTime() / 1000 - startTime) / 60) * pixels_per_minute;\n\t\tconst span = document.createElement('span');\n\t\tspan.classList.add('time');\n\t\tspan.textContent = formatted;\n\t\tspan.style.top = `${top}px`;\n\t\tcalendarElement.append(span);\n\t\tindicatorDate.setTime(indicatorDate.getTime() + 60 * 60 * 1000);\n\t}\n\n\tconst number_cols = Math.max(...events.map(event => event.col)) + 1;\n\tconst colwidth = calendarElement.clientWidth / number_cols;\n\tconst percent = (1 / number_cols) * 100;\n\n\tif (data_unprocessed) {\n\t\tbackgroundColor = data_unprocessed.color ? bytes_to_color(data_unprocessed.color) : '#FFFFFF';\n\t\ttextColor = black_or_white(backgroundColor);\n\t}\n\n\tfor (const event of events) {\n\t\tlet colspan = 1;\n\n\t\twhile (event.col + colspan < number_cols && !events.filter(e => e.col === event.col + colspan).some(e => [event.startPos, event.endPos].some(p => p >= e.startPos && p <= e.endPos))) {\n\t\t\tcolspan++;\n\t\t}\n\n\t\tlet widthOffset = event.col === 0 ? 0 : padding * -2;\n\t\tif (colwidth * colspan < preferred_event_min_width && colspan < number_cols) {\n\t\t\twidthOffset = preferred_event_min_width - colwidth * colspan;\n\t\t\tif (widthOffset > colwidth) {\n\t\t\t\twidthOffset += colwidth - min_visible_width;\n\t\t\t}\n\t\t}\n\n\t\tconst leftOffset = widthOffset * event.col;\n\n\t\tconst element = document.createElement('div');\n\t\telement.classList.add('event');\n\n\t\telement.style.top = `${event.startPos - 3}px`;\n\t\telement.style.height = `${event.height}px`;\n\n\t\telement.style.left = `calc(${percent * event.col}% ${leftOffset < 0 ? '+' : '-'} ${Math.abs(leftOffset)}px)`;\n\t\telement.style.width = `calc(${percent * colspan}% ${widthOffset < 0 ? '-' : '+'} ${Math.abs(widthOffset)}px)`;\n\n\t\telement.style.zIndex = number_cols - event.col + 1;\n\t\telement.setAttribute('tabindex', '0');\n\n\t\telement.addEventListener('focus', () => {\n\t\t\tfor (const element_ of document.querySelectorAll('#calendar-table .event.selected')) {\n\t\t\t\telement_.classList.remove('selected');\n\t\t\t}\n\n\t\t\telement.classList.add('selected');\n\t\t});\n\n\t\tconst childElement = document.createElement('div');\n\t\tchildElement.classList.add('event-child');\n\t\tchildElement.style.backgroundColor = backgroundColor;\n\t\tchildElement.style.color = textColor;\n\n\t\tconst nameElement = document.createElement('span');\n\t\tnameElement.classList.add('event-name');\n\t\tnameElement.innerHTML = period_html(event.period);\n\t\tchildElement.append(nameElement);\n\n\t\tconst timeElement = document.createElement('span');\n\t\ttimeElement.classList.add('event-time');\n\t\ttimeElement.innerHTML = `${human_time(event.period.start)} - ${human_time(event.period.end)} (${human_time_left(event.period.end, event.period.start, true)})`;\n\t\tchildElement.append(timeElement);\n\n\t\telement.append(childElement);\n\t\tcalendarElement.append(element);\n\t}\n}\n\nwindow.addEventListener('resize', () => place_boxes());\n\nsetInterval(updateNowBar, 1000);\n\nfunction updateNowBar() {\n\tconst now = current_date().getTime() / 1000;\n\tif (nowBarElement && showNowBar && startTime && endTime && now >= startTime && now <= endTime) {\n\t\tnowBarElement.style.top = `${((now - startTime) / 60) * pixels_per_minute + 10}px`;\n\t\tnowBarElement.style.display = 'block';\n\t} else {\n\t\tnowBarElement.style.display = 'none';\n\t}\n}\n\nupdateNowBar();\n\nObject.assign(window, {\n\tplace_boxes,\n});\n"],"names":["$cbde08bbb80927b6$var$startDate","$cbde08bbb80927b6$var$startTime","$cbde08bbb80927b6$var$endDate","$cbde08bbb80927b6$var$endTime","$cbde08bbb80927b6$var$events","$cbde08bbb80927b6$var$calendarElement","document","querySelector","$cbde08bbb80927b6$var$nowBarElement","$cbde08bbb80927b6$var$showNowBar","$cbde08bbb80927b6$var$backgroundColor","$cbde08bbb80927b6$var$textColor","$cbde08bbb80927b6$var$place_boxes","data_unprocessed","date","current_date","force","today","innerHTML","style","height","periods","$cbde08bbb80927b6$var$updateNowBar","data","replace_period","filter","p","kind","v","date_from_api","start","getTime","length","end","sInDay","containerHeight","lastColHeight","i","period","sort","a","b","entries","duration","heightChange","startPos","endPos","$cbde08bbb80927b6$var$min_event_height","col","event","some","push","Math","max","Object","values","indicatorDate","Date","ceil","time","toLocaleTimeString","formatted","split","top","span","createElement","classList","add","textContent","append","setTime","number_cols","map","colwidth","clientWidth","percent","color","bytes_to_color","black_or_white","colspan","e","widthOffset","$cbde08bbb80927b6$var$padding","$cbde08bbb80927b6$var$preferred_event_min_width","leftOffset","element","left","abs","width","zIndex","setAttribute","addEventListener","element_","querySelectorAll","remove","childElement","backgroundColor","nameElement","period_html","timeElement","human_time","human_time_left","now","display","window","setInterval","assign","place_boxes"],"version":3,"file":"index.98845fc8.js.map"}