/**
 * 
 *	keys.js 
 *  by D. Benjamin Ipsen 2008
 *  http://www.benipsen.com
 * 	no licence, just love.
 * 
 *  usage:   KeyEventObservers.add('left',{up:function(e){ 
 *							// handle the key up code here
 *						},
 *						down:function(e){
 *							//handle the key down code here
 *						}
 *				});
 *
**/

var internet_explorer = navigator.appName.indexOf("xplorer") > 0;
var macintosh = navigator.platform.indexOf("Mac") >= 0;
var safari = navigator.appVersion.indexOf("fari") > 0;


/* this is an incredibly useful function not just for the keys */
function addWindowEventListener(eventName, callback, bubble){
	if(window.addEventListener){          
		window.addEventListener(eventName, callback, bubble);
	} else {
		document.attachEvent('on' + eventName, callback);
	}                                                  
}


var KeyEventObservers = {
	list:null,
	add:function(key, handler){ 
		if(KeyEventObservers.list == null){
			 KeyEventObservers.list = new Object();
			 addWindowEventListener('keydown',KeyEventObservers.onkeydown, false);
			 addWindowEventListener('keyup',KeyEventObservers.onkeyup, false);
		}
		if(!KeyEventObservers.list[key]) KeyEventObservers.list[key] = new Array();
		KeyEventObservers.list[key].push(handler);			
	},
	onkeydown:function(e){
		if( ! KeyEventObservers.list[KeyMap.lookup(e.keyCode)]) return true;
		var observers = KeyEventObservers.list[KeyMap.lookup(e.keyCode)];
	    for(var o = 0; o < observers.length; o++){
			if(observers[o].down) observers[o].down(e);
		}
		return true;
	},
   	onkeyup:function(e){ 
		if( ! KeyEventObservers.list[KeyMap.lookup(e.keyCode)]) return true;
		var observers = KeyEventObservers.list[KeyMap.lookup(e.keyCode)];
	    for(var o = 0; o < observers.length; o++){
			if(observers[o].up) observers[o].up(e);
		}
		return true;
	}
}

var KeyMap = {
	names:['shift','ctl','up','down','left','right','tab'],
	//note: safari shift, ctl, and alt don't fire events!
	safari:[16,17,38,40,37,39,9],
	moz:[16,17,38,40,37,39,9],
	ie:[16,17,38,40,37,39,9],
	mac:[16,224,38,40,37,39,9],
	lookup:function(test){	
		var code = internet_explorer ? KeyMap.ie : KeyMap.moz;
		if(macintosh) code = KeyMap.mac;
		if(safari) code = KeyMap.safari;
		for(var i = 0; i < code.length; i++){
			if(code[i] == test)
				return KeyMap.names[i];
		}
		return "all";
	}
}