1 /** 2 * @author Ilya Shaikovsky 3 * @author Lukas Fryc 4 */ 5 6 (function($, rf) { 7 8 rf.ui = rf.ui || {}; 9 10 var defaultOptions = { 11 enabledInInput : false, 12 preventDefault : true 13 }; 14 15 var types = [ 'keydown', 'keyup' ]; 16 17 rf.ui.HotKey = function(componentId, options) { 18 $super.constructor.call(this, componentId); 19 this.namespace = this.namespace || "." + rf.Event.createNamespace(this.name, this.id); 20 this.attachToDom(this.componentId); 21 this.options = $.extend({}, defaultOptions, options); 22 this.__handlers = {}; 23 24 this.options.selector = (this.options.selector) ? this.options.selector : document; 25 26 $(document).ready($.proxy(function() { 27 this.__bindDefinedHandlers(); 28 }, this)); 29 }; 30 31 rf.BaseComponent.extend(rf.ui.HotKey); 32 33 var $super = rf.ui.HotKey.$super; 34 35 $.extend(rf.ui.HotKey.prototype, { 36 37 name : "HotKey", 38 39 __bindDefinedHandlers : function() { 40 for (var i = 0; i < types.length; i++) { 41 if (this.options['on' + types[i]]) { 42 this.__bindHandler(types[i]); 43 } 44 } 45 }, 46 47 __bindHandler : function(type) { 48 this.__handlers[type] = $.proxy(function(event) { 49 var result = this.invokeEvent.call(this, type, document.getElementById(this.id), event); 50 if (this.options.preventDefault) { 51 event.stopPropagation(); 52 event.preventDefault(); 53 return false; 54 } 55 return result; 56 }, this); 57 $(this.options.selector).bind(type + this.namespace, this.options, this.__handlers[type]); 58 }, 59 60 destroy : function() { 61 rf.Event.unbindById(this.id, this.namespace); 62 63 for (var type in this.__handlers) { 64 if (this.__handlers.hasOwnProperty(type)) { 65 $(this.options.selector).unbind(type + this.namespace, this.__handlers[type]); 66 } 67 } 68 69 $super.destroy.call(this); 70 } 71 }); 72 73 })(RichFaces.jQuery, RichFaces);