var g_oSnowCont;
var g_windowHeight;

function randValue(min, max) {
	if(typeof(min) == 'object') {
		max = min[1];
		min = min[0];
	}
		
	return min + Math.random() * (max - min);
}

Snow = {
	//все параметры задаются парой [MIN, MAX]
	ITEMS_PES_MIN: [60, 120], 
	V_SPEED: [10,80], //средняя, PX в секунду
	SIN_X_A: [10, 100], //амплитуда колебания по X (PX) 
	SIN_X_T: [3, 10], //период колебаний по Х (сек)
	SIN_Y_A: [10, 100], //период колебаний по Х (PX)
	SIN_Y_T: [3, 10], //период колебаний по Х (сек)
	IMAGE_WIDTH: [10, 21],
	IMAGES: ["1.png","2.png","3.png","4.png","5.png"]
}

Snow._items = [];

Snow.init = function() {
	//создаём первыую снежинку
	this.createItem();
	//запускаем цикл обновления
	setInterval("Snow.updateItems()", 50);
}

Snow.createItem = function() {
	//создаём снежинку
	var image = this._getNextImage();
	var item = new SnowItem(image);
	//устанавлеиваем параметры снежинки
	item.vSpeed = randValue(this.V_SPEED);
	item.xPos = this._getXPos();
	item.sinXParams = [randValue(this.SIN_X_A),randValue(this.SIN_X_T)];
	item.sinYParams = [randValue(this.SIN_Y_A),randValue(this.SIN_Y_T)];
	item.imageWidth = Math.round(randValue(this.IMAGE_WIDTH));
	//показываем снежинку
	item.show();
	
	this._items.push(item);
	
	//готовомся к запуску следующей снежинки
	var timeout = randValue(60000/this.ITEMS_PES_MIN[0], 60000/this.ITEMS_PES_MIN[1]);
	setTimeout("Snow.createItem()", timeout);
}

Snow.updateItems = function() {
	var item, isDestroy;
	for(var i=0; i<this._items.length; i++) {
		item = this._items[i];
		isDestroy = item.updatePosition() === false;
		
		if(isDestroy) {
			item.destroy();
			this._items.splice(i,1);
			i--;
		}
	}
}


Snow._getNextImage = function() {
	if(this._lastImageIndex === undefined)
		this._lastImageIndex = 0;
	if(this._lastImageIndex < this.IMAGES.length - 1) {
		++this._lastImageIndex;		
	} else {
		this._lastImageIndex = 0;
	}
	return this.IMAGES[this._lastImageIndex];
	
}

Snow._getXPos = function() {
	var winWidth = window.innerWidth || window.document.body.clientWidth;
	return randValue(0, winWidth);
}

SnowItem = function(imageName) {
	//создаём картинку
	this.oImage = document.createElement("img");
	this.oImage.src = base_url + "/images/snow/" + imageName;	
	this.oImage.className = "snow-image";
}

SnowItem.prototype.show = function() {
	this.oImage.style.width = this.imageWidth + "px";
	this.oImage.style.height = (this.imageWidth * 18 / 21) + "px";
	
	g_oSnowCont.appendChild(this.oImage);
	
	this.showTime = new Date().getTime();
	this.updatePosition();
}

SnowItem.prototype.destroy = function() {
	g_oSnowCont.removeChild(this.oImage);
}
//возврящает FALSE, если снежинку пора уничтожить
SnowItem.prototype.updatePosition = function() {
	//время в падении
	var elapsedTime = new Date().getTime() - this.showTime;
	//проверяем, не улетели ли мы за экран
	var top = this._getImageTop(elapsedTime);	
	var isValid = this._isTopValid(top);
	if(isValid) {
		//обновляем положение
		this.oImage.style.left = this._getImageLeft(elapsedTime)+"px";
		this.oImage.style.top = top+"px";
	}	
	return isValid;
}

SnowItem.prototype._getImageTop = function(elapsedTime) {
	var top = elapsedTime * this.vSpeed / 1000;
	top += this.getSinValue(elapsedTime, this.sinYParams);
	return Math.round(top);
}

SnowItem.prototype._getImageLeft = function(elapsedTime) {
	var left = this.xPos;
	left += this.getSinValue(elapsedTime, this.sinXParams);
	return Math.round(left);
}

SnowItem.prototype.getSinValue = function(time, params) {
	return params[0] * Math.sin(time * 2 * 3.14 / params[1] * .001);
}

SnowItem.prototype._isTopValid = function(top) {	
	return top -10 < g_windowHeight;
}

window.onresize = function() {
	g_windowHeight = document.body.clientHeight || g_oSnowCont.offsetHeight;
}

$().ready(function(){
	g_oSnowCont = document.getElementById("snow");
	g_windowHeight = document.body.clientHeight || g_oSnowCont.offsetHeight;
	
	Snow.init();
});
