rails_admin 0.4.2 → 0.4.3

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.

Potentially problematic release.


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

Files changed (33) hide show
  1. data/app/assets/javascripts/rails_admin/custom/ui.coffee +1 -0
  2. data/app/assets/javascripts/rails_admin/jquery.remotipart.fixed.js +72 -0
  3. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +303 -241
  4. data/app/assets/javascripts/rails_admin/ra.remote-form.js +5 -6
  5. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +1 -1
  6. data/app/assets/javascripts/rails_admin/rails_admin.js +21 -0
  7. data/app/assets/javascripts/rails_admin/{ui.js.coffee → ui.coffee} +0 -0
  8. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss +733 -0
  9. data/app/assets/stylesheets/rails_admin/base/mixins.scss +1 -0
  10. data/app/assets/stylesheets/rails_admin/base/theming.scss +270 -0
  11. data/app/assets/stylesheets/rails_admin/base/variables.scss +1 -0
  12. data/app/assets/stylesheets/rails_admin/custom/{mixins.css.scss → mixins.scss} +0 -0
  13. data/app/assets/stylesheets/rails_admin/custom/{theming.css.scss → theming.scss} +0 -0
  14. data/app/assets/stylesheets/rails_admin/custom/{variables.css.scss → variables.scss} +0 -0
  15. data/app/assets/stylesheets/rails_admin/{jquery.colorpicker.css.scss → jquery.colorpicker.scss} +0 -0
  16. data/app/assets/stylesheets/rails_admin/{jquery.ui.timepicker.css.scss → jquery.ui.timepicker.scss} +12 -13
  17. data/app/assets/stylesheets/rails_admin/{ra.calendar-additions.css.scss → ra.calendar-additions.scss} +0 -0
  18. data/app/assets/stylesheets/rails_admin/{ra.filtering-multiselect.css.scss → ra.filtering-multiselect.scss} +0 -0
  19. data/app/assets/stylesheets/rails_admin/{ra.widgets.css.scss → ra.widgets.scss} +0 -0
  20. data/app/assets/stylesheets/rails_admin/{imports.css.scss.erb → rails_admin.scss.erb} +0 -8
  21. data/app/assets/{javascripts/rails_admin/themes/cerulean/ui.js → stylesheets/rails_admin/themes/cerulean/mixins.scss} +0 -0
  22. data/app/assets/stylesheets/rails_admin/themes/cerulean/{theming.css.scss → theming.scss} +0 -0
  23. data/app/assets/stylesheets/rails_admin/themes/cerulean/{variables.css.scss → variables.scss} +0 -0
  24. data/app/assets/stylesheets/rails_admin/themes/default/{mixins.css.scss → mixins.scss} +0 -0
  25. data/app/assets/stylesheets/rails_admin/themes/default/{theming.css.scss → theming.scss} +0 -0
  26. data/app/assets/stylesheets/rails_admin/themes/default/{variables.css.scss → variables.scss} +0 -0
  27. data/lib/rails_admin/version.rb +1 -1
  28. metadata +84 -82
  29. data/app/assets/javascripts/rails_admin/custom/ui.js +0 -12
  30. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +0 -27
  31. data/app/assets/javascripts/rails_admin/themes/default/ui.js +0 -12
  32. data/app/assets/stylesheets/rails_admin/rails_admin.css +0 -4
  33. data/app/assets/stylesheets/rails_admin/themes/cerulean/mixins.css.scss +0 -0
@@ -0,0 +1 @@
1
+ #= override this file in your application to add custom behaviour
@@ -0,0 +1,72 @@
1
+ //= require jquery.iframe-transport.js
2
+ //= require_self
3
+
4
+
5
+ // This file is frozen in RailsAdmin to cope with https://github.com/JangoSteve/remotipart/pull/50
6
+
7
+ (function($) {
8
+
9
+ var remotipart;
10
+
11
+ $.remotipart = remotipart = {
12
+
13
+ setup: function(form) {
14
+ form
15
+ // Allow setup part of $.rails.handleRemote to setup remote settings before canceling default remote handler
16
+ // This is required in order to change the remote settings using the form details
17
+ .one('ajax:beforeSend.remotipart', function(e, xhr, settings){
18
+ // Delete the beforeSend bindings, since we're about to re-submit via ajaxSubmit with the beforeSubmit
19
+ // hook that was just setup and triggered via the default `$.rails.handleRemote`
20
+ // delete settings.beforeSend;
21
+ delete settings.beforeSend;
22
+
23
+ settings.iframe = true;
24
+ settings.files = $($.rails.fileInputSelector, form);
25
+ settings.data = form.serializeArray();
26
+ settings.processData = false;
27
+
28
+ // Modify some settings to integrate JS request with rails helpers and middleware
29
+ if (settings.dataType === undefined) { settings.dataType = 'script *'; }
30
+ settings.data.push({name: 'remotipart_submitted', value: true});
31
+
32
+ // Allow remotipartSubmit to be cancelled if needed
33
+ if ($.rails.fire(form, 'ajax:remotipartSubmit', [xhr, settings])) {
34
+ // Second verse, same as the first
35
+ $.rails.ajax(settings);
36
+ }
37
+
38
+ //Run cleanup
39
+ remotipart.teardown(form);
40
+
41
+ // Cancel the jQuery UJS request
42
+ return false;
43
+ })
44
+
45
+ // Keep track that we just set this particular form with Remotipart bindings
46
+ // Note: The `true` value will get over-written with the `settings.dataType` from the `ajax:beforeSend` handler
47
+ .data('remotipartSubmitted', true);
48
+ },
49
+
50
+ teardown: function(form) {
51
+ form
52
+ .unbind('ajax:beforeSend.remotipart')
53
+ .removeData('remotipartSubmitted')
54
+ }
55
+ };
56
+
57
+ $(document).on('ajax:aborted:file', 'form', function(){
58
+ var form = $(this);
59
+
60
+ remotipart.setup(form);
61
+
62
+ // If browser does not support submit bubbling, then this live-binding will be called before direct
63
+ // bindings. Therefore, we should directly call any direct bindings before remotely submitting form.
64
+ if (!$.support.submitBubbles && $().jquery < '1.7' && $.rails.callFormSubmitBindings(form) === false) return $.rails.stopEverything(e);
65
+
66
+ // Manually call jquery-ujs remote call so that it can setup form and settings as usual,
67
+ // and trigger the `ajax:beforeSend` callback to which remotipart binds functionality.
68
+ $.rails.handleRemote(form);
69
+ return false;
70
+ });
71
+
72
+ })(jQuery);
@@ -1,59 +1,58 @@
1
1
  /*
2
- * jQuery UI Timepicker 0.2.9
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 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<-
39
39
  */
