function AjaxRequest() {
  //Member Data
  this.request = null;
  this.argsLoading = null;
  this.argsLoaded = null;
  this.argsInteractive = null;
  this.argsComplete = null;
  this.pfnLoading = null;
  this.pfnLoaded = null;
  this.pfnInteractive = null;
  this.pfnComplete = null;
  this.bXMLresponse = true;

  //Public
  this.getURL = Ajax_getURL;
  this.postURL = Ajax_postURL;
  this.destroy = Ajax_destroy;

  //Private
  this.checkStatus = Ajax_checkStatus;
  this.stateChange = Ajax_stateChange;
  this.send = Ajax_send;
}

function Ajax_getURL( ajax, szURL, pfnCB ) {
  this.send( ajax, 'GET', szURL, pfnCB, null, false );
}

function Ajax_postURL( ajax, szURL, pfnCB, pData ) {
  this.send( ajax, 'POST', szURL, pfnCB, pData, true );
}

function Ajax_destroy( ajax ) {
  if ( ajax.request ) { delete ajax.request; }
}

function Ajax_checkStatus( ajax ) {
  var bOK = false;

  if ( ajax.request != null ) {
    try {
      if ( ajax.request.status == 200 ) {
        bOK = true;
      } else {
      }
    } catch(e) {
    }
  }

  return bOK;
}

function Ajax_stateChange( ajax ) {
  if ( ajax.request != null ) {
    switch( ajax.request.readyState ) {
      case 1:
        if ( ajax.pfnLoading ) {
          ajax.pfnLoading( ajax.argsLoading );
        }
        break;
      case 2:
        if ( ajax.pfnLoaded ) {
          ajax.pfnLoaded( ajax.argsLoaded );
        }
        break;
      case 3:
        if ( ajax.pfnInteractive ) {
          ajax.pfnInteractive( ajax.argsInteractive );
        }
        break;
      case 4:
        if ( ajax.checkStatus( ajax ) ) {
          if ( ajax.pfnComplete ) {
            if ( ajax.bXMLresponse ) {
              if ( ajax.argsComplete ) {
                ajax.pfnComplete( ajax.request.responseXML, ajax.argsComplete );
              } else {
                ajax.pfnComplete( ajax.request.responseXML );
              }
            } else {
              if ( ajax.argsComplete ) {
                ajax.pfnComplete( ajax.request.responseText, ajax.argsComplete );
              } else {
                ajax.pfnComplete( ajax.request.responseText );
              }
            }
          }
        }
        ajax.destroy( ajax );
        break;
    }
  }
}

function Ajax_send( ajax, method, szURL, pfnCB, pData, bNoExtra ) {
  ajax.pfnComplete = pfnCB;

  if ( ! bNoExtra ) {
    szURL += ( ( szURL.indexOf('?') + 1 ) ? '&' : '?' ) + ( new Date() ).getTime();
  }

  try {
    if ( window.XMLHttpRequest ) {
      ajax.request = new XMLHttpRequest();
    } else if ( !navigator.__ice_version && window.ActiveXObject ) {
      try {
        ajax.request = new ActiveXObject( 'Msxml2.XMLHTTP' );
      } catch(e) {
        try {
          ajax.request = new ActiveXObject( 'Microsoft.XMLHTTP' );
        } catch(e) {
        }
      }
    }

    if ( this.request != null ) {
      ajax.request.onreadystatechange = function() { ajax.stateChange( ajax ); };
      ajax.request.open( method, szURL, true );

      if ( pData != null ) {
        ajax.request.setRequestHeader('Content-type','application/x-www-form-encoded; charset=UTF-8');
        ajax.request.setRequestHeader('Content-length',pData.length);
        ajax.request.setRequestHeader('Connection','close');
      }

      ajax.request.send( pData );
    }
  } catch(e) {
  }
}

function fetchXML( szURL, pfnCB ) {
  var ajax = new AjaxRequest();
  ajax.getURL( ajax, szURL, pfnCB );
}

