/**
Definizione della classe con variabili e metodi privati e privilegiati.
Versione 2.0 (last modifica: 11/09/2009)
*/
function Ajax(appendMode_) {

  /** Se true appende il contenuto ajax invece che cancellarlo */
  var appendMode = appendMode_ == true ? true : false;

  /** restituisce un oggetto XMLHttpRequest */
  function getXMLHttpRequest() {
    if(typeof XMLHttpRequest!="undefined") {//disponibile in modo nativo sulla maggior parte dei browser
      return new XMLHttpRequest();
    }
    else if(window.ActiveXObject) { //versione di IE precedente alla 7
      var ajax_version = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp.2.0","MSXML2.XMLHttp", "Msxml2.XMLHTTP"];
      for(var ajax_i = 0; ajax_i < ajax_version.length; ajax_i++) {
        try{
          var ajax_obj = new ActiveXObject(ajax_version[ajax_i]);
          return ajax_obj;
        }
        catch(e){}
      }
    }
    return null;
  }


  /** Aggiorna il contenuto del container caricandoci la pag specificata.
  containerID - L'id del contenitore in cui andra' l'output (puo' essere null o "" )
  page - La pagina che verra' richiamata da ajax.
  post - Eventuali parametri post o null se non serve
  f - Una funzione di callback, opzionale
  param, ..., param - Eventuali parametri per la funzione di callback
  */
  this.updater = function(containerID, page, post, f) {
    var args = arguments; // devo tenerlo perche' onreadeystate e' un'altra funzione e cambiano!
    var req = getXMLHttpRequest();
    var onreadystate = function() {
    if(req.readyState == 4) {
      if(req.status == 200 || req.status == 0) { // strano, su firefox mi restituisce 0!!!
        var risposta = req.responseText.replace("&amp;", "&");
        if(containerID != null && containerID != "")
          if(appendMode) document.getElementById(containerID).innerHTML += risposta;
          else document.getElementById(containerID).innerHTML = risposta;

        if(typeof f == "function") {  // eseguo, se settata, la funzione
          if(args.length == 4) f();  // nessun argomento
          else {  // la eseguo con argomenti
            var argsNum = args.length;
            var command = "f(args[4]";
            for(var i = 5; i < argsNum; i++)
              command += ", args["+i+"]";
            command += ")";
            //alert("eseguo: "+command + " gli arguments erano "+argsNum);
            eval(command);
          }
        }
      }
      else {
        alert("Si e\' verificato un errore: "+req.statusText+" ("+req.status+")");
      }
    }
    else {}// attesa
    }
    var method = "POST";
    if(post == null || post == "") {post = ""; method = "GET";}
    req.onreadystatechange = onreadystate;
    req.open(method, page, true);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    req.send(post); // eventuale spedizione parametri post
  }

	/** e' in grado di caricare script dopo una chiamata ajax **/
	this.loadScript = function(scriptpath, functions) {
		var oXML = getXMLHttpRequest();
		oXML.open('GET', scriptpath, false);  // il false e' importante perché il browser aspetta di averlo caricato tutto
		oXML.send('');
		eval(oXML.responseText);
		for(var i=0; i<functions.length; i++)
			window[functions[i]] = eval(functions[i]);
	}
}

// Setta i metodi pubblici di questo oggetto
Ajax.prototype = {
  
  /** crea un iframe nascosto al quale invia i dati del form (non usa ajax!) */
  ajaxLikeUpload: function(idForm) {
    var form = document.getElementById(idForm);
    if(form.getAttribute("enctype") != "multipart/form-data")
      form.setAttribute("enctype", "multipart/form-data");
    form.setAttribute("target", "iframeAjaxLike");
    if(!document.getElementById("iframeAjaxLike")) {	// se non c'e' gia'
      var iframe = null;
      try {iframe = document.createElement("<iframe name='iframeAjaxLike'>");}//per Explorer
      catch(e){}
      if(!iframe || iframe.nodeName.toLowerCase() != "iframe") iframe = document.createElement("iframe");
      iframe.setAttribute("id", "iframeAjaxLike");
      iframe.setAttribute("name", "iframeAjaxLike");
      iframe.style.display = "none";
      document.body.appendChild(iframe);
    }// altrimenti forzo l'attributo name
    else document.getElementById("iframeAjaxLike").setAttribute("name", "iframeAjaxLike");	
    form.submit();
  },
  
  /** Una prova idiota ma funzionante, da cancellare */
  allerta: function(arg) {
    alert(arg);
  }
}

// metodo statico di Ajax
Ajax.update = function(containerID, page, post) {
  var aj = new Ajax();
  aj.updater(containerID, page, post);
}

// fa la new col true
Ajax.updateAppend = function(containerID, page, post) {
  var aj = new Ajax(true);
  aj.updater(containerID, page, post);
}
