/******************************************
 * The Crumbs AJAX Request Class
 ******************************************/
if (typeof crumbs == "undefined" || !crumbs)
    var crumbs = {};
if (typeof crumbs.Ajax == "undefined" || !crumbs.Ajax)
    crumbs.Ajax = {};

crumbs.Ajax.Request = Class.create(Ajax.Request, {
	/**
	 * Constructor
	 *
	 * @param string url: The Request URL
	 * @param hash options: See http://www.prototypejs.org/api/ajax/options
	 */
	initialize: function ($super, url, options) {
		if (!options)
			options = {};
		if (!options['parameters'])
			options['parameters'] = {isAjax: 1};
		else
			options['parameters']['isAjax'] = 1;
			
		$super(url, options);
	}
});

function callInProgress (xmlhttp) {
	switch (xmlhttp.readyState) {
		case 1: 
		case 2: 
		case 3:
			return true;
			break;
		// Case 4 and 0
		default:
			return false;
			break;
	}
}

function showFailureMessage() {
	var message = "Sorry, but an internal server error was detected and you request could not be completed.  Please try again later.";
	if (screenManager) { 
		screenManager.getMessage().setUnstyledMessage(message);
		screenManager.getMessage().showMessage();
	}
}

function hideTimeoutMessage () {
	if (screenManager) 
		screenManager.getMessage().hideMessage();
}

// Register global responders that will occur on all AJAX requests
Ajax.Responders.register({
	onCreate: function(request) {
		hideTimeoutMessage();
		request['timeoutId'] = window.setTimeout(function() {
			// If we have hit the timeout and the AJAX request is active, abort it and let the user know
			if (callInProgress(request.transport)) {
				request.transport.abort();
				showFailureMessage();
				// Run the onFailure method if we set one up when creating the AJAX object
				if (request.options['onFailure']) {
					request.options['onFailure'](request.transport);
				}
			}
		}, 30000);  // 30 seconds
	},
	onComplete: function(request) {
		// Clear the timeout, the request completed ok
		window.clearTimeout(request['timeoutId']);
	}
});
