// Verb functions are actions taken driven by the returned JSON.

var replaceBlock = function (block, content) {
	$(block).innerHTML = content;
	Behavior.apply();
}

var addMessage = function (type, content) {
	message = DIV({'class': 'message ' + type});
	message.innerHTML = content;
	replaceChildNodes($('feedbackMessages'), message);
}

var refreshPage = function (page) {
	var d = MochiKit.Async.wait(1, page);
	d.addCallback(function (page) {
		window.location = page;
	});
}

// END verb functions


var callbackCount = 0; // This is the counter to see how many callbacks are still open.

var makeCallback = function (url, params) {
	var req = MochiKit.Async.getXMLHttpRequest();
	req.open("POST", url, true);
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.setRequestHeader('Accept', 'application/json');

	var d = MochiKit.Async.sendXMLHttpRequest(req, params);
	d.addCallbacks(processControl, processError);


	callbackCount += 1;
	setStatusIndicator();
}

var processControl = function (transport) {
	message = evalJSON(transport.responseText);
	if (!Array.prototype.isPrototypeOf(message)) {
		message = new Array(message);
	}
	forEach (message, function (message) {
		processControlMsg(message);
	});

	callbackCount -= 1;
	setStatusIndicator();
}

var processError = function (transport) {
	message = {}
	message.command = 'error';
	message.content = '<p>There was an error connecting to the server. Please refresh your browser.</p>';
	processControlMsg(message);

	callbackCount -= 1;
	setStatusIndicator();
}

var processControlMsg = function (message) {
	switch(message.command) {
		case 'replace':
			// replace block
			replaceBlock(message.block, message.content);
			break;
		case 'refresh':
			// send to a new page
			refreshPage(message.content);
			break;
		case 'success':
		case 'information':
		case 'error':
			// add message to message block
			addMessage(message.command, message.content);
			break;
		default:
			// error
			addMessage('error', message.content);
			break;
	}
}

var setStatusIndicator = function () {
	var indicator = $('statusIndicator');

	if (indicator != null) {

		if (callbackCount > 0) {
			if (hasElementClass(indicator, "invisible")) {
				removeElementClass(indicator, "invisible");
				document.getElementsByTagName('body')[0].style.cursor = 'progress';
			}
		} else {
			if (!hasElementClass(indicator, "invisible")) {
				addElementClass(indicator, "invisible");
				document.getElementsByTagName('body')[0].style.cursor = 'auto';
			}
		}

	}
}
