/*
 * Sao Paulo, outubro de 2008
 * 
 * Descricao: Classe JS pra manipular selects de uf e municipios brasileiros
 * Uso: A classe SelectUfMunicipio tem como objetivo gerar um select com todas as ufs
 * do Brasil e selects dinamicos de municipios de acordo com a uf selecionada.
 * Ela possui dois metodos principais: substituiElementos e imprimeSelects, explicados na sequencia.
 *
 * =================================================================================================
 * substituiElementos - esse metodo pega os elementos com name="uf_sigla" e name="municipio_id"
 * e substitui por dois selects com mesmo nome. Ex:
        
        >>> var s1 = new SelectUfMunicipio()
        >>> s1.substituiElementos()
        
 * Voce pode declarar na mao o nome dos elementos a serem substituidos instanciando a classe.
 
        >>> var s1 = new SelectUfMunicipio()
		>>> s1.select_uf_name = 'representante_uf_sigla'
		>>> s1.select_municipio_name = 'representante_municipio'
        >>> s1.substituiElementos()
        
 * O metodo substituiElementos pega automaticamente o .val() do elemento que sera substituido
 * e entende que eles sao valores iniciais que determinam qual uf ou municipio devem vir selecionados.
 * Contudo, voce pode declarar esses valores na mao:
 
        >>> var s1 = new SelectUfMunicipio()
        >>> s1.uf_sigla = 'SC'
        >>> s1.substituiElementos()
        
 * Com isso o select de ufs vai vir selecionado em SC. Voce tb pode declarar o id do municipio:
 
        >>> var s1 = new SelectUfMunicipio()
        >>> s1.uf_sigla = 'SC'
        >>> s1.municipio_id = 4205407
        >>> s1.substituiElementos()
        
 * =================================================================================================
 * imprimeSelects - esse metodo simplesmente imprime em um div os dois selects, com suas respectivas 
 * tags label. Voce precisa declarar o div onde eles serao impressos. 
 * O id padrao e "select_ufs_municipios". Ex: 
 
        >>> var s1 = new SelectUfMunicipio()
        >>> s1.uf_sigla = 'SC'
        >>> s1.municipio_id = 4205407
        >>> s1.container = 'meu_div'
        >>> s1.imprimeSelects()
* =================================================================================================
* Se voce precisar aplicar alguma funcao ao evento change dos selects ou fazer qualquer coisa que
* precise acontecer depois de os selects estarem impressos na pagina, voce pode usar a funcao callback
* 

        >>> var s1 = new SelectUfMunicipio()
        >>> s1.callback = function(){
        >>>     alert('Ja estamos todos na pagina')
        >>> }
        >>> s0.substituiElementos()
*/
function SelectUfMunicipio(){
    this.select_uf_name = 'uf_sigla'
    this.select_municipio_name = 'municipio_id'
    this.uf_sigla = false
    this.municipio_id = false
    this.container = 'select_ufs_municipios'
    this.substituiElementos = function(){
        if(!this.uf_sigla)
            this.uf_sigla = $('[@name="'+this.select_uf_name+'"]').val()
        if(!this.municipio_id)
            this.municipio_id = $('[@name="'+this.select_municipio_name+'"]').val()
        $('[@name="'+this.select_uf_name+'"]').replaceWith(this.selectUfs())
        $('[@name="'+this.select_municipio_name+'"]').replaceWith(this.selectMun(this.uf_sigla, this.municipio_id))
        this.ativaUfChange()        
    }
    this.imprimeSelects = function(){
        var html = '<label for="id_'+this.select_uf_name+'">UF</label>'
        html += this.selectUfs()
        html += '<label for="id_'+this.select_municipio_name+'">Município</label>'
        html += this.selectMun(this.uf_sigla, this.municipio_id)
        $('#'+this.container).hide().html(html).show('fast')	
        this.ativaUfChange()
    }
    this.ativaUfChange = function(){
        var obj = this
        $('select#id_'+this.select_uf_name).change(function(){
            obj.alteraUf($(this).val())
        })
        this.callback()
    }
    this.selectUfs = function(){
        var ufs =['AC','AL','AM','AP','BA','CE','DF','ES','GO','MA','MG','MS','MT','PA','PB','PE','PI', 'PR','RJ','RN','RO','RR','RS','SC','SE','SP','TO']
        var str_select = "<select id='id_"+this.select_uf_name+"' name='"+this.select_uf_name+"'>\n\t\t<option value=''>Escolha uma UF...</option>"
        for(i in ufs){
            var str_sel = ''
            if(this.uf_sigla == ufs[i]) 
                str_sel = 'selected'
            str_select += '<option value="'+ufs[i]+'" '+str_sel+' >'+ufs[i]+'</option>'
        }
        return str_select += '</select>'
    }
    this.selectMun = function(uf_sigla, municipio_id){
        if(uf_sigla)
            this.monta_options_municipios(uf_sigla, municipio_id)
        str_select = "<select id='id_"+this.select_municipio_name+"'  name='"+this.select_municipio_name+"'>\n\t\t<option value=''>Município</option>"
        str_select += '</select>'
        return str_select
    }
    this.monta_options_municipios = function(uf_sigla, municipio_id){
        var for_options_municipios = this.for_options_municipios
        var select_municipio_name = this.select_municipio_name
        $.getScript("http://www.onid.org.br/media/estatico/js/brasil_ufs_json/" + uf_sigla + ".js", function(){
            $('#id_'+select_municipio_name).html(for_options_municipios(municipio_id))
        })
    }
    this.for_options_municipios = function(municipio_id){
        var str_opt = '<option value="">Escolha um município...</option>'
        for (i in json_municipios){
            str_sel = ''
            if(municipio_id == json_municipios[i].id) 
                str_sel = 'selected'
            str_opt += '<option value="'+json_municipios[i].id+'" '+str_sel+' >'+json_municipios[i].n+'</option>\n'
        }
        return str_opt
    }
    this.alteraUf = function(uf_sigla){
        $('#id_'+this.select_municipio_name).html('<option value="">Carregando...</option>')
        if(uf_sigla)
            this.monta_options_municipios(uf_sigla, false)
        else
            $('#id_'+this.select_municipio_name).html('<option value="">Escolha primeiro um estado acima...</option>')
    }
    this.callback = function(){}
}