40
40
 
41
- (function ($, undefined) {
41
+ (function ($) {
42
42
 
43
- $.extend($.ui, { timepicker: { version: "0.2.9"} });
43
+ $.extend($.ui, { timepicker: { version: "0.3.1"} });
44
44
 
45
- var PROP_NAME = 'timepicker';
46
- var tpuuid = new Date().getTime();
45
+ var PROP_NAME = 'timepicker',
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
55
55
  this._curInst = null; // The current instance in use
56
- this._isInline = false; // true if the instance is displayed inline
57
56
  this._disabledInputs = []; // List of time picker inputs that have been disabled
58
57
  this._timepickerShowing = false; // True if the popup picker is showing , false if not
59
58
  this._inDialog = false; // True if showing within a "dialog", false if not
@@ -65,61 +64,61 @@
65
64
 
66
65
  this.regional = []; // Available regional settings, indexed by language code
67
66
  this.regional[''] = { // Default regional settings
68
- hourText: 'Hour', // Display text for hours section
69
- minuteText: 'Minute', // Display text for minutes link
70
- amPmText: ['AM', 'PM'], // Display text for AM PM
71
- closeButtonText: 'Done', // Text for the confirmation button (ok button)
72
- nowButtonText: 'Now', // Text for the now button
73
- 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
74
73
  };
75
74
  this._defaults = { // Global defaults for all the time picker instances
76
- showOn: 'focus', // 'focus' for popup on focus,
75
+ showOn: 'focus', // 'focus' for popup on focus,
77
76
  // 'button' for trigger button, or 'both' for either (not yet implemented)
78
- button: null, // 'button' element that will trigger the timepicker
79
- showAnim: 'fadeIn', // Name of jQuery animation for popup
80
- showOptions: {}, // Options for enhanced animations
81
- appendText: '', // Display text following the input box, e.g. showing the format
82
-
83
- beforeShow: null, // Define a callback function executed before the timepicker is shown
84
- onSelect: null, // Define a callback function when a hour / minutes is selected
85
- onClose: null, // Define a callback function when the timepicker is closed
86
-
87
- timeSeparator: ':', // The character to use to separate hours and minutes.
88
- periodSeparator: ' ', // The character to use to separate the time from the time period.
89
- showPeriod: false, // Define whether or not to show AM/PM with selected time
90
- showPeriodLabels: true, // Show the AM/PM labels on the left of the time picker
91
- showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10. [true/false]
92
- showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
93
- altField: '', // Selector for an alternate field to store selected time into
94
- 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
95
94
  // (set to 'now' for the current time, '' for no highlighted time)
96
- myPosition: 'left top', // Position of the dialog relative to the input.
95
+ myPosition: 'left top', // Position of the dialog relative to the input.
97
96
  // see the position utility for more info : http://jqueryui.com/demos/position/
98
- atPosition: 'left bottom', // Position of the input element to match
97
+ atPosition: 'left bottom', // Position of the input element to match
99
98
  // Note : if the position utility is not loaded, the timepicker will attach left top to left bottom
100
99
  //NEW: 2011-02-03
101
- onHourShow: null, // callback for enabling / disabling on selectable hours ex : function(hour) { return true; }
102
- 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; }
103
102
 
104
103
  hours: {
105
- starts: 0, // first displayed hour
106
- ends: 23 // last displayed hour
104
+ starts: 0, // first displayed hour
105
+ ends: 23 // last displayed hour
107
106
  },
108
107
  minutes: {
109
- starts: 0, // first displayed minute
110
- ends: 55, // last displayed minute
111
- 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
112
111
  },
113
- 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
114
113
  // 2011-08-05 0.2.4
115
- showHours: true, // display the hours section of the dialog
116
- showMinutes: true, // display the minute section of the dialog
117
- optionalMinutes: false, // optionally parse inputs of whole hours with minutes omitted
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
118
117
 
119
118
  // buttons
120
- showCloseButton: false, // shows an OK button to confirm the edit
121
- showNowButton: false, // Shows the 'now' button
122
- 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
123
122
 
124
123
  };
125
124
  $.extend(this._defaults, this.regional['']);
@@ -142,16 +141,16 @@
142
141
  },
143
142
 
144
143
  /* Override the default settings for all instances of the time picker.
145
- @param settings object - the new settings to use as defaults (anonymous object)
146
- @return the manager object */
144
+ @param settings object - the new settings to use as defaults (anonymous object)
145
+ @return the manager object */
147
146
  setDefaults: function (settings) {
148
147
  extendRemove(this._defaults, settings || {});
149
148
  return this;
150
149
  },
151
150
 
152
151
  /* Attach the time picker to a jQuery selection.
153
- @param target element - the target input field or division or span
154
- @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) */
155
154
  _attachTimepicker: function (target, settings) {
156
155
  // check for settings on the control itself - in namespace 'time:'
157
156
  var inlineSettings = null;
@@ -193,7 +192,7 @@
193
192
  id: id, input: target, // associated target
194
193
  inline: inline, // is timepicker inline or not :
195
194
  tpDiv: (!inline ? this.tpDiv : // presentation div
196
- $('<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>'))
197
196
  };
198
197
  },
199
198
 
@@ -229,9 +228,9 @@
229
228
  case 13:
230
229
  $.timepicker._updateSelectedValue(inst);
231
230
  $.timepicker._hideTimepicker();
232
-
233
- return false; // don't submit the form
234
- break; // select the value on enter
231
+
232
+ return false; // don't submit the form
233
+ break; // select the value on enter
235
234
  case 27: $.timepicker._hideTimepicker();
236
235
  break; // hide on escape
237
236
  default: handled = false;
@@ -316,8 +315,8 @@
316
315
  },
