function Board(boardState, lineColor, deadCellColor, aliveYoungCellColor, aliveOldCellColor, cellWidth, cellHeight, rowPadding, colPadding, canvas) { this.onClick = function (clickHandler) { var _this = this; canvas.addEventListener('click', function (e) { var x = e.clientX - canvas.getBoundingClientRect().left; var y = e.clientY - canvas.getBoundingClientRect().top; var cellX = Math.floor(x / (_this.cellWidth + 2)); var cellY = Math.floor(y / (_this.cellHeight + 2)); clickHandler(cellX, cellY); }); }; this.draw = function () { canvasWidth = (cellWidth + rowPadding) * 50 - 2; canvasHeight = (cellHeight + colPadding) * 30 - 2; canvas.width = canvasWidth; canvas.height = canvasHeight; canvas.style.background = lineColor; canvas.style.boxShadow = '5px 5px 25px 0px rgba(46, 61, 73, 0.2)'; this.ctx = canvas.getContext('2d'); this.cellWidth = cellWidth; this.cellHeight = cellHeight; this.update(boardState); }; this.update = function (state) { var _this2 = this; var cellColorFromState = [deadCellColor, aliveOldCellColor, aliveYoungCellColor]; state.forEach(function (row, rowIndex) { var y = (_this2.cellHeight + colPadding) * rowIndex; row.forEach(function (cell, cellIndex) { var x = (_this2.cellWidth + rowPadding) * cellIndex; _this2.ctx.fillStyle = cellColorFromState[cell]; _this2.ctx.fillRect(x, y, _this2.cellWidth, _this2.cellHeight); }); }); }; this.handleResize = function (windowWidth, state) { var scale = windowWidth / canvasWidth; if (scale < 1) { canvas.width = canvasWidth * (scale - 0.1); canvas.height = canvasHeight * (scale - 0.1); this.cellWidth = (canvas.width - 2 * 50) / 50; this.cellHeight = (canvas.height - 2 * 30) / 30; this.update(state); } else { canvas.width = canvasWidth; canvas.height = canvasHeight; this.cellWidth = cellWidth; this.cellHeight = cellHeight; this.update(state); } }; } define(function () { return Board; });