//================================================= SNOW EFFECT ==========================================================

var snowStorm = null;
var imagePath = null; // relative path to snow images
var flakesMaxActive = 250;
function SnowStorm() {
  var s = this;
  var storm = this;
  this.timers = [];
  this.flakes = [];
  this.disabled = false;
  this.terrain = [];

  // User-configurable variables
  // ---------------------------

  var usePNG = true;
  var flakeTypes = 6;
  var flakesMax = 128;
  //var flakesMaxActive = 150;
  var vMax = 2.5;
  var flakeWidth = 5;
  var flakeHeight = 5;
  var flakeBottom = null; // Integer for fixed bottom, 0 or null for "full-screen" snow effect
  var snowCollect = true;
  var showStatus = true;

  // --- End of user section ---

  var isIE = (navigator.appName.toLowerCase().indexOf('internet explorer')+1);
  var isWin9X = (navigator.appVersion.toLowerCase().indexOf('windows 98')+1);
  var isOpera = (navigator.userAgent.toLowerCase().indexOf('opera ')+1 || navigator.userAgent.toLowerCase().indexOf('opera/')+1);
  if (isOpera) isIE = false; // Opera (which is sneaky, pretending to be IE by default)
  var screenX = null;
  var screenY = null;
  var scrollY = null;
  var vRndX = null;
  var vRndY = null;

  function rnd(n,min) {
    if (isNaN(min)) min = 0;
    return (Math.random()*n)+min;
  }

  this.randomizeWind = function() {
    vRndX = plusMinus(rnd(vMax,0.2));
    vRndY = rnd(vMax,0.2);
    if (this.flakes) {
      for (var i=0; i<this.flakes.length; i++) {
        if (this.flakes[i].active) this.flakes[i].setVelocities();
      }
    }
  }

  function plusMinus(n) {
    return (parseInt(rnd(2))==1?n*-1:n);
  }

  this.resizeHandler = function() {
    if (window.innerWidth || window.innerHeight) {
      screenX = window.innerWidth-(!isIE?24:2);
      screenY = (flakeBottom?flakeBottom:window.innerHeight);
    } else {
      screenX = (document.documentElement.clientWidth||document.body.clientWidth||document.body.scrollWidth)-(!isIE?8:0);
      screenY = flakeBottom?flakeBottom:(document.documentElement.clientHeight||document.body.clientHeight||document.body.scrollHeight);
    }
    s.scrollHandler();
  }

  this.scrollHandler = function() {
    // "attach" snowflakes to bottom of window if no absolute bottom value was given
    scrollY = (flakeBottom?0:parseInt(window.scrollY||document.documentElement.scrollTop||document.body.scrollTop));
    if (isNaN(scrollY)) scrollY = 0; // Netscape 6 scroll fix
    if (!flakeBottom && s.flakes) {
      for (var i=0; i<s.flakes.length; i++) {
        if (s.flakes[i].active == 0) s.flakes[i].stick();
      }
    }
  }

  this.freeze = function() {
    // pause animation
    if (!s.disabled) {
      s.disabled = 1;
    } else {
      return false;
    }
    if (!isWin9X) {
      clearInterval(s.timers);
    } else {
      for (var i=0; i<s.timers.length; i++) {
        clearInterval(s.timers[i]);
      }
    }
  }

  this.resume = function() {
    if (s.disabled) {
       s.disabled = 0;
    } else {
      return false;
    }
    s.timerInit();
  }

  this.stop = function() {
    this.freeze();
    for (var i=0; i<this.flakes.length; i++) {
      this.flakes[i].o.style.display = 'none';
    }
    removeEventHandler(window,'scroll',this.scrollHandler,false);
    removeEventHandler(window,'resize',this.resizeHandler,false);
  }

  this.SnowFlake = function(parent,type,x,y) {
    var s = this;
    var storm = parent;
    this.type = type;
    this.x = x||parseInt(rnd(screenX-12));
    this.y = (!isNaN(y)?y:-12);
    this.vX = null;
    this.vY = null;
    this.vAmpTypes = [2.0,1.0,1.25,1.0,1.5,1.75]; // "amplification" for vX/vY (based on flake size/type)
    this.vAmp = this.vAmpTypes[this.type];

    this.active = 1;
    this.o = document.createElement('img');
    this.o.style.position = 'absolute';
    this.o.style.width = flakeWidth+'px';
    this.o.style.height = flakeHeight+'px';
    this.o.style.fontSize = '1px'; // so IE keeps proper size
    this.o.style.zIndex = 2;
    this.o.src = imagePath+this.type+(pngHandler.supported && usePNG?'.png':'.gif');
    document.body.appendChild(this.o);
    if (pngHandler.supported && usePNG) pngHandler.transform(this.o);

    this.refresh = function() {
      this.o.style.left = this.x+'px';
      this.o.style.top = this.y+'px';
    }

    this.stick = function() {
      s.o.style.top = (screenY+scrollY-flakeHeight-storm.terrain[Math.floor(this.x)])+'px';
      // called after relative left has been called
    }

    this.vCheck = function() {
      if (this.vX>=0 && this.vX<0.2) {
        this.vX = 0.2;
      } else if (this.vX<0 && this.vX>-0.2) {
        this.vX = -0.2;
      }
      if (this.vY>=0 && this.vY<0.2) {
        this.vY = 0.2;
      }
    }

    this.move = function() {
      this.x += this.vX;
      this.y += (this.vY*this.vAmp);
      this.refresh();

      if (this.vX && screenX-this.x<flakeWidth+this.vX) { // X-axis scroll check
        this.x = 0;
      } else if (this.vX<0 && this.x<0-flakeWidth) {
        this.x = screenX-flakeWidth; // flakeWidth;
      }
      var yDiff = screenY+scrollY-this.y-storm.terrain[Math.floor(this.x)];
      if (yDiff<flakeHeight) {
        this.active = 0;
        if (snowCollect) {
          var height = [0.75,1.5,0.75];
          for (var i=0; i<2; i++) {
            storm.terrain[Math.floor(this.x)+i+2] += height[i];
          }
        }
        this.o.style.left = ((this.x-(!isIE?flakeWidth:0))/screenX*100)+'%'; // set "relative" left (change with resize)
        if (!flakeBottom) {
          this.stick();
        }
      }
    }

    this.animate = function() {
      // main animation loop
      // move, check status, die etc.
      this.move();
    }

    this.setVelocities = function() {
      this.vX = vRndX+rnd(vMax*0.12,0.1);
      this.vY = vRndY+rnd(vMax*0.12,0.1);
    }

    this.recycle = function() {
      this.setVelocities();
      this.vCheck();
      this.x = parseInt(rnd(screenX-flakeWidth-1));
      this.y = parseInt(rnd(640)*-1)-flakeHeight;
      this.active = 1;
    }

    this.recycle(); // set up x/y coords etc.
    this.refresh();

  }

  this.snow = function() {
    var active = 0;
    var used = 0;
    var waiting = 0;
    for (var i=this.flakes.length-1; i>0; i--) {
      if (this.flakes[i].active == 1) {
        this.flakes[i].animate();
        active++;
      } else if (this.flakes[i].active == 0) {
        used++;
      } else {
        waiting++;
      }
    }
    if (snowCollect && !waiting) { // !active && !waiting
      // create another batch of snow
      this.createSnow(flakesMaxActive,true);
    }
    if (active<flakesMaxActive) {
      with (this.flakes[parseInt(rnd(this.flakes.length))]) {
        if (!snowCollect && active == 0) 
        {
          recycle();
        } 
        //else if (active == -1) 
        //{
         // active =1;
        //}
      }
    }
  }

  this.createSnow = function(limit,allowInactive) {
    if (showStatus) window.status = 'Creating snow...';
    for (var i=0; i<limit; i++) {
      this.flakes[this.flakes.length] = new this.SnowFlake(this,parseInt(rnd(flakeTypes)));
      if (allowInactive || i>flakesMaxActive) this.flakes[this.flakes.length-1].active = -1;
    }
    if (showStatus) window.status = '';
  }

  this.timerInit = function() {
    this.timers = (!isWin9X?setInterval("snowStorm.snow()",20):[setInterval("snowStorm.snow()",75),setInterval("snowStorm.snow()",25)]);
  }

  this.init = function() {
    for (var i=0; i<8192; i++) {
      this.terrain[i] = 0;
    }
    this.randomizeWind();
    this.createSnow(snowCollect?flakesMaxActive:flakesMaxActive*2); // create initial batch
    addEventHandler(window,'resize',this.resizeHandler,false);
    addEventHandler(window,'scroll',this.scrollHandler,false);
    // addEventHandler(window,'scroll',this.resume,false); // scroll does not cause window focus. (odd)
    // addEventHandler(window,'blur',this.freeze,false);
    // addEventHandler(window,'focus',this.resume,false);
    this.timerInit();
  }

  this.resizeHandler(); // get screen coordinates

  if (screenX && screenY && !this.disabled) {
    this.init();
  }
	
}