317
316
 
318
317
  /* Pop-up the time picker for a given input field.
319
- @param input element - the input field attached to the time picker or
320
- event - if triggered by focus */
318
+ @param input element - the input field attached to the time picker or
319
+ event - if triggered by focus */
321
320
  _showTimepicker: function (input) {
322
321
  input = input.target || input;
323
322
  if (input.nodeName.toLowerCase() != 'input') { input = $('input', input.parentNode)[0]; } // find from button/image trigger
@@ -363,7 +362,7 @@
363
362
 
364
363
 
365
364
  // position with the ui position utility, if loaded
366
- if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
365
+ if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
367
366
  inst.tpDiv.position({
368
367
  of: inst.input,
369
368
  my: $.timepicker._get( inst, 'myPosition' ),
@@ -385,7 +384,7 @@
385
384
  // and adjust position before showing
386
385
  offset = $.timepicker._checkOffset(inst, offset, isFixed);
387
386
  inst.tpDiv.css({ position: ($.timepicker._inDialog && $.blockUI ?
388
- 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
387
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
389
388
  left: offset.left + 'px', top: offset.top + 'px'
390
389
  });
391
390
  if ( ! inst.inline ) {
@@ -396,9 +395,9 @@
396
395
  $.timepicker._timepickerShowing = true;
397
396
  var borders = $.timepicker._getBorders(inst.tpDiv);
398
397
  inst.tpDiv.find('iframe.ui-timepicker-cover'). // IE6- only
399
- css({ left: -borders[0], top: -borders[1],
400
- width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
401
- });
398
+ css({ left: -borders[0], top: -borders[1],
399
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
400
+ });
402
401
  };
403
402
 
404
403
  // Fixed the zIndex problem for real (I hope) - FG - v 0.2.9
@@ -409,7 +408,7 @@
409
408
  inst.tpDiv.show(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
410
409
  }
411
410
  else {
412
- inst.tpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
411
+ inst.tpDiv.show((showAnim ? duration : null), postProcess);
413
412
  }
414
413
  if (!showAnim || !duration) { postProcess(); }
415
414
  if (inst.input.is(':visible') && !inst.input.is(':disabled')) { inst.input.focus(); }
@@ -433,6 +432,16 @@
433
432
  }
434
433
  },
435
434
 
435
+ /* Refresh the time picker
436
+ @param target element - The target input field or inline container element. */
437
+ _refreshTimepicker: function(target) {
438
+ var inst = this._getInst(target);
439
+ if (inst) {
440
+ this._updateTimepicker(inst);
441
+ }
442
+ },
443
+
444
+
436
445
  /* Generate the time picker content. */
437
446
  _updateTimepicker: function (inst) {
438
447
  inst.tpDiv.empty().append(this._generateHTML(inst));
@@ -444,11 +453,11 @@
444
453
  var borders = $.timepicker._getBorders(inst.tpDiv),
445
454
  self = this;
446
455
  inst.tpDiv
447
- .find('iframe.ui-timepicker-cover') // IE6- only
448
- .css({ left: -borders[0], top: -borders[1],
449
- width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
450
- })
451
- .end()
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()
452
461
  // after the picker html is appended bind the click & double click events (faster in IE this way
453
462
  // then letting the browser interpret the inline events)
454
463
  // the binding for the minute cells also exists in _updateMinuteDisplay
@@ -462,26 +471,26 @@
462
471
  .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectHours, this))
463
472
  .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectHours, this))
