rw.df = (function ($, rw) {
    // Retorna a classe CSS que uma linha numa tabela deve ter de acordo com o
    // tipo daquele registro (título, analítica etc).
    function classeCss(registro) {
        switch (String(registro.tipo)) {
            case "T": return "wkf4titulo"
            case "A": return "wkf4analitica"
            case "G": return "wkf4grupo"
            case "S": return "wkf4subanalitica"
        }
    }

    // Retorna uma função que monta os dados (o parâmetro 'data') de uma
    // requisição ajax feita através do jQuery ($.ajax) para uma tabela
    // específica.
    function montaDados(idTabela, idOrdenacao) {
        return function () {
            return {
                inicio: idTabela ? rw.tabelas.linhas(idTabela) : "undefined",
                final: idTabela ? rw.tabelas.linhas(idTabela) + rw.TAMANHO_BUSCA() : "undefined",
                ordem: idOrdenacao ? $(idOrdenacao).val() : "undefined"
            }
        }
    }

    // Executa a função de callback passando como parâmetro as datas que
    // delimitam o período da base.
    function periodoContabil(callback) {
        var cb = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
                return
            }

            callback(data.resposta.propriedades.periodoInicial, data.resposta.propriedades.periodoFinal)
        }

        $.ajax(
            "../api/df/propriedades.asp", {
                async: true,
                success: cb
            }
        )
    }

    function periodoContabilInicial(callback) {
        var cb = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
                return
            }

            callback(data.resposta.propriedades.periodoInicial)
        }

        $.ajax(
            "../api/df/propriedades.asp", {
                async: true,
                success: cb
            }
        )
    }

    function periodoContabilFinal(callback) {
        var cb = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
                return
            }

            callback(data.resposta.propriedades.periodoFinal)
        }

        $.ajax(
            "../api/df/propriedades.asp", {
                async: true,
                success: cb
            }
        )
    }

    // Executa a função de callback passando como parâmetro true se a base em
    // questão usa código próprio e false senão.
    function usaCodigoProprio(callback) {
        var cb = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
                return
            }

            callback(data.resposta.propriedades.codigoProprio)
        }

        $.ajax("../api/df/propriedades.asp", {
            async: true,
            success: cb
        })
    }

    return {
        classeCss: classeCss,
        montaDados: montaDados,
        periodoContabil: periodoContabil,
        periodoContabilInicial: periodoContabilInicial,
        periodoContabilFinal: periodoContabilFinal,
        usaCodigoProprio: usaCodigoProprio
    }
} ($, rw))

rw.df.usuarios = (function ($, rw) {
    //carrega o select de usuários setando como selecionado o usuário logado na sessão.
    function carregaSelect(idSelect) {
        var callback = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
                return
            }

            var options = ""
            $.map(data.resposta.registros, function (registro) {
                var sApelido = registro.apelido
                var sUsuario = data.resposta.usuarioLogado

                if (sApelido.toLowerCase() == sUsuario.toLowerCase())
                    options += '<option selected value="' + registro.posicao + '">' + sApelido + '</option>'
                else
                    options += '<option value="' + registro.posicao + '">' + sApelido + '</option>'
            })

            $(idSelect).html(options)
        }

        $.ajax("../api/df/lista-usuarios.asp", {
            success: callback,
            async: false
        })
    }

    return {
        carregaSelect: carregaSelect
    }
} ($, rw))

rw.df.estados = (function ($, rw) {
    function carregaSelect(idSelect) {
        return function (registro) {
            var select = document.getElementById(idSelect.replace('#', ''))
            var option = document.createElement("option")
            option.text = registro.uf
            select.add(option, null)
            select.selectedIndex = -1
        }
    }

    function montaDados(insereTodas) {
        return function () {
            return {
                insereTodas: insereTodas
            }
        }
    }

    return {
        carregaSelect: carregaSelect,
        montaDados: montaDados
    }
} ($, rw))

