function XMLRemoteRequest() {
	this.xmlHttp = this.getxmlHttpInstance();
}

XMLRemoteRequest.prototype.getxmlHttpInstance = function () {
	var xComp = null;
	try {
		xComp = new XMLHttpRequest();
		this.handleRequestAsString = nnRequestAsStringHandler;
		this.handleRequestDOM = nnRequestDOMHandler;
	} catch (e) {
		try {
			//xComp = new ActiveXObject("Msxml2.XMLHttp");
			xComp = new ActiveXObject("Microsoft.XMLHTTP");
			this.handleRequestAsString = ieRequestAsStringHandler;
			this.handleRequestDOM = ieRequestDOMHandler;
		} catch (e) {
			window.alert("Versão de browser com funcionalidade insuficientes para execução desta rotina.\nAtualize seu browser para IE 5.5 (ou posterior) ou nn 6 (ou posterior).");
		}
	}
	return xComp;
}
XMLRemoteRequest.prototype.getRemoteDocument = function (urlString) {
	return this.handleRequestDOM(this.xmlHttp, urlString);
}
XMLRemoteRequest.prototype.getRemoteDocumentString = function (urlString) {
	return this.handleRequestAsString(this.xmlHttp, urlString);
}


// nn specifics
function nnRequestDOMHandler(xmlComp, urlString) {
	xmlComp.open("POST", urlString, false);
	xmlComp.send(null);
	if (xmlComp.responseXML) return xmlComp.responseXML;
	return null;
}
function nnRequestAsStringHandler(xmlComp, urlString) {
	xmlComp.open("POST", urlString, false);
	xmlComp.send(null);
	if (xmlComp.responseXML) {
		var dummyDoc = xmlComp.responseXML;
		var dummySerializer = new XMLSerializer();
		docString = dummySerializer.serializeToString(dummyDoc);
		return docString;
	}
	return null;
}

// IE specifics
function ieRequestDOMHandler(xmlComp, requestString) {
	xmlComp.open("POST", requestString, false);
	xmlComp.send();
	return xmlComp.responseXML;
}
function ieRequestAsStringHandler(xmlComp, requestString) {
	xmlComp.open("POST", requestString, false);
	xmlComp.send();
	return xmlComp.responseText;
}
///////////////////////////////////////////////////////////////////////





function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	return getDomDocumentPrefix.prefix = getXmlPrefix('DomDocument');
}
function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	return getXmlHttpPrefix.prefix = getXmlPrefix('XmlHttp');
}
function getXmlPrefix(sufix) {
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + "." + sufix);
			return prefixes[i];
		}
		catch (ex) {};
	}
	throw new Error("Could not find an installed XML parser");
}

// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}

			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Seu browser não suporta objetos XmlHttp");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);

			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}

			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Seu browser não suporta objetos XmlDocument");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML =
	Document.prototype.loadXML = function (s) {

		// parse the string to a new doc
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");

		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);

		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};


	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	/*
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	*/
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}

// Outras funções
function stripHtml(s) {
	return s.replace(/\&/g, "&amp;").replace(/\</g, "&lt;").replace(/\>/g, "&gt;").replace(/\t/g, "&nbsp;&nbsp;&nbsp;").replace(/\n/g, "<br />");
}

///////////////////// XML-HTTP ///////////////////////////
// Class xmlHttpRequest ([strUrl],[strParametros],[boolAsync],[strHeads])

// Propriedades:
//	obj.src
//	obj.method=GET | POST | PUT | PROPFIND
//	obj.async
//	obj.head
//	obj.XmlHttp.responseText
//	obj.XmlHttp.responseXML
//	obj.XmlHttp.responseBody
//	obj.XmlHttp.responseStream
//	obj.XmlHttp.status
//	obj.XmlHttp.statusText
//	obj.XmlHttp.readyState

// Metodos:
//	obj.load([url],[parametros])
//	obj.reset()
//	obj.XmlHttp.abort()
//	obj.XmlHttp.getAllResponseHeaders()
//	obj.XmlHttp.getResponseHeader(strHeader)
//	obj.XmlHttp.open(strMethod, strUrl, [boolAsync], [strUser], [strPassword]) [obsoleta]
//	obj.XmlHttp.send(strBody) [obsoleta]
//	obj.XmlHttp.setRequestHeader(strHeader,strValue) [obsoleta]

// Eventos:
//	obj.onstart
//	obj.onloading
//	obj.onloaded
//	obj.onreadystatechange
function xmlHttpRequest (url,parametros,bAsync,heads) {
	var method,p,i;
	this.reset=function() {
		if (this.onstart) eval(this.onstart);
		if (this.src) {
			method=(this.method)?this.method:((this.parameteres)?'POST':'GET'); //Escolhe o método
			this.XmlHttp.open(method, this.src, this.async); // Conecta ao arquivo
			if (this.head==='') {
				this.XmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=ISO-8859-1'); //text/html   text/xml
			} else if (this.head!==false)  this.XmlHttp.setRequestHeader('Content-Type',this.head);
			if (this.async) {
				this.XmlHttp.onreadystatechange = function () {
					if (obj.onloading) eval(obj.onloading);
					if (obj.XmlHttp.readyState == 4 && obj.onloaded) eval(obj.onloaded);
				}
			}
			if (this.parameteres) {
				p='';
				if (typeof(this.parameteres)=='string') p=this.parameteres;
				else for (i in this.parameteres) p+=((p)?'&':'') + escape(i)+'='+escape(this.parameteres[i]);
				this.XmlHttp.send(p)
			} else this.XmlHttp.send(null);
			if (!this.async && this.onloaded) eval(this.onloaded);
		}
		return new Boolean(this.src);
	}
	this.load=function(url,parametros) {
		if (url) this.src=url;
		if (parametros) this.parameteres=parametros;
		this.reset();
		if (typeof(this.XmlHttp.responseText)=='unknown') return;
		var xml=this.XmlHttp.responseXML;
		return (xml)?xml:this.XmlHttp.responseText;
	}
   var obj=this;
	this.XmlHttp= XmlHttp.create();
	this.src='';
	this.method='';
	this.head=(typeof(heads)=='undefined')?'':heads;
	this.async=(bAsync)?bAsync:false;
	this.parameteres='';
	this.onstart='';
	this.onloaded='';
	this.onloading='';
	this.load(url,parametros);
}
//////////////////////// fim XML-HTTP //////////////////////////////

