//---------------------------------------------------------------------------------------
// XSnow für JavaScript - von Mag. Dr. Nikolaus Klepp - dr.klepp@gmx.at - www.klepp.info
//---------------------------------------------------------------------------------------
/*  jsSnow
    Copyright (C) 2002 Mag. Dr. Nikolaus Klepp <dr.klepp@gmx.at>
	Copyright (C) 2002 INOUE Hiroyuki <dombly@kc4.so-net.ne.jp>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.



    include with   
    onLoad="start('jsSnow')"
    and
    <DIV ID="jsSnow"></DIV>
    images are
    pictures/snow/snow0.gif ... pictures/snow/snow6.gif


*/
//---------------------------------------------------------------------------------------

window.onerror = null;

var snow_ns6 = (!document.all && document.getElementById);
var snow_ie4 = (document.all);
var snow_ns4 = (document.layers);

var pageWidth  = 0;			// Page dimension & visible offset
var pageHeight = 0;
var pageOffX   = 0;
var pageOffY   = 0;


// <---- Customizable part ----
var imageDir   = 'pictures/snow/';

var flakes = 20;						// total number of snowflakes
var flake_speed_PperS = 300;			// Pixel/Second
var flake_speed = 0;
var flake_TX = 3.0;						// max. time of flakes constant X-movement

var subpixel = 10;						// subpixel
// ---- Customizable part ---->


var refresh_FperS = 20;					// initial Frames/second, recalculated.
var refresh 	  = 1000/refresh_FperS;	// ms/Frame

var flake   = new Array(flakes);
var flakeX  = new Array(flakes);
var flakeY  = new Array(flakes);
var flakeSX = new Array(flakes);
var flakeVX = new Array(flakes);
var flakeVY = new Array(flakes);


var timer_id    = 0;		// ID if timer proc.
var timer_sum   = refresh;	// Inital values for speed calculation
var timer_count = 1;		// --''--


//-------------------------------------------------------------------------
// berechnet die optimale Frametate + geschwindigkeiten
//-------------------------------------------------------------------------
function rebuild_speed_and_timer() {
	var old = refresh_FperS;
	refresh = Math.floor(timer_sum/timer_count*2)+10;	// ms/Frame + spare
	refresh_FperS = Math.floor(1000/refresh);			// frames/second

	flake_speed = flake_speed_PperS/refresh_FperS;		// pixel/second  --> pixel/frame

	if (timer_id) window.clearInterval(timer_id);		// adapt timer
	timer_id = window.setInterval('move_snow_and_santa()',refresh);

	timer_count /= 2;	// gleitendes Mittel
	timer_sum   /= 2;
}



//-------------------------------------------------------------------------
// Alle Layer + Objekte erzeugen
//-------------------------------------------------------------------------
function init_snow_and_santa(master_layer) {
	var a = ''
	// Schneeflocken
	for (var i=0; i<flakes; i++) {
		a += '<div id="flake'+i+'" style="position: absolute; left:-1px; top:-1px; z-index:0;"><img src="'+imageDir+'snow'+(i % 7)+'.gif"></div>\n';
	}
	
	// in den Ziellayer übertragen
	write_to_layer(master_layer,a);

	for (var i=0; i<flakes; i++) {
		flake[i]   = init_obj('flake'+i);
		flakeX[i]  = Math.random()*pageWidth*subpixel;
		flakeY[i]  = Math.random()*pageHeight*subpixel;
		flakeSX[i] = 0;
		flakeVX[i] = 0;
		flakeVY[i] = subpixel*10;
	}
}



//-------------------------------------------------------------------------
// Alle Layer + Objekte erzeugen
//-------------------------------------------------------------------------
function init_obj(id) {
	if (snow_ns6)	{	return document.getElementById(id);		}
	if (snow_ie4)	{	return document.all[id];				}
	if (snow_ns4) 	{	return document.layers[id];				}
}




//-------------------------------------------------------------------------
// alle objekte bewegen
//-------------------------------------------------------------------------
function move_snow_and_santa() {
	var beginn = new Date();
	beginn = beginn.getMilliseconds();
	move_snow();
	var ende = new Date();
	ende = ende.getMilliseconds();
	var diff = (beginn>ende?1000+ende-beginn:ende-beginn);
	timer_sum   += diff;
	timer_count ++;
	if (timer_count>10) {
		rebuild_speed_and_timer();
	}
}


