/******************************************************************************/
function HttpRequest()
{
  var tentativi = 3;
  var TIMEOUT = 10*1000;
  var _timeout = 0;
  var request = null;
  var startTime = 0;
  var _functionException = null;
  var _functionError = null;
  var _functionAbort = null;
  var _functionOperationComplete = null;
  
  function functionException()
  {
    remove();
    if (_functionException)
      _functionException();  
  }
  
  function functionAbort()
  {
    remove();
    if (_functionAbort)
      _functionAbort();  
  };  

  function functionError()
  {
    remove();
    if (_functionError)
      _functionError();  
  };
  
  function functionOperationComplete(obj)
  {
    remove();
    if (_functionOperationComplete)
      _functionOperationComplete(obj);  
  };  
  
  function sendRequest(url,elem)
  {
    try
    {
      if (request == null)
        return false;
      startTime = new Date().getTime();
      _timeout = setTimeout(function(){gestioneTimeout(url,elem);},TIMEOUT);
      request.open("POST",url,true);
      request.onreadystatechange = function(){ready();};
      request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");              
      request.send(elem);
      return true;
    }
    catch(e)
    {
      return false;
    }
  };
  
  function ready()
  {
    if (request == null)
      return;
    
    try
    {
      if (request.readyState == 4)
      {
        clearTimeout(_timeout);        
        if (request.status == 200)
        {
          var responseText = request.responseText;          
          if (responseText)
          {
            var objResp = null;
            responseText = responseText.replace(/\s+$|^\s+/g,"");
            if (responseText.charAt(0) == "{")
              objResp = eval("(" + responseText + ")");
            else
            {
              if (responseText.charAt(0) == "[")
                objResp = eval(responseText);
              else
                objResp = {html:responseText};
            }
            remove();
            functionOperationComplete(objResp);
          }      
          else
            functionError();
        }
        else
          functionError(); 
      }
      else
      {
        var currTime = new Date().getTime();
        if ((currTime - startTime) > TIMEOUT)
          gestioneTimeout();
      }      
    }
    catch(e)
    {
      clearTimeout(_timeout);    
      functionException();
    } 
  };
  
  function gestioneTimeout(url,elem)
  {
    tentativi--;
    clearTimeout(_timeout);
    abort();
    if (tentativi > 0)
      setTimeout(function(){sendRequest(url,elem);},TIMEOUT);
    else
      functionAbort();
  }
  
  function abort()
  {
    try{
      if (request){
        request.abort();
        request.onreadystatechange = function(){};
      }
    }catch(e){}
  }
  
  function remove()
  {
    if (request == null)
      return;
    request.onreadystatechange = function(){};
    request.abort();
    request = null;
  }
  
  function init()
  {
    if (window.XMLHttpRequest)
      request = new XMLHttpRequest();
    else
    {
      if (window.ActiveXObject)
      {
        try{
          request = new window.ActiveXObject("Microsoft.XMLHTTP");
          if (request == null)
            request = new window.ActiveXObject("Msxnl2.XMLHTTP");
        }catch(e){}
      }
    }
  }
  
  init();
     
  return {
    send : function(url,elem){
      return sendRequest(url,elem);
    },  
    abort : function(){
      abort();
    },
    setFunctionError : function(funz){
      _functionError = funz;
    },
    setFunctionException : function(funz){
      _functionException = funz;
    },
    setFunctionAbort : function(funz){
      _functionAbort = funz;
    },
    setFunctionOperationComplete : function(funz){
      _functionOperationComplete = funz;
    }    
  };    
}
/******************************************************************************/