/*
 * int13h Javascript Console
 */

var MAXCONSOLEHISTORY=20;
var consoleCmdHistory=new Array(MAXCONSOLEHISTORY);
var consoleCmdHistoryP=0;
var consoleCmdScroll=0;
var consoleOpen=false;
var consoleInit=false;
var consoleCmdCallBack=null;
	
$(document).ready(function(){
	$(document).bind('keydown', 'ctrl+shift+@', function(e){
		consoleToggle();
		return false;
	});
	$(document).bind('keydown', 'ctrl+shift+~', function(e){
		consoleToggle();
		return false;
	});

	$('#consolecommandline').bind('keydown', 'ctrl+shift+@', function(e){
		consoleToggle();
		return false;
	});
	$('#consolecommandline').bind('keydown', 'ctrl+shift+~', function(e){
		consoleToggle();
		return false;
	});
		
	$('#console').bind('click',function(e){
		$('#consolecommandline').focus();
		return false;
	});
	$('#console').bind('mouseenter',function(e){
		$('#consolecommandline').focus();
		return false;
	});
	$('#consolecommandline').bind('keydown','esc',function(e){
		consoleToggle();
		return false;
	});
	$('#consolecommandline').bind('keydown','ctrl+l',function(e){
		consoleClear();
		return false;
	});
	$('#consolecommandline').bind('keydown','up',function(e){
		consoleScrollCmdHistory('up');
		return false;
	});
	$('#consolecommandline').bind('keydown','down',function(e){
		consoleScrollCmdHistory('down');
		return false;
	});
	$('#consolecommandline').bind('keydown','return',function(e){
		consoleExecute();
		return false;		
	});
	$('#consolecommandline').bind('keydown','pageup',function(e){
		consoleScroll('up');
		return false;
	});
	$('#consolecommandline').bind('keydown','pagedown',function(e){
		consoleScroll('down');
		return false;
	});

	$('#consolehistory').bind("mousewheel", consoleMWheelScroll);
	$('#consolehistory').bind("DOMMouseScroll",consoleMWheelScroll);

	consoleLog('<span class="highlight">User Agent ...</span> '+navigator.userAgent);
	
	// Includes
	$('link').each(function (i){
		if(this.href.length)
			consoleLog('<span class="highlight">Loading '+this.type+'...</span> '+this.href);
	});
	$('script').each(function (i){
		if(this.src.length)
			consoleLog('<span class="highlight">Loading '+this.type+'...</span> '+this.src);
	});
	$('img').each(function (i){
		consoleLog('<span class="highlight">Loading Image...</span> '+this.src);
	});
	
	consoleLog('<span class="highlight">Loading Includes...</span> Done');
});

// Override alert()
function alert(msg){
	consoleLog('<span class="error">Caught Alert:</span> '+msg);
}
	
function consoleClear(){
	$('#consolescrollback').html('');
	return false;
}

function consoleMWheelScroll (e){
	if(e.wheelDelta){
		if(e.wheelDelta>0) consoleScroll('down');
		else consoleScroll('up');
	}else if(e.detail){
		if(e.detail>0) consoleScroll('down');
		else consoleScroll('up');
	}
}

function consoleSetCmdCallBack(cb){
	consoleCmdCallBack=cb;
}

function consoleScroll(dir){
	if(dir=='up')
		$("#consolehistory").animate({scrollTop: $("#consolehistory").scrollTop()-30 }, 10);
	else
		$("#consolehistory").animate({scrollTop: $("#consolehistory").scrollTop()+30 }, 10);
	return false;
}

function consoleScrollCmdHistory(dir){
	if(dir=='up')
		consoleCmdScroll--;
	else
		consoleCmdScroll++;

	if(consoleCmdScroll < 0){
		consoleCmdScroll=-1;
		$('#consolecommandline').val('');
		return;
	}else if(consoleCmdScroll > consoleCmdHistoryP){
		consoleCmdScroll=consoleCmdHistoryP+1;
		$('#consolecommandline').val('');
		return;
	}
	
	$('#consolecommandline').val(consoleCmdHistory[consoleCmdScroll]);
}
			
