{"mappings":"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","sources":["","frontend/global/timeline.js"],"sourcesContent":["var $ee67522556725cdd$exports = {};\nlet $ee67522556725cdd$var$viewport_seconds = 14400; // The number of seconds the viewport should show\nlet $ee67522556725cdd$var$viewport_offset = 0;\nconst $ee67522556725cdd$var$row_height = 50; // The height of a row\nconst $ee67522556725cdd$var$box_height = 40; // The height of a box\nconst $ee67522556725cdd$var$row_start = 10; // The height rows start at\nconst $ee67522556725cdd$var$text_height = 30; // The size of the font\nlet $ee67522556725cdd$var$has_resize_listener = false;\nlet $ee67522556725cdd$var$scroll_timeout;\nlet $ee67522556725cdd$var$last_scroll_touch_x;\nlet $ee67522556725cdd$var$scrolled_distance = 0;\n/// Place period boxes for a list of periods.\nfunction $ee67522556725cdd$var$place_boxes(data_unprocessed) {\n let data = replace_period(data_unprocessed.filter((p)=>p.kind !== \"Passing\"));\n if (!$ee67522556725cdd$var$has_resize_listener) {\n window.addEventListener(\"resize\", ()=>{\n $ee67522556725cdd$var$place_boxes(all_data);\n });\n $ee67522556725cdd$var$has_resize_listener = true;\n const set_length = (event_)=>{\n $ee67522556725cdd$var$viewport_seconds = event_.target.value * 3600;\n $ee67522556725cdd$var$place_boxes(all_data);\n };\n const set_offset = (event_)=>{\n $ee67522556725cdd$var$viewport_offset = event_.target.value * 3600;\n $ee67522556725cdd$var$place_boxes(all_data);\n };\n // Update fields\n const events = [\n \"input\"\n ];\n getel(\"timeline_length\").value = $ee67522556725cdd$var$viewport_seconds / 3600;\n getel(\"timeline_offset\").value = 0;\n for (const event_name of events){\n getel(\"timeline_length\")?.addEventListener(event_name, set_length);\n getel(\"timeline_offset\")?.addEventListener(event_name, set_offset);\n }\n // Scroll behaviour\n const scroll = ()=>{\n $ee67522556725cdd$var$scroll_timeout = false;\n $ee67522556725cdd$var$viewport_offset += $ee67522556725cdd$var$scrolled_distance * (navigator.userAgent.includes(\"Chrom\") ? -2 : 2);\n $ee67522556725cdd$var$scrolled_distance = 0;\n $ee67522556725cdd$var$place_boxes(all_data);\n getel(\"timeline_offset\").value = Math.round($ee67522556725cdd$var$viewport_offset / 360) / 10;\n };\n getel(\"timeline\")?.addEventListener(\"wheel\", (event)=>{\n const deltaX = event.shiftKey ? event.deltaY : event.deltaX;\n $ee67522556725cdd$var$scrolled_distance += deltaX * 3;\n if (!$ee67522556725cdd$var$scroll_timeout) {\n setTimeout(scroll, 10);\n $ee67522556725cdd$var$scroll_timeout = true;\n }\n });\n getel(\"timeline\")?.addEventListener(\"touchmove\", (event)=>{\n const new_touch_x = event.touches[0].clientX;\n if ($ee67522556725cdd$var$last_scroll_touch_x) {\n $ee67522556725cdd$var$scrolled_distance += ($ee67522556725cdd$var$last_scroll_touch_x - new_touch_x) * 10;\n if (!$ee67522556725cdd$var$scroll_timeout) {\n setTimeout(scroll, 10);\n $ee67522556725cdd$var$scroll_timeout = true;\n }\n }\n $ee67522556725cdd$var$last_scroll_touch_x = new_touch_x;\n });\n getel(\"timeline\")?.addEventListener(\"touchend\", ()=>{\n $ee67522556725cdd$var$last_scroll_touch_x = undefined;\n });\n }\n // Resolve rows so everything is mutually non-intersecting.\n const boxes = [];\n data = data.flat().filter((v)=>v);\n data.sort((a, b)=>a.start - b.start);\n for (const period of data){\n // Set up variables\n const start = period.start_timestamp;\n let row = 0;\n let intersecting = 0;\n // Increment the row until nothing intersects.\n do {\n intersecting = 0;\n for (const box of boxes)if (box.row === row && box.end > start) intersecting += 1;\n if (intersecting > 0) row += 1;\n }while (intersecting > 0);\n boxes.push({\n row: row,\n start: period.start_timestamp,\n end: period.end_timestamp,\n kind: period.kind,\n name: period.friendly_name,\n period: period\n });\n }\n // Determine where the boxes should be placed on-screen\n const now = current_date().getTime() / 1000 + $ee67522556725cdd$var$viewport_offset;\n const viewport_width = getel(\"timeline>svg\").clientWidth;\n for (const box of boxes){\n const length = box.end - box.start;\n const relative_time = box.start - now;\n const fraction_time = relative_time / $ee67522556725cdd$var$viewport_seconds;\n let fraction_position = 0.5 + fraction_time;\n let fraction_outside_length = 0;\n if (fraction_position < 0) {\n fraction_outside_length = -fraction_position;\n fraction_position = 0;\n }\n const absolute_x = viewport_width * fraction_position;\n fraction_position *= 100;\n let fraction_length = length / $ee67522556725cdd$var$viewport_seconds;\n fraction_length -= fraction_outside_length;\n if (fraction_length <= 0 || fraction_position > 100) box.hidden = true;\n else {\n fraction_length *= 100;\n if (fraction_length + fraction_position > 100) fraction_length = 100 - fraction_position;\n box.x = fraction_position;\n box.y = $ee67522556725cdd$var$row_start + $ee67522556725cdd$var$row_height * box.row;\n box.w = fraction_length;\n box.h = $ee67522556725cdd$var$box_height;\n const text_margin = ($ee67522556725cdd$var$box_height - $ee67522556725cdd$var$text_height) / 2;\n box.tx = absolute_x + text_margin;\n box.ty = box.y + box.h / 2 + text_margin * 2;\n box.th = $ee67522556725cdd$var$text_height;\n }\n }\n // Set the box's emoji and TODO color\n for (const box of boxes){\n if (box.hidden) continue;\n let emoji;\n if (box.kind.Class) emoji = \"\\uD83C\\uDFEB\";\n else if (box.kind.ClassOrLunch) emoji = \"\\uD83C\\uDFEB/\\uD83E\\uDD6A\";\n else switch(box.kind){\n case \"Lunch\":\n emoji = \"\\uD83E\\uDD6A\";\n break;\n case \"Break\":\n emoji = \"\\uD83D\\uDECC\";\n break;\n case \"AMSupport\":\n emoji = \"\\uD83D\\uDC14\";\n break;\n case \"Passing\":\n emoji = \"\\uD83C\\uDFC3\";\n break;\n case \"BeforeSchool\":\n emoji = \"\\uD83C\\uDF04\";\n break;\n case \"AfterSchool\":\n emoji = \"\\uD83C\\uDF07\";\n break;\n case \"Announcements\":\n emoji = \"\\uD83D\\uDCE3\";\n break;\n default:\n emoji = emoji || \"\\uD83D\\uDE15\";\n }\n box.emoji = emoji;\n box.color = \"white\";\n }\n // Write the boxes to the DOM\n getel(\"boxes\").innerHTML = \"\";\n for (const box of boxes){\n if (box.hidden) continue;\n const element = document.createElement(\"div\");\n element.classList.add(\"timeline_rect\");\n element.style.left = `${box.x}%`;\n element.style.top = `${box.y}px`;\n element.style.width = `${box.w}%`;\n element.style.height = `${box.h}px`;\n element.style[\"font-size\"] = `${box.th}px`;\n element.innerHTML = ` ${box.emoji} ${period_html(box.period)}`;\n getel(\"boxes\").append(element);\n }\n const pointer_time = new Date(current_date().getTime() + $ee67522556725cdd$var$viewport_offset * 1000);\n getel(\"pointer_time\").innerHTML = pointer_time.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\"\n });\n const left_time = new Date(current_date().getTime() + $ee67522556725cdd$var$viewport_offset * 1000 - $ee67522556725cdd$var$viewport_seconds * 500);\n getel(\"left_time\").innerHTML = left_time.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\"\n });\n const right_time = new Date(current_date().getTime() + $ee67522556725cdd$var$viewport_offset * 1000 + $ee67522556725cdd$var$viewport_seconds * 500);\n getel(\"right_time\").innerHTML = right_time.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\"\n });\n}\nObject.assign(window, {\n place_boxes: $ee67522556725cdd$var$place_boxes\n});\n\n\n//# sourceMappingURL=index.fee2d573.js.map\n","let viewport_seconds = 3600 * 4; // The number of seconds the viewport should show\nlet viewport_offset = 0;\nconst row_height = 50; // The height of a row\nconst box_height = 40; // The height of a box\nconst row_start = 10; // The height rows start at\nconst text_height = 30; // The size of the font\nlet has_resize_listener = false;\nlet scroll_timeout;\nlet last_scroll_touch_x;\nlet scrolled_distance = 0;\n\n/// Place period boxes for a list of periods.\nfunction place_boxes(data_unprocessed) {\n\tlet data = replace_period(data_unprocessed.filter(p => p.kind !== 'Passing'));\n\tif (!has_resize_listener) {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tplace_boxes(all_data);\n\t\t});\n\t\thas_resize_listener = true;\n\t\tconst set_length = event_ => {\n\t\t\tviewport_seconds = event_.target.value * 3600;\n\t\t\tplace_boxes(all_data);\n\t\t};\n\n\t\tconst set_offset = event_ => {\n\t\t\tviewport_offset = event_.target.value * 3600;\n\t\t\tplace_boxes(all_data);\n\t\t};\n\n\t\t// Update fields\n\t\tconst events = ['input'];\n\t\tgetel('timeline_length').value = viewport_seconds / 3600;\n\t\tgetel('timeline_offset').value = 0;\n\t\tfor (const event_name of events) {\n\t\t\tgetel('timeline_length')?.addEventListener(event_name, set_length);\n\t\t\tgetel('timeline_offset')?.addEventListener(event_name, set_offset);\n\t\t}\n\n\t\t// Scroll behaviour\n\t\tconst scroll = () => {\n\t\t\tscroll_timeout = false;\n\t\t\tviewport_offset += scrolled_distance * (navigator.userAgent.includes('Chrom') ? -2 : 2);\n\t\t\tscrolled_distance = 0;\n\t\t\tplace_boxes(all_data);\n\t\t\tgetel('timeline_offset').value = Math.round(viewport_offset / 360) / 10;\n\t\t};\n\n\t\tgetel('timeline')?.addEventListener('wheel', event => {\n\t\t\tconst deltaX = event.shiftKey ? event.deltaY : event.deltaX;\n\t\t\tscrolled_distance += deltaX * 3;\n\t\t\tif (!scroll_timeout) {\n\t\t\t\tsetTimeout(scroll, 10);\n\t\t\t\tscroll_timeout = true;\n\t\t\t}\n\t\t});\n\t\tgetel('timeline')?.addEventListener('touchmove', event => {\n\t\t\tconst new_touch_x = event.touches[0].clientX;\n\t\t\tif (last_scroll_touch_x) {\n\t\t\t\tscrolled_distance += (last_scroll_touch_x - new_touch_x) * 10;\n\t\t\t\tif (!scroll_timeout) {\n\t\t\t\t\tsetTimeout(scroll, 10);\n\t\t\t\t\tscroll_timeout = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlast_scroll_touch_x = new_touch_x;\n\t\t});\n\t\tgetel('timeline')?.addEventListener('touchend', () => {\n\t\t\tlast_scroll_touch_x = undefined;\n\t\t});\n\t}\n\n\t// Resolve rows so everything is mutually non-intersecting.\n\tconst boxes = [];\n\tdata = data.flat().filter(v => v);\n\tdata.sort((a, b) => a.start - b.start);\n\tfor (const period of data) {\n\t\t// Set up variables\n\t\tconst start = period.start_timestamp;\n\t\tlet row = 0;\n\t\tlet intersecting = 0;\n\t\t// Increment the row until nothing intersects.\n\t\tdo {\n\t\t\tintersecting = 0;\n\t\t\tfor (const box of boxes) {\n\t\t\t\tif (box.row === row && box.end > start) {\n\t\t\t\t\tintersecting += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (intersecting > 0) {\n\t\t\t\trow += 1;\n\t\t\t}\n\t\t} while (intersecting > 0);\n\n\t\tboxes.push({\n\t\t\trow,\n\t\t\tstart: period.start_timestamp,\n\t\t\tend: period.end_timestamp,\n\t\t\tkind: period.kind,\n\t\t\tname: period.friendly_name,\n\t\t\tperiod,\n\t\t});\n\t}\n\n\t// Determine where the boxes should be placed on-screen\n\tconst now = current_date().getTime() / 1000 + viewport_offset;\n\tconst viewport_width = getel('timeline>svg').clientWidth;\n\tfor (const box of boxes) {\n\t\tconst length = box.end - box.start;\n\t\tconst relative_time = box.start - now;\n\t\tconst fraction_time = relative_time / viewport_seconds;\n\t\tlet fraction_position = 0.5 + fraction_time;\n\t\tlet fraction_outside_length = 0;\n\t\tif (fraction_position < 0) {\n\t\t\tfraction_outside_length = -fraction_position;\n\t\t\tfraction_position = 0;\n\t\t}\n\n\t\tconst absolute_x = viewport_width * fraction_position;\n\t\tfraction_position *= 100;\n\t\tlet fraction_length = length / viewport_seconds;\n\t\tfraction_length -= fraction_outside_length;\n\t\tif (fraction_length <= 0 || fraction_position > 100) {\n\t\t\tbox.hidden = true;\n\t\t} else {\n\t\t\tfraction_length *= 100;\n\t\t\tif (fraction_length + fraction_position > 100) {\n\t\t\t\tfraction_length = 100 - fraction_position;\n\t\t\t}\n\n\t\t\tbox.x = fraction_position;\n\t\t\tbox.y = row_start + row_height * box.row;\n\t\t\tbox.w = fraction_length;\n\t\t\tbox.h = box_height;\n\t\t\tconst text_margin = (box_height - text_height) / 2;\n\t\t\tbox.tx = absolute_x + text_margin;\n\t\t\tbox.ty = box.y + box.h / 2 + text_margin * 2;\n\t\t\tbox.th = text_height;\n\t\t}\n\t}\n\n\t// Set the box's emoji and TODO color\n\tfor (const box of boxes) {\n\t\tif (box.hidden) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet emoji;\n\t\tif (box.kind.Class) {\n\t\t\temoji = '🏫';\n\t\t} else if (box.kind.ClassOrLunch) {\n\t\t\temoji = '🏫/🥪';\n\t\t} else {\n\t\t\tswitch (box.kind) {\n\t\t\t\tcase 'Lunch':\n\t\t\t\t\temoji = '🥪';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Break':\n\t\t\t\t\temoji = '🛌';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'AMSupport':\n\t\t\t\t\temoji = '🐔';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Passing':\n\t\t\t\t\temoji = '🏃';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'BeforeSchool':\n\t\t\t\t\temoji = '🌄';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'AfterSchool':\n\t\t\t\t\temoji = '🌇';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Announcements':\n\t\t\t\t\temoji = '📣';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\temoji = emoji || '😕';\n\t\t\t}\n\t\t}\n\n\t\tbox.emoji = emoji;\n\t\tbox.color = 'white';\n\t}\n\n\t// Write the boxes to the DOM\n\tgetel('boxes').innerHTML = '';\n\tfor (const box of boxes) {\n\t\tif (box.hidden) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst element = document.createElement('div');\n\t\telement.classList.add('timeline_rect');\n\t\telement.style.left = `${box.x}%`;\n\t\telement.style.top = `${box.y}px`;\n\t\telement.style.width = `${box.w}%`;\n\t\telement.style.height = `${box.h}px`;\n\t\telement.style['font-size'] = `${box.th}px`;\n\t\telement.innerHTML = ` ${box.emoji} ${period_html(box.period)}`;\n\t\tgetel('boxes').append(element);\n\t}\n\n\tconst pointer_time = new Date(current_date().getTime() + viewport_offset * 1000);\n\tgetel('pointer_time').innerHTML = pointer_time.toLocaleTimeString('en-US', {hour: 'numeric', minute: '2-digit'});\n\tconst left_time = new Date(current_date().getTime() + viewport_offset * 1000 - viewport_seconds * 500);\n\tgetel('left_time').innerHTML = left_time.toLocaleTimeString('en-US', {hour: 'numeric', minute: '2-digit'});\n\tconst right_time = new Date(current_date().getTime() + viewport_offset * 1000 + viewport_seconds * 500);\n\tgetel('right_time').innerHTML = right_time.toLocaleTimeString('en-US', {hour: 'numeric', minute: '2-digit'});\n}\n\nObject.assign(window, {\n\tplace_boxes,\n});\n"],"names":["$ee67522556725cdd$var$scroll_timeout","$ee67522556725cdd$var$last_scroll_touch_x","$ee67522556725cdd$var$viewport_seconds","$ee67522556725cdd$var$viewport_offset","$ee67522556725cdd$var$has_resize_listener","$ee67522556725cdd$var$scrolled_distance","Object","assign","window","place_boxes","$ee67522556725cdd$var$place_boxes","data_unprocessed","data","replace_period","filter","p","kind","addEventListener","all_data","set_length","event_","target","value","set_offset","event_name","getel","scroll","navigator","userAgent","includes","Math","round","event","deltaX","shiftKey","deltaY","setTimeout","new_touch_x","touches","clientX","undefined","boxes","period","flat","v","sort","a","b","start","start_timestamp","row","intersecting","box","end","push","end_timestamp","name","friendly_name","now","current_date","getTime","viewport_width","clientWidth","length","relative_time","fraction_time","fraction_position","fraction_outside_length","absolute_x","fraction_length","hidden","x","y","$ee67522556725cdd$var$row_start","$ee67522556725cdd$var$row_height","w","h","tx","ty","text_margin","th","emoji","Class","ClassOrLunch","color","innerHTML","element","document","createElement","classList","add","style","left","top","width","height","period_html","append","pointer_time","Date","toLocaleTimeString","hour","minute","left_time","right_time"],"version":3,"file":"index.fee2d573.js.map"}