//function snowStormInit() 
//{
  //setTimeout("snowStorm = new SnowStorm()",500);
//}


function snowStormInit(path, flakesMax) 
{
  flakesMaxActive = (flakesMax*flakesMaxActive)/50;  
  imagePath = path;   
  setTimeout("snowStorm = new SnowStorm()",5000);
}


var addEventHandler = null;
var removeEventHandler = null;

function postLoadEvent(eventType) {
  // test for adding an event to the body (which has already loaded) - if so, fire immediately
  return ((eventType.toLowerCase().indexOf('load')>=0) && document.body);
}

function addEventHandlerDOM(o,eventType,eventHandler,eventBubble) {
  if (!postLoadEvent(eventType)) {
    o.addEventListener(eventType,eventHandler,eventBubble);
  } else {
    eventHandler();
  }
}

function removeEventHandlerDOM(o,eventType,eventHandler,eventBubble) {
  o.removeEventListener(eventType,eventHandler,eventBubble);
}
  
function addEventHandlerIE(o,eventType,eventHandler) { // IE workaround
  if (!eventType.indexOf('on')+1) eventType = 'on'+eventType;
  if (!postLoadEvent(eventType)) {
    o.attachEvent(eventType,eventHandler); // Note addition of "on" to event type
  } else {
    eventHandler();
  }
}
  
