/* Filtro DDS - Drag-Drop-Sortable */

var iini = -1;
var ifim = -1;
var clone;

$.fn.filtroDDS = function (eventoLimparListas) {

    return this.each(function () {

        var filtroID = "#" + $(this).attr("id");

        valida();

        // Drag & Drop & Sortable //
        $(filtroID + " .lista-a, " + filtroID + " .lista-b").sortable({
            connectWith: ".listas",
            tolerance: "pointer",
            start: function (event, ui) {
                $(".area-menu-filtro").addClass("active");

                if (ui.item.parent().hasClass("lista-b")) {
                    iini = ui.item.index();
                } else {
                    iini = 2000;
                }
            },
            stop: function (event, ui) {

                ifim = ui.item.index();

                listas();
                montaDiretorio();
                $(".area-menu-filtro").removeClass("active");
            }
        }).disableSelection();
        ////////////////////////////

        // Funções
        // Clona o menu para resetá-lo eventualmente //
        //var lista = $(filtroID + " .lista-a").children().clone();
        if (clone == null) {
            clone = $(filtroID + " .lista-a").children().clone();
        }

        // Limpa os campos e retorna o menu à lateral esquerda
        $(filtroID + " .btn-forms button[type=reset]").on("click", function () {
            $(filtroID + " [class^=item-]").hide();
            $(filtroID + " .lista-a, " + filtroID + " .lista-b").children().remove();
            $(filtroID + " .lista-a").prepend(clone);
            $(filtroID + " [class^=lista-] li").removeClass();
            $(filtroID + " .lista-a li").css("marginLeft", 0);
            $(filtroID + " .filtro-dds").find("form").trigger("reset");
        });
        //////////////////////////////////////////////

        // Manipula os itens entre as listas //
        function listas() {
            var id = event.srcElement.dataset.item // Pega o id referente ao item

            //Se o item foi arrastado dentro do filtro (lista-b)
            if (iini != ifim && $(event.srcElement).parent().hasClass("lista-b")) {

                var i = Math.min(iini, ifim); // pega o menor indice, onde o item estava ou para onde o item foi

                formataItensSeguintes(i);

                if ($(event.srcElement).prev("li.valido").length > 0 || $(event.srcElement).index() == 0) { // se o item anterior é valido ou se o item é o primeiro da lista
                    $(event.srcElement).removeClass('desativado').addClass("ativado"); // ativa o item
                    eventoClick($(event.srcElement)); // aplica o evento do click no item
                }

                selecionaItemValido();
                mostraFormulario();

                if (eventoLimparListas && iini != 2000) {
                    eventoLimparListas($("#" + event.srcElement.id));
                }

                $('#btnFiltrar').prop('disabled', false);

            } else if (iini != 2000) { // Se o item foi arrastado para fora do filtro (lista-a)
                $(event.srcElement).removeClass();
                var item = $($(".lista-b li")[iini]);

                if (!$(event.srcElement).parent().hasClass("lista-b"))
                    formataItensSeguintes(iini);

                if (item.prev("li.valido").length > 0 || iini == 0) { // se o item anterior é valido ou se o item é o primeiro da lista
                    item.removeClass('desativado').addClass("ativado"); // ativa o item
                    eventoClick(item); // aplica o evento do click no item
                }

                selecionaItemValido();
                mostraFormulario();

                if (eventoLimparListas && iini != 2000 && $(event.srcElement).parent().hasClass("lista-a")) {
                    eventoLimparListas($("#" + item.attr("id")));
                }

                $('#btnFiltrar').prop('disabled', false);
            }

            var selecionado = $(".desativado.selecionado");
            if (selecionado.length > 0) {
                selecionado.removeClass().addClass("ativado selecionado");
                eventoClick(selecionado);
            }

        }

        function formataItensSeguintes(el) {
            $('.lista-b li').slice(el).each(function (i, val) {
                if ($(this).prev('li').hasClass('valido')) { // se anterior for valido, ativa o item
                    $(this).removeClass().addClass("ativado");
                } else { // senão zera o item e o desativa
                    $(this).removeClass().addClass("desativado").unbind("click");
                }
                zeraFormulario($(this).attr("data-item"));
            });
        }

        function mostraFormulario() {
            $(filtroID + " .conteudo-filtro > div").hide();
            $(filtroID + " .conteudo-filtro ." + $(filtroID + " .lista-b li.selecionado").attr("data-item")).show();
        }

        function selecionaPrimeiro() {
            if ($(filtroID + " .lista-b li.selecionado").length == 0) {
                $(filtroID + " .lista-b li").eq(0).addClass("selecionado");
            }
        }

        function selecionaItemValido() {
            $('.lista-b li.selecionado').removeClass('selecionado');
            if ($(filtroID + ' .lista-b li.ativado').length > 0) { // se tiver item ativo, seleciona o ultimo item 
                $(filtroID + ' .lista-b li.ativado:last').addClass("selecionado");
            } else { // senão, seleciona o primeiro item
                $(filtroID + " .lista-b li").eq(0).addClass("selecionado");
            }
        }

        function eventoClick(elemento) {
            elemento.click(function (e) {
                var id = $(this).attr("data-item");

                var classFiltro = $("#filtro-" + id).attr("class");

                if (classFiltro != "desativado") {

                    $(".lista-b li").removeClass("selecionado");
                    elemento.addClass("selecionado");
                    mostraFormulario();
                    $(filtroID + " .conteudo-filtro [class^=" + id + "]").find("input:text, input:password, input:file, select, textarea").each(function () {
                        $(this).focus();
                    });
                }

            });
        }

        function zeraFormulario(id) {
            $(filtroID + " .conteudo-filtro [class^=" + id + "]").find("input:text, input:password, input:file, select, textarea").each(function () {
                $(this).val("");
            });

            $(filtroID + " .conteudo-filtro [class^=" + id + "]").find("input:checkbox").each(function () {
                $(this).attr("checked", false);
            });

            $(filtroID + " .conteudo-filtro [class^=" + id + "]").find("input[type=date]").each(function () {
                $(this).val("");
            });

            $(filtroID + " .conteudo-filtro [class^=" + id + "]").find("input[type=time]").each(function () {
                $(this).val("00:00");
            });
        }
        ///////////////////////////////////////

        // Monta a hierarquia dos itens da área de filtros //
        function montaDiretorio() {
            // Pega a quantidade de elementos na lista
            var qtd = $(filtroID + " .lista-b li").length;

            $(filtroID + " .lista-a li").css("marginLeft", 0);

            // Para cada elemento, adiciona uma margem de 30px a mais
            for (var i = 0; i < qtd; i++) {
                $(filtroID + " .lista-b li:eq(" + i + ")").css("marginLeft", 30 * i);
            }
        }
        /////////////////////////////////////////////////////

        // Oculta o formulário correspondente ao item arrastado para a lista-a //
        function ocultaFormulario(id) {
            $(filtroID + " .conteudo-filtro ." + id).hide();
        }
        /////////////////////////////////////////////////////////////////////////

        // Verifica se o formulário foi preenchido //
        function valida() {
            // Marca o item referente ao filtro preenchido através dos campos input, select ou textarea //
            $(filtroID + " .conteudo-filtro").find("input:text, input:password, input:file, select, textarea").keyup(function () {
                if ($(this).val() !== "") {
                    status = 1; // preenchido
                } else {
                    status = 0; // vazio
                }

                changeStatus($(this), status);
            });

            // Marca o item referente ao filtro preenchido através dos campos checkbox ou radio
            $(filtroID + " .conteudo-filtro input:radio, " + filtroID + " .conteudo-filtro input:checkbox").change(function () {
                var p = $(this).attr("data-item");

                if ($(".conteudo-filtro").find("input[data-item= " + p + "]:checked").length > 0) {
                    status = 1;
                } else {
                    status = 0;
                }

                changeStatus($(this), status);
            });

            // Marca o item referente ao filtro preenchido através dos campos date ou time
            $(filtroID + " .conteudo-filtro").find("input[type=date], input[type=time]").on("change", function () {
                if ($(this).val() !== "") {
                    status = 1;
                } else {
                    sattus = 0;
                }

                changeStatus($(this), status);
            });

            // Sinaliza o item preenchido
            function changeStatus(elemento, status) {
                elemento = $(filtroID + " .lista-b li[data-item=" + elemento.parents(filtroID + " .conteudo-filtro > div").attr("class") + "]");

                var status = status;

                if (status == 1) {
                    elemento.addClass("valido");
                    elemento.next().removeClass().addClass("ativado"); // ativa o próximo item
                    eventoClick(elemento.next());
                } else if (status == 0) {
                    elemento.removeClass("valido");
                    elemento.nextAll().removeClass().addClass("desativado"); // desativa todos os próximos itens
                }
            }
        }
        /////////////////////////////////////////////

        // Marca ou desmarca todos os itens da lista de checkbox //
        $(filtroID + " .todos").on("click", function () {
            var id = "#" + $(this).parent().parent().attr("id");

            if (this.checked) {
                $(id + " .sel").each(function () {
                    this.checked = true;
                });
            } else {
                $(id + " .sel").each(function () {
                    this.checked = false;
                });
            }
        });

        // Desmarca somente o primeiro item da lista checkbox
        $(filtroID + " .sel").on("click", function () {
            var id = "#" + $(this).parents().find("ul").attr("id");

            if ($(this).prop("checked") == false) {
                $(id + " .todos").prop("checked", false);
            }
        });
        ///////////////////////////////////////////////////////////

        // Mostra ou oculta as listas em segundo-nível //
        $(".accordion .glyphicon").on("click", function (e) {
            $(".lista-accordion").not($(this).next()).slideUp();

            $($(this).next()).slideDown();

            if ($(this).next().is(":visible")) {
                $(".glyphicon").not($(this)).removeClass("glyphicon-minus").addClass("glyphicon-plus");

                $(this).removeClass("glyphicon-plus").addClass("glyphicon-minus");
            }
        });
        /////////////////////////////////////////////////

        // Seleciona o conteúdo entre os itens do menu topo //
        $(".menu-filtro-topo li").on("click", function () {
            var d = $(this).attr("data-menu");

            $(".menu-filtro-topo li").removeClass("ativo");
            $(this).addClass("ativo");

            $(".tempo-real, .finalizados").hide();
            $("." + d).show();

            if (d == "finalizados") {
                $(".data-topo").slideDown("fast");
            } else {
                $(".data-topo").slideUp("fast");
            }
        });
        //////////////////////////////////////////////////////
    });
};