/*
 * Copyright 2006, Peter Rowntree. All Rights Reserved.
 * http://www.hdyn.com/wr/common/contact.php?addr=pr
 */

function testStars()
{
   var stars=initStars(document.getElementById("holder"));
   stars.setDensity(300);
   stars.start();
}

var g_stars=null;
var g_shapes=["*","'","°","."];//,"+","-","&#x253C;","&#x256A;","&#x256B;","&#x256C;","&#x2022;","&#x066D;"];
function initStars(holder)
{
   g_stars=new Stars("g_stars",holder);
   window.onresize=doResize;
   return g_stars;
}

function Stars(name,holder)
{
   this.clock=new GPTimer();
   this.nodeSet=null;
   this.name=name;
   this.holder=holder;
   this.density=100;   //stars per million px
   this.nStars=100;
   this.waitMillis=20;
   this.setDensity=function(density)
   {
      this.density=density;
   }
   this.twinkle=function()
   {
      var holder=this.holder;
      if(this.nodeSet == null || holder == null)
         return;
      var flags=0;   //1:color; 2:shape; 4:pos; 8:size;
      var nNodes=this.nodeSet.length;
      var node=null;
      if(nNodes > 0)
      {
         node=this.nodeSet.item(rand(nNodes));
         if(nNodes > this.nStars)
            holder.removeChild(node);
         else
            flags=rand(16);
      }
      this.changeNode(node,flags);
      this.clock.doAfter(this.name+".twinkle()",this.waitMillis);
   }
   this.start=function()
   {
      this.setHolder();
      this.twinkle();
   }
   this.setHolder=function()
   {
      var holder=this.holder;
      holder.style.width="100%";
      holder.style.height="100%";
      this.nStars=Math.floor(holder.offsetWidth*holder.offsetHeight/1000000*this.density);
      if(this.nStars < 1)
         this.nStars=1;
      this.waitMillis=Math.floor(4000/this.nStars);
      if(this.waitMillis < 8)
         this.waitMillis=8;
      this.prebuild();
   }
   this.clear=function(clrHolder)
   {
      this.nodeSet=null;
      if(clrHolder)
         this.holder.innerHTML="";
      this.holder.style.width="0px";
      this.holder.style.height="0px";
   }
   this.prebuild=function()
   {
      var holder=document.createElement('div');
      holder.className=this.holder.className;
      holder.style.width=this.holder.style.width;
      holder.style.height=this.holder.style.width;
      holder.onmousedown=clrCombined;
      for(var i=0; i<this.nStars; ++i)
      {
         this.changeNode(buildNode(holder),0xF);
      }
      this.holder.parentNode.replaceChild(holder,this.holder);
      this.holder=holder;
      this.nodeSet=this.holder.getElementsByTagName("div");
   }
   this.changeNode=function(node,flags)
   {
      if(flags == 0)
         return;
      var s=node.style;
      if((flags & 4) != 0)
      {
         s.left=(rand(this.holder.offsetWidth))+"px";
         s.top=(rand(this.holder.offsetHeight))+"px";
      }
      if((flags & 1) != 0)
         s.color=randColor();
      if((flags & 8) != 0)
      {
         var z=rand(18);
         s.fontSize=(z+12)+"px";
         s.zIndex=z;
      }
      if((flags & 2) != 0)
         node.firstChild.nodeValue=g_shapes[rand(g_shapes.length)];
   }

}

//--------- helpers ------------------------------------------------------------

function buildNode(holder)
{
   var node=document.createElement('div');
   //node=document.createTextNode(g_shapes[rand(g_shapes.length)])
   node.className="star";
   node.appendChild(document.createTextNode(""));
   holder.appendChild(node);
   return node;
}

function randColor()
{
   var c=[0,0,0];
   for(var i=0; i<3; ++i)
      c[i]=rand(256);
   return "rgb("+c[0]+","+c[1]+","+c[2]+")";
}

function rand(lt)
{
   return Math.floor(Math.random()*0.99999*lt);
}

//------------------------- web page calls -------------------------------------

function doStars()
{
   if(g_stars == null)
      return;
   if(g_stars.nodeSet == null)
      g_stars.start();
   else
      g_stars.clear();
}

function doResize()
{
   if(g_stars != null && g_stars.nodeSet != null)
      g_stars.setHolder();
}

function clrStars()
{
   if(g_stars != null)
      g_stars.clear(true);
}

//------------------------------------------------------------------------------

