var ani = null;

function AnimationNext()
{
	if (!ani)
		return;
	ani.on_next();
}

function AnimationPrev()
{
	if (!ani)
		return;
	ani.on_prev();
}

function StartAnimation(list)
{
	ani = new Animation(list);
	ani.start();
}

function Animation(list)
{
	if (!list.length)
		return;

	this.photo_list = new Array();
	while (list.length > 0)
	{
		var r = Math.floor(Math.random()*list.length);
		var e = list.splice(r, 1);
		this.photo_list.push(e);
	}
	this.photos = new Array();

	this.timer = null;

	this.obj_back = $("lcd_back");
	this.obj_front = $("lcd_front");
	this.current_photo = 0;
	this.loaded_photos = 0;

	this.fading = false;
	this.fading_steps = 10;
	this.fading_current = 0;

	this.pause_drop = 150;
	this.pause = 0;

	this.duration_drop = 50;
	this.duration = 0;

	this.set_first_photo();
	this.load_photos();
}

Animation.prototype.iterate=function()
{
	if (this.pause)
	{
		if (this.pause++ > this.pause_drop)
			this.pause = 0;
		return;
	}

	if (this.fading)
	{
		this.next_fade();
		return;
	}

	var next = this.next_i();
	if (!this.photos[next].loaded)
		return;

	this.duration++;
	if (this.duration < this.duration_drop)
		return;
	this.duration = 0;
	this.next_photo();
	this.fading = true;
}

Animation.prototype.on_next=function()
{
	this.manual();
	this.next_photo();
	this.set_opacity(100);
}

Animation.prototype.on_prev=function()
{
	this.manual();
	this.prev_photo();
	this.set_opacity(100);
}

Animation.prototype.start=function()
{
	this.timer = setInterval('ani.iterate()', 40);
}

Animation.prototype.manual=function()
{
	this.pause = 1;

	this.duration = 0;
	this.set_opacity(100);
	this.fading = false;
	this.fading_current = 0;
	this.set_back(this.photo_list[this.current_photo]);
	this.set_front("");
}

Animation.prototype.next_i=function()
{
	if ((this.current_photo+1) >= this.photos.length)
		return 0;
	return this.current_photo+1;
}

Animation.prototype.prev_i=function()
{
	if ((this.current_photo-1) < 0)
		return this.photos.length-1;
	return this.current_photo-1;
}

Animation.prototype.next_photo=function()
{
	var next = this.next_i();
	if (!this.photos[next].loaded)
		return;
	var pair = this.lcd_next_pair();
	this.set_front(pair[0]);
	this.set_back(pair[1]);
}

Animation.prototype.prev_photo=function()
{
	var prev = this.next_i();
	if (!this.photos[prev].loaded)
		return;
	var pair = this.lcd_prev_pair();
	this.set_front(pair[0]);
	this.set_back(pair[1]);
}

Animation.prototype.set_front=function(url)
{
	this.set_opacity(0);
	this.obj_front.style.backgroundImage = "url("+url+")";
}

Animation.prototype.set_back=function(url)
{
	this.obj_back.style.backgroundImage = "url("+url+")";
}

Animation.prototype.set_first_photo=function()
{
	this.obj_back.style.backgroundImage = "url("+this.photo_list[0]+")";
}

Animation.prototype.loaded_photo=function()
{
	this.loaded_photos++;
	if (!(this.loaded_photos >= this.photo_list.length))
		return;
}

Animation.prototype.load_photos=function()
{
	for (var i=0; i<this.photo_list.length; i++)
		this.photos.push(new Photo(this.photo_list[i]))
}

Animation.prototype.lcd_next_pair=function()
{
	var lcd_old = this.current_photo;
	this.current_photo++;
	if (this.current_photo >= this.photo_list.length)
		this.current_photo = 0;
	return [this.photo_list[this.current_photo], this.photo_list[lcd_old]];
}

Animation.prototype.lcd_prev_pair=function()
{
	var lcd_old = this.current_photo;
	this.current_photo--;
	if (this.current_photo < 0)
		this.current_photo = this.photo_list.length-1;
	return [this.photo_list[this.current_photo], this.photo_list[lcd_old]];
}

Animation.prototype.ease=function(current, steps)
{
	return Math.pow(current/steps, 3) * 100;
};

Animation.prototype.next_fade=function()
{
	var ease = this.ease(this.fading_current++, this.fading_steps);
	this.set_opacity(ease);
	if (this.opacity >=100)
	{
		this.fading = false;
		this.fading_current = 0;
		this.set_back(this.photo_list[this.current_photo]);
		this.set_front("");
	}
}

Animation.prototype.set_opacity=function(value)
{
	value = Math.min(100, Math.max(0, value));
	if (this.obj_front.runtimeStyle)
		this.obj_front.runtimeStyle.filter='Alpha(opacity='+value+')';
	else
		this.obj_front.style.opacity = value/100;
	this.opacity = value;
}

function Photo(url, lcd)
{
	this.url = url;
	this.loaded = false;
	this.obj = new Image();
	var tmp = this;
	add_event_listener_element(tmp.obj, 'load', function(){tmp.onload()});
	this.obj.src = url;
}

Photo.prototype.onload = function()
{
	this.loaded = true;
}
