Date and Time Picker Field - Version 2.0.0.beta

Version Description

  • Total rewrite, based on the acf-field-type-template. Works with ACF v3 and ACF v4. In this beta you can only add the Date Time Picker field as a plugin (i.e. not as a template field).
Download this release

Release Info

Developer PerS
Plugin Icon 128x128 Date and Time Picker Field
Version 2.0.0.beta
Comparing to
See all releases

Version 2.0.0.beta

Files changed (61) hide show
  1. acf-date_time_picker.php +74 -0
  2. css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  3. css/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  4. css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  5. css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  6. css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  7. css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  8. css/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  9. css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  10. css/images/ui-icons_222222_256x240.png +0 -0
  11. css/images/ui-icons_2e83ff_256x240.png +0 -0
  12. css/images/ui-icons_454545_256x240.png +0 -0
  13. css/images/ui-icons_888888_256x240.png +0 -0
  14. css/images/ui-icons_cd0a0a_256x240.png +0 -0
  15. css/input.css +0 -0
  16. css/jquery-ui-timepicker-addon.css +10 -0
  17. css/jquery-ui.css +489 -0
  18. css/timepicker.css +7 -0
  19. date_time_picker-v3.php +281 -0
  20. date_time_picker-v4.php +287 -0
  21. js/input.js +30 -0
  22. js/jquery-ui-sliderAccess.js +89 -0
  23. js/jquery-ui-timepicker-addon.js +1919 -0
  24. js/localization/jquery-ui-timepicker-af.js +20 -0
  25. js/localization/jquery-ui-timepicker-bg.js +20 -0
  26. js/localization/jquery-ui-timepicker-ca.js +20 -0
  27. js/localization/jquery-ui-timepicker-cs.js +20 -0
  28. js/localization/jquery-ui-timepicker-de.js +20 -0
  29. js/localization/jquery-ui-timepicker-el.js +20 -0
  30. js/localization/jquery-ui-timepicker-es.js +20 -0
  31. js/localization/jquery-ui-timepicker-et.js +20 -0
  32. js/localization/jquery-ui-timepicker-eu.js +20 -0
  33. js/localization/jquery-ui-timepicker-fi.js +20 -0
  34. js/localization/jquery-ui-timepicker-fr.js +20 -0
  35. js/localization/jquery-ui-timepicker-gl.js +20 -0
  36. js/localization/jquery-ui-timepicker-he.js +20 -0
  37. js/localization/jquery-ui-timepicker-hu.js +20 -0
  38. js/localization/jquery-ui-timepicker-id.js +20 -0
  39. js/localization/jquery-ui-timepicker-it.js +20 -0
  40. js/localization/jquery-ui-timepicker-ja.js +20 -0
  41. js/localization/jquery-ui-timepicker-ko.js +20 -0
  42. js/localization/jquery-ui-timepicker-lt.js +20 -0
  43. js/localization/jquery-ui-timepicker-nl.js +20 -0
  44. js/localization/jquery-ui-timepicker-no.js +20 -0
  45. js/localization/jquery-ui-timepicker-pl.js +20 -0
  46. js/localization/jquery-ui-timepicker-pt-BR.js +20 -0
  47. js/localization/jquery-ui-timepicker-pt.js +20 -0
  48. js/localization/jquery-ui-timepicker-ro.js +20 -0
  49. js/localization/jquery-ui-timepicker-ru.js +20 -0
  50. js/localization/jquery-ui-timepicker-sk.js +20 -0
  51. js/localization/jquery-ui-timepicker-sv.js +20 -0
  52. js/localization/jquery-ui-timepicker-th.js +17 -0
  53. js/localization/jquery-ui-timepicker-tr.js +20 -0
  54. js/localization/jquery-ui-timepicker-uk.js +20 -0
  55. js/localization/jquery-ui-timepicker-vi.js +20 -0
  56. js/localization/jquery-ui-timepicker-zh-CN.js +20 -0
  57. js/localization/jquery-ui-timepicker-zh-TW.js +20 -0
  58. js/timepicker-localization.js +22 -0
  59. js/timepicker.js +27 -0
  60. lang/acf-date_time_picker.po +159 -0
  61. readme.txt +59 -0
