function atualizaCombo(caminho, combo_origem, combo_destino, mensagem_vazio,
		adiciona_campo_branco) {
	valor_filtro = $(combo_origem).getValue();
	if (valor_filtro) {
		new Ajax.Request(caminho, {
					onLoading : function(request, json) {
						Element.show('indicator');
					},
					onSuccess : function(transport) {
						if (transport.responseJSON != undefined) {
							json = transport.responseJSON;
						} else {
							json = eval(transport.responseText);
						}
						preencheCombo(combo_destino, transport.responseJSON,
								adiciona_campo_branco);
						Element.hide('indicator');
					},
					onFailure : function(transport, json) {
						Element.hide('indicator');
						erroAjax(transport.status);
					},
					parameters : 'filtro=' + valor_filtro
				});
	} else {
		limpaCombo(combo_destino, mensagem_vazio);
	}
}

function updateCombo(caminho, combo_origem, combo_destino, mensagem_vazio, adiciona_campo_branco) {
  valor_filtro = $(combo_origem).getValue();
  if (valor_filtro) {
    new Ajax.Request(caminho, {
          onLoading : function(request, json) {
            Element.show('indicator');
          },
          onSuccess : function(transport) {
            if (transport.responseJSON != undefined) {
              json = transport.responseJSON;
            } else {
              json = eval(transport.responseText);
            }
            preencheCombo(combo_destino, transport.responseJSON,
                adiciona_campo_branco);
            Element.hide('indicator');
          },
          onFailure : function(transport, json) {
            Element.hide('indicator');
            erroAjax(transport.status);
          },
          parameters : 'filter=' + valor_filtro
        });
  } else {
    limpaCombo(combo_destino, mensagem_vazio);
  }
}

function erroAjax(status) {
	if (status == 401) {
	} else if (status == 404) {
		alert('Erro de Ajax. Página não encontrada.');
	} else {
	}
}

function limpaCombo(destino, mensagem_vazio) {
  var el = $(destino);
  if(el){
    while(el.firstChild) {
      el.removeChild(el.firstChild);
    }

    var opt = new Element('option', {value:''})
    opt.innerHTML = mensagem_vazio;
    el.appendChild(opt);
  }
}

function resetCombo(destino, valor){
  $(destino).options.length = 1;
  $(destino).options[0] = new Option(valor);
}

function preencheCombo(destino, json, adiciona_vazio) {
  d = $(destino);
  limpaCombo(destino, '');
  if (adiciona_vazio) {
    d.options[0] = new Option(' - Selecione - ', '', false, false);
  }
  for (a = 0; a < json.chaves.length; a++) {
    if (adiciona_vazio) {
      i = a + 1;
    } else {
      i = a;
    }
    d.options[i] = new Option(json.descricoes[a], json.chaves[a], false,
      false);
  }
}

/**
 * Alteração do método updateCombo que permite o envio de mais de um parâmetro,
 *  além do filter para realizar uma requisição.
 */
function atualizaValoresCombo(caminho, combo_origem, combo_destino, mensagem_vazio, adiciona_campo_branco, parametros) {
  
  valor_filtro = $(combo_origem).getValue();
  
  if(parametros){
    valor_filtro = valor_filtro + '&' + parametros
  }
  
  if (valor_filtro) {
    new Ajax.Request(caminho, {
          onLoading : function(request, json) {
            Element.show('indicator');
          },
          onSuccess : function(transport) {
            if (transport.responseJSON != undefined) {
              json = transport.responseJSON;
            } else {
              json = eval(transport.responseText);
            }
            preencheCombo(combo_destino, transport.responseJSON,
                adiciona_campo_branco);
            Element.hide('indicator');
          },
          onFailure : function(transport, json) {
            Element.hide('indicator');
            erroAjax(transport.status);
          },
          parameters : 'filter=' + valor_filtro
        });
  } else {
    limpaCombo(combo_destino, mensagem_vazio);
  }
}
