/**
 * FUNÇÕES DE TAREFAS
 *
 * Todas as funções de tarefas estão relacionadas aqui.
 *
 * ex.:
 *      inicialização de tarefas
 *      atualização de tarefas
 *      criação de tarefas
 *      exclusão
 *      atualização dos divs das tarefas
 */
/**
 * initTarefas
 * Inicializa sistema de tarefas
 */
function initTarefas(arg){


    if ( arg == null ){
        arg = new Object;
    }

    /**
     * Ajusta variável tarefas para que o índice dos valores seja por id.
     */
    var tmp = new Object();

    jQuery.each(arg, function(i, value){
        temTarefas = true;
        if ( value != null){
            tmp[arg[i]["ordem"]] = arg[i];
            //alert( arg[i]["id"] );

            /**
             * Instancia cronometroTarefas
             */
            cronometroTarefas[ arg[i]["ordem"] ] = arg[i];
            cronometroTarefas[ arg[i]["ordem"] ].cronometro = "parar";
        }

    })

    var i = 0;

    while( i < arg.length){
        i++;
    }
    //alert( $.toJSON(tmp) );
    tarefas = tmp;

    /**
     * Define qual o próximo ID
     */
    getLastId();

    /**
     * Inicializa Divs com Tarefas
     */
    jQuery.each(tarefas, function(i, value){
        //alert( 'oi'+i );
        insereDivTarefa( tarefas[i] );
    })

}

/**
 * Pega o último ID e retorna o próximo ID a ser usado em uma tarefa
 */
function getLastId(){
    var lastId = 0 * 1;

    var total = 0;
    jQuery.each(tarefas, function(i, value){
        var tmp = i * 1;

        if ( ( tmp * 1) > ( lastId * 1 ) ){
            lastId = parseInt(tmp * 1);
        }
        total++;
    })

    //alert( lastId + 1 );
    return (lastId + 1);
}

/**
 * CRUD DE TAREFA
 *
 * Novas Tarefas, Deleta Tarefas, etc
 */
/**
 * Submit nova tarefa
 */
function submitNovaTarefa(tarefaNome){

    if( (tarefaNome.length > 0) && (tarefaNome != null) ){
        
        /**
         * Inclui a nova tarefa no stack
         */
        var tmpTimer = 0;

        if( $(".merchandising").css("display") != "none"  ){
            $("#merchan_1").slideUp("slow");
            tmpTimer = 800;
        }

        $("input[class=input_tarefa]").attr("value", "")

        setTimeout( function(){

            var idAtual = getLastId() * 1;
            cronometroTarefas[ idAtual ] = new Array();
            tarefas[ idAtual ] = new Array();
            tarefas[ idAtual ].id = idAtual;
            tarefas[ idAtual ].nome = tarefaNome;
            tarefas[ idAtual ].tipo = "ativa";
            tarefas[ idAtual ].descricao = "";
            tarefas[ idAtual ].ordem = idAtual;

            var tarefa = new Object;
            tarefa.id = idAtual;
            tarefa.ordem = idAtual;
            tarefa.nome = tarefaNome;
            tarefa.tipo = "ativa";
            var tarefajSon = $.toJSON(tarefa) ;
            insereDivTarefa( tarefas[ idAtual ] );

            if( !seSafari() ){
                $("#" + idAtual + " .titulo").animate({ backgroundColor: "#9be279" }, 400).animate({ backgroundColor: "white" }, 900);
            }
            

            $.ajax(
                {
                    url: WEBROOT+"tarefas/novatarefa/",
                    //global: false,
                    type: "POST",
                    data: ({
                        json : tarefajSon
                    }),
                    dataType: "html",
                    complete: function(msg){
                        //alert(msg.responseText);
                        if( !seSafari() ){
                            $("#" + idAtual + " .titulo").animate({ color: "#74d546" }, 300).animate({ color: $("#" + idAtual + " .titulo").css("color") }, 700);
                        }
                    }
                }
            );

            /**
             * Novo elemento adicionado, reconfigura eventos
             */
            setConfig();

        }, tmpTimer );
    } // fim da verificação de string
}

/**
 * @todo implementar
 * Deleta uma tarefa, precisa implementação.
 */
