right-rails 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +50 -0
  3. data/Rakefile +23 -0
  4. data/generators/right_rails/right_rails_generator.rb +41 -0
  5. data/generators/right_rails/templates/iframed.html.erb +10 -0
  6. data/generators/right_scaffold/right_scaffold_generator.rb +53 -0
  7. data/generators/right_scaffold/templates/controller.rb +99 -0
  8. data/generators/right_scaffold/templates/helper.rb +2 -0
  9. data/generators/right_scaffold/templates/layout.html.erb +18 -0
  10. data/generators/right_scaffold/templates/style.css +54 -0
  11. data/generators/right_scaffold/templates/view__form.html.erb +16 -0
  12. data/generators/right_scaffold/templates/view__item.html.erb +13 -0
  13. data/generators/right_scaffold/templates/view_edit.html.erb +6 -0
  14. data/generators/right_scaffold/templates/view_index.html.erb +9 -0
  15. data/generators/right_scaffold/templates/view_new.html.erb +5 -0
  16. data/generators/right_scaffold/templates/view_show.html.erb +10 -0
  17. data/init.rb +12 -0
  18. data/javascripts/right-autocompleter-src.js +303 -0
  19. data/javascripts/right-autocompleter.js +9 -0
  20. data/javascripts/right-behavior-src.js +240 -0
  21. data/javascripts/right-behavior.js +8 -0
  22. data/javascripts/right-calendar-src.js +855 -0
  23. data/javascripts/right-calendar.js +9 -0
  24. data/javascripts/right-dnd-src.js +555 -0
  25. data/javascripts/right-dnd.js +9 -0
  26. data/javascripts/right-effects-src.js +425 -0
  27. data/javascripts/right-effects.js +6 -0
  28. data/javascripts/right-events-src.js +369 -0
  29. data/javascripts/right-events.js +6 -0
  30. data/javascripts/right-json-src.js +176 -0
  31. data/javascripts/right-json.js +6 -0
  32. data/javascripts/right-lightbox-src.js +597 -0
  33. data/javascripts/right-lightbox.js +9 -0
  34. data/javascripts/right-rails-src.js +269 -0
  35. data/javascripts/right-rails.js +9 -0
  36. data/javascripts/right-rater-src.js +248 -0
  37. data/javascripts/right-rater.js +9 -0
  38. data/javascripts/right-selectable-src.js +507 -0
  39. data/javascripts/right-selectable.js +7 -0
  40. data/javascripts/right-slider-src.js +291 -0
  41. data/javascripts/right-slider.js +7 -0
  42. data/javascripts/right-sortable-src.js +221 -0
  43. data/javascripts/right-sortable.js +9 -0
  44. data/javascripts/right-src.js +4939 -0
  45. data/javascripts/right-tabs-src.js +776 -0
  46. data/javascripts/right-tabs.js +6 -0
  47. data/javascripts/right-tooltips-src.js +130 -0
  48. data/javascripts/right-tooltips.js +9 -0
  49. data/javascripts/right-ui-i18n-de.js +29 -0
  50. data/javascripts/right-ui-i18n-en-us.js +11 -0
  51. data/javascripts/right-ui-i18n-es.js +29 -0
  52. data/javascripts/right-ui-i18n-fr.js +29 -0
  53. data/javascripts/right-ui-i18n-jp.js +33 -0
  54. data/javascripts/right-ui-i18n-ru.js +29 -0
  55. data/javascripts/right-ui-i18n-uk.js +29 -0
  56. data/javascripts/right.js +10 -0
  57. data/lib/right-rails.rb +11 -0
  58. data/lib/right_rails/controller_extensions.rb +85 -0
  59. data/lib/right_rails/helpers/basic.rb +111 -0
  60. data/lib/right_rails/helpers/forms.rb +239 -0
  61. data/lib/right_rails/helpers/misc.rb +164 -0
  62. data/lib/right_rails/helpers/rails.rb +166 -0
  63. data/lib/right_rails/helpers.rb +5 -0
  64. data/lib/right_rails/java_script_generator.rb +313 -0
  65. data/lib/right_rails.rb +6 -0
  66. data/spec/lib/right_rails/controller_extensions_spec.rb +60 -0
  67. data/spec/lib/right_rails/helpers/basic_spec.rb +74 -0
  68. data/spec/lib/right_rails/helpers/forms_spec.rb +51 -0
  69. data/spec/lib/right_rails/helpers/misc_spec.rb +120 -0
  70. data/spec/lib/right_rails/helpers/rails_spec.rb +149 -0
  71. data/spec/lib/right_rails/java_script_generator_spec.rb +317 -0
  72. data/spec/spec.opts +5 -0
  73. data/spec/spec_helper.rb +15 -0
  74. metadata +128 -0
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Additional visual effects module
3
+ *
4
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
5
+ */
6
+ if (!self.Fx) throw "RightJS Fx is missing";
7
+ /**
8
+ * The basic move visual effect
9
+ *
10
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
11
+ */
12
+ Fx.Move = new Class(Fx.Morph, {
13
+ extend: {
14
+ Options: Object.merge(Fx.Options, {
15
+ duration: 'long',
16
+ position: 'absolute' // <- defines the positions measurment principle, not the element positioning
17
+ })
18
+ },
19
+
20
+ prepare: function(end_position) {
21
+ return this.$super(this.getEndPosition(end_position));
22
+ },
23
+
24
+ // moved to a separated method to be able to call it from subclasses
25
+ getEndPosition: function(end_position) {
26
+ var position = this.element.getStyle('position'), end_style = {};
27
+
28
+ if (position != 'absolute' || position != 'relative') {
29
+ this.element.style.position = position = position == 'fixed' ? 'absolute' : 'relative';
30
+ }
31
+
32
+ if (end_position.top) end_position.y = end_position.top.toInt();
33
+ if (end_position.left) end_position.x = end_position.left.toInt();
34
+
35
+ // adjusting the end position
36
+ var cur_position = this.element.position();
37
+ var par_position = this.getParentPosition();
38
+ var rel_left = cur_position.x - par_position.x;
39
+ var rel_top = cur_position.y - par_position.y;
40
+
41
+ if (this.options.position == 'relative') {
42
+ if (position == 'absolute') {
43
+ if (defined(end_position.x)) end_position.x += cur_position.x;
44
+ if (defined(end_position.y)) end_position.y += cur_position.x;
45
+ } else {
46
+ if (defined(end_position.x)) end_position.x += rel_left;
47
+ if (defined(end_position.y)) end_position.y += rel_top;
48
+ }
49
+ } else if (position == 'relative') {
50
+ if (defined(end_position.x)) end_position.x += rel_left - cur_position.x;
51
+ if (defined(end_position.y)) end_position.y += rel_top - cur_position.y;
52
+ }
53
+
54
+ // need this to bypass the other styles from the subclasses
55
+ for (var key in end_position) {
56
+ switch (key) {
57
+ case 'top': case 'left': break;
58
+ case 'y': end_style.top = end_position.y + 'px'; break;
59
+ case 'x': end_style.left = end_position.x + 'px'; break;
60
+ default: end_style[key] = end_position[key];
61
+ }
62
+ }
63
+
64
+ return end_style;
65
+ },
66
+
67
+ getParentPosition: function() {
68
+ Fx.Move.Dummy = Fx.Move.Dummy || new Element('div', {style: 'width:0;height:0;visibility:hidden'});
69
+ this.element.insert(Fx.Move.Dummy, 'before');
70
+ var position = Fx.Move.Dummy.position();
71
+ Fx.Move.Dummy.remove();
72
+ return position;
73
+ }
74
+ });
75
+ /**
76
+ * Zoom visual effect, graduately zoom and element in or out
77
+ *
78
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
79
+ */
80
+ Fx.Zoom = new Class(Fx.Move, {
81
+ PROPERTIES: $w('width height lineHeight paddingTop paddingRight paddingBottom paddingLeft fontSize borderWidth'),
82
+
83
+ extend: {
84
+ Options: Object.merge(Fx.Move.Options, {
85
+ position: 'relative', // overriding the Fx.Move default
86
+ duration: 'normal',
87
+ from: 'center'
88
+ })
89
+ },
90
+
91
+ prepare: function(size, additional_styles) {
92
+ return this.$super(this._getZoomedStyle(size, additional_styles));
93
+ },
94
+
95
+ // private
96
+
97
+ // calculates the end zoommed style
98
+ _getZoomedStyle: function(size, additional_styles) {
99
+ var proportion = this._getProportion(size);
100
+
101
+ return Object.merge(
102
+ this._getBasicStyle(proportion),
103
+ this._getEndPosition(proportion),
104
+ additional_styles || {}
105
+ );
106
+ },
107
+
108
+ // calculates the zooming proportion
109
+ _getProportion: function(size) {
110
+ if (isHash(size)) {
111
+ var sizes = $E('div').insertTo(
112
+ $E('div', {style: "visibility:hidden;float:left;height:0;width:0"}).insertTo(document.body)
113
+ ).setStyle(size).sizes();
114
+
115
+ if ('height' in size) size = sizes.y / this.element.sizes().y;
116
+ else size = sizes.x / this.element.sizes().x;
117
+ } else if (isString(size)) {
118
+ size = size.endsWith('%') ? size.toFloat() / 100 : size.toFloat();
119
+ }
120
+
121
+ return size;
122
+ },
123
+
124
+ // getting the basic end style
125
+ _getBasicStyle: function(proportion) {
126
+ var style = this._getStyle(this.element, this.PROPERTIES);
127
+
128
+ this._cleanStyle(style);
129
+
130
+ for (var key in style) {
131
+ if (style[key][0] > 0) {
132
+ style[key] = (proportion * style[key][0]) + style[key][1];
133
+ } else {
134
+ delete(style[key]);
135
+ }
136
+ }
137
+ // preventing the border disappearance
138
+ if (style.borderWidth && style.borderWidth.toFloat() < 1) {
139
+ style.borderWidth = '1px';
140
+ }
141
+
142
+ return style;
143
+ },
144
+
145
+ // getting the position adjustments
146
+ _getEndPosition: function(proportion) {
147
+ var position = {};
148
+ var sizes = this.element.sizes();
149
+ var x_diff = sizes.x * (proportion - 1);
150
+ var y_diff = sizes.y * (proportion - 1);
151
+
152
+ switch (this.options.from.replace('-', ' ').split(' ').sort().join('_')) {
153
+ case 'top':
154
+ position.x = - x_diff / 2;
155
+ break;
156
+
157
+ case 'right':
158
+ position.x = - x_diff;
159
+ position.y = - y_diff / 2;
160
+ break;
161
+
162
+ case 'bottom':
163
+ position.x = - x_diff / 2;
164
+ case 'bottom_left':
165
+ position.y = - y_diff;
166
+ break;
167
+
168
+ case 'bottom_right':
169
+ position.y = - y_diff;
170
+ case 'right_top':
171
+ position.x = - x_diff;
172
+ break;
173
+
174
+ case 'center':
175
+ position.x = - x_diff / 2;
176
+ case 'left':
177
+ position.y = - y_diff / 2;
178
+ break;
179
+
180
+ default: // left_top or none, do nothing, let the thing expand as is
181
+ }
182
+
183
+ return position;
184
+ }
185
+ });
186
+ /**
187
+ * Bounce visual effect, slightly moves an element forward and back
188
+ *
189
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
190
+ */
191
+ Fx.Bounce = new Class(Fx, {
192
+ extend: {
193
+ Options: Object.merge(Fx.Options, {
194
+ duration: 'short',
195
+ direction: 'top',
196
+ value: 16 // the shake distance
197
+ })
198
+ },
199
+
200
+ prepare: function(value) {
201
+ value = value || this.options.value;
202
+
203
+ var position = this.element.position();
204
+ var duration = Fx.Durations[this.options.duration] || this.options.duration;
205
+ var move_options = {duration: duration, position: 'relative'};
206
+
207
+ var key = 'y'; // top bounce by default
208
+
209
+ switch (this.options.direction) {
210
+ case 'right':
211
+ value = -value;
212
+ case 'left':
213
+ key = 'x';
214
+ break;
215
+ case 'bottom':
216
+ value = -value;
217
+ }
218
+
219
+ var up_pos = {}, down_pos = {};
220
+ up_pos[key] = -value;
221
+ down_pos[key] = value;
222
+
223
+ new Fx.Move(this.element, move_options).start(up_pos);
224
+ new Fx.Move(this.element, move_options).start(down_pos);
225
+
226
+ this.finish.bind(this).delay(1);
227
+
228
+ return this;
229
+ }
230
+ });
231
+ /**
232
+ * run out and run in efffects
233
+ *
234
+ * Copyright (C) 2009 Nikolay V. Nemshilov aka St.
235
+ */
236
+ Fx.Run = new Class(Fx.Move, {
237
+ extend: {
238
+ Options: Object.merge(Fx.Move.Options, {
239
+ direction: 'left'
240
+ })
241
+ },
242
+
243
+ prepare: function(how) {
244
+ var how = how || 'toggle', position = {}, dimensions = this.element.dimensions(), threshold = 80;
245
+
246
+ if (how == 'out' || (how == 'toggle' && this.element.visible())) {
247
+ if (this.options.direction == 'left') {
248
+ position.x = -dimensions.width - threshold;
249
+ } else {
250
+ position.y = -dimensions.height - threshold;
251
+ }
252
+ this.onFinish(function() {
253
+ this.element.hide().setStyle(this.getEndPosition({x: dimensions.left, y: dimensions.top}));
254
+ })
255
+ } else {
256
+ dimensions = this.element.setStyle('visibility: hidden').show().dimensions();
257
+ var pre_position = {};
258
+
259
+ if (this.options.direction == 'left') {
260
+ pre_position.x = - dimensions.width - threshold;
261
+ position.x = dimensions.left;
262
+ } else {
263
+ pre_position.y = - dimensions.height - threshold;
264
+ position.y = dimensions.top;
265
+ }
266
+
267
+ this.element.setStyle(this.getEndPosition(pre_position)).setStyle('visibility: visible');
268
+ }
269
+
270
+ return this.$super(position);
271
+ }
272
+ });
273
+ /**
274
+ * The puff visual effect
275
+ *
276
+ * Copyright (C) Nikolay V. Nemshilov aka St.
277
+ */
278
+ Fx.Puff = new Class(Fx.Zoom, {
279
+ extend: {
280
+ Options: Object.merge(Fx.Zoom.Options, {
281
+ size: 1.4 // the end/initial size of the element
282
+ })
283
+ },
284
+
285
+ // protected
286
+
287
+ prepare: function(how) {
288
+ var how = how || 'toggle', opacity = 0, size = this.options.size;
289
+
290
+ if (how == 'out' || (how == 'toggle' && this.element.visible())) {
291
+ var initial_style = this.getEndPosition(this._getZoomedStyle(1));
292
+ this.onFinish(function() {
293
+ initial_style.opacity = 1;
294
+ this.element.hide().setStyle(initial_style);
295
+ });
296
+
297
+ } else {
298
+ this.element.setStyle('visibility: visible').show();
299
+
300
+ var width = this.element.offsetWidth;
301
+ var initial_style = this.getEndPosition(this._getZoomedStyle(1));
302
+
303
+ this.onFinish(function() {
304
+ this.element.setStyle(initial_style);
305
+ });
306
+
307
+ this.element.setStyle(Object.merge(
308
+ this.getEndPosition(this._getZoomedStyle(size)), {
309
+ opacity: 0,
310
+ visibility: 'visible'
311
+ }
312
+ ));
313
+
314
+ size = width / this.element.offsetWidth;
315
+ opacity = 1;
316
+ }
317
+
318
+
319
+ return this.$super(size, {opacity: opacity});
320
+ }
321
+
322
+ });
323
+ /**
324
+ * Handles the to-class and from-class visual effects
325
+ *
326
+ * Copyright (C) Nikolay V. Nemshilov aka St.
327
+ */
328
+ Fx.CSS = new Class(Fx.Morph, {
329
+ // the list of styles to watch
330
+ STYLES: $w('width height lineHeight opacity borderWidth borderColor padding margin color fontSize backgroundColor marginTop marginLeft marginRight marginBottom top left right bottom'),
331
+
332
+ // protected
333
+
334
+ prepare: function(add_class, remove_class) {
335
+ // grabbing the end style
336
+ var dummy = this._dummy().addClass(add_class||'').removeClass(remove_class||'');
337
+ var style = this._getStyle(dummy, this.STYLES);
338
+ dummy.remove();
339
+
340
+ // Opera 10 has some trash in the borderWidth style if it was not set
341
+ if (Browser.Opera && !/^\d+[a-z]+/.test(style.borderWidth))
342
+ delete(style.borderWidth);
343
+
344
+ // wiring the classes add/remove on-finish
345
+ if (add_class) this.onFinish(this.element.addClass.bind(this.element, add_class));
346
+ if (remove_class) this.onFinish(this.element.removeClass.bind(this.element, remove_class));
347
+
348
+ return this.$super(style);
349
+ }
350
+ });
351
+ /**
352
+ * Element shortcuts for the additional effects
353
+ *
354
+ * @copyright (C) 2009 Nikolay V. Nemshilov aka St.
355
+ */
356
+ Element.addMethods({
357
+ /**
358
+ * The move visual effect shortcut
359
+ *
360
+ * @param Object end position x/y or top/left
361
+ * @param Object fx options
362
+ * @return Element self
363
+ */
364
+ move: function(position, options) {
365
+ return this.fx('move', [position, options || {}]); // <- don't replace with arguments
366
+ },
367
+
368
+ /**
369
+ * The bounce effect shortcut
370
+ *
371
+ * @param Number optional bounce size
372
+ * @param Object fx options
373
+ * @return Element self
374
+ */
375
+ bounce: function() {
376
+ return this.fx('bounce', arguments);
377
+ },
378
+
379
+ /**
380
+ * The zoom effect shortcut
381
+ *
382
+ * @param mixed the zooming value, see Fx.Zoom#start options
383
+ * @param Object fx options
384
+ * @return Element self
385
+ */
386
+ zoom: function(size, options) {
387
+ return this.fx('zoom', [size, options || {}]);
388
+ },
389
+
390
+ /**
391
+ * Initiates the Fx.Run effect
392
+ *
393
+ * @param String running direction
394
+ * @param Object fx options
395
+ * @return Element self
396
+ */
397
+ run: function() {
398
+ return this.fx('run', arguments);
399
+ },
400
+
401
+ /**
402
+ * The puff effect shortcut
403
+ *
404
+ * @param String running direction in|out|toggle
405
+ * @param Object fx options
406
+ * @return Element self
407
+ */
408
+ puff: function() {
409
+ return this.fx('puff', arguments);
410
+ },
411
+
412
+ /**
413
+ * The Fx.Class effect shortcut
414
+ *
415
+ * @param String css-class name to add
416
+ * @param String css-class name to remove
417
+ * @param Object fx options
418
+ */
419
+ morphToClass: function() {
420
+ var args = $A(arguments);
421
+ if (args[0] === null) args[0] = '';
422
+
423
+ return this.fx('CSS', args);
424
+ }
425
+ });
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Additional visual effects module
3
+ *
4
+ * Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
5
+ */
6
+ if (!self.Fx) throw "RightJS Fx is missing";eval((function(s,d){for(var i=d.length-1;i>-1;i--)if(d[i])s=s.replace(new RegExp(i,'g'),d[i]);return s})("Fx.23=37 41(Fx.77,{43:{17:29.34(Fx.17,{25:'long',14:'42'})},31:7(e){9 3.44(3.12(e))},12:7(e){11 b=3.5.get96('14'),a={};if(b!='42'||b!='26')3.5.66.14=b=b=='fixed'?'42':'26';if(e.38)e.y=e.38.76();if(e.22)e.x=e.22.76();11 c=3.5.14();11 p=3.40();11 r=c.x-p.x;11 d=c.y-p.y;if(3.20.14=='26'){if(b=='42'){if(30(e.x))e.x+=c.x;if(30(e.y))e.y+=c.x}33{if(30(e.x))e.x+=r;if(30(e.y))e.y+=d}}33 if(b=='26'){if(30(e.x))e.x+=r-c.x;if(30(e.y))e.y+=d-c.y}90(11 k in e)59(k){19 '38':19 '22':24;19 'y':a.38=e.y+'px';24;19 'x':a.22=e.x+'px';24;67:a[k]=e[k]}9 a},40:7(){Fx.23.48=Fx.23.48||37 68('79',{66:'39:0;28:0;21:58'});3.5.insert(Fx.23.48,'be90e');11 p=Fx.23.48.14();Fx.23.48.73();9 p}});Fx.69=37 41(Fx.23,{56:$w('39 28 57 padding98 padding94 padding93 padding97 65 13'),43:{17:29.34(Fx.23.17,{14:'26',25:'normal',86:'75'})},31:7(s,a){9 3.44(3.18(s,a))},18:7(s,a){11 p=3.49(s);9 29.34(3.47(p),3._12(p),a||{})},49:7(s){if(isHash(s)){11 a=$E('79').64($E('79',{66:\"21:58;float:22;28:0;39:0\"}).64(document.body)).15(s).52();if('28' in s)s=a.y/3.5.52().y;33 s=a.x/3.5.52().x}33 if(isString(s))s=s.endsWith('%')?s.53()/100:s.53();9 s},47:7(p){11 s=3.61(3.5,3.56);3._clean96(s);90(11 k in s){if(s[k][0]>0)s[k]=(p*s[k][0])+s[k][1];33 74(s[k])}if(s.13&&s.13.53()<1)s.13='1px';9 s},_12:7(a){11 p={};11 s=3.5.52();11 x=s.x*(a-1);11 y=s.y*(a-1);59(3.20.86.replace('-',' ').split(' ').sort().join('_')){19 '38':p.x=-x/2;24;19 '62':p.x=-x;p.y=-y/2;24;19 '60':p.x=-x/2;19 '60_22':p.y=-y;24;19 '60_62':p.y=-y;19 '62_38':p.x=-x;24;19 '75':p.x=-x/2;19 '22':p.y=-y/2;24;67:}9 p}});Fx.Bounce=37 41(Fx,{43:{17:29.34(Fx.17,{25:'short',27:'38',78:16})},31:7(v){v=v||3.20.78;11 p=3.5.14();11 a=Fx.Durations[3.20.25]||3.20.25;11 m={25:a,14:'26'};11 k='y';59(3.20.27){19 '62':v=-v;19 '22':k='x';24;19 '60':v=-v}11 u={},d={};u[k]=-v;d[k]=v;37 Fx.23(3.5,m).81(u);37 Fx.23(3.5,m).81(d);3.finish.70(3).delay(1);9 3}});Fx.Run=37 41(Fx.23,{43:{17:29.34(Fx.23.17,{27:'22'})},31:7(h){11 h=h||'50',p={},d=3.5.55(),t=80;if(h=='91'||(h=='50'&&3.5.35())){if(3.20.27=='22')p.x=-d.39-t;33 p.y=-d.28-t;3.32(7(){3.5.88().15(3.12({x:d.22,y:d.38}))})}33{d=3.5.15('21: 58').87().55();11 a={};if(3.20.27=='22'){a.x=-d.39-t;p.x=d.22}33{a.y=-d.28-t;p.y=d.38}3.5.15(3.12(a)).15('21: 35')}9 3.44(p)}});Fx.Puff=37 41(Fx.69,{43:{17:29.34(Fx.69.17,{84:1.4})},31:7(h){11 h=h||'50',o=0,s=3.20.84;if(h=='91'||(h=='50'&&3.5.35())){11 i=3.12(3.18(1));3.32(7(){i.46=1;3.5.88().15(i)})}33{3.5.15('21: 35').87();11 w=3.5.51;11 i=3.12(3.18(1));3.32(7(){3.5.15(i)});3.5.15(29.34(3.12(3.18(s)),{46:0,21:'35'}));s=w/3.5.51;o=1}9 3.44(s,{46:o})}});Fx.92=37 41(Fx.77,{72:$w('39 28 57 46 13 border95 padding margin color 65 background95 margin98 margin97 margin94 margin93 38 22 62 60'),31:7(b,r){11 c=3._dummy().add41(b||'').7341(r||'');11 s=3.61(c,3.72);c.73();if(Browser.Opera&&!/^\\d+[a-z]+/.test(s.13))74(s.13);if(b)3.32(3.5.add41.70(3.5,b));if(r)3.32(3.5.7341.70(3.5,r));9 3.44(s)}});68.addMethods({85:7(p,o){9 3.fx('85',[p,o||{}])},71:7(){9 3.fx('71',36)},83:7(s,o){9 3.fx('83',[s,o||{}])},89:7(){9 3.fx('89',36)},82:7(){9 3.fx('82',36)},morphTo41:7(){11 a=$A(36);if(a[0]===null)a[0]='';9 3.fx('92',a)}});",",,,this,,element,,function,,return,,var,getEndPosition,borderWidth,position,setStyle,,Options,_getZoomedStyle,case,options,visibility,left,Move,break,duration,relative,direction,height,Object,defined,prepare,onFinish,else,merge,visible,arguments,new,top,width,getParentPosition,Class,absolute,extend,$super,_getEndPosition,opacity,_getBasicStyle,Dummy,_getProportion,toggle,offsetWidth,sizes,toFloat,removeClass,dimensions,PROPERTIES,lineHeight,hidden,switch,bottom,_getStyle,right,addClass,insertTo,fontSize,style,default,Element,Zoom,bind,bounce,STYLES,remove,delete,center,toInt,Morph,value,div,,start,puff,zoom,size,move,from,show,hide,run,for,out,CSS,Bottom,Right,Color,Style,Left,Top".split(",")));