right-rails 1.0.3 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/CHANGELOG +8 -2
  2. data/Rakefile +28 -28
  3. data/lib/right_rails/java_script_generator.rb +59 -51
  4. data/public/images/{colorpicker.png → rightjs-ui/colorpicker.png} +0 -0
  5. data/public/images/{resizable.png → rightjs-ui/resizable.png} +0 -0
  6. data/public/javascripts/right-olds-src.js +47 -46
  7. data/public/javascripts/right-safe-src.js +103 -102
  8. data/public/javascripts/right-safe.js +1 -1
  9. data/public/javascripts/right-src.js +611 -541
  10. data/public/javascripts/right.js +86 -85
  11. data/public/javascripts/right/autocompleter-src.js +81 -77
  12. data/public/javascripts/right/autocompleter.js +1 -1
  13. data/public/javascripts/right/calendar-src.js +209 -197
  14. data/public/javascripts/right/calendar.js +6 -6
  15. data/public/javascripts/right/colorpicker-src.js +127 -117
  16. data/public/javascripts/right/colorpicker.js +6 -6
  17. data/public/javascripts/right/dnd-src.js +63 -63
  18. data/public/javascripts/right/dnd.js +2 -2
  19. data/public/javascripts/right/in-edit-src.js +53 -48
  20. data/public/javascripts/right/in-edit.js +2 -2
  21. data/public/javascripts/right/lightbox-src.js +107 -99
  22. data/public/javascripts/right/lightbox.js +2 -2
  23. data/public/javascripts/right/rater-src.js +48 -46
  24. data/public/javascripts/right/rater.js +3 -3
  25. data/public/javascripts/right/resizable-src.js +53 -61
  26. data/public/javascripts/right/resizable.js +4 -4
  27. data/public/javascripts/right/selectable-src.js +97 -95
  28. data/public/javascripts/right/selectable.js +2 -2
  29. data/public/javascripts/right/slider-src.js +47 -45
  30. data/public/javascripts/right/slider.js +8 -8
  31. data/public/javascripts/right/sortable-src.js +54 -52
  32. data/public/javascripts/right/tabs-src.js +181 -171
  33. data/public/javascripts/right/tooltip-src.js +39 -37
  34. data/public/javascripts/right/uploader-src.js +21 -19
  35. data/spec/lib/right_rails/java_script_generator_spec.rb +61 -56
  36. metadata +9 -7
