/*
*
*	这段脚本改编自广为流传的 sakura.js 脚本，使页面上漂浮花瓣
*	改写后的脚本可很好地运行在 IE, FireFox 浏览器中
*
*	原脚本标记： IKS/1.01(+1.08b stand alone)
*
*	原脚本判断了 NN, IE, OT 类型浏览器，把 FireFox 对待为 Netscape
*	然而 FireFox 并不支持 layer，却同 IE 一样支持 span
*	这导致 FireFox 不能正确显示漂浮效果
*
*	[2005-1-20]
*		1. 除去了未用的变量（和函数），体积缩小一半（原脚本约 8k）
*		2. 漂浮对象全部创建为 span（也许不能兼容 OT，NS？）
*		3. 用标准的 getElementById 方法取 span 对象
*
*	DBStudio, ghljj.com
*
*	使用方法：
*		1. 在 html 中插入“<script language="JavasScript" src="Sakura.js"></script>”即可
*		2. 可能需要修改 docBase 的值以便找到图片
*
*/


var allLoaded = false;
var intervalTime = 40;					// 动画速度
var timerID = "none";
var masterTime = 0;

function timerHandler()
{
	masterTime += intervalTime;
	timerID = setTimeout("timerHandler()", intervalTime);
	if(allLoaded) moveGlyphs();
}

timerHandler();


var canAnimation = false;
var firstInit = true;
var win, doc;
var i;
var xsize = 0;
var ysize = 0;

var docBase = "/UI/sys/sakura/"; 	// 图片所在位置
var glyphImage = "Sakura";				// 图片序列名称，序号从 0 - 9
var glyphXSize = 16;
var glyphYSize = 16;

var numGlyphs = 30; 					// 漂浮数量
var swayLevel = 3;
var windLevel = 8;
var glyphShowProb = 0.005;


function makeArray(n) {this.length = n;}

var accelGlyph=new makeArray(numGlyphs);
var veloGlyph=new makeArray(numGlyphs);
var posGlyph=new makeArray(numGlyphs);
var yGlyph=new makeArray(numGlyphs);
var aliveGlyph=new makeArray(numGlyphs);
var yVeloGlyph=new makeArray(numGlyphs);


function waitOtherProcesses() {}


function docInit(winobj, docobj)
{
	win=winobj;
	doc=docobj;
}


function setDocBase(base)
{
	docBase=base;
}


function determineSize()
{
	xsize = doc.body.clientWidth-15;
	ysize = doc.body.clientHeight-20;

	if(firstInit)
	{
		for(i = 1; i <= numGlyphs; i++)
		{
			accelGlyph[i] = veloGlyph[i] = 0.0;
			yGlyph[i] = Math.random() * ysize;
			accelGlyph[i] = Math.random() * 2 - 1;
			posGlyph[i] = Math.random() * xsize;
			aliveGlyph[i] = false;
		}
	}
	else
	{
		for(i = 1; i <= numGlyphs; i++)
		{
			if(yGlyph[i] > ysize) aliveGlyph[i] = false;
		}
	}
	firstInit=false;
}


function createDecorations()
{
	waitOtherProcesses();

	for(i = 1; i <= numGlyphs; i++)
	{
		var p = Math.floor(Math.random() * 6) + 2;
		var n = Math.floor(Math.random() * 8);
		yVeloGlyph[i] = ((p - 2.0) / 3.0 + 0.8) * 2;
		var xs = (p < 5) ? glyphXSize / 2 : glyphXSize;
		var ys = (p < 5) ? glyphYSize / 2 : glyphYSize;

		glyph = '<IMG SRC="' + docBase + glyphImage + n + '.gif" WIDTH=' + xs + ' HEIGHT=' + ys + '>';
		var t = '<span style="position:absolute; top:-40px; left:-40px; height:12px; width:12px; z-index:' + (p - 5) + ';" ID="glyph' + i + '">' +
				glyph +
				'</span>';
		doc.write(t);
	}
}


function moveGlyph(obj, n)
{
	if(yGlyph[n] >= ysize) yGlyph[n] = 0;
	if(Math.random() < .1) accelGlyph[n] = Math.random() * 2 - 1;
	if(veloGlyph[n] >= swayLevel) { veloGlyph[n] = swayLevel; accelGlyph[n] = -accelGlyph[n]; }
	if(veloGlyph[n] <= -swayLevel) { veloGlyph[n] = -swayLevel; accelGlyph[n] = -accelGlyph[n]; }

	veloGlyph[n] += accelGlyph[n];
	posGlyph[n] += veloGlyph[n] + windLevel;

	if(posGlyph[n] < 0) posGlyph[n] = xsize;

	if(posGlyph[n] > xsize)
	{
		posGlyph[n] = 0;
		yGlyph[n] = Math.random() * ysize;
	}

	yGlyph[n] += yVeloGlyph[n];

	obj.style.left = Math.floor(posGlyph[n]) + "px";
	obj.style.top = Math.floor(yGlyph[n]) + "px";
}


function moveGlyphs()
{
	if (!canAnimation) return;

	var c;
	for(c = 1; c <= numGlyphs; c++)
	{
		var name = "glyph" + c;
		var obj;
		obj = doc.getElementById(name);
		if (!obj) continue;

		if(!aliveGlyph[c])
		{
			if(Math.random() < glyphShowProb) aliveGlyph[c] = true;
		}
		else
		{
			obj.style.visibility = "visible";
			moveGlyph(obj,c);
		}
	}
}


function startAnimation()
{
	canAnimation=true;
}


docInit(window, document);
determineSize();
createDecorations();
startAnimation();
allLoaded=true;

