function JsonRequest(mn,callback){
	this.mn = mn;
	this.cb = callback;
	this.t = [];
};

JsonRequest.prototype.makeRequest = function(url,p){
	if (!p) p = null;


	// get idle (or new) thread
	if (!(r = this.getThread())) return false;
	
	// set up the request
	if (p){
		r.open('POST', url, true);
		r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		r.setRequestHeader("Content-length", p.length);
		r.setRequestHeader("Connection", "close");
	}
	else r.open('GET', url, true);

	// set the callback function
	if (this.cb) r.onreadystatechange = new Function('if ('+this.mn+'.t['+i+'].readyState == 4) '+this.mn+'.cb(eval("("+'+this.mn+'.t['+i+'].responseText+")"));');
	else r.onreadystatechange = function(){return};
	
	// send the request
	r.send(p);

	// return true- TODO: return false if request somehow fails...
	return true;
};

JsonRequest.prototype.getThread = function(){
	for (i = 0; i < this.t.length; i++){
		if (this.t[i].readyState == 0 || this.t[i].readyState == 4) return this.t[i];
	//	if (!this.t[i].busy) return this.t[i];
	}
	this.t[i] = this.makeObj(i);	
	return this.t[i] ? this.t[i] : false;
};

JsonRequest.prototype.makeObj = function(i){
	if (window.XMLHttpRequest) // Mozilla, Safari,...
		r = new XMLHttpRequest();
  else if (window.ActiveXObject) { // IE
    try {
        r = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
          r = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
  }}
		
	return r ? r : false;
};