function removeEventHandlerIE(o,eventType,eventHandler) {
  if (!eventType.indexOf('on')+1) eventType = 'on'+eventType;
  o.detachEvent(eventType,eventHandler);
}

function addEventHandlerOpera(o,eventType,eventHandler,eventBubble) {
  if (!postLoadEvent(eventType)) {
    (o==window?document:o).addEventListener(eventType,eventHandler,eventBubble);
  } else {
    eventHandler();
  }
}

function removeEventHandlerOpera(o,eventType,eventHandler,eventBubble) {
  (o==window?document:o).removeEventListener(eventType,eventHandler,eventBubble);
}

if (navigator.userAgent.toLowerCase().indexOf('opera ')+1 || navigator.userAgent.toLowerCase().indexOf('opera/')+1) {
  // opera is dumb at times.
  addEventHandler = addEventHandlerOpera;
  removeEventHandler = removeEventHandlerOpera;
} else if (document.addEventListener) { // DOM event handler method
  addEventHandler = addEventHandlerDOM;
  removeEventHandler = removeEventHandlerDOM;
} else if (document.attachEvent) { // IE event handler method
  addEventHandler = addEventHandlerIE;
  removeEventHandler = removeEventHandlerIE;
} else { // Neither "DOM level 2" (?) methods supported
  addEventHandler = function(o,eventType,eventHandler,eventBubble) {
    o['on'+eventType] = eventHandler;
    // Multiple events could be added here via array etc.
  }
  removeEventHandler = function(o,eventType,eventHandler,eventBubble) {}
}



