// <![CDATA[
// <!--
function ajaxVai(url_ou_form){
/******
* ajaxVai - envia uma solicitação ajax simples ou submete um formulário via ajax
* sintaxe: ajaxVai(url_ou_form[,elemento_retorno[,html_carregando]][,timeout][,callback])
* Versão: 1.0 - 28/12/2007
* Autor: Micox - www.elmicox.com - elmicox.blogspot.com
*******/
    var url,o_form,method='GET',elemento_retorno, html_carregando,callback,params='',concat,url_orig;
    var loads = ['&nbsp;&nbsp;&nbsp;','.&nbsp;&nbsp;','..&nbsp;','...'],loadpos=0,timeload;
    var timeout, timecounter=0, msg;
    var isIE = /*@cc_on!@*/false; //vendo se é o IE
    var self = this, args = $A(arguments); //transformando os argumentos em array
    
    //pegando se é url direta ou form
    if(typeof(url_ou_form)=='string'){
        if(url_ou_form.indexOf('http://')>=0){ //é url
            url = url_ou_form;
        }else{
            o_form = document.getElementsById(url_ou_form);
            if(o_form && o_form.nodeName.toLowerCase()=='form'){
                url = o_form.action;
                method = o_form.method.toUpperCase();
            }else{ //form não existe
                alert('Programador, reveja sua chamada ao ajaxVai.\r\nO form "' + url_ou_form + '" informado, não existe');
                return false;
            }
        }
    }else if(typeof(url_ou_form.nodeType)!='undefined' && url_ou_form.nodeName.toLowerCase()=='form'){ //form passado como referencia ao objeto html
        o_form = url_ou_form;
        url = o_form.action;
        method = o_form.method.toUpperCase();
    }else{
        alert('Programador, reveja sua chamada ao ajaxVai.\r\nO primeiro parâmetro url_ou_form é obrigatório');
        return false;
    }
    delete url_ou_form; //não precisamos mais dela
    
    //pegando os opcionais.
    for(var i=1; i<args.length; i++){ //começando no segundo pois o 1o já foi pegado
        
        if(args[i]==null){ continue;} //argumento vazio ou nulo, roda pro próximo
        
        if(typeof(args[i])=='function'){ //é a callback
            callback = args[i];
            
        }else if(typeof(args[i])=='number'){ //é o timeout
            timeout = args[i];
            
        }else if(typeof(args[i].nodeType) !='undefined'){ //há nodeType então é o elemento_retorno
            elemento_retorno = args[i];
            
        }else if(typeof(args[i])=='string'){ //id do elem_retorno ou o html_carregando
        
            //se ainda não existir elem_retorno, então é o próprio, se já existir então é o html_carregando
            if(!elemento_retorno){
                elemento_retorno = document.getElementById(args[i]);
                if(!elemento_retorno){
                    alert('Programador, reveja sua chamada ao ajaxVai.\r\nO elemento_retorno "' + arguments[1] + '" informado, não existe'); 
                    return false;}
            }else{
                //obs.: o html_carregando só existe se tiver elemento_retorno. caso contrário, onde seria exibido o carregando? sacou?
                html_carregando = args[i];
            }
        }
    }
    
    var ajax1 = pegaAjax(); //capturando um NOVO objeto xmlHttpRequest

    if(ajax1){
    
        if(o_form){
            params = camposForm(o_form);
        }
        
        //montando a URL
        url_orig = url;
        concat = (url.indexOf('?')>=0) ? "&" : '?'; 
        //antiga antiCacheRand. Para o problema de cache com ajax do IE
        if(isIE){ 
            var dt = new Date();
            url += concat + encodeURI(dt.getTime())
            concat = '&';}
        
        ajax1.onreadystatechange = ajaxOnReady
        
        if(method=='GET'){
            ajax1.open(method, url + concat + params ,true);
            ajax1.setRequestHeader("Content-Type", "text/html; charset=utf-8");
            params='';
        }else{ //POST
            ajax1.open(method, url ,true);
            ajax1.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            
        }        
        ajax1.setRequestHeader('X-Requested-With', 'ajax'); //dizendo ao servidor que foi pedido via ajax. Recupera-se com $_SERVER['X-Requested-With'] (no php)
        ajax1.setRequestHeader("Cache-Control", "no-cache");
        ajax1.setRequestHeader("Pragma", "no-cache");
        ajax1.send(params)
        
        //função periódica que verifica o timeout e gera animação
        timeload = setInterval(periodica,250); 
        
        return true;
        
    }else{
        return false;
    }
    
    //funções extra
    
    function ajaxOnReady(){ //executada a cada alteração no status http
    
        if(timecounter/4 > timeout){ //estourou o timeout. O abort foi feito na funcao periodica()
            
            clearInterval(timeload); //fim do contador
            msg = "Falha no carregamento. Tempo limite excedido: " + timeout + ' segs.';
            put(msg);
            window.status = '';
                        
            if(callback){ callback(msg); } //chamando a função de callback

            ajax1 = null; delete ajax1;
            delete self;
            return false;
            
        }else if (ajax1.readyState==4){ //carregamento (ou não carregamento) completo
        
            clearInterval(timeload); //fim do contador
                    
            if(ajax1.status == 200){ //com sucesso
                var texto=ajax1.responseText;
                if(texto.indexOf(" ")<0) texto=texto.replace(/\+/g," ");
                //texto=unescape(texto); //descomente esta linha se tiver usado o urlencode no php ou asp
                put(texto);
                extraiScript(texto);
                window.status = '';
                if(callback){ callback(texto); } //chamando a função de callback
                
            }else{ //com erro            
                msg = "Falha no carregamento. " + httpStatus(ajax1.status);
                if(html_carregando){                    
                    put(msg);
                }else{
                    window.status = msg;
                }
                if(callback){ callback(msg); } //chamando a função de callback
            }
            
            ajax1 = null; delete ajax1;
            delete self;
            return true;
            
        }else if(html_carregando){//para mudar o status de cada carregando
            put(html_carregando + pegaloads())
        }
    }
    function pegaloads(){
        if(loadpos>loads.length - 1){ loadpos = 0; }
        return loads[loadpos++] + ' ';
        
    }
    function put(valor){ //coloca o valor no elemento de retorno, se houver este
        if(elemento_retorno){
            if(elemento_retorno.nodeName.toLowerCase()=="input"){
                valor = escape(valor).replace(/\%0D\%0A/g,"")
                elemento_retorno.value = unescape(valor);
            }else if(elemento_retorno.nodeName.toLowerCase()=="select"){        
                select_innerHTML(elemento_retorno,valor)
            }else if(elemento_retorno.nodeName){
                elemento_retorno.innerHTML = valor;
            }   
        }
    }
    function periodica() {
        //mensagem indicando o carregamento
        if(html_carregando){
            put(html_carregando + pegaloads() )
        }else{
            window.status = 'Carregando ' + url_orig + ' ...';
        }
        
        //fazendo o contador
        timecounter++; //contador que incrementa-se a cada 1/4 de segundo
        if(timecounter/4 > timeout){ //estourou o timeout
            clearInterval(timeload); //fim do contador

            ajax1.abort(); //também dispara a ajaxOnReady
            ajax1 = null; delete ajax1;
        }

    }
    function pegaAjax(){ //instancia um novo xmlhttprequest
        //baseado na getXMLHttpObj que possui muitas cópias na net e eu nao sei quem é o autor original
        if(typeof(XMLHttpRequest)!='undefined'){return new XMLHttpRequest();}
        var axO=['Microsoft.XMLHTTP','Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
        for(var i=0;i<axO.length;i++){ try{ return new ActiveXObject(axO[i]);}catch(e){} }
        return null;
    }
    function httpStatus(stat){ //retorna o texto do erro http
        switch(stat){
            case 0: return "Erro desconhecido de javascript. " + ajax1.statusText;
            case 400: return "400: Solicitação incompreensível"; break;
            case 403: case 404: return "404: Não foi encontrada a URL solicitada"; break;
            case 405: return "405: O servidor não suporta o método solicitado"; break;
            case 500: return "500: Erro desconhecido de natureza do servidor"; break;
            case 503: return "503: Capacidade máxima do servidor alcançada"; break;
            default: return "Erro HTTP " + stat + ': ' + ajax1.statusText + ". Informações em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"; break;
        }
    }
}


function select_innerHTML(objeto,innerHTML){
/******
* select_innerHTML - corrige o bug do InnerHTML em selects no IE
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Versão: 2.1 - 04/09/2007
*******/
    objeto.innerHTML = ""
    var selTemp = document.createElement("micoxselect")
    var opt;
    selTemp.id="micoxselect1"
    document.body.appendChild(selTemp)
    selTemp = document.getElementById("micoxselect1")
    selTemp.style.display="none"
    if(innerHTML.toLowerCase().indexOf("<option")<0){//se não é option eu converto
        innerHTML = "<option>" + innerHTML + "</option>"
    }
    innerHTML = innerHTML.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span")
    selTemp.innerHTML = innerHTML
      
    
    for(var i=0;i<selTemp.childNodes.length;i++){
  var spantemp = selTemp.childNodes[i];
  
        if(spantemp.tagName){     
            opt = document.createElement("OPTION")
    
   if(document.all){ //IE
    objeto.add(opt)
   }else{
    objeto.appendChild(opt)
   }       
    
   //getting attributes
   for(var j=0; j<spantemp.attributes.length; j++){
    var attrName = spantemp.attributes[j].nodeName;
    var attrVal = spantemp.attributes[j].nodeValue;
    if(attrVal){
     try{
      opt.setAttribute(attrName,attrVal);
      opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));
     }catch(e){}
    }
   }
   //getting styles
   if(spantemp.style){
    for(var y in spantemp.style){
     try{opt.style[y] = spantemp.style[y];}catch(e){}
    }
   }
   //value and text
   opt.value = spantemp.getAttribute("value")
   opt.text = spantemp.innerHTML
   //IE
   opt.selected = spantemp.getAttribute('selected');
   opt.className = spantemp.className;
  } 
}    
document.body.removeChild(selTemp)
selTemp = null
}