@@ -8,8 +8,8 @@ var Resizable=RightJS.Resizable=function(r,c){var k=c.$,l=c.$w,m=c.$E,t=c.Wrappe
8
8
  d){d=d||this;c.Options.setOptions.call(this,c.Object.merge(h,eval("("+(d.get("data-"+this.key)||"{}")+")")));return this}});f=new c.Wrapper(f,b);c.Observer.createShortcuts(f.prototype,f.EVENTS||[]);return f})({extend:{version:"2.0.0",EVENTS:l("resize start release"),Options:{direction:null,minWidth:null,maxWidth:null,minHeight:null,maxHeight:null}},initialize:function(a,b){this.$super("resizable",this.old_inst=k(a)).setOptions(b);this.options.direction?this.addClass("rui-resizable-"+this.options.direction):
9
9
  this.addClass("rui-resizable");this.content=this.first(".rui-resizable-content")||m("div",{"class":"rui-resizable-content"}).insert(this._.childNodes).insertTo(this);this.handle=this.first(".rui-resizable-handle")||m("div",{"class":"rui-resizable-handle"}).insertTo(this)},destroy:function(){this.removeClass("rui-resizable").removeClass("rui-resizable-top").removeClass("rui-resizable-left").removeClass("rui-resizable-right").removeClass("rui-resizable-bottom").insert(this.content._.childNodes);this.content.remove();
10
10
  this.handle.remove();if(this.old_inst)t.Cache[$uid(this._)]=this.old_inst;return this},setOptions:function(a,b){a=a||{};l("top left right bottom").each(function(f){if(this.hasClass("rui-resizable-"+f))a.direction=f},this);return this.$super(a,b)},start:function(a){this.prevSizes=this.size();this.prevEvPos=a.position();this.contXDiff=this.size().x-this.content.size().x;this.contYDiff=this.size().y-this.content.size().y;l("minWidth maxWidth minHeight maxHeight").each(function(b){this[b]=this.findDim(b)},
11
- this);return this.fire("start",a)},track:function(a){var b=a.position(),f=this.prevEvPos,h=this.handle.dimensions(),d=this.prevSizes,e=d.x,i=d.y,u=f.y-b.y,n=this.minWidth,o=this.maxWidth,p=this.minHeight,q=this.maxHeight,j=this.options.direction;e+=(j==="left"?1:-1)*(f.x-b.x);i+=(j==="top"?1:-1)*u;if(e<n)e=n;if(e>o)e=o;if(i<p)i=p;if(i>q)i=q;d.x!==e&&j!=="top"&&j!=="bottom"&&this.setWidth(e);d.y!==i&&j!=="left"&&j!=="right"&&this.setHeight(i);if(e==n||e==o)b.x=h.left+h.width/2;if(i==p||i==q)b.y=h.top+
12
- h.height/2;this.prevEvPos=b;this.prevSizes=this.size();this.fire("resize",a)},setWidth:function(a){this.content.setWidth(a-this.contXDiff);return this.$super(a)},setHeight:function(a){this.content.setHeight(a-this.contYDiff);return this.$super(a)},release:function(a){return this.fire("release",a)},fire:function(a,b){return this.$super(a,this,b)},findDim:function(a){var b=this.options[a]||this.getStyle(a);if(b&&/\d+/.test(b)&&parseFloat(b)>0){a=c(a).include("Width")?"width":"height";b=(this._dummy||
13
- (this._dummy=m("div",{style:"visibility:hidden;z-index:-1"}))).setStyle(a,b).insertTo(this,"before");a=b._["offset"+c(a).capitalize()];b.remove();return a}}});k(r).on({mousedown:function(a){var b=a.find(".rui-resizable-handle");if(b){b=b.parent();if(b instanceof s)b=new g(b);g.current=b.start(a.stop())}},mousemove:function(a){var b=g.current;b&&b.track(a)},mouseup:function(a){var b=g.current;if(b){b.release(a);g.current=null}}});k(window).onBlur(function(a){var b=g.current;if(b){b.release(a);g.current=
14
- null}});s.include({makeResizable:function(a){new g(this,a);return this},undoResizable:function(){this instanceof g&&this.destroy();return this}});r.write('<style type="text/css">.rui-resizable,.rui-resizable-top,.rui-resizable-left,.rui-resizable-right,.rui-resizable-bottom,.rui-resizable-content .rui-resizable-handle{margin:0;padding:0;overflow:none;border:none;background:none;width:auto;height:auto;min-width:none;max-width:none;min-height:none;max-height:none}.rui-resizable,.rui-resizable-top,.rui-resizable-left,.rui-resizable-right,.rui-resizable-bottom{position:relative;min-width:8em;min-height:8em;border:1px solid #DDD}.rui-resizable-content{overflow:auto;padding:.5em;position:relative}.rui-resizable-handle{position:absolute;background-image:url(/images/rightjs-ui/resizable.png);background-repeat:no-repeat;background-color:#DDD;cursor:move}.rui-resizable .rui-resizable-handle{right:0;bottom:0;background-position:-2px -2px;background-color:transparent;width:16px;height:16px}.rui-resizable-top .rui-resizable-handle,.rui-resizable-bottom .rui-resizable-handle{height:8px;width:100%;background-position:center -26px;cursor:row-resize}.rui-resizable-left .rui-resizable-handle,.rui-resizable-right .rui-resizable-handle{top:0px;width:8px;height:100%;background-position:-26px center;cursor:col-resize}.rui-resizable-top .rui-resizable-content{padding-top:1em}.rui-resizable-top .rui-resizable-handle{top:0}.rui-resizable-bottom .rui-resizable-content{padding-bottom:1em}.rui-resizable-bottom .rui-resizable-handle{bottom:0}.rui-resizable-left .rui-resizable-content{padding-left:1em}.rui-resizable-left .rui-resizable-handle{left:0}.rui-resizable-right .rui-resizable-content{padding-right:1em}.rui-resizable-right .rui-resizable-handle{right:0}</style>');
11
+ this);return this.fire("start",{original:a})},track:function(a){var b=a.position(),f=this.prevEvPos,h=this.handle.dimensions(),d=this.prevSizes,e=d.x,i=d.y,u=f.y-b.y,n=this.minWidth,o=this.maxWidth,p=this.minHeight,q=this.maxHeight,j=this.options.direction;e+=(j==="left"?1:-1)*(f.x-b.x);i+=(j==="top"?1:-1)*u;if(e<n)e=n;if(e>o)e=o;if(i<p)i=p;if(i>q)i=q;d.x!==e&&j!=="top"&&j!=="bottom"&&this.setWidth(e);d.y!==i&&j!=="left"&&j!=="right"&&this.setHeight(i);if(e==n||e==o)b.x=h.left+h.width/2;if(i==p||
12
+ i==q)b.y=h.top+h.height/2;this.prevEvPos=b;this.prevSizes=this.size();this.fire("resize",{original:a})},setWidth:function(a){this.content.setWidth(a-this.contXDiff);return this.$super(a)},setHeight:function(a){this.content.setHeight(a-this.contYDiff);return this.$super(a)},release:function(a){return this.fire("release",{original:a})},findDim:function(a){var b=this.options[a]||this.getStyle(a);if(b&&/\d+/.test(b)&&parseFloat(b)>0){a=c(a).include("Width")?"width":"height";b=(this._dummy||(this._dummy=
13
+ m("div",{style:"visibility:hidden;z-index:-1"}))).setStyle(a,b).insertTo(this,"before");a=b._["offset"+c(a).capitalize()];b.remove();return a}}});k(r).on({mousedown:function(a){var b=a.find(".rui-resizable-handle");if(b){b=b.parent();if(b instanceof s)b=new g(b);g.current=b.start(a.stop())}},mousemove:function(a){var b=g.current;b&&b.track(a)},mouseup:function(a){var b=g.current;if(b){b.release(a);g.current=null}}});k(window).onBlur(function(a){var b=g.current;if(b){b.release(a);g.current=null}});
14
+ s.include({makeResizable:function(a){new g(this,a);return this},undoResizable:function(){this instanceof g&&this.destroy();return this}});r.write('<style type="text/css">.rui-resizable,.rui-resizable-top,.rui-resizable-left,.rui-resizable-right,.rui-resizable-bottom,.rui-resizable-content .rui-resizable-handle{margin:0;padding:0;overflow:none;border:none;background:none;width:auto;height:auto;min-width:none;max-width:none;min-height:none;max-height:none}.rui-resizable,.rui-resizable-top,.rui-resizable-left,.rui-resizable-right,.rui-resizable-bottom{position:relative;min-width:8em;min-height:8em;border:1px solid #DDD}.rui-resizable-content{overflow:auto;padding:.5em;position:relative}.rui-resizable-handle{position:absolute;background-image:url(/images/rightjs-ui/resizable.png);background-repeat:no-repeat;background-color:#DDD;cursor:move}.rui-resizable .rui-resizable-handle{right:0;bottom:0;background-position:-2px -2px;background-color:transparent;width:16px;height:16px}.rui-resizable-top .rui-resizable-handle,.rui-resizable-bottom .rui-resizable-handle{height:8px;width:100%;background-position:center -26px;cursor:row-resize}.rui-resizable-left .rui-resizable-handle,.rui-resizable-right .rui-resizable-handle{top:0px;width:8px;height:100%;background-position:-26px center;cursor:col-resize}.rui-resizable-top .rui-resizable-content{padding-top:1em}.rui-resizable-top .rui-resizable-handle{top:0}.rui-resizable-bottom .rui-resizable-content{padding-bottom:1em}.rui-resizable-bottom .rui-resizable-handle{bottom:0}.rui-resizable-left .rui-resizable-content{padding-left:1em}.rui-resizable-left .rui-resizable-handle{left:0}.rui-resizable-right .rui-resizable-content{padding-right:1em}.rui-resizable-right .rui-resizable-handle{right:0}</style>');
15
15
  return g}(document,RightJS);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Selectable unit for RightJS
