rails_admin 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails_admin might be problematic. Click here for more details.

Files changed (28) hide show
  1. data.tar.gz.sig +0 -0
  2. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +222 -218
  3. data/app/assets/javascripts/rails_admin/ui.coffee +7 -0
  4. data/app/assets/stylesheets/rails_admin/base/theming.scss +2 -1
  5. data/app/controllers/rails_admin/main_controller.rb +1 -1
  6. data/app/helpers/rails_admin/application_helper.rb +2 -1
  7. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +1 -1
  8. data/app/views/rails_admin/main/_form_filtering_select.html.haml +2 -2
  9. data/app/views/rails_admin/main/_form_nested_many.html.haml +1 -1
  10. data/app/views/rails_admin/main/export.html.haml +6 -1
  11. data/lib/rails_admin/adapters/active_record.rb +4 -0
  12. data/lib/rails_admin/adapters/mongoid.rb +14 -6
  13. data/lib/rails_admin/config.rb +1 -1
  14. data/lib/rails_admin/config/fields/base.rb +20 -2
  15. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +8 -0
  16. data/lib/rails_admin/config/fields/types/has_many_association.rb +4 -0
  17. data/lib/rails_admin/config/fields/types/has_one_association.rb +9 -0
  18. data/lib/rails_admin/config/fields/types/serialized.rb +3 -1
  19. data/lib/rails_admin/config/model.rb +4 -0
  20. data/lib/rails_admin/version.rb +1 -1
  21. data/spec/controllers/rails_admin/main_controller_spec.rb +18 -0
  22. data/spec/dummy_app/app/mongoid/field_test.rb +2 -1
  23. data/spec/integration/config/edit/rails_admin_config_edit_spec.rb +74 -0
  24. data/spec/rails_admin/adapters/mongoid_spec.rb +16 -4
  25. data/spec/rails_admin/config/fields/base_spec.rb +12 -0
  26. data/spec/rails_admin/config_spec.rb +15 -0
  27. metadata +6 -4
  28. metadata.gz.sig +0 -0
data.tar.gz.sig CHANGED
Binary file
@@ -1,54 +1,54 @@
1
1
  /*
2
- * jQuery UI Timepicker 0.3.1
3
- *
4
- * Copyright 2010-2011, Francois Gelinas
5
- * Dual licensed under the MIT or GPL Version 2 licenses.
6
- * http://jquery.org/license
7
- *
8
- * http://fgelinas.com/code/timepicker
9
- *
10
- * Depends:
11
- * jquery.ui.core.js
12
- * jquery.ui.position.js (only if position settngs are used)
13
- *
14
- * Change version 0.1.0 - moved the t-rex up here
15
- *
16
- ____
17
- ___ .-~. /_"-._
18
- `-._~-. / /_ "~o\ :Y
19
- \ \ / : \~x. ` ')
20
- ] Y / | Y< ~-.__j
21
- / ! _.--~T : l l< /.-~
22
- / / ____.--~ . ` l /~\ \<|Y
23
- / / .-~~" /| . ',-~\ \L|
24
- / / / .^ \ Y~Y \.^>/l_ "--'
25
- / Y .-"( . l__ j_j l_/ /~_.-~ .
26
- Y l / \ ) ~~~." / `/"~ / \.__/l_
27
- | \ _.-" ~-{__ l : l._Z~-.___.--~
28
- | ~---~ / ~~"---\_ ' __[>
29
- l . _.^ ___ _>-y~
30
- \ \ . .-~ .-~ ~>--" /
31
- \ ~---" / ./ _.-'
32
- "-.,_____.,_ _.--~\ _.-~
33
- ~~ ( _} -Row
34
- `. ~(
35
- ) \
36
- /,`--'~\--'~\
37
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38
- ->T-Rex<-
2
+ * jQuery UI Timepicker
3
+ *
4
+ * Copyright 2010-2013, Francois Gelinas
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://fgelinas.com/code/timepicker
9
+ *
10
+ * Depends:
11
+ * jquery.ui.core.js
12
+ * jquery.ui.position.js (only if position settngs are used)
13
+ *
14
+ * Change version 0.1.0 - moved the t-rex up here
15
+ *
16
+ ____
17
+ ___ .-~. /_"-._
18
+ `-._~-. / /_ "~o\ :Y
19
+ \ \ / : \~x. ` ')
20
+ ] Y / | Y< ~-.__j
21
+ / ! _.--~T : l l< /.-~
22
+ / / ____.--~ . ` l /~\ \<|Y
23
+ / / .-~~" /| . ',-~\ \L|
24
+ / / / .^ \ Y~Y \.^>/l_ "--'
25
+ / Y .-"( . l__ j_j l_/ /~_.-~ .
26
+ Y l / \ ) ~~~." / `/"~ / \.__/l_
27
+ | \ _.-" ~-{__ l : l._Z~-.___.--~
28
+ | ~---~ / ~~"---\_ ' __[>
29
+ l . _.^ ___ _>-y~
30
+ \ \ . .-~ .-~ ~>--" /
31
+ \ ~---" / ./ _.-'
32
+ "-.,_____.,_ _.--~\ _.-~
33
+ ~~ ( _} -Row
34
+ `. ~(
35
+ ) \
36
+ /,`--'~\--'~\
37
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38
+ ->T-Rex<-
39
39
  */
