//
// A few global vars
//
var isTyping = false;

//
// Event Handling
//
var Events = {
_events: new Array(),
attach: function(obj, type, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(type, fn, false);
	} else if(obj.attachEvent) {
		obj["e" + type + fn] = fn;
		obj[type + fn] = function() {
			var evt = window.event;
			evt.target = evt.srcElement;
			obj["e" + type + fn](evt);
		}
		obj.attachEvent("on" + type, obj[type + fn]);
	}
	this._events[this._events.length] = {
		obj: obj,
		type: type,
		fn: fn
	}
	},
	detach: function(obj, type, fn) {
		if (obj.removeEventListener) {
			obj.removeEventListener(type, fn, false);
		} else if(obj.detachEvent) {
			obj.detachEvent("on" + type, obj[type + fn]);
			obj[type + fn] = null;
			obj["e" + type + fn] = null;
		}
	},
	cleanup: function() {
		for(var i = 0; i < this._events.length; i++) {
			var evt = this._events[i];
			this.detach(evt.obj, evt.type, evt.fn);
		}
	},
	stop: function(e) {
		e.cancelBubble = true;
		if(e.stopPropagation) e.stopPropagation();
	}
}


//
// Keyboard commands
//
function keyboardClass ()
{

	var keys1 = new Array();
	var keys2 = new Array();
	var ctrlStatus = false;
	this.keyboardInputIn = keyboardInputIn;
	this.keyboardInputOut = keyboardInputOut;
	this.addKeyIn = addKeyIn;
	this.addKeyOut = addKeyOut;

	function addKeyIn (key, act, ctrl)
	{

		if (keys1[key] == undefined) {

			keys1[key] = new Array();
			keys1[key]['act'] = act;
			keys1[key]['ctrl'] = ctrl;

		}

		else {

			alert ("Key overload in: "+key);

		}

	}

	function addKeyOut (key, act, ctrl)
	{

		if (keys2[key] == undefined) {

			keys2[key] = new Array();
			keys2[key]['act'] = act;
			keys2[key]['ctrl'] = ctrl;

		}

		else {

			alert ("Key overload out: "+key);

		}

	}

	function keyboardInputIn(e) 
	{

		var code = e.keyCode;

		if (code == 17) {

			ctrlStatus = true;

		}

		else if (keys1[code] != undefined) {

			if (keys1[code]['ctrl'] == true) {

				if (ctrlStatus == true) {

					eval (keys1[code]['act']);

				}

			}

			else {

				eval (keys1[code]['act']);

			}

		}

		return false;

	}

	function keyboardInputOut(e) 
	{

		var code = e.keyCode;
		
		/*
		if (document.getElementById ('debug_pre'))
		{

			document.getElementById ('debug_pre').innerHTML = "Key Pressed: "+code+"\n"+document.getElementById ('debug_pre').innerHTML;
		
		}
		*/

		if (code == 17) {

			ctrlStatus = false;

		}

		else if (keys2[code] != undefined) {

			if (keys2[code]['ctrl'] == true) {

				if (ctrlStatus == true) {

					eval (keys2[code]['act']);

				}

			}

			else {

				eval (keys2[code]['act']);

			}

		}

		return false;

	}

}

var kbC = new keyboardClass();

// Debug window:
kbC.addKeyIn (0, 'toggleDiv(\'debug_div\');', true);

// KEYBOARD INPUT
Events.attach(window, "keydown", function(e) { kbC.keyboardInputIn(e || window.event); });
Events.attach(window, "keyup", function(e) { kbC.keyboardInputOut(e || window.event); });
