var load_succeeded = function ( success_target_name, error_target_name, request ) {
  result = evalJSONRequest( request );

  if ( result.error ) {
    if ( result.name ) {
      if ( typeof( names ) != "undefined" )
        result.name = names[ result.name ];
      result.name = result.name.replace( "_", " " );
      replaceChildNodes( error_target_name, 'The ' + result.name + ' value ' + result.message + '.' );
    } else {
      replaceChildNodes( error_target_name, result.message );
    }
    return;
  }

  if ( result.redirect ) {
    window.location = result.redirect;
    return;
  }

  if ( result.reload ) {
    window.location.reload();
    return;
  }

  if ( result.result_html ) {
    getElement( success_target_name ).innerHTML = result.result_html;
    username = getElement( 'username' );
    if ( username ) username.focus();
    return;
  }
}

var load_failed = function ( error_target_name, error ) {
  replaceChildNodes( error_target_name, 'Sorry, there was an error.' );
}

// invoke the given URL with a remote scripting call, providing the data from the given form. on
// success, this will replace the success_target_name element with the returned result HTML (if
// any). on failure, this will replace the error_target_name element with the returned result
// message. http_type should be 'POST' or 'GET'
function invoke( url, form, http_type, success_target_name, error_target_name ) {
  if ( form ) {
    var form = formContents( getElement( form ) );
    var names = form[ 0 ];
    var values = form[ 1 ];
  }

  if ( getElement( success_target_name ) )
    getElement( success_target_name ).innerHTML = 'Processing...';
  else if ( getElement( error_target_name ) )
    getElement( error_target_name ).innerHTML = 'Processing...';

  if ( error_target_name == null )
    error_target_name = success_target_name;

  if ( http_type == 'POST' ) {
    // HTTP POST
    request = getXMLHttpRequest();
    request.open( http_type, url, true );
    request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
    if ( form )
      var doc = sendXMLHttpRequest( request, queryString( names, values ) );
    else
      var doc = sendXMLHttpRequest( request );
  } else {
    // HTTP GET
    if ( form )
      var doc = doSimpleXMLHttpRequest( url, names, values );
    else
      var doc = doSimpleXMLHttpRequest( url );
  }

  doc.addCallbacks(
    partial( load_succeeded, success_target_name, error_target_name ),
    partial( load_failed, error_target_name )
  );
}

