// Variaveis globais
var obj;
var id;
var funcao;
var dados;
fila  = [];
ifila = 0;
var timing;
var loading = "";

<!--------------------------------------------------------------------------------------->
// Funcoes do xmlhttprequest
<!--------------------------------------------------------------------------------------->

// Cria o objeto de requisicao
function CreateObjXMLHttpRequest()
{
    obj = null;

    // Procura por um objeto nativo W3C (Mozilla/Safari/Konqueror/Opera)
    if (window.XMLHttpRequest) {

        obj      = new XMLHttpRequest(); // Cria o objeto nativo
        obj_type = "XMLHttpRequest";

    }
    // Senao procura por uma versao ActiveX (IE)
    else if (window.ActiveXObject) {

        // Array com tipos de objeto ActiveX
        var msxmls = new Array('Msxml2.XMLHTTP.5.0',
                               'Msxml2.XMLHTTP.4.0',
                               'Msxml2.XMLHTTP.3.0',
                               'Msxml2.XMLHTTP',
                               'Microsoft.XMLHTTP');

        // Percorre array com versoes do ActiveX e tenta criar o objeto
        for (var i = 0; i < msxmls.length; i++) {
            try {
                obj      = new ActiveXObject(msxmls[i]); // Tenta criar o objeto nativo
                obj_type = msxmls[i];
                break;
            } catch(e) {
                obj = false;
            }
        }
    }
    // Nenhum objeto suportado pelo browser
    else {
        obj = false;
    }

    return obj;
}


// Indica como tratar a execucao ao mudar o status da requisicao
function GetContent()
{
    // Verifica se objeto ainda existe
    if (obj) {
        // Se requisicao terminada (readyState = 4)
        if (obj.readyState == 4) {
            // Se status retornado "ok" (status = 200)
            if (obj.status == 200) {
                eval(funcao+'();'); // Chama funcao respectiva
            } // Se status diferente de "ok"
            else {
                alert('Erro! "'+ obj.statusText +'" (erro '+ obj.status +')'); //Exibe mensagem com o erro
            }

            // Proxima requisicao da fila
            ifila++;
            if (ifila < fila.length) {
                setTimeout("SendRequest()",20);
            }
        }
    } else {
        return false;
    }
}

function Requisition(var_id, arquivo, var_funcao, dados, loading)
{
    id     = var_id;
    funcao = var_funcao;

    if (loading != null) {
        document.getElementById(loading).innerHTML = "<span class=\"loading\">carregando...</span>";
    }

    // Encadeia variaveis enviadas pela requisicao
    if (dados) {
        var mensagem = '';
        for (var i = 0; i < dados.length; i++) {
            if(i > 0) {
                mensagem += '&';
            }
            mensagem += 'dado'+i+'='+escape(dados[i]);
        }
    } else {
        mensagem = null;
    }

    // Adiciona a fila
    fila[fila.length] = [id, arquivo, funcao, mensagem];

    // Se fila sem conexoes pendentes, executa
    if ((ifila + 1) == fila.length) {
        SendRequest();
    }
}

function SendRequest()
{
    id       = fila[ifila][0];
    arquivo  = fila[ifila][1];
    funcao   = fila[ifila][2];
    mensagem = fila[ifila][3];

    obj = CreateObjXMLHttpRequest(); // Cria uma instancia do objeto
    obj.onreadystatechange = GetContent; // Define a funcao chamada na mudanca de status do objeto
    obj.open('POST',arquivo, true) // Metodo prepara objeto pra requisicao
    obj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
    obj.send(mensagem); // Envia requisicao
}

<!--------------------------------------------------------------------------------------->
// Funcoes do sistema
<!--------------------------------------------------------------------------------------->

function InserirPagina_envia()
{
        document.getElementById(id).innerHTML = obj.responseText;
}

function InserirPagina_recebe()
{
    document.getElementById(id).innerHTML = unescape(obj.responseText);
}

