//	VERSIONE: 	5.1
//	AUTORE:		GIANLUCA TROIANI gianluca.troiani@amministrazione.cnr.it
//	DATA RILASCIO:	Tue, 14 Nov 2006 14:38:47 GMT
//	SCOPO LIBRERIA:	La libreria realizza un oggetto Javascript che permette di gestire comodamente
//			l'oggetto XMLHttpRequest (AJAX)
function request(_) {
	_ = this;
	_.async = true;
	_.timeOut = null;
	_.uid = new Date().getTime().toString()+Math.floor(Math.random()*100).toString();
	_.method = null;
	_.responseText = null;
	_.responseXML = null;
	_.statusInit = false;
	_.statusInteractive = false;
	_.statusDone = false;
	_.statusError = false;
	_.statusTimeout = false;
	_.timeOutPointer = false;
	_.statusAbort = false;
	_.docCharSet = document.charset ? document.charset : document.characterSet ? document.characterSet : null;
	_.docCharSet = _.docCharSet.toLowerCase();
	_.queryString = function(){
		var queryStr = '';
		for(var p in _.params) queryStr += ((queryStr.length>0) ? '&':'')+_.escape(p)+'='+_.escape(_.params[p]);
		return queryStr;
	}
	if(_.docCharSet == 'utf-8') {
		_.escape=function(str){
			str = str.toString();
			var e = new RegExp('[^*.0-9A-Z_a-z-]');
			var outS = '';
			for(var i=0; i<str.length; i++) {
				if(str.charAt(i).match(e)) {
					var c=str.charCodeAt(i);
					outS += (c<16?"%0"+c.toString(16):c<128?"%"+c.toString(16):c<2048?"%"+(c>>6|192).toString(16)+"%"+(c&63|128).toString(16):"%"+(c>>12|224).toString(16)+"%"+(c>>6&63|128).toString(16)+"%"+(c&63|128).toString(16)).toUpperCase()
				} else outS += str.charAt(i);
			} return outS
		};
	} else _.escape=function(str){ return escape(str) }
	_.onInit = function(){return null}
	_.onInteractive = function(){return null}
	_.onError = function(){return null}
	_.onDone = function(){return null}
	_.onAbort = function(){return null}
	_.onTimeout = function(){return null}
	_.onComplete = function(){return null}
	_.timeoutAbort = function(){
		try{_.req.onreadystatechange = null}
		catch(e){}
		_.statusInit = false;
		_.statusLoaded = false;
		_.statusInteractive = false;
		_.statusDone = false;
		_.statusError = false;
		_.statusTimeout = true;
		_.statusAbort = false;
		_.req.abort();
		_.onTimeout();
		_.onComplete();
	}
	_.abort = function(){
		try{_.req.onreadystatechange = null}
		catch(e){}
		if(_.timeOutPointer) clearTimeout(_.timeOutPointer);
		_.statusInit = false;
		_.statusLoaded = false;
		_.statusInteractive = false;
		_.statusDone = false;
		_.statusError = false;
		_.statusTimeout = false;
		_.statusAbort = true;
		_.req.abort();
		_.onAbort();
		_.onComplete();
	}
	_.createXmlHttpRequest=function(){
		if(typeof XMLHttpRequest!="undefined") return new XMLHttpRequest();
		try{return new ActiveXObject("Msxml2.XMLHTTP");}
		catch(E){
			try{return new ActiveXObject("Microsoft.XMLHTTP");}
			catch(e){
				if(typeof this.onFatalError=="function") this.onFatalError(e);
				return null;
			}
			if(typeof this.onFatalError=="function") this.onFatalError(E);
		}
		return null;
	};
	_.post = function() {
		_.method = 'POST';
		_.send()
	}
	_.get = function() {
		_.method = 'GET';
		_.send()
	}
	_.execStatusDone = function(){
		_.responseText = _.req.responseText;
		_.responseXML = _.req.responseXML;
		_.statusInteractive = false;
		_.statusDone = true;
		if(_.timeOutPointer) clearTimeout(_.timeOutPointer);
		_.onDone();
		_.onComplete();
	}
	_.execStatusError = function(){
		_.statusInteractive = false;
		_.statusError = true;
		if(_.timeOutPointer) clearTimeout(_.timeOutPointer);
		_.onError();
		_.onComplete();
	}
	_.send = function(){
		if(!_.method) return null;
		_.query = '';
		for(var p in _.params) _.query += ((_.query.length>0) ? '&':'')+_.escape(p)+'='+_.escape(_.params[p]);
		_.url += '?uid='+_.uid;
		_.req = _.createXmlHttpRequest();
		if (_.req) {
			if (_.timeOut) _.timeOutPointer = setTimeout(_.timeoutAbort,_.timeOut);
			_.req.open(_.method,(_.method=='GET')?_.url+'&'+_.query:_.url, _.async);
			_.onInit();_.statusInit = true;
			_.req.onreadystatechange = function() {
				switch(_.req.readyState){
				case 3:	_.statusInit = false;
					_.statusInteractive = true;
					_.onInteractive();
					break;
				case 4:	if (_.req.status == 200 || _.req.status == 304) {
						if(_.async) _.execStatusDone()
					} else {
						if(_.async) _.execStatusError();
					}
					_.query = null;
					break;
				}
			};
			if(_.method == 'POST') _.req.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=utf-8');
			(_.method == 'POST') ? _.req.send(_.query):_.req.send(null);
			if(!_.async) _.execStatusDone();
		}
	}
}

