2 // http://alexsexton.com/blog/2010/02/using-inheritance-patterns-to-organize-large-jquery-applications/
3 // We will use John Resig's proposal
5 // http://pastie.org/517177
7 // NOTE: missing a destroy function
9 $.plugin = function(name, object) {
10 $.fn[name] = function(options) {
11 var args = Array.prototype.slice.call(arguments, 1);
12 return this.each(function() {
13 var instance = $.data(this, name);
15 instance[options].apply(instance, args);
17 instance = $.data(this, name, new object(options, this));
23 var Plugin = Class.extend({
25 init: function(options, element)
27 // Mix in the passed in options with the default options
28 this.options = $.extend({}, this.default_options, options);
30 // Save the element reference, both as a jQuery
31 // reference and a normal reference
32 this.element = element;
33 this.$element = $(element);
35 // return this so we can chain/use the bridge with less code.
39 has_query_handler: function() {
40 return (typeof this.on_filter_added === 'function');
43 _query_handler: function(prefix, event_type, data)
45 // We suppose this.query_handler_prefix has been defined if this
46 // callback is triggered
53 fn = 'filter_removed';
71 fn = 'on_' + prefix + fn;
72 if (typeof this[fn] === 'function') {
73 // call with data as parameter
74 // XXX implement anti loop
79 _record_handler: function(prefix, event_type, record)
81 // We suppose this.query_handler_prefix has been defined if this
82 // callback is triggered
92 fn = 'query_in_progress';
101 fn = 'on_' + prefix + fn;
102 if (typeof this[fn] === 'function') {
103 // call with data as parameter
104 // XXX implement anti loop
109 get_handler_function: function(type, prefix)
112 return $.proxy(function(e, event_type, record) {
113 return this['_' + type + '_handler'](prefix, event_type, record);
117 listen_query: function(query_uuid, prefix)
119 // default: prefix = ''
120 prefix = (typeof prefix === 'undefined') ? '' : (prefix + '_');
122 this.$element.on(manifold.get_channel('query', query_uuid), this.get_handler_function('query', prefix));
123 this.$element.on(manifold.get_channel('record', query_uuid), this.get_handler_function('record', prefix));
128 /* Helper functions for naming HTML elements (ID, classes), with support for filters and fields */
132 var ret = this.options.plugin_uuid;
133 for (var i = 0; i < arguments.length; i++) {
134 ret = ret + manifold.separator + arguments[i];
141 if (arguments.length == 0) {
142 return $('#' + this.id());
144 // We make sure to search _inside_ the dom tag of the plugin
145 return $('#' + this.id.apply(this, arguments), this.el());
151 return $('.' + cls, this.el());
154 id_from_filter: function(filter, use_value)
156 use_value = typeof use_value !== 'undefined' ? use_value : true;
160 var value = filter[2];
161 var op_str = this.getOperatorLabel(op);
162 var s = manifold.separator;
165 return 'filter' + s + key + s + op_str + s + value;
167 return 'filter' + s + key + s + op_str;
171 str_from_filter: function(filter)
173 return filter[0] + ' ' + filter[1] + ' ' + filter[2];
176 array_from_id: function(id)
178 var ret = id.split(manifold.separator);
179 ret.shift(); // remove plugin_uuid at the beginning
183 id_from_field: function(field)
185 return 'field' + manifold.separator + field;
188 field_from_id: function(id)
191 if (typeof id === 'string') {
192 array = id.split(manifold.separator);
193 } else { // We suppose we have an array ('object')
196 // array = ['field', FIELD_NAME]
202 manifold.spin(this.element);
207 manifold.spin(this.element, false);