
function $(id) { return document.getElementById(id) ; }

function FactoryXMLHttpRequest() 
{
   if( window.XMLHttpRequest) 
   {
      return new XMLHttpRequest() ;
   }
   else if( window.ActiveXObject) 
   {
      var msxmls = new Array(
         'Msxml2.XMLHTTP.5.0',
         'Msxml2.XMLHTTP.4.0',
         'Msxml2.XMLHTTP.3.0',
         'Msxml2.XMLHTTP',
         'Microsoft.XMLHTTP') ;
      for (var i = 0 ; i < msxmls.length ; i++) 
      {
         try 
         {
            return new ActiveXObject(msxmls[i]) ;
         } 
         catch (e) 
         {
         }
      }
   }
   throw new Error( "Could not instantiate factory") ;
}

function Asynchronous() 
{
   this._xmlhttp = new FactoryXMLHttpRequest() ;
   this.username = null ;
   this.password = null ;
}

function Asynchronous_call( action, url, data) 
{
   //alert( "call: action="+action+" url="+url )  ;
   var instance = this ;
   this._xmlhttp.open( action, url, true, this.username, this.password ) ;
   this.openCallback( this._xmlhttp ) ;
   this._xmlhttp.onreadystatechange = function() 
   {
      switch( instance._xmlhttp.readyState ) 
      {
      case 1:
         instance.loading() ;
         break ;
      case 2:
         instance.loaded() ;
         break ;
      case 3:
         instance.interactive() ;
         break ;
      case 4:
         if( instance.complete ) 
         {
            try 
            {
               instance.complete( instance._xmlhttp.status, 
                                  instance._xmlhttp.statusText,
                                  instance._xmlhttp.responseText, 
                                  instance._xmlhttp.responseXML ) ;
            }
            catch (e) 
            {
            }
         }
         break ;
      }
   }
   try 
   {
      this._xmlhttp.send( data ) ;
   }
   catch( e) 
   {
   }
}

function Asynchronous_get( url ) 
{
   this.call( "GET", url, null ) ;
}

function Asynchronous_put( url, mimetype, datalength, data ) 
{
   this.openCallback = function( xmlhttp ) 
   {
      xmlhttp.setRequestHeader( "Content-type", mimetype) ;
      xmlhttp.setRequestHeader( "Content-Length", datalength) ;
   }
   this.call( "PUT", url, data ) ;
}

function Asynchronous_delete( url ) 
{
   this.call( "DELETE", url, null ) ;
}

function Asynchronous_post( url, mimetype, datalength, data ) 
{
   var thisReference = this ;
   this.userOpenCallback = this.openCallback ;
   this.openCallback = function( xmlhttp ) 
   {
      xmlhttp.setRequestHeader( "Content-type", mimetype) ;
      xmlhttp.setRequestHeader( "Content-Length", datalength) ;
      thisReference.userOpenCallback( xmlhttp) ;
      thisReference.openCallback = thisReference.userOpenCallback ;
   }
   this.call( "POST", url, data ) ;
}

function Asynchronous_openCallback( obj ) 
{ 
}
function Asynchronous_loading() 
{
}
function Asynchronous_loaded() 
{
}
function Asynchronous_interactive() 
{
}
function Asynchronous_complete( status, statusText, responseText, responseHTML ) 
{
}

Asynchronous.prototype.openCallback = Asynchronous_openCallback ;
Asynchronous.prototype.loading      = Asynchronous_loading ;
Asynchronous.prototype.loaded       = Asynchronous_loaded ;
Asynchronous.prototype.interactive  = Asynchronous_interactive ;
Asynchronous.prototype.complete     = Asynchronous_complete ;
Asynchronous.prototype.get          = Asynchronous_get ;
Asynchronous.prototype.put          = Asynchronous_put ;
Asynchronous.prototype.del          = Asynchronous_delete ;
Asynchronous.prototype.post         = Asynchronous_post ;
Asynchronous.prototype.call         = Asynchronous_call ;
