/**
* @author Ryan Johnson
* @copyright 2008 PersonalGrid Corporation
* @package LivePipe UI
* @license MIT
* @url http://livepipe.net/extra/hotkey
* @require prototype.js, livepipe.js
*/
/*global document, Prototype, Class, Event, $ */
if(typeof(Prototype) == "undefined") {
throw "HotKey requires Prototype to be loaded."; }
if(typeof(Object.Event) == "undefined") {
throw "HotKey requires Object.Event to be loaded."; }
var HotKey = Class.create({
initialize: function(letter,callback,options){
letter = letter.toUpperCase();
HotKey.hotkeys.push(this);
this.options = Object.extend({
element: false,
shiftKey: false,
altKey: false,
ctrlKey: true,
bubbleEvent : true,
fireOnce : false // Keep repeating event while key is pressed?
},options || {});
this.letter = letter;
// All custom hotkey events should stop after their custom actions.
this.callback = function (event) {
if (!(this.options.fireOnce && this.fired) && Object.isFunction(callback)) {
callback(event);
}
if (!this.options.bubbleEvent) { event.stop(); }
this.fired = true;
};
this.element = $(this.options.element || document);
this.handler = function(event){
if(!event || (
(Event['KEY_' + this.letter] || this.letter.charCodeAt(0)) == event.keyCode &&
((!this.options.shiftKey || (this.options.shiftKey && event.shiftKey)) &&
(!this.options.altKey || (this.options.altKey && event.altKey)) &&
(!this.options.ctrlKey || (this.options.ctrlKey && event.ctrlKey))
)
)){
if(this.notify('beforeCallback',event) === false) {
return; }
this.callback(event);
this.notify('afterCallback',event);
}
}.bind(this);
this.enable();
},
trigger: function(){
this.handler();
},
enable: function(){
this.element.observe('keydown',this.handler);
},
disable: function(){
this.element.stopObserving('keydown',this.handler);
},
destroy: function(){
this.disable();
HotKey.hotkeys = HotKey.hotkeys.without(this);
}
});
Object.extend(HotKey,{
hotkeys: []
});
Object.Event.extend(HotKey);