stuff_to_do_plugin 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/COPYRIGHT.txt +18 -0
  2. data/CREDITS.txt +6 -0
  3. data/GPL.txt +339 -0
  4. data/README.rdoc +61 -0
  5. data/Rakefile +38 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/stuff_to_do_controller.rb +161 -0
  8. data/app/helpers/stuff_to_do_helper.rb +88 -0
  9. data/app/models/stuff_to_do.rb +208 -0
  10. data/app/models/stuff_to_do_filter.rb +32 -0
  11. data/app/models/stuff_to_do_mailer.rb +16 -0
  12. data/app/views/settings/_stuff_to_do_settings.html.erb +27 -0
  13. data/app/views/stuff_to_do/_issue.html.erb +16 -0
  14. data/app/views/stuff_to_do/_item.html.erb +5 -0
  15. data/app/views/stuff_to_do/_left_panes.html.erb +51 -0
  16. data/app/views/stuff_to_do/_panes.html.erb +11 -0
  17. data/app/views/stuff_to_do/_project.html.erb +6 -0
  18. data/app/views/stuff_to_do/_right_panes.html.erb +25 -0
  19. data/app/views/stuff_to_do/_time_grid.html.erb +113 -0
  20. data/app/views/stuff_to_do/_time_grid_form.html.erb +32 -0
  21. data/app/views/stuff_to_do/index.html.erb +44 -0
  22. data/app/views/stuff_to_do_mailer/recommended_below_threshold.erb +3 -0
  23. data/app/views/stuff_to_do_mailer/recommended_below_threshold.text.html.rhtml +1 -0
  24. data/assets/images/b.png +0 -0
  25. data/assets/images/bl.png +0 -0
  26. data/assets/images/br.png +0 -0
  27. data/assets/images/closelabel.gif +0 -0
  28. data/assets/images/loading.gif +0 -0
  29. data/assets/images/tl.png +0 -0
  30. data/assets/images/tr.png +0 -0
  31. data/assets/javascripts/facebox.js +319 -0
  32. data/assets/javascripts/jquery-1.2.6.min.js +32 -0
  33. data/assets/javascripts/jquery-ui.js +2839 -0
  34. data/assets/javascripts/jquery.contextMenu.js +212 -0
  35. data/assets/javascripts/semantic.cache +15 -0
  36. data/assets/javascripts/stuff-to-do.js +270 -0
  37. data/assets/javascripts/ui/build.xml +24 -0
  38. data/assets/javascripts/ui/effects.blind.js +49 -0
  39. data/assets/javascripts/ui/effects.bounce.js +78 -0
  40. data/assets/javascripts/ui/effects.clip.js +54 -0
  41. data/assets/javascripts/ui/effects.core.js +510 -0
  42. data/assets/javascripts/ui/effects.drop.js +50 -0
  43. data/assets/javascripts/ui/effects.explode.js +79 -0
  44. data/assets/javascripts/ui/effects.fold.js +55 -0
  45. data/assets/javascripts/ui/effects.highlight.js +48 -0
  46. data/assets/javascripts/ui/effects.pulsate.js +55 -0
  47. data/assets/javascripts/ui/effects.scale.js +180 -0
  48. data/assets/javascripts/ui/effects.shake.js +57 -0
  49. data/assets/javascripts/ui/effects.slide.js +50 -0
  50. data/assets/javascripts/ui/effects.transfer.js +59 -0
  51. data/assets/javascripts/ui/i18n/ui.datepicker-ar.js +26 -0
  52. data/assets/javascripts/ui/i18n/ui.datepicker-bg.js +25 -0
  53. data/assets/javascripts/ui/i18n/ui.datepicker-ca.js +25 -0
  54. data/assets/javascripts/ui/i18n/ui.datepicker-cs.js +25 -0
  55. data/assets/javascripts/ui/i18n/ui.datepicker-da.js +25 -0
  56. data/assets/javascripts/ui/i18n/ui.datepicker-de.js +25 -0
  57. data/assets/javascripts/ui/i18n/ui.datepicker-eo.js +25 -0
  58. data/assets/javascripts/ui/i18n/ui.datepicker-es.js +25 -0
  59. data/assets/javascripts/ui/i18n/ui.datepicker-fa.js +25 -0
  60. data/assets/javascripts/ui/i18n/ui.datepicker-fi.js +25 -0
  61. data/assets/javascripts/ui/i18n/ui.datepicker-fr.js +25 -0
  62. data/assets/javascripts/ui/i18n/ui.datepicker-he.js +25 -0
  63. data/assets/javascripts/ui/i18n/ui.datepicker-hr.js +25 -0
  64. data/assets/javascripts/ui/i18n/ui.datepicker-hu.js +25 -0
  65. data/assets/javascripts/ui/i18n/ui.datepicker-hy.js +25 -0
  66. data/assets/javascripts/ui/i18n/ui.datepicker-id.js +25 -0
  67. data/assets/javascripts/ui/i18n/ui.datepicker-is.js +25 -0
  68. data/assets/javascripts/ui/i18n/ui.datepicker-it.js +25 -0
  69. data/assets/javascripts/ui/i18n/ui.datepicker-ja.js +26 -0
  70. data/assets/javascripts/ui/i18n/ui.datepicker-ko.js +25 -0
  71. data/assets/javascripts/ui/i18n/ui.datepicker-lt.js +25 -0
  72. data/assets/javascripts/ui/i18n/ui.datepicker-lv.js +25 -0
  73. data/assets/javascripts/ui/i18n/ui.datepicker-nl.js +25 -0
  74. data/assets/javascripts/ui/i18n/ui.datepicker-no.js +25 -0
  75. data/assets/javascripts/ui/i18n/ui.datepicker-pl.js +25 -0
  76. data/assets/javascripts/ui/i18n/ui.datepicker-pt-BR.js +25 -0
  77. data/assets/javascripts/ui/i18n/ui.datepicker-ro.js +25 -0
  78. data/assets/javascripts/ui/i18n/ui.datepicker-ru.js +25 -0
  79. data/assets/javascripts/ui/i18n/ui.datepicker-sk.js +25 -0
  80. data/assets/javascripts/ui/i18n/ui.datepicker-sl.js +26 -0
  81. data/assets/javascripts/ui/i18n/ui.datepicker-sq.js +25 -0
  82. data/assets/javascripts/ui/i18n/ui.datepicker-sv.js +25 -0
  83. data/assets/javascripts/ui/i18n/ui.datepicker-th.js +25 -0
  84. data/assets/javascripts/ui/i18n/ui.datepicker-tr.js +25 -0
  85. data/assets/javascripts/ui/i18n/ui.datepicker-uk.js +25 -0
  86. data/assets/javascripts/ui/i18n/ui.datepicker-zh-CN.js +25 -0
  87. data/assets/javascripts/ui/i18n/ui.datepicker-zh-TW.js +25 -0
  88. data/assets/javascripts/ui/svn.log +11 -0
  89. data/assets/javascripts/ui/ui.accordion.js +400 -0
  90. data/assets/javascripts/ui/ui.core.js +533 -0
  91. data/assets/javascripts/ui/ui.datepicker.js +1754 -0
  92. data/assets/javascripts/ui/ui.dialog.js +630 -0
  93. data/assets/javascripts/ui/ui.draggable.js +696 -0
  94. data/assets/javascripts/ui/ui.droppable.js +314 -0
  95. data/assets/javascripts/ui/ui.progressbar.js +114 -0
  96. data/assets/javascripts/ui/ui.resizable.js +805 -0
  97. data/assets/javascripts/ui/ui.selectable.js +266 -0
  98. data/assets/javascripts/ui/ui.slider.js +552 -0
  99. data/assets/javascripts/ui/ui.sortable.js +1012 -0
  100. data/assets/javascripts/ui/ui.tabs.js +572 -0
  101. data/assets/stylesheets/stuff_to_do.css +216 -0
  102. data/config/locales/bg.yml +18 -0
  103. data/config/locales/ca-fr.yml +18 -0
  104. data/config/locales/cs.yml +16 -0
  105. data/config/locales/da.yml +16 -0
  106. data/config/locales/de.yml +18 -0
  107. data/config/locales/en.yml +24 -0
  108. data/config/locales/es.yml +19 -0
  109. data/config/locales/fr.yml +17 -0
  110. data/config/locales/hu.yml +16 -0
  111. data/config/locales/it.yml +16 -0
  112. data/config/locales/ja.yml +18 -0
  113. data/config/locales/ko.yml +18 -0
  114. data/config/locales/lt.yml +18 -0
  115. data/config/locales/nl.yml +20 -0
  116. data/config/locales/pt-BR.yml +18 -0
  117. data/config/locales/ru.yml +19 -0
  118. data/config/locales/sv.yml +19 -0
  119. data/config/locales/tr.yml +18 -0
  120. data/config/routes.rb +3 -0
  121. data/init.rb +54 -0
  122. data/lang/bg.yml +17 -0
  123. data/lang/ca-fr.yml +17 -0
  124. data/lang/cs.yml +15 -0
  125. data/lang/da.yml +15 -0
  126. data/lang/de.yml +17 -0
  127. data/lang/en.yml +21 -0
  128. data/lang/es.yml +18 -0
  129. data/lang/fr.yml +16 -0
  130. data/lang/hu.yml +15 -0
  131. data/lang/it.yml +15 -0
  132. data/lang/ja.yml +17 -0
  133. data/lang/ko.yml +17 -0
  134. data/lang/lt.yml +17 -0
  135. data/lang/pt-br.yml +17 -0
  136. data/lang/ru.yml +15 -0
  137. data/lang/sv.yml +18 -0
  138. data/lang/tr.yml +17 -0
  139. data/lib/redmine_stuff_to_do/stuff_to_do_compatibility.rb +15 -0
  140. data/lib/stuff_to_do_array_patch.rb +8 -0
  141. data/lib/stuff_to_do_issue_patch.rb +57 -0
  142. data/lib/stuff_to_do_project_patch.rb +31 -0
  143. data/lib/stuff_to_do_user_patch.rb +10 -0
  144. data/rails/init.rb +1 -0
  145. data/spec/controllers/stuff_to_do_controller_add_to_time_grid_spec.rb +58 -0
  146. data/spec/controllers/stuff_to_do_controller_index_spec.rb +155 -0
  147. data/spec/controllers/stuff_to_do_controller_remove_from_time_grid_spec.rb +56 -0
  148. data/spec/controllers/stuff_to_do_controller_reorder_spec.rb +179 -0
  149. data/spec/controllers/stuff_to_do_controller_save_time_entries_spec.rb +56 -0
  150. data/spec/controllers/stuff_to_do_private_methods_spec.rb +82 -0
  151. data/spec/lib/stuff_to_do_issue_patch_spec.rb +60 -0
  152. data/spec/lib/stuff_to_do_project_patch_spec.rb +50 -0
  153. data/spec/lib/stuff_to_do_user_patch_spec.rb +8 -0
  154. data/spec/models/stuff_to_do_filter_spec.rb +3 -0
  155. data/spec/models/stuff_to_do_mailer_spec.rb +42 -0
  156. data/spec/models/stuff_to_do_spec.rb +426 -0
  157. data/spec/sanity_spec.rb +7 -0
  158. data/spec/spec_helper.rb +130 -0
  159. metadata +211 -0
