// * VARIABILI DI PAGINA

// array delle chiamate
var arr_history = [];
var xmlhttp_arr=[];
var polling_timer_id = null;
// array cache, chiave: l'url chiamato
//var arr_cache = [];

// Restituisce una istanza dell'oggetto XMLHttp (cross-browser)
function getXMLHttp() {
  var xmlhttp=false;
  // Utilizziamo la compilazione condizionale di JScript
  // per far fronte alle vecchie versioni di
  // Internet Explorer che non supportano i blocchi try/catch.
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  // Prova la creazione dell'oggetto ActiveX XMLHTTP

  try { xmlhttp = new ActiveXObject('Msxml2.XMLHTTP'); }
  catch (e) {
	try { xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); }
    catch (E) { xmlhttp = false; }
  }
  @end @*/
  // Se il browser non ? Internet Explorer viene creato
  // l'oggetto XMLHttpRequest (Netscape, Mozilla)
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}
	
// Si connette all'URL specificato, ne preleva i contenuti
// e li visualizza come contenuto del tag avente l'ID specificato
function getURL(url, qs, obj_id, type, str_eval, method, ignore_cache) {
  //debug("getURL ["+url+", ("+qs+")]");
  //Refresh del polling per evitare la caduta della sessione
  //Se è stato attivato il timer viene aggiornato l'intervallo di attesa
  if(polling_timer_id)
	refresh_polling();
  
  //Visualizzo il loading
  
  div_loading_1=$("ajax_loading");
  if (div_loading_1) {
    div_loading_1.innerHTML="Loading...";
    div_loading_1.style.display="block";
  }
  
  //Cerco una cache
  if (!ignore_cache) for (var i =0;i<arr_history.length;i++) {
	//debug("Cerco nell'history"+i);
	if (arr_history[i] && arr_history[i]["url"]==url) {
		if ((qs==null && arr_history[i]["qs"]==null) || (arr_history[i]["qs"].toString()==qs.toString())) { //CACHE trovata
			if (arr_history[i]["result"]) {
				// * Tramite i controlli sui tmestamp e' possibile impostare un timeout di cache
				//var d_cache = new Date(arr_history[i]["timestamp"]);
				//var d = new Date();
				error("Individuata CACHE risalente a "+arr_history[i]["timestamp"]+". Eseguo "+str_eval);
				var id_cache=i;
				break;
			} else {
				//Aggiungo in buffer operazioni da portare avanti
				arr_history[i]["str_eval"]+=";"+str_eval;
				error("Cache trovata ma senza contenuto. Archivio "+str_eval);
				return;
			}
		}
	}
  }
  //Creo il nuovo elemento in history anche se presente la cache
	arr_history.push([]);
	id_chiamata=arr_history.length-1;
	arr_history[id_chiamata]["id"] = id_chiamata;
	arr_history[id_chiamata]["url"] = url;
	arr_history[id_chiamata]["qs"] = qs;
	arr_history[id_chiamata]["type"] = type;
	arr_history[id_chiamata]["obj_id"] = obj_id;
	arr_history[id_chiamata]["str_eval"] = str_eval;
	d=new Date();
	arr_history[id_chiamata]["timestamp"] = d.getTime();

	if (id_cache!=undefined) {
		getURL_return( id_chiamata, arr_history[id_cache]["result"] );
		return;
	}
  
  var out = "";
  var xmlhttp = getXMLHttp();
  //alert("Nuovo xmlHttp con ID "+id_chiamata);
  if (!xmlhttp) {
    //alert('XMLHttp non supportato dal browser');
    return false;
  }
  xmlhttp_arr[id_chiamata]=xmlhttp;

  xmlhttp.onreadystatechange=function() {
	for (id_chiamata=0;id_chiamata<xmlhttp_arr.length;id_chiamata++){
		
		if (xmlhttp_arr[id_chiamata]!=null && xmlhttp_arr[id_chiamata].readyState==4) {
		  //debug("onreadystatechange con status"+xmlhttp_arr[id_chiamata].status);
	      if (xmlhttp_arr[id_chiamata].status == 200) {
			out = xmlhttp_arr[id_chiamata].responseText;
			xmlhttp_arr[id_chiamata]=null;
			getURL_return( id_chiamata, out );
	      } else if (xmlhttp_arr[id_chiamata].status == 404) {
			getURL_error( id_chiamata, xmlhttp_arr[id_chiamata].status, '#URL inesistente: ' + url );
	      } else if (xmlhttp_arr[id_chiamata].status == 12029) {
			getURL_error( id_chiamata, xmlhttp_arr[id_chiamata].status, '#Connessione con il server non riuscita.');
	      } else { 
			getURL_error( id_chiamata, xmlhttp_arr[id_chiamata].status, '#Errore: ' + xmlhttp_arr[id_chiamata].status +". Risorsa non disponibile.");
		  }
	    }
	}
  }

  method=(method!="GET"&&method!="POST")?"GET":method;


  //Ricompongo la querystring
  if(qs) url+=(url.indexOf('?')==-1)?"?":"&";
  if (!qs)qs=[];
  debug_param="";
  for(i=0;qs[i];i++) {
//	error(qs[i]);
	debug_param+=""+qs[i][0]+"["+qs[i][1]+"]; ";
//	url+=qs[i][0]+"="+qs[i][1];
	url+=qs[i][0]+"="+getSendValue(qs[i][1]);
	if (i!=qs.length-1) url+="&";
  }
 debug("<font color=\"#00AA00\">AJAX "+method+": richiamo URL con Parametri:"+debug_param+"</font>");

//  window.open(url, "temp"); // * TEMP ***********************************************************
  try {
	  if (method=="POST") {
		//SE POST scompongo la querystring
//		debug("<font color=\"#00AA00\">AJAX POST: richiamo URL "+url+"</font>");
	  	var arr_url=url.split("?");
	    xmlhttp.open('POST', arr_url[0], true);
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xmlhttp.send(arr_url[1]);
	  } else {
//		debug("<font color=\"#00AA00\">AJAX GET: richiamo URL "+url+"</font>");
	    xmlhttp.open('GET', url, true);
		xmlhttp.send(null);
	  }
  } catch (e) {
	//La segnalazione dell'errore e' piu' avanti
	alert("ERRORE AJAX: \n\nSi e' verificato un errore di comuncazione con il server. Servizio Ajax non disponibile.");
	error("ATTENZIONE: errore AJAX in getURL");
  }
}
function   getURL_return(id_chiamata, content) { 
//document.write(content);
  if ($("ajax_loading"))
  {
	  $("ajax_loading").innerHTML="Operazione eseguita.";
   	setTimeout('$("ajax_loading").style.display="none";', 800);
  }
  
	chiamata = arr_history[id_chiamata];
	chiamata["error"]=0;
	chiamata["result"]=content;
	url = chiamata["url"];
	obj = $(chiamata["obj_id"]);
	debug("getURL_return ["+chiamata["str_eval"]+"]");

	if (chiamata["type"]==2) { //STR_EVAL
		eval(chiamata["str_eval"]);
//		try {eval(chiamata["str_eval"]);}
//		catch (e) {error("Funzione eval <b>"+chiamata["str_eval"]+"</b> non trovata.")}
//		obj.innerHTML=content;
	} else {
		obj.innerHTML=content;
	}
	
//	show_content(obj, tag("base", content, " href='"+url+"' "));
}
function getURL_error(id_chiamata, n, content) {
  
  if ($("ajax_loading"))
  {  
	  $("ajax_loading").innerHTML=content;
	  setTimeout('$("ajax_loading").style.display="none";', 3000);
	}  
	//Annullo tutto
	if (!arr_history[id_chiamata]) return;
	chiamata = arr_history[id_chiamata];
	chiamata["errno"]=n;
	chiamata["error"]=content;
	chiamata["result"]=null;
	url = chiamata["url"];
	if (chiamata["obj_id"] && (obj=$(chiamata["obj_id"])) ) 
		//obj.innerHTML=chiamata["error"];
		obj.innerHTML="<br/><br/><div style='text-align:center;'>Nessuna informazione aggiuntiva trovata.<br/><br/><a href='javascript:hide_info_big_img();'>CHIUDI</a></div>";
		
	error("Si e' verificato un errore nella chiamata al server: "+content);
	arr_history[id_chiamata]=null;
//	show_content(obj, tag("base", content, " href='"+url+"' "));
}

