/* snow.js -- JavaScript to make it snow!
 *
 * Darren Provine, 27 January 2005
 */


// for random numbers
var seed;

// for moving background, like with rain
var offset = "0 0";
var snow = 1;

var steps;
var numflakes = 24;

// for individual flakes, like xsnow
var first_flake = document.images.length;
var flakex = new Array(numflakes); // left
var flakey = new Array(numflakes); // top

var flakef = new Array(numflakes); // fallrate
var flakew = new Array(numflakes); // wander rate

var farRight, farLeft, bottom;

// Algorithm 2 from CACM, pg. 1195, vol. 31, no. 10, (October, 1988).
// found at "http://www.bsdg.org/swag/TEXTFILE/0075.PAS.html"
// hacked because JavaScript doesn't have strong typing
function random()
{
    var lo, hi, test;

    var MODULUS    = 2147483647;
    var MULTIPLIER = 16807;
    var QUOTIENT   = 127773;    // MODULUS div MULTIPLIER
    var REMAINDER  = 2836;      // MODULUS mod MULTIPLIER

    // First, perform the calculation while avoiding overflow.
    hi   = Math.floor(seed / QUOTIENT);
    low  = seed % QUOTIENT;
    test = (MULTIPLIER * low) - (REMAINDER * hi);

    // Second, update the seed for next time.
    seed = test;

    while (seed < 0) {
        seed = seed + MODULUS;
    }
    while (seed > MODULUS) {
        seed = seed / 2;
    }

    // Return something between 0 and 1
    return seed / MODULUS;
}

// set everything up
function setup()
{
    // setup pseudo-random numbers
    var today   = new Date();
    seed = today.getTime();

    space = window.innerWidth / (numflakes + 2);

    // set up flakes
    for (i = 0; i < numflakes; i++) {
        flakex[i] = i * space + 1;
        flakey[i] = 0;
        flakef[i] = 1 + random() * 2;
        flakew[i] = random() * 5 - 1;
        flakew[i] = 2;
    }

    flakestyle = new Array(numflakes);

    for (i = numflakes - 1; i >= 0; i--) {
        name = "flake" + i;
        flake = document.getElementById(name);
        flakestyle[i] = flake.style;
    }

//    hr_bar = document.getElementById("fullsize");
//    alert(hr_bar.width);
//    farRight = parseInt(hr_bar.style.width);

    farLeft = 8;
    farRight = window.innerWidth - 30;
    bottom   = window.innerHeight - 12 ;

    steps = 0;
}

function startsnow() {
    for (i = numflakes - 1; i >= 0; i--) {
        flakey[i] = 0 - (random() * window.innerHeight);
        flakestyle[i].top = flakey[i];
    }

    flakes();
}

function pileup() {
    var pile = document.getElementById("snowpile");

    place = parseInt(pile.style.bottom);

    if ( place  < 0 ) {
        place += 1;

        pile.style.bottom = place + "px";


        //setTimeout("pileup()", 10000);
    }
}

function flakes() {

    farRight = window.innerWidth - 30;
    bottom   = window.innerHeight - 12 ;

    for (i = numflakes - 1; i >= 0; i--) {

        flakex[i] += flakew[i];
        if (flakex[i] > farRight) {
            flakex[i] = 9;
        } else if (flakex[i] < 8) {
            flakex[i] = farRight - 12;
        }    

        flakestyle[i].left = flakex[i];

        flakey[i] += flakef[i];
        if (flakey[i] > bottom) {
            flakey[i] = 0;
            flakef[i] = 2 + random() * 2;
            //flakew[i] = random() * 5 - 1;
            flakew[i] = 2;

            // raise the pile of snow at the bottom of the window
            if ( i == 1 ) {
                pileup();
            }
        }    

        flakestyle[i].top  = flakey[i];
    }

    if (snow) {
        setTimeout("flakes()", 30);
    }
}

function animate() {

    coords = offset.split(" ");

    oldx = parseInt(coords[0]);
    oldy = parseInt(coords[1]);

    deltay = random() * 2 + 1;
    deltax = random() * 5 - 2 ;
    x = oldx + deltax;
    y = oldy + deltay;

    x = oldx + 1;
    y = oldy + 3;

    new_offset = x + "px " + y + "px";

    offset = new_offset;

    document.body.style.backgroundPosition = new_offset;

    if (snow == 1) {
        setTimeout("animate()", 50);
    }
}

function stop(){
//    document.body.style.backgroundImage = "snow13b.png";
//    window.status = "Go shovel!";
    snow = 0;
}


function start(){
//    document.body.style.background = "#cccccc";
    setup();
    snow = 1;
    startsnow();
}

/*
<a style="background-color:#ccffff;" onclick="start();">make it rain!</a>
<a style="background-color:#ff9999;" onclick="stop();">make it stop!</a>
*/