464
473
  .end()
465
- .find('.ui-timepicker td a')
474
+ .find('.ui-timepicker td a')
466
475
  .unbind()
467
- .bind('mouseout', function () {
468
- $(this).removeClass('ui-state-hover');
469
- if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
470
- if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
471
- })
472
- .bind('mouseover', function () {
473
- if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
474
- $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
475
- $(this).addClass('ui-state-hover');
476
- if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
477
- if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
478
- }
479
- })
480
- .end()
481
- .find('.' + this._dayOverClass + ' a')
482
- .trigger('mouseover')
483
- .end()
484
- .find('.ui-timepicker-now').bind("click",function(e) {
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()
493
+ .find('.ui-timepicker-now').bind("click", function(e) {
485
494
  $.timepicker.selectNow(e);
486
495
  }).end()
487
496
  .find('.ui-timepicker-deselect').bind("click",function(e) {
@@ -521,7 +530,7 @@
521
530
  showDeselectButton = this._get(inst, 'showDeselectButton'),
522
531
  deselectButtonText = this._get(inst, 'deselectButtonText'),
523
532
  showButtonPanel = showCloseButton || showNowButton || showDeselectButton;
524
-
533
+
525
534
 
526
535
 
527
536
  // prepare all hours and minutes, makes it easier to distribute by rows
@@ -544,7 +553,7 @@
544
553
  amRows = Math.floor(amItems / hours.length * rows);
545
554
  pmRows = Math.floor(pmItems / hours.length * rows);
546
555
 
547
- // assign the extra row to the period that is more densly populated
556
+ // assign the extra row to the period that is more densely populated
548
557
  if (rows != amRows + pmRows) {
549
558
  // Make sure: AM Has Items and either PM Does Not, AM has no rows yet, or AM is more dense
550
559
  if (amItems && (!pmItems || !amRows || (pmRows && amItems / amRows >= pmItems / pmRows))) {
@@ -555,7 +564,14 @@
555
564
  }
556
565
  amFirstRow = Math.min(amRows, 1);
557
566
  pmFirstRow = amRows + 1;
558
- hoursPerRow = Math.ceil(Math.max(amItems / amRows, pmItems / pmRows));
567
+
568
+ if (amRows == 0) {
569
+ hoursPerRow = Math.ceil(pmItems / pmRows);
570
+ } else if (pmRows == 0) {
571
+ hoursPerRow = Math.ceil(amItems / amRows);
572
+ } else {
573
+ hoursPerRow = Math.ceil(Math.max(amItems / amRows, pmItems / pmRows));
574
+ }
559
575
  }
560
576
 
561
577
 
@@ -589,8 +605,8 @@
589
605
  }
590
606
  html += '</tr>';
591
607
  }
592
- html += '</tr></table>' + // Close the hours cells table
593
- '</td>'; // Close the Hour td
608
+ html += '</table>' + // Close the hours cells table
609
+ '</td>'; // Close the Hour td
594
610
  }
595
611
 
596
612
  if (showMinutes) {
@@ -598,7 +614,7 @@
598
614
  html += this._generateHTMLMinutes(inst);
599
615
  html += '</td>';
600
616
  }
601
-
617
+
602
618
  html += '</tr>';
603
619
 
604
620
 
@@ -623,16 +639,11 @@
623
639
  html += buttonPanel + '</div></td></tr>';
624
640
  }
625
641
  html += '</table>';
626
-
627
- /* IE6 IFRAME FIX (taken from datepicker 1.5.3, fixed in 0.1.2 */
628
- html += ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
629
- '<iframe src="javascript:false;" class="ui-timepicker-cover" frameborder="0"></iframe>' : '');
630
-
631
642
  return html;
632
643
  },
633
644
 
634
645
  /* Special function that update the minutes selection in currently visible timepicker
635
- * called on hour selection when onMinuteShow is defined */
646
+ * called on hour selection when onMinuteShow is defined */
636
647
  _updateMinuteDisplay: function (inst) {
637
648
  var newHtml = this._generateHTMLMinutes(inst);
638
649
  inst.tpDiv.find('td.ui-timepicker-minutes').html(newHtml);
@@ -640,17 +651,17 @@
640
651
  // after the picker html is appended bind the click & double click events (faster in IE this way
641
652
  // then letting the browser interpret the inline events)
642
653
  // yes I know, duplicate code, sorry
643
- /* .find('.ui-timepicker-minute-cell')
644
- .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
645
- .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
654
+ /* .find('.ui-timepicker-minute-cell')
655
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
656
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
646
657
  */
647
658
 
648
659
  },
