var RequestObject;

function initRequest(newRequestFunc, noBody) {

    var _newRequest = newRequestFunc;
    var _noBody = noBody;
    var _id = 0;

    return function() {

        this.newRequest = _newRequest;

        this.concatTimer = function(url, id) {
            return url + (url.indexOf("?") < 0 ? "?" : "&") + "HoraReq=" + new Date().getTime() + "&ReqId=" + id;
        }

        
        this.Solicitar = function(object)
        {
            var url = object['url'];
            if (typeof url == 'undefined')
            {
                throw "necessário URL para fazer Solicitacao";
            }
            var id = _id++;
            var req = _newRequest();
            var metodo = object['metodo'] || "POST";
            var headers = object['header'];
            var dados = object['dados'];
            var onLoad = object['onLoad'];
            var onError = object['onError'];
            var onProcess = object['onProcess'];
            var onStateChange = object['onStateChange'];

            req.onreadystatechange = function()
            {
                if (onStateChange)
                {
                    onStateChange(req, id);
                }
                switch(req.readyState)
                {
                    case 0: // UNINITIALIZED open() não foi chamado ainda
                        break;
                    case 1: // LOADING send() não foi chamado ainda
                    case 2: // LOADED send() foi chamado, disponível getResponseHeader e status
                    case 3: // INTERACTIVE carregando, responseText tem dados parciais
                        if (onProcess)
                        {
                            onProcess(req, id);
                        }
                        break;
                    case 4: // COMPLETED, todas as operações foram concluidas
                        if (onProcess)
                        {
                            onProcess(req, id);
                        }
                        if (req.status == 0 || req.status == 200)
                        {
                            if (onLoad)
                            {
                                onLoad(req, id);
                            }
                        }
                        else
                        {
                            if (onError)
                            {
                                onError(req, id, req.statusText);
                            }
                        }
                        break;
                }
            }
            
            req.open(metodo, this.concatTimer(url, id));
            req.setRequestHeader('RequestId', id);
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            for(var header in headers)
            {
                req.setRequestHeader(header, headers[header]);
            }
            try
            {
                if (dados && _noBody && (metodo == 'GET'))
                {
                    req.send();
                }
                else
                {
                    req.send(dados);
                }
            }
            catch(e)
            {
                if (onError)
                {
                    onError(req, id, e);
                }
            }

        }

    }
}
/*
if (window.ActiveXObject) {
	var objectNames = [
			"Msxml2.XMLHTTP.5.0",
			"Msxml2.XMLHTTP.4.0",
			"MSXML2.XMLHTTP.3.0",
			"MSXML2.XMLHTTP",
			"Microsoft.XMLHTTP"
        ];
	for(var i=0; i < objectNames.length; i++) {
		try {
			var requestName = objectNames[i];
			new ActiveXObject(requestName);
			RequestObject = initRequest(function() { return new ActiveXObject(requestName); }, true);
                        alert(requestName)
		} catch(e) {
		}
	}
  }

  if (! RequestObject && window.XMLHttpRequest) {
      alert('a')
	try {
		new XMLHttpRequest();
		RequestObject = initRequest(function() { return new XMLHttpRequest(); }, false);
	} catch(e) {
	}
  }

  if (! RequestObject) {
	alert("Seu browser não esta preparado para o ajax");
  }

*/

if (window.XMLHttpRequest)
{
    try
    {
        new XMLHttpRequest();
        RequestObject = initRequest(function()
        {
            return new XMLHttpRequest();
        }, false);
    }
    catch(e) {}
}
else if (window.ActiveXObject)
{
    try
    {
        new ActiveXObject('Msxml2.XMLHTTP');
        RequestObject = initRequest(function()
        {
            return new ActiveXObject('Msxml2.XMLHTTP');
        }, true);
    }
    catch (e1)
    {
        try
        {
            new ActiveXObject('Microsoft.XMLHTTP');
            RequestObject = initRequest(function()
            {
                return new ActiveXObject('Microsoft.XMLHTTP');
            }, true);
        }
        catch (e2)
        {
            alert('infelizmente seu browser nao pode rodar esse sistema...');
        }
    }
}