40
40
 
41
41
  (function ($) {
42
42
 
43
- $.extend($.ui, { timepicker: { version: "0.3.1"} });
43
+ $.extend($.ui, { timepicker: { version: "0.3.2"} });
44
44
 
45
45
  var PROP_NAME = 'timepicker',
46
46
  tpuuid = new Date().getTime();
47
47
 
48
48
  /* Time picker manager.
49
- Use the singleton instance of this class, $.timepicker, to interact with the time picker.
50
- Settings for (groups of) time pickers are maintained in an instance object,
51
- allowing multiple different settings on the same page. */
49
+ Use the singleton instance of this class, $.timepicker, to interact with the time picker.
50
+ Settings for (groups of) time pickers are maintained in an instance object,
51
+ allowing multiple different settings on the same page. */
52
52
 
53
53
  function Timepicker() {
54
54
  this.debug = true; // Change this to true to start debugging
@@ -64,61 +64,61 @@ allowing multiple different settings on the same page. */
64
64
 
65
65
  this.regional = []; // Available regional settings, indexed by language code
66
66
  this.regional[''] = { // Default regional settings
67
- hourText: 'Hour', // Display text for hours section
68
- minuteText: 'Minute', // Display text for minutes link
69
- amPmText: ['AM', 'PM'], // Display text for AM PM
70
- closeButtonText: 'Done', // Text for the confirmation button (ok button)
71
- nowButtonText: 'Now', // Text for the now button
72
- deselectButtonText: 'Deselect' // Text for the deselect button
67
+ hourText: 'Hour', // Display text for hours section
68
+ minuteText: 'Minute', // Display text for minutes link
69
+ amPmText: ['AM', 'PM'], // Display text for AM PM
70
+ closeButtonText: 'Done', // Text for the confirmation button (ok button)
71
+ nowButtonText: 'Now', // Text for the now button
72
+ deselectButtonText: 'Deselect' // Text for the deselect button
73
73
  };
74
74
  this._defaults = { // Global defaults for all the time picker instances
75
- showOn: 'focus', // 'focus' for popup on focus,
75
+ showOn: 'focus', // 'focus' for popup on focus,
76
76
  // 'button' for trigger button, or 'both' for either (not yet implemented)
77
- button: null, // 'button' element that will trigger the timepicker
78
- showAnim: 'fadeIn', // Name of jQuery animation for popup
79
- showOptions: {}, // Options for enhanced animations
80
- appendText: '', // Display text following the input box, e.g. showing the format
81
-
82
- beforeShow: null, // Define a callback function executed before the timepicker is shown
83
- onSelect: null, // Define a callback function when a hour / minutes is selected
84
- onClose: null, // Define a callback function when the timepicker is closed
85
-
86
- timeSeparator: ':', // The character to use to separate hours and minutes.
87
- periodSeparator: ' ', // The character to use to separate the time from the time period.
88
- showPeriod: false, // Define whether or not to show AM/PM with selected time
89
- showPeriodLabels: true, // Show the AM/PM labels on the left of the time picker
90
- showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10. [true/false]
91
- showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
92
- altField: '', // Selector for an alternate field to store selected time into
93
- defaultTime: 'now', // Used as default time when input field is empty or for inline timePicker
77
+ button: null, // 'button' element that will trigger the timepicker
78
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
79
+ showOptions: {}, // Options for enhanced animations
80
+ appendText: '', // Display text following the input box, e.g. showing the format
81
+
82
+ beforeShow: null, // Define a callback function executed before the timepicker is shown
83
+ onSelect: null, // Define a callback function when a hour / minutes is selected
84
+ onClose: null, // Define a callback function when the timepicker is closed
85
+
86
+ timeSeparator: ':', // The character to use to separate hours and minutes.
87
+ periodSeparator: ' ', // The character to use to separate the time from the time period.
88
+ showPeriod: false, // Define whether or not to show AM/PM with selected time
89
+ showPeriodLabels: true, // Show the AM/PM labels on the left of the time picker
90
+ showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10. [true/false]
91
+ showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
92
+ altField: '', // Selector for an alternate field to store selected time into
93
+ defaultTime: 'now', // Used as default time when input field is empty or for inline timePicker
94
94
  // (set to 'now' for the current time, '' for no highlighted time)
95
- myPosition: 'left top', // Position of the dialog relative to the input.
95
+ myPosition: 'left top', // Position of the dialog relative to the input.
96
96
  // see the position utility for more info : http://jqueryui.com/demos/position/
97
- atPosition: 'left bottom', // Position of the input element to match
97
+ atPosition: 'left bottom', // Position of the input element to match
98
98
  // Note : if the position utility is not loaded, the timepicker will attach left top to left bottom
99
99
  //NEW: 2011-02-03
100
- onHourShow: null, // callback for enabling / disabling on selectable hours ex : function(hour) { return true; }
101
- onMinuteShow: null, // callback for enabling / disabling on time selection ex : function(hour,minute) { return true; }
100
+ onHourShow: null, // callback for enabling / disabling on selectable hours ex : function(hour) { return true; }
101
+ onMinuteShow: null, // callback for enabling / disabling on time selection ex : function(hour,minute) { return true; }
102
102
 
103
103
  hours: {
104
- starts: 0, // first displayed hour
105
- ends: 23 // last displayed hour
104
+ starts: 0, // first displayed hour
105
+ ends: 23 // last displayed hour
106
106
  },
107
107
  minutes: {
108
- starts: 0, // first displayed minute
109
- ends: 55, // last displayed minute
110
- interval: 5 // interval of displayed minutes
108
+ starts: 0, // first displayed minute
109
+ ends: 55, // last displayed minute
110
+ interval: 5 // interval of displayed minutes
111
111
  },
112
- rows: 4, // number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
112
+ rows: 4, // number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
113
113
  // 2011-08-05 0.2.4
114
- showHours: true, // display the hours section of the dialog
115
- showMinutes: true, // display the minute section of the dialog
116
- optionalMinutes: false, // optionally parse inputs of whole hours with minutes omitted
117
-
114
+ showHours: true, // display the hours section of the dialog
115
+ showMinutes: true, // display the minute section of the dialog
116
+ optionalMinutes: false, // optionally parse inputs of whole hours with minutes omitted
117
+
118
118
  // buttons
119
- showCloseButton: false, // shows an OK button to confirm the edit
120
- showNowButton: false, // Shows the 'now' button
121
- showDeselectButton: false // Shows the deselect time button
119
+ showCloseButton: false, // shows an OK button to confirm the edit
120
+ showNowButton: false, // Shows the 'now' button
121
+ showDeselectButton: false // Shows the deselect time button
122
122
 
123
123
  };
124
124
  $.extend(this._defaults, this.regional['']);
@@ -141,16 +141,16 @@ allowing multiple different settings on the same page. */
141
141
  },
142
142
 
143
143
  /* Override the default settings for all instances of the time picker.
144
- @param settings object - the new settings to use as defaults (anonymous object)
145
- @return the manager object */
144
+ @param settings object - the new settings to use as defaults (anonymous object)
145
+ @return the manager object */
146
146
  setDefaults: function (settings) {
147
147
  extendRemove(this._defaults, settings || {});
148
148
  return this;
149
149
  },
150
150
 
151
151
  /* Attach the time picker to a jQuery selection.
152
- @param target element - the target input field or division or span
153
- @param settings object - the new settings to use for this time picker instance (anonymous) */
152
+ @param target element - the target input field or division or span
153
+ @param settings object - the new settings to use for this time picker instance (anonymous) */
154
154
  _attachTimepicker: function (target, settings) {
155
155
  // check for settings on the control itself - in namespace 'time:'
156
156
  var inlineSettings = null;
@@ -192,7 +192,7 @@ allowing multiple different settings on the same page. */
192
192
  id: id, input: target, // associated target
193
193
  inline: inline, // is timepicker inline or not :
194
194
  tpDiv: (!inline ? this.tpDiv : // presentation div
195
- $('<div class="' + this._inlineClass + ' ui-timepicker ui-widget ui-helper-clearfix"></div>'))
195
+ $('<div class="' + this._inlineClass + ' ui-timepicker ui-widget ui-helper-clearfix"></div>'))
196
196
  };
197
197
  },