//-------------------------------------------------------------------------
// Bewegung der Schneeflocken
//-------------------------------------------------------------------------
function move_snow() {
	for (var i=0; i<flakes; i++) {
		// schnee außerhalb des Bildschirms ?
		flakeX[i] += flakeVX[i];
		flakeY[i] += flakeVY[i];
		if (flakeY[i]/subpixel>pageHeight-32) {
			flakeX[i]  = Math.random()*pageWidth*subpixel;
			flakeY[i]  = 0;
			flakeVY[i] = flake_speed+Math.random()*flake_speed;
			if (Math.random()<0.1) flakeVY[i] *= 2.0;
		}

		// Bewegungszyclus
		flakeSX[i] --;
		if (flakeSX[i] < 0) {
			flakeSX[i] = Math.random()*subpixel*refresh_FperS*flake_TX;
			flakeVX[i] = (Math.random()-0.5)*flake_speed;
		}

		// Position neu setzen
		move_to(flake[i],Math.floor(flakeX[i]/subpixel),Math.floor(flakeY[i]/subpixel),(flakeX[i]/subpixel<pageWidth-32));
	}
}



//-------------------------------------------------------------------------
// bewegt ein Objekt
//-------------------------------------------------------------------------
function move_to(obj, x, y, visible) {
	if (visible) {
		if (snow_ie4) {
			obj.style.pixelLeft = x;
			obj.style.pixelTop  = y;
			obj.style.visibility= "visible";
		} else if (snow_ns4) {
			obj.left 			= x;
			obj.top				= y;
			obj.visibility 		= "show";
		} else if (snow_ns6) {
			obj.style.left 		= x+"px";
			obj.style.top		= y+"px";
			obj.style.display 	= "block";
		}
	} else {
		if (snow_ie4) { obj.style.visibility = "hidden";}
		if (snow_ns4) { obj.visibility 		= "hide";}
		if (snow_ns6) { obj.style.display 	= "none";}
	}
}




//-------------------------------------------------------------------------
// fülle einen Layer mit neuem Inhalt
// --- Parameter: Layer-Name, neuer Inhalt
//-------------------------------------------------------------------------
function write_to_layer(layer,txt) {
	if (snow_ie4) {
		document.all[layer].innerHTML = txt;
	} else if (snow_ns4) {
		document[layer].document.write(txt);
		document[layer].document.close();
	} else if (snow_ns6) {
		over = document.getElementById(layer);
		range = document.createRange();
		range.setStartBefore(over);
		domfrag = range.createContextualFragment(txt);
		while (over.hasChildNodes()) {
			over.removeChild(over.lastChild);
		}
		over.appendChild(domfrag);
	}
}





//-------------------------------------------------------------------------
// Größe des sichtbaren Bereiches
//-------------------------------------------------------------------------
function get_page_dimension(master_layer) {
	// Seitenbreite & Höhe bestimmen
	if(snow_ns6) {
		pageOffX   = scrollX;
		pageOffY   = scrollY;
		pageWidth  = innerWidth  + pageOffX;
		pageHeight = innerHeight + pageOffY;
	} else if(snow_ns4) {
		pageOffX   = window.pageXOffset;
		pageOffY   = window.pageYOffset;
		pageWidth  = innerWidth  + pageOffX;
		pageHeight = innerHeight + pageOffY;
	} else if(snow_ie4) {
		pageOffX   = document.body.scrollLeft;
		pageOffY   = document.body.scrollTop;
		pageWidth  = document.body.clientWidth  + pageOffX;
		pageHeight = document.body.clientHeight + pageOffY;
	}
}


//-------------------------------------------------------------------------
// Intalisiert alle Objekte und Timer
//-------------------------------------------------------------------------
function start(master_layer) {
    
    // snow takes too many resources on ! IE browsers
    return;
    
	// Seitenbreite & Höhe alle Sekunden neu bestimmen
	window.setInterval('get_page_dimension("'+master_layer+'")',1000);
	get_page_dimension(master_layer);

	// Schneeflocken, Weihnachtsmann + Bäume platzieren
	init_snow_and_santa(master_layer);
	rebuild_speed_and_timer(refresh);

	// alle positionen neu berechnen
	timer_id = window.setInterval('move_snow_and_santa()',refresh);
}











