
function BGRequest() {
  var req;
  
  // branch for native XMLHttpRequest object
  if ( window.XMLHttpRequest ) {
    req = new XMLHttpRequest();
    try {
      req = new XMLHttpRequest();
      //req.overrideMimeType( 'text/xml' );
    } catch(e) {
      req = false;
    }
  // branch for IE/Windows ActiveX version
  } else if ( window.ActiveXObject ) {
    try {
      //req = new ActiveXObject( "Msxml2.XMLHTTP" ); // MSXML2.XMLHTTP.3.0
      req = new ActiveXObject( "MSXML2.XMLHTTP.3.0" );
    } catch(e) {
      try {
        req = new ActiveXObject( "Microsoft.XMLHTTP" );
      } catch(e) {
        req = false;
      }
    }
  }
  
  
  function loadXMLDoc(url) {
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
      req = new XMLHttpRequest();
      req.onreadystatechange = processReqChange;
      req.open("GET", url, true);
      req.send(null);
      // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
      req = new ActiveXObject("Microsoft.XMLHTTP");
      if (req) {
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send();
        }
      }
 }
  
  if ( req ) {
    
    prototype = {
      responseXML:  null,
      responseText: null,
      status:       null,
      ready:        true,
      
      onInit:       function() {},
      onComplete:   function() {},
      onError:      function( error_text ) {},
      
      open:         function( method, url ) {
        req.open( method, url, true );
      },
      send:         function( data ) {
        var prototype_object = this;
        req.onreadystatechange = function() {
          with ( prototype_object ) {
            if ( req.readyState == 0 ) {
              onInit();
            } else {
              if ( req.readyState == 4 ) {
                status = req.status;
                if ( req.status == 200 ) {
                  // Data recieved
                  responseXML = req.responseXML;
                  responseText = req.responseText;
                  onComplete();
                } else {
                  // There was a problem retrieving the data
                  responseText = req.responseText;
                  onError( responseText );
                }
              }
            }
          } // end with
        }
        
        //req.setRequestHeader( 'Pragma', 'no-cache' );
        //req.setRequestHeader( 'Cache-Control', 'no-cache' );
        req.send( data )
      },
      abort:        function() {
        req.abort();
      }
      
      /*
      
      getAllResponseHeaders()             Returns complete set of headers (labels and values) as a string
      getResponseHeader("headerLabel")    Returns the string value of a single header label
      setRequestHeader("label", "value")  Assigns a label/value pair to the header to be sent with a request
      
      */
    };
  
    
  } else {
    prototype = {
      ready: false
    };
  }
  
  return prototype;
}

/*

req = new BGRequest();
req.open( "GET", '/script.html' )
req.onInit = my_function_for_init_show;
req.onComplete = my_function( req );
req.send();

req.onreadystatechange = processReqChange;
req.open("GET", url, true);
req.send("");

*/