function consoleExecute(){
	var cmd=$.trim($('#consolecommandline').val());
	if(cmd.length < 1)
		return;
	var ret=consoleLookUpCmd(cmd);
	
	consoleCmdHistory[consoleCmdHistoryP]=cmd;
	if(consoleCmdHistoryP++ >= MAXCONSOLEHISTORY)
		consoleCmdHistoryP=0;
	consoleCmdScroll=consoleCmdHistoryP;
				
	if(ret.length > 0)
		if(ret!='AJAX')
			$('#consolehistory').html($('#consolehistory').html()+'<br>'+ret);
	$('#consolecommandline').val('');
	$("#consolehistory").css('top',0);
	consoleScrollRecent();
	return false;
}
			
function consoleLog(msg){
	$('#consolehistory').html($('#consolehistory').html()+'<br>'+msg);
}
			
function consoleLookUpCmd(rawcmd){
	var ret='';
	cmd=rawcmd.split(' ');
	switch(cmd[0]){
		case 'cowsay':
			var saytext=rawcmd.substr(7,80).replace(/(<([^>]+)>)/ig,"");
 			var cowsay=
				"<pre>&lt;&nbsp;\"<span class=\"highlight\">"+saytext+"</span>\"&nbsp;&gt;<br>"+
				"&nbsp;&nbsp;\\&nbsp;&nbsp;&nbsp;^__^<br>"+
				"&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;(oo)\_______<br>"+
				"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(__)\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)\\\/\\<br>"+
				"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||----w&nbsp;|<br>"+
				"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||<br></pre>";
			ret=cowsay; 
			break;
		case 'dialog':
			var text=rawcmd.substr(7,80).replace(/(<([^>]+)>)/ig,"");
			$("#dialogtext").text(text);
			$("#dialog").dialog('open');
			ret='AJAX';
			break;
		case 'history':
			ret+='<span class="highlight">Command History:</span><br>';
			if(consoleCmdHistoryP==0)
				ret+='&nbsp;&nbsp;&nbsp;Empty<br>';
			for(i=0;i<consoleCmdHistoryP;i++)
				ret+='&nbsp;&nbsp;&nbsp;'+parseInt(i+1)+': '+consoleCmdHistory[i]+'<br>';
			break;
		case 'load':
			$.post(__SITEROOT__+'Console.itf?request=load',function(data) {
				consoleLog(data.returntext);
				consoleScrollRecent();
			},'json');
			ret='AJAX';
			break;
		case 'new':
			location.href=__SITEROOT__+'new.html';
			break;
		case 'quit':
			location.href=__SITEROOT__+'shutdown.html';
			break;
		case 'ping':
			$.post(__SITEROOT__+'Console.itf?request=ping',
				{ping: new Date().getTime()},function(data){
					var pingtime=new Date().getTime();
					consoleLog('<span class="highlight">ping:</span> '+
						((parseInt(pingtime)-parseInt(data.returntext))/1000).toFixed(3)+'ms');
					consoleScrollRecent();
			},'json');
			ret='AJAX';
			break;		
		case 'uptime':
			$.post(__SITEROOT__+'Console.itf?request=uptime',function(data) {
				consoleLog(data.returntext);
				consoleScrollRecent();
			},'json');
			ret='AJAX';
			break;
		default:
			if(consoleCmdCallBack!=null&&consoleCmdCallBack(rawcmd)){
				ret='AJAX';
				break;
			}
			ret='"'+cmd+'" Command Unknown';
			break;				
	}
	return ret;
}

function consoleScrollRecent (){
	$("#consolehistory").animate({ 
		scrollTop: $("#consolehistory").attr("scrollHeight") - 
		$('#consolehistory').height() }, 100);
}
	
function consoleToggle(){
	$('#console').animate({opacity:'toggle'},'fast');
	consoleOpen=false;
	if($('#console').css('opacity')=='0'){
		consoleOpen=true;
		consoleScrollRecent();
	}
	if(!consoleInit){
		consoleScrollRecent();
		consoleInit=true;
	}
}