649
660
 
650
661
  /*
651
- * Generate the minutes table
652
- * This is separated from the _generateHTML function because is can be called separately (when hours changes)
653
- */
662
+ * Generate the minutes table
663
+ * This is separated from the _generateHTML function because is can be called separately (when hours changes)
664
+ */
654
665
  _generateHTMLMinutes: function (inst) {
655
666
 
656
667
  var m, row, html = '',
@@ -675,8 +686,8 @@
675
686
  minutesPerRow = Math.round(minutes.length / rows + 0.49); // always round up
676
687
 
677
688
  /*
678
- * The minutes table
679
- */
689
+ * The minutes table
690
+ */
680
691
  // if currently selected minute is not enabled, we have a problem and need to select a new minute.
681
692
  if (onMinuteShow &&
682
693
  (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours , inst.minutes]) == false) ) {
@@ -696,7 +707,7 @@
696
707
  minuteLabel +
697
708
  '</div>' +
698
709
  '<table class="ui-timepicker">';
699
-
710
+
700
711
  minuteCounter = 0;
701
712
  for (row = 1; row <= rows; row++) {
702
713
  html += '<tr>';
@@ -733,7 +744,7 @@
733
744
 
734
745
  var html = "";
735
746
  var enabled = true;
736
- var onHourShow = this._get(inst, 'onHourShow'); //custom callback
747
+ var onHourShow = this._get(inst, 'onHourShow'); //custom callback
737
748
 
738
749
  if (hour == undefined) {
739
750
  html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
@@ -741,7 +752,7 @@
741
752
  }
742
753
 
743
754
  if (onHourShow) {
744
- enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
755
+ enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
745
756
  }
746
757
 
747
758
  if (enabled) {
@@ -753,26 +764,26 @@
753
764
  '</a></td>';
754
765
  }
755
766
  else {
756
- html =
757
- '<td>' +
758
- '<span class="ui-state-default ui-state-disabled ' +
759
- (hour == inst.hours ? ' ui-state-active ' : ' ') +
760
- '">' +
761
- displayHour.toString() +
762
- '</span>' +
763
- '</td>';
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>';
764
775
  }
765
776
  return html;
766
777
  },
767
778
 
768
779
  /* Generate the content of a "Hour" cell */
769
780
  _generateHTMLMinuteCell: function (inst, minute, displayText) {
770
- var html = "";
781
+ var html = "";
771
782
  var enabled = true;
772
783
  var onMinuteShow = this._get(inst, 'onMinuteShow'); //custom callback
773
784
  if (onMinuteShow) {
774
- //NEW: 2011-02-03 we should give the hour as a parameter as well!
775
- enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]); //trigger callback
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
776
787
  }
777
788
 
778
789
  if (minute == undefined) {
@@ -781,32 +792,52 @@
781
792
  }
782
793
 
783
794
  if (enabled) {
784
- html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
785
- '<a class="ui-state-default ' +
786
- (minute == inst.minutes ? 'ui-state-active' : '') +
787
- '" >' +
788
- displayText +
789
- '</a></td>';
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>';
790
801
  }
791
802
  else {
792
803
 
793
- html = '<td>' +
794
- '<span class="ui-state-default ui-state-disabled" >' +
795
- displayText +
796
- '</span>' +
804
+ html = '<td>' +
805
+ '<span class="ui-state-default ui-state-disabled" >' +
806
+ displayText +
807
+ '</span>' +
797
808
  '</td>';
798
809
  }
799
810
  return html;
800
811
  },
801
812
 
802
813
 
814
+ /* Detach a timepicker from its control.
815
+ @param target element - the target input field or division or span */
816
+ _destroyTimepicker: function(target) {
817
+ var $target = $(target);
818
+ var inst = $.data(target, PROP_NAME);
819
+ if (!$target.hasClass(this.markerClassName)) {
820
+ return;
821
+ }
822
+ var nodeName = target.nodeName.toLowerCase();
823
+ $.removeData(target, PROP_NAME);
824
+ if (nodeName == 'input') {
825
+ inst.append.remove();
826
+ inst.trigger.remove();
827
+ $target.removeClass(this.markerClassName)
828
+ .unbind('focus.timepicker', this._showTimepicker)
829
+ .unbind('click.timepicker', this._adjustZIndex);
830
+ } else if (nodeName == 'div' || nodeName == 'span')
831
+ $target.removeClass(this.markerClassName).empty();
832
+ },
833
+
803
834
  /* Enable the date picker to a jQuery selection.
804
- @param target element - the target input field or division or span */
835
+ @param target element - the target input field or division or span */
805
836
  _enableTimepicker: function(target) {
806
837
  var $target = $(target),
807
838
  target_id = $target.attr('id'),
808
839
  inst = $.data(target, PROP_NAME);
809
-
840
+
810
841
  if (!$target.hasClass(this.markerClassName)) {
811
842
  return;
812
843
  }
@@ -830,7 +861,7 @@
830
861
  },
831
862
 
