(function(){ class Animator { constructor(canvas, context){ this.drawables = []; this.canvas = canvas; this.context = context || canvas.getContext('2d'); this.timerId = -1 this.canvas.width = this.context.width = window.innerWidth*2; this.canvas.height = this.context.height = window.innerHeight*2; this.context.clearRect(0, 0, window.innerWidth, window.innerHeight) }; draw(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) for(var i of this.drawables){ i.draw(this.context); } }; update(){ for(var i of this.drawables){ i.update(this.drawables); } this.draw(); }; start(){ if(this.timerId>0) clearInterval(this.timerId); this.timerId = window.setInterval(this.update.bind(this), 16); }; stop(){ if(this.timerId>0) clearInterval(this.timerId); }; }; class Clock { constructor(x, y, scale=1){ this.center = {x:x*scale, y:y*scale} this.radius = (Math.min(window.innerWidth, window.innerHeight) / 2 - 200) * scale this.strokeThickness = 2 * scale this.circleThickness = 4 * scale this.strokeColor = "rgba(17, 17, 17, 1)" this.strokeStyle = "solid" this.fillColor = "rgba(0, 0, 0, 0)" this.scale=scale } draw(ctx){ ctx.beginPath() ctx.strokeStyle = this.strokeColor ctx.fillStyle = this.fillColor ctx.ellipse(this.center.x, this.center.y, this.radius, this.radius, 0, 0, 360, false) ctx.fill() ctx.closePath() ctx.stroke() var startOfYear = new Date(new Date().getFullYear(), 0, 1) var endOfYear = new Date(new Date().getFullYear()+1, 0, 1) var lastMonth = -1 ctx.beginPath() ctx.fillStyle = "rgba(0, 0, 0, 0.15)" ctx.arc(this.center.x, this.center.y, this.radius, Math.PI/2, Math.PI/2 + Math.PI * 2 * (+new Date() - startOfYear) / (endOfYear - startOfYear), !true) ctx.lineTo(this.center.x, this.center.y) ctx.closePath() ctx.fill() ctx.beginPath() var d = new Date(startOfYear); const days = (endOfYear - startOfYear)/(1000*60*60*24); //days for(var i = 0; i