var no = 10;                   
var speed = 50;
var exptime = 500;		var bStartImmediately = 0;
var imgSnowflake = "flake3.gif";    var imgExplode = "explode.gif";    var bExplode = 0; 
var tmpspeed = speed;                var bHasFallen = 0;

var dx, xp, yp;
var am, stx, sty;
var snowobj;
var i, doc_width = 1024, doc_height = 768;
var bPaused = 0;
var bStopped = 0;
var bSetup = 0;

//Don't run inside <head></head>. Run only inside <body></body>
function setupSnow() {
    
  if (self.innerHeight) // all except Explorer
  {
    x = self.innerWidth-10;
    y = self.innerHeight-50;
  }
  else if (document.documentElement && document.documentElement.clientHeight)
// Explorer 6 Strict Mode
  {
    x = document.documentElement.clientWidth;
    y = document.documentElement.clientHeight;
  }
  else if (document.body) // other Explorers
  {
    x = document.body.clientWidth;
    y = document.body.clientHeight;
  }

  doc_width  = x;   doc_height = y;   
  dx = new Array();
  xp = new Array();
  yp = new Array();
  am = new Array();
  stx = new Array();
  sty = new Array();
  snowobj = new Array();
  expTimer = new Array();

  for (i=0; i<no; ++i) {            dx[i] = 0;                     xp[i] = Math.random()*(doc_width-50);    yp[i] = Math.random()*doc_height;
   am[i] = Math.random()*20;                stx[i] = 0.02 + Math.random()/10;        sty[i] = 0.7 + Math.random();         
   flakeBlob = "<div id=\"flake"+ i +"\" onclick=\"javascript:destructFlake("+ i +");\" style=\"" + "position:absolute; z-index:"+ (i+25) +"; visibility:visible; " + "\"><img id=\"imgflake" + i + "\" src=\""+ imgSnowflake + "\" border=0></div>";

   document.write(flakeBlob);
   snowobj[i] = xGetElementById("flake"+i);

  }
  flake_height = xGetElementById("imgflake0").height; 

  bSetup = 1;
  resetSnow();

} 
function resetSnow() {
  for (i=0; i<no; ++i) {            dx[i] = 0;                     xp[i] = Math.random()*(doc_width-50);    yp[i] = Math.random()*doc_height;
   am[i] = Math.random()*20;                stx[i] = 0.02 + Math.random()/10;        sty[i] = 0.7 + Math.random();           
   xTop(snowobj[i],-70);
  } 
}


function snowDocument() {         if (bSetup == 0) { setupSnow(); }

   if (bPaused == 0) {
      for (i=0; i<no; ++i) {      	 yp[i] += sty[i];

	 if (yp[i] > doc_height-flake_height) {
	    bHasFallen = 1;
	    xp[i] = Math.random()*(doc_width-am[i]-30);
	    yp[i] = -20;
	    stx[i] = 0.02 + Math.random()/10;
            sty[i] = 0.7 + Math.random();
	 } else { bHasFallen = 0; }

	 dx[i] += stx[i];
	
	 xMoveTo(snowobj[i],xp[i] + am[i]*Math.sin(dx[i]),yp[i]);

	 flakeSrc = document.getElementById('imgflake' + i).src;

	 if (flakeSrc.substr(flakeSrc.length - imgExplode.length,imgExplode.length) == imgExplode) {
	    isSploding = 1;
	 } else { isSploding = 0; }

	 if (isSploding == 1) { 
            if (isNaN(expTimer[i])) { expTimer[i] = 0; }
	                expTimer[i] += speed;
            if (expTimer[i] > 500) { 
	       yp[i] = doc_height-50;        
	       xMoveTo(snowobj[i],-50,doc_height-50);

	       document.getElementById('imgflake' + i).src = imgSnowflake;
	       expTimer[i] = 0;
            } 	 }       
      }       
      setTimeout("snowDocument()", speed);
   } 
} 

function pauseSnow() {
  if (bSetup == 0) { setupSnow(); }
  if (bPaused == 0) { 
    tmpspeed = speed;
    speed = 9999999999999; 
    bPaused = 1;
    }
  else { 
    speed = tmpspeed;
    bPaused = 0;
    snowDocument();
  }
}

function startstopSnow() {
    if (bSetup == 0) { setupSnow(); } 
    if (bPaused == 0) { pauseSnow(); 
    resetSnow();
    } 
    else if (bPaused == 1) { pauseSnow(); } 
}


function destructFlake(flakeid) {
  if (bExplode == 1) {
    document.getElementById('imgflake' + flakeid).src = imgExplode;
  }
}


function xDef() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  return true;
}

function xStr(s) {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') return false;}
  return true;
}

function xNum(n) {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='number') return false;}
  return true;
}

function xGetElementById(e) {
  if(typeof(e)!='string') return e;
  if(document.getElementById) e=document.getElementById(e);
  else if(document.all) e=document.all[e];
  else e=null;
  return e;
}

function xMoveTo(e,iX,iY) {
  xLeft(e,iX);
  xTop(e,iY);
}
function xLeft(e,iX) {
  if(!(e=xGetElementById(e))) return 0;
  var css=xDef(e.style);
  if (css && xStr(e.style.left)) {
    if(xNum(iX)) e.style.left=iX+'px';
    else {
      iX=parseInt(e.style.left);
      if(isNaN(iX)) iX=0;
    }
  }
  else if(css && xDef(e.style.pixelLeft)) {
    if(xNum(iX)) e.style.pixelLeft=iX;
    else iX=e.style.pixelLeft;
  }
  return iX;
}

function xTop(e,iY) {
   if(!(e=xGetElementById(e))) return 0;
   var css=xDef(e.style);
   if(css && xStr(e.style.top)) {
      if(xNum(iY)) {
	 e.style.top=iY+'px';
      } else {
	 iY=parseInt(e.style.top);
	 if(isNaN(iY)) iY=0;
      }
   } else if(css && xDef(e.style.pixelTop)) {
   
      if(xNum(iY)) e.style.pixelTop=iY;
      else iY=e.style.pixelTop;
   }
  return iY;
}