832
863
  /* Disable the time picker to a jQuery selection.
833
- @param target element - the target input field or division or span */
864
+ @param target element - the target input field or division or span */
834
865
  _disableTimepicker: function(target) {
835
866
  var $target = $(target);
836
867
  var inst = $.data(target, PROP_NAME);
@@ -862,8 +893,8 @@
862
893
  },
863
894
 
864
895
  /* Is the first field in a jQuery collection disabled as a timepicker?
865
- @param target_id element - the target input field or division or span
866
- @return boolean - true if disabled, false if enabled */
896
+ @param target_id element - the target input field or division or span
897
+ @return boolean - true if disabled, false if enabled */
867
898
  _isDisabledTimepicker: function (target_id) {
868
899
  if ( ! target_id) { return false; }
869
900
  for (var i = 0; i < this._disabledInputs.length; i++) {
@@ -887,9 +918,9 @@
887
918
 
888
919
  // now check if datepicker is showing outside window viewport - move to a better place if so.
889
920
  offset.left -= Math.min(offset.left, (offset.left + tpWidth > viewWidth && viewWidth > tpWidth) ?
890
- Math.abs(offset.left + tpWidth - viewWidth) : 0);
921
+ Math.abs(offset.left + tpWidth - viewWidth) : 0);
891
922
  offset.top -= Math.min(offset.top, (offset.top + tpHeight > viewHeight && viewHeight > tpHeight) ?
892
- Math.abs(tpHeight + inputHeight) : 0);
923
+ Math.abs(tpHeight + inputHeight) : 0);
893
924
 
894
925
  return offset;
895
926
  },
@@ -906,14 +937,14 @@
906
937
  },
907
938
 
908
939
  /* Retrieve the size of left and top borders for an element.
909
- @param elem (jQuery object) the element of interest
910
- @return (number[2]) the left and top borders */
940
+ @param elem (jQuery object) the element of interest
941
+ @return (number[2]) the left and top borders */
911
942
  _getBorders: function (elem) {
912
943
  var convert = function (value) {
913
944
  return { thin: 1, medium: 2, thick: 3}[value] || value;
914
945
  };
915
946
  return [parseFloat(convert(elem.css('border-left-width'))),
916
- parseFloat(convert(elem.css('border-top-width')))];
947
+ parseFloat(convert(elem.css('border-top-width')))];
917
948
  },
918
949
 
919
950
 
@@ -922,15 +953,15 @@
922
953
  if (!$.timepicker._curInst) { return; }
923
954
  var $target = $(event.target);
924
955
  if ($target[0].id != $.timepicker._mainDivId &&
925
- $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
926
- !$target.hasClass($.timepicker.markerClassName) &&
927
- !$target.hasClass($.timepicker._triggerClass) &&
928
- $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
956
+ $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
957
+ !$target.hasClass($.timepicker.markerClassName) &&
958
+ !$target.hasClass($.timepicker._triggerClass) &&
959
+ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
929
960
  $.timepicker._hideTimepicker();
930
961
  },
931
962
 
932
963
  /* Hide the time picker from view.
933
- @param input element - the input field attached to the time picker */
964
+ @param input element - the input field attached to the time picker */
934
965
  _hideTimepicker: function (input) {
935
966
  var inst = this._curInst;
936
967
  if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
@@ -946,16 +977,12 @@
946
977
  }