function deleteTarefa(ordem){
    tarefas[ordem]["tipo"] = "excluido";
    $.ajax(
        {
            url: WEBROOT+"tarefas/deletartarefa",
            //global: false,
            type: "POST",
            data: ({
                ordem : ordem
            }),
            dataType: "html",
            complete: function(msg){
                //alert(msg.responseText);
            }
        }
    );
    if( !seSafari() ){
        $("#"+ordem+' .titulo').animate({ color: "red" }, 200).animate({ color: "white" }, 100);
    }

    /**
     * Remove a tarefa e o div
     */
    setTimeout( function(){
        $("#"+ordem).fadeOut();
        setTimeout( function(){
            $("#"+ordem).remove();
            setConfig();
        }, 100);
    }, 250);
    

}

/**
 * Atualiza informações de uma tarefa a partir do Lightbox "MaisOpções"
 */
function atualizaTarefaInfo(){
    var ordem = $("#maisopcoes input[name=id]").attr( "value");
    var nome = $("#maisopcoes input[name=nome]").attr( "value");
    var descricao = $("#maisopcoes textarea[name=descricao]").attr("value");

    if( nome != "" ){
        tarefas[ordem]["nome"] = nome;
        tarefas[ordem]["descricao"] = descricao;
        tarefas[ordem]["ordem"] = ordem;
        tarefas[ordem]["cronometro_tempo"] = tarefas[ordem]["cronometro_tempo"];
        //alert( $.toJSON(tarefas) );
        atualizaTarefaDiv(ordem);
        tarefa = tarefas[ordem];

        var tarefajSon = $.toJSON(tarefa) ;

        $.ajax(
            {
                url: WEBROOT+"tarefas/atualizatarefa/",
                //global: false,
                type: "POST",
                data: ({
                    json : tarefajSon
                }),
                dataType: "html",
                complete: function(msg){
                    //alert(msg.responseText);
                }
            }
        );


    } else {
        alert('A tarefa precisa ter um nome para atualizar os dados.');
    }
}

/**
 * Atualiza o DIV da tarefa visualmente.
 */
function atualizaTarefaDiv(id){
    /**
     * Atualiza o título do div da tarefa
     */
    $("#"+ id +" .titulo").html( tarefas[id]["nome"] );
}

/**
 * ATUALIZA TAREFA (Ativa/Concluída) (CHECKBOX)
 *
 * Ao clicar no checkbox, esta função é chamada.
 */
function atualizaTarefaTipo(este){

    checkboxName = $(este).attr("name");
    var matches = (/([checkbox_]+)([0-9]+)/).exec(checkboxName);

    if( matches ){
        if( matches[1] == "checkbox_" ){
            id = matches[2];
        }
    }

    if( id != null ){

        /**
         * Configura tarefa atual na variável tarefas
         */
        if ( este.checked ){
            tarefas[id]["tipo"] = "concluida";
        } else {
            tarefas[id]["tipo"] = "ativa";
        }

        var id = id;
        var nome = tarefas[id]["nome"];
        var descricao = tarefas[id]["descricao"];
        var tipo = tarefas[id]["tipo"];
        
        tarefa = tarefas[id];
        var tarefajSon = $.toJSON(tarefa) ;

        $.ajax(
            {
                url: WEBROOT+"tarefas/atualizatarefa/",
                //global: false,
                type: "POST",
                data: ({
                    json : tarefajSon
                }),
                dataType: "html",
                complete: function(msg){
                    /**
                     * Atualização de tipo (checkbox's click)
                     */
                    //alert(msg.responseText);
                }
            }
        );

        /**
         * Prepara informações para pintar DIV
         */
        var tarefa = new Object;
        tarefa.id = id;
        tarefa.nome = tarefas[id]['nome'];
        tarefa.tipo = tarefas[id]['tipo'];
        var tarefajSon = $.toJSON(tarefas);
        $("#"+id).remove();
        insereDivTarefa( tarefas[id] );
    }
    setConfig();
}

/**
 * FUNÇÕES DE AMOSTRAGEM
 *
 * Lida diretamente com Divs
 */