2
+ * Selectable unit for RightJS
3
3
  * http://rightjs.org/ui/selectable
4
4
  *
5
5
  * Copyright (C) 2009-2010 Nikolay Nemshilov
@@ -45,13 +45,13 @@ var R = RightJS,
45
45
  * @param String tag-name or Object methods
46
46
  * @param Object methods
47
47
  * @return Widget wrapper
48
- */
48
+ */
49
49
  function Widget(tag_name, methods) {
50
50
  if (!methods) {
51
51
  methods = tag_name;
52
52
  tag_name = 'DIV';
53
53
  }
54
-
54
+
55
55
  /**
56
56
  * An Abstract Widget Unit
57
57
  *
@@ -68,17 +68,17 @@ function Widget(tag_name, methods) {
68
68
  initialize: function(key, options) {
69
69
  this.key = key;
70
70
  var args = [{'class': 'rui-' + key}];
71
-
71
+
72
72
  // those two have different constructors
73
73
  if (!(this instanceof RightJS.Input || this instanceof RightJS.Form)) {
74
74
  args.unshift(tag_name);
75
75
  }
76
76
  this.$super.apply(this, args);
77
-
77
+
78
78
  if (RightJS.isString(options)) {
79
79
  options = RightJS.$(options);
80
80
  }
81
-
81
+
82
82
  // if the options is another element then
83
83
  // try to dynamically rewrap it with our widget
84
84
  if (options instanceof RightJS.Element) {
@@ -111,16 +111,16 @@ function Widget(tag_name, methods) {
111
111
  return this;
112
112
  }
113
113
  });
114
-
114
+
115
115
  /**
116
116
  * Creating the actual widget class
117
117
  *
118
118
  */
119
119
  var Klass = new RightJS.Wrapper(AbstractWidget, methods);
120
-
120
+
121
121
  // creating the widget related shortcuts
122
122
  RightJS.Observer.createShortcuts(Klass.prototype, Klass.EVENTS || []);
123
-
123
+
124
124
  return Klass;
125
125
  }