198
198
 
@@ -229,8 +229,8 @@ allowing multiple different settings on the same page. */
229
229
  $.timepicker._updateSelectedValue(inst);
230
230
  $.timepicker._hideTimepicker();
231
231
 
232
- return false; // don't submit the form
233
- break; // select the value on enter
232
+ return false; // don't submit the form
233
+ break; // select the value on enter
234
234
  case 27: $.timepicker._hideTimepicker();
235
235
  break; // hide on escape
236
236
  default: handled = false;
@@ -315,8 +315,8 @@ break; // select the value on enter
315
315
  },
316
316
 
317
317
  /* Pop-up the time picker for a given input field.
318
- @param input element - the input field attached to the time picker or
319
- event - if triggered by focus */
318
+ @param input element - the input field attached to the time picker or
319
+ event - if triggered by focus */
320
320
  _showTimepicker: function (input) {
321
321
  input = input.target || input;
322
322
  if (input.nodeName.toLowerCase() != 'input') { input = $('input', input.parentNode)[0]; } // find from button/image trigger
@@ -348,10 +348,6 @@ event - if triggered by focus */
348
348
  isFixed |= $(this).css('position') == 'fixed';
349
349
  return !isFixed;
350
350
  });
351
- if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
352
- $.timepicker._pos[0] -= document.documentElement.scrollLeft;
353
- $.timepicker._pos[1] -= document.documentElement.scrollTop;
354
- }
355
351
 
