//##################################################################################
//## FORM SUBMIT WITH AJAX                                                        ##
//## @Author: Simone Rodriguez aka Pukos <http://www.SimoneRodriguez.com>         ##
//## @Version: 1.2                                                                ##
//## @Released: 28/08/2007                                                        ##
//## @License: GNU/GPL v. 2 <http://www.gnu.org/copyleft/gpl.html>                ##
//##################################################################################



function xmlhttpGet(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Xhr per Mozilla/Safari/Ie7
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // per tutte le altre versioni di IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('GET', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
			// Quando pronta, visualizzo la risposta del form
            updatepage(self.xmlHttpReq.responseText);
        }
		else{
			// In attesa della risposta del form visualizzo il msg di attesa
			waitPage();

		}
    }
    self.xmlHttpReq.send("");

}


function xmlhttpPost(strURL,formname) {
    var xmlHttpReq = false;
    var self = this;
    // Xhr per Mozilla/Safari/Ie7
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // per tutte le altre versioni di IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
			// Quando pronta, visualizzo la risposta del form
            updatepage(self.xmlHttpReq.responseText);
        }
		else{
			// In attesa della risposta del form visualizzo il msg di attesa
			waitPage();

		}
    }
    self.xmlHttpReq.send(getquerystring(formname));
}

function getquerystring(formname) {
    var form = document.forms[formname];
	var qstr = "";

    function GetElemValue(name, value) {
        qstr += (qstr.length > 0 ? "&" : "")
            + escape(name).replace(/\+/g, "%2B") + "="
            + escape(value ? value : "").replace(/\+/g, "%2B");
			//+ escape(value ? value : "").replace(/\n/g, "%0D");
    }
	
	var elemArray = form.elements;
    for (var i = 0; i < elemArray.length; i++) {
        var element = elemArray[i];
        var elemType = element.type.toUpperCase();
        var elemName = element.name;
        if (elemName) {
            if (elemType == "TEXT"
                    || elemType == "TEXTAREA"
                    || elemType == "PASSWORD"
					|| elemType == "BUTTON"
					|| elemType == "RESET"
					|| elemType == "SUBMIT"
					|| elemType == "FILE"
					|| elemType == "IMAGE"
                    || elemType == "HIDDEN")
                GetElemValue(elemName, element.value);
            else if (elemType == "CHECKBOX" && element.checked)
                GetElemValue(elemName, 
                    element.value ? element.value : "On");
            else if (elemType == "RADIO" && element.checked)
                GetElemValue(elemName, element.value);
            else if (elemType.indexOf("SELECT") != -1)
                for (var j = 0; j < element.options.length; j++) {
                    var option = element.options[j];
                    if (option.selected)
                        GetElemValue(elemName,
                            option.value ? option.value : option.text);
                }
        }
    }
    return qstr;
}
function waitPage(str){
    var doc = document.getElementById("wait");

    if(doc){
      document.getElementById("wait").style.display = "inline";
    }
}



function updatepage(str){
    var msgWar = new String();
    var msgInf = new String();
    var doc = document.getElementById("wait");

    if(doc){
      document.getElementById("wait").style.display = "none";
    }
    /*
     * Verifica la presenza di un hostResponseException
     */
    var errorList = _checkException(str);
    /*
     * Verifica la presenza della funzione javascript da eseguire
     * (getJscNam/getJscNamAlways)
     */
    var jscNamAlways = _getTags(str,"jscNamAlways");
    var jscNam = _getTags(str,"jscNam");
    
    
    
    for(var i = 0; i < errorList.length; i++){
      var errClass = errorList[i];
      /*
       * Se è un errore bloccante esponse l'alert ed esce
       */
      if(errClass.errTip == "E" || errClass.errTip == "S"){
        error(errClass.errCod,errClass.errDes,errClass.errFld);
		    /*
		     *  Se  presente jscNamAlways, esegue lo script
		     */
        if(jscNamAlways.length != 0){
          setTimeout(jscNamAlways,0);
          
        }
        return;
      }
      else{
        /*
         * Compone il messaggio concatenando i vari warning/info
         */
         if(errClass.errTip == "W" ){
           msgWar += "- "+errClass.errDes;
           msgWar += " (ref "+errClass.errCod+")\n";
         }
         else{
           msgInf += "- "+errClass.errDes;
           msgInf += " (ref "+errClass.errCod+")\n";
         }
      }
    }
    /*--------------------------------
     *  NON CI SONO ERRORI BLOCCANTI
     *--------------------------------
     */
     
     /*
      * Esegue l'eventuale jscNamAlways
      */
      if(jscNamAlways.length != 0){
        setTimeout(jscNamAlways,0);
        return;        
      }
      
     /*
      * Esegue l'eventuale jscNam
      */
      if(jscNam != 0){
        setTimeout(jscNam,0);
        return;
      }
      
      

     
     /*
      * Visualizza gli eventuali messaggi di warning/info
      */
      
     var level = 0;
     if(msgWar.length != 0){
       msgWar = "Attenzione:\n" + msgWar; 
       level++;
     }

    if(msgInf.length != 0){
      if(level == 0)
        msgInf = "Informazione:\n" + msgInf; 
      else
        msgInf = "\nInformazione:\n" + msgInf; 
      level++;
    }
    if(level > 0)
      showMsg(msgWar+msgInf);
    
    
    /*
     * Recupera action e target del form
     */
    var _action = _getTags(str,"action");
    var _target = _getTags(str,"target");
    
    
    /*
     * Redirect alla vista JSP. Passiamo tutti i parametri in request tranne 
     * quelli che cominciano con wk, e anche il parametro wkBckFnz per la gestione
     * della paginazione in caso di back
     *
     * Viene creato un form POST con i campi hidden e sottomesso
     */
    var myform=document.createElement("FORM");
    
    document.body.appendChild(myform);
    
    
    myform.method = "POST";
    myform.action = _action;
    myform.target = _target;
    myform.name= "postForm";
    
    
    //alert("SUBMIT:"+myform.action);
    
    /*
     * Inserisce i campi di input nel form
     */
    var itemList = _getFormtags(str);
    
    for(var i = 0; i < itemList.length; i++){
      var itemClass = itemList[i];
      //var myinput = document.createElement("<input name='"+itemClass.name+"' type='hidden'>");
      var myinput = document.createElement('input');
      myinput.type = 'hidden';
      myinput.name = itemClass.name;
      myinput.value = itemClass.value;
      myform.appendChild(myinput);
    }
    
    
    //mypara=document.getElementById();
    //mypara.appendChild(myform); 
    
    myform.submit();
    
}

