//	Original: FREE 2006 Peter Mlich http://www.volny.cz/peter.mlich/
// --- Snih + zapadavani ---
var snowAreaWidth  = 200;
var snowAreaHeight = 130;
var snowFlakes     = 20;	// >0
var sFlakewh       = 2;		// 3x3
var sFlakespeedmax = 2;
var sFlakespeedmin = 1; 	// >0
var sDroppedMax    = 1500;	//max to reset
var sDrop          = true;	// true/false
var flakeStyleParam= new Array();
var objBottomLine  = null;
var timerID    = null;
var timerSpeed = 120;
var stopT      = 0;
var html,body,max_x,max_y,sBottomLine,sDroppedPos,oBottomLine;
var v = new Array(snowFlakes);
var d = document;

function objGet(x)	{return d.getElementById?d.getElementById(x):d.all?d.all[x]:d.layers?d.layers[x]:null;}
function creEL(d,x)	{return d.createElement(x);}
function appEL(d,x)	{d.appendChild(x);}
function creaddTN(d,o,x){var t=d.createTextNode(x);o.appendChild(t);}

function objText(x,y1,y2)
{
this.x =x;
this.y1=y1;
this.y2=y2;
}

function objFlakeStyle(f)
{
this.position   = "absolute";
this.fontSize   = 0;
this.lineHeight = 0;
this.background = "#fff";
this.border     = "1px solid #cde";
this.borderWidth= "0 1px 1px 0";
this.mozBorderRadius = 6+"px";
this.height     = f.size+"px";
this.width      = f.size+"px";
this.left       = f.x+"px";
this.top        = f.y+"px";
}

function objSnowFlake(i)
{
this.x = Math.round(Math.random() * max_x);
this.y = Math.round(Math.random() * max_y);
this.speed = Math.round(Math.random() * sFlakespeedmax) + sFlakespeedmin;
this.size  = Math.floor(Math.random() * sFlakewh) + 1;
this.objID = "s"+i;
this.showPos = function(){var z=objGet(this.objID).style; z.left=this.x+"px"; z.top=this.y+"px";}
}

function initSnow()
{var a,i,j,o,ox;
sDroppedPos = 0
html = d.getElementsByTagName('html')[0];
body = d.getElementsByTagName('body')[0];
//if (document.all) {body.style.height="100%";}
//html.style.overflow="hidden";
o = objGet("snowArea");
	o.innerHTML = "";
	o.style.overflow   = "hidden";
	o.style.width      = snowAreaWidth  +"px";
	o.style.height     = snowAreaHeight +"px";
//	o.style.position   = "relative";
//	o.style.background = "#8ce";
//	o.style.border     = "1px solid #88b";
o.style.position   = "absolute";
o.style.display    = "block";
o.style.top="0";
o.style.left = 800 +"px";


ox=creEL(d,'DIV');
	ox.id="snowFlakes";
	ox.style.position = "absolute";
	ox.style.top      = 0;
appEL(o,ox); 
ox=creEL(d,'DIV');
	ox.id="bottomLine";
	ox.style.position = "absolute";
	ox.style.top      = 0;
appEL(o,ox); 
max_x = o.offsetWidth - sFlakewh;
max_y = o.offsetHeight;
sBottomLine   = new Array(max_x+sFlakewh<<1);
for (i=-sFlakewh;i<max_x+sFlakewh;i++) {sBottomLine[i] = max_y;}
objBottomLine = objGet("bottomLine");

o = objGet("snowFlakes");
for (i=0;i<snowFlakes;i++)
	{
	v[i]  = new objSnowFlake(i);
	a     = new objFlakeStyle(v[i]);
	ox    = creEL(d,'DIV');
	ox.id = v[i].objID;
	for (j in a)
		{ox.style[j] = a[j];}
	appEL(o,ox); 
	}
flakeStyleParam = new objFlakeStyle(v[0]);
oBottomLine     = new Array();
//pisNapis('Ahoj');
pisObrazky();
}

