/******************************************************************************
*	PopNav - dynamic navigation skript
*
*	Creator: Marco Hoeck <marco.hoeck@tvi-services.de>
*	Created: 2007-05-25
*	Copyright: Marco Hoeck, TV Informations Services GmbH
******************************************************************************/

var popnav_wait = 500;
var popnav_fps = 20;

var popnav_data = new Array();

window.setInterval(popnav_renderloop, 1000 / popnav_fps);


function popnav_register(id, pos_x, pos_y, dist_x, dist_y, acc_dist_pos, acc_dist_neg, vel_x, vel_y, event_statechange, event_frame)
{
	var found = 0;
	for(var i = 0; i < popnav_data.length; i++)
	{
		if(popnav_data[i][0] == id)
			found = 1;
	}

	if(found > 0)
		return 0;

	var i = popnav_data.length;
	popnav_data[i] = new Array();
	popnav_data[i][0] = id;	// id
	popnav_data[i][1] = 0;	// state
	popnav_data[i][2] = 1;	if(dist_x > 0) popnav_data[i][2] = -1; // x coord factor
	popnav_data[i][3] = 1;	if(dist_y > 0) popnav_data[i][3] = -1;	// y coord factor
	popnav_data[i][4] = pos_x;	if(pos_x < 0) popnav_data[i][4] = -pos_x; // x pos
	popnav_data[i][5] = pos_y;	if(pos_y < 0) popnav_data[i][5] = -pos_y; // y pos
	popnav_data[i][6] = popnav_data[i][2] * (-dist_x);	// x distance
	popnav_data[i][7] = popnav_data[i][3] * (-dist_y);	// y distance
	popnav_data[i][8] = vel_x;	// x velocity
	popnav_data[i][9] = vel_y;	// y velocity
	popnav_data[i][10] = acc_dist_pos;	// acceleration dist pos
	popnav_data[i][11] = acc_dist_neg;	// acceleration dist neg
	popnav_data[i][12] = event_statechange;	// event state change
	popnav_data[i][13] = event_frame;	// event frame

	return 1;
}


function popnav_set_state(id, state)
{
	for(var i = 0; i < popnav_data.length; i++)
	{
		if(popnav_data[i][0] == id)
		{
			if(state == 1)
				popnav_data[i][1] = 1;
			else if(state == -1)
				popnav_data[i][1] = -1;
			else
				popnav_data[i][1] = 0;

			// trigger event state change complete
			if(popnav_data[i][12])
			{
				popnav_data[i][12](popnav_data[i][0], popnav_data[i][1], 0);
			}
		}
	}
}


function popnav_rnd_check_pos(i, offset)
{
	var update = 0;

	// x
	if(popnav_data[i][4 + offset] < 0)
	{
		popnav_data[i][4 + offset] = 0;
		update = 1;
	}
	else if(popnav_data[i][4 + offset] > popnav_data[i][6 + offset])
	{
		popnav_data[i][4 + offset] = popnav_data[i][6 + offset];
		update = 1;
	}

	return update;
}


function popnav_rnd_get_velocity(i, offset)
{
	var velocity = popnav_data[i][8 + offset];
	if(velocity == 0)
		return velocity;

	if(popnav_data[i][1] < 0)
	{
		var acc_dist_pos = popnav_data[i][10];
		var acc_dist_neg = popnav_data[i][11];
	}
	else if(popnav_data[i][1] > 0)
	{
		var acc_dist_pos = popnav_data[i][11];
		var acc_dist_neg = popnav_data[i][10];
	}
	else
	{
		var acc_dist_pos = 0;
		var acc_dist_neg = 0;
	}


	if(popnav_data[i][4 + offset] < acc_dist_pos)
	{
		velocity = popnav_data[i][8 + offset] * (popnav_data[i][4 + offset] / acc_dist_pos);
	}
	else if(popnav_data[i][4 + offset] > (popnav_data[i][6 + offset] - acc_dist_neg))
	{
		velocity = popnav_data[i][8 + offset] * ((popnav_data[i][6 + offset] - popnav_data[i][4 + offset]) / acc_dist_neg);
	}

	velocity = Math.round(velocity);

	if(velocity <= 0)
		velocity = 1;

	return velocity;
}


function popnav_renderloop()
{
	for(var i = 0; i < popnav_data.length; i++)
	{
		var update = 0;

		if(popnav_data[i][1] != 0)
		{
			popnav_data[i][4] += (-popnav_data[i][1]) * popnav_rnd_get_velocity(i, 0);
			popnav_data[i][5] += (-popnav_data[i][1]) * popnav_rnd_get_velocity(i, 1);
			update++;

			var clip = 0;
			clip += popnav_rnd_check_pos(i, 0);	// x
			clip += popnav_rnd_check_pos(i, 1);	// y
			if(clip > 1)
			{
				update++;

				// trigger event state change complete
				if(popnav_data[i][12])
				{
					popnav_data[i][12](popnav_data[i][0], popnav_data[i][1], 1);
				}

				popnav_data[i][1] = 0;
			}
		}

		// update
		if(update > 0)
		{
			// trigger event frame
			if(popnav_data[i][13])
			{
				popnav_data[i][13]();
			}

			// set style position
			var nav = document.getElementById(popnav_data[i][0]);
			if(nav)
			{
				nav.style.left = (popnav_data[i][4] * popnav_data[i][2]) + "px";
				nav.style.top = (popnav_data[i][5] * popnav_data[i][3]) + "px";
			}
		}
	}
}