//Tenta criar o objeto xmlHTTP
try{
    objxmlhttp = new XMLHttpRequest();
}catch(ee){
    try{
        objxmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
        try{
            objxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }catch(E){
            objxmlhttp = false;
            alert("AJAX error. Your browser must support XMLHttpRequest object or enable use of scripting.");
        }
    }
}

//Fila de conexões
fila=[];
ifila=0;

function ajaxCarregando(id){
    //Carregando...
    document.getElementById(id).innerHTML="<font style='font-size: 6px'>"+
                                          "...</font>";
}

//Carrega via XMLHTTP a url recebida e coloca seu valor
//no objeto com o id recebido. 
function ajaxHTML(id,url,queryString){
    var ajaxMethod = "GET";

    ajaxCarregando(id);

    if(queryString != null){ajaxMethod = "POST";}

    //Adiciona à fila
    fila[fila.length]=[id,url,ajaxMethod,queryString];

    //Se não há conexões pendentes, executa
    if((ifila+1)==fila.length)ajaxRun();
}

//Executa a próxima conexão da fila
function ajaxRun(){
    var ajaxMethod = "GET";

    //Exibe carregando
    ajaxCarregando(fila[ifila][0]);

    //Abre a conexão
    objxmlhttp.open(fila[ifila][2], fila[ifila][1], true);

    //Define tipo de request para POST
    if(fila[ifila][2] == "POST") objxmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    //Função para tratamento do retorno
    objxmlhttp.onreadystatechange=ajaxManageState;
 
    //Executa
    objxmlhttp.send(fila[ifila][3]);

}

function ajaxManageState()
{
    if (objxmlhttp.readyState==4){
		if (objxmlhttp.status==200) {
			//Mostra o HTML recebido
			//retorno=unescape(objxmlhttp.responseText.replace(/\+/g," "));
			retorno=unescape(objxmlhttp.responseText);//.replace(/\+/g," ")
			ExtraiScriptAjax(retorno);
		}else{
			//Se retorno HTTP diferente de 200, exibe mensagem do HTTP
			retorno=unescape(objxmlhttp.statusText.replace(/\+/g," "));
		}
						
		document.getElementById(fila[ifila][0]).innerHTML=retorno;
			
		//Zera a variável de retorno
		retorno = "";
			
		//Roda o próximo
		ifila++;
		if(ifila<fila.length){				
			setTimeout("ajaxRun()",10);
		}else{
			// Zera a fila
			fila=[];
			ifila=0;		
			//alert("Zerou a fila");
		}
    }
}

function ajaxSubmit(id, theform) {
  
    ajaxCarregando(id);

    var serializedForm = serializeForm(theform);

    //Adiciona à fila
    fila[fila.length]=[id, theform.action, theform.method.toUpperCase(), serializedForm];

    //Se não há conexões pendentes, executa
    if((ifila+1)==fila.length)ajaxRun();

    return true;
};

/**
 * Serialize a form into a format which can be sent as a GET string or a POST 
 * content.It correctly ignores disabled fields, maintains order of the fields 
 * as in the elements[] array. The 'file' input type is not supported, as 
 * its content is not available to javascript. This method is used internally
 * by the submit class method.
 */

function serializeForm(theform) {
  var els = theform.elements;
  var len = els.length;
  var queryString = "";
  this.addField = 
    function(name,value) { 
      if (queryString.length>0) { 
        queryString += "&";
      }
      queryString += encodeURIComponent(name) + "=" + encodeURIComponent(value);
    };
  for (var i=0; i<len; i++) {
    var el = els[i];
    if (!el.disabled) {
      switch(el.type) {
        case 'text': case 'password': case 'hidden': case 'textarea': 
          this.addField(el.name,el.value);
          break;
        case 'select-one':
          if (el.selectedIndex>=0) {
            this.addField(el.name,el.options[el.selectedIndex].value);
          }
          break;
        case 'select-multiple':
          for (var j=0; j<el.options.length; j++) {
            if (el.options[j].selected) {
              this.addField(el.name,el.options[j].value);
            }
          }
          break;
        case 'checkbox': case 'radio':
          if (el.checked) {
            this.addField(el.name,el.value);
          }
          break;
      }
    }
  }
  return queryString;
};

//FUNCAO PARA PEGAR OS CODIGOS SCRIPT
function ExtraiScriptAjax(texto){
    var ini, pos_src, fim, codigo, texto_pesquisa;
    var objScript = null;
    //Joga na variavel de pesquisa o texto todo em minusculo para na hora da pesquisa nao ter problema com case-sensitive
    texto_pesquisa = texto.toLowerCase()
    // Busca a primeira tag <script
    ini = texto_pesquisa.indexOf('<script', 0)
    // Executa o loop enquanto achar um <script
    while (ini!=-1){
        //Inicia o objeto script
        var objScript = document.createElement("script");

        //Busca se tem algum src a partir do inicio do script
        pos_src = texto_pesquisa.indexOf(' src', ini)
        // Define o inicio para depois do fechamento dessa tag
        ini = texto_pesquisa.indexOf('>', ini) + 1;

        //Verifica se este e um bloco de script ou include para um arquivo de scripts
        if (pos_src < ini && pos_src >=0){//Se encontrou um "src" dentro da tag script, esta e um include de um arquivo script
            //Marca como sendo o inicio do nome do arquivo para depois do src
            ini = pos_src + 4;
            //Procura pelo ponto do nome da extencao do arquivo e marca para depois dele
            fim = texto_pesquisa.indexOf('.', ini)+4;
            //Pega o nome do arquivo
            codigo = texto.substring(ini,fim);
            //Elimina do nome do arquivo os caracteres que possam ter sido pegos por engano
            codigo = codigo.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">","");
            // Adiciona o arquivo de script ao objeto que sera adicionado ao documento
            objScript.src = codigo;
        }else{//Se nao encontrou um "src" dentro da tag script, esta e um bloco de codigo script
            // Procura o final do script
            fim = texto_pesquisa.indexOf('</script>', ini);
            // Extrai apenas o script
            codigo = texto.substring(ini,fim);
            // Adiciona o bloco de script ao objeto que sera adicionado ao documento
            objScript.text = codigo;
        }

        //Adiciona o script ao documento
        document.getElementsByTagName('head')[0].appendChild(objScript);
        // Procura a proxima tag de <script
        ini = texto.indexOf('<script', fim);

        //Limpa o objeto de script
        objScript = null;
    }
}

