/**
 Costruttore della classe AjaxRequestUpgrade 
 
 @constructor
 @param url = url da richiamare
  contentDiv = id div contenitore del risultato
  op = CTR -> controlla ultima versione
       VUP -> visualizza elenco aggiornamenti
 */
function AjaxRequestUpgrade(url, contentDiv, op) {

    /** @private */
    var self = this;
    
    /** @private */
    var xmlHttp = createXMLHttpRequestUpgrade();
    
    /** @private */
    var requestURL = url;

    /** @private */
    var contentDiv = contentDiv;

    /** @private */
    var op = op;

    /** @private */
    var limit = 0;

    /** @private */
    var lang = "";

    /** @private */
    var version = "";

    /** @private */
    var method = "GET";

    /** @private */
    var postParameters = "";   

    /**
     ritorna l'istanza dell'oggetto XMLHttpRequest
     @return XMLHttpRequest
     */
    this.getXMLHttpRequestObjectUpgrade = function() {
        return xmlHttp;
    }

    /**
     utilizza il metodo POST nella richiesta Ajax
     */
    this.setUsePOSTUpgrade = function() {
        method = "POST";
    }

    /**
     Setta il valore di limit che sarà applicato nella query
     di default limit=0
     */
    this.setLimit = function(l) {
        limit = l;
    }

    /**
     Setta la lingua attiva
     */
    this.setLang = function(l) {
        lang = l;
    }

    /**
     Setta la versione da controllare
     */
    this.setVersion = function(vers) {
        version = vers;
    }

    /**
     invia la richiesta Ajax
     */
    this.sendRequestUpgrade = function() {
        var obj = this;
        xmlHttp.onreadystatechange = function () { handleStateChangeUpgrade(self) };
        if(requestURL.indexOf("?") > 0) {
            requestURL = requestURL + "&ts=" + new Date().getTime();
        } else {
            requestURL = requestURL + "?ts=" + new Date().getTime();
        }

        // aggiunge il parametro della lingua attiva
        requestURL = requestURL + "&lang=" + lang;

        // aggiunge il parametro della versione
        requestURL = requestURL + "&version=" + version;

        // se specificato un limit da applicare nella query
        if (limit!=0)
            requestURL = requestURL + "&limit=" + limit;

	if (method == "GET") {
           xmlHttp.open(method, requestURL);
           xmlHttp.send(null);
        } else {
           xmlHttp.open(method, requestURL);
           //Fix a bug in Firefox when posting
           try {
              if (xmlHttp.overrideMimeType) {
                 xmlHttp.setRequestHeader("Connection", "close"); //set header after open
              }
           } catch(e) {
              // Do nothing
           }
           xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
           xmlHttp.send(postParameters);
        }

    }
    
    /** @private */
    handleStateChangeUpgrade = function(ajaxRequest) {
        if(ajaxRequest.getXMLHttpRequestObjectUpgrade().readyState != 4) {
            return;
        }
        if(ajaxRequest.getXMLHttpRequestObjectUpgrade().status != 200) {
            /* errorHandler(self); */
            return;
        }
        // esegue la funzione in base all'operazione selezionata
        switch (op) {
           case 'VUP': // visualizza elenco aggiornamenti
                       var result = ajaxRequest.getXMLHttpRequestObjectUpgrade().responseText;
                       document.getElementById('listUpd').innerHTML=result;
                       break;
           case 'CTR': // visualizza l'esito del controllo sulla versione
		       var result = ajaxRequest.getXMLHttpRequestObjectUpgrade().responseText;
                       visualVersionResult(result);
                       break;
        }
    }

    
    /**
     Crea un'istanza dell'oggetto XMLHttpRequest
     @ritorna un'istanza dell'oggetto XMLHttpRequest
     @private
     */
    function createXMLHttpRequestUpgrade() {
        var req = false;
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e) {
                try {
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(e) {
                    req = false;
                }
            }
        }
        return req;
    }


    /**
     visualizza l'esito del controllo sulla versione
     @parametri: result -> true=ultima versione / false=versione vecchia
     @private
     */ 
    visualVersionResult = function(result) {

       if (result=='true') {
          if (lang=='it_IT') 
             document.getElementById('versionResult').innerHTML="Il tuo applicativo _E' AGGIORNATO_ all'ultima versione disponibile<br /><br />";
          else
          document.getElementById('versionResult').innerHTML="Your application _IS UPDATED_ to the latest available version<br /><br />";
          // nasconde il div degli aggiornamenti se lìapplicativo e' aggiornato
          document.getElementById('divUpgrade').style.display="none";
       } else {
          if (lang=='it_IT')
             document.getElementById('versionResult').innerHTML="Il tuo applicativo _<b>NON</b> E' AGGIORNATO_ all'ultima versione disponibile<br /><br />";
          else
             document.getElementById('versionResult').innerHTML="Your application _<b>IS *NOT*</b> UPDATED_ to the latest available version<br /><br />";
          // visualizza le istruzioni per l'aggiornamento
          document.getElementById('istruzUpgrade').style.display="block";
       }
    }


    /** 
      crea un tag nel DOM con il contenuto e la posizione specificati
      @parametri: parentId = id oggetto padre del nuovo tag
                  tagName = nome del nuovo tag
                  text = contenuto del nuovo tag
                  isText = true -> campo text con caratteri \n da convertire in <br/>
                           false -> campo normale
      */
    addTagNode = function(parentId, tagName, text, isText) {
       var newEl = document.createElement(tagName);
       if (isText==false) {
          var newCell = document.createTextNode(text);
          newEl.appendChild(newCell);
       } else {
          text=text.replace(/\n/g,'<br />');
          newEl.innerHTML=text;
       }
       document.getElementById(parentId).appendChild(newEl);
    }


    /**
      elimina tutti i nodi figli del nodo specificato
      @parametri: elId = id elemento a cui elimanare i nodi
      @private
      */ 
    clearElChilds = function(elId) {

       var elAct = document.getElementById(elId);
       if (elAct.hasChildNodes()) {
          while (elAct.childNodes.length>0) {
             elAct.removeChild(elAct.childNodes[0]);
          }
       }
    }

    /**
      crea la stringa dei parametri da passare al POST
      nella forma name=value&name=value....
      usando tutti i campi del form specificato
      @parametri: formId = form da cui prendere i dati
      */ 
    this.createPostParametersFromFormNews = function(formId) {

        formObj = document.getElementById(formId);

        for(var h = 0; h < formObj.length; h++) {
	    postParameters += formObj[h].name+"="+formObj[h].value+"&";
        }
        postParameters = postParameters.substr(0,postParameters.length-1);
    }

};
