
(function () {
	var KeyQueue = [];
	var EventQueue = {
		LongestSequence : 0,
		List : []
	};

	window.RegisterKeyMatcherEvent = function (seq, callback)
	{
		if (seq.length > EventQueue.LongestSequence)
		{
			EventQueue.LongestSequence = seq.length;
		}

		var obj = { sequence : seq, callback : callback };
		EventQueue.List.push(obj);
	}

	function KeyHandler (evt)
	{
		// Browser compatibility code
		if (!evt) var evt = window.event;

		var keycode;

		if (evt.keyCode) keycode = evt.keyCode;
		else if (evt.which) keycode = evt.which;
		
		if (KeyQueue.length >= EventQueue.LongestSequence)
		{
			KeyQueue.shift();
		}
		KeyQueue.push(keycode);

		for (var i = 0; i < EventQueue.List.length; i ++)
		{
			if (EventQueue.List[i].sequence.length > KeyQueue.length) continue;

			var MatchingKeys = KeyQueue.slice(KeyQueue.length - EventQueue.List[i].sequence.length, KeyQueue.length);
			if (EventQueue.List[i].sequence.toString() == MatchingKeys.toString())
			{
				EventQueue.List[i].callback(evt);
			}
		}
	}

	// Register keydown event
	if (document.addEventListener)
		document.addEventListener('keyup', KeyHandler, false);
	else if (document.attachEvent)
		document.attachEvent('onkeyup', KeyHandler);
	else if (!document.onkeyup)
		document.onkeydown = KeyHandler;

})();