var PBShortcut = Class.create({

	'initialize' : function (shortcuts)
	{
		this.shortcuts = $(shortcuts);
		this.keycodes = {};

		for (var i = 0; i < this.shortcuts.length; i++) {
			this.shortcuts[i].shift  = !Object.isUndefined(this.shortcuts[i].shift) && this.shortcuts[i].shift;
			this.shortcuts[i].ctrl   = !Object.isUndefined(this.shortcuts[i].ctrl)  && this.shortcuts[i].ctrl;
			this.shortcuts[i].alt    = !Object.isUndefined(this.shortcuts[i].alt)   && this.shortcuts[i].alt;
			this.shortcuts[i].action = Object.isUndefined(this.shortcuts[i].action) ? 0 : this.shortcuts[i].action;
			this.keycodes[this.shortcuts[i].keyCode] = true;
		}

		this.modifiers = {
			shift : false,
			ctrl  : false,
			alt   : false
			};

		document.observe('keydown', this.onkeydown.bindAsEventListener(this));
		document.observe('keyup', this.onkeyup.bindAsEventListener(this));

	},

	'onkeydown' : function(event)
	{
		var keyCode = event.keyCode;
		var sc = this.shortcuts;

		/* Check for modifiers */
		if (keyCode == 16) {
			this.modifiers.shift = true; return;
		}
		if (keyCode == 17) {
			this.modifiers.ctrl = true; return;
		}
		if (keyCode == 18 || keyCode == 224) { // 224 = shift-alt
			this.modifiers.alt = true; return;
		}

		/* Handle actual keys */
		if (!this.keycodes[keyCode]) {
			return;
		}

		for (var i = 0; i < sc.length; i++) {

			if (sc[i].keyCode == keyCode) {

				if (sc[i].shift == this.modifiers.shift &&
					sc[i].ctrl == this.modifiers.ctrl &&
					sc[i].alt == this.modifiers.alt) {

					switch (sc[i].action) {
						case 6:
							this.actionJavascript(sc[i]);
							break;
						case 3:
							this.actionDialog(sc[i]);
							break;
						case 2:
							this.actionOpen(sc[i]);
							break;
						case 1:
							this.actionNavigate(sc[i]);
							break;
						case 0:
						default:
							this.actionMessage(sc[i]);
					}

					Event.stop(event);
				}
			}
		}
	},

	'onkeyup' : function(event)
	{
		var keyCode = event.keyCode;
		var sc = this.shortcuts;

		/* Check for modifiers */
		if (keyCode == 16) {
			this.modifiers.shift = false; return;
		}
		if (keyCode == 17) {
			this.modifiers.ctrl = false; return;
		}
		if (keyCode == 18 || keyCode == 224) { // 224 = shift-alt
			this.modifiers.alt = false; return;
		}
	},

	'actionMessage' : function(item)
	{
		alert(item.message);
	},

	'actionNavigate' : function(item)
	{
		window.top.location.href = item.url;
	},

	'actionOpen' : function(item)
	{
		window.open(item.url);
	},

	'actionDialog' : function(item)
	{
		var options = Object.isUndefined(item.options)  ? {}  : item.options;

		var width   = Object.isUndefined(options.width)  ? 400 : options.width;
		var height  = Object.isUndefined(options.height) ? 400 : options.height;


		PbLib.createDialog(item.url, width, height, options);
	},

	'actionJavascript' : function(item)
	{
		eval(item.url);
	}
});

document.observe('dom:loaded', function(e)
{
	/* stop here if global var containing shortcuts for this page doesn't exist */
	if (!pbShortcuts) {
		return false;
	}

	var PBShortcutObj = new PBShortcut(pbShortcuts);
});