/**
 Costruttore della classe AjaxRequestNews 
 
 @constructor
 @param url = url da richiamare
  contentDiv = id div contenitore del risultato
  op = NHP -> visualizza news hp
       NAR -> visualizza archivio news
 */
function AjaxRequestNews(url, contentDiv, op) {
    /** @private */
    var self = this;
    
    /** @private */
    var xmlHttp = createXMLHttpRequestNews();
    
    /** @private */
    var requestURL = url;

    /** @private */
    var contentDiv = contentDiv;

    /** @private */
    var op = op;

    /** @private */
    var limit = 0;

    /** @private */
    var lang = "";

    /** @private */
    var method = "GET";

    /** @private */
    var postParameters = "";   

    /**
     ritorna l'istanza dell'oggetto XMLHttpRequest
     @return XMLHttpRequest
     */
    this.getXMLHttpRequestObjectNews = function() {
        return xmlHttp;
    }

    /**
     utilizza il metodo POST nella richiesta Ajax
     */
    this.setUsePOSTNews = 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;
    }

    /**
     invia la richiesta Ajax
     */
    this.sendRequestNews = function() {

        var obj = this;
        xmlHttp.onreadystatechange = function () { handleStateChangeNews(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;

        // 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 */
    handleStateChangeNews = function(ajaxRequest) {
        if(ajaxRequest.getXMLHttpRequestObjectNews().readyState != 4) {
            return;
        }
        if(ajaxRequest.getXMLHttpRequestObjectNews().status != 200) {
            /* errorHandler(self); */
            return;
        }

        // esegue la funzione in base all'operazione selezionata
        switch (op) {
           case 'NHP': // visualizza news HP
                       var result = ajaxRequest.getXMLHttpRequestObjectNews().responseXML;
                       var news = result.getElementsByTagName("newsItem");
                       visualNewsHp(result);
                       break;
           case 'NAR': // visualizza archivio news
		       var result = ajaxRequest.getXMLHttpRequestObjectNews().responseXML;
                       visualNewsArchivio(result);
                       break;
        }
    }

    
    /**
     Crea un'istanza dell'oggetto XMLHttpRequest
     @ritorna un'istanza dell'oggetto XMLHttpRequest
     @private
     */
    function createXMLHttpRequestNews() {
        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 le news nella hp a sx
     @parametri: result = oggetto xml con i dati delle news hp
     @private
     */ 
    visualNewsHp = function(result) {
       var news = result.getElementsByTagName("newsItem");
       for (i=0; i<news.length; i++) {
          newsItem = news[i];
          // ricava i dati singola news da xml
          title= newsItem.getElementsByTagName("title")[0].firstChild.nodeValue;
          data= newsItem.getElementsByTagName("data")[0].firstChild.nodeValue;
          testo= newsItem.getElementsByTagName("testo")[0].firstChild.nodeValue;
          // crea elementi nel DOM
          addTagNode(contentDiv,'p',title,false);
          addTagNode(contentDiv,'h1',data,false);
          addTagNode(contentDiv,'h2',testo,true);
       }
       roundCorners("contenuti_sx", 5);
    }

    /**
     visualizza archivio delle news a dx
     @parametri: result = oggetto xml con i dati delle news
     @private
     */ 
    visualNewsArchivio = function(result) {

       // elimina tutti i nodi di corpo_dx
       clearElChilds(contentDiv);

       // crea il div che conterrà le news
       var contNews=document.createElement("div");
       contNews.setAttribute("class","news_dx");
       contNews.setAttribute("className","news_dx");  // per compatibilita con IE
       contNews.setAttribute("id","newsArc");
       document.getElementById(contentDiv).appendChild(contNews);

       // visualizza titolo della pagina
       addTagNode('newsArc','h3','NEWS',false);

       var news = result.getElementsByTagName("newsItem");
       for (i=0; i<news.length; i++) {
          newsItem = news[i];
          // ricava i dati singola news da xml
          title= newsItem.getElementsByTagName("title")[0].firstChild.nodeValue;
          data = "("+newsItem.getElementsByTagName("data")[0].firstChild.nodeValue+")";
          testo= newsItem.getElementsByTagName("testo")[0].firstChild.nodeValue;
          // crea elementi nel DOM
          addTagNode('newsArc','p',title,false);
          addTagNode('newsArc','h1',data,false);
          addTagNode('newsArc','h2',testo,true);
       }
       roundCorners("news_dx", 5);
    }


    /** 
      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);
    }

};