rw.df.servicos = (function ($, rw) {
    function insereF4(idInput, idTabela, idInputQtdeHoras) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.innerHTML = registro.unidade

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao

            $(row).click(
                function () {
                    if (registro.unidade == "") {
                        rw.msg.alerta("Serviço inválido.")
                    } else {
                        if (idInputQtdeHoras)
                            $(idInputQtdeHoras).next().val(registro.unidade)

                        $(idInput).val(registro.codigo).blur()
                        $(idInput).parent().children(".nome").val(registro.nome)
                        $(".wkblack, #wkf4").fadeOut(rw.FADE())
                    }
                }
            )

            $(row).fadeIn(rw.FADE())
        }
    }

    function montaDados(idTabela, idOrdenacao, idTabPrecos) {
        return function () {
            return {
                inicio: idTabela ? rw.tabelas.linhas(idTabela) : "undefined",
                final: idTabela ? rw.tabelas.linhas(idTabela) + rw.TAMANHO_BUSCA() : "undefined",
                ordem: idOrdenacao ? $(idOrdenacao).val() : "undefined",
                tabPrecos: idTabPrecos ? $(idTabPrecos).val() : "undefined"
            }
        }
    }    

    return {
        insereF4: insereF4,
        montaDados: montaDados
    }
} ($, rw))

rw.df.opsComerciais = (function ($, rw) {
    function insereF4(idInput, idTabela, idInputQtdeHoras) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            $(row).click(
                function () {
                    $(idInput).val(registro.codigo).blur()
                    $(idInput).parent().children(".nome").val(registro.nome)
                    $(".wkblack, #wkf4").fadeOut(rw.FADE())
                }
            )

            $(row).fadeIn(rw.FADE())
        }
    }

    return {
        insereF4: insereF4
    }
} ($, rw))

//CFRT
rw.df.clientes = (function ($, rw) {
    function adiciona() {
        var callback = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
            } else {
                rw.msg.alerta(data.resposta.descricao)
                window.location.reload()
            }
        }

        $.ajax("../api/df/cadastro-clientes.asp", {
            data: {
                codigo: $("#codigo").val(),
                nome: $("#nome").val(),
                classificacao: $("#classificacao").val(),
                cpfCnpj: $("#cnpjCpf").val(),
                inscricao: $("#inscricao").val(),
                codmunicipio: $("#municipio").val(),
                rua: $("#endereco").val(),
                numero: $("#numero").val(),
                complemento: $("#complemento").val(),
                bairro: $("#bairro").val(),
                cep: $("#cep").val(),
                telefone: $("#telefone").val(),
                eMail: $("#eMail").val(),
                tipoPessoa: $("#tipoPessoa").val()
            },
            async: true,
            success: callback
        })
    }

    function sugereProximaClassificacao() {
        var proximaClassificacao = "0"

        var callback = function (data) {
            if (data.resposta.status == "ERRO")
                rw.msg.erro(data)

            proximaClassificacao = data.resposta.proximaClassificacao
            $("#classificacao").val(proximaClassificacao)
            rw.habilitaCampo("#classificacao", false)
        }

        $.ajax("../api/df/con-sugestaoClassificacao.asp", {
            data: {
                tipo: "C"
            },
            assync: false,
            success: callback
        })


    }
    return {
        adiciona: adiciona,
        sugereProximaClassificacao: sugereProximaClassificacao
    }
} ($, rw))

