/**********************************************************
Author:
Adam Barry
Klestrup partners
www.klestrup-partners.dk

Date: August 9 2009

© 2009 Adam Barry, all rights reserved
-----------------------------------------------------------

Name:
keyHandler script

-----------------------------------------------------------
Description:
Functions that enables various actions to keyboard events
to various elements, thus making it possible to have
various actions to key events depending on which element
is currently active.

-----------------------------------------------------------
Usage:
Identify the element which you wish to assign a function to.
Create the function that is to be executed.
Assign the function to a specific key.

<script type="text/javascript" src="keyHandler.js"></script>

-----------------------------------------------------------
Example:
<script type="text/javascript" src="keyHandler.js"></script>

Initialize:
	if(typeof addKeyAction == 'function') {	
		addKeyAction(elementToHaveKeyHandlerAttached,function(){functionToLoad();},27);
	}
	
	if(typeof setActiveElement == 'function') {
		setActiveElement(elementToHaveKeyHandlerAttached);
	}

	if(typeof removeActiveElement == 'function') {
		removeActiveElement();
	}
	

Quick key-code reference:
13: Enter/return key
27: Escape key
32: Space bar key

-----------------------------------------------------------
Dependencies:
None

**********************************************************/

var keyActions = new Array();	//Array holding all elements and associated key-actions
function keyAction(element,func,keycode) {
	this.element = element;		//The element invoking a key event
	this.func = func;			//The function that is to be executed
	this.keycode = keycode;		//The keycode that will initiate the function
}

var currentActiveKeyElement = "";

var activeKeyElements = new Array();	//Array-stack holding the active element in last position
function activeKeyElement(element) {
	this.element = element;
}


function addKeyAction(element,func,keycode) {
	
	keyActions.push(new keyAction(element,func,keycode));
}


function setActiveElement(element) {
	activeKeyElements.push(new activeKeyElement(element));
	currentActiveKeyElement = element;
	
	
	//identify the keyactions for the current active element
	for (var i = 0; i < keyActions.length; i++) {
		if (keyActions[i].element == element) {
			var me = keyActions[i];
		}
	}
}


function removeActiveElement() {
	activeKeyElements.pop();
	
	//If more elements are currently in the stack, activate the next element
	var length = activeKeyElements.length;
	if (length > 0) {
		setActiveElement(activeKeyElements[length-1].element);	
	}
	else {
		currentActiveKeyElement = "";	
	}
}


function keyListener(event) {
	
	var evt = event || window.event;

	if (evt) {
	
		//document.getElementById("notify").innerHTML = evt.keyCode;
		
		for (var i = 0; i < keyActions.length; i++) {
			if (keyActions[i].element == currentActiveKeyElement && keyActions[i].keycode == evt.keyCode) {
				keyActions[i].func();
			}
		}
	}
}document.onkeydown = keyListener;
