<!--
Author: Kjetil Liestøl Nielsen
Email: kjetil.l.nielsen@usn
Licence: CC BY-NC-SA 4.0
-->

<!doctype html>
<html  lang="no">
<head>
    <meta charset = "UTF-8">
    <title>PfDK i Realfag</title>
</head>
<body onload="initLoop()">
<script type="text/javascript">
"use strict"

var canvas = document.createElement("canvas");
canvas.style.border = "2px solid black";
canvas.width = 640;
canvas.height = 480;

document.body.appendChild(canvas);
var ctx = canvas.getContext("2d");
ctx.imageSmoothingEnabled = false;

var keydown = {};
var keyup = {};
var mousedown = {};
var mouseup = {};
var mousehold = {};
var keyhold = {};
var mouse = {x: 0, y: 0};
var events = [];
var eventTypes = {keydown: 1, keyup: 2, mousedown: 3, mouseup: 4};

function mouseButton(list, code, bool){
    switch(code){
        case 0: list.left = bool; break;
        case 1: list.middle = bool; break;
        case 2: list.right = bool; break;
    }
}

document.addEventListener("keydown", function(event) {
    keyhold[event.code] = true;
    var event = {
        type: eventTypes.keydown,
        code: event.code,
        repeat: event.repeat
    };
    events.push(event);
});

document.addEventListener("keyup", function(event) {
    keyhold[event.code] = false;

    var event = {
        type: eventTypes.keyup,
        code: event.code,
    };
     events.push(event);
});

document.addEventListener('mousemove', function(event) {
    var rect = canvas.getBoundingClientRect();
    mouse.x = event.clientX - rect.left;
    mouse.y = event.clientY - rect.top;
});

document.addEventListener('mousedown', function(event) {
    mouseButton(mousehold, event.button, true);
    var event = {
        type: eventTypes.mousedown,
        button: event.button
    };
    events.push(event);
});

document.addEventListener('mouseup', function(event) {
    mouseButton(mousehold, event.button, false);
    var event = {
        type: eventTypes.mouseup,
        button: event.button
    };
    events.push(event);
});

function initLoop() {
    if(typeof(loop) == "function") {
        var oldtime = window.performance.now()
        var dt;
        function mainLoop(){
            var newtime = window.performance.now();
            dt = Math.min(1/30, (newtime - oldtime) / 1000);

            keydown = {};
            keyup = {};
            mousedown = {};
            mouseup = {};

            var event;
            while(events.length > 0) {
                event = events[events.length - 1];
                switch(event.type) {
                    case eventTypes.keydown: {
                        if(!event.repeat){
                            keydown[event.code] = true;
                        }
                    } break;
                    case eventTypes.keyup: {
                        keyup[event.code] = true;
                    } break;
                    case eventTypes.mousedown: {
                        mouseButton(mousedown, event.button, true);
                    } break;
                    case eventTypes.mouseup: {
                        mouseButton(mouseup, event.button, true);
                    } break;
                }
                events.splice(0,1);
            }
            ctx.clearRect(0,0,canvas.width, canvas.height);
            loop(dt);

            oldtime = newtime;
            window.requestAnimationFrame(mainLoop);
        };
        window.requestAnimationFrame(mainLoop);
    }
}
</script>
<script type="text/javascript" src="index.js"></script>
</body>
</html>