function InserirPagina_cep()
{                       
          // Atualiza o frete mostrado na tela e o valor total consequentemente
        atualizar_frete(obj.responseText);
        // Retorna valor do frete calculado
		
		
		resposta = obj.responseText;

        document.getElementById(id).innerHTML = obj.responseText;

          // Apaga mensagem "calculando frete..."
        document.getElementById('msg_loading').innerHTML = '';
        // habilita botao proximo
        document.getElementById('prox_pag2').style.visibility = 'visible';
}

function InserirPagina_desconto()
{
        //atualizar_desconto(obj.responseText);
        document.getElementById(id).innerHTML = obj.responseText;
        // habilita botao proximo
        if (document.getElementById('msg_loading')) {
                document.getElementById('msg_loading').innerHTML = '';
                document.getElementById('prox_pag2').style.visibility = 'visible';
        }

        dados = obj.responseText.split('___');

        //atualizar_desconto(dados[0]);
        faixas = dados[1].split('#');

        if (document.getElementById('session_cep')) {
                if (document.getElementById('session_cep').innerHTML) {
                        var frete = calcular();
                }
        }
}

function InserirPagina_produtos()
{
    document.getElementById(id).innerHTML = unescape(obj.responseText);

    calcula_desconto_cliente();
    //calcular_desconto(document.getElementById('total_geral').innerHTML);
}

<!--------------------------------------------------------------------------------------->
// Chamadas as funcoes
<!--------------------------------------------------------------------------------------->

function calcular_desconto(desconto_b)
{

    // inibe botao proximo
    if (document.getElementById('msg_loading')) {
        document.getElementById('prox_pag2').style.visibility = 'hidden';
        document.getElementById('msg_loading').innerHTML = '<b>calculando desconto...</b>';
    }

    // Monta array dos dados enviados pela requisicao
    var dados = new Array(desconto_b, 0);

    // Chama requisicao
    //Requisition(id = 'comunicacao', url = 'calcular_desconto.php', funcao = 'InserirPagina_desconto', dados, null);
}

// Funcao ajax para calcular o valor do frete e armazenar na sessao e retornar o frete
// para exibir valor na tela.
function calcularFrete(b_cep, tipo_cep, peso)
{

    // Inibe botao proximo
    document.getElementById('prox_pag2').style.visibility = 'hidden';
    // Exibe mensagem no lugar do bota proximo enquanto calculando frete
    document.getElementById('msg_loading').innerHTML = '<b>calculando frete...</b>';

    // Monta array dos dados enviados pela requisicao
    var dados = new Array(b_cep, tipo_cep, peso, 0);

    // Chama requisicao
    Requisition(id = 'comunicacao', url = 'calcular_frete.php', funcao = 'InserirPagina_cep', dados, null);
}

function calcularFrete2(b_cep)
{

    // inibe botao proximo
    document.getElementById('prox_pag2').style.visibility = 'hidden';
    document.getElementById('msg_loading').innerHTML = '<b>calculando frete...</b>';

    // Monta array dos dados enviados pela requisicao
    var dados = new Array(b_cep, 0);
	
    // Chama requisicao
    Requisition(id = 'comunicacao', url = 'calcular_carta_registrada.php', funcao = 'InserirPagina_cep', dados, null);
}

function LimpaLayer()
{
    var dados = new Array();

    // Chama requisicao
    Requisition(id = 'carregando_form', url = 'limpa.php', funcao = 'InserirPagina_recebe', dados, null);
}

function busca_produtos(seq_progrp, seq_subprogrp, tamanho, cor, efeito, adicional, pagina, per_pagina)
{

    var dados = new Array(seq_progrp, seq_subprogrp, tamanho, cor, efeito, adicional, pagina, per_pagina);

    // Chama requisicao
    Requisition(id = 'lista_produtos', url = 'busca_produtos.php', funcao = 'InserirPagina_produtos', dados, 'lista_produtos');
}

function busca_produtos_pca(seq_progrp, seq_subprogrp, tamanho, cor, efeito, adicional, pagina, per_pagina)
{

    var dados = new Array(seq_progrp, seq_subprogrp, tamanho, cor, efeito, adicional, pagina, per_pagina);

    // Chama requisicao
    Requisition(id = 'lista_produtos', url = 'busca_produtos_pca.php', funcao = 'InserirPagina_produtos', dados, 'lista_produtos');
}