function n__keyHandler(n__objectToListen, n__windowReference, n__attachToEvent)
{
	var n__keyHandler = {
		
		//reference to object we are listening to
		n__objectToListen : n__objectToListen,
		
		//if we want to attach to the event, then this is true,
		//otherwise we overwrite the event completely
		n__attachToEvent : n__attachToEvent,

		/*overloadable function onKeyPress that fires anytime a key is entered
			n__eventType = onkeyup, onkeydown
			n__keyCode = the code of the key pressed
			n__shiftPressed = true/false depending on whether or not it is pressed
			n__ctrlPressed = true/false depending on whether or not it is pressed
			n__altPressed = true/false depending on whether or not it is pressed
		*/
		n__onKeyPress : function(n__eventType, n__keyCode, n__shiftPressed, n__ctrlPressed, n__altPressed, n__event){},

		n__windowReference : n__windowReference,
		
		n__init : function()
		{
			//set the window reference properly (defaults to this current window)
			typeof this.n__windowReference == "undefined" ? this.n__windowReference = window : false;
		},

		n__enable : function()
		{
			if(this.n__attachToEvent)
			{
				n__addEventListener(n__keyHandler.n__objectToListen, "keydown",n__keyHandler.n__handleKeys, false);
				n__addEventListener(n__keyHandler.n__objectToListen, "keyup",n__keyHandler.n__handleKeys, false);
				n__addEventListener(n__keyHandler.n__objectToListen, "keypress",n__keyHandler.n__handleKeys, false);
				n__addEventListener(n__keyHandler.n__objectToListen, "focus",n__keyHandler.n__handleFocus, false);
			}
			else
			{
				this.n__objectToListen.onkeydown = this.n__handleKeys;
				this.n__objectToListen.onkeyup = this.n__handleKeys;
				this.n__objectToListen.onkeypress = this.n__handleKeys;
			}
		},
	
		n__disable : function()
		{
			if(this.n__attachToEvent)
			{
				n__removeEventListener(n__keyHandler.n__objectToListen, "keydown",n__keyHandler.n__handleKeys, false);
				n__removeEventListener(n__keyHandler.n__objectToListen, "keyup",n__keyHandler.n__handleKeys, false);
					n__removeEventListener(n__keyHandler.n__objectToListen, "keypress",n__keyHandler.n__handleKeys, false);
				n__removeEventListener(n__keyHandler.n__objectToListen, "focus",n__keyHandler.n__handleFocus, false);
			}
			else
			{
				this.n__objectToListen.onkeydown = this.n__handleKeys;
				this.n__objectToListen.onkeyup = this.n__handleKeys;
				this.n__objectToListen.onkeypress = this.n__handleKeys;
			}
		},
		
		//when the input box is re-focused focused, we need to reset the special key values
		n__handleFocus : function()
		{
			n__keyHandler.n__shiftPressed = false;
			n__keyHandler.n__ctrlPressed = false;
			n__keyHandler.n__altPressed = false;
		},

		n__handleKeys : function(e)
		{
			//very important, must fix event before working with event
			e = n__fixEvent(e);

			var n__keyHit, n__eventType, n__shiftPressed, n__ctrlPressed, n__altPressed;
			typeof e.which != 'undefined' ? n__keyHit = e.which : n__keyHit = n__keyHandler.n__windowReference.event.keyCode;
			typeof e.type != 'undefined' ? n__eventType = e.type : n__eventType = n__keyHandler.n__windowReference.event.type;
			
			typeof e.shiftKey != 'undefined' ? n__shiftPressed = e.shiftKey : n__shiftPressed = n__keyHandler.n__windowReference.event.shiftKey;
			typeof e.ctrlKey != 'undefined' ? n__ctrlPressed = e.ctrlKey : n__ctrlPressed = n__keyHandler.n__windowReference.event.ctrlKey;
			typeof e.altKey != 'undefined' ? n__altPressed = e.altKey : n__altPressed = n__keyHandler.n__windowReference.event.altKey;
			
			return n__keyHandler.n__onKeyPress(n__eventType, n__keyHit, n__shiftPressed, n__ctrlPressed, n__altPressed, e);
		}
	};
	n__keyHandler.n__init();
	return n__keyHandler;
}