var BuscaImobiliaria = function(){
    /**
     * Controlador
     */
    var Controller = function(){
        /**
         * Variaveis
         */
        var labels = {
            "comboFinalidade"   :"#FinalidadeImobiliaria",
            "comboEstado"       :"#EstadoImobiliaria",
            "comboMunicipio"    :"#MunicipioImobiliaria",
            "comboBairro"       :"#BairroImobiliaria",
            "BotaoBuscar"       :"#botaoImobiliaria",
            "Formulario"        :"#frm_busca_imobiliaria",
            "nomeImobiliaria"   :"#NomeImobiliaria",
            "codigoParceiro"    :"#CodigoParceiroImobiliaria",
            "Model"             :""
        }

        /**
         * Construtor
         */
        function init(model){
            labels.Model=model;
            initFinalidade();
            setListeners();
            Model.setFinalidade(jQuery(labels.comboFinalidade).val());
            popularEstados();
        }

        function setListeners(){
            // Listener para quando enviar o formulario
            jQuery(labels.Formulario).submit(function(){
                var nome = jQuery(labels.nomeImobiliaria).val();
                if(nome.length == 0){
                   if(jQuery(labels.comboFinalidade).val()==''){
                      alert(BuscaRapidaLanguage.get("LBL_SELECIONE_FINALIDADE"));
                      return false;
                   }
                   if(jQuery(labels.comboEstado).val() == ''){
                       alert(BuscaRapidaLanguage.get("LBL_SELECIONE_ESTADO"));
                       return false;
                   }
                   if(jQuery(labels.comboMunicipio).val() == ''){
                       alert(BuscaRapidaLanguage.get("LBL_SELECIONE_MUNICIPIO"));
                       return false;
                   }
                   if(jQuery(labels.comboBairro).val() == ''){
                       alert(BuscaRapidaLanguage.get("LBL_SELECIONE_BAIRRO"));
                       return false;
                   }
                   jQuery(labels.Formulario).append("<input type='hidden' name='Idioma' value='"+BuscaRapidaLanguage.getIdiomaPadrao()+"' />");

                   // Grava o log de busca por imobiliarias
                    Log.gravaClickBotaoBuscaImobiliaria(Model.getCodigoParceiro(), function(){
                        OrigemFollowup.buscaImobiliarias();
                        jQuery(labels.Formulario).unbind().submit();
                    });

                    return false;
                } else if(nome.length > 0 && nome.length < 3){
                    alert("Digite um nome de 3 caracteres ou mais");
                    return false;
                } else {
                    // Grava o log de busca por imobiliarias
                    Log.gravaClickBotaoBuscaImobiliaria(Model.getCodigoParceiro(), function(){
                        OrigemFollowup.buscaImobiliarias();
                        jQuery(labels.Formulario).unbind().submit();
                    });
                    return false;
                }
            });

            // Listener para quando mudar a finalidade
            jQuery(labels.comboFinalidade).change(function(){
                Model.setFinalidade(jQuery(this).val());
                Model.setEstado("");
                Model.setMunicipio("");
                popularEstados();
                jQuery(labels.comboMunicipio+", "+labels.comboBairro).empty();
            });

            // Listener para quando mudar o estado
            jQuery(labels.comboEstado).change(function(){
                Model.setEstado(jQuery(this).val());
                Model.setMunicipio("");
                popularMunicipios();
                jQuery(labels.comboBairro).empty();
            });

            // Listener para quando mudar o municipio
            jQuery(labels.comboMunicipio).change(function(){
                Model.setMunicipio(jQuery(this).val());
                popularBairros();
            });
        }

        function initFinalidade(){
           var lang=BuscaRapidaLanguage;
           var finalidades=labels.Model.JSON.getFinalidades();
           var qtd=finalidades.length;

           var tem = false;
           for(var i=0;i<qtd;i++){
               if(finalidades[i] == "todos" || finalidades[i] == ""){
                    tem = true;
               }
           }           

           jQuery(labels.comboFinalidade).empty();
           if(!tem){
               jQuery(labels.comboFinalidade).append("<option value='todos'>&nbsp;</option>");
           }
           for(i=0;i<qtd;i++){
              switch (finalidades[i]){
                  case "A" :
                      jQuery(labels.comboFinalidade).append("<option value='A'>"+lang.get("LBL_ALUGUEL")+"</option>");
                      break;
                  case "C":
                      jQuery(labels.comboFinalidade).append("<option value='C'>"+lang.get("LBL_VENDA")+"</option>");
                      break;
                  case "T":
                     jQuery(labels.comboFinalidade).append("<option value='T'>"+lang.get("LBL_TEMPORADA")+"</option>");
                     break;
                  case "L":
                     jQuery(labels.comboFinalidade).append("<option value='L'>"+lang.get("LBL_LANCAMENTO")+"</option>");
                     break;
                  case "P":
                      jQuery(labels.comboFinalidade).append("<option value='P'>"+lang.get("LBL_PERMUTA")+"</option>");
                      break;
               }
           }

         }

        function popularEstados(){
            // Consulta os estados das imobiliarias
            Model.Requisicao.getEstados(function(json){
                var estados = json;
                var qtd = estados.length;
                var estado = "";
                jQuery(labels.comboEstado).empty().append("<option value=''>"+BuscaRapidaLanguage.get("LBL_CBOX_ESCOLHA")+"</option>");
                for(var i=0;i<qtd;i++){
                    estado = estados[i]['Estado'];
                    jQuery(labels.comboEstado).append("<option value='"+estado+"'>"+estado+"</option>");
                }
            });
        }

        function popularMunicipios(){
            // Consulta os municipios das imobiliarias
            Model.Requisicao.getMunicipios(function(json){
                var municipios = json;
                var qtd = municipios.length;
                var municipio = "";
                jQuery(labels.comboMunicipio).empty().append("<option value=''>"+BuscaRapidaLanguage.get("LBL_CBOX_ESCOLHA")+"</option>");
                for(var i=0;i<qtd;i++){
                    municipio = municipios[i]['Municipio'];
                    if(jQuery.trim(municipio) != '' && municipio != null){
                        jQuery(labels.comboMunicipio).append("<option value='"+municipio+"'>"+municipio+"</option>");
                    }
                }
            });
        }

        function popularBairros(){
            // Consulta os bairros das imobiliarias
            Model.Requisicao.getBairros(function(json){
                var bairros = json;
                var qtd = bairros.length;
                var bairro = "";
                jQuery(labels.comboBairro).empty().append("<option value=''>"+BuscaRapidaLanguage.get("LBL_CBOX_ESCOLHA")+"</option>");
                for(var i=0;i<qtd;i++){
                    bairro = bairros[i]['Bairro'];
                    if(jQuery.trim(bairro) != '' && bairro != null){
                        jQuery(labels.comboBairro).append("<option value='"+bairro+"'>"+bairro+"</option>");
                    }
                }
            });
        }
        
        return {
            init    : init
        }
    }();

    /**
     * Modelo
     */
    var Model = function(){
        /**
         * Variaveis da Requisicao
         */
        var labels = {
            "finalidade":"",
            "estado":"",
            "municipio":"",
            "codigoParceiro":"",
            //TODO: Fazer algo melhor que isso, precisa ser algo mais generico
            "url":Path.root()
        }

        function setFinalidade(f) { labels.finalidade = f; }
        function getFinalidade()  { return labels.finalidade; }
        function setEstado(e) { labels.estado = e; }
        function getEstado()  { return labels.estado; }
        function setMunicipio(m){ labels.municipio = m; }
        function getMunicipio() { return labels.municipio; }
        function setCodigoParceiro(c) { labels.codigoParceiro = c; }
        function getCodigoParceiro() { return labels.codigoParceiro; }

        /**
         * Objeto de Requisicao
         *
         * @package BuscaImobiliaria.Model.Requisicao
         */
        var Requisicao = function(){

            /**
             * Consulta os estados
             *
             * @package BuscaImobiliaria.Model.Requisicao
             */
            function getEstados(callback){
                jQuery.getJSON(labels.url+"/busca-imobiliaria/estados/?callback=?",
                {
                    finalidade  : getFinalidade(),
                    parceiro    : getCodigoParceiro()
                },
                function(json){
                    callback(json);
                });
            }

            function getMunicipios(callback){
                jQuery.getJSON(labels.url+"/busca-imobiliaria/municipios/?callback=?",
                {
                    finalidade  : getFinalidade(),
                    estado      : getEstado(),
                    parceiro    : getCodigoParceiro()
                },
                function(json){
                    callback(json);
                });
            }

            function getBairros(callback){
                jQuery.getJSON(labels.url+"/busca-imobiliaria/bairros/?callback=?",
                {
                    finalidade  : getFinalidade(),
                    estado      : getEstado(),
                    municipio   : getMunicipio(),
                    parceiro    : getCodigoParceiro()
                },
                function(json){
                    callback(json);
                });
            }

            return {
                getEstados      : getEstados,
                getMunicipios   : getMunicipios,
                getBairros      : getBairros
            }
        }();

        return {
            Requisicao      : Requisicao,
            setFinalidade   : setFinalidade,
            setEstado       : setEstado,
            setMunicipio    : setMunicipio,
            setCodigoParceiro   : setCodigoParceiro,
            getCodigoParceiro   : getCodigoParceiro
        }
    }();

    return {
        init            : Controller.init,
        setFinalidade   : Model.setFinalidade,
        setEstado       : Model.setEstado,
        setMunicipio    : Model.setMunicipio,
        setCodigoParceiro   : Model.setCodigoParceiro
    }
}();