rw.df.fornecedores = (function ($, rw) {
    function adiciona() {
        var callback = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
            } else {
                rw.msg.alerta(data.resposta.descricao)
                window.location.reload()
            }
        }

        $.ajax("../api/df/cadastro-fornecedores.asp", {
            data: {
                codigo: $("#codigo").val(),
                nome: $("#nome").val(),
                classificacao: $("#classificacao").val(),
                cpfCnpj: $("#cnpjCpf").val(),
                inscricao: $("#inscricao").val(),
                codmunicipio: $("#municipio").val(),
                rua: $("#endereco").val(),
                numero: $("#numero").val(),
                complemento: $("#complemento").val(),
                bairro: $("#bairro").val(),
                cep: $("#cep").val(),
                telefone: $("#telefone").val(),
                eMail: $("#eMail").val(),
                tipoPessoa: $("#tipoPessoa").val()
            },
            async: true,
            success: callback
        })
    }

    function sugereProximaClassificacao() {
        var proximaClassificacao = "0"

        var callback = function (data) {
            if (data.resposta.status == "ERRO")
                rw.msg.erro(data)

            proximaClassificacao = data.resposta.proximaClassificacao
            $("#classificacao").val(proximaClassificacao)
            rw.habilitaCampo("#classificacao", false)
        }

        $.ajax("../api/df/con-sugestaoClassificacao.asp", {
            data: {
                tipo: "F"
            },
            assync: false,
            success: callback
        })


    }
    return {
        adiciona: adiciona,
        sugereProximaClassificacao: sugereProximaClassificacao
    }
} ($, rw))

rw.df.representantes = (function ($, rw) {

} ($, rw))

rw.df.transportadoras = (function ($, rw) {
    function insereF4(idInput, idTabela, idInputQtdeHoras) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao

            cell = row.insertCell(-1)
            cell.innerHTML = registro.inscricao

            cell = row.insertCell(-1)
            cell.innerHTML = registro.tipo

            $(row).click(
                function () {
                    $(idInput).val(registro.codigo).blur()
                    $(idInput).parent().children(".nome").val(registro.nome)
                    $(".wkblack, #wkf4").fadeOut(rw.FADE())
                }
            )

            $(row).fadeIn(rw.FADE())
        }
    }

    return {
        insereF4: insereF4
    }
} ($, rw))
//CFRT - FIM

rw.df.cfops = (function ($, rw) {
    function insereF4(idInput, idTabela, idInputQtdeHoras) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            $(row).click(
                function () {
                    $(idInput).val(registro.codigo).blur()
                    $(idInput).parent().children(".nome").val(registro.nome)
                    $(".wkblack, #wkf4").fadeOut(rw.FADE())
                }
            )

            $(row).fadeIn(rw.FADE())
        }
    }

    function montaDados(idOrdenacao, idInputFilial, idInputCliente) {
        return function () {
            return {
                ordem: idOrdenacao ? $(idOrdenacao).val() : undefined,
                filial: $(idInputFilial).val(),
                cliente: $(idInputCliente).val()
            }
        }
    }

    return {
        insereF4: insereF4,
        montaDados: montaDados
    }
} ($, rw))

rw.df.produtos = (function ($, rw) {
    function insereF4(idInput, idTabela, index, idDiv) {
        return function (registro) {
            var nomeDesc = index > 0 ? registro.descricao : registro.nome
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = nomeDesc

            if (index == 0) { //não é grade
                cell = row.insertCell(-1)
                cell.innerHTML = registro.unidade

                cell = row.insertCell(-1)
                cell.className = "wkvalor"
                cell.innerHTML = registro.preco

                cell = row.insertCell(-1)
                cell.innerHTML = registro.classificacao
            }

            $(row).click(
                function () {
                    $(idInput).val(registro.codigo).blur()
                    $(".wkblack, #wkf4").hide()
                }
            )

            $(row).fadeIn(rw.FADE())
        }
    }

    function insere(idTabela) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.innerHTML = registro.unidade

            cell = row.insertCell(-1)
            cell.className = "wkvalor"
            cell.innerHTML = registro.preco

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao
            $(row).fadeIn(rw.FADE())
        }
    }

    function montaDados(idTabela, idOrdenacao, idTabPrecos, idCampo, index) {
        return function () {
            return {
                inicio: rw.tabelas.linhas(idTabela),
                final: rw.tabelas.linhas(idTabela) + rw.TAMANHO_BUSCA(),
                ordem: $(idOrdenacao).val(),
                tipo: index == 0 ? 'produto' : 'g' + String(index),
                codigo: $(idCampo).val(),
                codTabela: $(idTabPrecos).val()
            }
        }
    }

    return {
        insere: insere,
        insereF4: insereF4,
        insere: insere,
        montaDados: montaDados
    }
} ($, rw))

