function gRPC_Engine() {

	this.request_type = 'GET' // POST, GET
	this.requests = new Array();

};

gRPC_Engine.prototype = {

	initXMLInterface: function() {
		var A;
		
		var msxmlhttp = new Array(
			'Msxml2.XMLHTTP.5.0',
			'Msxml2.XMLHTTP.4.0',
			'Msxml2.XMLHTTP.3.0',
			'Msxml2.XMLHTTP',
			'Microsoft.XMLHTTP');
		for (var i = 0; i < msxmlhttp.length; i++) {
			try {
				A = new ActiveXObject(msxmlhttp[i]);
			} catch (e) {
				A = null;
			}
		}
		
		if(!A && typeof XMLHttpRequest != "undefined")
			A = new XMLHttpRequest();

		if (!A)
			sajax_debug("Could not create connection object.");

		return A;
	},

	cancelRequests: function() {
		for (var i = 0; i < this.requests.length; i++) 
			this.requests[i].abort();
	},

	request: function(uri, callback_func, callback_param) {
		var i, xml, n;
		var post_data;
		var target_id;

		switch ( this.request_type )
		{
			case "POST":
			case "GET":
				break;

			default:
				alert("Illegal request type: " + this.request_type);
				return false;
				break;
		}

		xml = this.initXMLInterface();

		xml.open(this.request_type, uri, true);
	
		this.requests[this.requests.length] = xml;
			
		if ( this.request_type == "POST" ) {
			xml.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
			xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		}
		
		xml.onreadystatechange = function() {
			if (xml.readyState != 4) 
				return;

			callback_func(xml.responseText.replace(/^\s*|\s*$/g,""), callback_param);
		}

		xml.send(post_data);

		delete xml;
		return true;
	}

}

var gRPC = new gRPC_Engine();
