var ajcalls = {};
var ajcallbacks = {};
function ajaxDo(fn,raw,ref){
	try{
		fn(raw,ref);
	}
	catch(e){};
}
ajax = function(){
	this.ajid = Math.round(Math.random()*1000);
	ajcalls[this.ajid] = this;
}
ajax.prototype={
server: "/ajax/",
resultHandler: null,
resultArgs: null,
currentRequest: null,
currentURL: null,
__timeout: null,
callbackobj: null,
running: false,
method: 'GET',
params: '',
useRelativePath: true,
getXmlHttp: function()
{
	var xmlHttp = null;
	try {
		xmlHttp = new XMLHttpRequest();
	} catch (e) {
		var progIds = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0'];
		var success = false;
		for (var iterator = 0; (iterator < progIds.length) && ( ! success); iterator ++) {
			try {
				xmlHttp = new ActiveXObject(progIds[iterator]);
				success = true;
			} catch (e) {}
		}
		if ( ! success ) {
			return null;
		}
	}
	this.currentRequest = xmlHttp;
	return xmlHttp;
},
call: function(url,timeout,view)
{
	//alert("ajax: " + url);
	if(!this.running){
		this.running = true;
		var ref = this;
		var xmlHttp = this.getXmlHttp();
		var handleResult = function(){
			try{ref.answer(xmlHttp);}catch(e){}
		}
		if(this.useRelativePath){
			var u=this.server + url;
		}
		else{
			var u=url;
		}
		if(view) alert(u);
		xmlHttp.onreadystatechange = handleResult;
		xmlHttp.open(this.method, u, true);
		if(this.method=='GET'){
			xmlHttp.send("");
		}
		else if(this.method=='POST'){
			xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xmlHttp.setRequestHeader("Content-length", this.params.length);
			xmlHttp.setRequestHeader("Connection", "close");
			xmlHttp.send(this.params);
		}
		//ajaxadconnection();
		ref.currentURL = u;
		if(timeout != undefined) this.__timeout = setTimeout("killajax("+this.ajid+")",3500);
	}
},
abort: function(){
	if(this.currentRequest){
		//alert(this.ajid+" ->abort");
		this.currentRequest.onreadystatechange = function(){};
		this.currentRequest.abort();
	}
	if(this.__timeout) clearTimeout(this.__timeout);
},
answer: function(xmlHttp)
{
	this.running = false;
	var states = new Array("UNINITIALIZED","LOADING","LOADED","INTERACTIVE","COMPLETED");
	var display = "";
	var rs = xmlHttp.readyState;
	display += "readyState: " + rs + " (" + states[rs] + ")\n";
	if(rs == 4){
		//ajaxdelconnection();
		if(this.__timeout){
			clearTimeout(this.__timeout);
		}
		display += "status: " + xmlHttp.status + "\n";
		display += "statusText: " + xmlHttp.statusText + "\n";
		display += "responseText: " + xmlHttp.responseText + "\n";
		//display += "responseXml: " + xmlHttp.responseXml + "\n";
		var args=null;
		if(this.resultArgs){
			if(typeof this.resultArgs === 'string'){args=mm.refs[this.resultArgs];}
			else{args=this.resultArgs;}
		}
		else if(ajcallbacks[this.ajid]){args=ajcallbacks[this.ajid];}
		if(this.resultHandler != null){
			eval(this.resultHandler)(xmlHttp.responseText,args);
		}
	}

},
setResultHandler: function(fn){
	if(eval(fn) != null) this.resultHandler = fn;
	if(arguments.length>1) this.resultArgs = arguments[1];
},
setCallbackObj: function(obj){
	this.callbackobj=obj;
},
clear: function(){
	for(var ref in this){
		this[ref] = null;
		delete this[ref];
	}
}
}

function killajax(refid){
	if(refid){
		if(ajcalls[refid]){
			//alert(refid + ": timeout (" + ajcalls[refid].currentURL + ")");
			ajcalls[refid].abort();
		}
	}
}
var curaj = 0;
var totaj = 0;
function ajaxadconnection(){
	curaj++;
	totaj++;
	if(gel("ajdebug")){
		var adbg = gel("ajdebug");
		adbg.innerHTML = curaj + "/" + totaj;
	}
}
function ajaxdelconnection(){
	curaj--;
	if(gel("ajdebug")){
		var adbg = gel("ajdebug");
		adbg.innerHTML = curaj + "/" + totaj;
	}
}
function ajaxdelconnections(){
	for(var refid in ajcalls){
		ajcalls[refid].abort();
	}
}