356
352
  var offset = { left: $.timepicker._pos[0], top: $.timepicker._pos[1] };
357
353
 
@@ -362,7 +358,7 @@ event - if triggered by focus */
362
358
 
363
359
 
364
360
  // position with the ui position utility, if loaded
365
- if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
361
+ if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
366
362
  inst.tpDiv.position({
367
363
  of: inst.input,
368
364
  my: $.timepicker._get( inst, 'myPosition' ),
@@ -384,7 +380,7 @@ event - if triggered by focus */
384
380
  // and adjust position before showing
385
381
  offset = $.timepicker._checkOffset(inst, offset, isFixed);
386
382
  inst.tpDiv.css({ position: ($.timepicker._inDialog && $.blockUI ?
387
- 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
383
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
388
384
  left: offset.left + 'px', top: offset.top + 'px'
389
385
  });
390
386
  if ( ! inst.inline ) {
@@ -395,9 +391,9 @@ event - if triggered by focus */
395
391
  $.timepicker._timepickerShowing = true;
396
392
  var borders = $.timepicker._getBorders(inst.tpDiv);
397
393
  inst.tpDiv.find('iframe.ui-timepicker-cover'). // IE6- only
398
- css({ left: -borders[0], top: -borders[1],
399
- width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
400
- });
394
+ css({ left: -borders[0], top: -borders[1],
395
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
396
+ });
401
397
  };
402
398
 
403
399
  // Fixed the zIndex problem for real (I hope) - FG - v 0.2.9
@@ -416,24 +412,31 @@ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
416
412
  }
417
413
  },
418
414
 
419
- // This is a copy of the zIndex function of UI core 1.8.??
420
- // Copied in the timepicker to stay backward compatible.
415
+ // This is an enhanced copy of the zIndex function of UI core 1.8.?? For backward compatibility.
416
+ // Enhancement returns maximum zindex value discovered while traversing parent elements,
417
+ // rather than the first zindex value found. Ensures the timepicker popup will be in front,
418
+ // even in funky scenarios like non-jq dialog containers with large fixed zindex values and
419
+ // nested zindex-influenced elements of their own.
421
420
  _getZIndex: function (target) {
422
- var elem = $( target ), position, value;
423
- while ( elem.length && elem[ 0 ] !== document ) {
424
- position = elem.css( "position" );
425
- if ( position === "absolute" || position === "relative" || position === "fixed" ) {
426
- value = parseInt( elem.css( "zIndex" ), 10 );
427
- if ( !isNaN( value ) && value !== 0 ) {
428
- return value;
421
+ var elem = $(target);
422
+ var maxValue = 0;
423
+ var position, value;
424
+ while (elem.length && elem[0] !== document) {
425
+ position = elem.css("position");
426
+ if (position === "absolute" || position === "relative" || position === "fixed") {
427
+ value = parseInt(elem.css("zIndex"), 10);
428
+ if (!isNaN(value) && value !== 0) {
429
+ if (value > maxValue) { maxValue = value; }
429
430
  }
430
431
  }
431
432
  elem = elem.parent();
432
433
  }
434
+
435
+ return maxValue;
433
436
  },
434
437
 
435
438
  /* Refresh the time picker
436
- @param target element - The target input field or inline container element. */
439
+ @param target element - The target input field or inline container element. */
437
440
  _refreshTimepicker: function(target) {
438
441
  var inst = this._getInst(target);
439
442
  if (inst) {
@@ -453,11 +456,11 @@ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
453
456
  var borders = $.timepicker._getBorders(inst.tpDiv),
454
457
  self = this;
455
458
  inst.tpDiv
456
- .find('iframe.ui-timepicker-cover') // IE6- only
457
- .css({ left: -borders[0], top: -borders[1],
458
- width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
459
- })
460
- .end()
459
+ .find('iframe.ui-timepicker-cover') // IE6- only
460
+ .css({ left: -borders[0], top: -borders[1],
461
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
462
+ })
463
+ .end()
461
464
  // after the picker html is appended bind the click & double click events (faster in IE this way
462
465
  // then letting the browser interpret the inline events)
463
466
  // the binding for the minute cells also exists in _updateMinuteDisplay
@@ -471,25 +474,25 @@ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
471
474
  .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectHours, this))
472
475
  .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectHours, this))
473
476
  .end()
474
- .find('.ui-timepicker td a')
477
+ .find('.ui-timepicker td a')
475
478
  .unbind()
476
- .bind('mouseout', function () {
477
- $(this).removeClass('ui-state-hover');
478
- if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
479
- if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
480
- })
481
- .bind('mouseover', function () {
482
- if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
483
- $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
484
- $(this).addClass('ui-state-hover');
485
- if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
486
- if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
487
- }
488
- })
489
- .end()
490
- .find('.' + this._dayOverClass + ' a')
491
- .trigger('mouseover')
492
- .end()
479
+ .bind('mouseout', function () {
480
+ $(this).removeClass('ui-state-hover');
481
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
482
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
483
+ })
484
+ .bind('mouseover', function () {
485
+ if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
486
+ $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
487
+ $(this).addClass('ui-state-hover');
488
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
489
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
490
+ }
491
+ })
492
+ .end()
493
+ .find('.' + this._dayOverClass + ' a')
494
+ .trigger('mouseover')
495
+ .end()
493
496
  .find('.ui-timepicker-now').bind("click", function(e) {
494
497
  $.timepicker.selectNow(e);
495
498
  }).end()
