//***************************************
// INTERFACE FUNCTIONS
//***************************************
/**
* function ajaxReplace
* interface function to http object
* to be used when called url return formatted html text to be replaced in html content
* TODO: manage POST request method
*
* @param    string    url     url to be called on server, including get parameter
* @param    string    area    id of html container whose content must be replaced with server response  
* @param    boolean   asynch  true for asynchronous request, false for synchronous
*
* @return   int               0 on succes, 1 on error on activating http object
*/
function ajaxReplace(url, area, asynch) {
  var xhtmlr = getXmlHttpRequest();
  if (xhtmlr) {
    xhtmlr.open("GET", url, asynch);
    xhtmlr.onreadystatechange = function() {
                                  if (requestComplete(xhtmlr)) {
                                      document.getElementById(area).innerHTML = xhtmlr.responseText;
                                  }
                                };
    xhtmlr.send(null);
    return 0;
  } else {
    return 1;
  }
}

/**
* function ajaxRequest
* interface function to http object
* to be used when called url return user known content to be managed with a supplied handler function
* TODO: manage POST request method
* TODO: manage parameters passing other than the first to the handler
*
* @param    string    url      url to be called on server, including get parameter
* @param    function  handler  response handler, called on request completion
*                              **warning** handler function will receive request http object as first parameter
* @param    boolean   asynch   true for asynchronous request, false for synchronous
*
* @return   int                0 on succes, 1 on error on activating http object
*/

function ajaxRequest(url, handler, asynch) {
  var xhtmlr = getXmlHttpRequest();
  if (xhtmlr) {
    xhtmlr.open("GET", url, asynch);
    xhtmlr.onreadystatechange = function() {
                                  if (requestComplete(xhtmlr)) {
                                      handler(xhtmlr); // call my handler in a closed context, this mean it will see xhtmlr object as first parameters
                                  }
                                };
    xhtmlr.send(null);
    return 0;
  } else {
    return 1;
  }

}
/**
* Interface function to call server usign ajax style call
* 
* @param    url   (string)   server to call
* @param    parms (object)   object containing parameters value to the function
*/

var requestProgIDs = ''

