var BuscaRapida = function(){
    /**
     * Configuracoes
     */
    var Config = function(){
        // variaveis
        var labels = {
            "interno":false,
            "codigoParceiro":""
        }
        /**
         * Define se o funcionamento eh interno ou externo
         */
        function setInterno(bool){ labels.interno = bool; }
        function setCodigoParceiro(codigo){ labels.codigoParceiro = codigo; }
        function getCodigoParceiro(){ return labels.codigoParceiro; }
        function isInterno(){ return labels.interno; }

        return {
            setInterno          : setInterno,
            isInterno           : isInterno,
            getCodigoParceiro   : getCodigoParceiro,
            setCodigoParceiro   : setCodigoParceiro
        }
    }();

    /**
     * Controller
     */
    var Controller = function(){
        // Variaveis
        var labels = {
            "html": {
                "formulario"        :"#buscarapida, #FrmRefinar",
                "cboxFinalidade"    :"#Finalidade",
                "cboxEstado"        :"#Estado",
                "cboxMunicipio"     :"#Municipio",
                "cboxBairro"        :"#Bairro",
                "cboxTipoImovel"    :"#Tipo_Imovel",
                "selectMinQuartos"  :"#MinDorms",
                "selectMaxQuartos"  :"#MaxDorms",
                "inputMenorValor"   :"#brapida input[name=Menor_Valor]",
                "inputMaiorValor"   :"#brapida input[name=Maior_Valor]",
                "inputMenorArea"    :"#brapida input[name=Menor_Area]",
                "inputMaiorArea"    :"#brapida input[name=Maior_Area]",
                "selectGaragem"     :"#brapida select[name=Vagas_Garagem]",
                "botaoConsultar"    :"#botao,#txt_detalhar",
                "botaoConsultarMapa":"#botaoConsultarMapa",
                "botaoMeuHistorico" :"a.historico",
                "botaoBuscaAvancada":"a.avancada"
            },
            "callback"  : function(){},
            "options"   : {
                comboFinalidade:{ primeiraOption  : function(){} },
                comboEstado:    { primeiraOption  : function(){}, valorFixo : "" },
                comboMunicipio: { primeiraOption  : function(){}, valorFixo : "" },
                comboBairro:    { primeiraOption  : function(){}, tipo : "supercaixa" },
                comboTipoImovel:{ primeiraOption  : function(){}, tipo : "superselect" }
            }
        }

        /**
         * Construtor Principal
         */
        function init(idioma, callback, options){
            // Verifica se existem as options
            if(options != undefined){
                // Verifica se passou alguma option para a combo de Finalidade
                if(options["comboFinalidade"] != undefined){
                    if(options["comboFinalidade"]["primeiraOption"] != undefined){
                        labels["options"]["comboFinalidade"]["primeiraOption"] = options["comboFinalidade"]["primeiraOption"];
                    }
                }
                // Verifica se passou alguma option para a combo de Estado
                if(options["comboEstado"] != undefined){
                    if(options["comboEstado"]["valorFixo"] != undefined){ 
                        labels["options"]["comboEstado"]["valorFixo"] = options["comboEstado"]["valorFixo"];
                    }
                    if(options["comboEstado"]["primeiraOption"] != undefined){
                        labels["options"]["comboEstado"]["primeiraOption"] = options["comboEstado"]["primeiraOption"];
                    }
                }
                // Verifica se passou alguma option para a combo de municipio
                if(options["comboMunicipio"] != undefined){
                    if(options["comboMunicipio"]["valorFixo"] != undefined){
                        labels["options"]["comboMunicipio"]["valorFixo"] = options["comboMunicipio"]["valorFixo"];
                    }
                    if(options["comboMunicipio"]["primeiraOption"] != undefined){
                        labels["options"]["comboMunicipio"]["primeiraOption"] = options["comboMunicipio"]["primeiraOption"];
                    }
                }
                // Verifica se passou alguma option para a combo de bairros
                if(options["comboBairro"] != undefined){
                    if(options["comboBairro"]["tipo"] != undefined){
                        labels["options"]["comboBairro"]["tipo"] = options["comboBairro"]["tipo"];
                        ComboBairro.setTipoExibicao(options["comboBairro"]["tipo"]);
                    }
                    if(options["comboBairro"]["primeiraOption"] != undefined){
                        labels["options"]["comboBairro"]["primeiraOption"] = options["comboBairro"]["primeiraOption"];
                    }
                }
                // Verifica se passou alguma option para a combo de tipo de imovel
                if(options["comboTipoImovel"] != undefined){
                    if(options["comboTipoImovel"]["tipo"] != undefined){
                        labels["options"]["comboTipoImovel"]["tipo"] = options["comboTipoImovel"]["tipo"];
                        ComboTipoImovel.setTipoExibicao(options["comboTipoImovel"]["tipo"]);
                    }
                    if(options["comboTipoImovel"]["primeiraOption"] != undefined){
                        labels["options"]["comboTipoImovel"]["primeiraOption"] = options["comboTipoImovel"]["primeiraOption"];
                    }
                }
            }
            
            // Verifica se existe algum callback
            if(callback != undefined){
                labels.callback = callback;
            }
            if(Config.getCodigoParceiro() == ""){
                alert("Código do parceiro não foi definido");
                return false;
            }
            if(idioma != undefined && idioma != ""){
                if(BuscaRapidaLanguage.setIdiomaPadrao(idioma) == false){
                    return false;
                }
            }
            BuscaRapidaLanguage.init();

            // Reseta tudo
            ComboTipoImovel.reset();
            ComboMunicipio.reset();
            ComboBairro.reset();            

             // Carrega as informacoes do banco de dados
            Model.JSON.init(function(){
                // Inicia a combobox Estado
                ComboFinalidade.init();
                if(labels.callback != undefined){
                    labels.callback(Model, Controller);
                }
            });
            
            // Inicializa o formulario
            Formulario.init();
            return true;
        }

        /**
         * Define os valores iniciais que os inputs podem ter
         * 
         */
        function defineValores(params, callback){
            var finalidade      = params['finalidade'];
            var tipo            = params['tipo'];
            var estado          = params['estado'];
            var municipio       = params['municipio'];
            var bairro          = params['bairro'];

            if(params['menorQuartos'] != undefined && params['menorQuartos'] != ""){
                jQuery(labels.html.selectMinQuartos).find("option[value="+params['menorQuartos']+"]").attr("selected", true);
            }
            if(params['maiorQuartos'] != undefined && params['maiorQuartos'] != ""){
                jQuery(labels.html.selectMaxQuartos).find("option[value="+params['maiorQuartos']+"]").attr("selected", true);
            }
            if(params['menorArea'] != undefined){
                jQuery(labels.html.inputMenorArea).val(params['menorArea']);
            }
            if(params['maiorArea'] != undefined){
                jQuery(labels.html.inputMaiorArea).val(params['maiorArea']);
            }
            if(params['menorValor'] != undefined){
                jQuery(labels.html.inputMenorValor).val(params['menorValor']);
            }
            if(params['maiorValor'] != undefined){
                jQuery(labels.html.inputMaiorValor).val(params['maiorValor']);
            }
            if(params['garagem'] != undefined && params['garagem'] != ""){
                jQuery(labels.html.selectGaragem).find("option[value="+params['garagem']+"]").attr("selected", true);
            }

            // Marca a finalidade e define no objeto
            if(finalidade != undefined){
                labels["options"]["comboFinalidade"]["valor"] = finalidade;

                // Define os listeners
                ComboEstado.setListeners();
                ComboMunicipio.setListeners();

                jQuery(labels.html.cboxFinalidade).find("option[value="+finalidade[0]+"]").attr("selected", "selected");
                Model.JSON.setFinalidades(finalidade);
                
                // Manda popular os estados pois a finalidade já foi selecionada
                ComboEstado.reset();
                ComboEstado.popular();

                // Reseta a combo de Estados
                if(estado != undefined){
                    Model.JSON.setEstados(estado);
                    jQuery(labels.html.cboxEstado).find("option[value="+estado[0]+"]").attr("selected", "selected");
                    
                    // Inicializa os municipios pois os estados estão selecionados
                    ComboMunicipio.reset();
                    ComboMunicipio.popular();
                    
                    // Reseta a combo municipio, popula e preenche os itens
                    if(municipio != undefined){                        
                        Model.JSON.setMunicipios(municipio);
                        jQuery(labels.html.cboxMunicipio).find("option[value="+municipio[0]+"]").attr("selected", "selected");

                        // Reseta a combo de bairros, popula e preenche os itens
                        if(bairro != undefined){
                            ComboBairro.reset();
                            ComboBairro.popular();
                            Model.JSON.setBairros(bairro);
                            SuperCaixa.marcarItens(labels.html.cboxBairro, bairro);
                        }

                        // Reseta a combo de tipos, popula e preenche os itens
                        if(tipo != undefined){
                            ComboTipoImovel.reset();
                            ComboTipoImovel.popular();
                            Model.JSON.setTiposImovel(tipo);
                            SuperCaixa.marcarItens(labels.html.cboxTipoImovel, tipo);
                        }
                        if(callback != undefined){
                            callback();
                        }
                    } else {
                        if(callback != undefined){
                            callback();
                        }
                    }
                } else {
                    if(callback != undefined){
                        callback();
                    }
                }
            }
        }                
        
        function debug(){
            var obj = {
                "finalidade":jQuery(labels.html.cboxFinalidade).val(),
                "estado":jQuery(labels.html.cboxEstado).val(),
                "municipio":jQuery(labels.html.cboxMunicipio).val(),
                "bairros":SuperCaixa.getItensMarcados(labels.html.cboxBairro),
                "tipos":SuperCaixa.getItensMarcados(labels.html.cboxTipoImovel),
                "codigoParceiro":Config.getCodigoParceiro(),
                "menorQuartos":jQuery(labels.html.selectMinQuartos).val(),
                "maiorQuartos":jQuery(labels.html.selectMaxQuartos).val(),
                "menorValor":jQuery(labels.html.inputMenorValor).val(),
                "maiorValor":jQuery(labels.html.inputMaiorValor).val(),
                "menorArea":jQuery(labels.html.inputMenorArea).val(),
                "maiorArea":jQuery(labels.html.inputMaiorArea).val(),
                "garagem":jQuery(labels.html.selectGaragem).val()
            };
            console.log(obj);
        }

        /**
         * Classe responsável pelo formulario de busca rápida
         */
        var Formulario = function(){
            /**
             * Construtor
             */
            function init(){
                setListeners();
            }

            /**
             * Define os listeners
             */
            function setListeners(){
                
                // Define os listeners no botao de historico
                var url = jQuery(labels.html.botaoMeuHistorico).attr("href");
                jQuery(labels.html.botaoMeuHistorico).attr("href","javascript:");
                jQuery(labels.html.botaoMeuHistorico).click(function(){
                    OrigemFollowup.historicoImoveis();
                    Log.gravaClickBotaoMeuHistorico(Config.getCodigoParceiro(), function(){
                       window.location.href = url;
                    });
                });

                // Define os listeners no botao de historico
                var url2 = jQuery(labels.html.botaoBuscaAvancada).attr("href");
                jQuery(labels.html.botaoBuscaAvancada).attr("href","javascript:");
                jQuery(labels.html.botaoBuscaAvancada).click(function(){
                    OrigemFollowup.buscaAvancada();
                    Log.gravaClickBotaoBuscaAvancada(Config.getCodigoParceiro(), function(){
                       window.location.href = url2;
                    });
                });
                

                // Define os listeners nos botoes "Pesquisar" e "Visualizar Mapa"
                jQuery(labels.html.botaoConsultar+", "+labels.html.botaoConsultarMapa).click(function(){
                    var busca_referencia=jQuery(this).attr('busca_ref');
                    if(busca_referencia != undefined){
                        var par=jQuery("form:contains('"+this+"')");
                        par.submit();
                        return true;
                    }
                    
                    var finalidade = jQuery(labels.html.cboxFinalidade).val();
                    if(finalidade == "" ){
                        alert(BuscaRapidaLanguage.get("LBL_SELECIONE_FINALIDADE"));
                        return false;
                    } else {
                        var estado = jQuery(labels.html.cboxEstado).val();
                        if(estado == ""){
                            if(labels["options"]["comboEstado"]["valorFixo"] != ""){
                                estado = labels["options"]["comboEstado"]["valorFixo"];
                                jQuery(labels.html.cboxEstado).val(estado);
                            }
                        }
                        if(estado == "" ){
                            alert(BuscaRapidaLanguage.get("LBL_SELECIONE_ESTADO"));
                            return false;
                        } else {                            
                            var municipio = jQuery(labels.html.cboxMunicipio).val();
                            if(municipio == ""){
                                if(labels["options"]["comboMunicipio"]["valorFixo"] != ""){
                                    municipio = labels["options"]["comboMunicipio"]["valorFixo"];
                                    jQuery(labels.html.cboxMunicipio).val(municipio);
                                }
                            }
                            if(municipio == "" ){
                                alert(BuscaRapidaLanguage.get("LBL_SELECIONE_MUNICIPIO"));
                                return false;
                            } else {
                                var bairros = SuperCaixa.getItensMarcados(labels.html.cboxBairro);
                                var qtdBairros = bairros.length;
                                var tipos = SuperCaixa.getItensMarcados(labels.html.cboxTipoImovel);
                                var qtdTipos = tipos.length;
                                // Adiciona os tipos
                                for(var i=0;i<qtdTipos;i++){
                                    jQuery(labels.html.formulario).append("<input type='hidden' name='Tipo_Imovel[]' value='"+tipos[i].value+"' />");
                                }

                                // Adiciona os bairros
                                for(i=0;i<qtdBairros;i++){
                                    jQuery(labels.html.formulario).append("<input type='hidden' name='Bairros[]' value='"+bairros[i].key+"' />");
                                }
                                // Adiciona o input com o arquivo de lingua utilizado
                                jQuery(labels.html.formulario).append("<input type='hidden' name='lang' value='"+BuscaRapidaLanguage.getIdiomaPadrao()+"'/>");
                                jQuery(labels.html.formulario).append("<input type='hidden' name='Codigo_Parceiro' value='"+Config.getCodigoParceiro()+"'/>");

                                // Este nolog foi adicionado para nao logar no Refinar tb
                                if(jQuery(this).attr("log") != "false"){
                                    /**
                                     * Grava os parametros utilizados para um posterior autopreenchimento
                                     */
                                    Model.LogBusca.salvarDados({
                                        'finalidade'    : finalidade,
                                        'estado'        : estado,
                                        'municipio'     : municipio,
                                        'bairro'        : bairros,
                                        'tipo'          : tipos,
                                        "menorQuartos"  : jQuery(labels.html.selectMinQuartos).val(),
                                        "maiorQuartos"  : jQuery(labels.html.selectMaxQuartos).val(),
                                        "menorValor"    : jQuery(labels.html.inputMenorValor).val(),
                                        "maiorValor"    : jQuery(labels.html.inputMaiorValor).val(),
                                        "menorArea"     : jQuery(labels.html.inputMenorArea).val(),
                                        "maiorArea"     : jQuery(labels.html.inputMaiorArea).val(),
                                        "garagem"       : jQuery(labels.html.selectGaragem).val()
                                    });

                                    if(jQuery("#FrmRefinar").length == 1){
                                        OrigemFollowup.buscaAvancada();
                                    } else {
                                        OrigemFollowup.buscaRapida();
                                    }
                                    
                                    if(jQuery(this).attr("id") == "botaoConsultarMapa"){
                                        jQuery(labels.html.formulario).append("<input type='hidden' name='ver_mapa' value='S' />");
                                        Log.gravaClickMapa(Config.getCodigoParceiro(), function(){
                                            jQuery(labels.html.formulario).submit();
                                        });
                                    } else {                                        
                                        Log.gravaClickBuscaRapida(Config.getCodigoParceiro(), function(){
                                            jQuery(labels.html.formulario).submit();
                                        });
                                    }
                                } else {
                                    
                                    if(jQuery("#FrmRefinar").length == 1){
                                        OrigemFollowup.buscaAvancada();
                                    } else {
                                        OrigemFollowup.buscaRapida();
                                    }
                                    
                                    jQuery(labels.html.formulario).submit();
                                }
                                return true;
                            }
                        }
                    }
                });
            }

            return {
                init    : init
            }
        }();
        
        /**
         * Objeto simbolizando a Combobox Finalidade
         *
         * @public
         * @static
         * @package BuscaRapida.Controller.ComboFinalidade
         */
        var ComboFinalidade = function(){
            /**
             * Inicializa a combobox
             *
             * @public
             * @package BuscaRapida.Controller.ComboFinalidade
             */
            function init(){
                Model.JSON.setEstados([]);
                Model.JSON.setMunicipios([]);
                initFinalidades();
                aplicarListeners();
                ComboEstado.reset();                
                ComboTipoImovel.init();
            }

            /**
             * Aplica o plugin na combo finalidade
             *
             * @private
             * @package BuscaRapida.Controller.ComboFinalidade
             */
            function aplicarListeners(){
                jQuery(labels.html.cboxFinalidade).change(function(){
                    if(jQuery(this).val() != ""){
                        Model.JSON.setFinalidades([jQuery(this).val()]);
                        ComboEstado.init();
                        //ComboMunicipio.reset();
                        ComboMunicipio.init();
                        ComboBairro.reset();
                    } else {
                        ComboEstado.reset();
                    }
                });
            }

            /**
             * Consulta todas as finalidades de um cliente e popula a combobox
             *
             * @private
             * @package BuscaRapida.Controller.ComboFinalidade
             */
            function initFinalidades(){
                var lang = BuscaRapidaLanguage;
                limpar();

                var finalidades = Model.JSON.getFinalidades();
                var qtd = finalidades.length;
                for(var i=0;i<qtd;i++){
                    switch(finalidades[i]){
                        case "A": addOption("A", lang.get("LBL_ALUGUEL"));      break;
                        case "C": addOption("C", lang.get("LBL_VENDA"));        break;
                        case "T": addOption("T", lang.get("LBL_TEMPORADA"));    break;
                        case "L": addOption("L", lang.get("LBL_LANCAMENTO"));   break;
                        case "P": addOption("P", lang.get("LBL_PERMUTA"));      break;
                    }
                }
            }
            /**
             * Limpa a combo de Finalidade e define a primeira option
             *
             * @private
             * @package BuscaRapida.Controller.ComboFinalidade
             */
            function limpar(){
                jQuery(labels.html.cboxFinalidade).empty();
                var option = "<option value=''>"+BuscaRapidaLanguage.get("LBL_CBOX_ESCOLHA")+"</option>";
                if(labels["options"]["comboFinalidade"]["primeiraOption"] != ""){
                    var resp = labels["options"]["comboFinalidade"]["primeiraOption"]();                    
                    option = (resp != "" && resp != undefined) ? resp : option;
                }
                jQuery(labels.html.cboxFinalidade).append(option);
            }

            /**
             * Adiciona um item na combo
             *
             * @public
             * @package BuscaRapida.Controller.RadioFinalidade
             */
            function addOption(key, value){
                jQuery(labels.html.cboxFinalidade).append("<option value='"+key+"'>"+value+"</option>");
            }

            return {
                init        : init,
                addOption   : addOption
            }
        }();

        /**
         * Objeto simbolizando a Combobox Estado
         *
         * @public
         * @static
         * @package BuscaRapida.Controller.ComboEstado
         */
        var ComboEstado = function(){
            /**
             * Inicializa a combobox
             */
            function init(){
                ComboMunicipio.reset();
                reset();
                popularEstados();
                setListeners();
            }
            /**
             * Define a aÃ§Ã£o a ser tomada quando escolher um estado
             * na combobox
             *
             * @private
             * @package BuscaRapida.Controller.ComboEstado
             */
            function setListeners(){
                jQuery(labels.html.cboxEstado).change(function(){
                    if(jQuery.trim(jQuery(this).val()) != ""){
                        Model.JSON.setEstados([jQuery(this).val()]);
                        ComboMunicipio.init();
                    }
                });
            }

            /**
             * Popula os estados na combobox
             *
             * @private
             * @package BuscaRapida.Controller.ComboEstado
             */
            function popularEstados(){
                var estados = Model.JSON.getEstados();
                estados.sort();
                var size = estados.length;
                var valorFixo=labels["options"]["comboEstado"]["valorFixo"];
                var select="";
                for(var i=0;i<size;i++){
                    select="";
                    if(jQuery.trim(estados[i]) != ""){
                        if (estados[i]==valorFixo){
                            select=" selected ";
                            Model.JSON.setEstados([estados[i]]);
                        }
                        jQuery(labels.html.cboxEstado).append("<option value='"+estados[i]+"' "+select+">"+estados[i]+"</option>");
                    }
                }
            }

            /**
             * Reseta a combobox de Estado
             */
            function reset(){
                var option = "<option value=''>"+BuscaRapidaLanguage.get("LBL_CBOX_ESCOLHA")+"</option>";
                if(labels["options"]["comboEstado"]["primeiraOption"] != ""){
                    var resp = labels["options"]["comboEstado"]["primeiraOption"]();
                    option = (resp != "" && resp != undefined) ? resp : option;
                }
                jQuery(labels.html.cboxEstado).empty().append(option);
                Model.JSON.setEstados([]);
                ComboMunicipio.reset();
            }

            return {
                init            : init,
                popular         : popularEstados,
                setListeners    : setListeners,
                reset           : reset
            }
        }();

        /**
         * Objeto simbolizando a Combobox Municipio
         *
         * @public
         * @static
         * @package BuscaRapida.Controller.Municipio
         */
        var ComboMunicipio = function(){
            /**
             * Inicializa a combobox
             */
            function init(){
                ComboBairro.reset();
                reset();
                popularMunicipios();                
                setListeners();
            }
            /**
             * Define as aÃ§Ãµes a serem tomadas quando escolher um municipio
             * na combobox
             *
             * @private
             * @package BuscaRapida.Controller.Municipio
             */
            function setListeners(){
                jQuery(labels.html.cboxMunicipio).change(function(){                    
                    if(jQuery(this).val() != ""){
                        Model.JSON.setMunicipios([jQuery(this).val()]);
                        ComboBairro.init();
                        ComboTipoImovel.init();
                    }
                });
            }

            /**
             * Popula os municipios na combobox de Municipios
             *
             * @private
             * @package BuscaRapida.Controller.Municipio
             */
            function popularMunicipios(){
                var municipios = Model.JSON.getMunicipios();
                municipios.sort();
                var size = municipios.length;
                var valorFixo=labels["options"]["comboMunicipio"]["valorFixo"];
                var select="";
                for(var i=0;i<size;i++){
                    select="";
                    if(jQuery.trim(municipios[i]) != ""){
                        if (municipios[i]==valorFixo){
                            Model.JSON.setMunicipios([municipios[i]]);
                            select=" selected ";
                        }
                        jQuery(labels.html.cboxMunicipio).append("<option value='"+municipios[i]+"' "+select+">"+municipios[i]+"</option>");
                    }
                }
            }

            /**
             * Adiciona um item na combo
             *
             * @public
             * @package BuscaRapida.Controller.ComboMunicipio
             */
            function addOption(key, value){
                jQuery(labels.html.cboxMunicipio).append("<option value='"+key+"'>"+value+"</option>");
            }

            /**
             * Reseta as informaÃ§Ãµes da combobox de Estado
             *
             * @private
             * @package BuscaRapida.Controller.ComboMunicipio
             */
            function reset(){
                var option = "<option value=''>"+BuscaRapidaLanguage.get("LBL_CBOX_ESCOLHA")+"</option>";
                if(labels["options"]["comboMunicipio"]["primeiraOption"] != ""){
                    var resp = labels["options"]["comboMunicipio"]["primeiraOption"]();
                    option = (resp != "" && resp != undefined) ? resp : option;
                }
                jQuery(labels.html.cboxMunicipio).empty().append(option);
                Model.JSON.setMunicipios([]);
            }

            return {
                init            : init,
                popular         : popularMunicipios,
                setListeners    : setListeners,
                reset           : reset
            }
        }();


        /**
         * Objeto simbolizando a Combobox Bairro
         *
         * @public
         * @static
         * @package BuscaRapida.Controller.Bairro
         */
        var ComboBairro = function(){
            var tipoExibicao = "supercaixa"; // superselect
            /**
             * Construtor
             */
            function init(){
                reset();
                popularBairros();
            }
            
            /**
             * Define o tipo da Caixa a ser utilizada
             */
            function setTipoExibicao(tipo){
                tipoExibicao = tipo;
            }

            function popularBairros(){
                var bairros = Model.JSON.getBairros();
                bairros.sort();
                var size = bairros.length;
                var arr = [];
                for(var i=0;i<size;i++){
                    if(bairros[i] != ""){
                        if(isNaN(parseInt(bairros[i]))){
                            arr.push([bairros[i],bairros[i]]);
                        }
                    }
                }
                SuperCaixa.addItens(labels.html.cboxBairro, arr);
            }
            
            /**
             * Reseta a combobox de bairros
             *
             * @private
             * @package BuscaRapida.Controller.Bairro
             */
            function reset(){
                var titulo = BuscaRapidaLanguage.get("LBL_ESCOLHA_OS_BAIRROS");
                if(labels["options"]["comboBairro"]["primeiraOption"] != ""){
                    var resp = labels["options"]["comboBairro"]["primeiraOption"]();
                    titulo = (resp != "" && resp != undefined) ? resp : titulo;
                }
                SuperCaixa.init({
                    tipoExibicao        : tipoExibicao, // ou supercaixa
                    seletor             : labels.html.cboxBairro,
                    titulo              : titulo,//"Escolha o(s) bairro(s)",
                    nenhumSelecionado   : titulo,
                    consultar           : BuscaRapidaLanguage.get("LBL_CONSULTAR"),
                    fechar              : "<img src='"+Path.getMainRoot()+"/imagens/layout/icon_sair.png' title='"+BuscaRapidaLanguage.get("LBL_FECHAR")+"' alt='"+BuscaRapidaLanguage.get("LBL_FECHAR")+"'/>",
                    onOpen              : function(){
                        if(jQuery(labels.html.cboxMunicipio).val() == ""){
                            alert(BuscaRapidaLanguage.get("LBL_SELECIONE_MUNICIPIO"));
                            return false;
                        } else {
                            return true;
                        }
                    },
                    onClickItem         : function(obj){
                        var opt = SuperCaixa.getItensMarcados(labels.html.cboxBairro);
                        var arr = [];
                        var qtd = opt.length;

                        for(var i=0;i<qtd;i++){
                            if(opt[i]["key"] != ""){
                                arr.push(opt[i]["key"]);
                            }
                        }
                        Model.JSON.setBairros(arr);
                        ComboTipoImovel.init();
                    }
                });
                SuperCaixa.limpar(labels.html.cboxBairro);
                ComboTipoImovel.reset();
                Model.JSON.setBairros([]);
            }

            return {
                init            : init,
                popular         : popularBairros,
                setTipoExibicao : setTipoExibicao,
                reset           : reset
            }
        }();

        /**
         *
         * @public
         * @package BuscaRapida.Controller.ComboTipoImovel
         */
        var ComboTipoImovel = function(){
            var tipoExibicao = "supercaixa"; // superselect
            /**
             * Construtor
             */
            function init(){                
                reset();
                popularTipos();
            }

            /**
             * Define o tipo da Caixa a ser utilizada
             *
             * @private
             * @package BuscaRapida.Controller.ComboTipoImovel
             */
            function setTipoExibicao(tipo){
                tipoExibicao = tipo;
            }

            /**
             * Popula os tipos de imoveis na combobox
             *
             * @private
             * @package BuscaRapida.Controller.ComboTipoImovel
             */
            function popularTipos(){
                var tipos = Model.JSON.getTiposImovel();
                tipos.sort();
                var size = tipos.length;
                var arr = [];
                for(var i=0;i<size;i++){
                    // Tenta converter o tipo de imÃ³vel em inteiro, e pergunta se deu errado.
                    // Se deu errado, entÃ£o adiciona ele na lista pois ele Ã© um texto normal
                    if(isNaN(parseInt(tipos[i]))){
                        arr.push([tipos[i], BuscaRapidaLanguage.get(tipos[i])]);
                    }
                }
                SuperCaixa.addItens(labels.html.cboxTipoImovel, arr);
            }

            /**
             * Reseta a combobox de Tipo de Imovel
             *
             * @private
             * @package BuscaRapida.Controller.ComboTipoImovel
             */
            function reset(){
                var titulo = BuscaRapidaLanguage.get("LBL_ESCOLHA_OS_TIPOS");
                if(labels["options"]["comboTipoImovel"]["primeiraOption"]){
                    var resp = labels["options"]["comboTipoImovel"]["primeiraOption"]();
                    titulo = (resp != "" && resp != undefined) ? resp : titulo;
                }
                SuperCaixa.init({
                    tipoExibicao        : tipoExibicao, // ou supercaixa
                    seletor             : labels.html.cboxTipoImovel,
                    titulo              : titulo,
                    nenhumSelecionado   : titulo,
                    consultar           : BuscaRapidaLanguage.get("LBL_CONSULTAR"),
                    fechar              : "<img src='"+Path.getMainRoot()+"/imagens/layout/icon_sair.png' title='"+BuscaRapidaLanguage.get("LBL_FECHAR")+"' alt='"+BuscaRapidaLanguage.get("LBL_FECHAR")+"'/>",
                    onOpen: function(){
                        if(SuperCaixa.getItens(labels.html.cboxTipoImovel).length == 0){
                            return true;
                            //alert(BuscaRapidaLanguage.get("LBL_SELECIONE_FINALIDADE"));
                            //return false;
                        } else {
                            return true;
                        }
                    },
                    onClickItem : function(obj){
                        var opt = SuperCaixa.getItensMarcados(labels.html.cboxTipoImovel);
                        var arr = [];
                        var qtd = opt.length;

                        for(var i=0;i<qtd;i++){
                            arr.push(opt[i]["value"]);
                        }
                        Model.JSON.setTiposImovel(arr);
                    }
                });
                SuperCaixa.limpar(labels.html.cboxTipoImovel);
                Model.JSON.setTiposImovel([]);
            }
            
            return {
                init            : init,
                popular         : popularTipos,
                setTipoExibicao : setTipoExibicao,
                reset           : reset
            }
        }();        

        return {
            init            : init,
            debug           : debug,
            defineValores   : defineValores,
            ComboFinalidade : ComboFinalidade
        }
    }();

    /**
     * Model
     */
    var Model = function(){
        /**
         * Classe utilizada para gravar a consulta realizada pelo
         * usuario na busca rapida para que na proxima vez que ele
         * buscar, os campos sejam preenchidos automaticamente
         */
        var LogBusca = function(){
            /**
             * Salva as informaÃ§Ãµes da busca rapida no cookie
             */
            function salvarDados(dados){
                jQuery.cookie("log_busca", dadosToString(dados), {path:"/"});
            }

            function dadosToString(dados){
                var bairros = [];
                for(var i=0;i<dados['bairro'].length;i++){
                    bairros.push(dados['bairro'][i]['value']);
                }
                var tipos = [];
                for(i=0;i<dados['tipo'].length;i++){
                    tipos.push(dados['tipo'][i]['value']);
                }

                var str = "{"+
                    "\"finalidade\":[\""+dados['finalidade']+"\"],"+
                    "\"estado\":[\""+dados['estado']+"\"],"+
                    "\"municipio\":[\""+dados['municipio']+"\"],"+
                    "\"bairro\":[\""+bairros.toString().replace(/[,]/g,"\",\"")+"\"],"+
                    "\"tipo\":[\""+tipos.toString().replace(/[,]/g,"\",\"")+"\"],"+
                    "\"menorQuartos\":[\""+dados["menorQuartos"]+"\"],"+
                    "\"maiorQuartos\":[\""+dados["maiorQuartos"]+"\"],"+
                    "\"menorValor\":[\""+dados["menorValor"]+"\"],"+
                    "\"maiorValor\":[\""+dados["maiorValor"]+"\"],"+
                    "\"menorArea\":[\""+dados["menorArea"]+"\"],"+
                    "\"maiorArea\":[\""+dados["maiorArea"]+"\"],"+
                    "\"garagem\":[\""+dados["garagem"]+"\"]"+
                "}";
                return str;
            }

            /**
             * Retorna os dados salvos pela busca
             */
            function getDados(){
                return jQuery.cookie("log_busca");
            }

            /**
             * Define as funÃ§Ãµes que podem ser acessadas
             */
            return {
                salvarDados : salvarDados,
                getDados    : getDados
            }
        }();

        /**
         * Objeto que funciona como um ENUM
         */
        var TipoFiltro = {
            "FINALIDADE"    :"FINALIDADE",
            "ESTADO"        :"ESTADO",
            "MUNICIPIO"     :"MUNICIPIO",
            "BAIRRO"        :"BAIRRO",
            "TIPO_IMOVEL"   :"TIPO_IMOVEL"
        };

        /**
         * Objeto utilizado para guardar os valores dos possiveis
         * filtros a serem criados
         */
        var Filtro = function(){
            var labels = {
                "tipo":"",
                "valor":""
            }

            function setTipo(tipo){labels.tipo = tipo;}
            function getTipo(){return labels.tipo;}
            function setValor(valor){labels.valor = valor;}
            function getValor() {return labels.valor;}

            return {
                setTipo     : setTipo,
                getTipo     : getTipo,
                setValor    : setValor,
                getValor    : getValor
            }
        }

        /**
         * Classe que faz a manipulaÃ§Ã£o do JSON recebido da busca rapida
         * e realiza filtros a partir de objetos do tipo "Filtro" adicionados
         */
        var JSON = function(){
            var labels = {
                "json":"",
                "filtros":[]
            }

            /**
             * Construtor
             *
             * @public
             * @package BuscaRapida.Model.JSON
             */
            function init(callback){
                Requisicao.getInformacoesBusca(function(json){
                    labels.json = json;                    

                    if(callback != undefined){
                        callback();
                    }
                });
            }

            function addFiltro(filtro){
                var size = labels.filtros.length;
                for(var i=0;i<size;i++){
                    if(labels.filtros[i].getTipo() == filtro.getTipo()){
                        labels.filtros[i] = filtro
                        return true;
                    }
                }
                labels.filtros.push(filtro);
                return true;
            }

            function addFiltros(tipoFiltro, valores){
                switch(tipoFiltro){
                    case TipoFiltro.FINALIDADE:
                        setFinalidades(valores);
                        break;
                    case TipoFiltro.ESTADO:
                        setEstados(valores);
                        break;
                    case TipoFiltro.MUNICIPIO:
                        setMunicipios(valores);
                        break;
                    case TipoFiltro.TIPO_IMOVEL:
                        setImoveis(valores);
                        break;
                    case TipoFiltro.BAIRRO:
                        setBairros(valores);
                        break;
                }
            }

            function getFiltros(){
                return labels.filtros;
            }

            function resetFiltros(){
                labels.filtros = [];
            }

            function filtrar(lista, filtro){
                var arr = [];
                var size = lista.length;                
                var valor = filtro.getValor();
                var qtd = valor.length;
                var tipo = filtro.getTipo();                
                for(var i=0;i<size;i++){                    
                    if(valor instanceof Array){                        
                        for(var k=0;k<qtd;k++){
                            switch(tipo){
                                case TipoFiltro.FINALIDADE:
                                    if(valor[k] == lista[i][0]){
                                        arr.push(lista[i]);
                                    }
                                    break;
                                case TipoFiltro.ESTADO:
                                    if(valor[k] == lista[i][1]){
                                        arr.push(lista[i]);
                                    }
                                    break;
                                case TipoFiltro.MUNICIPIO:
                                    if(valor[k] == lista[i][2]){
                                        arr.push(lista[i]);
                                    }
                                    break;
                                case TipoFiltro.TIPO_IMOVEL:
                                    if(valor[k] == lista[i][3]){
                                        arr.push(lista[i]);
                                    }
                                    break;
                                case TipoFiltro.BAIRRO:
                                    if(valor[k] == lista[i][4]){                                        
                                        arr.push(lista[i]);
                                    }
                                    break;
                            }
                        }
                    }
                }
                return arr;
            }

            function filtrarTudo(){
                var qtdFiltros = labels.filtros.length;
                var aux = "";
                if(qtdFiltros > 0){
                    for(var i=0;i<qtdFiltros;i++){
                        if(aux == ""){
                            aux = labels.json;                            
                        }
                        var e = (labels.filtros[i].getValor().length > 0) ? filtrar(aux, labels.filtros[i]) : aux;
                        aux = e;
                    }
                } else {
                    aux = labels.json;
                }
                return eval(aux);
            }

            function getInfo(position){
                var arr = eval(filtrarTudo());
                var size = arr.length;
                
                var informacoes = []
                for(var i=0;i<size;i++){
                    var qtdInformacoes = informacoes.length;
                    var temInformacao = false;
                    for(var j=0;j<qtdInformacoes;j++){
                        if(arr[i][position] == informacoes[j]){
                            temInformacao = true;
                        }
                    }
                    if(!temInformacao){
                        informacoes.push(arr[i][position]);
                    }
                }
                return informacoes;
            }

            function setFinalidades(finalidades){
                var FiltroFinalidade = new Filtro();
                FiltroFinalidade.setTipo(TipoFiltro.FINALIDADE);
                FiltroFinalidade.setValor(finalidades);
                addFiltro(FiltroFinalidade);
            }

            function getFinalidades(){
                return getInfo(0);
            }

            function setEstados(estados){
                var FiltroEstado = new Filtro();
                FiltroEstado.setTipo(TipoFiltro.ESTADO);                
                FiltroEstado.setValor(estados);
                addFiltro(FiltroEstado);
            }

            function getEstados(){
                return getInfo(1);
            }

            function setMunicipios(municipios){
                var FiltroMunicipio = new Filtro();
                FiltroMunicipio.setTipo(TipoFiltro.MUNICIPIO);
                FiltroMunicipio.setValor(municipios);
                addFiltro(FiltroMunicipio);
            }

            function getMunicipios(){
                return getInfo(2);
            }

            function setTiposImovel(tipos){
                var FiltroTipo = new Filtro();
                FiltroTipo.setTipo(TipoFiltro.TIPO_IMOVEL);
                FiltroTipo.setValor(tipos);
                addFiltro(FiltroTipo);
            }

            function getTiposImovel(){
                return getInfo(3);
            }

            function setBairros(bairros){
                var FiltroBairro = new Filtro();
                FiltroBairro.setTipo(TipoFiltro.BAIRRO);
                FiltroBairro.setValor(bairros);
                addFiltro(FiltroBairro);
            }
            function getBairros(){
                return getInfo(4);
            }

            function getValores(TipoFiltro){
                switch(TipoFiltro){
                    case TipoFiltro.BAIRRO:
                        return getBairros();
                        break;
                    case TipoFiltro.MUNICIPIO:
                        return getMunicipios();
                        break;
                    case TipoFiltro.ESTADO:
                        return getEstados();
                        break;
                    case TipoFiltro.TIPO_IMOVEL:
                        return getTiposImovel();
                        break;
                    case TipoFiltro.FINALIDADE:
                        return getFinalidades();
                        break;
                }
            }

            return {
                init            : init,
                addFiltro       : addFiltro,
                addFiltros      : addFiltros,
                getFiltros      : getFiltros,
                resetFiltros    : resetFiltros,
                setFinalidades  : setFinalidades,
                getFinalidades  : getFinalidades,
                setEstados      : setEstados,
                getEstados      : getEstados,
                setMunicipios   : setMunicipios,
                getMunicipios   : getMunicipios,
                setBairros      : setBairros,
                getBairros      : getBairros,
                setTiposImovel  : setTiposImovel,
                getTiposImovel  : getTiposImovel,
                getValores      : getValores
            }
        }();        

        /**
         * Modulo que contem as requisicoes ajax
         */
        var Requisicao = function(){
            /**
             * Consulta todas informacoes necessarias para utilizar a busca rapida
             */
            function getInformacoesBusca(callback){ 
                var solicitacao =Path.root()+"/busca-rapida/?parceiro="+Config.getCodigoParceiro()+"&callback=?";
                jQuery.getJSON(solicitacao, function(json){
                    callback(/*jQuery.evalJSON(*/json/*)*/);
                });
            }

            return {
                getInformacoesBusca : getInformacoesBusca
            }
        }();       

        return {
            LogBusca    : LogBusca,
            TipoFiltro  : TipoFiltro,
            Filtro      : Filtro,
            JSON        : JSON
        }
    }();

    return {
        init                : Controller.init,
        debug               : Controller.debug,
        setIdiomaPadrao     : BuscaRapidaLanguage.setIdiomaPadrao,
        valoresIniciais     : Controller.defineValores,
        addTraducao         : BuscaRapidaLanguage.addTraducao,
        setInterno          : Config.setInterno,
        setCodigoParceiro   : Config.setCodigoParceiro,
        setEstados          : Model.JSON.setEstados,
        getLogBusca         : Model.LogBusca.getDados
    }
}();

 