@@ -548,7 +551,7 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
548
551
  pmItems++;
549
552
  }
550
553
  }
551
- hourCounter = 0;
554
+ hourCounter = 0;
552
555
 
553
556
  amRows = Math.floor(amItems / hours.length * rows);
554
557
  pmRows = Math.floor(pmItems / hours.length * rows);
@@ -639,11 +642,12 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
639
642
  html += buttonPanel + '</div></td></tr>';
640
643
  }
641
644
  html += '</table>';
645
+
642
646
  return html;
643
647
  },
644
648
 
645
649
  /* Special function that update the minutes selection in currently visible timepicker
646
- * called on hour selection when onMinuteShow is defined */
650
+ * called on hour selection when onMinuteShow is defined */
647
651
  _updateMinuteDisplay: function (inst) {
648
652
  var newHtml = this._generateHTMLMinutes(inst);
649
653
  inst.tpDiv.find('td.ui-timepicker-minutes').html(newHtml);
@@ -651,17 +655,17 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
651
655
  // after the picker html is appended bind the click & double click events (faster in IE this way
652
656
  // then letting the browser interpret the inline events)
653
657
  // yes I know, duplicate code, sorry
654
- /* .find('.ui-timepicker-minute-cell')
655
- .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
656
- .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
658
+ /* .find('.ui-timepicker-minute-cell')
659
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
660
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
657
661
  */
658
662
 
659
663
  },
660
664
 
661
665
  /*
662
- * Generate the minutes table
663
- * This is separated from the _generateHTML function because is can be called separately (when hours changes)
664
- */
666
+ * Generate the minutes table
667
+ * This is separated from the _generateHTML function because is can be called separately (when hours changes)
668
+ */
665
669
  _generateHTMLMinutes: function (inst) {
666
670
 
667
671
  var m, row, html = '',
@@ -686,8 +690,8 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
686
690
  minutesPerRow = Math.round(minutes.length / rows + 0.49); // always round up
687
691
 
688
692
  /*
689
- * The minutes table
690
- */
693
+ * The minutes table
694
+ */
691
695
  // if currently selected minute is not enabled, we have a problem and need to select a new minute.
692
696
  if (onMinuteShow &&
693
697
  (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours , inst.minutes]) == false) ) {
@@ -744,7 +748,7 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
744
748
 
745
749
  var html = "";
746
750
  var enabled = true;
747
- var onHourShow = this._get(inst, 'onHourShow'); //custom callback
751
+ var onHourShow = this._get(inst, 'onHourShow'); //custom callback
748
752
 
749
753
  if (hour == undefined) {
750
754
  html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
@@ -752,7 +756,7 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
752
756
  }
753
757
 
754
758
  if (onHourShow) {
755
- enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
759
+ enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
756
760
  }
757
761
 
758
762
  if (enabled) {
@@ -764,26 +768,26 @@ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-tim
764
768
  '</a></td>';
765
769
  }
766
770
  else {
767
- html =
768
- '<td>' +
769
- '<span class="ui-state-default ui-state-disabled ' +
770
- (hour == inst.hours ? ' ui-state-active ' : ' ') +
771
- '">' +
772
- displayHour.toString() +
773
- '</span>' +
774
- '</td>';
771
+ html =
772
+ '<td>' +
773
+ '<span class="ui-state-default ui-state-disabled ' +
774
+ (hour == inst.hours ? ' ui-state-active ' : ' ') +
775
+ '">' +
776
+ displayHour.toString() +
777
+ '</span>' +
778
+ '</td>';
775
779
  }
776
780
  return html;
777
781
  },