@@ -0,0 +1,533 @@
1
+ /*
2
+ * jQuery UI @VERSION
3
+ *
4
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
5
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
6
+ * and GPL (GPL-LICENSE.txt) licenses.
7
+ *
8
+ * http://docs.jquery.com/UI
9
+ */
10
+ ;(function($) {
11
+
12
+ var _remove = $.fn.remove,
13
+ isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);
14
+
15
+ //Helper functions and ui object
16
+ $.ui = {
17
+
18
+ version: "@VERSION",
19
+
20
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
21
+ plugin: {
22
+ add: function(module, option, set) {
23
+ var proto = $.ui[module].prototype;
24
+ for(var i in set) {
25
+ proto.plugins[i] = proto.plugins[i] || [];
26
+ proto.plugins[i].push([option, set[i]]);
27
+ }
28
+ },
29
+ call: function(instance, name, args) {
30
+ var set = instance.plugins[name];
31
+ if(!set) { return; }
32
+
33
+ for (var i = 0; i < set.length; i++) {
34
+ if (instance.options[set[i][0]]) {
35
+ set[i][1].apply(instance.element, args);
36
+ }
37
+ }
38
+ }
39
+ },
40
+
41
+ contains: function(a, b) {
42
+ var safari2 = $.browser.safari && $.browser.version < 522;
43
+ if (a.contains && !safari2) {
44
+ return a.contains(b);
45
+ }
46
+ if (a.compareDocumentPosition)
47
+ return !!(a.compareDocumentPosition(b) & 16);
48
+ while (b = b.parentNode)
49
+ if (b == a) return true;
50
+ return false;
51
+ },
52
+
53
+ cssCache: {},
54
+ css: function(name) {
55
+ if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; }
56
+ var tmp = $('<div class="ui-gen">').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body');
57
+
58
+ //if (!$.browser.safari)
59
+ //tmp.appendTo('body');
60
+
61
+ //Opera and Safari set width and height to 0px instead of auto
62
+ //Safari returns rgba(0,0,0,0) when bgcolor is not set
63
+ $.ui.cssCache[name] = !!(
64
+ (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) ||
65
+ !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor')))
66
+ );
67
+ try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){}
68
+ return $.ui.cssCache[name];
69
+ },
70
+
71
+ hasScroll: function(el, a) {
72
+
73
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
74
+ if ($(el).css('overflow') == 'hidden') { return false; }
75
+
76
+ var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
77
+ has = false;
78
+
79
+ if (el[scroll] > 0) { return true; }
80
+
81
+ // TODO: determine which cases actually cause this to happen
82
+ // if the element doesn't have the scroll set, see if it's possible to
83
+ // set the scroll
84
+ el[scroll] = 1;
85
+ has = (el[scroll] > 0);
86
+ el[scroll] = 0;
87
+ return has;
88
+ },
89
+
90
+ isOverAxis: function(x, reference, size) {
91
+ //Determines when x coordinate is over "b" element axis
92
+ return (x > reference) && (x < (reference + size));
93
+ },
94
+
95
+ isOver: function(y, x, top, left, height, width) {
96
+ //Determines when x, y coordinates is over "b" element
97
+ return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
98
+ },
99
+
100
+ keyCode: {
101
+ BACKSPACE: 8,
102
+ CAPS_LOCK: 20,
103
+ COMMA: 188,
104
+ CONTROL: 17,
105
+ DELETE: 46,
106
+ DOWN: 40,
107
+ END: 35,
108
+ ENTER: 13,
109
+ ESCAPE: 27,
110
+ HOME: 36,
111
+ INSERT: 45,
112
+ LEFT: 37,
113
+ NUMPAD_ADD: 107,
114
+ NUMPAD_DECIMAL: 110,
115
+ NUMPAD_DIVIDE: 111,
116
+ NUMPAD_ENTER: 108,
117
+ NUMPAD_MULTIPLY: 106,
118
+ NUMPAD_SUBTRACT: 109,
119
+ PAGE_DOWN: 34,
120
+ PAGE_UP: 33,
121
+ PERIOD: 190,
122
+ RIGHT: 39,
123
+ SHIFT: 16,
124
+ SPACE: 32,
125
+ TAB: 9,
126
+ UP: 38
127
+ }
128
+
129
+ };
130
+
131
+ // WAI-ARIA normalization
132
+ if (isFF2) {
133
+ var attr = $.attr,
134
+ removeAttr = $.fn.removeAttr,
135
+ ariaNS = "http://www.w3.org/2005/07/aaa",
136
+ ariaState = /^aria-/,
137
+ ariaRole = /^wairole:/;
138
+
139
+ $.attr = function(elem, name, value) {
140
+ var set = value !== undefined;
141
+
142
+ return (name == 'role'
143
+ ? (set
144
+ ? attr.call(this, elem, name, "wairole:" + value)
145
+ : (attr.apply(this, arguments) || "").replace(ariaRole, ""))
146
+ : (ariaState.test(name)
147
+ ? (set
148
+ ? elem.setAttributeNS(ariaNS,
149
+ name.replace(ariaState, "aaa:"), value)
150
+ : attr.call(this, elem, name.replace(ariaState, "aaa:")))
151
+ : attr.apply(this, arguments)));
152
+ };
153
+
154
+ $.fn.removeAttr = function(name) {
155
+ return (ariaState.test(name)
156
+ ? this.each(function() {
157
+ this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
158
+ }) : removeAttr.call(this, name));
159
+ };
160
+ }
161
+
162
+ //jQuery plugins
163
+ $.fn.extend({
164
+
165
+ remove: function() {
166
+ // Safari has a native remove event which actually removes DOM elements,
167
+ // so we have to use triggerHandler instead of trigger (#3037).
168
+ $("*", this).add(this).each(function() {
169
+ $(this).triggerHandler("remove");
170
+ });
171
+ return _remove.apply(this, arguments );
172
+ },
173
+
174
+ enableSelection: function() {
175
+ return this
176
+ .attr('unselectable', 'off')
177
+ .css('MozUserSelect', '')
178
+ .unbind('selectstart.ui');
179
+ },
180
+
181
+ disableSelection: function() {
182
+ return this
183
+ .attr('unselectable', 'on')
184
+ .css('MozUserSelect', 'none')
185
+ .bind('selectstart.ui', function() { return false; });
186
+ },
187
+
188
+ scrollParent: function() {
189
+
190
+ var scrollParent;
191
+ if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
192
+ scrollParent = this.parents().filter(function() {
193
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
194
+ }).eq(0);
195
+ } else {
196
+ scrollParent = this.parents().filter(function() {
197
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
198
+ }).eq(0);
199
+ }
200
+
201
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
202
+
203
+
204
+ }
205
+
206
+ });
207
+
208
+
209
+ //Additional selectors
210
+ $.extend($.expr[':'], {
211
+
212
+ data: function(a, i, m) {
213
+ return $.data(a, m[3]);
214
+ },
215
+
216
+ // TODO: add support for object, area
217
+ tabbable: function(a, i, m) {
218
+
219
+ var nodeName = a.nodeName.toLowerCase();
220
+ function isVisible(element) {
221
+ return !($(element).is(':hidden') || $(element).parents(':hidden').length);
222
+ }
223
+
224
+ return (
225
+ // in tab order
226
+ a.tabIndex >= 0 &&
227
+
228
+ ( // filter node types that participate in the tab order
229
+
230
+ // anchor tag
231
+ ('a' == nodeName && a.href) ||
232
+
233
+ // enabled form element
234
+ (/input|select|textarea|button/.test(nodeName) &&
235
+ 'hidden' != a.type && !a.disabled)
236
+ ) &&
237
+
238
+ // visible on page
239
+ isVisible(a)
240
+ );
241
+
242
+ }
243
+
244
+ });
245
+
246
+
247
+ // $.widget is a factory to create jQuery plugins
248
+ // taking some boilerplate code out of the plugin code
249
+ function getter(namespace, plugin, method, args) {
250
+ function getMethods(type) {
251
+ var methods = $[namespace][plugin][type] || [];
252
+ return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
253
+ }
254
+
255
+ var methods = getMethods('getter');
256
+ if (args.length == 1 && typeof args[0] == 'string') {
257
+ methods = methods.concat(getMethods('getterSetter'));
258
+ }
259
+ return ($.inArray(method, methods) != -1);
260
+ }
261
+
262
+ $.widget = function(name, prototype) {
263
+ var namespace = name.split(".")[0];
264
+ name = name.split(".")[1];
265
+
266
+ // create plugin method
267
+ $.fn[name] = function(options) {
268
+ var isMethodCall = (typeof options == 'string'),
269
+ args = Array.prototype.slice.call(arguments, 1);
270
+
271
+ // prevent calls to internal methods
272
+ if (isMethodCall && options.substring(0, 1) == '_') {
273
+ return this;
274
+ }
275
+
276
+ // handle getter methods
277
+ if (isMethodCall && getter(namespace, name, options, args)) {
278
+ var instance = $.data(this[0], name);
279
+ return (instance ? instance[options].apply(instance, args)
280
+ : undefined);
281
+ }
282
+
283
+ // handle initialization and non-getter methods
284
+ return this.each(function() {
285
+ var instance = $.data(this, name);
286
+
287
+ // constructor
288
+ (!instance && !isMethodCall &&
289
+ $.data(this, name, new $[namespace][name](this, options)));
290
+
291
+ // method call
292
+ (instance && isMethodCall && $.isFunction(instance[options]) &&
293
+ instance[options].apply(instance, args));
294
+ });
295
+ };
296
+
297
+ // create widget constructor
298
+ $[namespace] = $[namespace] || {};
299
+ $[namespace][name] = function(element, options) {
300
+ var self = this;
301
+
302
+ this.namespace = namespace;
303
+ this.widgetName = name;
304
+ this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
305
+ this.widgetBaseClass = namespace + '-' + name;
306
+
307
+ this.options = $.extend({},
308
+ $.widget.defaults,
309
+ $[namespace][name].defaults,
310
+ $.metadata && $.metadata.get(element)[name],
311
+ options);
312
+
313
+ this.element = $(element)
314
+ .bind('setData.' + name, function(event, key, value) {
315
+ return self._setData(key, value);
316
+ })
317
+ .bind('getData.' + name, function(event, key) {
318
+ return self._getData(key);
319
+ })
320
+ .bind('remove', function() {
321
+ return self.destroy();
322
+ });
323
+
324
+ this._init();
325
+ };
326
+
327
+ // add widget prototype
328
+ $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
329
+
330
+ // TODO: merge getter and getterSetter properties from widget prototype
331
+ // and plugin prototype
332
+ $[namespace][name].getterSetter = 'option';
333
+ };
334
+
335
+ $.widget.prototype = {
336
+ _init: function() {},
337
+ destroy: function() {
338
+ this.element.removeData(this.widgetName)
339
+ .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
340
+ .removeAttr('aria-disabled');
341
+ },
342
+
343
+ option: function(key, value) {
344
+ var options = key,
345
+ self = this;
346
+
347
+ if (typeof key == "string") {
348
+ if (value === undefined) {
349
+ return this._getData(key);
350
+ }
351
+ options = {};
352
+ options[key] = value;
353
+ }
354
+
355
+ $.each(options, function(key, value) {
356
+ self._setData(key, value);
357
+ });
358
+ },
359
+ _getData: function(key) {
360
+ return this.options[key];
361
+ },
362
+ _setData: function(key, value) {
363
+ this.options[key] = value;
364
+
365
+ if (key == 'disabled') {
366
+ this.element[value ? 'addClass' : 'removeClass'](
367
+ this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
368
+ .attr("aria-disabled", value);
369
+ }
370
+ },
371
+
372
+ enable: function() {
373
+ this._setData('disabled', false);
374
+ },
375
+ disable: function() {
376
+ this._setData('disabled', true);
377
+ },
378
+
379
+ _trigger: function(type, event, data) {
380
+ var eventName = (type == this.widgetEventPrefix
381
+ ? type : this.widgetEventPrefix + type);
382
+ event = event || $.event.fix({ type: eventName, target: this.element[0] });
383
+ return this.element.triggerHandler(eventName, [event, data], this.options[type]);
384
+ }
385
+ };
386
+
387
+ $.widget.defaults = {
388
+ disabled: false
389
+ };
390
+
391
+
392
+ /** Mouse Interaction Plugin **/
393
+
394
+ $.ui.mouse = {
395
+ _mouseInit: function() {
396
+ var self = this;
397
+
398
+ this.element
399
+ .bind('mousedown.'+this.widgetName, function(event) {
400
+ return self._mouseDown(event);
401
+ })
402
+ .bind('click.'+this.widgetName, function(event) {
403
+ if(self._preventClickEvent) {
404
+ self._preventClickEvent = false;
405
+ return false;
406
+ }
407
+ });
408
+
409
+ // Prevent text selection in IE
410
+ if ($.browser.msie) {
411
+ this._mouseUnselectable = this.element.attr('unselectable');
412
+ this.element.attr('unselectable', 'on');
413
+ }
414
+
415
+ this.started = false;
416
+ },
417
+
418
+ // TODO: make sure destroying one instance of mouse doesn't mess with
419
+ // other instances of mouse
420
+ _mouseDestroy: function() {
421
+ this.element.unbind('.'+this.widgetName);
422
+
423
+ // Restore text selection in IE
424
+ ($.browser.msie
425
+ && this.element.attr('unselectable', this._mouseUnselectable));
426
+ },
427
+
428
+ _mouseDown: function(event) {
429
+ // we may have missed mouseup (out of window)
430
+ (this._mouseStarted && this._mouseUp(event));
431
+
432
+ this._mouseDownEvent = event;
433
+
434
+ var self = this,
435
+ btnIsLeft = (event.which == 1),
436
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
437
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
438
+ return true;
439
+ }
440
+
441
+ this.mouseDelayMet = !this.options.delay;
442
+ if (!this.mouseDelayMet) {
443
+ this._mouseDelayTimer = setTimeout(function() {
444
+ self.mouseDelayMet = true;
445
+ }, this.options.delay);
446
+ }
447
+
448
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
449
+ this._mouseStarted = (this._mouseStart(event) !== false);
450
+ if (!this._mouseStarted) {
451
+ event.preventDefault();
452
+ return true;
453
+ }
454
+ }
455
+
456
+ // these delegates are required to keep context
457
+ this._mouseMoveDelegate = function(event) {
458
+ return self._mouseMove(event);
459
+ };
460
+ this._mouseUpDelegate = function(event) {
461
+ return self._mouseUp(event);
462
+ };
463
+ $(document)
464
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
465
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
466
+
467
+ // preventDefault() is used to prevent the selection of text here -
468
+ // however, in Safari, this causes select boxes not to be selectable
469
+ // anymore, so this fix is needed
470
+ if(!$.browser.safari) event.preventDefault();
471
+ return true;
472
+ },
473
+
474
+ _mouseMove: function(event) {
475
+ // IE mouseup check - mouseup happened when mouse was out of window
476
+ if ($.browser.msie && !event.button) {
477
+ return this._mouseUp(event);
478
+ }
479
+
480
+ if (this._mouseStarted) {
481
+ this._mouseDrag(event);
482
+ return event.preventDefault();
483
+ }
484
+
485
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
486
+ this._mouseStarted =
487
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
488
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
489
+ }
490
+
491
+ return !this._mouseStarted;
492
+ },
493
+
494
+ _mouseUp: function(event) {
495
+ $(document)
496
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
497
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
498
+
499
+ if (this._mouseStarted) {
500
+ this._mouseStarted = false;
501
+ this._preventClickEvent = true;
502
+ this._mouseStop(event);
503
+ }
504
+
505
+ return false;
506
+ },
507
+
508
+ _mouseDistanceMet: function(event) {
509
+ return (Math.max(
510
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
511
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
512
+ ) >= this.options.distance
513
+ );
514
+ },
515
+
516
+ _mouseDelayMet: function(event) {
517
+ return this.mouseDelayMet;
518
+ },
519
+
520
+ // These are placeholder methods, to be overriden by extending plugin
521
+ _mouseStart: function(event) {},
522
+ _mouseDrag: function(event) {},
523
+ _mouseStop: function(event) {},
524
+ _mouseCapture: function(event) { return true; }
525
+ };
526
+
527
+ $.ui.mouse.defaults = {
528
+ cancel: null,
529
+ distance: 1,
530
+ delay: 0
531
+ };
532
+
533
+ })(jQuery);