function reset_option(id_select) {
	var obj=$(id_select);
	n=obj.options.length;
	for (i=0;i<n;i++) {
		obj.options[0]=null;
	}
	opt = new Option(". . .", ""); 
	obj.options[0]=opt;
	obj.disabled=true;
}
function load_option(id_select, options) {
	var obj=$(id_select);
	reset_option(id_select);
	var rows=options.split("#");
	
//alert(obj.options[1]);
//	obj.options[obj.length - 1] = null;

//	opt = new Option("["+rows.length+" valori trovati]", ""); 
	opt = new Option(" ", ""); 
	obj.options[0]=opt;
	//Salto elemento 0: <?xml type?>
	for (i=1;i<rows.length;i++) {
		val=rows[i].split("|");
		opt = new Option(val[1], val[0]); 
		obj.options[i]=opt;
	}
	if (obj.options.length>1) {
		obj.disabled=false;
	} else {
		opt = new Option("Nessun valore ammesso", ""); 
		obj.options[0]=opt;
	}
	
//	obj=$(id_select);
//	out+=tag("select", options, 'id="'+obj.id+'" onchange="'+obj.onchange+'"');
//	$(id_where).innerHTML = out;
//	return out;
}
function load_dominio(dominio, gruppo, id_dest){ 
	if (!gruppo && dominio!="nazione") {
		reset_option(id_dest);
		return;
	}
	getURL('http://localhost/myproject/ges_dominio.php?dominio='+dominio+'&gruppo='+gruppo, id_dest, 1, 'load_option(\''+id_dest+'\', content);');
}

