
function AJAX()
{
  this.Method = 'GET';
  this.URL    = '';
  this.Async  = true;
  this.Params = '';

  this.OnChange   = function() {};
  this.OnComplete = function() {};
  this.OnError    = function() {};
  this.OnTimeout  = null;
  this.Timeout    = 0;
  this.Data       = null;
  this.AbortTimeout   = null;
  this.AbortInterval  = 5000;

  var oRequest = null;

  // need this to hold a reference to this object.
  var me = this;

  if( window.ActiveXObject )
  {
    var XMLHttpVersions =
    [
      'MSXML2.XMLHTTP.6.0',
      'MSXML2.XMLHTTP.5.0',
      'MSXML2.XMLHTTP.4.0',
      'MSXML2.XMLHTTP.3.0',
      'MSXML2.XMLHTTP',
      'Microsoft.XMLHTTP'
    ];

    for( var i = 0; i < XMLHttpVersions.length && !oRequest; i++ )
    {
      try
      {
        oRequest = new ActiveXObject(XMLHttpVersions[i]);
      }
      catch (e)
      {
      }
    }
  }
  else if( window.XMLHttpRequest )
  {
    oRequest = new XMLHttpRequest();
  }

  this.IsValid = function()
  {
    return( oRequest != null );
  };

  this.Send = function()
  {
    oRequest.open( this.Method, this.URL, this.Async );
    this.AbortTimeout = setTimeout( function() { oRequest.abort(); }, this.AbortInterval );

    switch( this.Method.toUpperCase() )
    {
      case "GET":
        break;

      case "POST":
        oRequest.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
        break;

      default:
        break;
    }

    oRequest.onreadystatechange = function()
    {
      me.OnChange( oRequest, me.Data );

      if( oRequest.readyState == 4 )
      {
        clearTimeout( me.AbortTimeout );

        if( oRequest.status == 200 )
        {
          me.OnComplete( oRequest, me.Data );

          if( me.OnTimeout && me.Timeout )
            setTimeout( me.OnTimeout, me.Timeout );
        }
        else
        {
          me.OnError( oRequest, me.Data );
        }

        oRequest = null;
        delete me;
      }
    };

    oRequest.send( this.Params );
  };

  this.SetTimeout = function( afnOnTimeout, anTimeout )
  {
    this.OnTimeout = afnOnTimeout;
    this.Timeout  = anTimeout;
  };
}

function CellAjax( xmlCell, fm, action, fields, fOnError )
{
  var o;
  var a = new AJAX();
  a.URL = URL.Page( "Ajax", "Cell", { cell: xmlCell } );

  var params = ( fm ) ? Form.MakeGetURL( fm ) : "";
  params = NVP.Set( params , "act" , action );

  o = document.getElementById( xmlCell + "_title" );
  if( o && o.className.length )
    params = NVP.Set( params, "cell_class_title", o.className );

  o = document.getElementById( xmlCell + "_content" );
  if( o && o.className.length )
    params = NVP.Set( params, "cell_class_content", o.className );

  if( fields )
  {
    for( field in fields )
    {
      params = NVP.Set( params, field, fields[field] );
    }
  }

  if( fOnError )
    a.OnError = fOnError;

  a.Params = params;
  a.Method = "POST";
  a.OnComplete =
    function( xmlRequest, xmlCell )
    {
      var o = document.getElementById( xmlCell );
      if( o )
      {
        o.innerHTML = xmlRequest.responseText;
        o.onLoad = DoRoundedCorners( o );
      }
      else
      {
        alert( 'Cannot find cell '+xmlCell );
      }
    };
  a.Data = xmlCell;
  a.Send();
}

function Cell_UserReference_Toggle( typ_id, ref_id, selector )
{
  var a = new AJAX();
  a.URL = URL.Page( "Ajax", "Cell", { cell:"UserReference", act:"ToggleReference", typ_id: typ_id, ref_id: ref_id } );
  a.OnError = function( xmlRequest, data )
  {
    alert( "Error: " + xmlRequest.status );
  }
  a.OnComplete = function( xmlRequest, data )
  {
    var x = DomNodeToObject( xmlRequest.responseXML.documentElement );
    var o = document.getElementById( selector );
    if( o )
    {
      if( x.error )
        alert( x.error )
      else
        o.innerHTML = x.linktext;
    }
    else
      alert( "Unable to locate link: " + selector );
  }
  a.Method = "POST";
  a.Send();
}
