//***************************************
// 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
*/
function ajaxAce(url, parms) {

  // 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'
                    ,debug     : 0         // set to 1 to display result from server in a javascript alert window 
                   } 
 
  // extend and override default parameters with those received by caller
  Object.extend(parameters, parms || {});

  var xhtmlr = getXmlHttpRequest();
  if (xhtmlr) {
    //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 != '') {
            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 {
                  parameters.urlparams = parameters.urlparams + sep + theform.elements[i].name + '='+theform.elements[i].value
                  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';
        }
      }
    }
    if(navigator.appName == 'Netscape')
      xhtmlr.open(parameters.method, url.replace("+","%2B"), 1);
    else
      xhtmlr.open(parameters.method, url.replace("+","%2B"), parameters.asynch);
    xhtmlr.onreadystatechange = function() {
         if (requestComplete(xhtmlr)) { // 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;
	           }
	         }
	         //alert(xhtmlr.getAllResponseHeaders())
           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 = document.getElementById(parameters.area).document.scripts[i].text;

                   }
                 }
               } 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!');
           }
         }
       }
    if (parameters.method == 'POST' && parameters.urlparams.length > 0) {
      xhtmlr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=latin9');
      xhtmlr.setRequestHeader("connection", "close");
      xhtmlr.send(parameters.urlparams);
    } else {
      xhtmlr.send(null);
    }
    return 0;
  } else {
    return 1;
  }

}

//***************************************
// 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 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) {
  if (request.readyState == 4) {
    if (request.status == 200) {
      return true; 
    } else {
      alert('Server Error : check server side script\r\n-------below the result page---------\r\n\r\n' + request.responseText);
      return false;
    }
  } else {
    return false;
  }
}