126
126
 
@@ -132,7 +132,7 @@ function Widget(tag_name, methods) {
132
132
  * Copyright (C) 2010 Nikolay Nemshilov
133
133
  */
134
134
  var Updater = {
135
-
135
+
136
136
  /**
137
137
  * Assigns the unit to work with an input element
138
138
  *
@@ -145,7 +145,7 @@ var Updater = {
145
145
  element[element.setValue ? 'setValue' : 'update'](event.target.getValue());
146
146
  }
147
147
  }).curry(element);
148
-
148
+
149
149
  var connect = R(function(element, object) {
150
150
  element = $(element);
151
151
  if (element && element.onChange) {
@@ -154,7 +154,7 @@ var Updater = {
154
154
  }).bind(object));
155
155
  }
156
156
  }).curry(element);
157
-
157
+
158
158
  if ($(element)) {
159
159
  assign({target: this});
160
160
  connect(this);
@@ -164,7 +164,7 @@ var Updater = {
164
164
  connect(this);
165
165
  }.bind(this)));
166
166
  }
167
-
167
+
168
168
  return this.onChange(assign);
169
169
  }
170
170
  };
@@ -177,30 +177,30 @@ var Updater = {
177
177
  */
178
178
  var Selectable = new Widget('UL', {
179
179
  include: Updater,
180
-
180
+
181
181
  extend: {
182
182
  version: '2.0.0',
183
-
183
+
184
184
  EVENTS: $w('change select unselect disable enable hover leave show hide'),
185
-
185
+
186
186
  Options: {
187
187
  options: null, // a hash of key-value pairs
188
188
  selected: null, // an array of selected keys
189
189
  disabled: null, // an array of disabled keys
190
-
190
+
191
191
  multiple: true, // a flag if it shoulde a multiselect or a single select widget
192
-
192
+
193
193
  fxName: 'slide', // the drop-down options list fx-name null, 'slide', 'fade'
194
194
  fxDuration: 'short', // the drop-down options list fx-duration
195
-
195
+
196
196
  update: null, // a field to be assigned to
197
197
  parseIds: false, // if it should parse integer ids out of the keys
198
-
198
+
199
199
  limit: null, // put some number if you'd like to limit the number of selected items
200
-
200
+
201
201
  hCont : '&bull;' // single-selectable handle content
202
202
  },
203
-
203
+
204
204
  // converting normal select boxes into selectables
205
205
  rescan: function(context) {
206
206
  $(context||document).find('.rui-selectable').each(function(element) {
@@ -210,7 +210,7 @@ var Selectable = new Widget('UL', {
210
210
  });
211
211
  }
212
212
  },
213
-
213
+
214
214
  /**
215
215
  * Basic constructor
216
216
  *
@@ -220,19 +220,19 @@ var Selectable = new Widget('UL', {
220
220
  initialize: function() {
221
221
  var args = $A(arguments).compact(), options = args.pop(),
222
222
  element = args.pop(), selectbox;
223
-
223
+
224
224
  // figuring out the arguments
225
225
  if (!isHash(options) || options instanceof Element) {
226
226
  element = $(element || options);
227
227
  options = {};
228
228
  }
229
-
229
+
230
230
  // converting the selectboxes
231
231
  if (element && element instanceof Input) {
232
232
  options = this.harvestOptions(selectbox = element);
233
233
  element = options;
234
234
  }
235
-
235
+
236
236
  // main initialization
237
237
  this
238
238
  .$super('selectable', element)
@@ -243,42 +243,42 @@ var Selectable = new Widget('UL', {
243
243
  mouseout: this._mouseout,
244
244
  mouseup: this._mouseup,
245
245
  click: this._click,
246
-
246
+
247
247
  select: this._change,
248
248
  unselect: this._change
249
249
  });
250
-
250
+
251
251
  if (this.empty()) { this.build(); }
252
-
252
+
253
253
  // applying the rest of the options
254
254
  options = this.options;
255
-
255
+
256
256
  // single-select options additional features
257
257
  if (!options.multiple || this.hasClass('rui-selectable-single')) {
258
258
  this.isSingle = true;
259
259
  this.addClass('rui-selectable-single');
260
260
  this.buildSingle();
261
-
261
+
262
262
  if (options.selected === null) {
263
263
  this.select(this.items()[0]);
264
264
  }
265
265
  }
266
-
266
+
267
267
  if (options.disabled) { this.disable(options.disabled); }
268
268
  if (options.selected) { this.select(options.selected); }
269
269
  if (options.update) { this.assignTo(options.update); }
270
-
270
+
271
271
  // replacing the selectboxes with the selectables
272
272
  if (selectbox) {
273
273
  this.assignTo(selectbox).insertTo(selectbox, 'before');
274
-
274
+
275
275
  // hidding it in the hidden layer so it was sent with the form
276
276
  selectbox.wrap($E('div', {
277
277
  style: 'position:absolute;z-index:-1;visibility:hidden;width:0;height:0;overflow:hidden'
278
278
  }));
279
279
  }
280
280
  },
281
-
281
+
282
282
  /**
283
283
  * Sets the value
284
284
  *
@@ -291,13 +291,13 @@ var Selectable = new Widget('UL', {
291
291
  value = value.split(',').map('trim')
292
292
  .filter(function(s) { return !s.blank(); });
293
293
  }
294
-
294
+
295
295
  // resetting the selections
296
296
  this.items().each('removeClass', 'rui-selectable-selected');
297
-
297
+
298
298
  return this.select(value);
299
299
  },
300
-
300
+
301
301
  /**
302
302
  * Returns the list of selected items
303
303
  *
@@ -313,7 +313,7 @@ var Selectable = new Widget('UL', {
313
313
  }, this);
314
314
  }
315
315
  },
316
-
316
+
317
317
  /**
318
318
  * disables the given key or keys
319
319
  * NOTE: if no keys specified, then all the items will be disabled
@@ -327,7 +327,7 @@ var Selectable = new Widget('UL', {
327
327
  }, this);
328
328
  return this;
329
329
  },
330
-
330
+
331
331
  /**
332
332
  * disables the given key or keys
333
333
  * NOTE: if no keys specified, then all the items will be enabled
@@ -341,7 +341,7 @@ var Selectable = new Widget('UL', {
341
341
  }, this);
342
342
  return this;
343
343
  },
344
-
344
+
345
345
  /**
346
346
  * Checks if the given key or keys are disabled
347
347
  * NOTE: if no keys specified, then will check if all the items are disabled
@@ -352,7 +352,7 @@ var Selectable = new Widget('UL', {
352
352
  disabled: function(keys) {
353
353
  return this.mapOrAll(keys).every('hasClass', 'rui-selectable-disabled');
354
354
  },
355
-
355
+
356
356
  /**
357
357
  * selects item(s) that refers to the given key or keys
358
358
  *
@@ -361,12 +361,12 @@ var Selectable = new Widget('UL', {
361
361
  */
362
362
  select: function(keys) {
363
363
  var items = this.mapEnabled(keys), selected_class = 'rui-selectable-selected';
364
-
364
+
365
365
  if (this.isSingle && items) {
366
366
  this.items().each('removeClass', selected_class);
367
367
  items = R([items[0]]);
368
368
  }
369
-
369
+
370
370
  // applying the selection limit if ncessary
371
371
  if (!this.isSingle && this.options.limit) {
372
372
  var selected = this.items().filter('hasClass', selected_class), clean = [];
@@ -378,14 +378,14 @@ var Selectable = new Widget('UL', {
378
378
  }
379
379
  items = clean;
380
380
  }
381
-
382
- items.each(function(item) {
381
+
382
+ items.compact().each(function(item) {
383
383
  this.fire('select', item.addClass(selected_class));
384
384
  }, this);
385
-
385
+
386
386
  return this;
387
387
  },
388
-
388
+
389
389
  /**
390
390
  * Unselects item(s) that refers to the given key or keys
391
391
  *
@@ -394,14 +394,14 @@ var Selectable = new Widget('UL', {
394
394
  */
395
395
  unselect: function(keys) {
396
396
  var prev_value = this.getValue();
397
-
397
+
398
398
  this.mapEnabled(keys).each(function(item) {
399
399
  this.fire('unselect', item.removeClass('rui-selectable-selected'));
400
400
  }, this);
401
-
401
+
402
402
  return this;
403
403
  },
404
-
404
+
405
405
  /**
406
406
  * Checks if item(s) are selected
407
407
  *
@@ -411,7 +411,7 @@ var Selectable = new Widget('UL', {
411
411
  selected: function(keys) {
412
412
  return this.mapEnabled(keys).every('hasClass', 'rui-selectable-selected');
413
413
  },
414
-
414
+
415
415
  /**
416
416
  * Overloading the method so it worked nicely with the single versions
417
417
  *
@@ -423,10 +423,10 @@ var Selectable = new Widget('UL', {
423
423
  Element.prototype.insertTo.call(
424
424
  (this.isSingle ? this.container : this), target, where
425
425
  );
426
-
426
+
427
427
  return this;
428
428
  },
429
-
429
+
430
430
  // protected
431
431
 
432
432
  // wrapping the events trigger to feed it with some more options
@@ -438,7 +438,7 @@ var Selectable = new Widget('UL', {
438
438
  }
439
439
  return this;
440
440
  },
441
-
441
+
442
442
  // finds out the value for the item
443
443
  itemValue: function(item) {
444
444
  var value = item.get('id') || item.get('val');
@@ -449,11 +449,11 @@ var Selectable = new Widget('UL', {
449
449
  items: function() {
450
450
  return this.find('li');
451
451
  },
452
-
452
+
453
453
  // returns matching items or all of them if there's no key
454
454
  mapOrAll: function(keys) {
455
455
  var items = this.items();
456
-
456
+
457
457
  if (defined(keys)) {
458
458
  if (!isArray(keys)) { keys = [keys]; }
459
459
 
@@ -471,22 +471,22 @@ var Selectable = new Widget('UL', {
471
471
  return item;
472
472
  }, this).compact();
473
473
  }
474
-
474
+
475
475
  return items;
476
476
  },
477
-
477
+
478
478
  // maps and filters only enabled items
479
479
  mapEnabled: function(keys) {
480
480
  return this.mapOrAll(keys).filter(function(item) {
481
481
  return !item.hasClass('rui-selectable-disabled');
482
482
  }, this);
483
483
  },
484
-
484
+
485
485
  // onmousedown callback
486
486
  _mousedown: function(event) {
487
487
  event.stop();
488
488
  var item = event.target, items = this.items();
489
-
489
+
490
490
  if (!this.disabled(item)) {
491
491
  if (this.isSingle) { // single-selects are always select
492
492
  this.select(item);
@@ -497,40 +497,40 @@ var Selectable = new Widget('UL', {
497
497
  this.select(item);
498
498
  this._massSelect = true; // mass-selection start
499
499
  }
500
-
500
+
501
501
  // mass-selection with a shift/meta key
502
502
  if ((event.shiftKey || event.metaKey) && this._prevItem) {
503
503
  var index1 = items.indexOf(this._prevItem);
504
504
  var index2 = items.indexOf(item);
505
-
505
+
506
506
  if (index1 != index2) {
507
507
  if (index1 > index2) {
508
508
  var t = index1;
509
509
  index1 = index2;
510
510
  index2 = index1;
511
511
  }
512
-
512
+
513
513
  for (var i=index1; i < index2; i++) {
514
514
  this[this._prevItem.hasClass('rui-selectable-selected') ? 'select' : 'unselect'](items[i]);
515
515
  }
516
516
  }
517
517
  }
518
-
518
+
519
519
  this._prevItem = item;
520
520
  }
521
521
  },
522
-
522
+
523
523
  // onmouseup callback
524
524
  _mouseup: function(event) {
525
525
  event.stop();
526
526
  this._massRemove = this._massSelect = false; // mass-selection stop
527
527
  },
528
-
528
+
529
529
  // mouseover callback
530
530
  _mouseover: function(event) {
531
531
  var item = event.target;
532
532
  this.fire('hover', item);
533
-
533
+
534
534
  if (!this.isSingle) {
535
535
  if (this._massSelect) {
536
536
  this.select(item);
@@ -539,17 +539,17 @@ var Selectable = new Widget('UL', {
539
539
  }
540
540
  }
541
541
  },
542
-
542
+
543
543
  // mouseout callback
544
544
  _mouseout: function(event) {
545
545
  this.fire('leave', event.target);
546
546
  },
547
-
547
+
548
548
  // mouseclick callback
549
549
  _click: function(event) {
550
550
  event.stop();
551
551
  },
552
-
552
+
553
553
  // select/unselect listener fires the onchange events
554
554
  _change: function() {
555
555
  if (''+this.value != ''+this.getValue()) {
@@ -557,11 +557,11 @@ var Selectable = new Widget('UL', {
557
557
  this.fire('change');
558
558
  }
559
559
  },
560
-
560
+
561
561
  // builds the widget programmatically
562
562
  build: function() {
563
563
  var options = this.options.options, items = R([]);
564
-
564
+
565
565
  if (isArray(options)) {
566
566
  options.each(function(option) {
567
567
  items.push(isArray(option) ? option : [option, option]);
@@ -575,10 +575,10 @@ var Selectable = new Widget('UL', {
575
575
  items.each(function(option) {
576
576
  this.insert($E('li', {val: option[1], html: option[0]}));
577
577
  }, this);
578
-
578
+
579
579
  return this;
580
580
  },
581
-
581
+
582
582
  // builds a container for a single-select
583
583
  buildSingle: function() {
584
584
  this.container = $E('div', {'class': 'rui-selectable-container'})
@@ -587,35 +587,35 @@ var Selectable = new Widget('UL', {
587
587
  this.display = $E('ul', {'class': 'rui-selectable-display'})
588
588
  ])
589
589
  .onClick(R(this.toggleList).bind(this));
590
-
590
+
591
591
  if (this.parent()) {
592
592
  this.container.insertTo(this, 'instead');
593
593
  }
594
-
594
+
595
595
  this.container.insert(this);
596
-
596
+
597
597
  $(document).onClick(R(this.hideList).bind(this));
598
-
598
+
599
599
  return this
600
600
  .onSelect('showItem')
601
601
  .onSelect('hideList')
602
602
  .addClass('rui-dd-menu');
603
603
  },
604
-
604
+
605
605
  // toggles the single-selects list
606
606
  toggleList: function(event) {
607
607
  event.stop();
608
608
  return this.visible() ? this.hideList() : this.showList(event);
609
609
  },
610
-
610
+
611
611
  // shows list for the single-selects
612
612
  showList: function(event) {
613
613
  event.stop();
614
-
614
+
615
615
  $$('.rui-selectable-single').without(this).each('hide');
616
-
616
+
617
617
  var dims = this.container.dimensions(), pos = this.container.position();
618
-
618
+
619
619
  this.setStyle({
620
620
  top: (dims.top + dims.height - pos.y - 1) + 'px',
621
621
  left: (dims.left - pos.x) + 'px',
@@ -624,12 +624,12 @@ var Selectable = new Widget('UL', {
624
624
  duration: this.options.fxDuration,
625
625
  onFinish: this.fire.bind(this, 'show', this)
626
626
  });
627
-
627
+
628
628
  if (!this.options.fxName) {
629
629
  this.fire('show', this);
630
630
  }
631
631
  },
632
-
632
+
633
633
  // hides the list for the single-selects
634
634
  hideList: function() {
635
635
  if (this.isSingle && this.visible()) {
@@ -637,41 +637,42 @@ var Selectable = new Widget('UL', {
637
637
  duration: this.options.fxDuration,
638
638
  onFinish: this.fire.bind(this, 'hide')
639
639
  });
640
-
640
+
641
641
  if (!this.options.fxName) {
642
642
  this.fire('hide');
643
643
  }
644
644
  }
645
645
  },
646
-
646
+
647
647
  // shows the item in the main view of a single-selector
648
648
  showItem: function() {
649
649
  var item = this.items().first('hasClass', 'rui-selectable-selected') || this.items().first();
650
650
  this.display.html('<li>'+(item ? item.html() : '&nbsp;')+'</li>');
651
651
  },
652
-
652
+
653
653
  // harvests options from a selectbox element
654
654
  harvestOptions: function(selectbox) {
655
655
  var options = {};
656
-
656
+
657
657
  options.multiple = selectbox.has('multiple');
658
658
  options.options = R([]);
659
659
  options.selected = R([]);
660
660
  options.disabled = R([]);
661
-
661
+
662
662
  $A(selectbox._.getElementsByTagName('OPTION')).each(function(option, index) {
663
663
  options.options.push([option.innerHTML, $(option).get('value') || option.innerHTML]);
664
-
664
+
665
665
  if (option.selected && !selectbox._.disabled) { options.selected.push(index); }
666
666
  if (option.disabled || selectbox._.disabled) { options.disabled.push(index); }
667
667
  });
668
-
668
+
669
669
  if (options.selected.empty()) { options.selected = 0; }
670
-
670
+
671
671
  return options;
672
672
  }
673
673
  });
674
674
 
675
+
675
676
  /**
676
677
  * The document on-load for Selectable
677
678
  *
@@ -681,7 +682,8 @@ $(document).onReady(function() {
681
682
  Selectable.rescan();
682
683
  });
683
684
 
685
+
684
686
  document.write("<style type=\"text/css\"> *.rui-dd-menu, *.rui-dd-menu li{margin:0;padding:0;border:none;background:none;list-style:none;font-weight:normal;float:none} *.rui-dd-menu{display:none;position:absolute;z-index:9999;background:white;border:1px solid #BBB;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em;box-shadow:#DDD .2em .2em .4em;-moz-box-shadow:#DDD .2em .2em .4em;-webkit-box-shadow:#DDD .2em .2em .4em} *.rui-dd-menu li{padding:.2em .4em;border-top:none;border-bottom:none;cursor:pointer} *.rui-dd-menu li.current{background:#DDD} *.rui-dd-menu li:hover{background:#EEE}dl.rui-dd-menu dt{padding:.3em .5em;cursor:default;font-weight:bold;font-style:italic;color:#444;background:#EEE}dl.rui-dd-menu dd li{padding-left:1.5em} *.rui-selectable, *.rui-selectable li, *.rui-selectable dt, *.rui-selectable dd, *.rui-selectable ul,div.rui-selectable-container ul.rui-selectable-display,div.rui-selectable-container ul.rui-selectable-display li{margin:0;padding:0;border:none;background:none;list-style:none} *.rui-selectable{border:1px solid #CCC;border-bottom:none;display:inline-block; *display:inline; *zoom:1;min-width:10em;-moz-border-radius:.2em;-webkit-border-radius:.2em;user-select:none;-moz-user-select:none;-webkit-user-select:none} *.rui-selectable li{padding:.3em 1em;cursor:pointer;border-bottom:1px solid #CCC} *.rui-selectable li:hover{background:#EEE} *.rui-selectable li.rui-selectable-selected{font-weight:bold;background:#DDD} *.rui-selectable li.rui-selectable-disabled, *.rui-selectable li.rui-selectable-disabled:hover{background:#CCC;color:#777;cursor:default}dl.rui-selectable dt{padding:.3em .5em;cursor:default;font-weight:bold;font-style:italic;color:#444;background:#EEE;border-bottom:1px solid #CCC}dl.rui-selectable dd li{padding-left:1.5em} *.rui-selectable-single{background:#FFF;display:none}div.rui-selectable-container{border:1px solid #CCC;-moz-border-radius:.2em;-webkit-border-radius:.2em;display:inline-block; *display:inline; *zoom:1; *width:10em;vertical-align:middle;min-width:10em;cursor:pointer;height:1.6em;position:relative}div.rui-selectable-container div.rui-selectable-handle{font-family:Arial;float:right;width:0.8em;background:#DDD;text-align:center;height:100%;line-height:0.8em;font-size:200%;color:#888;border-left:1px solid #CCC}div.rui-selectable-container:hover div.rui-selectable-handle{color:#666}div.rui-selectable-container ul.rui-selectable-display{display:block;width:auto;margin-right:2em;overflow:hidden}div.rui-selectable-container ul.rui-selectable-display li{line-height:1.6em;padding:0 .5em}select.rui-selectable{visibility:hidden}</style>");
685
687
 
686
688
  return Selectable;
687
- })(document, RightJS);
689
+ })(document, RightJS);