function PNGHandler() {
  var self = this;

  this.na = navigator.appName.toLowerCase();
  this.nv = navigator.appVersion.toLowerCase();
  this.isIE = this.na.indexOf('internet explorer')+1?1:0;
  this.isWin = this.nv.indexOf('windows')+1?1:0;
  this.isIEMac = (this.isIE&&!this.isWin);
  this.isIEWin = (this.isIE&&this.isWin);
  this.ver = this.isIE?parseFloat(this.nv.split('msie ')[1]):parseFloat(this.nv);
  this.isMac = this.nv.indexOf('mac')+1?1:0;
  this.isOpera = (navigator.userAgent.toLowerCase().indexOf('opera ')+1 || navigator.userAgent.toLowerCase().indexOf('opera/')+1);
  if (this.isOpera) this.isIE = false; // Opera filter catch (which is sneaky, pretending to be IE by default)
  this.filterID = 'DXImageTransform.Microsoft.AlphaImageLoader';
  this.supported = false;
  this.transform = self.doNothing;

  this.filterMethod = function(o) {
    // IE 5.5+ proprietary filter garbage (boo!)
    // Create new element based on old one. Doesn't seem to render properly otherwise (due to filter?)
    // use DOM "currentStyle" method, so rules inherited via CSS are picked up.
    if (o.nodeName != 'IMG') {
      var b = o.currentStyle.backgroundImage.toString(); // parse out background image URL
      o.style.backgroundImage = 'none';
      // Parse out background image URL from currentStyle.
      var i1 = b.indexOf('url("')+5;
      var newSrc = b.substr(i1,b.length-i1-2).replace('.gif','.png'); // find first instance of ") after (", chop from string
      o.style.writingMode = 'lr-tb'; // Has to be applied so filter "has layout" and is displayed. Seriously. Refer to http://msdn.microsoft.com/workshop/author/filter/reference/filters/alphaimageloader.asp?frame=true
      o.style.filter = "progid:"+self.filterID+"(src='"+newSrc+"',sizingMethod='"+(o.className.indexOf('scale')+1?'scale':'crop')+"')";
    } else if (o.nodeName == 'IMG') {
      var newSrc = o.getAttribute('src').replace('.gif','.png');
      // apply filter
      o.src = 'image/none.gif'; // get rid of image
      o.style.filter = "progid:"+self.filterID+"(src='"+newSrc+"',sizingMethod="+(o.className.indexOf('scale')+1?'scale':'crop')+"')";
      o.style.writingMode = 'lr-tb'; // Has to be applied so filter "has layout" and is displayed. Seriously. Refer to http://msdn.microsoft.com/workshop/author/filter/reference/filters/alphaimageloader.asp?frame=true
    }
  }

  this.pngMethod = function(o) {
    // Native transparency support. Easy to implement. (woo!)
    bgImage = this.getBackgroundImage(o);
    if (bgImage) {
      // set background image, replacing .gif
      o.style.backgroundImage = 'url('+bgImage.replace('.gif','.png')+')';
    } else if (o.nodeName == 'IMG') {
      o.src = o.src.replace('.gif','.png');
    } else if (!bgImage) {
      // no background image
    }
  }

  this.getBackgroundImage = function(o) {
    var b, i1; // background-related variables
    var bgUrl = null;
    if (o.nodeName != 'IMG' && !(this.isIE && this.isMac)) { // ie:mac PNG support broken for DIVs with PNG backgrounds
      if (document.defaultView) {
        if (document.defaultView.getComputedStyle) {
          b = document.defaultView.getComputedStyle(o,'').getPropertyValue('background-image');
          i1 = b.indexOf('url(')+4;
          bgUrl = b.substr(i1,b.length-i1-1);
        } else {
          // no computed style
          return false;
        }
      } else {
        // no default view
        return false;
      }
    }
    return bgUrl;
  }

  this.doNothing = function() {}
  
  this.supportTest = function() {
    // Determine method to use.
    // IE 5.5+/win32: filter

    if (this.isIE && this.isWin && this.ver >= 5.5) {
      // IE proprietary filter method (via DXFilter)
      self.transform = self.filterMethod;
    } else if (!this.isIE && this.ver < 5) {
      // No PNG support or broken support
      // Leave existing content as-is
      self.transform = null;
      return false;
    } else if (!this.isIE && this.ver >= 5 || (this.isIE && this.isMac && this.ver >= 5)) { // version 5+ browser (not IE), or IE:mac 5+
      self.transform = self.pngMethod;
    } else {
      // Presumably no PNG support. GIF used instead.
      self.transform = null;
      return false;
    }
    return true;
  }

  this.init = function() {
    this.supported = this.supportTest();
  }

}