/* 
 * Verifica la presenza di Exception nella risposta dell'Host.
 * In caso affermativo valorizza la struttura _errorList
 */
function _checkException(str){
  var errStr = _getTags(str,"errors");
  var errorList = new Array();
  var tmpStr;
  if(errStr.length == 0){
    return errorList;
  }
  var TagEnd = _getTagEndPos(errStr,"error");
  var idx = 0;
  while(TagEnd > 0){
    tmpStr = _getTags(errStr,"error");
    var errClass = new _errors();
    errClass.errTip =  _trim(_getTags(tmpStr,"errtip")).toUpperCase();
    errClass.errCod =  _getTags(tmpStr,"errcod");
    errClass.errDes =  _getTags(tmpStr,"errdes");
    errClass.errFld =  _getTags(tmpStr,"errfld");
    
    errorList[idx] = errClass;
    idx++;
    /*
     * Si posiziona sul successivo
     */
    errStr = errStr.substring(TagEnd);
    TagEnd = _getTagEndPos(errStr,"error");
    
  }
  return errorList;
}


/* 
 * Recupera tutti gli elementi da inserire nel form
 * per la redirect
 */
function _getFormtags(str){
  var itmStr = _getTags(str,"items");
  var itemList = new Array();
  var tmpStr;
  if(itmStr.length == 0){
    return itemList;
  }
  var TagEnd = _getTagEndPos(itmStr,"item");
  var idx = 0;
  while(TagEnd > 0){
    tmpStr = _getTags(itmStr,"item");
    var itemClass = new _items();
    itemClass.name =  _getTags(tmpStr,"name");
    itemClass.value =  _getTags(tmpStr,"value");
    
    itemList[idx] = itemClass;
    idx++;
    /*
     * Si posiziona sul successivo
     */
    itmStr = itmStr.substring(TagEnd);
    TagEnd = _getTagEndPos(itmStr,"item");
    
  }
  return itemList;
}


function _getTags(str,tagName){
  var TagStart = str.indexOf("<"+tagName+">");
  var TagEnd = str.indexOf("</"+tagName+">");
  if(TagStart != -1 && TagEnd !=-1) {
    return _trim(str.substring(TagStart+tagName.length+2,TagEnd));
  }
  else{
    return "";
  }
}

/**
 * Restituisce la posizione all'interno della stringa
 * in input dove termina il tag in input
 */
function _getTagEndPos(str,tagName){
  var TagEnd = str.indexOf("</"+tagName+">");
  if(TagEnd != -1){
    return str.indexOf("</"+tagName+">")+tagName.length+3;
  }
  else{
    return -1;
  }
  
}

function _errors(){
  this.errTip = new String();
  this.errCod = new String();
  this.errDes = new String();
  this.errFld = new String();
}

function _items(){
  this.name = new String();
  this.value = new String();
}


/**
 *  Esegue il trim della string ain input
 */
function _trim (str) {
        str = str.replace(/^\s+/, '');
        for (var i = str.length - 1; i >= 0; i--) {
                if (/\S/.test(str.charAt(i))) {
                        str = str.substring(0, i + 1);
                        break;
                }
        }
        return str;
}

