/**
 Costruttore della classe AjaxRequestNews 
 
 @constructor
 @param url = url da richiamare
  contentDiv = id div contenitore del risultato
  op = NHP -> visualizza news hp
       NL  -> visualizza lista url network
 */
function AjaxRequestNetwork(url, contentDiv, op) {
    /** @private */
    var self = this;
    
    /** @private */
    var xmlHttp = createXMLHttpRequestNetwork();
    
    /** @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.getXMLHttpRequestObjectNetwork = function() {
        return xmlHttp;
    }

    /**
     utilizza il metodo POST nella richiesta Ajax
     */
    this.setUsePOSTNetwork = 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.sendRequestNetwork = function() {

        var obj = this;
        xmlHttp.onreadystatechange = function () { handleStateChangeNetwork(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 */
    handleStateChangeNetwork = function(ajaxRequest) {
        if(ajaxRequest.getXMLHttpRequestObjectNetwork().readyState != 4) {
            return;
        }
        if(ajaxRequest.getXMLHttpRequestObjectNetwork().status != 200) {
            /* errorHandler(self); */
            return;
        }

        // esegue la funzione in base all'operazione selezionata
        switch (op) {
           case 'GM': // visualizza google map della scuola selezinata
                      var contPage = document.getElementById(contentDiv);
                      contPage.innerHTML = ajaxRequest.getXMLHttpRequestObjectNetwork().responseText;
                      roundCorners("news_dx", 5);
                      break;
           case 'NL':  // visualizza lista network
		       var result = ajaxRequest.getXMLHttpRequestObjectNetwork().responseXML;
                       visualNetwork(result);
                       break;
        }
    }

    
    /**
     Crea un'istanza dell'oggetto XMLHttpRequest
     @ritorna un'istanza dell'oggetto XMLHttpRequest
     @private
     */
    function createXMLHttpRequestNetwork() {
        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;
    }


    /** !!!!!!!!!! DA CANCELLARE!!!!!!!!!
     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 lista degli url del network
     @parametri: result = oggetto xml con i dati delle scuole
     @private
     */ 
    visualNetwork = 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','FREESCHOOL NETWORK',false);

       var network = result.getElementsByTagName("networkItem");
       for (i=0; i<network.length; i++) {
          networkItem = network[i];
          // ricava i dati singola news da xml
          schoolName = networkItem.getElementsByTagName("schoolName")[0].firstChild.nodeValue;
          schoolAddress = networkItem.getElementsByTagName("schoolAddress")[0].firstChild.nodeValue;
          schoolCity = networkItem.getElementsByTagName("schoolCity")[0].firstChild.nodeValue;
          schoolState = networkItem.getElementsByTagName("schoolState")[0].firstChild.nodeValue;
          url = networkItem.getElementsByTagName("url")[0].firstChild.nodeValue;
          // crea elementi nel DOM
          // converte gli apici per schoolName
          schoolNameText=schoolName;
          while (schoolName.match(/[\']/)) { schoolName = schoolName.replace("\'", "\\%27"); }
          // converte gli apici per schoolAddress
          schoolAddressText=schoolAddress;
          while (schoolAddress.match(/[\']/)) { schoolAddress = schoolAddress.replace("\'", "\\%27"); }
          // converte gli apici per schoolCity
          while (schoolCity.match(/[\']/)) { schoolCity = schoolCity.replace("\'", "\\%27"); }

          addTagNode('newsArc','a',schoolNameText,false,url);
          addTagNode('newsArc','a','(google map)',false,'javascript:networkArchive(\'N\',\'GM\',\''+schoolCity+'\',\''+schoolName+'\',\''+schoolState+'\');');
          addTagNode('newsArc','h2',schoolAddressText+' - '+schoolState,false,'');
       }
       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
		  url = url da specificare in href per gli anchor tags
      */
    addTagNode = function(parentId, tagName, text, isText, url) {
       var newEl = document.createElement(tagName);

       if (tagName=='a') {
         if (text=='(google map)') {
            newEl.setAttribute('class','googlemaps');
            newEl.setAttribute('href',url);
	 } else {
            newEl.setAttribute('href','http://'+url);
            newEl.setAttribute('target','_blank');
         }
       }

       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]);
          }
       }
    }

    /** !!!!!!!!!! DA CANCELLARE ?????????????
      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);
    }

};
