// Animador.js - Modulo de animacion general

// Variables Globales Animacion
var vga = new Object();

/*------------------------------ Interface ----------------------------------------*/
/*
function posicionar( id_objeto, x, y) 							- Ubica el objeto en coordenadas x,y
function mover( id_objeto, x, y, duracion, tipoAnimacion)		- Mueve el objeto desde posicion actual a x,y
function opacar( id_objeto, duracion, tipoAnimacion)			- Aparece el objeto desde transparente a opaco
function transparentar ( id_objeto, duracion, tipoAnimacion)	- Desaparece el objeto desde opcao a transparente
*/

function posicionar( id, x, y ) {
	
	// obtener objeto del id y posicionar	
	var objeto = document.getElementById(id);
	objeto.style.position = "absolute";
	objeto.style.left = x + "px";
	objeto.style.top  = y + "px";
}

function mover( id, x, y, duracion, tipoAnimacion) {

	// Crear nueva animaciňn 
	var i = vga.length? vga.length: 0;
	vga[i] = new Object();
	
	// Obtener objeto de animacion
	vga[i].objeto = document.getElementById(id);

	// Calcular numero de cuadros y retardo (a 60 cuadros/seg)
	vga[i].numeroCuadros = 30 * (duracion / 1000);
	vga[i].retardoCuadro = duracion / vga[i].numeroCuadros;

	// Calcular desplazamiento
	var posicionActual = posicionElemento(vga[i].objeto);	
	vga[i].dx = (x - posicionActual[0]) / vga[i].numeroCuadros;
	vga[i].dy = (y - posicionActual[1]) / vga[i].numeroCuadros;

	// Inicializar contador y función motor
	vga[i].contador = 0;
	vga[i].motor = "moviendo";
	vga[i].tipo = tipoAnimacion;

	// Consolidar posicion actual para posterior desplazamiento
	posicionar( id, posicionActual[0], posicionActual[1]);

	// Inicia animacion 
	animar(i);
	
	// Retornar index animacion
	return i;
}

function opacar( id, duracion, tipoAnimacion) {
	
	// Crear nueva animaciňn 
	var i = vga.length? vga.length: 0;
	vga[i] = new Object();

	vga[i].objeto = document.getElementById(id);

	// Calcular numero de cuadros y retardo (a 60 cuadros/seg)
	vga[i].numeroCuadros = 60 * (duracion / 1000);
	vga[i].retardoCuadro = duracion / vga[i].numeroCuadros;

	// Inicializar contador y función motor
	vga[i].contador = 0;
	vga[i].motor = "opacando";
	vga[i].tipo = tipoAnimacion;

	// Inicia animacion
	animar(i);

	// Retornar index animacion
	return i;
}

function transparentar( id, duracion, tipoAnimacion) {
	
	// Crear nueva animaciňn 
	var i = vga.length? vga.length: 0;
	vga[i] = new Object();

	vga[i].objeto = document.getElementById(id);

	// Calcular numero de cuadros y retardo (a 60 cuadros/seg)
	vga[i].numeroCuadros = 30 * (duracion / 1000);
	vga[i].retardoCuadro = duracion / vga[i].numeroCuadros;

	// Inicializar contador y función motor
	vga[i].contador = 0;
	vga[i].motor = "transparentando";
	vga[i].tipo = tipoAnimacion;

	// Inicia animacion
	animar(i);
	
	// Retornar index animacion
	return i;
}

/* ------------------------------ Motor de animacion ------------------------------ */

function animar(i) {
	if ( vga[i].contador < vga[i].numeroCuadros ) {
		eval(vga[i].motor + "(" + i + ")");
		vga[i].contador++;
		setTimeout("animar(" + i + ")", retardo(i));
	} else {
		// Limpiar memoria
		vga[i] = null;
	}
}

function retardo(i) {

	// Derivar segun el tipo de animacion
	switch (vga[i].tipo) {
		
		// Animacion continua
		case 0:
			return vga[i].retardoCuadro;
		break;
		
		// Animación con aceleracion/desaceleracion
		case 1:
			var k = vga[i].contador / vga[i].numeroCuadros;
			if ( k > 0.95) return (vga[i].retardoCuadro = 1.2 * vga[i].retardoCuadro);
			if ( k > 0.90) return (vga[i].retardoCuadro = 1.2 * vga[i].retardoCuadro);
			if ( k > 0.70) return (vga[i].retardoCuadro = 1.05 * vga[i].retardoCuadro);
		break;
	}
}

/* ----------------------- Transformaciones basicas -------------------------------- */
function moviendo(i) {
	vga[i].objeto.style.left = (parseInt(vga[i].objeto.style.left) + vga[i].dx) + "px";
	vga[i].objeto.style.top  = (parseInt(vga[i].objeto.style.top)  + vga[i].dy) + "px";
}
function opacando(i) {
	var opacidad = vga[i].contador / vga[i].numeroCuadros;
	vga[i].objeto.style.opacity = opacidad;
	vga[i].objeto.style.filter = 'alpha(opacity=' + opacidad * 100 + ')';
}
function transparentando(i) {
	var opacidad = 1 - (vga[i].contador / vga[i].numeroCuadros);
	vga[i].objeto.style.opacity = opacidad;
	vga[i].objeto.style.filter = 'alpha(opacity=' + opacidad * 100 + ')';
}

/* ---------------------------- Auxiliares ------------------------------------------*/
// Retorna la posicion del elemento
function posicionElemento(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