function extraiScript(texto){
//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum
    var ini = 0;
    // loop enquanto achar um script
    while (ini!=-1){
        // procura uma tag de script
        ini = texto.indexOf('<script', ini);
        // se encontrar
        if (ini >=0){
            // define o inicio para depois do fechamento dessa tag
            ini = texto.indexOf('>', ini) + 1;
            // procura o final do script
            var fim = texto.indexOf("<\/script>", ini);
            // extrai apenas o script
            codigo = texto.substring(ini,fim);
            // executa o script
            /**********************
            * Alterado por Micox - www.elmicox.com
            ***********************/
            novo = document.createElement("script")
            novo.text = codigo;
            document.body.appendChild(novo);
        }
    }
}


function camposForm(fform){
/**************************************************
* Autor: José Cláudio Medeiros de Lima (pequenas alterações by Micox - 28/12/07)
* url: http://forum.ievolutionweb.com/index.php?showtopic=18264
* Versão: 1.5 - 28/12/2007
* Objetivos: Pega todos os campos de um formulário, seus valores 
      e junta tudo em um formato de querystring, 
      por exemplo: var1=valor1var2=valor2
* Parâmetros: fform - a referencia a um objeto html-form.
**************************************************/
    var buff = [];
    for (i=0; i< fform.length;i++)  {
        var campo = fform.elements[i];
        
        if((campo.type=="checkbox" || campo.type=="radio")){
            if(campo.checked==true && campo.name){ 
                buff.push(campo.name + "=" + encodeURI(campo.value));
            }
        }else if(campo.name){ //campos que não tenham name não vão.
            buff.push(campo.name + "=" + encodeURI(campo.value));
        }
    }
    return buff.join("&");
}

//transforma uma variável do tipo 'arguments' para array
function $A(object) {
    var array = [];
    for(var i = 0; i < object.length; i++)
        array[i] = object[i];
    return array;
}
// -->
// ]]>