778
782
 
779
783
  /* Generate the content of a "Hour" cell */
780
784
  _generateHTMLMinuteCell: function (inst, minute, displayText) {
781
- var html = "";
785
+ var html = "";
782
786
  var enabled = true;
783
- var onMinuteShow = this._get(inst, 'onMinuteShow'); //custom callback
787
+ var onMinuteShow = this._get(inst, 'onMinuteShow'); //custom callback
784
788
  if (onMinuteShow) {
785
- //NEW: 2011-02-03 we should give the hour as a parameter as well!
786
- enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]); //trigger callback
789
+ //NEW: 2011-02-03 we should give the hour as a parameter as well!
790
+ enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]); //trigger callback
787
791
  }
788
792
 
789
793
  if (minute == undefined) {
@@ -792,19 +796,19 @@ displayHour.toString() +
792
796
  }
793
797
 
794
798
  if (enabled) {
795
- html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
796
- '<a class="ui-state-default ' +
797
- (minute == inst.minutes ? 'ui-state-active' : '') +
798
- '" >' +
799
- displayText +
800
- '</a></td>';
799
+ html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
800
+ '<a class="ui-state-default ' +
801
+ (minute == inst.minutes ? 'ui-state-active' : '') +
802
+ '" >' +
803
+ displayText +
804
+ '</a></td>';
801
805
  }
802
806
  else {
803
807
 
804
- html = '<td>' +
805
- '<span class="ui-state-default ui-state-disabled" >' +
806
- displayText +
807
- '</span>' +
808
+ html = '<td>' +
809
+ '<span class="ui-state-default ui-state-disabled" >' +
810
+ displayText +
811
+ '</span>' +
808
812
  '</td>';
809
813
  }
810
814
  return html;
@@ -812,7 +816,7 @@ displayText +
812
816
 
813
817
 
814
818
  /* Detach a timepicker from its control.
815
- @param target element - the target input field or division or span */
819
+ @param target element - the target input field or division or span */
816
820
  _destroyTimepicker: function(target) {
817
821
  var $target = $(target);
818
822
  var inst = $.data(target, PROP_NAME);
@@ -832,7 +836,7 @@ displayText +
832
836
  },
833
837
 
834
838
  /* Enable the date picker to a jQuery selection.
835
- @param target element - the target input field or division or span */
839
+ @param target element - the target input field or division or span */
836
840
  _enableTimepicker: function(target) {
837
841
  var $target = $(target),
838
842
  target_id = $target.attr('id'),
@@ -861,7 +865,7 @@ displayText +
861
865
  },
862
866
 
863
867
  /* Disable the time picker to a jQuery selection.
864
- @param target element - the target input field or division or span */
868
+ @param target element - the target input field or division or span */
865
869
  _disableTimepicker: function(target) {
866
870
  var $target = $(target);
867
871
  var inst = $.data(target, PROP_NAME);
@@ -893,8 +897,8 @@ displayText +
893
897
  },
894
898
 
895
899
  /* Is the first field in a jQuery collection disabled as a timepicker?
896
- @param target_id element - the target input field or division or span
897
- @return boolean - true if disabled, false if enabled */
900
+ @param target_id element - the target input field or division or span
901
+ @return boolean - true if disabled, false if enabled */
898
902
  _isDisabledTimepicker: function (target_id) {
899
903
  if ( ! target_id) { return false; }
900
904
  for (var i = 0; i < this._disabledInputs.length; i++) {
@@ -918,9 +922,9 @@ displayText +
918
922
 
919
923
  // now check if datepicker is showing outside window viewport - move to a better place if so.
920
924
  offset.left -= Math.min(offset.left, (offset.left + tpWidth > viewWidth && viewWidth > tpWidth) ?
921
- Math.abs(offset.left + tpWidth - viewWidth) : 0);
925
+ Math.abs(offset.left + tpWidth - viewWidth) : 0);
922
926
  offset.top -= Math.min(offset.top, (offset.top + tpHeight > viewHeight && viewHeight > tpHeight) ?
923
- Math.abs(tpHeight + inputHeight) : 0);
927
+ Math.abs(tpHeight + inputHeight) : 0);
924
928
 
925
929
  return offset;
926
930
  },
@@ -937,14 +941,14 @@ Math.abs(tpHeight + inputHeight) : 0);
937
941
  },
938
942
 
