﻿// Script de animaçao Minicooper v1.0
// Autor: Gladston Garcia @ One Digital 
// Data: 10/2009

// INICIO: Startup

var divId, contadorParado, distanciaRastro, delayFreada, delayRastro, delayAtualizacaoCaminho, delayAtualizacaoFlash, tipoEasing, animacaoConcluida, ultimoMouseX, ultimoMouseY, ultimoRastroAjustadoX, ultimoRastroAjustadoY, direcaoH, direcaoV, divAnim, divFumaca, ultimaMovimentacao, statusMovimentacao;

function iniciarAnimacaoCooper() {
    $(document).ready(function() {
        // Variáveis configuráveis.                   
        divId = "mouseAnim";
        distanciaRastro = 13;
        toleranciaMovimentacao = 20;
        delayFreada = 70;
        delayRastro = 350;
        delayAtualizacaoCaminho = 150;
        delayAtualizacaoFlash = 50;
        tipoEasing = "linear";

        flash = document.getElementById("mini3");
        //fumaca = document.getElementById("fumaca");
        // Nao alterar a partir deste ponto.
        divAnim = $("#" + divId);
        divAnim.css("top", "-999");
        divAnim.css("left", "-999");
        divFumaca = $("#fumacaAnim");
        animacaoConcluida = true;
        ultimoMouseX = 0;
        ultimoMouseY = 0;
        ultimoRastroAjustadoX = 0;
        ultimoRastroAjustadoY = 0;
        direcaoH = "esquerda";
        direcaoV = "reto";
        ultimaMovimentacao = (new Date()).getTime();
        statusMovimentacao = "parado";

        $(document).mousemove(function(e) {
            try {
                registrarDirecaoMouse(e.pageX, e.pageY);
                registrarPosicaoFinal(e.pageX, e.pageY);
            } catch (e) {
                iniciarAnimacaoCooper();
            }

        });

        var intervaloAtualizacaoFlash = window.setInterval("atualizarFlash()", delayAtualizacaoFlash);
        var intervaloAjustePosicao = window.setInterval("ajustarPosicao()", delayAtualizacaoCaminho);

        divAnim.show();

        $(document).mouseleave(function() {
            divAnim.hide();
        });

        $(document).mouseenter(function() {
            divAnim.show();
        });
    });
}

// FIM: Startup

// INICIO: Funcoes principais

function ajustarPosicao() {
    try {
        if (ultimoMouseX + distanciaRastro < getDivAnimX()) {
            if (absDiff(ultimoMouseX + distanciaRastro, getDivAnimX()) > toleranciaMovimentacao || absDiff(ultimoMouseY + distanciaRastro, getDivAnimY()) > toleranciaMovimentacao) {
                moverRastroAjustado(ultimoMouseX, ultimoMouseY, false);
            }
        } else if (ultimoMouseX > getDivAnimX() + divAnim.width() + distanciaRastro) {
            if (absDiff(ultimoMouseX, getDivAnimX() + divAnim.width() + distanciaRastro) > toleranciaMovimentacao || absDiff(ultimoMouseY + distanciaRastro, getDivAnimY()) > toleranciaMovimentacao) {
                moverRastroAjustado(ultimoMouseX, ultimoMouseY, false);
            }
        } else if (ultimoMouseX + distanciaRastro > getDivAnimX() && ultimoMouseX < getDivAnimX() + divAnim.width() + distanciaRastro) {
            moverRastroAjustado(null, ultimoMouseY, false);
        }
    } catch (e) {

    }
}

function atualizarFlash() {
    try {
        flash.setAngulo(ultimoMouseY, ultimoMouseX, getDivAnimY(), getDivAnimX());
    } catch (e) { }
}

function registrarDirecaoMouse(x, y) {
    if (x < ultimoMouseX) {
        direcaoH = "esquerda";
        ultimoRastroAjustadoX = x;
    } else if (x > ultimoMouseX) {
        direcaoH = "direita";
        ultimoRastroAjustadoX = x - divAnim.width();
    } else if (x == ultimoMouseX) {
        direcaoH = "parado";
    }

    if (y < ultimoMouseY) {
        direcaoV = "cima";
        ultimoRastroAjustadoY = y;
    } else if (y > ultimoMouseY) {
        direcaoV = "baixo";
        ultimoRastroAjustadoY = y;
    } else if (y == ultimoMouseY) {
        direcaoV = "parado";
    }
}

function registrarPosicaoFinal(x, y) {
    ultimoMouseX = x;
    ultimoMouseY = y;
    ultimaMovimentacao = (new Date()).getTime();
}

function moverRastroAjustado(x, y, lastRun) {
    if (direcaoH == "esquerda") {
        if (x != null) {
            x += distanciaRastro;
        }
        moverRastro(x, y + distanciaRastro, false);
    } else if (direcaoH == "direita") {
        if (x != null) {
            x = x - divAnim.width() - distanciaRastro;
        }
        moverRastro(x, y + distanciaRastro, false);
    } else if (direcaoH == "parado") {
        moverRastro(null, y + distanciaRastro, false);
    }
}

function moverRastro(x, y, lastRun) {
    x = x < 0 ? 0 : x;
    y = y < 0 ? 0 : y;

    if (x == null) {
        if (x + parseInt(divAnim.width()) > parseInt(divAnim.css("left").replace("px", "")) || x + parseInt(divAnim.width() * -1) < parseInt(divAnim.css("left").replace("px", ""))) {
            animacaoConcluida = false;

            divAnim.animate({
                top: y
            }, {
                duration: delayRastro,
                easing: tipoEasing,
                complete: function() { animacaoConcluida = true },
                queue: false
            });
        }
    } else {
        if (x + parseInt(divAnim.width()) > parseInt(divAnim.css("left").replace("px", "")) || x + parseInt(divAnim.width() * -1) < parseInt(divAnim.css("left").replace("px", ""))) {
            animacaoConcluida = false;

            divAnim.animate({
                top: y,
                left: x
            }, {
                duration: delayRastro,
                easing: tipoEasing,
                complete: function() { animacaoConcluida = true },
                queue: false
            });
        }
    }
}

// FIM: Funcoes principais

// INICIO: Funcoes auxiliares

function absDiff(n1, n2) {
    return Math.abs(n1 > n2 ? n1 - n2 : n2 - n1);
}

function getDivAnimX() {
    return parseInt(divAnim.css("left").replace("px", ""));
}

function getDivAnimY() {
    return parseInt(divAnim.css("top").replace("px", ""));
}

function getLadoDivAnim() {
    return (ultimoMouseX > getDivAnimX() + (divAnim.width() / 2)) ? "esquerdo" : "direito";
}

// FIM: Funcoes auxiliares

function showFumaca(angulo, x, y, esquerda) {


    divFumaca.css("top", y + "px");
    divFumaca.css("left", x + "px");

    try {
        document.getElementById("fumaca").setTeste(angulo, esquerda);
    } catch (e) {
    }

    divFumaca.show();
}

function hideFumaca() {
    divFumaca.hide();
}