/*
*Autor: Flying Peach
*Copyright: 2009 Contenidos Digitales Interactivos FP S.C.
*Versión: 1.0
*/

FlyingPeach.WebBrowsers.namespace("FlyingPeach.WebBrowsers.Animacion");

FlyingPeach.WebBrowsers.Animacion.animar = function animar(idElemento, atributos, segundosDuracion) {
    var elementoPropietario = document.getElementById(idElemento);
    if (elementoPropietario != null) {
        asignarValorAtributoElemento(elementoPropietario, "opacity", 0);
        for (var atributo in atributos) {
            atributos[atributo].elementoPropietario = elementoPropietario;
            try {
                asignarValorAtributoElemento(elementoPropietario, atributo, atributos[atributo].valorInicial);
            }
            catch (e) {
                atributos[atributo].valorInicial = document.getElementById(_idElemento).style[atributo].replace("px", "");
            }

            var milisegundosDeltaError = 50;
            configurarEventos(atributos[atributo]);
            atributos[atributo].valorActual = atributos[atributo].valorInicial;
            atributos[atributo].duracionAnimacion = (segundosDuracion * 1000) - milisegundosDeltaError;
            atributos[atributo].tiempoInicioAnimacion = new Date().getTime();
            atributos[atributo].idTimer = setInterval(function() { actualizarAnimacion(atributos); }, 1);
        }
    }
}

function configurarEventos(atributo) {
    atributo.animacionIniciada = FlyingPeach.WebBrowsers.crearEvento("animacionIniciada");
    if (atributo["animacionIniciadaHandler"] != null)
        atributo.animacionIniciada.suscribirHandler(atributo["animacionIniciadaHandler"]);
    if (atributo["animacionIniciadaHandlers"] != null)
        for (animacionIniciadaHandler in atributo["animacionIniciadaHandlers"])
        atributo.animacionIniciada.suscribirHandler(animacionIniciadaHandler);

    atributo.animacionFinalizada = FlyingPeach.WebBrowsers.crearEvento("animacionFinalizada");
    if (atributo["animacionFinalizadaHandler"] != null)
        atributo.animacionFinalizada.suscribirHandler(atributo["animacionFinalizadaHandler"]);
    if (atributo["animacionFinalizadaHandlers"] != null)
        for (animacionIniciadaHandler in atributo["animacionFinalizadaHandlers"])
        atributo.animacionFinalizada.suscribirHandler(animacionFinalizadaHandler);
}

function actualizarAnimacion(atributos) {
    var factorInterpolacionAnimacion;
    var tiempoActual = new Date().getTime();
    for (var atributo in atributos) {
        factorInterpolacionAnimacion = (tiempoActual - atributos[atributo].tiempoInicioAnimacion) / atributos[atributo].duracionAnimacion;
        factorInterpolacionAnimacion = factorInterpolacionAnimacion > 1 ? 1 : factorInterpolacionAnimacion;

        atributos[atributo].valorActual = FlyingPeach.WebBrowsers.Matematicas.interpolarLineal(atributos[atributo].valorInicial, atributos[atributo].valorFinal, factorInterpolacionAnimacion);
        asignarValorAtributoElemento(atributos[atributo].elementoPropietario, atributo, atributos[atributo].valorActual);

        if (factorInterpolacionAnimacion == 1) {
            clearInterval(atributos[atributo].idTimer);
            atributos[atributo].animacionFinalizada.invocarHandlers(null);
        }
    }
}

function asignarValorAtributoElemento(elemento, atributo, valor) {
    switch (atributo) {
        case "opacity":
            elemento.style["opacity"] = valor;
            elemento.style["filter"] = "alpha(opacity=" + (valor * 100) + ")";

            break;
        default:
            elemento.style[atributo] = valor + "px";
            
            break;
    }
}