Ajax.Responders.register( {
  onCreate : function( request ) {
    if ( request.options.asynchronous ) {
      document.body.style.cursor = 'progress';
    } else {
      document.body.style.cursor = 'wait';
    }
  },

  onComplete : function() {
    document.body.style.cursor = 'auto';
  }
} );

var AjaxApplication = Class.create();
AjaxApplication.prototype = Object.extend( new Object, {
  initialize : function() {
  },

  get : function( url, params, success, failure, options ) {
    options = options || {};
    options['method'] = 'get';
    return this._request( url, params, success, failure, options );
  },

  post : function( url, params, success, failure, options ) {
    options = options || {};
    options['method'] = 'post';
    return this._request( url, params, success, failure, options );
  },

  _request : function( url, params, success, failure, options ) {
    if ( typeof params == 'object' ) {
      options['parameters'] = $H( params ).toQueryString();
    } else if ( typeof params == 'string' ) {
      options['parameters'] = params;
    }

    options['onSuccess'] = function( ajax, result ) {
      result = this._response( ajax, result );
      success( ajax, result );
    }.bind(this);

    options['onFailure'] = function( ajax, result ) {
      result = this._response( ajax, result );
      failure( ajax, result );
    }.bind(this);

    if ( !options['onException'] ) {
      options['onException'] = function( request, error ) {
/* error.stack; */
        console.error( error.name + ': ' + error.message + ( error.fileName ? ' at ' + error.fileName + ( error.lineNumber ? ':' + error.lineNumber : '' ) : '' ) );
      }
    }

    return new Ajax.Request( url, options );
  },

  _response : function( ajax, result ) {
    if ( !result ) {
      if ( ajax.responseXML && ajax.responseXML.documentElement ) {
        result = ajax.responseXML;
      } else {
        try {
          result = eval( '(' + ajax.responseText + ')' );
        } catch (e) {
          result = ajax.responseText;
        }
      }
    }
    return result;
  }
} );