rw.df.tabPrecos = (function ($, rw) {
    function insereF4(idInput, idTabela) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.className = "wkdata"
            cell.innerHTML = registro.validade

            $(row).click(rw.consultasF4.descricao(registro, idInput))
            $(row).fadeIn(rw.FADE())
        }
    }

    return {
        insereF4: insereF4
    }
} ($, rw))

rw.df.filiais = (function ($, rw) {
    function inserePadrao(idTabela, callbackAtiva) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            callbackAtiva(row, registro)
            $(row).fadeIn(rw.FADE())
        }
    }

    function insere(idTabela) {
        return inserePadrao(idTabela,
            function (row, registro) {
                var cell = row.insertCell(-1)
                cell.className = registro.ativa == "Ativa" ? "wkativo" : "wkinativo"
                cell.innerHTML = registro.ativa
            }
        )
    }

    function insereF4(idInput, idTabela) {
        return function (registro) {
            if (registro.ativa.toLowerCase() == "ativa") {
                var row = rw.tabelas.insereLinha(idTabela)
                $(row).hide()

                var cell = row.insertCell(-1)
                cell.innerHTML = registro.codigo

                cell = row.insertCell(-1)
                cell.innerHTML = registro.nome

                $(row).click(rw.consultasF4.descricao(registro, idInput))
                $(row).fadeIn(rw.FADE())
            }
        }
    }

    function insereAtivaDesativa(idTabela) {
        return inserePadrao(
            idTabela,
            function (row, registro) {
                var cell = row.insertCell(-1)
                cell.innerHTML = registro.ativa
                cell = row.insertCell(-1)

                if (registro.ativa.toLowerCase() == "ativa")
                    cell.innerHTML = "<div class='wkbotoes'><button id='btnFilial" + registro.codigo + "' onclick='rw.df.filiais.ativaDesativa(\"" + registro.codigo + "\"); pagina.recarrega()'>Desativar</button></div>"
                else
                    cell.innerHTML = "<div class='wkbotoes'><button id='btnFilial" + registro.codigo + "' onclick='rw.df.filiais.ativaDesativa(\"" + registro.codigo + "\"); pagina.recarrega()'>Ativar</button></div>"
            }
        )
    }

    function ativaDesativa(codigo) {
        var callback = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
                return
            }
        }

        $.ajax("../api/df/ativadesativa-filiais.asp", {
            data: { codigo: codigo },
            async: false,
            success: callback
        })
    }

    return {
        insere: insere,
        insereAtivaDesativa: insereAtivaDesativa,
        insereF4: insereF4,
        inserePadrao: inserePadrao,
        ativaDesativa: ativaDesativa
    }
} ($, rw))

rw.df.historicos = (function ($, rw) {
    function inserePadrao(idTabela, onClick) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            row.className = rw.df.classeCss(registro)

            $(row).hide()
            if (onClick)
                $(row).click(onClick(registro))

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao

            $(row).fadeIn(rw.FADE())
        }
    }

    function descricaoHistorico(url, idInput) {
        return function () {
            var callback = function (data) {
                if (data.resposta.status == "ERRO") {
                    rw.msg.erro(data)
                    $(idInput).parent().children(".nome").val("")
                    $(idInput).focus()
                    return
                }

                $(idInput).parent().children(".nome").val(data.resposta.conta.nome)
            }

            var input = $(idInput)

            if (input.val() != "") {
                $.ajax(url, {
                    data: { codigo: input.val() },
                    async: true,
                    success: callback
                })
            }
        }
    }

    function insere(idTabela) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)

            $(idTabela + " tr:last").hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo;

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome;

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao;

            $(idTabela + " tr:last").fadeIn(rw.FADE())
        }
    }

    function insereF4(idInput, idTabela) {
        return inserePadrao(idTabela, function (registro) {
            return function () {
                $(idInput).val(registro.codigo).blur()
                $(".wkblack, #wkf4").fadeOut(rw.FADE())
            }
        })
    }

    return {
        insere: insere,
        insereF4: insereF4,
        descricaoHistorico: descricaoHistorico
    }
} ($, rw))