function getElementsByClassName(className,oParent) {
  var doc = (oParent||document);
  var matches = [];
  var nodes = doc.all||doc.getElementsByTagName('*');
  for (var i=0; i<nodes.length; i++) {
    if (nodes[i].className == className || nodes[i].className.indexOf(className)+1 || nodes[i].className.indexOf(className+' ')+1 || nodes[i].className.indexOf(' '+className)+1) {
      matches[matches.length] = nodes[i];
    }
  }
  return matches; // kids, don't play with fire. ;)
}

// Instantiate and initialize PNG Handler

var pngHandler = new PNGHandler();

pngHandler.init();


//addEventHandler(window,'load',snowStormInit,false);


//===============================================RAIN EFFECT=====================================================

select = false;    // choose rain or select effect - false-rain;   true-select
selsnow = " ' "  // symbols for select & rain
selrain = " / "  
count = 200     // declare how many drops
drop = new Array(); xx = new Array(); yy = new Array(); mv = new Array()//visit http://www.geocities.com/mobinlodhia

if(select){sel = selsnow; speed=1; cross=10; drops=count}
else{sel = selrain; speed=100; drops=count; cross=9}
runx = -speed/cross; runy = speed; count = 0;

_count =0;
_exist_rain=false;
function rainstart(rainMax, clientID, clearTimeoutObj)
{
	var clearTimeRain = clientID + "_RainObj";
	temp = rainMax;
	temp_clientID =  clientID;	
	
     if(_exist_rain)
	 {	
        MultiRain(temp, temp_clientID, clearTimeoutObj, true, clearTimeRain);
	 }
     else
	 {
	    _exist_rain = true;	
	    MultiRain(temp, temp_clientID, clearTimeoutObj, false, clearTimeRain);	    			
	 }
}

function MultiRain(rainMax, clientID, clearTimeoutObj, exist, clearTimeRain)
{
	temp = rainMax;
	drops = temp*80/50;
	temp_clientID = clientID;			
	if(!exist)	
	{
        for(run = 0; run < drops; run++)
		{
	   	 document.getElementById("drop" + run).style.display = "block";
	   	 xx[run]+=runx;  yy[run]+=mv[run];
	    	hmm = Math.round(Math.random()*1);
		if(xx[run] < 0){xx[run] = maxx+10;}
		if(yy[run] > maxy){yy[run] = 10;}
		drop[run].left = xx[run]
		drop[run].top = yy[run]+document.body.scrollTop;
		}
		_count++;
		
		if(_count > 120)
		{	
			for(make = 0; make < drops; make++)
			{			
				document.getElementById("drop" + make).style.display = "none";			
        	}
	    	window.clearTimeout(clearTimeRain);
	        //InitialWidthZone(temp_clientID);		
           RunText(temp_clientID, clearTimeoutObj);        			    
		}
		else
		{	
			clearTimeRain = window.setTimeout(function()
       		 {
            	 MultiRain(temp, clientID, clearTimeoutObj, exist, clearTimeRain);
       		 }, 1);
		}
	}
	else
	{		
		if(_count > 120)
		{			
		   	window.clearTimeout(clearTimeRain);
	        //InitialWidthZone(temp_clientID);		
            RunText(temp_clientID, clearTimeoutObj);	
		}
		else
		{	
		   clearTimeRain = window.setTimeout(function()
       	    {
            	MultiRain(temp, clientID, clearTimeoutObj, exist, clearTimeRain);
       		}, 1);
		}		
	}		
}