function ajaxAce(url, parms) {
  
  var oggi = new Date();
  
  // default parameters
  var parameters = { method    : 'GET'     // 'GET'|'POST'
                    ,params    : 'MANUAL'  // 'MANUAL'|'FORM'
                    ,urlparams : null      // url parameters (param1=val1&param2=val2.....)
                    ,asynch    : 1         // 0|1
                    ,type      : 'handler' // 'handler'|'html'|'javascript'|'noresponse'
                    ,runscript : '' // 'id's scripts da eseguire'
                    ,handler   : null      // handler function when type is 'handler'
                    ,area      : null      // id of html tag where type is 'html'
                    ,onlyids   : ''      // id campi da passare se params = 'FORM'
                    ,debug     : 0         // set to 1 to display result from server in a javascript alert window 
                    ,requestRetry : 3 // numero massimo di tentativi
                    ,requestId : Math.round(Math.random() * 100000) // id richiesta
                    ,requestDate : oggi.getDate()+'-'+(oggi.getMonth()+1)+'-'+oggi.getFullYear()+' '+oggi.getHours()+':'+oggi.getMinutes()+':'+oggi.getSeconds()
                    ,requestUrl : url
                   }
 
  // extend and override default parameters with those received by caller
  Object.extend(parameters, parms || {});

  if (xhtmlr) xhtmlr.abort();
  var xhtmlr = null;
  //xhtmlr = getXmlHttpRequest();
  requestProgIDs = ''
  xhtmlr = crea_http_req();
  if (xhtmlr) {
    parameters.requestTry = 1;
    //if (parameters.method == 'GET' && parameters.urlparams.length > 0) url += (url.match(/\?/) ? '&' : '?') + parameters.urlparams;
    
    if (parameters.params == 'MANUAL') {
      if (parameters.method == 'GET' && parameters.urlparams.length > 0) url += (url.match(/\?/) ? '&' : '?') + parameters.urlparams;
    } else {
      if (parameters.params == 'FORM') {
        //var s = ''
        var theform = document.getElementById(parameters.urlparams)
        var sep = ''
        parameters.urlparams = ''
        for( i=0; i<theform.elements.length; i++) {
          if (theform.elements[i].name != '') {
            if (parameters.onlyids != '') {
              var oidsArr = parameters.onlyids.split(',')
              var youAre = false
              var idxOids = 0
              while(idxOids < oidsArr.length && !youAre) {
                if  (oidsArr[idxOids] == theform.elements[i].id) youAre = true;
                idxOids++;
              }
              
              if (!youAre) {
                continue;
              }
            }
            valued = true
            if (theform.elements[i].type == 'checkbox') {
              valued = theform.elements[i].checked;
            }
            if (theform.elements[i].type == 'radio') {
              var radiovalue = ''
              var radioLength = theform.elements[i].length;
              if(radioLength == undefined) {
                if(theform.elements[i].checked) {
                  radiovalue = theform.elements[i].value
                } else {
                  valued = false
                }
              } else {
                for(var rv = 0; rv < radioLength; rv++) {
                  if(theform.elements[i][rv].checked) {
                    radiovalue = theform.elements[i][rv].value;
                  }
                }
              }

            }
            
            if (valued) {
              if (theform.elements[i].type == 'select-multiple') {
                for(opt=0; opt<theform.elements[i].options.length; opt++) {
                  if(theform.elements[i].options[opt].selected) {
                    parameters.urlparams = parameters.urlparams + sep + theform.elements[i].name + '='+theform.elements[i].options[opt].value
                    sep = '&'
                  }
                }
              } else {
                if (theform.elements[i].type == 'radio') {
                  parameters.urlparams = parameters.urlparams + sep + theform.elements[i].name + '='+radiovalue
                  sep = '&'
                } else {
                  theValue = theform.elements[i].value
                  if(parameters.magic_quotes) {
                    theValue = escape(theValue)
                  }
                  parameters.urlparams = parameters.urlparams + sep + theform.elements[i].name + '='+theValue
                  sep = '&'
                }
              }
            }
          }
        }
        
        if (parameters.method == 'ALWAYS_GET' && parameters.urlparams.length > 0) {
          url += (url.match(/\?/) ? '&' : '?') + parameters.urlparams;
          parameters.method = 'GET'
        } else parameters.method = 'POST';
      } else {
        if (parameters.params == 'FORMOWNER') {
          var sep = ''
          var formOwner =  parameters.urlparams
          parameters.urlparams = ''
  
          if(parameters.container && parameters.container != '') {

            var detailDiv = document.getElementById(parameters.container) // elements container
           
            var inp = new Array(); // input type
            var sel = new Array(); // select type
            var txa = new Array(); // textarea type
            
            var inp = detailDiv.getElementsByTagName('input')
            var sel = detailDiv.getElementsByTagName('select')
            var txa = detailDiv.getElementsByTagName('textarea')
    
            var l = inp.length + sel.length + txa.length;
            var ch = new Array(l);
            
            var chi = 0;
            for(var i=0; i<inp.length; i++)  {
              ch[i + chi] = inp[i];
            }
            chi = chi + inp.length
            for(var i=0; i<sel.length; i++) {
              ch[i + chi] = sel[i];
            }
            chi = chi + sel.length
            for(var i=0; i<txa.length; i++) {
              ch[i + chi] = txa[i];
            }
            chi = chi + txa.length
    
            for( var i=0; i < ch.length; i++) {
    
              if(ch[i].name != '' && ch[i].form_owner == formOwner) {
    
                valued = true
                if (ch[i].type == 'checkbox') {
                  valued = ch[i].checked;
                }
                if (valued) {
                  if(ch[i].form_owner == formOwner) {
                    if (ch[i].type == 'select-multiple') {
                      for(opt=0; opt < ch[i].options.length; opt++) {
                        if(ch[i].options[opt].selected) {
                          parameters.urlparams = parameters.urlparams + sep + ch[i].name + '='+ch[i].options[opt].value
                          sep = '&'
                        }
                      }
                    } else {
                      var theValue = ch[i].value
                      if(parameters.magic_quotes) {
                        theValue = escape(theValue)
                      }
                      parameters.urlparams = parameters.urlparams + sep + ch[i].name + '='+ theValue
                      sep = '&'
                    }
                  }
                }
              }
            }
            
          } else {
            if (document.getElementById(parameters.formid))
              var theform = document.getElementById(parameters.formid);
            else
              var theform = document.getElementById('ctrl_form');
            for( i=0; i<theform.elements.length; i++) {
              if (theform.elements[i].name != '' && theform.elements[i].form_owner == formOwner) {
                valued = true
                if (theform.elements[i].type == 'checkbox') {
                  valued = theform.elements[i].checked;
                }
                if (valued) {
                  if(theform.elements[i].form_owner == formOwner) {
                    if (theform.elements[i].type == 'select-multiple') {
                      for(opt=0; opt<theform.elements[i].options.length; opt++) {
                        if(theform.elements[i].options[opt].selected) {
                          parameters.urlparams = parameters.urlparams + sep + theform.elements[i].name + '='+theform.elements[i].options[opt].value
                          sep = '&'
                        }
                      }
                    } else {
                      var theValue = theform.elements[i].value
                      if(parameters.magic_quotes) {
                        theValue = escape(theValue)
                      }
                      parameters.urlparams = parameters.urlparams + sep + theform.elements[i].name + '='+ theValue
                      sep = '&'
                    }
                  }
                }
              }
            }
          }
          
          if (parameters.method == 'ALWAYS_GET' && parameters.urlparams.length > 0) {
            url += (url.match(/\?/) ? '&' : '?') + parameters.urlparams;
            parameters.method = 'GET'
          } else parameters.method = 'POST';
        }
      }
    }
    url += (url.match(/\?/) ? '&' : '?') + 'requestId=' + parameters.requestId + '&requestProgIDs=' + requestProgIDs;
//alert(url)
               
    if(navigator.appName == 'Netscape') {
      xhtmlr.open(parameters.method, url.replace("+","%2B"), true);
    } else {
      
      if(parameters.asynch==0) {
        var asynCall = false;
      } else {
        var asynCall = true;
      }
    
      xhtmlr.open(parameters.method, url.replace("+","%2B"), asynCall);
    }
    xhtmlr.onreadystatechange = function() {
      
         if (requestComplete(xhtmlr, parameters.requestId, parameters.requestDate, parameters.requestUrl)) { // true if request complete with success

          // lista di tutti gli headers restituiti dal server
//alert(xhtmlr.getAllResponseHeaders());

// informazioni su un singolo header
//alert(xhtmlr.getResponseHeader("content-type"));

          if (parameters.debug == 1) {
	         	mywindow = window.open ('/fw/jsscript/popupDebug.Ajax.php?','popupDebug','width=700,height=500, scrollbars=yes');
						for (var i=0;i<100000;i++) {
							try {
		           	mywindow.document.getElementById('debugForm').debugArea.value =  xhtmlr.responseText;
		           	var _ok = 1;
							}
							catch (er) {
							}
							if (_ok == 1) i=100000;
	           }
	         }
	         
           if (parameters.type == 'handler') {
             parameters.handler(xhtmlr); // call my handler in a closed context, this mean it will see xhtmlr object as first parameters
           } else if (parameters.type == 'html') {
             //  hereiam
             // modifica dinamica area
             var newNode = document.createElement("div");
             newNode.style.display = 'none';
             newNode.innerHTML = xhtmlr.responseText;
             document.body.appendChild(newNode);
             if(document.getElementById('fw_change_area')) {
               sca = document.getElementById('fw_change_area').innerHTML;
               var fw_area = '';
               eval(sca)
               if (fw_area != '') parameters.area = fw_area;
             }
             //document.body.removeChild(newNode)
             newNode.parentNode.removeChild(newNode)
             
             /////
             document.getElementById(parameters.area).innerHTML = xhtmlr.responseText;
             if(document.getElementById('fw_change_area')) {
              document.getElementById('fw_change_area').parentNode.removeChild(document.getElementById('fw_change_area'));
             }
             
             if(parameters.runscript!='') {
               s = '';
               if (document.getElementById(parameters.area).document && document.getElementById(parameters.area).document.scripts) {
                 for(i=0; i< document.getElementById(parameters.area).document.scripts.length; i++) {

                   if (document.getElementById(parameters.area).document.scripts[i].id == parameters.runscript) {

                      if(document.getElementById(parameters.runscript)) s = s + document.getElementById(parameters.area).document.scripts[i].text;

                   }
                 }
               } else {
                 if(document.getElementById(parameters.runscript)) s = document.getElementById(parameters.runscript).innerHTML;
               }
               if(s!='') {
                 eval(s);
               } else {
                 if(document.getElementById(parameters.runscript)) s = document.getElementById(parameters.runscript).innerHTML;
                 if(s!='') {
                   eval(s);
                 }
              }
             }
             
             if (parameters.handler) parameters.handler();
             if (parameters.onload!='') {
                 var fn = new String(parameters.onload);
                 fnArr = fn.split(';')
                 for(i=0; i<fnArr.length; i++) {
                   try {
                     eval(fnArr[i]);
                   } catch(er) {}
                 }
             }
           } else if (parameters.type == 'javascript') {
             try {
               eval(xhtmlr.responseText);
             } catch(er) { // log the javascript responsible for the error
               //var url = '/jsscript/ajaxLogger.php?errname=' + er.name + '&linenr=' + er.lineNumber + '&errmsg=' + er.message + '&log=' + xhtmlr.responseText;
               //var params = { method : 'GET'
               //              ,urlparams : ''
               //              ,asynch : 1
               //              ,type : 'noresponse'
               //              ,debug : 0
               //             };
               //err = ajaxAce( url, params); // recursive call
               alert('err : ' + er.name + ' ' + er.message + ' at line:' + er.lineNumber)
             }
           } else if (parameters.type == 'noresponse') {
             // nop
           } else {
             alert('You must supply correct \'type\' parameter!');
           }
         } else {
           // gestione del retry
           
          if (xhtmlr.readyState == 4) {
            if (xhtmlr.status == 500000 || xhtmlr.status == 408 || xhtmlr.status == 504 || xhtmlr.status == 3507 || xhtmlr.status == 12002 || xhtmlr.status == 12007 || xhtmlr.status == 12029 || xhtmlr.status == 12030 || xhtmlr.status == 12031 || xhtmlr.status == 12152) {

              parameters.requestTry++;
              if (parameters.requestTry <= parameters.requestRetry) {
               var orsc = xhtmlr.onreadystatechange;
               var xhtmlrREQstatus = xhtmlr.status
               
               xhtmlr.onreadystatechange = function(){return;};
               xhtmlr.abort();
               
               requestProgIDs = ''
               xhtmlr = crea_http_req();
               xhtmlr.onreadystatechange = orsc;
               // test sul codice
               url += (url.match(/\?/) ? '&' : '?') + 'requestTry=' + parameters.requestTry;
               //url = url +'requestTry=' + parameters.requestTry;
               url = url +'&retryFor=' + xhtmlrREQstatus;
               url = url +'&requestId=' + parameters.requestId;
               url = url +'&requestProgIDs=' + requestProgIDs;
               

                if(navigator.appName == 'Netscape') {
                  xhtmlr.open(parameters.method, url.replace("+","%2B"), true);
                } else {
                  
                  if(parameters.asynch==0) {
                    var asynCall = false;
                  } else {
                    var asynCall = true;
                  }
                
                  xhtmlr.open(parameters.method, url.replace("+","%2B"), asynCall);
                }
                
    
                if (parameters.method == 'POST' && parameters.urlparams.length > 0) {
                  //xhtmlr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=latin1');
                  xhtmlr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                  var rp = parameters.urlparams.replace(/\+/g,"%2B")
                  xhtmlr.setRequestHeader("Content-length", rp.length);
                  xhtmlr.setRequestHeader("Connection", "close");
                  xhtmlr.send(parameters.urlparams.replace(/\+/g,"%2B"));
                } else {
                  xhtmlr.send(null);
                }
              } else {
                
                var txtErr = 'ERRORE sul SERVER! (in retray) comunicate il seguente codice ['+xhtmlr.status+']\r\n\r\n'
                             +' e il seguente testo ['+ xhtmlr.responseText+']\r\n\r\n'
                             +xhtmlr.getAllResponseHeaders();
               	mywindow = window.open ('/fw/jsscript/popupDebug.Ajax.php?','popupDebug','width=700,height=500, scrollbars=yes');
               	var _ok = 0
          			for (var i=0;i<100000;i++) {
          				try {
                   	mywindow.document.getElementById('debugForm').debugArea.value =  txtErr;
                   	var _ok = 1;
          				}
          				catch (er) {
          				}
          				if (_ok == 1) i=100000;
                }
          			if (_ok == 1) {
                 	mywindow.document.getElementById('debugForm').submit();
          			}                
                
              }
              
            }
              
          }
    
           
         }
       } // fine onReadyStatechange
    if (parameters.method == 'POST' && parameters.urlparams.length > 0) {
      //xhtmlr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=latin1');
      xhtmlr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      var rp = parameters.urlparams.replace(/\+/g,"%2B")
      xhtmlr.setRequestHeader("Content-length", rp.length);
      xhtmlr.setRequestHeader("Connection", "close");
      xhtmlr.send(parameters.urlparams.replace(/\+/g,"%2B"));
    } else {
      xhtmlr.send(null);
    }
    return 0;
  } else {
    return 1;
  }

}
/** errore 12030 12031
1. Only use POST if you're actually submitting FORM data (no data but still using POST upsets it, use GET if there's not data or only QUERY data to send).

2. When submitting FORM data, ensure there is no preceding '?' (e.g. ?P1=V1&P2=V2 is wrong, but P1=V1&P2=V2 is fine)

3. If POSTing data, set the HEADer of your request using the following:
    Content-Type: application/x-www-form-urlencoded    (This should also be set when using the GET method)
    Content-Length: (Length of FORM data) (Length of FORM data - without a preceding '?')
    Content-Disposition: form-data; name="YourAppName"
**/