939
943
  /* Retrieve the size of left and top borders for an element.
940
- @param elem (jQuery object) the element of interest
941
- @return (number[2]) the left and top borders */
944
+ @param elem (jQuery object) the element of interest
945
+ @return (number[2]) the left and top borders */
942
946
  _getBorders: function (elem) {
943
947
  var convert = function (value) {
944
948
  return { thin: 1, medium: 2, thick: 3}[value] || value;
945
949
  };
946
950
  return [parseFloat(convert(elem.css('border-left-width'))),
947
- parseFloat(convert(elem.css('border-top-width')))];
951
+ parseFloat(convert(elem.css('border-top-width')))];
948
952
  },
949
953
 
950
954
 
@@ -953,15 +957,15 @@ parseFloat(convert(elem.css('border-top-width')))];
953
957
  if (!$.timepicker._curInst) { return; }
954
958
  var $target = $(event.target);
955
959
  if ($target[0].id != $.timepicker._mainDivId &&
956
- $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
957
- !$target.hasClass($.timepicker.markerClassName) &&
958
- !$target.hasClass($.timepicker._triggerClass) &&
959
- $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
960
+ $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
961
+ !$target.hasClass($.timepicker.markerClassName) &&
962
+ !$target.hasClass($.timepicker._triggerClass) &&
963
+ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
960
964
  $.timepicker._hideTimepicker();
961
965
  },
962
966
 
963
967
  /* Hide the time picker from view.
964
- @param input element - the input field attached to the time picker */
968
+ @param input element - the input field attached to the time picker */
965
969
  _hideTimepicker: function (input) {
966
970
  var inst = this._curInst;
967
971
  if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
@@ -977,7 +981,7 @@ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
977
981
  }