function hodiny()
{
window.clearTimeout(timerID)

var i,j,k,ox,presun,s,a,b,c,m,n;
for (i=0;i<snowFlakes;i++)
	{
	presun = 0;
	if (sDrop)
	 {
	//y>max_y collision
	s = new Array();
	b = 0;
	c = v[i].y+v[i].size+v[i].speed;
	for (j=0;j<v[i].size;j++)	//bottom? pocet kolizi
		{s[j]=(c>=sBottomLine[v[i].x+j])?1:0; b+=s[j];}
	if (b>0)
		{
		presun = 1;
//if (v[i].size>0 || (v[i].size==1)
			//edge?
			{
			a = (v[i].size)*2;
			b = 0; for(k=0;k<a;k++)		{b+=s[k];}
			c = 0; for(k=a;k<v[i].size;k++) {c+=s[k];}
			if (b<a && c<a && Math.random()*2>1) {b=a;} else {c=a;}
			      if (b<a) {v[i].x-=a; presun=0;
					for (j=0;j<v[i].size;j++) {if (c>=sBottomLine[v[i].x+j]) {presun=1;break;}}}
			else {if (c<a) {v[i].x+=a; presun=0;
					for (j=0;j<v[i].size;j++) {if (c>=sBottomLine[v[i].x+j]) {presun=1;break;}}}}
			}
		//change Bottomline
		if (presun==1)
			{
			a = v[i].size;
			for (j=0;j<a;j++)
				{sBottomLine[v[i].x+j]--;}	//alg3
//				{sBottomLine[v[i].x+j]-=a;}	//alg1
//				{sBottomLine[v[i].x+j]=v[i].y;}	//alg2
			}
		}
	//obj simple collision
        if (presun==0)
	  {
	b = v[i].x-(v[i].size>>1);
	c = v[i].y+v[i].size+v[i].speed;
	for (j in oBottomLine)
		{
		if (oBottomLine[j].x==b && c>oBottomLine[j].y1 && c<oBottomLine[j].y2 && Math.random()*7<1)
			{presun=2; oBottomLine[j].y1--; break;}
//-=v[i].size
		}
	  }
	 }
	if (presun>0)
		{
		//move to Dropped
		a = objGet(v[i].objID);
		ox= creEL(d,'DIV');
		for (j in flakeStyleParam)
			{ox.style[j] = a.style[j];}
		appEL(objBottomLine,ox); 
		sDroppedPos++;
		if (sDroppedPos>sDroppedMax || sBottomLine[v[i].x]<5) {stopT=1; initSnow(); hodiny(); stopT=0; break;}

		//new Flake
		v[i]   = new objSnowFlake(i);
		v[i].y = 0;
		}
	else	{
		//change xy
		v[i].x+= 1 - Math.floor(Math.random() * 3);
		v[i].y+= v[i].speed;
		}
	v[i].showPos();
	}

if (stopT==0) {timerID=window.setTimeout("hodiny()",timerSpeed);}
}

function pisObrazky()
{
var i,x,y,k,yy;
x = 43;
y = 37;
yy= 0;
k = oBottomLine.length; //pridam za lajnu
for (i=0;i<70;i+=2)
	{
	yy = Math.floor(y-0.3*i);
	k++;
	oBottomLine[k] = new objText(x+i,yy,yy+5);
	}
for (i=70;i<140;i+=2)
	{
	yy = Math.floor(y-0.3*(140-i));
	k++;
	oBottomLine[k] = new objText(x+i,yy,yy+5);
	}
yy = 105;
for (i=0;i<140;i+=2)
	{
	k++;
	oBottomLine[k] = new objText(x+i,yy,yy+10);
	}
}

function pisNapis(vText)
{
vText = vText.split("");
var vPismenka =
	{
	"A":new Array(0.2 ,0.5 ,0.8 ,0.3),
	"h":new Array(1   ,0.5 ,0.75,0.4),
	"o":new Array(0.5 ,0.75,0.5),
	"j":new Array(0.75,0.9)
	};
var i,j,k,l,x,y,z,a,b, o,ox,fsize;
fsize = 20;
x = 100;
y = 150;
k = oBottomLine.length;
o = objGet("snowArea");
for (i in vText)
	{
	a=vText[i];
	ox=creEL(d,'DIV');
		ox.style.position   = "absolute";
		ox.style.left       = x+"px";
		ox.style.top        = y-fsize+"px";
		ox.style.fontSize   = fsize+"px";
		ox.style.lineHeight = fsize+"px";
		creaddTN(d,ox,a);
	appEL(o,ox); 
	for (j in vPismenka[a])
		{
		b = y-vPismenka[a][j]*fsize;
		for (l=0;l<3;l++)	//3x
			{oBottomLine[k] = new objText(x+j*3+l,b,y); k++;}
		}
	x+=fsize;
	}
}
