// AJAX request
jslib_ajaxrequest_proto=function() {
    this.method='GET';
    this.url='';
    this.mode=null; // xml or null
    this.completionListenerFunction=null;
    this.completionListenerObject=null;
    this.status='idle';
    this.header=[]; // header data
    this.data=null; // post data
}

jslib_ajaxrequest_proto.prototype.setMethod=function(method) {
    this.method=method;
}

jslib_ajaxrequest_proto.prototype.setURL=function(url) {
    this.url=url;
}

jslib_ajaxrequest_proto.prototype.setMode=function(mode) {
    this.mode=mode;
}

jslib_ajaxrequest_proto.prototype.setHeader=function(field,value) {
    // FIXME: replace by field
    this.header.push([field,value]);
}

jslib_ajaxrequest_proto.prototype.setData=function(data) {
    this.data=data;
}

jslib_ajaxrequest_proto.prototype.execute=function() {
    this.http_reuest=null;
    if(window.XMLHttpRequest) {
	this.http_request=new XMLHttpRequest();
    } else if(window.ActiveXObject) { // IE
	this.http_request=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if(!this.http_request) return false;

    this.http_request.open(this.method,this.url,true);
    for(var i=0;i<this.header.length;i++) {
	this.http_request.setRequestHeader(this.header[i][0],this.header[i][1]);
    }
    //this.http_request.jslib_ajaxrequest=this;
    jslib_ajaxfactory.enqueueRequest(this);
    
    return true;
}

jslib_ajaxrequest_proto.prototype.completionHandler=function() {
    this.status='loaded';
    if(this.completionListenerFunction) this.completionListenerFunction(this.completionListenerObject);
}

jslib_ajaxrequest_proto.prototype.registerCompletionListener=function(func,obj) {
    this.completionListenerFunction=func;
    this.completionListenerObject=obj;
}

jslib_ajaxrequest_proto.prototype.getContent=function() {
    if(this.status!='loaded') return null;
    if(this.mode=='xml'){
	return this.http_request.responseXML;
    }else{
	return this.http_request.responseText;
    }
}

// AJAX factory
jslib_ajaxfactory_proto=function() {
    this.requestqueue=[];
}

jslib_ajaxfactory_proto.prototype.createRequest=function() {
    return new jslib_ajaxrequest_proto();
}

jslib_ajaxfactory_proto.prototype.enqueueRequest=function(request) {
    this.requestqueue.push(request);
    request.http_request.onreadystatechange=this.readystateHandler;
    request.http_request.send(request.data);
}

jslib_ajaxfactory_proto.prototype.readystateHandler=function() {
    for(var i=0;i<jslib_ajaxfactory.requestqueue.length;i++) {
	var request=jslib_ajaxfactory.requestqueue[i];
	//alert("Ready State:"+request.http_request.readyState);
	//alert("Server Status:"+request.http_request.status);
	if(request && (request.http_request.readyState==4)) {
	    jslib_ajaxfactory.requestqueue[i]=null;
	    if(request.http_request.status==200) {
		request.completionHandler();
	    }
	}
    }
}

jslib_ajaxfactory=new jslib_ajaxfactory_proto();
