console = function(){
	this.busy = false;
	
	this.path = "/";
	this.ver = "0.0.1";
	
	this.lastcmd = "";
	
	this.dK = [8,27,37,38,39,40];
	
	this.readerOpen = false;
	this.readerVer = "0.0.1";
	this.readerContent = [];

	
	this.init = function(){
		// show welcome
		this.println("IDVL.DE [version "+this.ver+"]");
		this.println("(c) 2008 Axel Mengdehl - info[at]idvl[dot]de");
		this.println(" ");
		
		//create key listener
		document.observe("keypress", this.getKey);
		document.observe("keydown", this.defKey);
		document.observe("focus", this.Focus);
		document.observe("blur", this.Blur);
		
		//create input
		this.input();
		
		//cursor blink :: fix
		setInterval('c.blinkCursor()', 700);		
	}
	
	this.Focus = function(){
		if(!$('cursor')){
			c.cursor();
		}
	}
	this.Blur = function(){
		if($('cursor')){
			$('cursor').parentNode.removeChild($('cursor'));
		}
	}
	
	this.println = function(msg){
		var l;
		if(msg == " ") msg = "&nbsp;";
		l = document.createElement('div');
		l.className = 'line';
		l.innerHTML = msg;
		document.body.appendChild(l);
	}
	this.printPath = function(){
		return "home:"+this.path.replace(/\//g, '\\')+">";
	}
	
	this.input = function(){
		var i;
		if($('input')){
			document.body.removeChild($('input'));
		}
		if($('cursor')){
			document.body.removeChild($('cursor'));
		}
		i = document.createElement('div');
		i.className = "line";
		i.setAttribute('id', 'input');
		i.innerHTML = this.printPath();
		document.body.appendChild(i);
		
		this.cursor();
		
		this.scrHeight();
		
		$('input').focus();
	}
	this.cursor = function(){
		if($('input')){
			if(!$('cursor')){
				var c;
				c = document.createElement('div');
				c.setAttribute('id','cursor');
				c.innerHTML = '_';
				$('input').appendChild(c);
			}
		}
	}
	this.blinkCursor = function(){
		if($('cursor')){
			if($('cursor').innerHTML == "_"){
				$('cursor').innerHTML = "&nbsp;";
			} else {
				$('cursor').innerHTML = "_";
			}
		}
	}
	
	this.scrHeight = function(){
		var h, hh, o, i;
		if($('input').viewportOffset()[1]+$('input').getHeight()+10 > document.viewport.getDimensions().height){
			while($('input').viewportOffset()[1]+$('input').getHeight()+10 > document.viewport.getDimensions().height){
				o = $$('div.line')[0];
				h = o.innerHTML;
				
				//alert(h);
				
				h = h.toLowerCase().split('<br>');
				
				if(h.length > 1){
					hh = [];
					for(i=1;i<h.length;i++){
						hh.push(h[i]);
					}
					hh = hh.join('<br />');
					o.innerHTML = hh;
				} else {
					document.body.removeChild($$('div.line')[0]);
				}
			}
		}
	}
	
	this.getKey = function(e){
		e = (e) ? e : ((event) ? event : null);
		if(e && (e.charCode || e.keyCode)){
			if(e.keyCode == 13 || e.charCode == 13){
				c.evalCmd();
			} else if(c.dK.indexOf(e.keyCode) < 0) {
				document.body.appendChild($('cursor'));
				var i = "";
				if(e.charCode){
					i = String.fromCharCode(e.charCode);
					//if(!c.busy) $('input').innerHTML += String.fromCharCode(e.charCode);//.replace(/ /g, '&nbsp;');
				} else if(e.keyCode){
					i = String.fromCharCode(e.keyCode);
					//if(!c.busy) $('input').innerHTML += String.fromCharCode(e.keyCode);//.replace(/ /g, '&nbsp;');
				}
				
				
				if($('input').innerHTML.substr($('input').innerHTML.length-1, 1) == " " && i == " ") i = "&nbsp;";
				//if($('input').innerHTML[$('input').innerHTML.length-1] == " " && i == " ") i = "&nbsp;";
				
				
				if(!c.busy) $('input').innerHTML += i;
				$('input').innerHTML = $('input').innerHTML;
				$('input').appendChild($('cursor'));
			}
		}
		e.returnValue = false;
		e.preventDefault();
		return false;
	}
	this.defKey = function(e){
		e = (e) ? e : ((event) ? event : null);
		//alert(e.keyCode);
		if(c.dK.indexOf(e.keyCode) >= 0){
			switch(e.keyCode){
				case 8: // backspace
					document.body.appendChild($('cursor'));
					
					if(!c.busy){
						if(document.all){
							$('input').innerText = $('input').innerText.substr(0, $('input').innerText.length-1);
						} else{
							$('input').textContent = $('input').textContent.substr(0, $('input').textContent.length-1);
						}
					}
					
					if($('input').innerHTML.length < c.printPath().length) $('input').innerHTML = c.printPath();
					$('input').appendChild($('cursor'));
					break;
				case 27: // ESC
					if(c.readerOpen){
						c.closeReader();
					}
					break;
				case 37: // arrow left
					
					break;
				case 38: // arrow up
					if(c.readerOpen){ // scroll up
						if($('readercontent').getHeight() > (document.viewport.getHeight()-16-32)){
							if(parseInt($('readercontent').getStyle('top')) < 0) $('readercontent').style.top = parseInt($('readercontent').getStyle('top'))+16+'px';
						}
					} else { // paste last command into the input
						c.input();
						document.body.appendChild($('cursor'));
						$('input').innerHTML += c.lastcmd;
						$('input').appendChild($('cursor'));
					}
					break;
				case 39: // arrow right
					
					break;
				case 40: // arrow btm
					if(c.readerOpen){ // scroll down
						if($('readercontent').getHeight() > (document.viewport.getHeight()-16-32)){
							if( ($('readercontent').getHeight() + parseInt($('readercontent').getStyle('top'))) > (document.viewport.getHeight()-16-32) ) $('readercontent').style.top = parseInt($('readercontent').getStyle('top'))-16+'px';
						}
					}
					break;
				//case 112-123: // F1-12
				
			}
			
			// no return
			e.returnValue = false;
			e.preventDefault();
			return false;
		}
	}
	
	this.evalCmd = function(){
		var cmd, resp;
		
		if(!$('input')) return false;
		
		this.busy = true;
		document.body.appendChild($('cursor'));
		
		if(document.all){
			cmd = $('input').innerText;
		} else{
			cmd = $('input').textContent;
		}
		cmd = cmd.substr(this.printPath().length, cmd.length).toLowerCase();
		
		this.lastcmd = cmd;
		
		//this.println($('input').innerHTML);
		$('input').setAttribute('id','');
		
		switch(cmd){
			case 'cls':
				document.body.innerHTML = "";
				this.busy = false;
				this.input();
				return 0;
				break;
			default:
				new Ajax.Request('os/php/console.php?cmd='+cmd+'&path='+this.path,
				{
					method:'get',
					onSuccess: function(transport){
						var resp = transport.responseText || "Error, could not handle your command.";
						c.drawResp(resp);
					},
					onFailure: function(){
						var resp = "Error, could not handle your command.";
						c.drawResp(resp);
					}
				});
				break;
		}
		
	}
	
	this.drawResp = function(r){
		var f, p;
		if(r.substr(0,2) == "js"){
			r = r.split("::");
			f = r[1];
			if(r.length > 2){
				for(i=2;i<r.length;i++){
					f = f.replace('##'+(i-1)+'##', escape(r[i]));
					//alert('param '+(i-1)+': '+escape(r[i]));
				}
			}
			//alert(f);
			eval(f);
		} else {
			this.println(r.replace(/ /g, '&nbsp;').replace(/\n/g, '<br />'));
		}
		this.println(' ');
		this.input();
		
		this.busy = false;
	}
	
	this.reader = function(co){
		var r, rcc, rc, i;
		
		this.readerOpen = true;
		//alert('reader');
		
		// reader
		r = document.createElement('div');
		r.setAttribute('id', 'reader');
		r.style.height = document.viewport.getHeight()-16+'px';
		r.style.width = document.viewport.getWidth()-16+'px';
		r.innerHTML = "&nbsp; Reader [version "+c.readerVer+"] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [UP] to scroll up | [DOWN] to scroll down | [ESC] to exit";
		
		// reader container
		rcc = document.createElement('div');
		rcc.setAttribute('id', 'readercontainer');
		rcc.style.height = document.viewport.getHeight()-16-32+'px';
		rcc.style.width = document.viewport.getWidth()-16+'px';
		r.appendChild(rcc);
		
		// reader content
		rc = document.createElement('div');
		rc.setAttribute('id', 'readercontent');
		rc.style.width = document.viewport.getWidth()-16+'px';
		rc.innerHTML = unescape(co).replace(/\n/g, '<br />');
		rcc.appendChild(rc);
		
		
		//alert(rbg.style.height);
		
		document.body.appendChild(r);
	}
	this.closeReader = function(){
		if($('reader')){
			document.body.removeChild($('reader'));
			c.readerOpen = false;
		}
	}
	
}

document.observe("dom:loaded", function() {
	c.init();
});

var c = new console();

