function remote(url, params, callback) {
	var req = create_req(); 
	req.onreadystatechange = process_req;

	function create_req() {
		if (window.XMLHttpRequest) {
			try {
				req = new XMLHttpRequest();
			} catch(e) {
				req = false;
			}
		} else if (window.ActiveXObject) {
			try {
				req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					req =  false;
				}
			}
		}
		return req;
	}

	function process_req() {
		if (req.readyState == 4)
			if (req.status == 200)
				if (callback)
					callback(req);
	}

	this.get = function() {
		var query = "";
		var tmp = [];
		var count = 0;
		if (params) {
			for (var key in params) 
				tmp[count++] = escape(key)+"="+escape(params[key]);
			if (tmp.length > 0) {
				for (var i=0; i<tmp.length-1; i++)
					query += tmp[i] + "&"	
				query += tmp[tmp.length-1]
			}
		}
		if (query != "")
			url = url +"?"+query;
		req.open("GET", url, true);
		req.send(null);
	}

	this.post = function() {
		var query = "";
		var tmp = [];
		var count = 0;
		if (params) {
			for (var key in params) 
				tmp[count++] = escape(key)+"="+escape(params[key]);
			if (tmp.length > 0) {
				for (var i=0; i<tmp.length-1; i++)
					query += tmp[i] + "&"	
				query += tmp[tmp.length-1]
			}
		}
		req.open("POST", url, true);
		req.setRequestHeader("Content-Type", "application/x-www-form-urlescaped");
		req.send(query);
	}
}