/*
function rainstart(rainMax, clientID, clearTimeoutObj)
{
	temp = rainMax;
	drops = temp*80/50;
    for(run = 0; run < drops; run++)
	{
	    document.getElementById("drop" + run).style.display = "block";
	    xx[run]+=runx;  yy[run]+=mv[run];
	    hmm = Math.round(Math.random()*1);
		if(xx[run] < 0){xx[run] = maxx+10;}
		if(yy[run] > maxy){yy[run] = 10;}
		drop[run].left = xx[run]
		drop[run].top = yy[run]+document.body.scrollTop;
	}
	_count++;
    temp_clientID = clientID;
	if(_count > 120)
	{
		for(make = 0; make < drops; make++)
		{			
			document.getElementById("drop" + make).style.display = "none";			
        }	
	    window.clearTimeout(rain_time);
	    //InitialWidthZone(temp_clientID);
		window.setTimeout(function()
        {
            RunText(temp_clientID, clearTimeoutObj);
        }, 2000);  		    
	}
	else
	{			
		rain_time = window.setTimeout(function()
        {
            rainstart(temp, temp_clientID);
        }, 1);
	}
		
}
*/
if (document.all)
{
//drop = new Array(); xx = new Array(); yy = new Array(); mv = new Array()//visit http://www.geocities.com/mobinlodhia
ly = "document.all[\'"; st = "\'].style"
for(make = 0; make < drops; make++)
	{
	document.write('<div id="drop'+make+'" class=drop>'+sel+'</div>');
	drop[make] = eval(ly+'drop'+make+st);
	maxx = document.body.clientWidth-40
	maxy = document.body.clientHeight-40
	xx[make] = Math.random()*maxx;
	yy[make] = -100-Math.random()*maxy;
	drop[make].left = xx[make]
	drop[make].top = yy[make]
	mv[make] = (Math.random()*5)+speed/4;
	drop[make].fontSize = (Math.random()*10)+14;
		if(select)
		{
		col = 'white'
		}
			else{col = '#586b78'
			}
		drop[make].color = col;
	}
//window.onload=rainstart
}

//=======================================================RUN TEXT ON PAGE======================================================
var holidayWidth = 0;
function getStartZonePos(obj) 
{
    var curleft = 0;
    try
    {
        if (obj.offsetParent) 
        {
            curleft = obj.offsetLeft

            while (obj = obj.offsetParent) 
            {
                curleft += obj.offsetLeft
            }
        }
    }
    catch(e)
    {
        curleft = 0;
    }
    return curleft;
}
function InitialWidthZone(clientID)
{
    var obj = document.getElementById(clientID + "_bamboo_message_holiday");
    var myObj = obj.parentNode;
    holidayWidth = document.body.clientWidth - getStartZonePos(myObj);
}

function CountDown(numSeconds, clientID, clearTimeoutObj, clearTimeoutObjCntDwn)
{
    try
    {    
        numSeconds = parseInt(numSeconds);
        if (numSeconds > 0)
        {
            numSeconds  = numSeconds - 1;
            clearTimeoutObjCntDwn = window.setTimeout(function()
            {
                CountDown(numSeconds, clientID, clearTimeoutObj, clearTimeoutObjCntDwn);
            }, 1000);
        }
        else
        {   
            //InitialWidthZone(clientID); 
			window.clearTimeout(clearTimeoutObjCntDwn);
            RunText(clientID, clearTimeoutObj);
        }
    }
    catch(e)
    {
        displayErrors('CountDown:: ' + e.message);
    }
}

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

function RunText(clientID, clearTimeoutObj)
{    
	try
    {
        var obj = document.getElementById(clientID + "_bamboo_message_holiday");
        if(obj != undefined && obj != null)
        {
            var X = parseInt(obj.style.right);
            
            //if(X < parseInt(holidayWidth + 400))
			if(X < parseInt(document.body.clientWidth))
            {
                obj.style.display = "block";
                obj.style.right = X+1+'pt';	          
            }
            else
            {
                obj.style.display = 'none';
	            window.clearTimeout(clearTimeoutObj);
            }
            clearTimeoutObj = window.setTimeout(function()
            {
                RunText(clientID, clearTimeoutObj);
            }, 2);
        }
	}
	catch(e)
	{
	    displayErrors('RunText::' + e.message);
	}
}
function displayErrors(errorMessage)
{
    alert('Error::' + errorMessage);
}
//=======================================================UPDATE EEVERY MINUTES======================================================