//***************************************
// HELPER FUNCTIONS
//***************************************


/**
* helper
* extend Object javascript class adding it a function to emulate class derivation
* the destination class will be extended with method and function in source class
*/
Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
}

/**
* function getXmlHttpRequest
*  helper function
*  cross browser http object getter
*  @return   mixed     return a XMLHttpRequest object or false on error
* 
*/
function getXmlHttpRequest() {
  var request = false;
  try {
    request = new XMLHttpRequest();
  } catch (trymicrosoft) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (othermicrosoft) {
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        request = false;
      }
    }
  }
  return request;
}

function getAXO() {
  var xmlDOM = false
  if (navigator.appName == 'Microsoft Internet Explorer') {
    //var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.3.0'];
    var progIDs = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP'];
    
    for (var i = 0; i < progIDs.length; i++) {
      try {
        var xmlDOM = new ActiveXObject(progIDs[i]);
        requestProgIDs = progIDs[i]
        return xmlDOM
      } catch (ex) {
      }
    }
    return false;
  }
}
function crea_http_req() {
  
  
  var req = false;  
  
  if (navigator.appName == 'Microsoft Internet Explorer') {
    req = getAXO();
  } else {
    if (typeof XMLHttpRequest != "undefined") {
      req = new XMLHttpRequest();
    }
    if (!req && typeof ActiveXObject != "undefined") {   
        try {   
            req=new ActiveXObject("Msxml2.XMLHTTP"); 
        } catch (e1) {   
            try {   
                req=new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e2) {   
                try {   
                    req=new ActiveXObject("Msxml2.XMLHTTP.4.0");
                } catch (e3) {   
                    req=null;   
                }   
            }   
        }   
    }   
  }
  
    if(!req && window.createRequest) {
      req = window.createRequest();
    }
    if (!req) alert("Il browser non supporta AJAX");   
  
    return req;
}

