var chistory = new Array();
var cindex = -1;
var API_URL = "api/konsole.php";
var JSONCRIB = "JSONDATA:";

function dispatch(command, input)
{
	chistory.push(command);
	cindex = chistory.length;
	
	var subcommands = command.split(">");
	var parts = command.split(" ");
	var keyword = parts[0];
	
	if (keyword == "help")
	{
		echo("List of commands:");
		echo("\t<strong>notes<"+"/strong>: gets a your latest thought stream");
		echo("\t<strong>note<"+"/strong>: make a note to your thought stream");
		echo("\t<strong>cls<"+"/strong>: clear the console");
	}
	else if (keyword == "grep" && input != null)
	{
		for (var i = 0; i < input.length; i++)
		{
			if (input[i].match(parts[1]) != null)
			{
				echo(data[i]);
			}
		}
	}
	else if (keyword == "authorize")
	{
		$("#prompt").hide();
		var passInput = $("<input>").attr("type","password").addClass("prompt").insertAfter("#prompt").focus();
		passInput.keydown(function(e) {
			if (e.keyCode == 13) {
				$("#prompt").show().focus();
				dispatch("sudo " + $(this).val());
				$(this).remove();
				return false;
			}	
		},passInput);
	}
	else if (keyword == "cls")
	{
		$(".console-line").hide();
	}
	else
	{
		$.ajax({
			url: API_URL,
			dataType: 'text',
			type: "POST",
			data: { command: command },
			success: function(response) {responseHandler(keyword,response)},
			error: responseError
		});
	}
}

function clientResponse(keyword, responseData)
{
	if (keyword == "sudo")
	{
		setCookie("authToken",responseData[0],1);
	}
}

function receive(command, data)
{
	var route = command.indexOf(">");
	if (route < 0)
	{
		for (var i = 0; i < data.length; i++)
		{
			echo(data[i]);
		}
	}
	else
	{
		dispatch(command.substring(route+1).trim(), data);
	}
}

function echo(data, className)
{
	if (typeof(data) != "string")
	{
		if (data.classname)
		{
			echo(data.value, data.classname)
		}
		else
		{
			for (var i = 0; i < data.length; i++)
			{
				echo(data[i], className);
			}
		}
	}
	else
	{
		text = data.replace(/\t/,"<div class='tab'>&nbsp;<"+"/div>");
		$("<div>").html(text).addClass("console-line").addClass(className).insertBefore("#prompt");
		$("#primaryMonitor").scrollTop($("#primaryMonitor").get(0).scrollHeight);
	}
}

function responseError(data, t, e)
{
	echo("response error: " + t);
	echo("\t" + data.responseText);
}

function setCookie(c_name,value,exdays)
{
	var exdate=new Date();
	exdate.setDate(exdate.getDate() + exdays);
	var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
	document.cookie=c_name + "=" + c_value;
}

function output(data)
{
	$("<div>").html(data).addClass("console-line").insertBefore("#prompt");
}

function responseHandler(command, text)
{	
	var jsonIndex = text.indexOf(JSONCRIB);
	if (jsonIndex != -1)
	{
		if (jsonIndex != 0) {
			// Non JSON data
			echo(text.substring(0,jsonIndex).trim(),"notice");
		}
		var data = jQuery.parseJSON(text.substring(jsonIndex + JSONCRIB.length));
		clientResponse(command, data);
		echo(data);
	}
	else
	{
		echo(text);
	}
}

function prepEncryptionString(key) {
	key.replace(/[ e]/g,"");
}