978
982
  else {
979
983
  inst.tpDiv[(showAnim == 'slideDown' ? 'slideUp' :
980
- (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
984
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
981
985
  }
982
986
  if (!showAnim) { postProcess(); }
983
987
 
@@ -997,7 +1001,7 @@ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
997
1001
  if (onClose) {
998
1002
  onClose.apply(
999
1003
  (inst.input ? inst.input[0] : null),
1000
- [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
1004
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
1001
1005
  }
1002
1006
 
1003
1007
  }
@@ -1011,9 +1015,9 @@ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
1011
1015
  },
1012
1016
 
1013
1017
  /* Retrieve the instance data for the target control.
1014
- @param target element - the target input field or division or span
1015
- @return object - the associated instance data
1016
- @throws error if a jQuery problem getting data */
1018
+ @param target element - the target input field or division or span
1019
+ @return object - the associated instance data
1020
+ @throws error if a jQuery problem getting data */
1017
1021
  _getInst: function (target) {
1018
1022
  try {
1019
1023
  return $.data(target, PROP_NAME);
@@ -1026,7 +1030,7 @@ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
1026
1030
  /* Get a setting value, defaulting if necessary. */
1027
1031
  _get: function (inst, name) {
1028
1032
  return inst.settings[name] !== undefined ?
1029
- inst.settings[name] : this._defaults[name];
1033
+ inst.settings[name] : this._defaults[name];
1030
1034
  },
1031
1035
 
1032
1036
  /* Parse existing time and initialise time picker. */
@@ -1057,13 +1061,13 @@ inst.settings[name] : this._defaults[name];
1057
1061
  },
1058
1062
 
1059
1063
  /* Update or retrieve the settings for an existing time picker.
1060
- @param target element - the target input field or division or span
1061
- @param name object - the new settings to update or
1062
- string - the name of the setting to change or retrieve,
1063
- when retrieving also 'all' for all instance settings or
1064
- 'defaults' for all global defaults
1065
- @param value any - the new value for the setting
1066
- (omit if above is an object or to retrieve a value) */
1064
+ @param target element - the target input field or division or span
1065
+ @param name object - the new settings to update or
1066
+ string - the name of the setting to change or retrieve,
1067
+ when retrieving also 'all' for all instance settings or
1068
+ 'defaults' for all global defaults
1069
+ @param value any - the new value for the setting
1070
+ (omit if above is an object or to retrieve a value) */
1067
1071
  _optionTimepicker: function(target, name, value) {
1068
1072
  var inst = this._getInst(target);
1069
1073
  if (arguments.length == 2 && typeof name == 'string') {
@@ -1087,16 +1091,16 @@ when retrieving also 'all' for all instance settings or
1087
1091
 
1088
1092
 
1089
1093
  /* Set the time for a jQuery selection.
1090
- @param target element - the target input field or division or span
1091
- @param time String - the new time */
1092
- _setTimeTimepicker: function(target, time) {
1093
- var inst = this._getInst(target);
1094
- if (inst) {
1095
- this._setTime(inst, time);
1096
- this._updateTimepicker(inst);
1097
- this._updateAlternate(inst, time);
1098
- }
1099
- },
1094
+ @param target element - the target input field or division or span
1095
+ @param time String - the new time */
1096
+ _setTimeTimepicker: function(target, time) {
1097
+ var inst = this._getInst(target);
1098
+ if (inst) {
1099
+ this._setTime(inst, time);
1100
+ this._updateTimepicker(inst);
1101
+ this._updateAlternate(inst, time);
1102
+ }
1103
+ },
1100
1104
 
1101
1105
  /* Set the time directly. */
1102
1106
  _setTime: function(inst, time, noChange) {
@@ -1129,8 +1133,8 @@ this._updateAlternate(inst, time);
1129
1133
  },
1130
1134
 
1131
1135
  /*
1132
- * Parse a time string into hours and minutes
1133
- */
1136
+ * Parse a time string into hours and minutes
1137
+ */
1134
1138
  parseTime: function (inst, timeVal) {
1135
1139
  var retVal = new Object();
1136
1140
  retVal.hours = -1;
@@ -1218,7 +1222,7 @@ this._updateAlternate(inst, time);
1218
1222
  // added for onMinuteShow callback
1219
1223
  var onMinuteShow = this._get(inst, 'onMinuteShow');
1220
1224
  if (onMinuteShow) {
1221
- // this will trigger a callback on selected hour to make sure selected minute is allowed.
1225
+ // this will trigger a callback on selected hour to make sure selected minute is allowed.
1222
1226
  this._updateMinuteDisplay(inst);
1223
1227
  }
1224
1228
 
@@ -1301,7 +1305,7 @@ this._updateAlternate(inst, time);
1301
1305
  if (displayHours == -1) { displayHours = 0 }
1302
1306
  if (selectedMinutes == -1) { selectedMinutes = 0 }
1303
1307
 
1304
- if (showPeriod) {
1308
+ if (showPeriod) {
1305
1309
  if (inst.hours == 0) {
1306
1310
  displayHours = 12;
1307
1311
  }
@@ -1383,15 +1387,15 @@ this._updateAlternate(inst, time);
1383
1387
 
1384
1388
 
1385
1389
  /* Invoke the timepicker functionality.
1386
- @param options string - a command, optionally followed by additional parameters or
1387
- Object - settings for attaching new timepicker functionality
1388
- @return jQuery object */
1390
+ @param options string - a command, optionally followed by additional parameters or
1391
+ Object - settings for attaching new timepicker functionality
1392
+ @return jQuery object */
1389
1393
  $.fn.timepicker = function (options) {
1390
1394
 
1391
1395
  /* Initialise the time picker. */
1392
1396
  if (!$.timepicker.initialized) {
1393
1397
  $(document).mousedown($.timepicker._checkExternalClick).
1394
- find('body').append($.timepicker.tpDiv);
1398
+ find('body').append($.timepicker.tpDiv);
1395
1399
  $.timepicker.initialized = true;
1396
1400
  }
1397
1401
 
@@ -1400,15 +1404,15 @@ find('body').append($.timepicker.tpDiv);
1400
1404
  var otherArgs = Array.prototype.slice.call(arguments, 1);
1401
1405
  if (typeof options == 'string' && (options == 'getTime' || options == 'getTimeAsDate' || options == 'getHour' || options == 'getMinute' ))
1402
1406
  return $.timepicker['_' + options + 'Timepicker'].
1403
- apply($.timepicker, [this[0]].concat(otherArgs));
1407
+ apply($.timepicker, [this[0]].concat(otherArgs));
1404
1408
  if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
1405
1409
  return $.timepicker['_' + options + 'Timepicker'].
1406
1410
  apply($.timepicker, [this[0]].concat(otherArgs));
1407
1411
  return this.each(function () {
1408
1412
  typeof options == 'string' ?
1409
- $.timepicker['_' + options + 'Timepicker'].
1410
- apply($.timepicker, [this].concat(otherArgs)) :
1411
- $.timepicker._attachTimepicker(this, options);
1413
+ $.timepicker['_' + options + 'Timepicker'].
1414
+ apply($.timepicker, [this].concat(otherArgs)) :
1415
+ $.timepicker._attachTimepicker(this, options);
1412
1416
  });
1413
1417
  };
1414
1418
 
@@ -1424,7 +1428,7 @@ $.timepicker._attachTimepicker(this, options);
1424
1428
  $.timepicker = new Timepicker(); // singleton instance
1425
1429
  $.timepicker.initialized = false;
1426
1430
  $.timepicker.uuid = new Date().getTime();
1427
- $.timepicker.version = "0.3.1";
1431
+ $.timepicker.version = "0.3.2";
1428
1432
 
1429
1433
  // Workaround for #4055
1430
1434
  // Add another global to avoid noConflict issues with inline event handlers