/**
* function requestComplete
* helper function
* check a request state for completeness
* @return    boolean     true if http request was succesful complete, false otherwise
*                        **warning** a false result mean both error on completion and running request
*/
function requestComplete(request, rId, rDate, rUrl) {
  if (request.readyState == 4) {
    if (request.status == 200) {
      return true; 
    } else {
      if (request.status != 500000 && request.status != 408 && request.status != 504 && request.status != 3507 && request.status != 12002 && request.status != 12007 && request.status != 12029 && request.status != 12030 && request.status != 12031 && request.status != 12152) {
        var txtErr = 'ERRORE sul SERVER! comunicate il seguente codice ['+request.status+'/'+rId+' alle '+rDate+']\r\n\r\n'
                     +' url ['+ rUrl+']\r\n\r\n'
                     +' url ['+ requestProgIDs+']\r\n\r\n'
                     +' e il seguente testo ['+ request.responseText+']\r\n\r\n'
                     +request.getAllResponseHeaders();
       	mywindow = window.open ('/fw/jsscript/popupDebug.Ajax.php?','popupDebug','width=700,height=500, scrollbars=yes');
       	var _ok = 0
  			for (var i=0;i<100000;i++) {
  				try {
           	mywindow.document.getElementById('debugForm').debugArea.value =  txtErr;
           	var _ok = 1;
  				}
  				catch (er) {
  				}
  				if (_ok == 1) i=100000;
        }
  			if (_ok == 1) {
         	mywindow.document.getElementById('debugForm').submit();
  			}
      }
      return false;
    }
  } else {
    return false;
  }
}

