
try{
  xmlhttp=new XMLHttpRequest()
}catch(e){
  try{
    xmlhttp=new ActiveXObject("MSXML2.XMLHTTP")
  }catch(E){
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
  }
}

ajax_fila=[]
ajax_retornoHTML=[]
ajax_msgHTML="<span class='loading'>Aguarde, carregando...</span>"
ajax_retornoJSON=[]

encode=encodeURIComponent

function buildQuery(dados){
  if(typeof dados=="string")return dados
  var retorno=""
  if(dados.innerHTML){
    var el=dados.elements
    for(var i=0;i<el.length;i++)
      if(el[i].name!="")
        retorno+=encode(el[i].name)+"="+encode(el[i].value)+"&"
  }else{
    for(i in dados)
      retorno+=encode(i)+"="+encode(dados[i])+"&"
  }
  return retorno
}

function doRequest(url,fn,dados){
  ajax_fila.push([url,fn,dados])
  if(ajax_fila.length==1)execRequest()
}

function execRequest(){
  url=ajax_fila[0][0]
  dados=ajax_fila[0][2]
  if(typeof dados=="undefined"){
    method="GET"
    dados=null
  }else{
    method="POST"
    dados=buildQuery(dados)
  }
  xmlhttp.open(method,url,true)
  xmlhttp.setRequestHeader("Cache-Control","no-cache, must-revalidate")
  xmlhttp.setRequestHeader("Pragma","no-cache")

  if(method=="POST"){
    xmlhttp.setRequestHeader("Content-Type",
                             "application/x-www-form-urlencoded")
  }
  xmlhttp.onreadystatechange=ret_doRequest
  xmlhttp.send(dados)
}

function ret_doRequest(){
  if(xmlhttp.readyState==4){
    ajax_fila.shift()[1](xmlhttp.responseText)
    if(ajax_fila.length>0)execRequest()
  }
}

function doHTML(url,obj,dados){
  obj.innerHTML=ajax_msgHTML
  ajax_retornoHTML.push(obj)
  doRequest(url,ret_doHTML,dados)
}

function ret_doHTML(t){
  ajax_retornoHTML.shift().innerHTML=t
}

function doJSON(url,fn,dados){
  ajax_retornoJSON.push(fn)
  doRequest(url,ret_doJSON,dados)
}

function ret_doJSON(t){
  ajax_retornoJSON.shift()(eval("["+t+"]")[0])
}