rw.df.municipios = (function ($, rw) {
    function insere(idTabela) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            $(row).fadeIn(rw.FADE())
        }
    }

    function insereF4(idInput, idTabela) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            $(row).hide()

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            $(row).click(
                function () {
                    $(idInput).val(registro.codigo).blur()
                    $(idInput).parent().children(".nome").val(registro.nome)
                    $(".wkblack, #wkf4").fadeOut(rw.FADE())
                }
            )

            $(row).fadeIn(rw.FADE())
        }
    }

    function montaDados(idTabela, idOrdenacao, idSelect) {
        return function () {
            return {
                inicio: idTabela ? rw.tabelas.linhas(idTabela) : "undefined",
                final: idTabela ? rw.tabelas.linhas(idTabela) + rw.TAMANHO_BUSCA() : "undefined",
                ordem: idOrdenacao ? $(idOrdenacao).val() : "undefined",
                uf: $(idSelect).val()
            }
        }
    }

    return {
        insere: insere,
        insereF4: insereF4,
        montaDados: montaDados
    }
} ($, rw))

rw.df.planosContabeis = (function ($, rw) {
    function inserePadrao(idTabela, onClick, idInput) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            row.className = rw.df.classeCss(registro)

            $(row).hide()

            if (onClick)
                $(row).click(onClick(registro, idInput))

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao

            cell = row.insertCell(-1)
            cell.innerHTML = registro.tipo

            $(row).fadeIn(rw.FADE())
        }
    }


    function insere(idTabela) {
        return inserePadrao(idTabela, null)
    }

    function insereF4(idInput, idTabela) {
        return inserePadrao(idTabela, rw.consultasF4.descricao, idInput)
    }

    function adiciona() {
        var callback = function (data) {
            if (data.resposta.status == "ERRO") {
                rw.msg.erro(data)
            } else {
                rw.msg.alerta(data.resposta.descricao)
                window.location.reload()
            }
        }

        $.ajax("../api/df/cadastro-planocontascontabil.asp", {
            data: {
                codigo: $("#codigo").val(),
                nome: $("#nome").val(),
                classificacao: $("#classificacao").val()
            },
            async: true,
            success: callback
        })
    }

    return {
        adiciona: adiciona,
        insere: insere,
        insereF4: insereF4
    }
} ($, rw))

rw.df.planosGerenciais = (function ($, rw) {
    function inserePadrao(idTabela, onClick, idInput) {
        return function (registro) {
            var row = rw.tabelas.insereLinha(idTabela)
            row.className = rw.df.classeCss(registro)

            $(row).hide()

            if (onClick)
                $(row).click(onClick(registro, idInput))

            var cell = row.insertCell(-1)
            cell.innerHTML = registro.codigo

            cell = row.insertCell(-1)
            cell.innerHTML = registro.nome

            cell = row.insertCell(-1)
            cell.innerHTML = registro.classificacao

            cell = row.insertCell(-1)
            cell.innerHTML = registro.tipo

            $(row).fadeIn(rw.FADE())
        }
    }

    function insereF4(idInput, idTabela) {
        return inserePadrao(idTabela, rw.consultasF4.descricao, idInput)
    }

    
    return {insereF4: insereF4}
} ($, rw))