var PX_PER_MINUTE = 5 var data = null; var names = document.querySelector('main #names') var times = document.querySelector('main #times') function exportCSV() { if (data == null) { alert('No data found.') return } var startInput = document.querySelector('input#start') var endInput = document.querySelector('input#end') var gameInput = document.querySelector('input#game') var startDate = new Date(startInput.value) var endDate = new Date(endInput.value) var gameRE = new RegExp(gameInput.value || '.*') csv = 'timestamp,name,game,checkpoint\n' for (var [name, list] of Object.entries(data)) { for (entry of list) { if (entry.game.match(gameRE) == null) continue var arrD = new Date(entry.arrival) if (arrD < startDate || arrD > endDate) continue var arrTS = localISOTimeSeconds(arrD) csv += `${arrTS},${name},${entry.game},${entry.checkpoint}\n` } } var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(csv)); element.setAttribute('download', 'schnitzeljagd-export.csv'); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } function renderData() { if (data == null) { alert('No data found.') return } names = document.querySelector('main #names') times = document.querySelector('main #times') names.innerHTML = '' times.innerHTML = '' var startInput = document.querySelector('input#start') var endInput = document.querySelector('input#end') var gameInput = document.querySelector('input#game') var startDate = new Date(startInput.value) var endDate = new Date(endInput.value) var gameRE = new RegExp(gameInput.value || '.*') // Clear everything below hours because that would lead to // misalignments with the day grid startDate.setMinutes(0,0,0) var tc = new Date(startDate.getTime()) var content = '' while (tc < endDate) { var h = tc.getHours() var m = tc.getMinutes() var t = (h == 0) ? ''+tc.getDate()+'.'+(tc.getMonth()+1)+'.' : h+':'+m.toString().padStart(2, "0") var left = ((tc - startDate) / (1000 * 60)) content += ''+t+'' tc.setTime(tc.getTime() + (15*60*1000)); } var timeheader = document.getElementById('timelabels') timeheader.innerHTML = content var viewwidth = ((endDate - startDate) / (1000 * 60)) timeheader.style.width = (PX_PER_MINUTE * viewwidth) + 'px' times.style.width = (PX_PER_MINUTE * viewwidth) + 'px' var rowCount = 0 for (var [name, list] of Object.entries(data)) { var row = document.createElement('div') row.classList.add('row') var rowHasBlock = false for (entry of list) { if (entry.game.match(game) == null) continue var arrD = new Date(entry.arrival) var depD = new Date(arrD) + 1000 * 60 * 5 if (depD < startDate || arrD > endDate) continue rowHasBlock = true // Minutes since start date / beginning var arr = (arrD - startDate) / (1000 * 60) var dep = (depD - startDate) / (1000 * 60) var dur = dep - arr var block = document.createElement('span') block.innerHTML = entry.checkpoint block.style.left = (PX_PER_MINUTE * arr) + 'px' // 1px/min block.style.width = (PX_PER_MINUTE * Math.max(0,(dur-14))) + 'px' // 1px/min if (entry.game == "zeitfahren") block.classList.add('blue') row.appendChild(block) } if (rowHasBlock) { var vname = name.replace(/-/g, ' ') names.innerHTML += '