acf-date_time_picker.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: Advanced Custom Fields: date_time_picker
4
+ Plugin URI: https://github.com/soderlind/acf-field-date-time-picker
5
+ Description: Date and Time Picker field for Advanced Custom Fields
6
+ Version: 2.0.0.beta
7
+ Author: Per Soderlind
8
+ Author URI: http://soderlind.no
9
+ License: GPLv2 or later
10
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
+ */
12
+
13
+
14
+ class acf_field_date_time_picker_plugin
15
+ {
16
+ /*
17
+ * Construct
18
+ *
19
+ * @description:
20
+ * @since: 3.6
21
+ * @created: 1/04/13
22
+ */
23
+
24
+ function __construct()
25
+ {
26
+ // set text domain
27
+ $domain = 'acf-date_time_picker';
28
+ $mofile = trailingslashit(dirname(__File__)) . 'lang/' . $domain . '-' . get_locale() . '.mo';
29
+ load_textdomain( $domain, $mofile );
30
+
31
+
32
+ // version 4+
33
+ add_action('acf/register_fields', array($this, 'register_fields'));
34
+
35
+
36
+ // version 3-
37
+ add_action( 'init', array( $this, 'init' ));
38
+ }
39
+
40
+
41
+ /*
42
+ * Init
43
+ *
44
+ * @description:
45
+ * @since: 3.6
46
+ * @created: 1/04/13
47
+ */
48
+
49
+ function init()
50
+ {
51
+ if(function_exists('register_field'))
52
+ {
53
+ register_field('acf_field_date_time_picker', dirname(__File__) . '/date_time_picker-v3.php');
54
+ }
55
+ }
56
+
57
+ /*
58
+ * register_fields
59
+ *
60
+ * @description:
61
+ * @since: 3.6
62
+ * @created: 1/04/13
63
+ */
64
+
65
+ function register_fields()
66
+ {
67
+ include_once('date_time_picker-v4.php');
68
+ }
69
+
70
+ }
71
+
72
+ new acf_field_date_time_picker_plugin();
73
+
74
+ ?>
css/images/ui-bg_flat_0_aaaaaa_40x100.png ADDED
Binary file
css/images/ui-bg_flat_75_ffffff_40x100.png ADDED
Binary file
css/images/ui-bg_glass_55_fbf9ee_1x400.png ADDED
Binary file
css/images/ui-bg_glass_65_ffffff_1x400.png ADDED
Binary file
css/images/ui-bg_glass_75_dadada_1x400.png ADDED
Binary file
css/images/ui-bg_glass_75_e6e6e6_1x400.png ADDED
Binary file
css/images/ui-bg_glass_95_fef1ec_1x400.png ADDED
Binary file
css/images/ui-bg_highlight-soft_75_cccccc_1x100.png ADDED
Binary file
css/images/ui-icons_222222_256x240.png ADDED
Binary file
css/images/ui-icons_2e83ff_256x240.png ADDED
Binary file
css/images/ui-icons_454545_256x240.png ADDED
Binary file
css/images/ui-icons_888888_256x240.png ADDED
Binary file
css/images/ui-icons_cd0a0a_256x240.png ADDED
Binary file
css/input.css ADDED
File without changes
css/jquery-ui-timepicker-addon.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
2
+ .ui-timepicker-div dl { text-align: left; }
3
+ .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
4
+ .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
5
+ .ui-timepicker-div td { font-size: 90%; }
6
+ .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
7
+
8
+ .ui-timepicker-rtl{ direction: rtl; }
9
+ .ui-timepicker-rtl dl { text-align: right; }
10
+ .ui-timepicker-rtl dl dd { margin: 0 65px 10px 10px; }
css/jquery-ui.css ADDED
@@ -0,0 +1,489 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jQuery UI CSS Framework
3
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
4
+ * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
5
+ */
6
+
7
+ /* Layout helpers
8
+ ----------------------------------*/
9
+ .ui-helper-hidden { display: none; }
10
+ .ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
11
+ .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
12
+ .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
13
+ .ui-helper-clearfix { display: inline-block; }
14
+ /* required comment for clearfix to work in Opera \*/
15
+ * html .ui-helper-clearfix { height:1%; }
16
+ .ui-helper-clearfix { display:block; }
17
+ /* end clearfix */
18
+ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
19
+
20
+
21
+ /* Interaction Cues
22
+ ----------------------------------*/
23
+ .ui-state-disabled { cursor: default !important; }
24
+
25
+
26
+ /* Icons
27
+ ----------------------------------*/
28
+
29
+ /* states and images */
30
+ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
31
+
32
+
33
+ /* Misc visuals
34
+ ----------------------------------*/
35
+
36
+ /* Overlays */
37
+ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
38
+
39
+
40
+ /*
41
+ * jQuery UI CSS Framework
42
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
43
+ * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
44
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
45
+ */
46
+
47
+
48
+ /* Component containers
49
+ ----------------------------------*/
50
+ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
51
+ .ui-widget .ui-widget { font-size: 1em; }
52
+ .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
53
+ .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
54
+ .ui-widget-content a { color: #222222; }
55
+ .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
56
+ .ui-widget-header a { color: #222222; }
57
+
58
+ /* Interaction states
59
+ ----------------------------------*/
60
+ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
61
+ .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
62
+ .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
63
+ .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
64
+ .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
65
+ .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
66
+ .ui-widget :active { outline: none; }
67
+
68
+ /* Interaction Cues
69
+ ----------------------------------*/
70
+ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
71
+ .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
72
+ .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
73
+ .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
74
+ .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
75
+ .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
76
+ .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
77
+ .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
78
+
79
+ /* Icons
80
+ ----------------------------------*/
81
+
82
+ /* states and images */
83
+ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
84
+ .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
85
+ .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
86
+ .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
87
+ .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
88
+ .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
89
+ .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
90
+ .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
91
+
92
+ /* positioning */
93
+ .ui-icon-carat-1-n { background-position: 0 0; }
94
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
95
+ .ui-icon-carat-1-e { background-position: -32px 0; }
96
+ .ui-icon-carat-1-se { background-position: -48px 0; }
97
+ .ui-icon-carat-1-s { background-position: -64px 0; }
98
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
99
+ .ui-icon-carat-1-w { background-position: -96px 0; }
100
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
101
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
102
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
103
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
104
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
105
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
106
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
107
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
108
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
109
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
110
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
111
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
112
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
113
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
114
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
115
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
116
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
117
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
118
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
119
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
120
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
121
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
122
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
123
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
124
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
125
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
126
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
127
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
128
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
129
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
130
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
131
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
132
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
133
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
134
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
135
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
136
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
137
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
138
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
139
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
140
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
141
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
142
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
143
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
144
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
145
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
146
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
147
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
148
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
149
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
150
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
151
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
152
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
153
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
154
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
155
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
156
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
157
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
158
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
159
+ .ui-icon-extlink { background-position: -32px -80px; }
160
+ .ui-icon-newwin { background-position: -48px -80px; }
161
+ .ui-icon-refresh { background-position: -64px -80px; }
162
+ .ui-icon-shuffle { background-position: -80px -80px; }
163
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
164
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
165
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
166
+ .ui-icon-folder-open { background-position: -16px -96px; }
167
+ .ui-icon-document { background-position: -32px -96px; }
168
+ .ui-icon-document-b { background-position: -48px -96px; }
169
+ .ui-icon-note { background-position: -64px -96px; }
170
+ .ui-icon-mail-closed { background-position: -80px -96px; }
171
+ .ui-icon-mail-open { background-position: -96px -96px; }
172
+ .ui-icon-suitcase { background-position: -112px -96px; }
173
+ .ui-icon-comment { background-position: -128px -96px; }
174
+ .ui-icon-person { background-position: -144px -96px; }
175
+ .ui-icon-print { background-position: -160px -96px; }
176
+ .ui-icon-trash { background-position: -176px -96px; }
177
+ .ui-icon-locked { background-position: -192px -96px; }
178
+ .ui-icon-unlocked { background-position: -208px -96px; }
179
+ .ui-icon-bookmark { background-position: -224px -96px; }
180
+ .ui-icon-tag { background-position: -240px -96px; }
181
+ .ui-icon-home { background-position: 0 -112px; }
182
+ .ui-icon-flag { background-position: -16px -112px; }
183
+ .ui-icon-calendar { background-position: -32px -112px; }
184
+ .ui-icon-cart { background-position: -48px -112px; }
185
+ .ui-icon-pencil { background-position: -64px -112px; }
186
+ .ui-icon-clock { background-position: -80px -112px; }
187
+ .ui-icon-disk { background-position: -96px -112px; }
188
+ .ui-icon-calculator { background-position: -112px -112px; }
189
+ .ui-icon-zoomin { background-position: -128px -112px; }
190
+ .ui-icon-zoomout { background-position: -144px -112px; }
191
+ .ui-icon-search { background-position: -160px -112px; }
192
+ .ui-icon-wrench { background-position: -176px -112px; }
193
+ .ui-icon-gear { background-position: -192px -112px; }
194
+ .ui-icon-heart { background-position: -208px -112px; }
195
+ .ui-icon-star { background-position: -224px -112px; }
196
+ .ui-icon-link { background-position: -240px -112px; }
197
+ .ui-icon-cancel { background-position: 0 -128px; }
198
+ .ui-icon-plus { background-position: -16px -128px; }
199
+ .ui-icon-plusthick { background-position: -32px -128px; }
200
+ .ui-icon-minus { background-position: -48px -128px; }
201
+ .ui-icon-minusthick { background-position: -64px -128px; }
202
+ .ui-icon-close { background-position: -80px -128px; }
203
+ .ui-icon-closethick { background-position: -96px -128px; }
204
+ .ui-icon-key { background-position: -112px -128px; }
205
+ .ui-icon-lightbulb { background-position: -128px -128px; }
206
+ .ui-icon-scissors { background-position: -144px -128px; }
207
+ .ui-icon-clipboard { background-position: -160px -128px; }
208
+ .ui-icon-copy { background-position: -176px -128px; }
209
+ .ui-icon-contact { background-position: -192px -128px; }
210
+ .ui-icon-image { background-position: -208px -128px; }
211
+ .ui-icon-video { background-position: -224px -128px; }
212
+ .ui-icon-script { background-position: -240px -128px; }
213
+ .ui-icon-alert { background-position: 0 -144px; }
214
+ .ui-icon-info { background-position: -16px -144px; }
215
+ .ui-icon-notice { background-position: -32px -144px; }
216
+ .ui-icon-help { background-position: -48px -144px; }
217
+ .ui-icon-check { background-position: -64px -144px; }
218
+ .ui-icon-bullet { background-position: -80px -144px; }
219
+ .ui-icon-radio-off { background-position: -96px -144px; }
220
+ .ui-icon-radio-on { background-position: -112px -144px; }
221
+ .ui-icon-pin-w { background-position: -128px -144px; }
222
+ .ui-icon-pin-s { background-position: -144px -144px; }
223
+ .ui-icon-play { background-position: 0 -160px; }
224
+ .ui-icon-pause { background-position: -16px -160px; }
225
+ .ui-icon-seek-next { background-position: -32px -160px; }
226
+ .ui-icon-seek-prev { background-position: -48px -160px; }
227
+ .ui-icon-seek-end { background-position: -64px -160px; }
228
+ .ui-icon-seek-start { background-position: -80px -160px; }
229
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
230
+ .ui-icon-seek-first { background-position: -80px -160px; }
231
+ .ui-icon-stop { background-position: -96px -160px; }
232
+ .ui-icon-eject { background-position: -112px -160px; }
233
+ .ui-icon-volume-off { background-position: -128px -160px; }
234
+ .ui-icon-volume-on { background-position: -144px -160px; }
235
+ .ui-icon-power { background-position: 0 -176px; }
236
+ .ui-icon-signal-diag { background-position: -16px -176px; }
237
+ .ui-icon-signal { background-position: -32px -176px; }
238
+ .ui-icon-battery-0 { background-position: -48px -176px; }
239
+ .ui-icon-battery-1 { background-position: -64px -176px; }
240
+ .ui-icon-battery-2 { background-position: -80px -176px; }
241
+ .ui-icon-battery-3 { background-position: -96px -176px; }
242
+ .ui-icon-circle-plus { background-position: 0 -192px; }
243
+ .ui-icon-circle-minus { background-position: -16px -192px; }
244
+ .ui-icon-circle-close { background-position: -32px -192px; }
245
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
246
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
247
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
248
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
249
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
250
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
251
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
252
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
253
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
254
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
255
+ .ui-icon-circle-check { background-position: -208px -192px; }
256
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
257
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
258
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
259
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
260
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
261
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
262
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
263
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
264
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
265
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
266
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
267
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
268
+
269
+
270
+ /* Misc visuals
271
+ ----------------------------------*/
272
+
273
+ /* Corner radius */
274
+ .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
275
+ .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
276
+ .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
277
+ .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
278
+ .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
279
+ .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
280
+ .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
281
+ .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
282
+ .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
283
+
284
+ /* Overlays */
285
+ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
286
+ .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable
287
+ ----------------------------------*/
288
+ .ui-resizable { position: relative;}
289
+ .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
290
+ .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
291
+ .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
292
+ .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
293
+ .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
294
+ .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
295
+ .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
296
+ .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
297
+ .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
298
+ .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable
299
+ ----------------------------------*/
300
+ .ui-selectable-helper { border:1px dotted black }
301
+ /* Accordion
302
+ ----------------------------------*/
303
+ .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
304
+ .ui-accordion .ui-accordion-li-fix { display: inline; }
305
+ .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
306
+ .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
307
+ /* IE7-/Win - Fix extra vertical space in lists */
308
+ .ui-accordion a { zoom: 1; }
309
+ .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
310
+ .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
311
+ .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
312
+ .ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete
313
+ ----------------------------------*/
314
+ .ui-autocomplete { position: absolute; cursor: default; }
315
+ .ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
316
+
317
+ /* workarounds */
318
+ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
319
+
320
+ /* Menu
321
+ ----------------------------------*/
322
+ .ui-menu {
323
+ list-style:none;
324
+ padding: 2px;
325
+ margin: 0;
326
+ display:block;
327
+ }
328
+ .ui-menu .ui-menu {
329
+ margin-top: -3px;
330
+ }
331
+ .ui-menu .ui-menu-item {
332
+ margin:0;
333
+ padding: 0;
334
+ zoom: 1;
335
+ float: left;
336
+ clear: left;
337
+ width: 100%;
338
+ }
339
+ .ui-menu .ui-menu-item a {
340
+ text-decoration:none;
341
+ display:block;
342
+ padding:.2em .4em;
343
+ line-height:1.5;
344
+ zoom:1;
345
+ }
346
+ .ui-menu .ui-menu-item a.ui-state-hover,
347
+ .ui-menu .ui-menu-item a.ui-state-active {
348
+ font-weight: normal;
349
+ margin: -1px;
350
+ }
351
+ /* Button
352
+ ----------------------------------*/
353
+
354
+ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
355
+ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
356
+ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
357
+ .ui-button-icons-only { width: 3.4em; }
358
+ button.ui-button-icons-only { width: 3.7em; }
359
+
360
+ /*button text element */
361
+ .ui-button .ui-button-text { display: block; line-height: 1.4; }
362
+ .ui-button-text-only .ui-button-text { padding: .4em 1em; }
363
+ .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
364
+ .ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
365
+ .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
366
+ /* no icon support for input elements, provide padding by default */
367
+ input.ui-button { padding: .4em 1em; }
368
+
369
+ /*button icon element(s) */
370
+ .ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
371
+ .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
372
+ .ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
373
+ .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
374
+
375
+ /*button sets*/
376
+ .ui-buttonset { margin-right: 7px; }
377
+ .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
378
+
379
+ /* workarounds */
380
+ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
381
+
382
+
383
+
384
+
385
+
386
+ /* Dialog
387
+ ----------------------------------*/
388
+ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
389
+ .ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
390
+ .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
391
+ .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
392
+ .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
393
+ .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
394
+ .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
395
+ .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
396
+ .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
397
+ .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
398
+ .ui-draggable .ui-dialog-titlebar { cursor: move; }
399
+ /* Slider
400
+ ----------------------------------*/
401
+ .ui-slider { position: relative; text-align: left; }
402
+ .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
403
+ .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
404
+
405
+ .ui-slider-horizontal { height: .8em; }
406
+ .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
407
+ .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
408
+ .ui-slider-horizontal .ui-slider-range-min { left: 0; }
409
+ .ui-slider-horizontal .ui-slider-range-max { right: 0; }
410
+
411
+ .ui-slider-vertical { width: .8em; height: 100px; }
412
+ .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
413
+ .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
414
+ .ui-slider-vertical .ui-slider-range-min { bottom: 0; }
415
+ .ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
416
+ ----------------------------------*/
417
+ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
418
+ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
419
+ .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
420
+ .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
421
+ .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
422
+ .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
423
+ .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
424
+ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
425
+ .ui-tabs .ui-tabs-hide { display: none !important; }
426
+ /* Datepicker
427
+ ----------------------------------*/
428
+ .ui-datepicker { width: 17em; padding: .2em .2em 0; }
429
+ .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
430
+ .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
431
+ .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
432
+ .ui-datepicker .ui-datepicker-prev { left:2px; }
433
+ .ui-datepicker .ui-datepicker-next { right:2px; }
434
+ .ui-datepicker .ui-datepicker-prev-hover { left:1px; }
435
+ .ui-datepicker .ui-datepicker-next-hover { right:1px; }
436
+ .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
437
+ .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
438
+ .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
439
+ .ui-datepicker select.ui-datepicker-month-year {width: 100%;}
440
+ .ui-datepicker select.ui-datepicker-month,
441
+ .ui-datepicker select.ui-datepicker-year { width: 49%;}
442
+ .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
443
+ .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
444
+ .ui-datepicker td { border: 0; padding: 1px; }
445
+ .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
446
+ .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
447
+ .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
448
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
449
+
450
+ /* with multiple calendars */
451
+ .ui-datepicker.ui-datepicker-multi { width:auto; }
452
+ .ui-datepicker-multi .ui-datepicker-group { float:left; }
453
+ .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
454
+ .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
455
+ .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
456
+ .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
457
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
458
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
459
+ .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
460
+ .ui-datepicker-row-break { clear:both; width:100%; }
461
+
462
+ /* RTL support */
463
+ .ui-datepicker-rtl { direction: rtl; }
464
+ .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
465
+ .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
466
+ .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
467
+ .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
468
+ .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
469
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
470
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
471
+ .ui-datepicker-rtl .ui-datepicker-group { float:right; }
472
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
473
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
474
+
475
+ /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
476
+ .ui-datepicker-cover {
477
+ display: none; /*sorry for IE5*/
478
+ display/**/: block; /*sorry for IE5*/
479
+ position: absolute; /*must have*/
480
+ z-index: -1; /*must have*/
481
+ filter: mask(); /*must have*/
482
+ top: -4px; /*must have*/
483
+ left: -4px; /*must have*/
484
+ width: 200px; /*must have*/
485
+ height: 200px; /*must have*/
486
+ }/* Progressbar
487
+ ----------------------------------*/
488
+ .ui-progressbar { height:2em; text-align: left; }
489
+ .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
css/timepicker.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /* css for timepicker */
2
+ .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
3
+ .ui-timepicker-div dl { text-align: left; }
4
+ .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
5
+ .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
6
+ .ui-timepicker-div td { font-size: 90%; }
7
+ .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
date_time_picker-v3.php ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class acf_field_date_time_picker extends acf_Field {
4
+
5
+ // vars
6
+ var $settings // will hold info such as dir / path
7
+ , $defaults // will hold default field options
8
+ , $domain; // holds the language domain
9
+
10
+
11
+ /*--------------------------------------------------------------------------------------
12
+ *
13
+ * Constructor
14
+ * - This function is called when the field class is initalized on each page.
15
+ * - Here you can add filters / actions and setup any other functionality for your field
16
+ *
17
+ * @author Elliot Condon
18
+ * @since 2.2.0
19
+ *
20
+ *-------------------------------------------------------------------------------------*/
21
+
22
+ function __construct( $parent ) {
23
+ // do not delete!
24
+ parent::__construct( $parent );
25
+
26
+ // set name / title
27
+ $this->name = 'date_time_picker';
28
+ $this->title = __( 'Date and Time Picker' );
29
+ $this->domain = 'acf-date_time_picker';
30
+ $this->defaults = array(
31
+ 'value' => ''
32
+ , 'label' => __( 'Choose Time', $this->domain )
33
+ , 'time_format' => 'hh:mm'
34
+ , 'show_date' => true
35
+ , 'date_format' => 'mm/dd/yy'
36
+ , 'show_week_number' => false
37
+ , 'picker' => 'slider'
38
+ );
39
+
40
+ $this->settings = array(
41
+ 'path' => plugin_dir_path( __FILE__)
42
+ , 'dir' => plugin_dir_url( __FILE__)
43
+ , 'version' => '2.0.0.beta'
44
+ );
45
+ }
46
+
47
+
48
+ /*--------------------------------------------------------------------------------------
49
+ *
50
+ * create_options
51
+ * - this function is called from core/field_meta_box.php to create extra options
52
+ * for your field
53
+ *
54
+ * @params
55
+ * - $key (int) - the $_POST obejct key required to save the options to the field
56
+ * - $field (array) - the field object
57
+ *
58
+ * @author Elliot Condon
59
+ * @since 2.2.0
60
+ *
61
+ *-------------------------------------------------------------------------------------*/
62
+
63
+ function create_options( $key, $field ) {
64
+
65
+
66
+ $field = array_merge( $this->defaults, $field );
67
+ ?>
68
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_choice">
69
+ <td class="label">
70
+ <label for=""><?php _e( "Date and Time Picker?", $this->domain ); ?></label>
71
+ </td>
72
+ <td>
73
+ <?php
74
+ $this->parent->create_field( array(
75
+ 'type' => 'radio'
76
+ , 'name' => 'fields['.$key.'][show_date]'
77
+ , 'value' => $field['show_date']
78
+ , 'layout' => 'horizontal'
79
+ , 'choices' => array(
80
+ 'true' => __( 'Date and Time Picker', $this->domain )
81
+ , 'false' => __( 'Time Picker', $this->domain )
82
+ )
83
+ ) );
84
+ ?>
85
+ </td>
86
+ </tr>
87
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_dateformat">
88
+ <td class="label">
89
+ <label><?php _e( "Date format", $this->domain ); ?></label>
90
+ <p class="description"><?php _e( "eg. mm/dd/yy. read more about", $this->domain ); ?> <a href="http://docs.jquery.com/UI/Datepicker/formatDate">formatDate</a></p>
91
+ </td>
92
+ <td>
93
+ <?php
94
+ $this->parent->create_field( array(
95
+ 'type' => 'text'
96
+ , 'name' => 'fields[' . $key . '][date_format]'
97
+ , 'value' => $field['date_format']
98
+ ) );
99
+ ?>
100
+ </td>
101
+ </tr>
102
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_timeformat">
103
+ <td class="label">
104
+ <label><?php _e( "Time Format", $this->domain );?></label>
105
+ <p class="description"><?php printf( __( "eg. hh:mm. read more about <a href=\"%s\" target=\"_blank\">formatting time</a>", $this->domain ), "http://trentrichardson.com/examples/timepicker/#tp-formatting" );?></p>
106
+ </td>
107
+ <td>
108
+ <?php
109
+ $this->parent->create_field( array(
110
+ 'type' => 'text'
111
+ , 'name' => 'fields[' . $key . '][time_format]'
112
+ , 'value' => $field['time_format']
113
+ ) );
114
+ ?>
115
+ </td>
116
+ </tr>
117
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_week_number">
118
+ <td class="label">
119
+ <label for=""><?php _e( "Display Week Number?", $this->domain ); ?></label>
120
+ </td>
121
+ <td>
122
+ <?php
123
+ $this->parent->create_field( array(
124
+ 'type' => 'radio'
125
+ , 'name' => 'fields['.$key.'][show_week_number]'
126
+ , 'value' => $field['show_week_number']
127
+ , 'layout' => 'horizontal'
128
+ , 'choices' => array(
129
+ 'true' => __( 'Yes', $this->domain )
130
+ , 'false' => __( 'No', $this->domain )
131
+ )
132
+ ) );
133
+ ?>
134
+ </td>
135
+ </tr>
136
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_week_number">
137
+ <td class="label">
138
+ <label for=""><?php _e( "Time Picker Style?", $this->domain ); ?></label>
139
+ </td>
140
+ <td>
141
+ <?php
142
+ $this->parent->create_field( array(
143
+ 'type' => 'radio'
144
+ , 'name' => 'fields['.$key.'][picker]'
145
+ , 'value' => $field['picker']
146
+ , 'layout' => 'horizontal'
147
+ , 'choices' => array(
148
+ 'slider' => __( 'Slider', $this->domain )
149
+ , 'select' => __( 'Select', $this->domain )
150
+ )
151
+ ) );
152
+ ?>
153
+ </td>
154
+ </tr>
155
+
156
+ <?php
157
+
158
+ }
159
+
160
+
161
+ /*--------------------------------------------------------------------------------------
162
+ *
163
+ * create_field
164
+ * - this function is called on edit screens to produce the html for this field
165
+ *
166
+ * @author Elliot Condon
167
+ * @since 2.2.0
168
+ *
169
+ *-------------------------------------------------------------------------------------*/
170
+
171
+ function create_field( $field ) {
172
+ $field = array_merge( $this->defaults, $field );
173
+ extract( $field, EXTR_SKIP ); //Declare each item in $field as its own variable i.e.: $name, $value, $label, $time_format, $date_format and $show_week_number
174
+
175
+ if ( $show_date != 'true' ) {
176
+ echo '<input type="text" name="' . $name . '" class="time_picker" value="' . $value . '" data-picker="' . $picker . '" data-time_format="' . $time_format . '" title="' . $label . '" />';
177
+ } else {
178
+ echo '<input type="text" name="' . $name . '" class="time_picker" value="' . $value . '" data-picker="' . $picker . '" data-date_format="' . $date_format . '" data-time_format="' . $time_format . '" data-show_week_number="' . $show_week_number . '" title="' . $label . '" />';
179
+ }
180
+ }
181
+
182
+
183
+ /*--------------------------------------------------------------------------------------
184
+ *
185
+ * admin_print_scripts / admin_print_styles
186
+ * - this function is called in the admin_print_scripts / admin_print_styles where
187
+ * your field is created. Use this function to register css and javascript to assist
188
+ * your create_field() function.
189
+ *
190
+ * @author Elliot Condon
191
+ * @since 3.0.0
192
+ *
193
+ *-------------------------------------------------------------------------------------*/
194
+
195
+ function admin_print_scripts() {
196
+ global $wp_locale;
197
+
198
+ $has_locale = false;
199
+ $js_locale = $this->get_js_locale(get_locale());
200
+ wp_enqueue_script( 'jquery-ui-timepicker', $this->settings['dir'] . 'js/jquery-ui-timepicker-addon.js', array(
201
+ 'jquery-ui-datepicker',
202
+ 'jquery-ui-slider'
203
+ ), $this->settings['version'], true );
204
+
205
+ if ( file_exists( dirname( __FILE__ ) . '/js/localization/jquery-ui-timepicker-' . $js_locale . '.js' ) ) {
206
+ wp_enqueue_script( 'timepicker-localization', $this->settings['dir'] . 'js/localization/jquery-ui-timepicker-' . $js_locale . '.js', array(
207
+ 'jquery-ui-timepicker'
208
+ ), $this->settings['version'], true );
209
+ wp_enqueue_script( 'timepicker', $this->settings['dir'] . 'js/timepicker.js', array(
210
+ 'timepicker-localization'
211
+ ), $this->settings['version'], true );
212
+ $has_locale = true;
213
+ } else {
214
+ wp_enqueue_script( 'timepicker', $this->settings['dir'] . 'js/timepicker.js', array(
215
+ 'jquery-ui-timepicker'
216
+ ), $this->settings['version'], true );
217
+ }
218
+
219
+ if ( ! $has_locale && $js_locale != 'en' ) {
220
+ $timepicker_locale = array(
221
+ 'closeText' => __( 'Done', $this->domain )
222
+ , 'currentText' => __( 'Today', $this->domain )
223
+ , 'prevText' => __( 'Prev', $this->domain )
224
+ , 'nextText' => __( 'Next', $this->domain )
225
+ , 'monthStatus' => __( 'Show a different month', $this->domain )
226
+ , 'weekHeader' => __( 'Wk', $this->domain )
227
+ , 'timeText' => __( "Time", $this->domain )
228
+ , 'hourText' => __( "Hour", $this->domain )
229
+ , 'minuteText' => __( "Minute", $this->domain )
230
+ , 'secondText' => __( "Second", $this->domain )
231
+ , 'millisecText' => __( "Millisecond", $this->domain )
232
+ , 'timezoneText' => __( "Time Zone", $this->domain )
233
+ , 'isRTL' => $wp_locale->is_rtl()
234
+ );
235
+ }
236
+ $timepicker_wp_locale = array(
237
+ 'monthNames' => $this->strip_array_indices( $wp_locale->month )
238
+ , 'monthNamesShort' => $this->strip_array_indices( $wp_locale->month_abbrev )
239
+ , 'dayNames' => $this->strip_array_indices( $wp_locale->weekday )
240
+ , 'dayNamesShort' => $this->strip_array_indices( $wp_locale->weekday_abbrev )
241
+ , 'dayNamesMin' => $this->strip_array_indices( $wp_locale->weekday_initial )
242
+ , 'showMonthAfterYear' => false
243
+ , 'showWeek' => false
244
+ , 'firstDay' => get_option( 'start_of_week' )
245
+ );
246
+
247
+ $l10n = ( isset( $timepicker_locale ) ) ? array_merge( $timepicker_wp_locale, $timepicker_locale ) : $timepicker_wp_locale;
248
+ wp_localize_script( 'timepicker', 'timepicker_objectL10n', $l10n );
249
+
250
+ }
251
+
252
+ /**
253
+ * helper function, see: http://www.renegadetechconsulting.com/tutorials/jquery-datepicker-and-wordpress-i18n
254
+ * @param array $ArrayToStrip
255
+ * @return array
256
+ */
257
+ function strip_array_indices( $ArrayToStrip ) {
258
+ foreach ( $ArrayToStrip as $objArrayItem ) {
259
+ $NewArray[] = $objArrayItem;
260
+ }
261
+
262
+ return $NewArray;
263
+ }
264
+
265
+ function get_js_locale($locale) {
266
+ $tmp_locale = ( '' == $locale ) ? 'en' : strtolower($locale);
267
+ if (strpos($tmp_locale,'_') !== false) {
268
+ return substr( $tmp_locale, 3, 2 );
269
+ } else {
270
+ return $tmp_locale;
271
+ }
272
+ }
273
+
274
+
275
+ function admin_print_styles() {
276
+ wp_enqueue_style( 'jquery-style', $this->settings['dir'] . 'css/jquery-ui.css' );
277
+ wp_enqueue_style( 'timepicker', $this->settings['dir'] . 'css/jquery-ui-timepicker-addon.css', array(
278
+ 'jquery-style'
279
+ ), $this->settings['version'] );
280
+ }
281
+ }
date_time_picker-v4.php ADDED
@@ -0,0 +1,287 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class acf_field_date_time_picker extends acf_field
4
+ {
5
+ // vars
6
+ var $settings // will hold info such as dir / path
7
+ , $defaults // will hold default field options
8
+ , $domain; // holds the language domain
9
+
10
+ /*
11
+ * __construct
12
+ *
13
+ * Set name / label needed for actions / filters
14
+ *
15
+ * @since 3.6
16
+ * @date 23/01/13
17
+ */
18
+
19
+ function __construct()
20
+ {
21
+ // vars
22
+ $this->name = 'date_time_picker';
23
+ $this->label = __('Date and Time Picker');
24
+ $this->category = __("jQuery", $this->domain); // Basic, Content, Choice, etc
25
+ $this->domain = 'acf-date_time_picker';
26
+ $this->defaults = array(
27
+ 'value' => ''
28
+ , 'label' => __( 'Choose Time', $this->domain )
29
+ , 'time_format' => 'hh:mm'
30
+ , 'show_date' => true
31
+ , 'date_format' => 'mm/dd/yy'
32
+ , 'show_week_number' => false
33
+ , 'picker' => 'slider'
34
+ );
35
+
36
+
37
+
38
+ // do not delete!
39
+ parent::__construct();
40
+
41
+
42
+ // settings
43
+ $this->settings = array(
44
+ 'path' => apply_filters('acf/helpers/get_path', __FILE__)
45
+ , 'dir' => apply_filters('acf/helpers/get_dir', __FILE__)
46
+ , 'version' => '2.0.0.beta'
47
+ );
48
+
49
+ }
50
+
51
+
52
+ /*
53
+ * create_options()
54
+ *
55
+ * Create extra options for your field. This is rendered when editing a field.
56
+ * The value of $field['name'] can be used (like bellow) to save extra data to the $field
57
+ *
58
+ * @type action
59
+ * @since 3.6
60
+ * @date 23/01/13
61
+ *
62
+ * @param $field - an array holding all the field's data
63
+ */
64
+
65
+ function create_options( $field )
66
+ {
67
+ $field = array_merge($this->defaults, $field);
68
+ $key = $field['name'];
69
+ ?>
70
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_choice">
71
+ <td class="label">
72
+ <label for=""><?php _e( "Date and Time Picker?", $this->domain ); ?></label>
73
+ </td>
74
+ <td>
75
+ <?php
76
+ do_action('acf/create_field', array(
77
+ 'type' => 'radio'
78
+ , 'name' => 'fields['.$key.'][show_date]'
79
+ , 'value' => $field['show_date']
80
+ , 'layout' => 'horizontal'
81
+ , 'choices' => array(
82
+ 'true' => __( 'Date and Time Picker', $this->domain )
83
+ , 'false' => __( 'Time Picker', $this->domain )
84
+ )
85
+ ) );
86
+ ?>
87
+ </td>
88
+ </tr>
89
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_dateformat">
90
+ <td class="label">
91
+ <label><?php _e( "Date format", $this->domain ); ?></label>
92
+ <p class="description"><?php printf(__("eg. mm/dd/yy. read more about <a href=\"%s\" target=\"_blank\">formatting date</a>", $this->domain ),"http://docs.jquery.com/UI/Datepicker/formatDate");?></p>
93
+ </td>
94
+ <td>
95
+ <?php
96
+ do_action('acf/create_field', array(
97
+ 'type' => 'text'
98
+ , 'name' => 'fields[' . $key . '][date_format]'
99
+ , 'value' => $field['date_format']
100
+ ) );
101
+ ?>
102
+ </td>
103
+ </tr>
104
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_timeformat">
105
+ <td class="label">
106
+ <label><?php _e( "Time Format", $this->domain );?></label>
107
+ <p class="description"><?php printf(__("eg. hh:mm. read more about <a href=\"%s\" target=\"_blank\">formatting time</a>", $this->domain ),"http://trentrichardson.com/examples/timepicker/#tp-formatting");?></p>
108
+ </td>
109
+ <td>
110
+ <?php
111
+ do_action('acf/create_field', array(
112
+ 'type' => 'text'
113
+ , 'name' => 'fields[' . $key . '][time_format]'
114
+ , 'value' => $field['time_format']
115
+ ) );
116
+ ?>
117
+ </td>
118
+ </tr>
119
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_week_number">
120
+ <td class="label">
121
+ <label for=""><?php _e( "Display Week Number?", $this->domain ); ?></label>
122
+ </td>
123
+ <td>
124
+ <?php
125
+ do_action('acf/create_field', array(
126
+ 'type' => 'radio'
127
+ , 'name' => 'fields['.$key.'][show_week_number]'
128
+ , 'value' => $field['show_week_number']
129
+ , 'layout' => 'horizontal'
130
+ , 'choices' => array(
131
+ 'true' => __( 'Yes', $this->domain )
132
+ , 'false' => __( 'No', $this->domain )
133
+ )
134
+ ) );
135
+ ?>
136
+ </td>
137
+ </tr>
138
+ <tr class="field_option field_option_<?php echo $this->name; ?> timepicker_week_number">
139
+ <td class="label">
140
+ <label for=""><?php _e( "Time Picker style?", $this->domain ); ?></label>
141
+ </td>
142
+ <td>
143
+ <?php
144
+ do_action('acf/create_field', array(
145
+ 'type' => 'radio'
146
+ , 'name' => 'fields['.$key.'][picker]'
147
+ , 'value' => $field['picker']
148
+ , 'layout' => 'horizontal'
149
+ , 'choices' => array(
150
+ 'slider' => __( 'Slider', $this->domain )
151
+ , 'select' => __( 'Select', $this->domain )
152
+ )
153
+ ) );
154
+ ?>
155
+ </td>
156
+ </tr>
157
+ <?php
158
+
159
+ }
160
+
161
+
162
+ /*
163
+ * create_field()
164
+ *
165
+ * Create the HTML interface for your field
166
+ *
167
+ * @param $field - an array holding all the field's data
168
+ *
169
+ * @type action
170
+ * @since 3.6
171
+ * @date 23/01/13
172
+ */
173
+
174
+ function create_field( $field ) {
175
+ $field = array_merge( $this->defaults, $field );
176
+ extract( $field, EXTR_SKIP ); //Declare each item in $field as its own variable i.e.: $name, $value, $label, $time_format, $date_format and $show_week_number
177
+
178
+ if ( $show_date != 'true' ) {
179
+ echo '<input type="text" name="' . $name . '" class="time_picker" value="' . $value . '" data-picker="' . $picker . '" data-time_format="' . $time_format . '" title="' . $label . '" />';
180
+ } else {
181
+ echo '<input type="text" name="' . $name . '" class="time_picker" value="' . $value . '" data-picker="' . $picker . '" data-date_format="' . $date_format . '" data-time_format="' . $time_format . '" data-show_week_number="' . $show_week_number . '" title="' . $label . '" />';
182
+ }
183
+ }
184
+
185
+
186
+ /*
187
+ * input_admin_enqueue_scripts()
188
+ *
189
+ * This action is called in the admin_enqueue_scripts action on the edit screen where your field is created.
190
+ * Use this action to add css + javascript to assist your create_field() action.
191
+ *
192
+ * $info http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts
193
+ * @type action
194
+ * @since 3.6
195
+ * @date 23/01/13
196
+ */
197
+
198
+ function input_admin_enqueue_scripts() {
199
+ global $wp_locale;
200
+
201
+ $has_locale = false;
202
+ $js_locale = $this->get_js_locale(get_locale());
203
+ wp_enqueue_script( 'jquery-ui-timepicker', $this->settings['dir'] . 'js/jquery-ui-timepicker-addon.js', array(
204
+ 'jquery-ui-datepicker',
205
+ 'jquery-ui-slider'
206
+ ), $this->settings['version'], true );
207
+
208
+ if ( file_exists( dirname( __FILE__ ) . '/js/localization/jquery-ui-timepicker-' . $js_locale . '.js' ) ) {
209
+ wp_enqueue_script( 'timepicker-localization', $this->settings['dir'] . 'js/localization/jquery-ui-timepicker-' . $js_locale . '.js', array(
210
+ 'jquery-ui-timepicker'
211
+ ), $this->settings['version'], true );
212
+ wp_enqueue_script( 'timepicker', $this->settings['dir'] . 'js/timepicker.js', array(
213
+ 'timepicker-localization'
214
+ ), $this->settings['version'], true );
215
+ $has_locale = true;
216
+ } else {
217
+ wp_enqueue_script( 'timepicker', $this->settings['dir'] . 'js/timepicker.js', array(
218
+ 'jquery-ui-timepicker'
219
+ ), $this->settings['version'], true );
220
+ }
221
+
222
+ if ( ! $has_locale && $js_locale != 'en' ) {
223
+ $timepicker_locale = array(
224
+ 'closeText' => __( 'Done', $this->domain )
225
+ , 'currentText' => __( 'Today', $this->domain )
226
+ , 'prevText' => __( 'Prev', $this->domain )
227
+ , 'nextText' => __( 'Next', $this->domain )
228
+ , 'monthStatus' => __( 'Show a different month', $this->domain )
229
+ , 'weekHeader' => __( 'Wk', $this->domain )
230
+ , 'timeText' => __( "Time", $this->domain )
231
+ , 'hourText' => __( "Hour", $this->domain )
232
+ , 'minuteText' => __( "Minute", $this->domain )
233
+ , 'secondText' => __( "Second", $this->domain )
234
+ , 'millisecText' => __( "Millisecond", $this->domain )
235
+ , 'timezoneText' => __( "Time Zone", $this->domain )
236
+ , 'isRTL' => $wp_locale->is_rtl()
237
+ );
238
+ }
239
+ $timepicker_wp_locale = array(
240
+ 'monthNames' => $this->strip_array_indices( $wp_locale->month )
241
+ , 'monthNamesShort' => $this->strip_array_indices( $wp_locale->month_abbrev )
242
+ , 'dayNames' => $this->strip_array_indices( $wp_locale->weekday )
243
+ , 'dayNamesShort' => $this->strip_array_indices( $wp_locale->weekday_abbrev )
244
+ , 'dayNamesMin' => $this->strip_array_indices( $wp_locale->weekday_initial )
245
+ , 'showMonthAfterYear' => false
246
+ , 'showWeek' => false
247
+ , 'firstDay' => get_option( 'start_of_week' )
248
+ );
249
+
250
+ $l10n = ( isset( $timepicker_locale ) ) ? array_merge( $timepicker_wp_locale, $timepicker_locale ) : $timepicker_wp_locale;
251
+ wp_localize_script( 'timepicker', 'timepicker_objectL10n', $l10n );
252
+
253
+ wp_enqueue_style('jquery-style', $this->settings['dir'] . 'css/jquery-ui.css');
254
+ wp_enqueue_style('timepicker', $this->settings['dir'] . 'css/jquery-ui-timepicker-addon.css',array(
255
+ 'jquery-style'
256
+ ),$this->settings['version']);
257
+ }
258
+
259
+ /**
260
+ * helper function, see: http://www.renegadetechconsulting.com/tutorials/jquery-datepicker-and-wordpress-i18n
261
+ * @param array $ArrayToStrip
262
+ * @return array
263
+ */
264
+ function strip_array_indices( $ArrayToStrip ) {
265
+ foreach ( $ArrayToStrip as $objArrayItem ) {
266
+ $NewArray[] = $objArrayItem;
267
+ }
268
+
269
+ return $NewArray;
270
+ }
271
+
272
+ function get_js_locale($locale) {
273
+ $tmp_locale = ( '' == $locale ) ? 'en' : strtolower($locale);
274
+ if (strpos($tmp_locale,'_') !== false) {
275
+ return substr( $tmp_locale, 3, 2 );
276
+ } else {
277
+ return $tmp_locale;
278
+ }
279
+ }
280
+
281
+ }
282
+
283
+
284
+ // create field
285
+ new acf_field_date_time_picker();
286
+
287
+ ?>
js/input.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($){
2
+
3
+
4
+ /*
5
+ * acf/setup_fields
6
+ *
7
+ * This event is triggered when ACF adds any new elements to the DOM.
8
+ *
9
+ * @type function
10
+ * @since 1.0.0
11
+ * @date 01/01/12
12
+ *
13
+ * @param event e: an event object. This can be ignored
14
+ * @param Element postbox: An element which contains the new HTML
15
+ *
16
+ * @return N/A
17
+ */
18
+
19
+ $(document).live('acf/setup_fields', function(e, postbox){
20
+
21
+ $(postbox).find('.my-field-class').each(function(){
22
+
23
+ // initiate JS on my field!
24
+ // $(this).add_awesome_stuff();
25
+
26
+ });
27
+
28
+ });
29
+
30
+ })(jQuery);
js/jquery-ui-sliderAccess.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jQuery UI Slider Access
3
+ * By: Trent Richardson [http://trentrichardson.com]
4
+ * Version 0.3
5
+ * Last Modified: 10/20/2012
6
+ *
7
+ * Copyright 2011 Trent Richardson
8
+ * Dual licensed under the MIT and GPL licenses.
9
+ * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
10
+ * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
11
+ *
12
+ */
13
+ (function($){
14
+
15
+ $.fn.extend({
16
+ sliderAccess: function(options){
17
+ options = options || {};
18
+ options.touchonly = options.touchonly !== undefined? options.touchonly : true; // by default only show it if touch device
19
+
20
+ if(options.touchonly === true && !("ontouchend" in document))
21
+ return $(this);
22
+
23
+ return $(this).each(function(i,obj){
24
+ var $t = $(this),
25
+ o = $.extend({},{
26
+ where: 'after',
27
+ step: $t.slider('option','step'),
28
+ upIcon: 'ui-icon-plus',
29
+ downIcon: 'ui-icon-minus',
30
+ text: false,
31
+ upText: '+',
32
+ downText: '-',
33
+ buttonset: true,
34
+ buttonsetTag: 'span',
35
+ isRTL: false
36
+ }, options),
37
+ $buttons = $('<'+ o.buttonsetTag +' class="ui-slider-access">'+
38
+ '<button data-icon="'+ o.downIcon +'" data-step="'+ (o.isRTL? o.step : o.step*-1) +'">'+ o.downText +'</button>'+
39
+ '<button data-icon="'+ o.upIcon +'" data-step="'+ (o.isRTL? o.step*-1 : o.step) +'">'+ o.upText +'</button>'+
40
+ '</'+ o.buttonsetTag +'>');
41
+
42
+ $buttons.children('button').each(function(j, jobj){
43
+ var $jt = $(this);
44
+ $jt.button({
45
+ text: o.text,
46
+ icons: { primary: $jt.data('icon') }
47
+ })
48
+ .click(function(e){
49
+ var step = $jt.data('step'),
50
+ curr = $t.slider('value'),
51
+ newval = curr += step*1,
52
+ minval = $t.slider('option','min'),
53
+ maxval = $t.slider('option','max'),
54
+ slidee = $t.slider("option", "slide") || function(){},
55
+ stope = $t.slider("option", "stop") || function(){};
56
+
57
+ e.preventDefault();
58
+
59
+ if(newval < minval || newval > maxval)
60
+ return;
61
+
62
+ $t.slider('value', newval);
63
+
64
+ slidee.call($t, null, { value: newval });
65
+ stope.call($t, null, { value: newval });
66
+ });
67
+ });
68
+
69
+ // before or after
70
+ $t[o.where]($buttons);
71
+
72
+ if(o.buttonset){
73
+ $buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset();
74
+ $buttons.eq(0).addClass('ui-corner-left');
75
+ $buttons.eq(1).addClass('ui-corner-right');
76
+ }
77
+
78
+ // adjust the width so we don't break the original layout
79
+ var bOuterWidth = $buttons.css({
80
+ marginLeft: ((o.where == 'after' && !o.isRTL) || (o.where == 'before' && o.isRTL)? 10:0),
81
+ marginRight: ((o.where == 'before' && !o.isRTL) || (o.where == 'after' && o.isRTL)? 10:0)
82
+ }).outerWidth(true) + 5;
83
+ var tOuterWidth = $t.outerWidth(true);
84
+ $t.css('display','inline-block').width(tOuterWidth-bOuterWidth);
85
+ });
86
+ }
87
+ });
88
+
89
+ })(jQuery);
js/jquery-ui-timepicker-addon.js ADDED
@@ -0,0 +1,1919 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jQuery timepicker addon
3
+ * By: Trent Richardson [http://trentrichardson.com]
4
+ * Version 1.2
5
+ * Last Modified: 02/02/2013
6
+ *
7
+ * Copyright 2013 Trent Richardson
8
+ * You may use this project under MIT or GPL licenses.
9
+ * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
10
+ * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
11
+ */
12
+
13
+ /*jslint evil: true, white: false, undef: false, nomen: false */
14
+
15
+ (function($) {
16
+
17
+ /*
18
+ * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded"
19
+ */
20
+ $.ui.timepicker = $.ui.timepicker || {};
21
+ if ($.ui.timepicker.version) {
22
+ return;
23
+ }
24
+
25
+ /*
26
+ * Extend jQueryUI, get it started with our version number
27
+ */
28
+ $.extend($.ui, {
29
+ timepicker: {
30
+ version: "1.2"
31
+ }
32
+ });
33
+
34
+ /*
35
+ * Timepicker manager.
36
+ * Use the singleton instance of this class, $.timepicker, to interact with the time picker.
37
+ * Settings for (groups of) time pickers are maintained in an instance object,
38
+ * allowing multiple different settings on the same page.
39
+ */
40
+ var Timepicker = function() {
41
+ this.regional = []; // Available regional settings, indexed by language code
42
+ this.regional[''] = { // Default regional settings
43
+ currentText: 'Now',
44
+ closeText: 'Done',
45
+ amNames: ['AM', 'A'],
46
+ pmNames: ['PM', 'P'],
47
+ timeFormat: 'HH:mm',
48
+ timeSuffix: '',
49
+ timeOnlyTitle: 'Choose Time',
50
+ timeText: 'Time',
51
+ hourText: 'Hour',
52
+ minuteText: 'Minute',
53
+ secondText: 'Second',
54
+ millisecText: 'Millisecond',
55
+ timezoneText: 'Time Zone',
56
+ isRTL: false
57
+ };
58
+ this._defaults = { // Global defaults for all the datetime picker instances
59
+ showButtonPanel: true,
60
+ timeOnly: false,
61
+ showHour: true,
62
+ showMinute: true,
63
+ showSecond: false,
64
+ showMillisec: false,
65
+ showTimezone: false,
66
+ showTime: true,
67
+ stepHour: 1,
68
+ stepMinute: 1,
69
+ stepSecond: 1,
70
+ stepMillisec: 1,
71
+ hour: 0,
72
+ minute: 0,
73
+ second: 0,
74
+ millisec: 0,
75
+ timezone: null,
76
+ useLocalTimezone: false,
77
+ defaultTimezone: "+0000",
78
+ hourMin: 0,
79
+ minuteMin: 0,
80
+ secondMin: 0,
81
+ millisecMin: 0,
82
+ hourMax: 23,
83
+ minuteMax: 59,
84
+ secondMax: 59,
85
+ millisecMax: 999,
86
+ minDateTime: null,
87
+ maxDateTime: null,
88
+ onSelect: null,
89
+ hourGrid: 0,
90
+ minuteGrid: 0,
91
+ secondGrid: 0,
92
+ millisecGrid: 0,
93
+ alwaysSetTime: true,
94
+ separator: ' ',
95
+ altFieldTimeOnly: true,
96
+ altTimeFormat: null,
97
+ altSeparator: null,
98
+ altTimeSuffix: null,
99
+ pickerTimeFormat: null,
100
+ pickerTimeSuffix: null,
101
+ showTimepicker: true,
102
+ timezoneIso8601: false,
103
+ timezoneList: null,
104
+ addSliderAccess: false,
105
+ sliderAccessArgs: null,
106
+ controlType: 'slider',
107
+ defaultValue: null,
108
+ parse: 'strict'
109
+ };
110
+ $.extend(this._defaults, this.regional['']);
111
+ };
112
+
113
+ $.extend(Timepicker.prototype, {
114
+ $input: null,
115
+ $altInput: null,
116
+ $timeObj: null,
117
+ inst: null,
118
+ hour_slider: null,
119
+ minute_slider: null,
120
+ second_slider: null,
121
+ millisec_slider: null,
122
+ timezone_select: null,
123
+ hour: 0,
124
+ minute: 0,
125
+ second: 0,
126
+ millisec: 0,
127
+ timezone: null,
128
+ defaultTimezone: "+0000",
129
+ hourMinOriginal: null,
130
+ minuteMinOriginal: null,
131
+ secondMinOriginal: null,
132
+ millisecMinOriginal: null,
133
+ hourMaxOriginal: null,
134
+ minuteMaxOriginal: null,
135
+ secondMaxOriginal: null,
136
+ millisecMaxOriginal: null,
137
+ ampm: '',
138
+ formattedDate: '',
139
+ formattedTime: '',
140
+ formattedDateTime: '',
141
+ timezoneList: null,
142
+ units: ['hour','minute','second','millisec'],
143
+ control: null,
144
+
145
+ /*
146
+ * Override the default settings for all instances of the time picker.
147
+ * @param settings object - the new settings to use as defaults (anonymous object)
148
+ * @return the manager object
149
+ */
150
+ setDefaults: function(settings) {
151
+ extendRemove(this._defaults, settings || {});
152
+ return this;
153
+ },
154
+
155
+ /*
156
+ * Create a new Timepicker instance
157
+ */
158
+ _newInst: function($input, o) {
159
+ var tp_inst = new Timepicker(),
160
+ inlineSettings = {},
161
+ fns = {},
162
+ overrides, i;
163
+
164
+ for (var attrName in this._defaults) {
165
+ if(this._defaults.hasOwnProperty(attrName)){
166
+ var attrValue = $input.attr('time:' + attrName);
167
+ if (attrValue) {
168
+ try {
169
+ inlineSettings[attrName] = eval(attrValue);
170
+ } catch (err) {
171
+ inlineSettings[attrName] = attrValue;
172
+ }
173
+ }
174
+ }
175
+ }
176
+ overrides = {
177
+ beforeShow: function (input, dp_inst) {
178
+ if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) {
179
+ return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);
180
+ }
181
+ },
182
+ onChangeMonthYear: function (year, month, dp_inst) {
183
+ // Update the time as well : this prevents the time from disappearing from the $input field.
184
+ tp_inst._updateDateTime(dp_inst);
185
+ if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) {
186
+ tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
187
+ }
188
+ },
189
+ onClose: function (dateText, dp_inst) {
190
+ if (tp_inst.timeDefined === true && $input.val() !== '') {
191
+ tp_inst._updateDateTime(dp_inst);
192
+ }
193
+ if ($.isFunction(tp_inst._defaults.evnts.onClose)) {
194
+ tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);
195
+ }
196
+ }
197
+ };
198
+ for (i in overrides) {
199
+ if (overrides.hasOwnProperty(i)) {
200
+ fns[i] = o[i] || null;
201
+ }
202
+ }
203
+ tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, overrides, {
204
+ evnts:fns,
205
+ timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
206
+ });
207
+ tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) {
208
+ return val.toUpperCase();
209
+ });
210
+ tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) {
211
+ return val.toUpperCase();
212
+ });
213
+
214
+ // controlType is string - key to our this._controls
215
+ if(typeof(tp_inst._defaults.controlType) === 'string'){
216
+ if($.fn[tp_inst._defaults.controlType] === undefined){
217
+ tp_inst._defaults.controlType = 'select';
218
+ }
219
+ tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];
220
+ }
221
+ // controlType is an object and must implement create, options, value methods
222
+ else{
223
+ tp_inst.control = tp_inst._defaults.controlType;
224
+ }
225
+
226
+ if (tp_inst._defaults.timezoneList === null) {
227
+ var timezoneList = ['-1200', '-1100', '-1000', '-0930', '-0900', '-0800', '-0700', '-0600', '-0500', '-0430', '-0400', '-0330', '-0300', '-0200', '-0100', '+0000',
228
+ '+0100', '+0200', '+0300', '+0330', '+0400', '+0430', '+0500', '+0530', '+0545', '+0600', '+0630', '+0700', '+0800', '+0845', '+0900', '+0930',
229
+ '+1000', '+1030', '+1100', '+1130', '+1200', '+1245', '+1300', '+1400'];
230
+
231
+ if (tp_inst._defaults.timezoneIso8601) {
232
+ timezoneList = $.map(timezoneList, function(val) {
233
+ return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3));
234
+ });
235
+ }
236
+ tp_inst._defaults.timezoneList = timezoneList;
237
+ }
238
+
239
+ tp_inst.timezone = tp_inst._defaults.timezone;
240
+ tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin? tp_inst._defaults.hourMin :
241
+ tp_inst._defaults.hour > tp_inst._defaults.hourMax? tp_inst._defaults.hourMax : tp_inst._defaults.hour;
242
+ tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin? tp_inst._defaults.minuteMin :
243
+ tp_inst._defaults.minute > tp_inst._defaults.minuteMax? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;
244
+ tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin? tp_inst._defaults.secondMin :
245
+ tp_inst._defaults.second > tp_inst._defaults.secondMax? tp_inst._defaults.secondMax : tp_inst._defaults.second;
246
+ tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin? tp_inst._defaults.millisecMin :
247
+ tp_inst._defaults.millisec > tp_inst._defaults.millisecMax? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;
248
+ tp_inst.ampm = '';
249
+ tp_inst.$input = $input;
250
+
251
+ if (o.altField) {
252
+ tp_inst.$altInput = $(o.altField).css({
253
+ cursor: 'pointer'
254
+ }).focus(function() {
255
+ $input.trigger("focus");
256
+ });
257
+ }
258
+
259
+ if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {
260
+ tp_inst._defaults.minDate = new Date();
261
+ }
262
+ if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {
263
+ tp_inst._defaults.maxDate = new Date();
264
+ }
265
+
266
+ // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
267
+ if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {
268
+ tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
269
+ }
270
+ if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {
271
+ tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
272
+ }
273
+ if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {
274
+ tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
275
+ }
276
+ if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {
277
+ tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
278
+ }
279
+ tp_inst.$input.bind('focus', function() {
280
+ tp_inst._onFocus();
281
+ });
282
+
283
+ return tp_inst;
284
+ },
285
+
286
+ /*
287
+ * add our sliders to the calendar
288
+ */
289
+ _addTimePicker: function(dp_inst) {
290
+ var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val();
291
+
292
+ this.timeDefined = this._parseTime(currDT);
293
+ this._limitMinMaxDateTime(dp_inst, false);
294
+ this._injectTimePicker();
295
+ },
296
+
297
+ /*
298
+ * parse the time string from input value or _setTime
299
+ */
300
+ _parseTime: function(timeString, withDate) {
301
+ if (!this.inst) {
302
+ this.inst = $.datepicker._getInst(this.$input[0]);
303
+ }
304
+
305
+ if (withDate || !this._defaults.timeOnly) {
306
+ var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
307
+ try {
308
+ var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults);
309
+ if (!parseRes.timeObj) {
310
+ return false;
311
+ }
312
+ $.extend(this, parseRes.timeObj);
313
+ } catch (err) {
314
+ $.timepicker.log("Error parsing the date/time string: " + err +
315
+ "\ndate/time string = " + timeString +
316
+ "\ntimeFormat = " + this._defaults.timeFormat +
317
+ "\ndateFormat = " + dp_dateFormat);
318
+ return false;
319
+ }
320
+ return true;
321
+ } else {
322
+ var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults);
323
+ if (!timeObj) {
324
+ return false;
325
+ }
326
+ $.extend(this, timeObj);
327
+ return true;
328
+ }
329
+ },
330
+
331
+ /*
332
+ * generate and inject html for timepicker into ui datepicker
333
+ */
334
+ _injectTimePicker: function() {
335
+ var $dp = this.inst.dpDiv,
336
+ o = this.inst.settings,
337
+ tp_inst = this,
338
+ litem = '',
339
+ uitem = '',
340
+ max = {},
341
+ gridSize = {},
342
+ size = null;
343
+
344
+ // Prevent displaying twice
345
+ if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) {
346
+ var noDisplay = ' style="display:none;"',
347
+ html = '<div class="ui-timepicker-div'+ (o.isRTL? ' ui-timepicker-rtl' : '') +'"><dl>' + '<dt class="ui_tpicker_time_label"' + ((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
348
+ '<dd class="ui_tpicker_time"' + ((o.showTime) ? '' : noDisplay) + '></dd>';
349
+
350
+ // Create the markup
351
+ for(var i=0,l=this.units.length; i<l; i++){
352
+ litem = this.units[i];
353
+ uitem = litem.substr(0,1).toUpperCase() + litem.substr(1);
354
+ // Added by Peter Medeiros:
355
+ // - Figure out what the hour/minute/second max should be based on the step values.
356
+ // - Example: if stepMinute is 15, then minMax is 45.
357
+ max[litem] = parseInt((o[litem+'Max'] - ((o[litem+'Max'] - o[litem+'Min']) % o['step'+uitem])), 10);
358
+ gridSize[litem] = 0;
359
+
360
+ html += '<dt class="ui_tpicker_'+ litem +'_label"' + ((o['show'+uitem]) ? '' : noDisplay) + '>' + o[litem +'Text'] + '</dt>' +
361
+ '<dd class="ui_tpicker_'+ litem +'"><div class="ui_tpicker_'+ litem +'_slider"' + ((o['show'+uitem]) ? '' : noDisplay) + '></div>';
362
+
363
+ if (o['show'+uitem] && o[litem+'Grid'] > 0) {
364
+ html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
365
+
366
+ if(litem == 'hour'){
367
+ for (var h = o[litem+'Min']; h <= max[litem]; h += parseInt(o[litem+'Grid'], 10)) {
368
+ gridSize[litem]++;
369
+ var tmph = $.datepicker.formatTime(useAmpm(o.pickerTimeFormat || o.timeFormat)? 'hht':'HH', {hour:h}, o);
370
+ html += '<td data-for="'+litem+'">' + tmph + '</td>';
371
+ }
372
+ }
373
+ else{
374
+ for (var m = o[litem+'Min']; m <= max[litem]; m += parseInt(o[litem+'Grid'], 10)) {
375
+ gridSize[litem]++;
376
+ html += '<td data-for="'+litem+'">' + ((m < 10) ? '0' : '') + m + '</td>';
377
+ }
378
+ }
379
+
380
+ html += '</tr></table></div>';
381
+ }
382
+ html += '</dd>';
383
+ }
384
+
385
+ // Timezone
386
+ html += '<dt class="ui_tpicker_timezone_label"' + ((o.showTimezone) ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
387
+ html += '<dd class="ui_tpicker_timezone" ' + ((o.showTimezone) ? '' : noDisplay) + '></dd>';
388
+
389
+ // Create the elements from string
390
+ html += '</dl></div>';
391
+ var $tp = $(html);
392
+
393
+ // if we only want time picker...
394
+ if (o.timeOnly === true) {
395
+ $tp.prepend('<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' + '<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' + '</div>');
396
+ $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
397
+ }
398
+
399
+ // add sliders, adjust grids, add events
400
+ for(var i=0,l=tp_inst.units.length; i<l; i++){
401
+ litem = tp_inst.units[i];
402
+ uitem = litem.substr(0,1).toUpperCase() + litem.substr(1);
403
+
404
+ // add the slider
405
+ tp_inst[litem+'_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_'+litem+'_slider'), litem, tp_inst[litem], o[litem+'Min'], max[litem], o['step'+uitem]);
406
+
407
+ // adjust the grid and add click event
408
+ if (o['show'+uitem] && o[litem+'Grid'] > 0) {
409
+ size = 100 * gridSize[litem] * o[litem+'Grid'] / (max[litem] - o[litem+'Min']);
410
+ $tp.find('.ui_tpicker_'+litem+' table').css({
411
+ width: size + "%",
412
+ marginLeft: o.isRTL? '0' : ((size / (-2 * gridSize[litem])) + "%"),
413
+ marginRight: o.isRTL? ((size / (-2 * gridSize[litem])) + "%") : '0',
414
+ borderCollapse: 'collapse'
415
+ }).find("td").click(function(e){
416
+ var $t = $(this),
417
+ h = $t.html(),
418
+ n = parseInt(h.replace(/[^0-9]/g),10),
419
+ ap = h.replace(/[^apm]/ig),
420
+ f = $t.data('for'); // loses scope, so we use data-for
421
+
422
+ if(f == 'hour'){
423
+ if(ap.indexOf('p') !== -1 && n < 12){
424
+ n += 12;
425
+ }
426
+ else{
427
+ if(ap.indexOf('a') !== -1 && n === 12){
428
+ n = 0;
429
+ }
430
+ }
431
+ }
432
+
433
+ tp_inst.control.value(tp_inst, tp_inst[f+'_slider'], litem, n);
434
+
435
+ tp_inst._onTimeChange();
436
+ tp_inst._onSelectHandler();
437
+ })
438
+ .css({
439
+ cursor: 'pointer',
440
+ width: (100 / gridSize[litem]) + '%',
441
+ textAlign: 'center',
442
+ overflow: 'hidden'
443
+ });
444
+ } // end if grid > 0
445
+ } // end for loop
446
+
447
+ // Add timezone options
448
+ this.timezone_select = $tp.find('.ui_tpicker_timezone').append('<select></select>').find("select");
449
+ $.fn.append.apply(this.timezone_select,
450
+ $.map(o.timezoneList, function(val, idx) {
451
+ return $("<option />").val(typeof val == "object" ? val.value : val).text(typeof val == "object" ? val.label : val);
452
+ }));
453
+ if (typeof(this.timezone) != "undefined" && this.timezone !== null && this.timezone !== "") {
454
+ var local_date = new Date(this.inst.selectedYear, this.inst.selectedMonth, this.inst.selectedDay, 12);
455
+ var local_timezone = $.timepicker.timeZoneOffsetString(local_date);
456
+ if (local_timezone == this.timezone) {
457
+ selectLocalTimeZone(tp_inst);
458
+ } else {
459
+ this.timezone_select.val(this.timezone);
460
+ }
461
+ } else {
462
+ if (typeof(this.hour) != "undefined" && this.hour !== null && this.hour !== "") {
463
+ this.timezone_select.val(o.defaultTimezone);
464
+ } else {
465
+ selectLocalTimeZone(tp_inst);
466
+ }
467
+ }
468
+ this.timezone_select.change(function() {
469
+ tp_inst._defaults.useLocalTimezone = false;
470
+ tp_inst._onTimeChange();
471
+ tp_inst._onSelectHandler();
472
+ });
473
+ // End timezone options
474
+
475
+ // inject timepicker into datepicker
476
+ var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
477
+ if ($buttonPanel.length) {
478
+ $buttonPanel.before($tp);
479
+ } else {
480
+ $dp.append($tp);
481
+ }
482
+
483
+ this.$timeObj = $tp.find('.ui_tpicker_time');
484
+
485
+ if (this.inst !== null) {
486
+ var timeDefined = this.timeDefined;
487
+ this._onTimeChange();
488
+ this.timeDefined = timeDefined;
489
+ }
490
+
491
+ // slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
492
+ if (this._defaults.addSliderAccess) {
493
+ var sliderAccessArgs = this._defaults.sliderAccessArgs,
494
+ rtl = this._defaults.isRTL;
495
+ sliderAccessArgs.isRTL = rtl;
496
+
497
+ setTimeout(function() { // fix for inline mode
498
+ if ($tp.find('.ui-slider-access').length === 0) {
499
+ $tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
500
+
501
+ // fix any grids since sliders are shorter
502
+ var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
503
+ if (sliderAccessWidth) {
504
+ $tp.find('table:visible').each(function() {
505
+ var $g = $(this),
506
+ oldWidth = $g.outerWidth(),
507
+ oldMarginLeft = $g.css(rtl? 'marginRight':'marginLeft').toString().replace('%', ''),
508
+ newWidth = oldWidth - sliderAccessWidth,
509
+ newMarginLeft = ((oldMarginLeft * newWidth) / oldWidth) + '%',
510
+ css = { width: newWidth, marginRight: 0, marginLeft: 0 };
511
+ css[rtl? 'marginRight':'marginLeft'] = newMarginLeft;
512
+ $g.css(css);
513
+ });
514
+ }
515
+ }
516
+ }, 10);
517
+ }
518
+ // end slideAccess integration
519
+
520
+ }
521
+ },
522
+
523
+ /*
524
+ * This function tries to limit the ability to go outside the
525
+ * min/max date range
526
+ */
527
+ _limitMinMaxDateTime: function(dp_inst, adjustSliders) {
528
+ var o = this._defaults,
529
+ dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
530
+
531
+ if (!this._defaults.showTimepicker) {
532
+ return;
533
+ } // No time so nothing to check here
534
+
535
+ if ($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date) {
536
+ var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
537
+ minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
538
+
539
+ if (this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null) {
540
+ this.hourMinOriginal = o.hourMin;
541
+ this.minuteMinOriginal = o.minuteMin;
542
+ this.secondMinOriginal = o.secondMin;
543
+ this.millisecMinOriginal = o.millisecMin;
544
+ }
545
+
546
+ if (dp_inst.settings.timeOnly || minDateTimeDate.getTime() == dp_date.getTime()) {
547
+ this._defaults.hourMin = minDateTime.getHours();
548
+ if (this.hour <= this._defaults.hourMin) {
549
+ this.hour = this._defaults.hourMin;
550
+ this._defaults.minuteMin = minDateTime.getMinutes();
551
+ if (this.minute <= this._defaults.minuteMin) {
552
+ this.minute = this._defaults.minuteMin;
553
+ this._defaults.secondMin = minDateTime.getSeconds();
554
+ if (this.second <= this._defaults.secondMin) {
555
+ this.second = this._defaults.secondMin;
556
+ this._defaults.millisecMin = minDateTime.getMilliseconds();
557
+ } else {
558
+ if (this.millisec < this._defaults.millisecMin) {
559
+ this.millisec = this._defaults.millisecMin;
560
+ }
561
+ this._defaults.millisecMin = this.millisecMinOriginal;
562
+ }
563
+ } else {
564
+ this._defaults.secondMin = this.secondMinOriginal;
565
+ this._defaults.millisecMin = this.millisecMinOriginal;
566
+ }
567
+ } else {
568
+ this._defaults.minuteMin = this.minuteMinOriginal;
569
+ this._defaults.secondMin = this.secondMinOriginal;
570
+ this._defaults.millisecMin = this.millisecMinOriginal;
571
+ }
572
+ } else {
573
+ this._defaults.hourMin = this.hourMinOriginal;
574
+ this._defaults.minuteMin = this.minuteMinOriginal;
575
+ this._defaults.secondMin = this.secondMinOriginal;
576
+ this._defaults.millisecMin = this.millisecMinOriginal;
577
+ }
578
+ }
579
+
580
+ if ($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date) {
581
+ var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
582
+ maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
583
+
584
+ if (this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null) {
585
+ this.hourMaxOriginal = o.hourMax;
586
+ this.minuteMaxOriginal = o.minuteMax;
587
+ this.secondMaxOriginal = o.secondMax;
588
+ this.millisecMaxOriginal = o.millisecMax;
589
+ }
590
+
591
+ if (dp_inst.settings.timeOnly || maxDateTimeDate.getTime() == dp_date.getTime()) {
592
+ this._defaults.hourMax = maxDateTime.getHours();
593
+ if (this.hour >= this._defaults.hourMax) {
594
+ this.hour = this._defaults.hourMax;
595
+ this._defaults.minuteMax = maxDateTime.getMinutes();
596
+ if (this.minute >= this._defaults.minuteMax) {
597
+ this.minute = this._defaults.minuteMax;
598
+ this._defaults.secondMax = maxDateTime.getSeconds();
599
+ if (this.second >= this._defaults.secondMax) {
600
+ this.second = this._defaults.secondMax;
601
+ this._defaults.millisecMax = maxDateTime.getMilliseconds();
602
+ } else {
603
+ if (this.millisec > this._defaults.millisecMax) {
604
+ this.millisec = this._defaults.millisecMax;
605
+ }
606
+ this._defaults.millisecMax = this.millisecMaxOriginal;
607
+ }
608
+ } else {
609
+ this._defaults.secondMax = this.secondMaxOriginal;
610
+ this._defaults.millisecMax = this.millisecMaxOriginal;
611
+ }
612
+ } else {
613
+ this._defaults.minuteMax = this.minuteMaxOriginal;
614
+ this._defaults.secondMax = this.secondMaxOriginal;
615
+ this._defaults.millisecMax = this.millisecMaxOriginal;
616
+ }
617
+ } else {
618
+ this._defaults.hourMax = this.hourMaxOriginal;
619
+ this._defaults.minuteMax = this.minuteMaxOriginal;
620
+ this._defaults.secondMax = this.secondMaxOriginal;
621
+ this._defaults.millisecMax = this.millisecMaxOriginal;
622
+ }
623
+ }
624
+
625
+ if (adjustSliders !== undefined && adjustSliders === true) {
626
+ var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)), 10),
627
+ minMax = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)), 10),
628
+ secMax = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)), 10),
629
+ millisecMax = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)), 10);
630
+
631
+ if (this.hour_slider) {
632
+ this.control.options(this, this.hour_slider, 'hour', { min: this._defaults.hourMin, max: hourMax });
633
+ this.control.value(this, this.hour_slider, 'hour', this.hour - (this.hour % this._defaults.stepHour));
634
+ }
635
+ if (this.minute_slider) {
636
+ this.control.options(this, this.minute_slider, 'minute', { min: this._defaults.minuteMin, max: minMax });
637
+ this.control.value(this, this.minute_slider, 'minute', this.minute - (this.minute % this._defaults.stepMinute));
638
+ }
639
+ if (this.second_slider) {
640
+ this.control.options(this, this.second_slider, 'second', { min: this._defaults.secondMin, max: secMax });
641
+ this.control.value(this, this.second_slider, 'second', this.second - (this.second % this._defaults.stepSecond));
642
+ }
643
+ if (this.millisec_slider) {
644
+ this.control.options(this, this.millisec_slider, 'millisec', { min: this._defaults.millisecMin, max: millisecMax });
645
+ this.control.value(this, this.millisec_slider, 'millisec', this.millisec - (this.millisec % this._defaults.stepMillisec));
646
+ }
647
+ }
648
+
649
+ },
650
+
651
+ /*
652
+ * when a slider moves, set the internal time...
653
+ * on time change is also called when the time is updated in the text field
654
+ */
655
+ _onTimeChange: function() {
656
+ var hour = (this.hour_slider) ? this.control.value(this, this.hour_slider, 'hour') : false,
657
+ minute = (this.minute_slider) ? this.control.value(this, this.minute_slider, 'minute') : false,
658
+ second = (this.second_slider) ? this.control.value(this, this.second_slider, 'second') : false,
659
+ millisec = (this.millisec_slider) ? this.control.value(this, this.millisec_slider, 'millisec') : false,
660
+ timezone = (this.timezone_select) ? this.timezone_select.val() : false,
661
+ o = this._defaults,
662
+ pickerTimeFormat = o.pickerTimeFormat || o.timeFormat,
663
+ pickerTimeSuffix = o.pickerTimeSuffix || o.timeSuffix;
664
+
665
+ if (typeof(hour) == 'object') {
666
+ hour = false;
667
+ }
668
+ if (typeof(minute) == 'object') {
669
+ minute = false;
670
+ }
671
+ if (typeof(second) == 'object') {
672
+ second = false;
673
+ }
674
+ if (typeof(millisec) == 'object') {
675
+ millisec = false;
676
+ }
677
+ if (typeof(timezone) == 'object') {
678
+ timezone = false;
679
+ }
680
+
681
+ if (hour !== false) {
682
+ hour = parseInt(hour, 10);
683
+ }
684
+ if (minute !== false) {
685
+ minute = parseInt(minute, 10);
686
+ }
687
+ if (second !== false) {
688
+ second = parseInt(second, 10);
689
+ }
690
+ if (millisec !== false) {
691
+ millisec = parseInt(millisec, 10);
692
+ }
693
+
694
+ var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
695
+
696
+ // If the update was done in the input field, the input field should not be updated.
697
+ // If the update was done using the sliders, update the input field.
698
+ var hasChanged = (hour != this.hour || minute != this.minute || second != this.second || millisec != this.millisec
699
+ || (this.ampm.length > 0 && (hour < 12) != ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1))
700
+ || ((this.timezone === null && timezone != this.defaultTimezone) || (this.timezone !== null && timezone != this.timezone)));
701
+
702
+ if (hasChanged) {
703
+
704
+ if (hour !== false) {
705
+ this.hour = hour;
706
+ }
707
+ if (minute !== false) {
708
+ this.minute = minute;
709
+ }
710
+ if (second !== false) {
711
+ this.second = second;
712
+ }
713
+ if (millisec !== false) {
714
+ this.millisec = millisec;
715
+ }
716
+ if (timezone !== false) {
717
+ this.timezone = timezone;
718
+ }
719
+
720
+ if (!this.inst) {
721
+ this.inst = $.datepicker._getInst(this.$input[0]);
722
+ }
723
+
724
+ this._limitMinMaxDateTime(this.inst, true);
725
+ }
726
+ if (useAmpm(o.timeFormat)) {
727
+ this.ampm = ampm;
728
+ }
729
+
730
+ // Updates the time within the timepicker
731
+ this.formattedTime = $.datepicker.formatTime(o.timeFormat, this, o);
732
+ if (this.$timeObj) {
733
+ if(pickerTimeFormat === o.timeFormat){
734
+ this.$timeObj.text(this.formattedTime + pickerTimeSuffix);
735
+ }
736
+ else{
737
+ this.$timeObj.text($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);
738
+ }
739
+ }
740
+
741
+ this.timeDefined = true;
742
+ if (hasChanged) {
743
+ this._updateDateTime();
744
+ }
745
+ },
746
+
747
+ /*
748
+ * call custom onSelect.
749
+ * bind to sliders slidestop, and grid click.
750
+ */
751
+ _onSelectHandler: function() {
752
+ var onSelect = this._defaults.onSelect || this.inst.settings.onSelect;
753
+ var inputEl = this.$input ? this.$input[0] : null;
754
+ if (onSelect && inputEl) {
755
+ onSelect.apply(inputEl, [this.formattedDateTime, this]);
756
+ }
757
+ },
758
+
759
+ /*
760
+ * update our input with the new date time..
761
+ */
762
+ _updateDateTime: function(dp_inst) {
763
+ dp_inst = this.inst || dp_inst;
764
+ var dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
765
+ dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
766
+ formatCfg = $.datepicker._getFormatConfig(dp_inst),
767
+ timeAvailable = dt !== null && this.timeDefined;
768
+ this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
769
+ var formattedDateTime = this.formattedDate;
770
+
771
+ // if a slider was changed but datepicker doesn't have a value yet, set it
772
+ if(dp_inst.lastVal==""){
773
+ dp_inst.currentYear=dp_inst.selectedYear;
774
+ dp_inst.currentMonth=dp_inst.selectedMonth;
775
+ dp_inst.currentDay=dp_inst.selectedDay;
776
+ }
777
+
778
+ /*
779
+ * remove following lines to force every changes in date picker to change the input value
780
+ * Bug descriptions: when an input field has a default value, and click on the field to pop up the date picker.
781
+ * If the user manually empty the value in the input field, the date picker will never change selected value.
782
+ */
783
+ //if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0)) {
784
+ // return;
785
+ //}
786
+
787
+ if (this._defaults.timeOnly === true) {
788
+ formattedDateTime = this.formattedTime;
789
+ } else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
790
+ formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
791
+ }
792
+
793
+ this.formattedDateTime = formattedDateTime;
794
+
795
+ if (!this._defaults.showTimepicker) {
796
+ this.$input.val(this.formattedDate);
797
+ } else if (this.$altInput && this._defaults.altFieldTimeOnly === true) {
798
+ this.$altInput.val(this.formattedTime);
799
+ this.$input.val(this.formattedDate);
800
+ } else if (this.$altInput) {
801
+ this.$input.val(formattedDateTime);
802
+ var altFormattedDateTime = '',
803
+ altSeparator = this._defaults.altSeparator ? this._defaults.altSeparator : this._defaults.separator,
804
+ altTimeSuffix = this._defaults.altTimeSuffix ? this._defaults.altTimeSuffix : this._defaults.timeSuffix;
805
+
806
+ if (this._defaults.altFormat) altFormattedDateTime = $.datepicker.formatDate(this._defaults.altFormat, (dt === null ? new Date() : dt), formatCfg);
807
+ else altFormattedDateTime = this.formattedDate;
808
+ if (altFormattedDateTime) altFormattedDateTime += altSeparator;
809
+ if (this._defaults.altTimeFormat) altFormattedDateTime += $.datepicker.formatTime(this._defaults.altTimeFormat, this, this._defaults) + altTimeSuffix;
810
+ else altFormattedDateTime += this.formattedTime + altTimeSuffix;
811
+ this.$altInput.val(altFormattedDateTime);
812
+ } else {
813
+ this.$input.val(formattedDateTime);
814
+ }
815
+
816
+ this.$input.trigger("change");
817
+ },
818
+
819
+ _onFocus: function() {
820
+ if (!this.$input.val() && this._defaults.defaultValue) {
821
+ this.$input.val(this._defaults.defaultValue);
822
+ var inst = $.datepicker._getInst(this.$input.get(0)),
823
+ tp_inst = $.datepicker._get(inst, 'timepicker');
824
+ if (tp_inst) {
825
+ if (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {
826
+ try {
827
+ $.datepicker._updateDatepicker(inst);
828
+ } catch (err) {
829
+ $.timepicker.log(err);
830
+ }
831
+ }
832
+ }
833
+ }
834
+ },
835
+
836
+ /*
837
+ * Small abstraction to control types
838
+ * We can add more, just be sure to follow the pattern: create, options, value
839
+ */
840
+ _controls: {
841
+ // slider methods
842
+ slider: {
843
+ create: function(tp_inst, obj, unit, val, min, max, step){
844
+ var rtl = tp_inst._defaults.isRTL; // if rtl go -60->0 instead of 0->60
845
+ return obj.prop('slide', null).slider({
846
+ orientation: "horizontal",
847
+ value: rtl? val*-1 : val,
848
+ min: rtl? max*-1 : min,
849
+ max: rtl? min*-1 : max,
850
+ step: step,
851
+ slide: function(event, ui) {
852
+ tp_inst.control.value(tp_inst, $(this), unit, rtl? ui.value*-1:ui.value);
853
+ tp_inst._onTimeChange();
854
+ },
855
+ stop: function(event, ui) {
856
+ tp_inst._onSelectHandler();
857
+ }
858
+ });
859
+ },
860
+ options: function(tp_inst, obj, unit, opts, val){
861
+ if(tp_inst._defaults.isRTL){
862
+ if(typeof(opts) == 'string'){
863
+ if(opts == 'min' || opts == 'max'){
864
+ if(val !== undefined)
865
+ return obj.slider(opts, val*-1);
866
+ return Math.abs(obj.slider(opts));
867
+ }
868
+ return obj.slider(opts);
869
+ }
870
+ var min = opts.min,
871
+ max = opts.max;
872
+ opts.min = opts.max = null;
873
+ if(min !== undefined)
874
+ opts.max = min * -1;
875
+ if(max !== undefined)
876
+ opts.min = max * -1;
877
+ return obj.slider(opts);
878
+ }
879
+ if(typeof(opts) == 'string' && val !== undefined)
880
+ return obj.slider(opts, val);
881
+ return obj.slider(opts);
882
+ },
883
+ value: function(tp_inst, obj, unit, val){
884
+ if(tp_inst._defaults.isRTL){
885
+ if(val !== undefined)
886
+ return obj.slider('value', val*-1);
887
+ return Math.abs(obj.slider('value'));
888
+ }
889
+ if(val !== undefined)
890
+ return obj.slider('value', val);
891
+ return obj.slider('value');
892
+ }
893
+ },
894
+ // select methods
895
+ select: {
896
+ create: function(tp_inst, obj, unit, val, min, max, step){
897
+ var sel = '<select class="ui-timepicker-select" data-unit="'+ unit +'" data-min="'+ min +'" data-max="'+ max +'" data-step="'+ step +'">',
898
+ ul = tp_inst._defaults.timeFormat.indexOf('t') !== -1? 'toLowerCase':'toUpperCase',
899
+ m = 0;
900
+
901
+ for(var i=min; i<=max; i+=step){
902
+ sel += '<option value="'+ i +'"'+ (i==val? ' selected':'') +'>';
903
+ if(unit == 'hour' && useAmpm(tp_inst._defaults.pickerTimeFormat || tp_inst._defaults.timeFormat))
904
+ sel += $.datepicker.formatTime("hh TT", {hour:i}, tp_inst._defaults);
905
+ else if(unit == 'millisec' || i >= 10) sel += i;
906
+ else sel += '0'+ i.toString();
907
+ sel += '</option>';
908
+ }
909
+ sel += '</select>';
910
+
911
+ obj.children('select').remove();
912
+
913
+ $(sel).appendTo(obj).change(function(e){
914
+ tp_inst._onTimeChange();
915
+ tp_inst._onSelectHandler();
916
+ });
917
+
918
+ return obj;
919
+ },
920
+ options: function(tp_inst, obj, unit, opts, val){
921
+ var o = {},
922
+ $t = obj.children('select');
923
+ if(typeof(opts) == 'string'){
924
+ if(val === undefined)
925
+ return $t.data(opts);
926
+ o[opts] = val;
927
+ }
928
+ else o = opts;
929
+ return tp_inst.control.create(tp_inst, obj, $t.data('unit'), $t.val(), o.min || $t.data('min'), o.max || $t.data('max'), o.step || $t.data('step'));
930
+ },
931
+ value: function(tp_inst, obj, unit, val){
932
+ var $t = obj.children('select');
933
+ if(val !== undefined)
934
+ return $t.val(val);
935
+ return $t.val();
936
+ }
937
+ }
938
+ } // end _controls
939
+
940
+ });
941
+
942
+ $.fn.extend({
943
+ /*
944
+ * shorthand just to use timepicker..
945
+ */
946
+ timepicker: function(o) {
947
+ o = o || {};
948
+ var tmp_args = Array.prototype.slice.call(arguments);
949
+
950
+ if (typeof o == 'object') {
951
+ tmp_args[0] = $.extend(o, {
952
+ timeOnly: true
953
+ });
954
+ }
955
+
956
+ return $(this).each(function() {
957
+ $.fn.datetimepicker.apply($(this), tmp_args);
958
+ });
959
+ },
960
+
961
+ /*
962
+ * extend timepicker to datepicker
963
+ */
964
+ datetimepicker: function(o) {
965
+ o = o || {};
966
+ var tmp_args = arguments;
967
+
968
+ if (typeof(o) == 'string') {
969
+ if (o == 'getDate') {
970
+ return $.fn.datepicker.apply($(this[0]), tmp_args);
971
+ } else {
972
+ return this.each(function() {
973
+ var $t = $(this);
974
+ $t.datepicker.apply($t, tmp_args);
975
+ });
976
+ }
977
+ } else {
978
+ return this.each(function() {
979
+ var $t = $(this);
980
+ $t.datepicker($.timepicker._newInst($t, o)._defaults);
981
+ });
982
+ }
983
+ }
984
+ });
985
+
986
+ /*
987
+ * Public Utility to parse date and time
988
+ */
989
+ $.datepicker.parseDateTime = function(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
990
+ var parseRes = parseDateTimeInternal(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings);
991
+ if (parseRes.timeObj) {
992
+ var t = parseRes.timeObj;
993
+ parseRes.date.setHours(t.hour, t.minute, t.second, t.millisec);
994
+ }
995
+
996
+ return parseRes.date;
997
+ };
998
+
999
+ /*
1000
+ * Public utility to parse time
1001
+ */
1002
+ $.datepicker.parseTime = function(timeFormat, timeString, options) {
1003
+ var o = extendRemove(extendRemove({}, $.timepicker._defaults), options || {});
1004
+
1005
+ // Strict parse requires the timeString to match the timeFormat exactly
1006
+ var strictParse = function(f, s, o){
1007
+
1008
+ // pattern for standard and localized AM/PM markers
1009
+ var getPatternAmpm = function(amNames, pmNames) {
1010
+ var markers = [];
1011
+ if (amNames) {
1012
+ $.merge(markers, amNames);
1013
+ }
1014
+ if (pmNames) {
1015
+ $.merge(markers, pmNames);
1016
+ }
1017
+ markers = $.map(markers, function(val) {
1018
+ return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&');
1019
+ });
1020
+ return '(' + markers.join('|') + ')?';
1021
+ };
1022
+
1023
+ // figure out position of time elements.. cause js cant do named captures
1024
+ var getFormatPositions = function(timeFormat) {
1025
+ var finds = timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z|'.*?')/g),
1026
+ orders = {
1027
+ h: -1,
1028
+ m: -1,
1029
+ s: -1,
1030
+ l: -1,
1031
+ t: -1,
1032
+ z: -1
1033
+ };
1034
+
1035
+ if (finds) {
1036
+ for (var i = 0; i < finds.length; i++) {
1037
+ if (orders[finds[i].toString().charAt(0)] == -1) {
1038
+ orders[finds[i].toString().charAt(0)] = i + 1;
1039
+ }
1040
+ }
1041
+ }
1042
+ return orders;
1043
+ };
1044
+
1045
+ var regstr = '^' + f.toString()
1046
+ .replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[lz]|'.*?')/g, function (match) {
1047
+ var ml = match.length;
1048
+ switch (match.charAt(0).toLowerCase()) {
1049
+ case 'h': return ml === 1? '(\\d?\\d)':'(\\d{'+ml+'})';
1050
+ case 'm': return ml === 1? '(\\d?\\d)':'(\\d{'+ml+'})';
1051
+ case 's': return ml === 1? '(\\d?\\d)':'(\\d{'+ml+'})';
1052
+ case 'l': return '(\\d?\\d?\\d)';
1053
+ case 'z': return '(z|[-+]\\d\\d:?\\d\\d|\\S+)?';
1054
+ case 't': return getPatternAmpm(o.amNames, o.pmNames);
1055
+ default: // literal escaped in quotes
1056
+ return '(' + match.replace(/\'/g, "").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g, function (m) { return "\\" + m; }) + ')?';
1057
+ }
1058
+ })
1059
+ .replace(/\s/g, '\\s?') +
1060
+ o.timeSuffix + '$',
1061
+ order = getFormatPositions(f),
1062
+ ampm = '',
1063
+ treg;
1064
+
1065
+ treg = s.match(new RegExp(regstr, 'i'));
1066
+
1067
+ var resTime = {
1068
+ hour: 0,
1069
+ minute: 0,
1070
+ second: 0,
1071
+ millisec: 0
1072
+ };
1073
+
1074
+ if (treg) {
1075
+ if (order.t !== -1) {
1076
+ if (treg[order.t] === undefined || treg[order.t].length === 0) {
1077
+ ampm = '';
1078
+ resTime.ampm = '';
1079
+ } else {
1080
+ ampm = $.inArray(treg[order.t].toUpperCase(), o.amNames) !== -1 ? 'AM' : 'PM';
1081
+ resTime.ampm = o[ampm == 'AM' ? 'amNames' : 'pmNames'][0];
1082
+ }
1083
+ }
1084
+
1085
+ if (order.h !== -1) {
1086
+ if (ampm == 'AM' && treg[order.h] == '12') {
1087
+ resTime.hour = 0; // 12am = 0 hour
1088
+ } else {
1089
+ if (ampm == 'PM' && treg[order.h] != '12') {
1090
+ resTime.hour = parseInt(treg[order.h], 10) + 12; // 12pm = 12 hour, any other pm = hour + 12
1091
+ } else {
1092
+ resTime.hour = Number(treg[order.h]);
1093
+ }
1094
+ }
1095
+ }
1096
+
1097
+ if (order.m !== -1) {
1098
+ resTime.minute = Number(treg[order.m]);
1099
+ }
1100
+ if (order.s !== -1) {
1101
+ resTime.second = Number(treg[order.s]);
1102
+ }
1103
+ if (order.l !== -1) {
1104
+ resTime.millisec = Number(treg[order.l]);
1105
+ }
1106
+ if (order.z !== -1 && treg[order.z] !== undefined) {
1107
+ var tz = treg[order.z].toUpperCase();
1108
+ switch (tz.length) {
1109
+ case 1:
1110
+ // Z
1111
+ tz = o.timezoneIso8601 ? 'Z' : '+0000';
1112
+ break;
1113
+ case 5:
1114
+ // +hhmm
1115
+ if (o.timezoneIso8601) {
1116
+ tz = tz.substring(1) == '0000' ? 'Z' : tz.substring(0, 3) + ':' + tz.substring(3);
1117
+ }
1118
+ break;
1119
+ case 6:
1120
+ // +hh:mm
1121
+ if (!o.timezoneIso8601) {
1122
+ tz = tz == 'Z' || tz.substring(1) == '00:00' ? '+0000' : tz.replace(/:/, '');
1123
+ } else {
1124
+ if (tz.substring(1) == '00:00') {
1125
+ tz = 'Z';
1126
+ }
1127
+ }
1128
+ break;
1129
+ }
1130
+ resTime.timezone = tz;
1131
+ }
1132
+
1133
+
1134
+ return resTime;
1135
+ }
1136
+ return false;
1137
+ };// end strictParse
1138
+
1139
+ // First try JS Date, if that fails, use strictParse
1140
+ var looseParse = function(f,s,o){
1141
+ try{
1142
+ var d = new Date('2012-01-01 '+ s);
1143
+ if(isNaN(d.getTime())){
1144
+ d = new Date('2012-01-01T'+ s);
1145
+ if(isNaN(d.getTime())){
1146
+ d = new Date('01/01/2012 '+ s);
1147
+ if(isNaN(d.getTime())){
1148
+ throw "Unable to parse time with native Date: "+ s;
1149
+ }
1150
+ }
1151
+ }
1152
+
1153
+ return {
1154
+ hour: d.getHours(),
1155
+ minute: d.getMinutes(),
1156
+ second: d.getSeconds(),
1157
+ millisec: d.getMilliseconds(),
1158
+ timezone: $.timepicker.timeZoneOffsetString(d)
1159
+ };
1160
+ }
1161
+ catch(err){
1162
+ try{
1163
+ return strictParse(f,s,o);
1164
+ }
1165
+ catch(err2){
1166
+ $.timepicker.log("Unable to parse \ntimeString: "+ s +"\ntimeFormat: "+ f);
1167
+ }
1168
+ }
1169
+ return false;
1170
+ }; // end looseParse
1171
+
1172
+ if(typeof o.parse === "function"){
1173
+ return o.parse(timeFormat, timeString, o)
1174
+ }
1175
+ if(o.parse === 'loose'){
1176
+ return looseParse(timeFormat, timeString, o);
1177
+ }
1178
+ return strictParse(timeFormat, timeString, o);
1179
+ };
1180
+
1181
+ /*
1182
+ * Public utility to format the time
1183
+ * format = string format of the time
1184
+ * time = a {}, not a Date() for timezones
1185
+ * options = essentially the regional[].. amNames, pmNames, ampm
1186
+ */
1187
+ $.datepicker.formatTime = function(format, time, options) {
1188
+ options = options || {};
1189
+ options = $.extend({}, $.timepicker._defaults, options);
1190
+ time = $.extend({
1191
+ hour: 0,
1192
+ minute: 0,
1193
+ second: 0,
1194
+ millisec: 0,
1195
+ timezone: '+0000'
1196
+ }, time);
1197
+
1198
+ var tmptime = format,
1199
+ ampmName = options.amNames[0],
1200
+ hour = parseInt(time.hour, 10);
1201
+
1202
+ if (hour > 11) {
1203
+ ampmName = options.pmNames[0];
1204
+ }
1205
+
1206
+ tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[lz]|('.*?'|".*?"))/g, function(match) {
1207
+ switch (match) {
1208
+ case 'HH':
1209
+ return ('0' + hour).slice(-2);
1210
+ case 'H':
1211
+ return hour;
1212
+ case 'hh':
1213
+ return ('0' + convert24to12(hour)).slice(-2);
1214
+ case 'h':
1215
+ return convert24to12(hour);
1216
+ case 'mm':
1217
+ return ('0' + time.minute).slice(-2);
1218
+ case 'm':
1219
+ return time.minute;
1220
+ case 'ss':
1221
+ return ('0' + time.second).slice(-2);
1222
+ case 's':
1223
+ return time.second;
1224
+ case 'l':
1225
+ return ('00' + time.millisec).slice(-3);
1226
+ case 'z':
1227
+ return time.timezone === null? options.defaultTimezone : time.timezone;
1228
+ case 'T':
1229
+ return ampmName.charAt(0).toUpperCase();
1230
+ case 'TT':
1231
+ return ampmName.toUpperCase();
1232
+ case 't':
1233
+ return ampmName.charAt(0).toLowerCase();
1234
+ case 'tt':
1235
+ return ampmName.toLowerCase();
1236
+ default:
1237
+ return match.replace(/\'/g, "") || "'";
1238
+ }
1239
+ });
1240
+
1241
+ tmptime = $.trim(tmptime);
1242
+ return tmptime;
1243
+ };
1244
+
1245
+ /*
1246
+ * the bad hack :/ override datepicker so it doesnt close on select
1247
+ // inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
1248
+ */
1249
+ $.datepicker._base_selectDate = $.datepicker._selectDate;
1250
+ $.datepicker._selectDate = function(id, dateStr) {
1251
+ var inst = this._getInst($(id)[0]),
1252
+ tp_inst = this._get(inst, 'timepicker');
1253
+
1254
+ if (tp_inst) {
1255
+ tp_inst._limitMinMaxDateTime(inst, true);
1256
+ inst.inline = inst.stay_open = true;
1257
+ //This way the onSelect handler called from calendarpicker get the full dateTime
1258
+ this._base_selectDate(id, dateStr);
1259
+ inst.inline = inst.stay_open = false;
1260
+ this._notifyChange(inst);
1261
+ this._updateDatepicker(inst);
1262
+ } else {
1263
+ this._base_selectDate(id, dateStr);
1264
+ }
1265
+ };
1266
+
1267
+ /*
1268
+ * second bad hack :/ override datepicker so it triggers an event when changing the input field
1269
+ * and does not redraw the datepicker on every selectDate event
1270
+ */
1271
+ $.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
1272
+ $.datepicker._updateDatepicker = function(inst) {
1273
+
1274
+ // don't popup the datepicker if there is another instance already opened
1275
+ var input = inst.input[0];
1276
+ if ($.datepicker._curInst && $.datepicker._curInst != inst && $.datepicker._datepickerShowing && $.datepicker._lastInput != input) {
1277
+ return;
1278
+ }
1279
+
1280
+ if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
1281
+
1282
+ this._base_updateDatepicker(inst);
1283
+
1284
+ // Reload the time control when changing something in the input text field.
1285
+ var tp_inst = this._get(inst, 'timepicker');
1286
+ if (tp_inst) {
1287
+ tp_inst._addTimePicker(inst);
1288
+
1289
+ // if (tp_inst._defaults.useLocalTimezone) { //checks daylight saving with the new date.
1290
+ // var date = new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay, 12);
1291
+ // selectLocalTimeZone(tp_inst, date);
1292
+ // tp_inst._onTimeChange();
1293
+ // }
1294
+ }
1295
+ }
1296
+ };
1297
+
1298
+ /*
1299
+ * third bad hack :/ override datepicker so it allows spaces and colon in the input field
1300
+ */
1301
+ $.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
1302
+ $.datepicker._doKeyPress = function(event) {
1303
+ var inst = $.datepicker._getInst(event.target),
1304
+ tp_inst = $.datepicker._get(inst, 'timepicker');
1305
+
1306
+ if (tp_inst) {
1307
+ if ($.datepicker._get(inst, 'constrainInput')) {
1308
+ var ampm = useAmpm(tp_inst._defaults.timeFormat),
1309
+ dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
1310
+ datetimeChars = tp_inst._defaults.timeFormat.toString()
1311
+ .replace(/[hms]/g, '')
1312
+ .replace(/TT/g, ampm ? 'APM' : '')
1313
+ .replace(/Tt/g, ampm ? 'AaPpMm' : '')
1314
+ .replace(/tT/g, ampm ? 'AaPpMm' : '')
1315
+ .replace(/T/g, ampm ? 'AP' : '')
1316
+ .replace(/tt/g, ampm ? 'apm' : '')
1317
+ .replace(/t/g, ampm ? 'ap' : '') +
1318
+ " " + tp_inst._defaults.separator +
1319
+ tp_inst._defaults.timeSuffix +
1320
+ (tp_inst._defaults.showTimezone ? tp_inst._defaults.timezoneList.join('') : '') +
1321
+ (tp_inst._defaults.amNames.join('')) + (tp_inst._defaults.pmNames.join('')) +
1322
+ dateChars,
1323
+ chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
1324
+ return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
1325
+ }
1326
+ }
1327
+
1328
+ return $.datepicker._base_doKeyPress(event);
1329
+ };
1330
+
1331
+ /*
1332
+ * Fourth bad hack :/ override _updateAlternate function used in inline mode to init altField
1333
+ */
1334
+ $.datepicker._base_updateAlternate = $.datepicker._updateAlternate;
1335
+ /* Update any alternate field to synchronise with the main field. */
1336
+ $.datepicker._updateAlternate = function(inst) {
1337
+ var tp_inst = this._get(inst, 'timepicker');
1338
+ if(tp_inst){
1339
+ var altField = tp_inst._defaults.altField;
1340
+ if (altField) { // update alternate field too
1341
+ var altFormat = tp_inst._defaults.altFormat || tp_inst._defaults.dateFormat,
1342
+ date = this._getDate(inst),
1343
+ formatCfg = $.datepicker._getFormatConfig(inst),
1344
+ altFormattedDateTime = '',
1345
+ altSeparator = tp_inst._defaults.altSeparator ? tp_inst._defaults.altSeparator : tp_inst._defaults.separator,
1346
+ altTimeSuffix = tp_inst._defaults.altTimeSuffix ? tp_inst._defaults.altTimeSuffix : tp_inst._defaults.timeSuffix,
1347
+ altTimeFormat = tp_inst._defaults.altTimeFormat !== null ? tp_inst._defaults.altTimeFormat : tp_inst._defaults.timeFormat;
1348
+
1349
+ altFormattedDateTime += $.datepicker.formatTime(altTimeFormat, tp_inst, tp_inst._defaults) + altTimeSuffix;
1350
+ if(!tp_inst._defaults.timeOnly && !tp_inst._defaults.altFieldTimeOnly && date !== null){
1351
+ if(tp_inst._defaults.altFormat)
1352
+ altFormattedDateTime = $.datepicker.formatDate(tp_inst._defaults.altFormat, date, formatCfg) + altSeparator + altFormattedDateTime;
1353
+ else altFormattedDateTime = tp_inst.formattedDate + altSeparator + altFormattedDateTime;
1354
+ }
1355
+ $(altField).val(altFormattedDateTime);
1356
+ }
1357
+ }
1358
+ else{
1359
+ $.datepicker._base_updateAlternate(inst);
1360
+ }
1361
+ };
1362
+
1363
+ /*
1364
+ * Override key up event to sync manual input changes.
1365
+ */
1366
+ $.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
1367
+ $.datepicker._doKeyUp = function(event) {
1368
+ var inst = $.datepicker._getInst(event.target),
1369
+ tp_inst = $.datepicker._get(inst, 'timepicker');
1370
+
1371
+ if (tp_inst) {
1372
+ if (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {
1373
+ try {
1374
+ $.datepicker._updateDatepicker(inst);
1375
+ } catch (err) {
1376
+ $.timepicker.log(err);
1377
+ }
1378
+ }
1379
+ }
1380
+
1381
+ return $.datepicker._base_doKeyUp(event);
1382
+ };
1383
+
1384
+ /*
1385
+ * override "Today" button to also grab the time.
1386
+ */
1387
+ $.datepicker._base_gotoToday = $.datepicker._gotoToday;
1388
+ $.datepicker._gotoToday = function(id) {
1389
+ var inst = this._getInst($(id)[0]),
1390
+ $dp = inst.dpDiv;
1391
+ this._base_gotoToday(id);
1392
+ var tp_inst = this._get(inst, 'timepicker');
1393
+ selectLocalTimeZone(tp_inst);
1394
+ var now = new Date();
1395
+ this._setTime(inst, now);
1396
+ $('.ui-datepicker-today', $dp).click();
1397
+ };
1398
+
1399
+ /*
1400
+ * Disable & enable the Time in the datetimepicker
1401
+ */
1402
+ $.datepicker._disableTimepickerDatepicker = function(target) {
1403
+ var inst = this._getInst(target);
1404
+ if (!inst) {
1405
+ return;
1406
+ }
1407
+
1408
+ var tp_inst = this._get(inst, 'timepicker');
1409
+ $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
1410
+ if (tp_inst) {
1411
+ tp_inst._defaults.showTimepicker = false;
1412
+ tp_inst._updateDateTime(inst);
1413
+ }
1414
+ };
1415
+
1416
+ $.datepicker._enableTimepickerDatepicker = function(target) {
1417
+ var inst = this._getInst(target);
1418
+ if (!inst) {
1419
+ return;
1420
+ }
1421
+
1422
+ var tp_inst = this._get(inst, 'timepicker');
1423
+ $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
1424
+ if (tp_inst) {
1425
+ tp_inst._defaults.showTimepicker = true;
1426
+ tp_inst._addTimePicker(inst); // Could be disabled on page load
1427
+ tp_inst._updateDateTime(inst);
1428
+ }
1429
+ };
1430
+
1431
+ /*
1432
+ * Create our own set time function
1433
+ */
1434
+ $.datepicker._setTime = function(inst, date) {
1435
+ var tp_inst = this._get(inst, 'timepicker');
1436
+ if (tp_inst) {
1437
+ var defaults = tp_inst._defaults;
1438
+
1439
+ // calling _setTime with no date sets time to defaults
1440
+ tp_inst.hour = date ? date.getHours() : defaults.hour;
1441
+ tp_inst.minute = date ? date.getMinutes() : defaults.minute;
1442
+ tp_inst.second = date ? date.getSeconds() : defaults.second;
1443
+ tp_inst.millisec = date ? date.getMilliseconds() : defaults.millisec;
1444
+
1445
+ //check if within min/max times..
1446
+ tp_inst._limitMinMaxDateTime(inst, true);
1447
+
1448
+ tp_inst._onTimeChange();
1449
+ tp_inst._updateDateTime(inst);
1450
+ }
1451
+ };
1452
+
1453
+ /*
1454
+ * Create new public method to set only time, callable as $().datepicker('setTime', date)
1455
+ */
1456
+ $.datepicker._setTimeDatepicker = function(target, date, withDate) {
1457
+ var inst = this._getInst(target);
1458
+ if (!inst) {
1459
+ return;
1460
+ }
1461
+
1462
+ var tp_inst = this._get(inst, 'timepicker');
1463
+
1464
+ if (tp_inst) {
1465
+ this._setDateFromField(inst);
1466
+ var tp_date;
1467
+ if (date) {
1468
+ if (typeof date == "string") {
1469
+ tp_inst._parseTime(date, withDate);
1470
+ tp_date = new Date();
1471
+ tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
1472
+ } else {
1473
+ tp_date = new Date(date.getTime());
1474
+ }
1475
+ if (tp_date.toString() == 'Invalid Date') {
1476
+ tp_date = undefined;
1477
+ }
1478
+ this._setTime(inst, tp_date);
1479
+ }
1480
+ }
1481
+
1482
+ };
1483
+
1484
+ /*
1485
+ * override setDate() to allow setting time too within Date object
1486
+ */
1487
+ $.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
1488
+ $.datepicker._setDateDatepicker = function(target, date) {
1489
+ var inst = this._getInst(target);
1490
+ if (!inst) {
1491
+ return;
1492
+ }
1493
+
1494
+ var tp_date = (date instanceof Date) ? new Date(date.getTime()) : date;
1495
+
1496
+ this._updateDatepicker(inst);
1497
+ this._base_setDateDatepicker.apply(this, arguments);
1498
+ this._setTimeDatepicker(target, tp_date, true);
1499
+ };
1500
+
1501
+ /*
1502
+ * override getDate() to allow getting time too within Date object
1503
+ */
1504
+ $.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
1505
+ $.datepicker._getDateDatepicker = function(target, noDefault) {
1506
+ var inst = this._getInst(target);
1507
+ if (!inst) {
1508
+ return;
1509
+ }
1510
+
1511
+ var tp_inst = this._get(inst, 'timepicker');
1512
+
1513
+ if (tp_inst) {
1514
+ // if it hasn't yet been defined, grab from field
1515
+ if(inst.lastVal === undefined){
1516
+ this._setDateFromField(inst, noDefault);
1517
+ }
1518
+
1519
+ var date = this._getDate(inst);
1520
+ if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) {
1521
+ date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
1522
+ }
1523
+ return date;
1524
+ }
1525
+ return this._base_getDateDatepicker(target, noDefault);
1526
+ };
1527
+
1528
+ /*
1529
+ * override parseDate() because UI 1.8.14 throws an error about "Extra characters"
1530
+ * An option in datapicker to ignore extra format characters would be nicer.
1531
+ */
1532
+ $.datepicker._base_parseDate = $.datepicker.parseDate;
1533
+ $.datepicker.parseDate = function(format, value, settings) {
1534
+ var date;
1535
+ try {
1536
+ date = this._base_parseDate(format, value, settings);
1537
+ } catch (err) {
1538
+ // Hack! The error message ends with a colon, a space, and
1539
+ // the "extra" characters. We rely on that instead of
1540
+ // attempting to perfectly reproduce the parsing algorithm.
1541
+ date = this._base_parseDate(format, value.substring(0,value.length-(err.length-err.indexOf(':')-2)), settings);
1542
+ $.timepicker.log("Error parsing the date string: " + err + "\ndate string = " + value + "\ndate format = " + format);
1543
+ }
1544
+ return date;
1545
+ };
1546
+
1547
+ /*
1548
+ * override formatDate to set date with time to the input
1549
+ */
1550
+ $.datepicker._base_formatDate = $.datepicker._formatDate;
1551
+ $.datepicker._formatDate = function(inst, day, month, year) {
1552
+ var tp_inst = this._get(inst, 'timepicker');
1553
+ if (tp_inst) {
1554
+ tp_inst._updateDateTime(inst);
1555
+ return tp_inst.$input.val();
1556
+ }
1557
+ return this._base_formatDate(inst);
1558
+ };
1559
+
1560
+ /*
1561
+ * override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
1562
+ */
1563
+ $.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
1564
+ $.datepicker._optionDatepicker = function(target, name, value) {
1565
+ var inst = this._getInst(target),
1566
+ name_clone;
1567
+ if (!inst) {
1568
+ return null;
1569
+ }
1570
+
1571
+ var tp_inst = this._get(inst, 'timepicker');
1572
+ if (tp_inst) {
1573
+ var min = null,
1574
+ max = null,
1575
+ onselect = null,
1576
+ overrides = tp_inst._defaults.evnts,
1577
+ fns = {},
1578
+ prop;
1579
+ if (typeof name == 'string') { // if min/max was set with the string
1580
+ if (name === 'minDate' || name === 'minDateTime') {
1581
+ min = value;
1582
+ } else if (name === 'maxDate' || name === 'maxDateTime') {
1583
+ max = value;
1584
+ } else if (name === 'onSelect') {
1585
+ onselect = value;
1586
+ } else if (overrides.hasOwnProperty(name)) {
1587
+ if (typeof (value) === 'undefined') {
1588
+ return overrides[name];
1589
+ }
1590
+ fns[name] = value;
1591
+ name_clone = {}; //empty results in exiting function after overrides updated
1592
+ }
1593
+ } else if (typeof name == 'object') { //if min/max was set with the JSON
1594
+ if (name.minDate) {
1595
+ min = name.minDate;
1596
+ } else if (name.minDateTime) {
1597
+ min = name.minDateTime;
1598
+ } else if (name.maxDate) {
1599
+ max = name.maxDate;
1600
+ } else if (name.maxDateTime) {
1601
+ max = name.maxDateTime;
1602
+ }
1603
+ for (prop in overrides) {
1604
+ if (overrides.hasOwnProperty(prop) && name[prop]) {
1605
+ fns[prop] = name[prop];
1606
+ }
1607
+ }
1608
+ }
1609
+ for (prop in fns) {
1610
+ if (fns.hasOwnProperty(prop)) {
1611
+ overrides[prop] = fns[prop];
1612
+ if (!name_clone) { name_clone = $.extend({}, name);}
1613
+ delete name_clone[prop];
1614
+ }
1615
+ }
1616
+ if (name_clone && isEmptyObject(name_clone)) { return; }
1617
+ if (min) { //if min was set
1618
+ if (min === 0) {
1619
+ min = new Date();
1620
+ } else {
1621
+ min = new Date(min);
1622
+ }
1623
+ tp_inst._defaults.minDate = min;
1624
+ tp_inst._defaults.minDateTime = min;
1625
+ } else if (max) { //if max was set
1626
+ if (max === 0) {
1627
+ max = new Date();
1628
+ } else {
1629
+ max = new Date(max);
1630
+ }
1631
+ tp_inst._defaults.maxDate = max;
1632
+ tp_inst._defaults.maxDateTime = max;
1633
+ } else if (onselect) {
1634
+ tp_inst._defaults.onSelect = onselect;
1635
+ }
1636
+ }
1637
+ if (value === undefined) {
1638
+ return this._base_optionDatepicker.call($.datepicker, target, name);
1639
+ }
1640
+ return this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);
1641
+ };
1642
+ /*
1643
+ * jQuery isEmptyObject does not check hasOwnProperty - if someone has added to the object prototype,
1644
+ * it will return false for all objects
1645
+ */
1646
+ var isEmptyObject = function(obj) {
1647
+ var prop;
1648
+ for (prop in obj) {
1649
+ if (obj.hasOwnProperty(obj)) {
1650
+ return false;
1651
+ }
1652
+ }
1653
+ return true;
1654
+ };
1655
+
1656
+ /*
1657
+ * jQuery extend now ignores nulls!
1658
+ */
1659
+ var extendRemove = function(target, props) {
1660
+ $.extend(target, props);
1661
+ for (var name in props) {
1662
+ if (props[name] === null || props[name] === undefined) {
1663
+ target[name] = props[name];
1664
+ }
1665
+ }
1666
+ return target;
1667
+ };
1668
+
1669
+ /*
1670
+ * Determine by the time format if should use ampm
1671
+ * Returns true if should use ampm, false if not
1672
+ */
1673
+ var useAmpm = function(timeFormat){
1674
+ return (timeFormat.indexOf('t') !== -1 && timeFormat.indexOf('h') !== -1);
1675
+ };
1676
+
1677
+ /*
1678
+ * Converts 24 hour format into 12 hour
1679
+ * Returns 12 hour without leading 0
1680
+ */
1681
+ var convert24to12 = function(hour) {
1682
+ if (hour > 12) {
1683
+ hour = hour - 12;
1684
+ }
1685
+
1686
+ if (hour == 0) {
1687
+ hour = 12;
1688
+ }
1689
+
1690
+ return String(hour);
1691
+ };
1692
+
1693
+ /*
1694
+ * Splits datetime string into date ans time substrings.
1695
+ * Throws exception when date can't be parsed
1696
+ * Returns [dateString, timeString]
1697
+ */
1698
+ var splitDateTime = function(dateFormat, dateTimeString, dateSettings, timeSettings) {
1699
+ try {
1700
+ // The idea is to get the number separator occurances in datetime and the time format requested (since time has
1701
+ // fewer unknowns, mostly numbers and am/pm). We will use the time pattern to split.
1702
+ var separator = timeSettings && timeSettings.separator ? timeSettings.separator : $.timepicker._defaults.separator,
1703
+ format = timeSettings && timeSettings.timeFormat ? timeSettings.timeFormat : $.timepicker._defaults.timeFormat,
1704
+ timeParts = format.split(separator), // how many occurances of separator may be in our format?
1705
+ timePartsLen = timeParts.length,
1706
+ allParts = dateTimeString.split(separator),
1707
+ allPartsLen = allParts.length;
1708
+
1709
+ if (allPartsLen > 1) {
1710
+ return [
1711
+ allParts.splice(0,allPartsLen-timePartsLen).join(separator),
1712
+ allParts.splice(0,timePartsLen).join(separator)
1713
+ ];
1714
+ }
1715
+
1716
+ } catch (err) {
1717
+ $.timepicker.log('Could not split the date from the time. Please check the following datetimepicker options' +
1718
+ "\nthrown error: " + err +
1719
+ "\ndateTimeString" + dateTimeString +
1720
+ "\ndateFormat = " + dateFormat +
1721
+ "\nseparator = " + timeSettings.separator +
1722
+ "\ntimeFormat = " + timeSettings.timeFormat);
1723
+
1724
+ if (err.indexOf(":") >= 0) {
1725
+ // Hack! The error message ends with a colon, a space, and
1726
+ // the "extra" characters. We rely on that instead of
1727
+ // attempting to perfectly reproduce the parsing algorithm.
1728
+ var dateStringLength = dateTimeString.length - (err.length - err.indexOf(':') - 2),
1729
+ timeString = dateTimeString.substring(dateStringLength);
1730
+
1731
+ return [$.trim(dateTimeString.substring(0, dateStringLength)), $.trim(dateTimeString.substring(dateStringLength))];
1732
+
1733
+ } else {
1734
+ throw err;
1735
+ }
1736
+ }
1737
+ return [dateTimeString, ''];
1738
+ };
1739
+
1740
+ /*
1741
+ * Internal function to parse datetime interval
1742
+ * Returns: {date: Date, timeObj: Object}, where
1743
+ * date - parsed date without time (type Date)
1744
+ * timeObj = {hour: , minute: , second: , millisec: } - parsed time. Optional
1745
+ */
1746
+ var parseDateTimeInternal = function(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
1747
+ var date;
1748
+ var splitRes = splitDateTime(dateFormat, dateTimeString, dateSettings, timeSettings);
1749
+ date = $.datepicker._base_parseDate(dateFormat, splitRes[0], dateSettings);
1750
+ if (splitRes[1] !== '') {
1751
+ var timeString = splitRes[1],
1752
+ parsedTime = $.datepicker.parseTime(timeFormat, timeString, timeSettings);
1753
+
1754
+ if (parsedTime === null) {
1755
+ throw 'Wrong time format';
1756
+ }
1757
+ return {
1758
+ date: date,
1759
+ timeObj: parsedTime
1760
+ };
1761
+ } else {
1762
+ return {
1763
+ date: date
1764
+ };
1765
+ }
1766
+ };
1767
+
1768
+ /*
1769
+ * Internal function to set timezone_select to the local timezone
1770
+ */
1771
+ var selectLocalTimeZone = function(tp_inst, date) {
1772
+ if (tp_inst && tp_inst.timezone_select) {
1773
+ tp_inst._defaults.useLocalTimezone = true;
1774
+ var now = typeof date !== 'undefined' ? date : new Date();
1775
+ var tzoffset = $.timepicker.timeZoneOffsetString(now);
1776
+ if (tp_inst._defaults.timezoneIso8601) {
1777
+ tzoffset = tzoffset.substring(0, 3) + ':' + tzoffset.substring(3);
1778
+ }
1779
+ tp_inst.timezone_select.val(tzoffset);
1780
+ }
1781
+ };
1782
+
1783
+ /*
1784
+ * Create a Singleton Insance
1785
+ */
1786
+ $.timepicker = new Timepicker();
1787
+
1788
+ /**
1789
+ * Get the timezone offset as string from a date object (eg '+0530' for UTC+5.5)
1790
+ * @param date
1791
+ * @return string
1792
+ */
1793
+ $.timepicker.timeZoneOffsetString = function(date) {
1794
+ var off = date.getTimezoneOffset() * -1,
1795
+ minutes = off % 60,
1796
+ hours = (off - minutes) / 60;
1797
+ return (off >= 0 ? '+' : '-') + ('0' + (hours * 101).toString()).slice(-2) + ('0' + (minutes * 101).toString()).slice(-2);
1798
+ };
1799
+
1800
+ /**
1801
+ * Calls `timepicker()` on the `startTime` and `endTime` elements, and configures them to
1802
+ * enforce date range limits.
1803
+ * n.b. The input value must be correctly formatted (reformatting is not supported)
1804
+ * @param Element startTime
1805
+ * @param Element endTime
1806
+ * @param obj options Options for the timepicker() call
1807
+ * @return jQuery
1808
+ */
1809
+ $.timepicker.timeRange = function(startTime, endTime, options) {
1810
+ return $.timepicker.handleRange('timepicker', startTime, endTime, options);
1811
+ };
1812
+
1813
+ /**
1814
+ * Calls `datetimepicker` on the `startTime` and `endTime` elements, and configures them to
1815
+ * enforce date range limits.
1816
+ * @param Element startTime
1817
+ * @param Element endTime
1818
+ * @param obj options Options for the `timepicker()` call. Also supports `reformat`,
1819
+ * a boolean value that can be used to reformat the input values to the `dateFormat`.
1820
+ * @param string method Can be used to specify the type of picker to be added
1821
+ * @return jQuery
1822
+ */
1823
+ $.timepicker.dateTimeRange = function(startTime, endTime, options) {
1824
+ $.timepicker.dateRange(startTime, endTime, options, 'datetimepicker');
1825
+ };
1826
+
1827
+ /**
1828
+ * Calls `method` on the `startTime` and `endTime` elements, and configures them to
1829
+ * enforce date range limits.
1830
+ * @param Element startTime
1831
+ * @param Element endTime
1832
+ * @param obj options Options for the `timepicker()` call. Also supports `reformat`,
1833
+ * a boolean value that can be used to reformat the input values to the `dateFormat`.
1834
+ * @param string method Can be used to specify the type of picker to be added
1835
+ * @return jQuery
1836
+ */
1837
+ $.timepicker.dateRange = function(startTime, endTime, options, method) {
1838
+ method = method || 'datepicker';
1839
+ $.timepicker.handleRange(method, startTime, endTime, options);
1840
+ };
1841
+
1842
+ /**
1843
+ * Calls `method` on the `startTime` and `endTime` elements, and configures them to
1844
+ * enforce date range limits.
1845
+ * @param string method Can be used to specify the type of picker to be added
1846
+ * @param Element startTime
1847
+ * @param Element endTime
1848
+ * @param obj options Options for the `timepicker()` call. Also supports `reformat`,
1849
+ * a boolean value that can be used to reformat the input values to the `dateFormat`.
1850
+ * @return jQuery
1851
+ */
1852
+ $.timepicker.handleRange = function(method, startTime, endTime, options) {
1853
+ $.fn[method].call(startTime, $.extend({
1854
+ onClose: function(dateText, inst) {
1855
+ checkDates(this, endTime, dateText);
1856
+ },
1857
+ onSelect: function(selectedDateTime) {
1858
+ selected(this, endTime, 'minDate');
1859
+ }
1860
+ }, options, options.start));
1861
+ $.fn[method].call(endTime, $.extend({
1862
+ onClose: function(dateText, inst) {
1863
+ checkDates(this, startTime, dateText);
1864
+ },
1865
+ onSelect: function(selectedDateTime) {
1866
+ selected(this, startTime, 'maxDate');
1867
+ }
1868
+ }, options, options.end));
1869
+ // timepicker doesn't provide access to its 'timeFormat' option,
1870
+ // nor could I get datepicker.formatTime() to behave with times, so I
1871
+ // have disabled reformatting for timepicker
1872
+ if (method != 'timepicker' && options.reformat) {
1873
+ $([startTime, endTime]).each(function() {
1874
+ var format = $(this)[method].call($(this), 'option', 'dateFormat'),
1875
+ date = new Date($(this).val());
1876
+ if ($(this).val() && date) {
1877
+ $(this).val($.datepicker.formatDate(format, date));
1878
+ }
1879
+ });
1880
+ }
1881
+ checkDates(startTime, endTime, startTime.val());
1882
+
1883
+ function checkDates(changed, other, dateText) {
1884
+ if (other.val() && (new Date(startTime.val()) > new Date(endTime.val()))) {
1885
+ other.val(dateText);
1886
+ }
1887
+ }
1888
+ selected(startTime, endTime, 'minDate');
1889
+ selected(endTime, startTime, 'maxDate');
1890
+
1891
+ function selected(changed, other, option) {
1892
+ if (!$(changed).val()) {
1893
+ return;
1894
+ }
1895
+ var date = $(changed)[method].call($(changed), 'getDate');
1896
+ // timepicker doesn't implement 'getDate' and returns a jQuery
1897
+ if (date.getTime) {
1898
+ $(other)[method].call($(other), 'option', option, date);
1899
+ }
1900
+ }
1901
+ return $([startTime.get(0), endTime.get(0)]);
1902
+ };
1903
+
1904
+ /**
1905
+ * Log error or data to the console during error or debugging
1906
+ * @param Object err pass any type object to log to the console during error or debugging
1907
+ * @return void
1908
+ */
1909
+ $.timepicker.log = function(err){
1910
+ if(window.console)
1911
+ console.log(err);
1912
+ };
1913
+
1914
+ /*
1915
+ * Keep up with the version
1916
+ */
1917
+ $.timepicker.version = "1.2";
1918
+
1919
+ })(jQuery);
js/localization/jquery-ui-timepicker-af.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Afrikaans translation for the jQuery Timepicker Addon */
2
+ /* Written by Deon Heyns */
3
+ (function($) {
4
+ $.timepicker.regional['af'] = {
5
+ timeOnlyTitle: 'Kies Tyd',
6
+ timeText: 'Tyd ',
7
+ hourText: 'Ure ',
8
+ minuteText: 'Minute',
9
+ secondText: 'Sekondes',
10
+ millisecText: 'Millisekondes',
11
+ timezoneText: 'Tydsone',
12
+ currentText: 'Huidige Tyd',
13
+ closeText: 'Klaar',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['af']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-bg.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Bulgarian translation for the jQuery Timepicker Addon */
2
+ /* Written by Plamen Kovandjiev */
3
+ (function($) {
4
+ $.timepicker.regional['bg'] = {
5
+ timeOnlyTitle: 'Изберете време',
6
+ timeText: 'Време',
7
+ hourText: 'Час',
8
+ minuteText: 'Минути',
9
+ secondText: 'Секунди',
10
+ millisecText: 'Милисекунди',
11
+ timezoneText: 'Часови пояс',
12
+ currentText: 'Сега',
13
+ closeText: 'Затвори',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['bg']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-ca.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Catalan translation for the jQuery Timepicker Addon */
2
+ /* Written by Sergi Faber */
3
+ (function($) {
4
+ $.timepicker.regional['ca'] = {
5
+ timeOnlyTitle: 'Escollir una hora',
6
+ timeText: 'Hora',
7
+ hourText: 'Hores',
8
+ minuteText: 'Minuts',
9
+ secondText: 'Segons',
10
+ millisecText: 'Milisegons',
11
+ timezoneText: 'Fus horari',
12
+ currentText: 'Ara',
13
+ closeText: 'Tancar',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['ca']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-cs.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Czech translation for the jQuery Timepicker Addon */
2
+ /* Written by Ondřej Vodáček */
3
+ (function($) {
4
+ $.timepicker.regional['cs'] = {
5
+ timeOnlyTitle: 'Vyberte čas',
6
+ timeText: 'Čas',
7
+ hourText: 'Hodiny',
8
+ minuteText: 'Minuty',
9
+ secondText: 'Vteřiny',
10
+ millisecText: 'Milisekundy',
11
+ timezoneText: 'Časové pásmo',
12
+ currentText: 'Nyní',
13
+ closeText: 'Zavřít',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['dop.', 'AM', 'A'],
16
+ pmNames: ['odp.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['cs']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-de.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* German translation for the jQuery Timepicker Addon */
2
+ /* Written by Marvin */
3
+ (function($) {
4
+ $.timepicker.regional['de'] = {
5
+ timeOnlyTitle: 'Zeit Wählen',
6
+ timeText: 'Zeit',
7
+ hourText: 'Stunde',
8
+ minuteText: 'Minute',
9
+ secondText: 'Sekunde',
10
+ millisecText: 'Millisekunde',
11
+ timezoneText: 'Zeitzone',
12
+ currentText: 'Jetzt',
13
+ closeText: 'Fertig',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['vorm.', 'AM', 'A'],
16
+ pmNames: ['nachm.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['de']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-el.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Hellenic translation for the jQuery Timepicker Addon */
2
+ /* Written by Christos Pontikis */
3
+ (function($) {
4
+ $.timepicker.regional['el'] = {
5
+ timeOnlyTitle: 'Επιλογή ώρας',
6
+ timeText: 'Ώρα',
7
+ hourText: 'Ώρες',
8
+ minuteText: 'Λεπτά',
9
+ secondText: 'Δευτερόλεπτα',
10
+ millisecText: 'μιλιδευτερόλεπτο',
11
+ timezoneText: 'Ζώνη ώρας',
12
+ currentText: 'Τώρα',
13
+ closeText: 'Κλείσιμο',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['π.μ.', 'AM', 'A'],
16
+ pmNames: ['μ.μ.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['el']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-es.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Spanish translation for the jQuery Timepicker Addon */
2
+ /* Written by Ianaré Sévi */
3
+ (function($) {
4
+ $.timepicker.regional['es'] = {
5
+ timeOnlyTitle: 'Elegir una hora',
6
+ timeText: 'Hora',
7
+ hourText: 'Horas',
8
+ minuteText: 'Minutos',
9
+ secondText: 'Segundos',
10
+ millisecText: 'Milisegundos',
11
+ timezoneText: 'Huso horario',
12
+ currentText: 'Ahora',
13
+ closeText: 'Cerrar',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['a.m.', 'AM', 'A'],
16
+ pmNames: ['p.m.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['es']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-et.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Estonian translation for the jQuery Timepicker Addon */
2
+ /* Written by Karl Sutt (karl@sutt.ee) */
3
+ (function($) {
4
+ $.timepicker.regional['et'] = {
5
+ timeOnlyTitle: 'Vali aeg',
6
+ timeText: 'Aeg',
7
+ hourText: 'Tund',
8
+ minuteText: 'Minut',
9
+ secondText: 'Sekund',
10
+ millisecText: 'Millisekundis',
11
+ timezoneText: 'Ajavöönd',
12
+ currentText: 'Praegu',
13
+ closeText: 'Valmis',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['et']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-eu.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Basque trannslation for JQuery Timepicker Addon
2
+ /* Translated by Xabi Fer */
3
+ (function($) {
4
+ $.timepicker.regional['eu'] = {
5
+ timeOnlyTitle: 'Aukeratu ordua',
6
+ timeText: 'Ordua',
7
+ hourText: 'Orduak',
8
+ minuteText: 'Minutuak',
9
+ secondText: 'Segunduak',
10
+ millisecText: 'Milisegunduak',
11
+ timezoneText: 'Ordu-eremua',
12
+ currentText: 'Orain',
13
+ closeText: 'Itxi',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['a.m.', 'AM', 'A'],
16
+ pmNames: ['p.m.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['eu']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-fi.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Finnish translation for the jQuery Timepicker Addon */
2
+ /* Written by Juga Paazmaya (http://github.com/paazmaya) */
3
+ (function($) {
4
+ $.timepicker.regional['fi'] = {
5
+ timeOnlyTitle: 'Valitse aika',
6
+ timeText: 'Aika',
7
+ hourText: 'Tunti',
8
+ minuteText: 'Minuutti',
9
+ secondText: 'Sekunti',
10
+ millisecText: 'Millisekunnin',
11
+ timezoneText: 'Aikavyöhyke',
12
+ currentText: 'Nyt',
13
+ closeText: 'Sulje',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['ap.', 'AM', 'A'],
16
+ pmNames: ['ip.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['fi']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-fr.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* French translation for the jQuery Timepicker Addon */
2
+ /* Written by Thomas Lété */
3
+ (function($) {
4
+ $.timepicker.regional['fr'] = {
5
+ timeOnlyTitle: 'Choisir une heure',
6
+ timeText: 'Heure',
7
+ hourText: 'Heures',
8
+ minuteText: 'Minutes',
9
+ secondText: 'Secondes',
10
+ millisecText: 'Millisecondes',
11
+ timezoneText: 'Fuseau horaire',
12
+ currentText: 'Maintenant',
13
+ closeText: 'Terminé',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['fr']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-gl.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Galician translation for the jQuery Timepicker Addon */
2
+ /* Written by David Barral */
3
+ (function($) {
4
+ $.timepicker.regional['gl'] = {
5
+ timeOnlyTitle: 'Elixir unha hora',
6
+ timeText: 'Hora',
7
+ hourText: 'Horas',
8
+ minuteText: 'Minutos',
9
+ secondText: 'Segundos',
10
+ millisecText: 'Milisegundos',
11
+ timezoneText: 'Fuso horario',
12
+ currentText: 'Agora',
13
+ closeText: 'Pechar',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['a.m.', 'AM', 'A'],
16
+ pmNames: ['p.m.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['gl']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-he.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Hebrew translation for the jQuery Timepicker Addon */
2
+ /* Written by Lior Lapid */
3
+ (function($) {
4
+ $.timepicker.regional["he"] = {
5
+ timeOnlyTitle: "בחירת זמן",
6
+ timeText: "שעה",
7
+ hourText: "שעות",
8
+ minuteText: "דקות",
9
+ secondText: "שניות",
10
+ millisecText: "אלפית השנייה",
11
+ timezoneText: "אזור זמן",
12
+ currentText: "עכשיו",
13
+ closeText:"סגור",
14
+ timeFormat: "HH:mm",
15
+ amNames: ['לפנה"צ', 'AM', 'A'],
16
+ pmNames: ['אחה"צ', 'PM', 'P'],
17
+ isRTL: true
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional["he"]);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-hu.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Hungarian translation for the jQuery Timepicker Addon */
2
+ /* Written by Vas Gábor */
3
+ (function($) {
4
+ $.timepicker.regional['hu'] = {
5
+ timeOnlyTitle: 'Válasszon időpontot',
6
+ timeText: 'Idő',
7
+ hourText: 'Óra',
8
+ minuteText: 'Perc',
9
+ secondText: 'Másodperc',
10
+ millisecText: 'Milliszekundumos',
11
+ timezoneText: 'Időzóna',
12
+ currentText: 'Most',
13
+ closeText: 'Kész',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['de.', 'AM', 'A'],
16
+ pmNames: ['du.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['hu']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-id.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Indonesian translation for the jQuery Timepicker Addon */
2
+ /* Written by Nia */
3
+ (function($) {
4
+ $.timepicker.regional['id'] = {
5
+ timeOnlyTitle: 'Pilih Waktu',
6
+ timeText: 'Waktu',
7
+ hourText: 'Pukul',
8
+ minuteText: 'Menit',
9
+ secondText: 'Detik',
10
+ millisecText: 'Milidetik',
11
+ timezoneText: 'Zona Waktu',
12
+ currentText: 'Sekarang',
13
+ closeText: 'OK',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['id']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-it.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Italian translation for the jQuery Timepicker Addon */
2
+ /* Written by Marco "logicoder" Del Tongo */
3
+ (function($) {
4
+ $.timepicker.regional['it'] = {
5
+ timeOnlyTitle: 'Scegli orario',
6
+ timeText: 'Orario',
7
+ hourText: 'Ora',
8
+ minuteText: 'Minuto',
9
+ secondText: 'Secondo',
10
+ millisecText: 'Millisecondo',
11
+ timezoneText: 'Fuso orario',
12
+ currentText: 'Adesso',
13
+ closeText: 'Chiudi',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['m.', 'AM', 'A'],
16
+ pmNames: ['p.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['it']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-ja.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Japanese translation for the jQuery Timepicker Addon */
2
+ /* Written by Jun Omae */
3
+ (function($) {
4
+ $.timepicker.regional['ja'] = {
5
+ timeOnlyTitle: '時間を選択',
6
+ timeText: '時間',
7
+ hourText: '時',
8
+ minuteText: '分',
9
+ secondText: '秒',
10
+ millisecText: 'ミリ秒',
11
+ timezoneText: 'タイムゾーン',
12
+ currentText: '現時刻',
13
+ closeText: '閉じる',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['午前', 'AM', 'A'],
16
+ pmNames: ['午後', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['ja']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-ko.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Korean translation for the jQuery Timepicker Addon */
2
+ /* Written by Genie */
3
+ (function($) {
4
+ $.timepicker.regional['ko'] = {
5
+ timeOnlyTitle: '시간 선택',
6
+ timeText: '시간',
7
+ hourText: '시',
8
+ minuteText: '분',
9
+ secondText: '초',
10
+ millisecText: '밀리초',
11
+ timezoneText: '표준 시간대',
12
+ currentText: '현재 시각',
13
+ closeText: '닫기',
14
+ timeFormat: 'tt h:mm',
15
+ amNames: ['오전', 'AM', 'A'],
16
+ pmNames: ['오후', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['ko']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-lt.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Lithuanian translation for the jQuery Timepicker Addon */
2
+ /* Written by Irmantas Šiupšinskas */
3
+ (function($) {
4
+ $.timepicker.regional['lt'] = {
5
+ timeOnlyTitle: 'Pasirinkite laiką',
6
+ timeText: 'Laikas',
7
+ hourText: 'Valandos',
8
+ minuteText: 'Minutės',
9
+ secondText: 'Sekundės',
10
+ millisecText: 'Milisekundės',
11
+ timezoneText: 'Laiko zona',
12
+ currentText: 'Dabar',
13
+ closeText: 'Uždaryti',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['priešpiet', 'AM', 'A'],
16
+ pmNames: ['popiet', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['lt']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-nl.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Dutch translation for the jQuery Timepicker Addon */
2
+ /* Written by Martijn van der Lee */
3
+ (function($) {
4
+ $.timepicker.regional['nl'] = {
5
+ timeOnlyTitle: 'Tijdstip',
6
+ timeText: 'Tijd',
7
+ hourText: 'Uur',
8
+ minuteText: 'Minuut',
9
+ secondText: 'Seconde',
10
+ millisecText: 'Milliseconde',
11
+ timezoneText: 'Tijdzone',
12
+ currentText: 'Vandaag',
13
+ closeText: 'Sluiten',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['nl']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-no.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Norwegian translation for the jQuery Timepicker Addon */
2
+ /* Written by Morten Hauan (http://hauan.me) */
3
+ (function($) {
4
+ $.timepicker.regional['no'] = {
5
+ timeOnlyTitle: 'Velg tid',
6
+ timeText: 'Tid',
7
+ hourText: 'Time',
8
+ minuteText: 'Minutt',
9
+ secondText: 'Sekund',
10
+ millisecText: 'Millisekund',
11
+ timezoneText: 'Tidssone',
12
+ currentText: 'Nå',
13
+ closeText: 'Lukk',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['am', 'AM', 'A'],
16
+ pmNames: ['pm', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['no']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-pl.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Polish translation for the jQuery Timepicker Addon */
2
+ /* Written by Michał Pena */
3
+ (function($) {
4
+ $.timepicker.regional['pl'] = {
5
+ timeOnlyTitle: 'Wybierz godzinę',
6
+ timeText: 'Czas',
7
+ hourText: 'Godzina',
8
+ minuteText: 'Minuta',
9
+ secondText: 'Sekunda',
10
+ millisecText: 'Milisekunda',
11
+ timezoneText: 'Strefa czasowa',
12
+ currentText: 'Teraz',
13
+ closeText: 'Gotowe',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['pl']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-pt-BR.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Brazilian Portuguese translation for the jQuery Timepicker Addon */
2
+ /* Written by Diogo Damiani (diogodamiani@gmail.com) */
3
+ (function ($) {
4
+ $.timepicker.regional['pt-BR'] = {
5
+ timeOnlyTitle: 'Escolha a horário',
6
+ timeText: 'Horário',
7
+ hourText: 'Hora',
8
+ minuteText: 'Minutos',
9
+ secondText: 'Segundos',
10
+ millisecText: 'Milissegundos',
11
+ timezoneText: 'Fuso horário',
12
+ currentText: 'Agora',
13
+ closeText: 'Fechar',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['a.m.', 'AM', 'A'],
16
+ pmNames: ['p.m.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['pt-BR']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-pt.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Portuguese translation for the jQuery Timepicker Addon */
2
+ /* Written by Luan Almeida */
3
+ (function($) {
4
+ $.timepicker.regional['pt'] = {
5
+ timeOnlyTitle: 'Escolha uma hora',
6
+ timeText: 'Hora',
7
+ hourText: 'Horas',
8
+ minuteText: 'Minutos',
9
+ secondText: 'Segundos',
10
+ millisecText: 'Milissegundos',
11
+ timezoneText: 'Fuso horário',
12
+ currentText: 'Agora',
13
+ closeText: 'Fechar',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['a.m.', 'AM', 'A'],
16
+ pmNames: ['p.m.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['pt']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-ro.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Romanian translation for the jQuery Timepicker Addon */
2
+ /* Written by Romeo Adrian Cioaba */
3
+ (function($) {
4
+ $.timepicker.regional['ro'] = {
5
+ timeOnlyTitle: 'Alegeţi o oră',
6
+ timeText: 'Timp',
7
+ hourText: 'Ore',
8
+ minuteText: 'Minute',
9
+ secondText: 'Secunde',
10
+ millisecText: 'Milisecunde',
11
+ timezoneText: 'Fus orar',
12
+ currentText: 'Acum',
13
+ closeText: 'Închide',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['ro']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-ru.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Russian translation for the jQuery Timepicker Addon */
2
+ /* Written by Trent Richardson */
3
+ (function($) {
4
+ $.timepicker.regional['ru'] = {
5
+ timeOnlyTitle: 'Выберите время',
6
+ timeText: 'Время',
7
+ hourText: 'Часы',
8
+ minuteText: 'Минуты',
9
+ secondText: 'Секунды',
10
+ millisecText: 'Миллисекунды',
11
+ timezoneText: 'Часовой пояс',
12
+ currentText: 'Сейчас',
13
+ closeText: 'Закрыть',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['ru']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-sk.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Slovak translation for the jQuery Timepicker Addon */
2
+ /* Written by David Vallner */
3
+ (function($) {
4
+ $.timepicker.regional['sk'] = {
5
+ timeOnlyTitle: 'Zvoľte čas',
6
+ timeText: 'Čas',
7
+ hourText: 'Hodiny',
8
+ minuteText: 'Minúty',
9
+ secondText: 'Sekundy',
10
+ millisecText: 'Milisekundy',
11
+ timezoneText: 'Časové pásmo',
12
+ currentText: 'Teraz',
13
+ closeText: 'Zavrieť',
14
+ timeFormat: 'H:m',
15
+ amNames: ['dop.', 'AM', 'A'],
16
+ pmNames: ['pop.', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['sk']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-sv.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Swedish translation for the jQuery Timepicker Addon */
2
+ /* Written by Nevon */
3
+ (function($) {
4
+ $.timepicker.regional['sv'] = {
5
+ timeOnlyTitle: 'Välj en tid',
6
+ timeText: 'Timme',
7
+ hourText: 'Timmar',
8
+ minuteText: 'Minuter',
9
+ secondText: 'Sekunder',
10
+ millisecText: 'Millisekunder',
11
+ timezoneText: 'Tidszon',
12
+ currentText: 'Nu',
13
+ closeText: 'Stäng',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['sv']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-th.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Thai translation for the jQuery Timepicker Addon */
2
+ /* Written by Yote Wachirapornpongsa */
3
+ (function($) {
4
+ $.timepicker.regional['th'] = {
5
+ timeOnlyTitle: 'เลือกเวลา',
6
+ timeText: 'เวลา ',
7
+ hourText: 'ชั่วโมง ',
8
+ minuteText: 'นาที',
9
+ secondText: 'วินาที',
10
+ millisecText: 'มิลลิวินาที',
11
+ timezoneText: 'เขตเวลา',
12
+ currentText: 'เวลาปัจจุบัน',
13
+ closeText: 'ปิด',
14
+ timeFormat: 'hh:mm tt'
15
+ };
16
+ $.timepicker.setDefaults($.timepicker.regional['th']);
17
+ })(jQuery);
js/localization/jquery-ui-timepicker-tr.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Turkish translation for the jQuery Timepicker Addon */
2
+ /* Written by Fehmi Can Saglam, Edited by Goktug Ozturk */
3
+ (function($) {
4
+ $.timepicker.regional['tr'] = {
5
+ timeOnlyTitle: 'Zaman Seçiniz',
6
+ timeText: 'Zaman',
7
+ hourText: 'Saat',
8
+ minuteText: 'Dakika',
9
+ secondText: 'Saniye',
10
+ millisecText: 'Milisaniye',
11
+ timezoneText: 'Zaman Dilimi',
12
+ currentText: 'Şu an',
13
+ closeText: 'Tamam',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['ÖÖ', 'Ö'],
16
+ pmNames: ['ÖS', 'S'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['tr']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-uk.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Ukrainian translation for the jQuery Timepicker Addon */
2
+ /* Written by Sergey Noskov */
3
+ (function($) {
4
+ $.timepicker.regional['uk'] = {
5
+ timeOnlyTitle: 'Виберіть час',
6
+ timeText: 'Час',
7
+ hourText: 'Години',
8
+ minuteText: 'Хвилини',
9
+ secondText: 'Секунди',
10
+ millisecText: 'Мілісекунди',
11
+ timezoneText: 'Часовий пояс',
12
+ currentText: 'Зараз',
13
+ closeText: 'Закрити',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['uk']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-vi.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Vietnamese translation for the jQuery Timepicker Addon */
2
+ /* Written by Nguyen Dinh Trung */
3
+ (function($) {
4
+ $.timepicker.regional['vi'] = {
5
+ timeOnlyTitle: 'Chọn giờ',
6
+ timeText: 'Thời gian',
7
+ hourText: 'Giờ',
8
+ minuteText: 'Phút',
9
+ secondText: 'Giây',
10
+ millisecText: 'Phần nghìn giây',
11
+ timezoneText: 'Múi giờ',
12
+ currentText: 'Hiện thời',
13
+ closeText: 'Đóng',
14
+ timeFormat: 'H:m',
15
+ amNames: ['SA', 'AM', 'A'],
16
+ pmNames: ['CH', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['vi']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-zh-CN.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Simplified Chinese translation for the jQuery Timepicker Addon /
2
+ / Written by Will Lu */
3
+ (function($) {
4
+ $.timepicker.regional['zh-CN'] = {
5
+ timeOnlyTitle: '选择时间',
6
+ timeText: '时间',
7
+ hourText: '小时',
8
+ minuteText: '分钟',
9
+ secondText: '秒钟',
10
+ millisecText: '微秒',
11
+ timezoneText: '时区',
12
+ currentText: '现在时间',
13
+ closeText: '关闭',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['AM', 'A'],
16
+ pmNames: ['PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['zh-CN']);
20
+ })(jQuery);
js/localization/jquery-ui-timepicker-zh-TW.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Chinese translation for the jQuery Timepicker Addon */
2
+ /* Written by Alang.lin */
3
+ (function($) {
4
+ $.timepicker.regional['zh-TW'] = {
5
+ timeOnlyTitle: '選擇時分秒',
6
+ timeText: '時間',
7
+ hourText: '時',
8
+ minuteText: '分',
9
+ secondText: '秒',
10
+ millisecText: '毫秒',
11
+ timezoneText: '時區',
12
+ currentText: '現在時間',
13
+ closeText: '確定',
14
+ timeFormat: 'HH:mm',
15
+ amNames: ['上午', 'AM', 'A'],
16
+ pmNames: ['下午', 'PM', 'P'],
17
+ isRTL: false
18
+ };
19
+ $.timepicker.setDefaults($.timepicker.regional['zh-TW']);
20
+ })(jQuery);
js/timepicker-localization.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Attach a jQuery.datetimepicker() to "input[type=text].time_picker" fields. Will also attach to dynamic added fields.
3
+ */
4
+ jQuery(function() {
5
+ jQuery("body").on("focusin", "input[type=text].time_picker", function(){
6
+ self = jQuery(this);
7
+ self.datetimepicker({
8
+ closeText: timepicker_objectL10n.closeText,
9
+ currentText: timepicker_objectL10n.currentText,
10
+ prevText: timepicker_objectL10n.prevText,
11
+ nextText: timepicker_objectL10n.nextText,
12
+ weekHeader: timepicker_objectL10n.weekHeader,
13
+ isRTL: timepicker_objectL10n.isRTL,
14
+ timeText: timepicker_objectL10n.timeText,
15
+ hourText: timepicker_objectL10n.hourText,
16
+ minuteText: timepicker_objectL10n.minuteText,
17
+ secondText: timepicker_objectL10n.secondText,
18
+ millisecText: timepicker_objectL10n.millisecText,
19
+ timezoneText: timepicker_objectL10n.timezoneText
20
+ });
21
+ });
22
+ });
js/timepicker.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Attach a jQuery.datetimepicker() to "input[type=text].time_picker" fields. Will also attach to dynamic added fields.
3
+ */
4
+ //jQuery(function() {
5
+ // jQuery("body").on("focusin", "input[type=text].time_picker", function(){
6
+ jQuery(document).live('acf/setup_fields', function(e, postbox){
7
+ jQuery(postbox).find('.time_picker').each(function(){
8
+
9
+ self = jQuery(this);
10
+ self.datetimepicker({
11
+ timeOnly: (self.attr('data-date_format') == undefined),
12
+ timeFormat: self.attr('data-time_format'),
13
+ dateFormat: (self.attr('data-date_format') != undefined) ? self.attr('data-date_format') : 'mm/dd/yy',
14
+ showWeek: (self.attr('data-show_week_number') != "true") ? 0 : 1,
15
+ ampm: (self.attr('data-time_format').search(/t/i) != -1),
16
+ controlType: self.attr('data-picker'),
17
+ timeOnlyTitle: self.attr('title'),
18
+ monthNames: timepicker_objectL10n.monthNames,
19
+ monthNamesShort: timepicker_objectL10n.monthNamesShort,
20
+ dayNames: timepicker_objectL10n.dayNames,
21
+ dayNamesShort: timepicker_objectL10n.dayNamesShort,
22
+ dayNamesMin: timepicker_objectL10n.dayNamesMin,
23
+ firstDay: timepicker_objectL10n.firstDay
24
+ });
25
+ });
26
+ });
27
+
lang/acf-date_time_picker.po ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2013-04-05 14:13+0100\n"
6
+ "PO-Revision-Date: 2013-04-05 14:13+0100\n"
7
+ "Last-Translator: Per Søderlind <per@soderlind.no>\n"
8
+ "Language-Team: \n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Poedit-KeywordsList: __;_e\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "X-Poedit-SearchPath-0: ..\n"
15
+
16
+ #: ../date_time_picker-v3.php:28
17
+ #: ../date_time_picker-v3.php:80
18
+ #: ../date_time_picker-v4.php:23
19
+ #: ../date_time_picker-v4.php:82
20
+ msgid "Date and Time Picker"
21
+ msgstr ""
22
+
23
+ #: ../date_time_picker-v3.php:32
24
+ #: ../date_time_picker-v4.php:28
25
+ msgid "Choose Time"
26
+ msgstr ""
27
+
28
+ #: ../date_time_picker-v3.php:70
29
+ #: ../date_time_picker-v4.php:72
30
+ msgid "Date and Time Picker?"
31
+ msgstr ""
32
+
33
+ #: ../date_time_picker-v3.php:81
34
+ #: ../date_time_picker-v4.php:83
35
+ msgid "Time Picker"
36
+ msgstr ""
37
+
38
+ #: ../date_time_picker-v3.php:89
39
+ #: ../date_time_picker-v4.php:91
40
+ msgid "Date format"
41
+ msgstr ""
42
+
43
+ #: ../date_time_picker-v3.php:90
44
+ msgid "eg. mm/dd/yy. read more about"
45
+ msgstr ""
46
+
47
+ #: ../date_time_picker-v3.php:104
48
+ #: ../date_time_picker-v4.php:106
49
+ msgid "Time Format"
50
+ msgstr ""
51
+
52
+ #: ../date_time_picker-v3.php:105
53
+ #: ../date_time_picker-v4.php:107
54
+ #, php-format
55
+ msgid "eg. hh:mm. read more about <a href=\"%s\" target=\"_blank\">formatting time</a>"
56
+ msgstr ""
57
+
58
+ #: ../date_time_picker-v3.php:119
59
+ #: ../date_time_picker-v4.php:121
60
+ msgid "Display Week Number?"
61
+ msgstr ""
62
+
63
+ #: ../date_time_picker-v3.php:129
64
+ #: ../date_time_picker-v4.php:131
65
+ msgid "Yes"
66
+ msgstr ""
67
+
68
+ #: ../date_time_picker-v3.php:130
69
+ #: ../date_time_picker-v4.php:132
70
+ msgid "No"
71
+ msgstr ""
72
+
73
+ #: ../date_time_picker-v3.php:138
74
+ msgid "Time Picker Style?"
75
+ msgstr ""
76
+
77
+ #: ../date_time_picker-v3.php:148
78
+ #: ../date_time_picker-v4.php:150
79
+ msgid "Slider"
80
+ msgstr ""
81
+
82
+ #: ../date_time_picker-v3.php:149
83
+ #: ../date_time_picker-v4.php:151
84
+ msgid "Select"
85
+ msgstr ""
86
+
87
+ #: ../date_time_picker-v3.php:221
88
+ #: ../date_time_picker-v4.php:224
89
+ msgid "Done"
90
+ msgstr ""
91
+
92
+ #: ../date_time_picker-v3.php:222
93
+ #: ../date_time_picker-v4.php:225
94
+ msgid "Today"
95
+ msgstr ""
96
+
97
+ #: ../date_time_picker-v3.php:223
98
+ #: ../date_time_picker-v4.php:226
99
+ msgid "Prev"
100
+ msgstr ""
101
+
102
+ #: ../date_time_picker-v3.php:224
103
+ #: ../date_time_picker-v4.php:227
104
+ msgid "Next"
105
+ msgstr ""
106
+
107
+ #: ../date_time_picker-v3.php:225
108
+ #: ../date_time_picker-v4.php:228
109
+ msgid "Show a different month"
110
+ msgstr ""
111
+
112
+ #: ../date_time_picker-v3.php:226
113
+ #: ../date_time_picker-v4.php:229
114
+ msgid "Wk"
115
+ msgstr ""
116
+
117
+ #: ../date_time_picker-v3.php:227
118
+ #: ../date_time_picker-v4.php:230
119
+ msgid "Time"
120
+ msgstr ""
121
+
122
+ #: ../date_time_picker-v3.php:228
123
+ #: ../date_time_picker-v4.php:231
124
+ msgid "Hour"
125
+ msgstr ""
126
+
127
+ #: ../date_time_picker-v3.php:229
128
+ #: ../date_time_picker-v4.php:232
129
+ msgid "Minute"
130
+ msgstr ""
131
+
132
+ #: ../date_time_picker-v3.php:230
133
+ #: ../date_time_picker-v4.php:233
134
+ msgid "Second"
135
+ msgstr ""
136
+
137
+ #: ../date_time_picker-v3.php:231
138
+ #: ../date_time_picker-v4.php:234
139
+ msgid "Millisecond"
140
+ msgstr ""
141
+
142
+ #: ../date_time_picker-v3.php:232
143
+ #: ../date_time_picker-v4.php:235
144
+ msgid "Time Zone"
145
+ msgstr ""
146
+
147
+ #: ../date_time_picker-v4.php:24
148
+ msgid "jQuery"
149
+ msgstr ""
150
+
151
+ #: ../date_time_picker-v4.php:92
152
+ #, php-format
153
+ msgid "eg. mm/dd/yy. read more about <a href=\"%s\" target=\"_blank\">formatting date</a>"
154
+ msgstr ""
155
+
156
+ #: ../date_time_picker-v4.php:140
157
+ msgid "Time Picker style?"
158
+ msgstr ""
159
+
readme.txt ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Advanced Custom Fields: Date and Time Picker Field ===
2
+ Contributors: PerS
3
+ Donate link: http://soderlind.no/donate/
4
+ Tags: acf
5
+ Requires at least: 3.4
6
+ Tested up to: 3.5.1
7
+ Stable tag: 2.0.0.beta
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ Date and Time Picker field for Advanced Custom Fields
12
+
13
+ == Description ==
14
+
15
+ This is an add-on for the [Advanced Custom Fields](http://wordpress.org/extend/plugins/advanced-custom-fields/) WordPress plugin, that allows you to add a Date and Time Picker field type.
16
+
17
+ = Compatibility =
18
+
19
+ This add-on will work with:
20
+
21
+ * version 4 and up
22
+ * version 3 and bellow
23
+
24
+ == Installation ==
25
+
26
+ This add-on can be treated as both a WP plugin and a theme include.
27
+
28
+ = Plugin =
29
+ 1. Copy the 'acf-date_time_picker' folder into your plugins folder
30
+ 2. Activate the plugin via the Plugins admin page
31
+
32
+ = Include =
33
+
34
+ NOT SUPPORTED in 2.0.0.beta
35
+
36
+ 1. Copy the 'acf-date_time_picker' folder into your theme folder (can use sub folders). You can place the folder anywhere inside the 'wp-content' directory
37
+ 2. Edit your functions.php file and add the code below (Make sure the path is correct to include the acf-date_time_picker.php file)
38
+
39
+ `
40
+ add_action('acf/register_fields', 'my_register_fields');
41
+
42
+ function my_register_fields()
43
+ {
44
+ include_once('acf-date_time_picker/acf-date_time_picker.php');
45
+ }
46
+ `
47
+
48
+ == Changelog ==
49
+
50
+ = 2.0.0.beta =
51
+ * Total rewrite, based on the [acf-field-type-template](https://github.com/elliotcondon/acf-field-type-template). Works with ACF v3 and ACF v4. In this beta you can only add the Date Time Picker field as a plugin (i.e. not as a template field).
52
+ = 1.2.0 =
53
+ * Updated jquery-ui-timepicker-addon.js to the latest version (1.0.0) and added localization support.
54
+ = 1.1.1 =
55
+ * Fixed a small bug
56
+ = 1.1 =
57
+ * Change name to Date and Time Picker to reflect the new option to select between Date and Time picker or Time Picker only. Thanks to Wilfrid for point this out (not sure why I didn’t include it in 1.0)
58
+ = 1.0 =
59
+ * Initial version