947
978
  else {
948
979
  inst.tpDiv[(showAnim == 'slideDown' ? 'slideUp' :
949
- (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
980
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
950
981
  }
951
982
  if (!showAnim) { postProcess(); }
952
- var onClose = this._get(inst, 'onClose');
953
- if (onClose) {
954
- onClose.apply(
955
- (inst.input ? inst.input[0] : null),
956
- [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
957
- }
983
+
958
984
  this._timepickerShowing = false;
985
+
959
986
  this._lastInput = null;
960
987
  if (this._inDialog) {
961
988
  this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
@@ -965,6 +992,14 @@
965
992
  }
966
993
  }
967
994
  this._inDialog = false;
995
+
996
+ var onClose = this._get(inst, 'onClose');
997
+ if (onClose) {
998
+ onClose.apply(
999
+ (inst.input ? inst.input[0] : null),
1000
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
1001
+ }
1002
+
968
1003
  }
969
1004
  },
970
1005
 
@@ -976,9 +1011,9 @@
976
1011
  },
977
1012
 
978
1013
  /* Retrieve the instance data for the target control.
979
- @param target element - the target input field or division or span
980
- @return object - the associated instance data
981
- @throws error if a jQuery problem getting data */
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 */
982
1017
  _getInst: function (target) {
983
1018
  try {
984
1019
  return $.data(target, PROP_NAME);
@@ -991,7 +1026,7 @@
991
1026
  /* Get a setting value, defaulting if necessary. */
992
1027
  _get: function (inst, name) {
993
1028
  return inst.settings[name] !== undefined ?
994
- inst.settings[name] : this._defaults[name];
1029
+ inst.settings[name] : this._defaults[name];
995
1030
  },
996
1031
 
997
1032
  /* Parse existing time and initialise time picker. */
@@ -1022,13 +1057,13 @@
1022
1057
  },
1023
1058
 
1024
1059
  /* Update or retrieve the settings for an existing time picker.
1025
- @param target element - the target input field or division or span
1026
- @param name object - the new settings to update or
1027
- string - the name of the setting to change or retrieve,
1028
- when retrieving also 'all' for all instance settings or
1029
- 'defaults' for all global defaults
1030
- @param value any - the new value for the setting
1031
- (omit if above is an object or to retrieve a value) */
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) */
1032
1067
  _optionTimepicker: function(target, name, value) {
1033
1068
  var inst = this._getInst(target);
1034
1069
  if (arguments.length == 2 && typeof name == 'string') {
@@ -1052,26 +1087,31 @@
1052
1087
 
1053
1088
 
1054
1089
  /* Set the time for a jQuery selection.
1055
- @param target element - the target input field or division or span
1056
- @param time String - the new time */
1057
- _setTimeTimepicker: function(target, time) {
1058
- var inst = this._getInst(target);
1059
- if (inst) {
1060
- this._setTime(inst, time);
1061
- this._updateTimepicker(inst);
1062
- this._updateAlternate(inst, time);
1063
- }
1064
- },
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
+ },
1065
1100
 
1066
1101
  /* Set the time directly. */
1067
1102
  _setTime: function(inst, time, noChange) {
1068
1103
  var origHours = inst.hours;
1069
1104
  var origMinutes = inst.minutes;
1070
- var time = this.parseTime(inst, time);
1071
- inst.hours = time.hours;
1072
- inst.minutes = time.minutes;
1105
+ if (time instanceof Date) {
1106
+ inst.hours = time.getHours();
1107
+ inst.minutes = time.getMinutes();
1108
+ } else {
1109
+ var time = this.parseTime(inst, time);
1110
+ inst.hours = time.hours;
1111
+ inst.minutes = time.minutes;
1112
+ }
1073
1113
 
1074
- if ((origHours != inst.hours || origMinutes != inst.minuts) && !noChange) {
1114
+ if ((origHours != inst.hours || origMinutes != inst.minutes) && !noChange) {
1075
1115
  inst.input.trigger('change');
1076
1116
  }
1077
1117
  this._updateTimepicker(inst);
@@ -1089,12 +1129,15 @@
1089
1129
  },
1090
1130
 
1091
1131
  /*
1092
- * Parse a time string into hours and minutes
1093
- */
1132
+ * Parse a time string into hours and minutes
1133
+ */
1094
1134
  parseTime: function (inst, timeVal) {
1095
1135
  var retVal = new Object();
1096
1136
  retVal.hours = -1;
1097
1137
  retVal.minutes = -1;
1138
+
1139
+ if(!timeVal)
1140
+ return '';
1098
1141
 
1099
1142
  var timeSeparator = this._get(inst, 'timeSeparator'),
1100
1143
  amPmText = this._get(inst, 'amPmText'),
@@ -1128,16 +1171,14 @@
1128
1171
  retVal.hours = 0;
1129
1172
  }
1130
1173
  }
1131
-
1174
+
1132
1175
  return retVal;
1133
1176
  },
1134
1177
 
1135
- selectNow: function(e) {
1136
-
1137
- var id = $(e.target).attr("data-timepicker-instance-id"),
1178
+ selectNow: function(event) {
1179
+ var id = $(event.target).attr("data-timepicker-instance-id"),
1138
1180
  $target = $(id),
1139
1181
  inst = this._getInst($target[0]);
1140
-
1141
1182
  //if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
1142
1183
  var currentTime = new Date();
1143
1184
  inst.hours = currentTime.getHours();
@@ -1147,8 +1188,8 @@
1147
1188
  this._hideTimepicker();
1148
1189
  },
1149
1190
 
1150
- deselectTime: function(e) {
1151
- var id = $(e.target).attr("data-timepicker-instance-id"),
1191
+ deselectTime: function(event) {
1192
+ var id = $(event.target).attr("data-timepicker-instance-id"),
1152
1193
  $target = $(id),
1153
1194
  inst = this._getInst($target[0]);
1154
1195
  inst.hours = -1;
@@ -1231,7 +1272,7 @@
1231
1272
  this._updateAlternate(inst, newTime);
1232
1273
  return newTime;
1233
1274
  },
1234
-
1275
+
1235
1276
  /* this function process selected time and return it parsed according to instance options */
1236
1277
  _getParsedTime: function(inst) {
1237
1278
 
@@ -1239,8 +1280,10 @@
1239
1280
  return '';
1240
1281
  }
1241
1282
 
1242
- if ((inst.hours < 0) || (inst.hours > 23)) { inst.hours = 12; }
1243
- if ((inst.minutes < 0) || (inst.minutes > 59)) { inst.minutes = 0; }
1283
+ // default to 0 AM if hours is not valid
1284
+ if ((inst.hours < inst.hours.starts) || (inst.hours > inst.hours.ends )) { inst.hours = 0; }
1285
+ // default to 0 minutes if minute is not valid
1286
+ if ((inst.minutes < inst.minutes.starts) || (inst.minutes > inst.minutes.ends)) { inst.minutes = 0; }
1244
1287
 
1245
1288
  var period = "",
1246
1289
  showPeriod = (this._get(inst, 'showPeriod') == true),
@@ -1254,6 +1297,10 @@
1254
1297
  displayHours = selectedHours ? selectedHours : 0,
1255
1298
  parsedTime = '';
1256
1299
 
1300
+ // fix some display problem when hours or minutes are not selected yet
1301
+ if (displayHours == -1) { displayHours = 0 }
1302
+ if (selectedMinutes == -1) { selectedMinutes = 0 }
1303
+
1257
1304
  if (showPeriod) {
1258
1305
  if (inst.hours == 0) {
1259
1306
  displayHours = 12;
@@ -1287,10 +1334,10 @@
1287
1334
  if (showHours) {
1288
1335
  if (period.length > 0) { parsedTime += this._get(inst, 'periodSeparator') + period; }
1289
1336
  }
1290
-
1337
+
1291
1338
  return parsedTime;
1292
1339
  },
1293
-
1340
+
1294
1341
  /* Update any alternate field to synchronise with the main field. */
1295
1342
  _updateAlternate: function(inst, newTime) {
1296
1343
  var altField = this._get(inst, 'altField');
@@ -1301,6 +1348,19 @@
1301
1348
  }
1302
1349
  },
1303
1350
 
1351
+ _getTimeAsDateTimepicker: function(input) {
1352
+ var inst = this._getInst(input);
1353
+ if (inst.hours == -1 && inst.minutes == -1) {
1354
+ return '';
1355
+ }
1356
+
1357
+ // default to 0 AM if hours is not valid
1358
+ if ((inst.hours < inst.hours.starts) || (inst.hours > inst.hours.ends )) { inst.hours = 0; }
1359
+ // default to 0 minutes if minute is not valid
1360
+ if ((inst.minutes < inst.minutes.starts) || (inst.minutes > inst.minutes.ends)) { inst.minutes = 0; }
1361
+
1362
+ return new Date(0, 0, 0, inst.hours, inst.minutes, 0);
1363
+ },
1304
1364
  /* This might look unused but it's called by the $.fn.timepicker function with param getTime */
1305
1365
  /* added v 0.2.3 - gitHub issue #5 - Thanks edanuff */
1306
1366
  _getTimeTimepicker : function(input) {
@@ -1323,30 +1383,32 @@
1323
1383
 
1324
1384
 
1325
1385
  /* Invoke the timepicker functionality.
1326
- @param options string - a command, optionally followed by additional parameters or
1327
- Object - settings for attaching new timepicker functionality
1328
- @return jQuery object */
1386
+ @param options string - a command, optionally followed by additional parameters or
1387
+ Object - settings for attaching new timepicker functionality
1388
+ @return jQuery object */
1329
1389
  $.fn.timepicker = function (options) {
1330
1390
 
1331
1391
  /* Initialise the time picker. */
1332
1392
  if (!$.timepicker.initialized) {
1333
1393
  $(document).mousedown($.timepicker._checkExternalClick).
1334
- find('body').append($.timepicker.tpDiv);
1394
+ find('body').append($.timepicker.tpDiv);
1335
1395
  $.timepicker.initialized = true;
1336
1396
  }
1337
1397
 
1398
+
1399
+
1338
1400
  var otherArgs = Array.prototype.slice.call(arguments, 1);
1339
- if (typeof options == 'string' && (options == 'getTime' || options == 'getHour' || options == 'getMinute' ))
1401
+ if (typeof options == 'string' && (options == 'getTime' || options == 'getTimeAsDate' || options == 'getHour' || options == 'getMinute' ))
1340
1402
  return $.timepicker['_' + options + 'Timepicker'].
1341
- apply($.timepicker, [this[0]].concat(otherArgs));
1403
+ apply($.timepicker, [this[0]].concat(otherArgs));
1342
1404
  if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
1343
1405
  return $.timepicker['_' + options + 'Timepicker'].
1344
1406
  apply($.timepicker, [this[0]].concat(otherArgs));
1345
1407
  return this.each(function () {
1346
1408
  typeof options == 'string' ?
1347
- $.timepicker['_' + options + 'Timepicker'].
1348
- apply($.timepicker, [this].concat(otherArgs)) :
1349
- $.timepicker._attachTimepicker(this, options);
1409
+ $.timepicker['_' + options + 'Timepicker'].
1410
+ apply($.timepicker, [this].concat(otherArgs)) :
1411
+ $.timepicker._attachTimepicker(this, options);
1350
1412
  });
1351
1413
  };
1352
1414
 
@@ -1362,10 +1424,10 @@
1362
1424
  $.timepicker = new Timepicker(); // singleton instance
1363
1425
  $.timepicker.initialized = false;
1364
1426
  $.timepicker.uuid = new Date().getTime();
1365
- $.timepicker.version = "0.2.9";
1427
+ $.timepicker.version = "0.3.1";
1366
1428
 
1367
1429
  // Workaround for #4055
1368
1430
  // Add another global to avoid noConflict issues with inline event handlers
1369
1431
  window['TP_jQuery_' + tpuuid] = $;
1370
1432
 
1371
- })(jQuery);
1433
+ })(jQuery);