right-rails 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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(",")));