// http://support.microsoft.com/kb/883500/en
var requestMethod=
{
	Get :"get",
	Post:"post"
};
var readyState=
{
	INATTIVO:      0,
	INIZIALIZZATO:	1,
	RICHIESTA:     2,
	RISPOSTA:      3,
	COMPLETATO:    4
};
var Ajax=
{
	Request:null,
	AvoidCache:true,
	_callbackFunction:null,
	_worg:false,
	MustUpdateMSXml:false,
	Initialize:function()
	{
		Ajax.Request=null;
		if((typeof(XMLHttpRequest)=="function")||(typeof(XMLHttpRequest)=="object"))
		{
			Ajax.Request=new XMLHttpRequest();
		}
		else if(window.ActiveXObject)
		{
			var UA,p,v=0,V,ex=null;
			UA=navigator.userAgent.toUpperCase();
			if((p=UA.indexOf("MSIE "))>=0)
			{
				if(isNaN(v=parseFloat(UA.substr(p+"MSIE ".length))))
					v=0;
			}
			if(v>=5)
			{
				try
				{
					Ajax.Request=new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch(ex)
				{
					Ajax.Request=null;
				}
				if(!Ajax.Request)
					Ajax.MustUpdateMSXml=true;
			}
		}
		return (Ajax.Request?true:false);
	},
	_Sistema:function(s)
	{
		if((s==null)||(!s.length))
			return "";
		return s;
	},
	Stop:function()
	{
		if(Ajax.Request)
			Ajax.Request.abort();
	},
	_parseAnswer:function()
	{
		var s;
		if(Ajax.StatusText(Ajax.Request.status)!="OK")
			return new Array(false, Ajax.StatusText(Ajax.Request.status));
		s=Ajax._Sistema(Ajax.Request.responseText);
		if((s==null)||(s.length==0))
			return new Array(false, "Nessuna risposta dal server");
		if(s.charAt(0)!="1")
		{
			if(s=="0")
				s="";
			else if(s.charAt(0)=="0")
				s=s.substr(1);
			return new Array(false, (s.length?s:"Il server ha segnalato un errore."));
		}
		return new Array(true, s.substr(1));
	},
	_checkReadyState:function()
	{
		if(Ajax._callbackFunction&&(Ajax.Request.readyState==readyState.COMPLETATO))
		{
			var R=Ajax._parseAnswer();
			Ajax._worg=false;
			Ajax._callbackFunction(R[0], R[1]);
		}
		else
		{
			setTimeout("Ajax._checkReadyState()",50);
		}
	},
	IsWorking:function()
	{
		return Ajax._worg?true:false;
	},
	Go:function(Url,Method,Vars,CallbackFunction)
	{
		var sErr=null,R,sUrl,ex=null,redo,k;
		Ajax._callbackFunction=(CallbackFunction?CallbackFunction:null);
		if(Ajax._worg)
			sErr="Il browser sta gia' effettuando un'operazione.";
		else if(!(Ajax.Request||Ajax.Initialize()))
			sErr="Versione del browser non supportata.";
		else
		{
			Ajax._worg=true;
			sUrl=Url;
			if((Vars!=null)&&Vars.length&&(Method==requestMethod.Get))
				sUrl+="?"+Vars;
			if(Ajax.AvoidCache)
				sUrl+=((sUrl.indexOf("?")>=0)?"&":"?")+"__noc1="+Math.random()+"&__noc2="+Math.random();
			for(k=0;k<5;k++)
			{
				try
				{ Ajax.Stop(); }
				catch(ex)
				{ }
				redo=false;
				try
				{
					Ajax.Request.open(Method,sUrl,Ajax._callbackFunction?true:false);
					Ajax.Request.setRequestHeader("connection","close");
					if(Method==requestMethod.Post)
						Ajax.Request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
					Ajax.Request.send(((Vars==null)||(Method!=requestMethod.Post))?null:Vars);
				}
				catch(ex)
				{ redo=true; }
				if(!redo)break;
			}
			if(Ajax._callbackFunction)
			{
				setTimeout("Ajax._checkReadyState()",50);
				return;
			}
			Ajax._worg=false;
			R=Ajax._parseAnswer();
			Ajax.Request.abort();
			return R;
		}
		Ajax._worg=false;
		if(Ajax._callbackFunction)
			Ajax._callbackFunction(false, sErr);
		else
			return new Array(false, sErr);
	},
	StatusText:function(s)
	{
		switch(s)
		{
			case 100:return "Continua";
			case 101:return "Scambio protocolli";
			case 200:return "OK";
			case 201:return "Creata";
			case 202:return "Accettato";
			case 203:return "Informazione non autoritativa";
			case 204:return "Nessun contenuto";
			case 205:return "Contenuto reimpostato";
			case 206:return "Contenuto parziale";
			case 300:return "Scelta multipla";
			case 301:return "Spostato permanentemente";
			case 302:return "Trovati";
			case 303:return "Vedi altro";
			case 304:return "Non modificato";
			case 305:return "Usa proxy";
			case 306:return "(inutilizzato ma riservato)";
			case 307:return "Redirezionamento temporaneo";
			case 400:return "Richiesta errata";
			case 401:return "Autorizzazione negata";
			case 402:return "Richiesta pagamento";
			case 403:return "Vietato";
			case 404:return "Pagina non trovata";
			case 405:return "Metodo non consentito";
			case 406:return "Non accettabile";
			case 407:return "Richiesta autenticazione del proxy";
			case 408:return "Richiesta scaduta";
			case 409:return "Conflitto";
			case 410:return "Scomparso";
			case 411:return "E' necessario specificare la lunghezza";
			case 412:return "Una precondizione e' fallita";
			case 413:return "Un elemento della richiesta e' troppo grange";
			case 414:return "L'indirizzo della richiesta e' troppo lungo";
			case 415:return "Tipo di supporto non valido";
			case 416:return "L'intervallo della richiesta non e' soddisfabile";
			case 417:return "L'attesa e' fallita";
			case 500:return "Errore interno del server";
			case 501:return "Funzione non implementata";
			case 502:return "Gateway errato";
			case 503:return "Servizio non disponibile";
			case 504:return "Il gateway e' scaduto";
			case 505:return "Versione HTTP non supportata";
			case 509:return "E' stato superato il limite della larghezza di banda";
		}
		return "Stato sconosciuto ("+s+")";
	}
};

