Array.prototype.remove = function(s)
{
	var index = this.indexOf(s);
	if (this.indexOf(s) != -1) 
	{
		this.splice(i, 1);
	}
}

var g_pending_requests = new Array()
var g_processing_requests = new Array()

function CalcRequest(block, idx, data)
{
	this.block = block;
	this.index = idx;
	this.data = data;
}

function highlightExpr(htext)
{
	return("<span style='color: #cc0000'><u>" + htext + "</u></span>");
}

function addResult(expr, result)
{	
	var resultText;

	// check if expression caused a syntax error
	if (result.error)
	{
		resultText = result.error.msg;
		var start = parseInt(result.error.pos - 1) + 1;
		var end = start + parseInt(result.error.len);

		//resultText = '[' + start + ',' + end + ',' + expr.length + '] ' + resultText;

		if (start >= expr.length)
		{
			start = expr.length;
			end = start + 1;
			expr = expr + '?';
		}

		var modifiedExpr = expr.substring(0, start);
		modifiedExpr += highlightExpr(expr.substring(start, end));
		modifiedExpr += expr.substring(end, expr.length);
		expr = modifiedExpr;
	} 
	else 
	{
		resultText = result.value;
	}

	addListItem('expr_list', resultText, 'result');	
	addListItem('expr_list', expr, 'expr');

	popLast();
}

function popLast() {
	var list_items = $('expr_list').getElementsBySelector('li');

	if (list_items.size() > 10) {
		for (x = list_items.size() - 1 ; x > 9; x--) {
			Element.remove(list_items[x]);
		}
	}
}

function addListItem(listID, text, cssClass) {
	var list_item = document.createElement('li');
	Element.extend(list_item);
	list_item.innerHTML = text;
	list_item.addClassName(cssClass);

	$(listID).insertBefore(list_item, $(listID).firstChild);
}

window.onload = function() { 
	$("inputBox").select();
	$("inputBox").observe('keyup', respondToEnterKey);
	$("aboutBtn").observe('click', showAbout);
	$("helpBtn").observe('click', showHelp);
	$$('#varTable td').each(function (item) {
		item.innerHTML = item.innerHTML.split("").join("<wbr/>") ;
	});
}

function showAbout(event) {
	$('help').style.display = 'none';
	$('about').style.display = 'block';
}

function showHelp(event) {
	$('about').style.display = 'none';
	$('help').style.display = 'block';
}


function respondToEnterKey(event) 
{
	if (event.keyCode == Event.KEY_RETURN)
	evaluateExpression(event);
}

function evaluateExpression(event) 
{
	if ($('inputBox').value.length == 0)
	{
		$('inputBox').focus();
		return;
	}

	// break into lines
	new_lines = $('inputBox').value.split(";");
	for (i=0; i < new_lines.length; i++)
	{
		if (new_lines[i].length > 0)
		{
			request = new CalcRequest(0, i, new_lines[i]);
			g_pending_requests.push(request);
		}
	}

	// chain Ajax requests until the lines array is empty
	performRequests(g_pending_requests.shift());
}

function performRequests(request)
{
	g_processing_requests[request.block + ':' + request.index] = request;
	new Ajax.Request('/parse/' + request.block + '/' + request.index + '/' + request.data , 
	{
		method: 'get',

		onSuccess: function(transport) 
		{
			var resultObj = transport.responseText.evalJSON();
			
			// TODO: If result is an error, clear the pending requests of any requests of the same block id
			
			key = resultObj.request.block + ':' + resultObj.request.index;
			
			addResult(g_processing_requests[key].data, resultObj);
			processVars(resultObj);
			
			g_processing_requests.remove(key)
			
			if (g_pending_requests.length > 0)
			{
				performRequests(g_pending_requests.shift());
			}
			else
			{
				$('inputBox').select();
			}
		},

		onFailure: function(transport) 
		{
			list_item = addResult('', 'System error! Try again later.');
			list_item.addClassName('error');
			
			// clear pending and processing queues
			g_pending_requests.clear();
			g_processing_requests.clear();
			
			$('inputBox').select();
		}
	});	
}