/**
 * Insere novos Divs
 *
 * o argumento 'arg' deve ser JSON
 *
 * @param arg json Todas as informações sobre a tarefa
 */
function insereDivTarefa(arg){

    //alert(arg["tipo"]);
    var div;
    /**
     * DIV para tarefa ATIVA
     */
    if( arg["tipo"] == "ativa" ){
        div = '<div class="tarefa ativa" id="'+arg["ordem"]+'">' +
                    '<div class="checkbox">' +
                        '<input type="checkbox" onclick="atualizaTarefaTipo(this)" name="checkbox_'+arg["ordem"]+'" />' +
                    '</div>' +
                    '<div class="titulo">' +
                       arg["nome"]+'' +
                    '</div>' +
                    '<div class="opcoes" id="opcoes_'+arg["ordem"]+'">' +
                        '<span style="margin: 5px 0 0 4px;"><a href="javascript: void(0);" onclick="deleteTarefa('+ arg["ordem"] +')"><img src="'+WEBROOT+'img/excluir.jpg" /></a></span>' +
                        '<a href="javascript: void(0);" class="maisopcoes" onclick="showModal(this, \''+ arg["ordem"] +'\')"><img src="'+WEBROOT+'img/mais_opcoes.jpg" /></a>' +
                    '</div>' +
                '</div>';

        $("#tarefas_ativas").append(div);
    }
    /**
     * DIV para tarefa CONCLUIDA
     */
    else if ( arg["tipo"] == "concluida" ) {
        div = '<div class="tarefa concluida" id="'+arg["ordem"]+'">' +
                    '<div class="checkbox">' +
                        '<input type="checkbox" onclick="atualizaTarefaTipo(this)" checked="true" name="checkbox_'+arg["ordem"]+'" />' +
                    '</div>' +
                    '<div class="titulo">' +
                       arg["nome"]+'' +
                    '</div>' +
                    '<div class="opcoes" id="opcoes_'+arg["ordem"]+'">' +
                        '<span style="margin: 5px 0 0 4px;"><a href="#" onclick="deleteTarefa('+ arg["ordem"] +')"><img src="'+WEBROOT+'img/excluir.jpg" /></a></span>' +
                        '<a href="#maisopcoes" class="maisopcoes" onclick="showModal(this, \''+ arg["ordem"] +'\')"><img src="'+WEBROOT+'img/mais_opcoes.jpg" /></a>' +
                    '</div>' +
                '</div>';

        $("#tarefas_concluidas").append(div);

    }

    $( "#opcoes_"+arg["ordem"] ).hide();
    //setConfig();

}

/**
 * Reseta lista de tarefas
 */
function limpaLista(){
    if( confirm("Você tem certeza de que deseja limpar sua lista de tarefas? "+
                "Você perderá todas as suas atividades se continuar.") ){
        /**
         * Loop por cada tarefa, apagando-as e então enviando um comando via
         * Ajax para excluir todas as tarefas
         */
        jQuery.each(tarefas, function(i, value){
            deleteTarefa( tarefas[i]["ordem"] );
        })
        alert( "Todas as tarefas foram apagadas com sucesso." );

    }
}
/**
 * CRONÔMETRO
 *
 * Verificações de cronômetro
 */
function gerenciaHtmlCronometro(tarefaId){

    if( cronometroTarefas[tarefaId]["cronometro"] == null || cronometroTarefas[tarefaId]["cronometro"] == "parar" ){
        $("#cronometro .tempo_botao .parar").hide();
        $("#cronometro .tempo_botao .iniciar").show();
    } else {
        $("#cronometro .tempo_botao .iniciar").hide();
        $("#cronometro .tempo_botao .parar").show();
    }
    //alert(tarefas[tarefaId]["cronometro_tempo"]);
    if( parseInt( tarefas[tarefaId]["cronometro_tempo"] *1 ) >= 0 ){
        $("#cronometro .tempo_status").html( segundosParaHoras( tarefas[tarefaId]["cronometro_tempo"] * 1 ) );
    } else {
        $("#cronometro .tempo_status").html( segundosParaHoras("0") );
    }
}

