// Attesa massima per la risposta alle chiamate asincrone
var maxSecondsWait = 5;
var timeOutCheckWait = 500;
// Codici di ritorno http
var statusText = new Array();
		statusText[100] = "Continue";
		statusText[101] = "Switching Protocols";
		statusText[200] = "OK";
		statusText[201] = "Created";
		statusText[202] = "Accepted";
		statusText[203] = "Non-Authoritative Information";
		statusText[204] = "No Content";
		statusText[205] = "Reset Content";
		statusText[206] = "Partial Content";
		statusText[300] = "Multiple Choices";
		statusText[301] = "Moved Permanently";
		statusText[302] = "Found";
		statusText[303] = "See Other";
		statusText[304] = "Not Modified";
		statusText[305] = "Use Proxy";
		statusText[306] = "(unused, but reserved)";
		statusText[307] = "Temporary Redirect";
		statusText[400] = "Bad Request";
		statusText[401] = "Unauthorized";
		statusText[402] = "Payment Required";
		statusText[403] = "Forbidden";
		statusText[404] = "Not Found";
		statusText[405] = "Method Not Allowed";
		statusText[406] = "Not Acceptable";
		statusText[407] = "Proxy Authentication Required";
		statusText[408] = "Request Timeout";
		statusText[409] = "Conflict";
		statusText[410] = "Gone";
		statusText[411] = "Length Required";
		statusText[412] = "Precondition Failed";
		statusText[413] = "Request Entity Too Large";
		statusText[414] = "Request-URI Too Long";
		statusText[415] = "Unsupported Media Type";
		statusText[416] = "Requested Range Not Satisfiable";
		statusText[417] = "Expectation Failed";
		statusText[500] = "Internal Server Error";
		statusText[501] = "Not Implemented";
		statusText[502] = "Bad Gateway";
		statusText[503] = "Service Unavailable";
		statusText[504] = "Gateway Timeout";
		statusText[505] = "HTTP Version Not Supported";
		statusText[509] = "Bandwidth Limit Exceeded";

function xmlHttpObject() {
	var XHR = null;
	var browser = navigator.userAgent.toUpperCase();
	if(typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object")
				XHR = new XMLHttpRequest();
	else if(window.ActiveXObject && browser.indexOf("MSIE 4") < 0) {
				if(browser.indexOf("MSIE 5") < 0)
					XHR = new ActiveXObject("Msxml2.XMLHTTP");
				else
					XHR = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return XHR;
}
function chiamataAsincrona(degradabile,metodo,action,modulo,target,risposta) {
  if (degradabile) var link = action;
  else {
	var link = new Object();
	link.href = action;
  }
  var ajax = xmlHttpObject();
  var elemento = null;
  if (target) elemento = seleziona(target);
  var useLink = true;
  var requestBody = null;
  // controllo time-out
  var dataChiamata = new Date();
  var inizioChiamata = dataChiamata.getTime();
  var verificaTempoTrascorso;
  var checkWaitInitialized = false;
  if (! risposta) {checkWaitInitialized = true; verificaTempoTrascorso = function(){};}
  var maxWait;

  if(ajax) {
    useLink = false;
    if(!link.clicked) {
      link.clicked = true; 
	  ajax.open(metodo, link.href, true);
      ajax.setRequestHeader("connection", "close");
      ajax.onreadystatechange = function() {
       	if(ajax.readyState === 4) {
			verificaTempoTrascorso = function(){};
			switch (ajax.status) {
			case 200:
			    if (elemento) elemento.innerHTML = ajax.responseText;
			    var rc = ajax.getResponseHeader('sc_ajaxResponse');
			    if (rc) ajaxResponse(rc);
			    break;
			case 301:
			case 302:
			    break;
			default:
			    alert ('Richiesta non andata a buon fine\n');
			    alert ('Esito: ' + ajax.status + ' ' + statusText[ajax.status] + '\n\n');
			    alert ('Segnalare il problema all\'assistenza');
	 		}
        	link.clicked = false;
       	} else if (! checkWaitInitialized) {
			maxWait = maxSecondsWait * 1000;
          	verificaTempoTrascorso = function() {
				dataChiamata = new Date();
            	if((dataChiamata.getTime() - inizioChiamata) > maxWait) {
				//tempo scaduto!!
	            	ajax.onreadystatechange = function(){return;};
					ajax.abort();
				    alert ('Il server tarda a rispondere!');
			    	alert ('Ritentare fra qualche secondo o segnalare il problema all\'assistenza');
              		link.clicked = false;
            	} else
              		setTimeout(verificaTempoTrascorso, timeOutCheckWait);
          	};
          	verificaTempoTrascorso();
          	checkWaitInitialized = true;
        };
	  }
	if(modulo) {
        requestBody = getQueryString(modulo);
        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    	ajax.setRequestHeader('Content-Length', requestBody.length);
 	}
    ajax.send(requestBody);
    } else {    //link già selezionato!! togliere l'alert di controllo
		alert('Chiamata doppia non eseguita!');
  	}
  }
  return useLink;
}

function chiamataSincrona(degradabile,metodo,action,modulo,target) {
  var response = new Object();
  if (degradabile) var link = action;
  else {
	var link = new Object();
	link.href = action;
  }
  var ajax = xmlHttpObject();
  var elemento = seleziona(target);
  var useLink = true;
  var requestBody = null;

  if(ajax) {
    useLink = false;
    if(!link.clicked) {
      link.clicked = true;
	  ajax.open(metodo, link.href, false);
      ajax.setRequestHeader("connection", "close");
	  if(modulo) {
        requestBody = getQueryString(modulo);
        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    	ajax.setRequestHeader('Content-Length', requestBody.length);
 	  }
	  ajax.send(requestBody);
	  switch (ajax.status) {
			case 200:
			    if (elemento) elemento.innerHTML = ajax.responseText;
			    var rc = ajax.getResponseHeader('sc_ajaxResponse');
			    if (rc) ajaxResponse(rc);
				response.responseText = ajax.responseText;
			    break;
			case 301:
			case 302:
			    break;
			default:
			    alert ('Richiesta non andata a buon fine\n');
			    alert ('Esito: ' + ajax.status + ' ' + statusText[ajax.status] + '\n\n');
			    alert ('Segnalare il problema all\'assistenza');
				response.responseText = '';
	 		}
    } else {    //link già selezionato!! togliere l'alert di controllo
		//alert('Chiamata doppia non eseguita!');
  	}
  }
  response.useLink = useLink;
  return response;
}

function getQueryString(form) {with(form){
	var qs = '';
	for(var i=0;i<form.elements.length;i++) {
		if (qs!='')qs = qs + '&';
		qs = qs + elements[i].name + '=' + escape(elements[i].value);
	}
	return qs;
}}

function inviaModulo(form,target) {
  return chiamataAsincrona(false,"POST",form.action,form,target,true);
}
function chiamataGet(urlString,target) {
  return chiamataAsincrona(false,"GET",urlString,null,target,true);
}
function chiamataGetSenzaRisposta(urlString) {
  return chiamataAsincrona(false,"GET",urlString,null,null,false);
}
function chiamataGetDegradabile(url,target) {
  return chiamataAsincrona(true,"GET",url,null,target,true);
}
function chiamataGetSincrona(url) {
  return chiamataSincrona(false,"GET",url,null,null);
}
