/*****
 ## Usage

	KeyboardEvents.addListener({
		name: "aListener", 
		onEscape: function(){alert("escape pressed");},
		onEnter: function(){alert("enter key pressed");},
		onBackspace: function(){alert("backspace key pressed");},
		processKey: function(variable1, evt){
			alert(variable1 + " key pressed");
			var msg = "shift pressed: " + evt.shiftKey;
			msg += "\nctrl pressed: " + evt.ctrlKey;
			msg += "\nalt pressed" + evt.altKey;
			msg += "\nmeta pressed" + evt.metaKey;
			alert(msg);
		}
	});
	
	KeyboardEvents.removeListener("aListener");
	
******/

var KeyboardEvents = function(){	
	var listeners = [];
	
	var processListeners = function(e) {
		e = e ? e : window.event;
		keycode = e.keyCode;	
		
		if(keycode == 27){
			for(var j=0; j < listeners.length; j++){
				if(listeners[j].onEscape){
					listeners[j].onEscape(e);
				}
			}
		}
		if(keycode == 13){
			for(var k=0; k < listeners.length; k++){
				if(listeners[k].onEnter){
					listeners[k].onEnter(e);
				}
			}
		}
		if(keycode == 8){
			for(var l=0; l < listeners.length; l++){
				if(listeners[l].onBackspace){
					listeners[l].onBackspace(e);
				}
			}
		}
		
		key = String.fromCharCode(keycode).toLowerCase();
				
		for(var m=0; m < listeners.length; m++){
			if(listeners[m].processKey){
				listeners[m].processKey(key, e);
			}
		}
	};
	
	var processCurrentListener = function(e) {
		e = e ? e : window.event;
		keycode = e.keyCode;	
		
		if(listeners.length == 0){
			return;
		}
		
		var current = listeners.length - 1;
		
		if(keycode == 27){
			if(listeners[current].onEscape){
				listeners[current].onEscape(e);
			}
		}
		if(keycode == 13){
			if(listeners[current].onEnter){
				listeners[current].onEnter(e);
			}
		}
		if(keycode == 8){
			if(listeners[current].onBackspace){
				listeners[current].onBackspace(e);
			}
		}
		
		key = String.fromCharCode(keycode).toLowerCase();
				
		if(listeners[current].processKey){
			listeners[current].processKey(key, e);
		}
	};
	
	return {
		addListener: function(newListener){
			if(newListener.name == undefined){
				alert("Listener must have a name property before it is added");
				return;
			}
			for(cnt = 0; cnt < listeners.length; cnt++){
				// Do not allow duplicate names to be added
				if(listeners[cnt].name == newListener.name){
					return;					
				}
			}
			listeners.push(newListener);
		},
		removeListener: function(listenerName){
			for(i=0; i < listeners.length; i++){
				if(listeners[i].name == listenerName){
					listeners.splice(i, 1);
				}
			}
		},
		start: function(){
			// using onkeydown since not all keys have the keypress event sent
			// document.onkeydown = processListeners;
			document.onkeydown = processCurrentListener;
		},
		end: function(){
			document.onkeydown = '';
		}
	}	
}();	
KeyboardEvents.start();