function initStopRelogio( arg ){

    var inLoop = false;
    /**
     * Verifica se a função está dentro do loop ou não
     */
    if( !arg.iniciouAgora ){
        inLoop = true;
    } else {
        arg.iniciouAgora = false;
    }

    if( cronometroTarefas[arg.ordem]["cronometro"] != "parar" && !inLoop ){
        cronometroTarefas[arg.ordem]["cronometro"] = arg.action;
    }

    /**
     * Analisa tempos
     */
    /**
     * Novo objeto Date()
     */
    var myTime = new Date();
    var timeNow = myTime.getTime();

    /**
     * Se está iniciando a cronometragem
     */
    if( !inLoop ){
        cronometroTarefas[arg.ordem]["cronometro_inicio"] = timeNow;
    }

    var inicioRelogio = cronometroTarefas[arg.ordem]["cronometro_inicio"];

    /**
     * Diferença entre o tempo de início e o atual
     */
    var timeDiff = timeNow - inicioRelogio;


    /**
     * Calcula o tempo pela diferença do inicio até o momento atual e então
     * retorna tempoLocal como resultado.
     */
    this.diffSecs = timeDiff/1000;
    var tempoLocal = ""+this.diffSecs;
    tempoLocal = tempoLocal.substring( 0, tempoLocal.indexOf(".") ); // é string
    if( tempoLocal == "" ){
        tempoLocal = this.diffSecs;
    }
    
    /**
     * Verifica se tarefa já tem tempo contado anteriormente
     */
    if( isNaN(tarefas[arg.ordem]["cronometro_tempo"]) && isNaN(cronometroTarefas[arg.ordem]["cronometro_tempototal"]) ) {
        cronometroTarefas[arg.ordem]["cronometro_tempototal"] = parseInt(0);
    } else if( isNaN(cronometroTarefas[arg.ordem]["cronometro_tempototal"]) ){
        cronometroTarefas[arg.ordem]["cronometro_tempototal"] = tarefas[arg.ordem]["cronometro_tempo"];
    }
    /**
    if( isNaN(cronometroTarefas[arg.ordem]["cronometro_tempototal"]) ){
        cronometroTarefas[arg.ordem]["cronometro_tempototal"] = parseInt(0);
        alert('iuh');
    }
    */

    var tempoTotal = cronometroTarefas[arg.ordem]["cronometro_tempototal"] *1 + tempoLocal*1 ; // é integer

    /**
     * Atualiza mostradores
     */

    /**
     * CRÔNOMETRO PARADO OU CONTANDO
     * Segue cronometrando ou pára
     */
    if( cronometroTarefas[arg.ordem]["cronometro"] == "iniciar" ){

        window.setTimeout("initStopRelogio( " + $.toJSON( arg ) + " )", 1000);
        //return(this.diffSecs);
    } else if( cronometroTarefas[arg.ordem]["cronometro"] == "parar" ) {
        tarefas[arg.ordem]["cronometro_tempo"] = parseInt( tempoTotal * 1 );
        cronometroTarefas[arg.ordem]["cronometro_tempototal"] = tarefas[arg.ordem]["cronometro_tempo"];
        gerenciaHtmlCronometro(arg.ordem);
        atualizaTarefaInfo()
    }

    if( $('#maisopcoes input[name=id]').attr("value") == arg["ordem"] ){
        $("#cronometro .tempo_status").html( segundosParaHoras( tempoTotal ) );
    }

}

/**
 * Inicia ou pára o cronômetro
 */
function cronometroTarefa( arg ) {
    if( arg["action"] == "iniciar" && cronometroTarefas[arg.ordem]["cronometro"] != "iniciar" ){

        cronometroTarefas[arg.ordem]["cronometro"] = "iniciar";
        gerenciaHtmlCronometro(arg.ordem);
        $("#cronometro .tempo_status").css("color", "green");
        arg.iniciouAgora = true;
        initStopRelogio( arg );

    } else if ( arg["action"] == "parar" && cronometroTarefas[arg.ordem]["cronometro"] != "parar" ){

        cronometroTarefas[arg.ordem]["cronometro"] = "parar";
        $("#cronometro .tempo_status").css("color", "#999999");
        //atualizaTarefaInfo()
    }
}