function tag(tagname, value, attrib) {
	var out="";
	if (value) out="<"+tagname+" "+attrib+">"+value+"</"+tagname+">";
	else out="<"+tagname+" "+attrib+"/>";
	return out;
}

function error(t) {
//	alert(t);
	debug("<font color='#FF0000'>"+t+"</font>");
}

//Elimina dalla cache la chiamata ajax corrispondente all'id passato
function delete_cache(id_chiamata) {
	error("CACHE: Cancellazione chiamata " + arr_history[id_chiamata]["str_eval"]);
	arr_history[id_chiamata] = null;
}

//FUNZIONI PER LA GESTIONE DEL POLLING
//Funzione che attiva il timer per il polling, richiamata dalla pagina che lo richiede
function activate_polling() {
	polling_timer_id = setTimeout('getURL("'+root+'/XMLServer",[], null, 2, "return_polling(content)", "POST", true)', 900000);//polling ogni 15 min
	debug("Polling attivato");
}
//Esegue il refresh del polling per evitare la caduta della sessione
function refresh_polling() {
	clearTimeout(polling_timer_id);
	activate_polling();
}
//Funzione chiamata in corrispondenza del timeout del polling
function return_polling(content) {
	var x = get_doc_xml(content);
	var messaggi = x.getElementsByTagName("descrizione");
	if(messaggi.item(0).firstChild.nodeValue!= "FUNZIONE NON SPECIFICATA") {
		alert(get_errori(x));
	}
}
function getSendValue(valore){
	return encodeURIComponent(valore);
}

// Ritorna un array con tutti i campi della form
function load_form_qs(nomeForm){

	var qs = new Array();
	var myF = document.forms[nomeForm];
	for (i = 0; field = myF[i]; i++) {
		if (field.type == "button" || (field.type == "radio" && !field.checked)){
		}
		else {
			qs.push([field.name, field.value]);
		}
	}
	return qs;
}
