var canvas,ctx;
var gridW,gridH;
var mGridW,mGridH;
var docW,docH;        
var canvasW,canvasH;      
var buffers,curBuffer;

const blockSide=4;
const divisor=4;
const fgColor=["#003300","#002200"];
const FPS=15;

function resizeBuffers()
{
    for(var j=0;j<2;j++)
        for(var i=buffers[j].length;i<mGridH;i++)
            buffers[j][i]=new Array();
}

function copyBuffer(src,dst)
{
    for(var i=0;i<mGridH;i++)
        for(var j=0;j<mGridW;j++)
            buffers[dst][i][j]=buffers[src][i][j];
}

function resizeCanvas()
{
    docW=window.innerWidth;
    docH=window.innerHeight;
    canvasW=Math.floor(docW/divisor);
    canvasH=Math.floor(docH/divisor);
    gridW=Math.floor(canvasW/blockSide);
    gridH=Math.floor(canvasH/blockSide);
    if(gridW>mGridW) mGridW=gridW;
    if(gridH>mGridH) mGridH=gridH;            
    canvas.width=canvasW;
    canvas.height=canvasH;            
    resizeBuffers();
}

function updateCanvas(invalidate)
{
    
    
    for(var i=0;i<gridH;i++)
        for(var j=0;j<gridW;j++)                
            if(buffers[curBuffer][i][j]!=buffers[1-curBuffer][i][j] || invalidate)
            {
                ctx.fillStyle=fgColor[i%2];
                if(buffers[curBuffer][i][j]==1) ctx.fillRect(j*blockSide, i*blockSide, blockSide, blockSide);
                else ctx.clearRect(j*blockSide, i*blockSide, blockSide, blockSide);
            }
                                          
    curBuffer=(curBuffer+1)%2; 
    copyBuffer(1-curBuffer,curBuffer);            
}

function resizeEvent()
{
    resizeCanvas();
    updateCanvas(true);
}

function bginit()
{                        
    canvas = document.getElementById("bgcanvas");   
    ctx = canvas.getContext("2d");          
    mGridW=0;mGridH=0;            
    
    curBuffer=0;
    buffers = new Array();
    buffers[0] = new Array();
    buffers[1] = new Array();
    
    resizeCanvas();                                               
    updateCanvas(true);
    snowInit();
    
    mainLoop();
}

function mainLoop()
{
    snowLoop();              
    updateCanvas(false);
    setTimeout(mainLoop, 1000/FPS);
    //setTimeout(mainLoop, 1);
}
    
