jinda 0.6.5 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/generators/jinda/config_generator.rb +7 -0
  4. data/lib/generators/jinda/install_generator.rb +45 -42
  5. data/lib/generators/jinda/templates/app/assets/javascripts/application.js +1 -10
  6. data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +1 -20
  7. data/lib/jinda.rb +2 -1
  8. data/lib/jinda/date_helpers.rb +109 -0
  9. data/lib/jinda/{gemhelpers.rb → gem_helpers.rb} +0 -1
  10. data/lib/jinda/gen_class.rb +13 -0
  11. data/lib/jinda/gen_controller.rb +10 -0
  12. data/lib/jinda/gen_freemind.rb +33 -0
  13. data/lib/jinda/gen_helpers.rb +141 -0
  14. data/lib/jinda/gen_models.rb +137 -0
  15. data/lib/jinda/gen_runseq.rb +71 -0
  16. data/lib/jinda/gen_services.rb +90 -0
  17. data/lib/jinda/gen_xmain.rb +38 -0
  18. data/lib/jinda/get_app.rb +34 -0
  19. data/lib/jinda/helpers.rb +17 -998
  20. data/lib/jinda/init_vars.rb +36 -0
  21. data/lib/jinda/rake_views.rb +59 -0
  22. data/lib/jinda/refresh.rb +67 -0
  23. data/lib/jinda/themes.rb +163 -0
  24. data/lib/jinda/version.rb +1 -1
  25. data/test/dummy/Rakefile +6 -0
  26. data/test/dummy/app/assets/config/manifest.js +3 -0
  27. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  28. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  29. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  30. data/test/dummy/app/controllers/application_controller.rb +2 -0
  31. data/test/dummy/app/helpers/application_helper.rb +2 -0
  32. data/test/dummy/app/javascript/packs/application.js +15 -0
  33. data/test/dummy/app/jobs/application_job.rb +7 -0
  34. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  35. data/test/dummy/app/models/application_record.rb +3 -0
  36. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  37. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  38. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  39. data/test/dummy/bin/rails +4 -0
  40. data/test/dummy/bin/rake +4 -0
  41. data/test/dummy/bin/setup +33 -0
  42. data/test/dummy/config.ru +5 -0
  43. data/test/dummy/config/application.rb +19 -0
  44. data/test/dummy/config/boot.rb +5 -0
  45. data/test/dummy/config/cable.yml +10 -0
  46. data/test/dummy/config/database.yml +25 -0
  47. data/test/dummy/config/environment.rb +5 -0
  48. data/test/dummy/config/environments/development.rb +62 -0
  49. data/test/dummy/config/environments/production.rb +112 -0
  50. data/test/dummy/config/environments/test.rb +49 -0
  51. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  52. data/test/dummy/config/initializers/assets.rb +12 -0
  53. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  54. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  55. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  56. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  57. data/test/dummy/config/initializers/inflections.rb +16 -0
  58. data/test/dummy/config/initializers/mime_types.rb +4 -0
  59. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  60. data/test/dummy/config/locales/en.yml +33 -0
  61. data/test/dummy/config/puma.rb +38 -0
  62. data/test/dummy/config/routes.rb +3 -0
  63. data/test/dummy/config/spring.rb +6 -0
  64. data/test/dummy/config/storage.yml +34 -0
  65. data/test/dummy/db/development.sqlite3 +0 -0
  66. data/test/dummy/log/development.log +8 -0
  67. data/test/dummy/public/404.html +67 -0
  68. data/test/dummy/public/422.html +67 -0
  69. data/test/dummy/public/500.html +66 -0
  70. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  71. data/test/dummy/public/apple-touch-icon.png +0 -0
  72. data/test/dummy/public/favicon.ico +0 -0
  73. data/test/dummy/tmp/development_secret.txt +1 -0
  74. data/test/integration/navigation_test.rb +7 -0
  75. data/test/jinda_test.rb +7 -0
  76. data/test/test_helper.rb +19 -0
  77. metadata +84 -141
  78. data/lib/generators/jinda/templates/app/assets/images/4dcity-old.ico +0 -0
  79. data/lib/generators/jinda/templates/app/assets/images/4dcity.ico +0 -0
  80. data/lib/generators/jinda/templates/app/assets/images/account.png +0 -0
  81. data/lib/generators/jinda/templates/app/assets/images/add.png +0 -0
  82. data/lib/generators/jinda/templates/app/assets/images/ajax-loader-circle.gif +0 -0
  83. data/lib/generators/jinda/templates/app/assets/images/ajax-loader.gif +0 -0
  84. data/lib/generators/jinda/templates/app/assets/images/anchor.png +0 -0
  85. data/lib/generators/jinda/templates/app/assets/images/application_double.png +0 -0
  86. data/lib/generators/jinda/templates/app/assets/images/application_form_edit.png +0 -0
  87. data/lib/generators/jinda/templates/app/assets/images/arrow_left.png +0 -0
  88. data/lib/generators/jinda/templates/app/assets/images/arrow_right.png +0 -0
  89. data/lib/generators/jinda/templates/app/assets/images/arrow_turn_left.png +0 -0
  90. data/lib/generators/jinda/templates/app/assets/images/arrow_turn_right.png +0 -0
  91. data/lib/generators/jinda/templates/app/assets/images/calendar.png +0 -0
  92. data/lib/generators/jinda/templates/app/assets/images/cancel.png +0 -0
  93. data/lib/generators/jinda/templates/app/assets/images/chart_bar.png +0 -0
  94. data/lib/generators/jinda/templates/app/assets/images/clock.png +0 -0
  95. data/lib/generators/jinda/templates/app/assets/images/cog.png +0 -0
  96. data/lib/generators/jinda/templates/app/assets/images/control_fastforward.png +0 -0
  97. data/lib/generators/jinda/templates/app/assets/images/control_play.png +0 -0
  98. data/lib/generators/jinda/templates/app/assets/images/cross.png +0 -0
  99. data/lib/generators/jinda/templates/app/assets/images/delete.png +0 -0
  100. data/lib/generators/jinda/templates/app/assets/images/external-link.png +0 -0
  101. data/lib/generators/jinda/templates/app/assets/images/facebook-continue-button.png +0 -0
  102. data/lib/generators/jinda/templates/app/assets/images/facebooksmall.png +0 -0
  103. data/lib/generators/jinda/templates/app/assets/images/favicon.ico +0 -0
  104. data/lib/generators/jinda/templates/app/assets/images/freemind(mm).png +0 -0
  105. data/lib/generators/jinda/templates/app/assets/images/google-continue-button.png +0 -0
  106. data/lib/generators/jinda/templates/app/assets/images/help.png +0 -0
  107. data/lib/generators/jinda/templates/app/assets/images/highway-menu.png +0 -0
  108. data/lib/generators/jinda/templates/app/assets/images/highway.png +0 -0
  109. data/lib/generators/jinda/templates/app/assets/images/house.png +0 -0
  110. data/lib/generators/jinda/templates/app/assets/images/icons-18-black.png +0 -0
  111. data/lib/generators/jinda/templates/app/assets/images/icons-18-white.png +0 -0
  112. data/lib/generators/jinda/templates/app/assets/images/icons-36-black.png +0 -0
  113. data/lib/generators/jinda/templates/app/assets/images/icons-36-white.png +0 -0
  114. data/lib/generators/jinda/templates/app/assets/images/logo.png +0 -0
  115. data/lib/generators/jinda/templates/app/assets/images/logo_jinda.png +0 -0
  116. data/lib/generators/jinda/templates/app/assets/images/logout.png +0 -0
  117. data/lib/generators/jinda/templates/app/assets/images/new.gif +0 -0
  118. data/lib/generators/jinda/templates/app/assets/images/new.png +0 -0
  119. data/lib/generators/jinda/templates/app/assets/images/page.png +0 -0
  120. data/lib/generators/jinda/templates/app/assets/images/page_attach.png +0 -0
  121. data/lib/generators/jinda/templates/app/assets/images/page_green.png +0 -0
  122. data/lib/generators/jinda/templates/app/assets/images/page_output.png +0 -0
  123. data/lib/generators/jinda/templates/app/assets/images/page_pdf.png +0 -0
  124. data/lib/generators/jinda/templates/app/assets/images/pencil.png +0 -0
  125. data/lib/generators/jinda/templates/app/assets/images/printer.png +0 -0
  126. data/lib/generators/jinda/templates/app/assets/images/refresh.png +0 -0
  127. data/lib/generators/jinda/templates/app/assets/images/report.png +0 -0
  128. data/lib/generators/jinda/templates/app/assets/images/rssmall.png +0 -0
  129. data/lib/generators/jinda/templates/app/assets/images/tick.png +0 -0
  130. data/lib/generators/jinda/templates/app/assets/images/twittersmall.png +0 -0
  131. data/lib/generators/jinda/templates/app/assets/images/user.png +0 -0
  132. data/lib/generators/jinda/templates/app/assets/images/user_admin_gear.png +0 -0
  133. data/lib/generators/jinda/templates/app/assets/images/view_code.png +0 -0
  134. data/lib/generators/jinda/templates/app/assets/javascripts/application.js-jqm +0 -27
  135. data/lib/generators/jinda/templates/app/assets/javascripts/cable.js +0 -13
  136. data/lib/generators/jinda/templates/app/assets/javascripts/disable_enter_key.js +0 -10
  137. data/lib/generators/jinda/templates/app/assets/javascripts/iscroll-wrapper.js +0 -32
  138. data/lib/generators/jinda/templates/app/assets/javascripts/iscroll.js +0 -1084
  139. data/lib/generators/jinda/templates/app/assets/javascripts/jinda.js +0 -14
  140. data/lib/generators/jinda/templates/app/assets/javascripts/jquery.mobile-1.2.1.js +0 -9272
  141. data/lib/generators/jinda/templates/app/assets/javascripts/jquery.mobile.datebox.js +0 -1778
  142. data/lib/generators/jinda/templates/app/assets/javascripts/jquery.mobile.splitview.js +0 -695
  143. data/lib/generators/jinda/templates/app/assets/stylesheets/app.scss +0 -90
  144. data/lib/generators/jinda/templates/app/assets/stylesheets/articles.scss +0 -94
  145. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun.eot +0 -0
  146. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun.ttf +0 -0
  147. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun.woff +0 -0
  148. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun_bold.ttf +0 -0
  149. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun_bolditalic.ttf +0 -0
  150. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun_italic.ttf +0 -0
  151. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew-webfont.eot +0 -0
  152. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew-webfont.ttf +0 -0
  153. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew-webfont.woff +0 -0
  154. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew.css +0 -47
  155. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.eot +0 -0
  156. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.ttf +0 -0
  157. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.woff +0 -0
  158. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.eot +0 -0
  159. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.ttf +0 -0
  160. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.woff +0 -0
  161. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.eot +0 -0
  162. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.ttf +0 -0
  163. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.woff +0 -0
  164. data/lib/generators/jinda/templates/app/assets/stylesheets/images/ajax-loader.gif +0 -0
  165. data/lib/generators/jinda/templates/app/assets/stylesheets/images/button_black.png +0 -0
  166. data/lib/generators/jinda/templates/app/assets/stylesheets/images/button_blue.png +0 -0
  167. data/lib/generators/jinda/templates/app/assets/stylesheets/images/button_red.png +0 -0
  168. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-18-black.png +0 -0
  169. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-18-white.png +0 -0
  170. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-36-black.png +0 -0
  171. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-36-white.png +0 -0
  172. data/lib/generators/jinda/templates/app/assets/stylesheets/images/indicator.gif +0 -0
  173. data/lib/generators/jinda/templates/app/assets/stylesheets/jinda.css +0 -52
  174. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile-1.2.1.css +0 -2339
  175. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile.datebox.css +0 -65
  176. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile.grids.collapsible.css +0 -122
  177. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile.splitview.css +0 -128
  178. data/lib/generators/jinda/templates/app/assets/stylesheets/kul-4.2.css +0 -1516
  179. data/lib/generators/jinda/templates/app/assets/stylesheets/kul-4.2.min.css +0 -11
  180. data/lib/generators/jinda/templates/app/assets/stylesheets/modules.scss +0 -84
  181. data/lib/generators/jinda/templates/app/assets/stylesheets/sarabun.css +0 -37
  182. data/lib/generators/jinda/templates/app/assets/stylesheets/social.scss +0 -133
  183. data/lib/generators/jinda/templates/app/controllers/concerns/jinda_general_concern.rb +0 -179
  184. data/lib/generators/jinda/templates/app/controllers/concerns/jinda_run_concern.rb +0 -365
  185. data/lib/generators/jinda/templates/app/controllers/jinda_org/devs_controller.rb +0 -2
  186. data/lib/generators/jinda/templates/app/controllers/jinda_org/jinda_controller.rb +0 -66
  187. data/lib/generators/jinda/templates/app/views/jinda/_activity.md +0 -10
  188. data/lib/generators/jinda/templates/app/views/jinda/_menu.haml +0 -27
  189. data/lib/generators/jinda/templates/app/views/jinda/_menu_mm.haml +0 -44
  190. data/lib/generators/jinda/templates/app/views/jinda/_model.md +0 -5
  191. data/lib/generators/jinda/templates/app/views/jinda/_modul.md +0 -9
  192. data/lib/generators/jinda/templates/app/views/jinda/_pending_home.haml +0 -5
  193. data/lib/generators/jinda/templates/app/views/jinda/_pending_page.haml +0 -24
  194. data/lib/generators/jinda/templates/app/views/jinda/_service.md +0 -24
  195. data/lib/generators/jinda/templates/app/views/jinda/_static.haml +0 -13
  196. data/lib/generators/jinda/templates/app/views/jinda/doc-thai.md +0 -37
  197. data/lib/generators/jinda/templates/app/views/jinda/doc.md +0 -36
  198. data/lib/generators/jinda/templates/app/views/jinda/error_logs.haml +0 -22
  199. data/lib/generators/jinda/templates/app/views/jinda/feed.rss.builder +0 -27
  200. data/lib/generators/jinda/templates/app/views/jinda/help.haml +0 -20
  201. data/lib/generators/jinda/templates/app/views/jinda/index.html.haml +0 -53
  202. data/lib/generators/jinda/templates/app/views/jinda/logs.haml +0 -22
  203. data/lib/generators/jinda/templates/app/views/jinda/notice_logs.haml +0 -18
  204. data/lib/generators/jinda/templates/app/views/jinda/pending.haml +0 -1
  205. data/lib/generators/jinda/templates/app/views/jinda/run_form.haml +0 -42
  206. data/lib/generators/jinda/templates/app/views/jinda/run_output.haml +0 -38
  207. data/lib/generators/jinda/templates/app/views/jinda/search.haml +0 -20
  208. data/lib/generators/jinda/templates/app/views/jinda/status.haml +0 -61
@@ -1,1778 +0,0 @@
1
- /*
2
- * jQuery Mobile Framework : plugin to provide a date and time picker.
3
- * Copyright (c) JTSage
4
- * CC 3.0 Attribution. May be relicensed without permission/notifcation.
5
- * https://github.com/jtsage/jquery-mobile-datebox
6
- */
7
- (function($, undefined ) {
8
- $.widget( "mobile.datebox", $.mobile.widget, {
9
- options: {
10
- // All widget options, including some internal runtime details
11
- theme: 'c',
12
- pickPageTheme: 'b',
13
- pickPageInputTheme: 'e',
14
- pickPageButtonTheme: 'a',
15
- pickPageHighButtonTheme: 'e',
16
- pickPageOHighButtonTheme: 'e',
17
- pickPageODHighButtonTheme: 'e',
18
- pickPageTodayButtonTheme: 'e',
19
- pickPageSlideButtonTheme: 'd',
20
- pickPageFlipButtonTheme: 'b',
21
- centerWindow: true,
22
- calHighToday: true,
23
- calHighPicked: true,
24
- noAnimation: false,
25
- disableManualInput: false,
26
-
27
- disabled: false,
28
- wheelExists: false,
29
- swipeEnabled: true,
30
- zindex: '500',
31
- debug: false,
32
-
33
- setDateButtonLabel: 'Set Date',
34
- setTimeButtonLabel: 'Set Time',
35
- setDurationButtonLabel: 'Set Duration',
36
- calTodayButtonLabel: 'Jump to Today',
37
- titleDateDialogLabel: 'Set Date',
38
- titleTimeDialogLabel: 'Set Time',
39
- titleDialogLabel: false,
40
-
41
- meridiemLetters: ['AM', 'PM'],
42
- /* For Thai Language
43
- daysOfWeek: ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์'],
44
- daysOfWeekShort: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
45
- monthsOfYear: ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษษยน', 'พฤษภาคม', 'มิถุนายน', 'กรกฏาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'],
46
- */
47
- daysOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thurs', 'Fri', 'Sat'],
48
- daysOfWeekShort: ['Sun','Mon', 'Tue', 'Wed', 'Thurs', 'Fri', 'Sat'],
49
- monthsOfYear: ['January', 'Febuary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
50
- monthsOfYearShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
51
- durationLabel: ['Days', 'Hours', 'Minutes', 'Seconds'],
52
- durationDays: ['Day', 'Days'],
53
- durationFormat: 'DD ddd, hh:ii:ss',
54
- timeFormat: 24,
55
- timeFormats: { '12': 'gg:ii AA', '24': 'HH:ii' },
56
- timeOutput: false,
57
- rolloverMode: { 'm': true, 'd': true, 'h': true, 'i': true, 's': true },
58
-
59
- mode: 'datebox',
60
- calShowDays: true,
61
- calShowOnlyMonth: false,
62
- useDialogForceTrue: false,
63
- useDialogForceFalse: false,
64
- useDialog: false,
65
- useModal: false,
66
- useInline: false,
67
- noButtonFocusMode: false,
68
- noButton: false,
69
- noSetButton: false,
70
- closeCallback: false,
71
- open: false,
72
- nestedBox: false,
73
-
74
- fieldsOrder: false,
75
- dateFieldOrder: ['m', 'd', 'y'],
76
- timeFieldOrder: ['h', 'i', 'a'],
77
- slideFieldOrder: ['y', 'm', 'd'],
78
- durationOrder: ['d', 'h', 'i', 's'],
79
- headerFormat: 'ddd, mmm dd, YYYY',
80
- dateFormat: 'YYYY-MM-DD',
81
- minuteStep: 1,
82
- calTodayButton: false,
83
- calWeekMode: false,
84
- calWeekModeFirstDay: 1,
85
- calWeekModeHighlight: true,
86
- calStartDay: 0,
87
- defaultPickerValue: false,
88
- defaultDate : false, //this is deprecated and will be removed in the future versions (ok, may be not)
89
- minYear: false,
90
- maxYear: false,
91
- afterToday: false,
92
- beforeToday: false,
93
- maxDays: false,
94
- minDays: false,
95
- highDays: false,
96
- highDates: false,
97
- blackDays: false,
98
- blackDates: false,
99
- durationSteppers: {'d': 1, 'h': 1, 'i': 1, 's': 1},
100
- disabledDayColor: '#888'
101
- },
102
- _dateboxHandler: function(event, payload) {
103
- // Handle all event triggers that have an internal effect
104
- if ( ! event.isPropagationStopped() ) {
105
- switch (payload.method) {
106
- case 'close':
107
- $(this).data('datebox').close();
108
- break;
109
- case 'open':
110
- $(this).data('datebox').open();
111
- break;
112
- case 'set':
113
- $(this).val(payload.value);
114
- $(this).trigger('change');
115
- break;
116
- case 'doset':
117
- if ( $(this).data('datebox').options.mode === 'timebox' || $(this).data('datebox').options.mode === 'durationbox' ) {
118
- $(this).trigger('datebox', {'method':'set', 'value':$(this).data('datebox')._formatTime($(this).data('datebox').theDate)});
119
- } else {
120
- $(this).trigger('datebox', {'method':'set', 'value':$(this).data('datebox')._formatDate($(this).data('datebox').theDate)});
121
- }
122
- case 'dooffset':
123
- $(this).data('datebox')._offset(payload.type, payload.amount, true);
124
- break;
125
- case 'dorefresh':
126
- $(this).data('datebox')._update();
127
- break;
128
- }
129
- }
130
- },
131
- _zeroPad: function(number) {
132
- // Pad a number with a zero, to make it 2 digits
133
- return ( ( number < 10 ) ? "0" : "" ) + String(number);
134
- },
135
- _makeOrd: function (num) {
136
- // Return an ordinal suffix (1st, 2nd, 3rd, etc)
137
- var ending = num % 10;
138
- if ( num > 9 && num < 21 ) { return 'th'; }
139
- if ( ending > 3 ) { return 'th'; }
140
- return ['th','st','nd','rd'][ending];
141
- },
142
- _isInt: function (s) {
143
- // Bool, return is a number is an integer
144
- return (s.toString().search(/^[0-9]+$/) === 0);
145
- },
146
- _dstAdjust: function(date) {
147
- // Make sure not to run into daylight savings time.
148
- if (!date) { return null; }
149
- date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
150
- return date;
151
- },
152
- _getFirstDay: function(date) {
153
- // Get the first DAY of the month (0-6)
154
- return new Date(date.getFullYear(), date.getMonth(), 1).getDay();
155
- },
156
- _getLastDate: function(date) {
157
- // Get the last DATE of the month (28,29,30,31)
158
- return 32 - this._dstAdjust(new Date(date.getFullYear(), date.getMonth(), 32)).getDate();
159
- },
160
- _getLastDateBefore: function(date) {
161
- // Get the last DATE of the PREVIOUS month (28,29,30,31)
162
- return 32 - this._dstAdjust(new Date(date.getFullYear(), date.getMonth()-1, 32)).getDate();
163
- },
164
- _formatter: function(format, date) {
165
- // Format the output date or time (not duration)
166
- format = format.replace('SS', this._makeOrd(date.getDate()));
167
- format = format.replace('YYYY', date.getFullYear());
168
- format = format.replace('mmmm', this.options.monthsOfYearShort[date.getMonth()] );
169
- format = format.replace('mmm', this.options.monthsOfYear[date.getMonth()] );
170
- format = format.replace('MM', this._zeroPad(date.getMonth() + 1));
171
- format = format.replace('mm', date.getMonth() + 1);
172
- format = format.replace('dddd', this.options.daysOfWeekShort[date.getDay()] );
173
- format = format.replace('ddd', this.options.daysOfWeek[date.getDay()] );
174
- format = format.replace('DD', this._zeroPad(date.getDate()));
175
- format = format.replace('dd', date.getDate());
176
-
177
- format = format.replace('HH', this._zeroPad(date.getHours()));
178
- format = format.replace('GG', date.getHours());
179
-
180
- format = format.replace('hh', this._zeroPad(((date.getHours() === 0 || date.getHours() === 12)?12:((date.getHours()<12)?date.getHours():date.getHours()-12))));
181
- format = format.replace('gg', ((date.getHours() === 0 || date.getHours() === 12)?12:((date.getHours()<12)?date.getHours():(date.getHours()-12))));
182
-
183
- format = format.replace('ii', this._zeroPad(date.getMinutes()));
184
- format = format.replace('ss', this._zeroPad(date.getSeconds()));
185
- format = format.replace('AA', ((date.getHours() < 12)?this.options.meridiemLetters[0].toUpperCase():this.options.meridiemLetters[1].toUpperCase()));
186
- format = format.replace('aa', ((date.getHours() < 12)?this.options.meridiemLetters[0].toLowerCase():this.options.meridiemLetters[1].toLowerCase()));
187
- return format;
188
- },
189
- _formatHeader: function(date) {
190
- // Shortcut function to return headerFormat date/time format
191
- return this._formatter(this.options.headerFormat, date);
192
- },
193
- _formatDate: function(date) {
194
- // Shortcut function to return dateFormat date/time format
195
- return this._formatter(this.options.dateFormat, date);
196
- },
197
- _isoDate: function(y,m,d) {
198
- // Return an ISO 8601 date (yyyy-mm-dd)
199
- return String(y) + '-' + (( m < 10 ) ? "0" : "") + String(m) + '-' + ((d < 10 ) ? "0" : "") + String(d);
200
- },
201
- _formatTime: function(date) {
202
- // Shortcut to return formatted time, also handles duration
203
- var self = this,
204
- dur_collapse = [false,false,false], adv, exp_format, i, j,
205
- format = this.options.durationFormat,
206
- dur_comps = [0,0,0,0];
207
-
208
- if ( this.options.mode === 'durationbox' ) {
209
- adv = this.options.durationFormat;
210
- adv = adv.replace(/ddd/g, '.+?');
211
- adv = adv.replace(/DD|ss|hh|ii/g, '([0-9Dhis]+)');
212
- adv = RegExp('^' + adv + '$');
213
- exp_format = adv.exec(this.options.durationFormat);
214
-
215
- i = ((self.theDate.getTime() - self.theDate.getMilliseconds()) / 1000) - ((self.initDate.getTime() - self.initDate.getMilliseconds()) / 1000); j = i;
216
-
217
- dur_comps[0] = parseInt( i / (60*60*24),10); i = i - (dur_comps[0]*60*60*24); // Days
218
- dur_comps[1] = parseInt( i / (60*60),10); i = i - (dur_comps[1]*60*60); // Hours
219
- dur_comps[2] = parseInt( i / (60),10); i = i - (dur_comps[2]*60); // Minutes
220
- dur_comps[3] = i; // Seconds
221
-
222
- if ( ! exp_format[0].match(/DD/) ) { dur_collapse[0] = true; dur_comps[1] = dur_comps[1] + (dur_comps[0]*24);}
223
- if ( ! exp_format[0].match(/hh/) ) { dur_collapse[1] = true; dur_comps[2] = dur_comps[2] + (dur_comps[1]*60);}
224
- if ( ! exp_format[0].match(/ii/) ) { dur_collapse[2] = true; dur_comps[3] = dur_comps[3] + (dur_comps[2]*60);}
225
-
226
- if ( this.options.debug ) {
227
- console.log({'format': exp_format, 'collapse': dur_collapse, 'seconds': j, 'parts': dur_comps});
228
- }
229
-
230
- format = format.replace('DD', dur_comps[0]);
231
- format = format.replace('ddd', ((dur_comps[0] > 1)?this.options.durationDays[1]:this.options.durationDays[0]));
232
- format = format.replace('hh', self._zeroPad(dur_comps[1]));
233
- format = format.replace('ii', self._zeroPad(dur_comps[2]));
234
- format = format.replace('ss', self._zeroPad(dur_comps[3]));
235
- return format;
236
- } else {
237
- return this._formatter(self.options.timeOutput, date);
238
- }
239
- },
240
- _makeDate: function (str) {
241
- // Date Parser
242
- str = $.trim(str);
243
- var o = this.options,
244
- self = this,
245
- adv = null,
246
- exp_input = null,
247
- exp_format = null,
248
- exp_temp = null,
249
- date = new Date(),
250
- dur_collapse = [false,false,false],
251
- found_date = [date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds()],
252
- i;
253
-
254
- if ( o.mode === 'durationbox' ) {
255
- adv = o.durationFormat;
256
- adv = adv.replace(/ddd/g, '.+?');
257
- adv = adv.replace(/DD|ss|hh|ii/g, '([0-9Dhis]+)');
258
- adv = RegExp('^' + adv + '$');
259
- exp_input = adv.exec(str);
260
- exp_format = adv.exec(o.durationFormat);
261
-
262
- if ( o.debug ) { // Legacy debug code - you probably never need this.
263
- console.log({'info': 'EXPERIMENTAL REGEX MODE ENABLED', 'string': str, 'regex':adv, 'input':exp_input, 'format':exp_format});
264
- }
265
-
266
- if ( exp_input === null || exp_input.length !== exp_format.length ) {
267
- if ( typeof o.defaultPickerValue === "number" && o.defaultPickerValue > 0 ) {
268
- return new Date(self.initDate.getTime() + (parseInt(o.defaultPickerValue,10) * 1000));
269
- } else {
270
- return new Date(self.initDate.getTime());
271
- }
272
- } else {
273
- exp_temp = ((self.initDate.getTime() - self.initDate.getMilliseconds()) / 1000);
274
- for ( i=0; i<exp_input.length; i++ ) { //0y 1m 2d 3h 4i 5s
275
- if ( exp_format[i].match(/^DD$/i) ) { exp_temp = exp_temp + (parseInt(exp_input[i],10)*60*60*24); }
276
- if ( exp_format[i].match(/^hh$/i) ) { exp_temp = exp_temp + (parseInt(exp_input[i],10)*60*60); }
277
- if ( exp_format[i].match(/^ii$/i) ) { exp_temp = exp_temp + (parseInt(exp_input[i],10)*60); }
278
- if ( exp_format[i].match(/^ss$/i) ) { exp_temp = exp_temp + (parseInt(exp_input[i],10)); }
279
- }
280
- return new Date((exp_temp*1000));
281
- }
282
- } else {
283
- if ( o.mode === 'timebox' || o.mode === 'timeflipbox' ) { adv = o.timeOutput; } else { adv = o.dateFormat; }
284
-
285
- adv = adv.replace(/dddd|mmmm/g, '(.+?)');
286
- adv = adv.replace(/ddd|SS/g, '.+?');
287
- adv = adv.replace(/mmm/g, '(.+?)');
288
- adv = adv.replace(/ *AA/ig, ' *(.*?)');
289
- adv = adv.replace(/yyyy|dd|mm|gg|hh|ii/ig, '([0-9yYdDmMgGhHi]+)');
290
- adv = adv.replace(/ss/g, '([0-9s]+)');
291
- adv = RegExp('^' + adv + '$');
292
- exp_input = adv.exec(str);
293
- if ( o.mode === 'timebox' || o.mode === 'timeflipbox' ) {
294
- exp_format = adv.exec(o.timeOutput); // If time, use timeOutput as expected format
295
- } else {
296
- exp_format = adv.exec(o.dateFormat); // If date, use dateFormat as expected format
297
- }
298
-
299
- if ( o.debug ) { // Legacy debug code - you probably never need this.
300
- console.log({'info': 'EXPERIMENTAL REGEX MODE ENABLED', 'string': str, 'regex':adv, 'input':exp_input, 'format':exp_format});
301
- }
302
-
303
- if ( exp_input === null || exp_input.length !== exp_format.length ) {
304
- if ( o.defaultPickerValue !== false ) {
305
- if ( $.isArray(o.defaultPickerValue) && o.defaultPickerValue.length === 3 ) {
306
- if ( o.mode === 'timebox' || o.mode === 'timeflipbox' ) {
307
- return new Date(found_date[0], found_date[1], found_date[2], o.defaultPickerValue[0], o.defaultPickerValue[1], o.defaultPickerValue[2], 0);
308
- }
309
- else {
310
- return new Date(o.defaultPickerValue[0], o.defaultPickerValue[1], o.defaultPickerValue[2], 0, 0, 0, 0);
311
- }
312
- }
313
- else {
314
- if ( o.mode === 'timebox' || o.mode === 'timeflipbox' ) {
315
- exp_temp = o.defaultPickerValue.split(':');
316
- if ( exp_temp.length === 3 ) {
317
- date = new Date(found_date[0], found_date[1], found_date[2], parseInt(exp_temp[0],10),parseInt(exp_temp[1],10),parseInt(exp_temp[2],10),0);
318
- if ( isNaN(date.getDate()) ) { date = new Date(); }
319
- }
320
- }
321
- else {
322
- exp_temp = o.defaultPickerValue.split('-');
323
- if ( exp_temp.length === 3 ) {
324
- date = new Date(parseInt(exp_temp[0],10),parseInt(exp_temp[1],10)-1,parseInt(exp_temp[2],10),0,0,0,0);
325
- if ( isNaN(date.getDate()) ) { date = new Date(); }
326
- }
327
- }
328
- }
329
- }
330
- } else {
331
- for ( i=0; i<exp_input.length; i++ ) { //0y 1m 2d 3h 4i 5s
332
- if ( exp_format[i].match(/^gg$/i) ) { found_date[3] = parseInt(exp_input[i],10); }
333
- if ( exp_format[i].match(/^hh$/i) ) { found_date[3] = parseInt(exp_input[i],10); }
334
- if ( exp_format[i].match(/^ii$/i) ) { found_date[4] = parseInt(exp_input[i],10); }
335
- if ( exp_format[i].match(/^ss$/ ) ) { found_date[5] = parseInt(exp_input[i],10); }
336
- if ( exp_format[i].match(/^dd$/i) ) { found_date[2] = parseInt(exp_input[i],10); }
337
- if ( exp_format[i].match(/^mm$/i) ) { found_date[1] = parseInt(exp_input[i],10)-1; }
338
- if ( exp_format[i].match(/^yyyy$/i) ) { found_date[0] = parseInt(exp_input[i],10); }
339
- if ( exp_format[i].match(/^AA$/i) ) {
340
- if ( exp_input[i].toLowerCase().charAt(0) === 'a' && found_date[3] === 12 ) {
341
- found_date[3] = 0;
342
- } else if ( exp_input[i].toLowerCase().charAt(0) === 'p' && found_date[3] !== 12 ) {
343
- found_date[3] = found_date[3] + 12;
344
- }
345
- }
346
- if ( exp_format[i].match(/^mmm$/i) ) {
347
- exp_temp = $.inArray(exp_input[i], o.monthsOfYear);
348
- if ( exp_temp > -1 ) { found_date[1] = exp_temp; }
349
- }
350
- if ( exp_format[i].match(/^mmmm$/i) ) {
351
- exp_temp = $.inArray(exp_input[i], o.monthsOfYearShort);
352
- if ( exp_temp > -1 ) { found_date[1] = exp_temp; }
353
- }
354
- }
355
- }
356
- if ( exp_format[0].match(/G|g|i|s|H|h|A/) ) {
357
- return new Date(found_date[0], found_date[1], found_date[2], found_date[3], found_date[4], found_date[5], 0);
358
- } else {
359
- return new Date(found_date[0], found_date[1], found_date[2], 0, 0, 0, 0); // Normalize time for raw dates
360
- }
361
- }
362
- },
363
- _checker: function(date) {
364
- // Return a ISO 8601 BASIC format date (YYYYMMDD) for simple comparisons
365
- return parseInt(String(date.getFullYear()) + this._zeroPad(date.getMonth()+1) + this._zeroPad(date.getDate()),10);
366
- },
367
- _hoover: function(item) {
368
- // Hover toggle class, for calendar
369
- $(item).toggleClass('ui-btn-up-'+$(item).attr('data-theme')+' ui-btn-down-'+$(item).attr('data-theme'));
370
- },
371
- _offset: function(mode, amount, update) {
372
- // Compute a date/time offset.
373
- // update = false to prevent controls refresh
374
- var self = this,
375
- o = this.options;
376
-
377
- if ( typeof(update) === "undefined" ) { update = true; }
378
- self.input.trigger('datebox', {'method':'offset', 'type':mode, 'amount':amount});
379
- switch(mode) {
380
- case 'y':
381
- self.theDate.setYear(self.theDate.getFullYear() + amount);
382
- break;
383
- case 'm':
384
- console.log(o.rolloverMode);
385
- if ( o.rolloverMode['m'] || ( self.theDate.getMonth() + amount < 12 && self.theDate.getMonth() + amount > -1 ) ) {
386
- self.theDate.setMonth(self.theDate.getMonth() + amount);
387
- }
388
- break;
389
- case 'd':
390
- if ( o.rolloverMode['d'] || (
391
- self.theDate.getDate() + amount > 0 &&
392
- self.theDate.getDate() + amount < (self._getLastDate(self.theDate) + 1) ) ) {
393
- self.theDate.setDate(self.theDate.getDate() + amount);
394
- }
395
- break;
396
- case 'h':
397
- if ( o.rolloverMode['h'] || (
398
- self.theDate.getHours() + amount > -1 &&
399
- self.theDate.getHours() + amount < 24 ) ) {
400
- self.theDate.setHours(self.theDate.getHours() + amount);
401
- }
402
- break;
403
- case 'i':
404
- if ( o.rolloverMode['i'] || (
405
- self.theDate.getMinutes() + amount > -1 &&
406
- self.theDate.getMinutes() + amount < 60 ) ) {
407
- self.theDate.setMinutes(self.theDate.getMinutes() + amount);
408
- }
409
- break;
410
- case 's':
411
- if ( o.rolloverMode['i'] || (
412
- self.theDate.getSeconds() + amount > -1 &&
413
- self.theDate.getSeconds() + amount < 60 ) ) {
414
- self.theDate.setSeconds(self.theDate.getSeconds() + amount);
415
- }
416
- break;
417
- case 'a':
418
- if ( self.pickerMeri.val() === o.meridiemLetters[0] ) {
419
- self._offset('h',12,false);
420
- } else {
421
- self._offset('h',-12,false);
422
- }
423
- break;
424
- }
425
- if ( update === true ) { self._update(); }
426
- },
427
- _updateduration: function() {
428
- // Update the duration contols when inputs are directly edited.
429
- var self = this,
430
- secs = (self.initDate.getTime() - self.initDate.getMilliseconds()) / 1000;
431
-
432
- if ( !self._isInt(self.pickerDay.val()) ) { self.pickerDay.val(0); }
433
- if ( !self._isInt(self.pickerHour.val()) ) { self.pickerHour.val(0); }
434
- if ( !self._isInt(self.pickerMins.val()) ) { self.pickerMins.val(0); }
435
- if ( !self._isInt(self.pickerSecs.val()) ) { self.pickerSecs.val(0); }
436
-
437
- secs = secs + (parseInt(self.pickerDay.val(),10) * 60 * 60 * 24);
438
- secs = secs + (parseInt(self.pickerHour.val(),10) * 60 * 60);
439
- secs = secs + (parseInt(self.pickerMins.val(),10) * 60);
440
- secs = secs + (parseInt(self.pickerSecs.val(),10));
441
- self.theDate.setTime( secs * 1000 );
442
- self._update();
443
- },
444
- _update: function() {
445
- // Update the display on date change
446
- var self = this,
447
- o = self.options,
448
- testDate = null,
449
- i, gridWeek, gridDay, skipThis, thisRow, y, cTheme, inheritDate, thisPRow, tmpVal,
450
- interval = {'d': 60*60*24, 'h': 60*60, 'i': 60, 's':1},
451
- calmode = {};
452
-
453
- self.input.trigger('datebox', {'method':'refresh'});
454
- /* BEGIN:DURATIONBOX */
455
- if ( o.mode === 'durationbox' ) {
456
- i = ((self.theDate.getTime() - self.theDate.getMilliseconds()) / 1000) - ((self.initDate.getTime() - self.initDate.getMilliseconds()) / 1000);
457
- if ( i<0 ) { i = 0; self.theDate.setTime(self.initDate.getTime()); }
458
-
459
- /* DAYS */
460
- y = parseInt( i / interval['d'],10);
461
- i = i - ( y * interval['d'] );
462
- self.pickerDay.val(y);
463
-
464
- /* HOURS */
465
- y = parseInt( i / interval['h'], 10);
466
- i = i - ( y * interval['h'] );
467
- self.pickerHour.val(y);
468
-
469
- /* MINS AND SECS */
470
- y = parseInt( i / interval['i'], 10);
471
- i = i - ( y * interval['i']);
472
- self.pickerMins.val(y);
473
- self.pickerSecs.val(parseInt(i,10));
474
- }
475
- /* END:DURATIONBOX */
476
- /* BEGIN:TIMEBOX */
477
- if ( o.mode === 'timebox' ) {
478
- if ( o.minuteStep !== 1 ) {
479
- i = self.theDate.getMinutes() % o.minuteStep;
480
- if ( i !== 0 ) { self.theDate.setMinutes(self.theDate.getMinutes() - i); }
481
- }
482
- self.pickerMins.val(self._zeroPad(self.theDate.getMinutes()));
483
- if ( o.timeFormat === 12 ) { // Handle meridiems
484
- if ( self.theDate.getHours() > 11 ) {
485
- self.pickerMeri.val(o.meridiemLetters[1]);
486
- if ( self.theDate.getHours() === 12 ) {
487
- self.pickerHour.val(12);
488
- } else {
489
- self.pickerHour.val(self.theDate.getHours() - 12);
490
- }
491
- } else {
492
- self.pickerMeri.val(o.meridiemLetters[0]);
493
- if ( self.theDate.getHours() === 0 ) {
494
- self.pickerHour.val(12);
495
- } else {
496
- self.pickerHour.val(self.theDate.getHours());
497
- }
498
- }
499
- } else {
500
- self.pickerHour.val(self.theDate.getHours());
501
- }
502
- }
503
- /* END:TIMEBOX */
504
- /* BEGIN:FLIPBOX */
505
- if ( o.mode === 'flipbox' || o.mode === 'timeflipbox' ) {
506
- if ( o.afterToday !== false ) {
507
- testDate = new Date();
508
- if ( self.theDate < testDate ) { self.theDate = testDate; }
509
- }
510
- if ( o.maxDays !== false ) {
511
- testDate = new Date();
512
- testDate.setDate(testDate.getDate() + o.maxDays);
513
- if ( self.theDate > testDate ) { self.theDate = testDate; }
514
- }
515
- if ( o.minDays !== false ) {
516
- testDate = new Date();
517
- testDate.setDate(testDate.getDate() - o.minDays);
518
- if ( self.theDate < testDate ) { self.theDate = testDate; }
519
- }
520
- if ( o.maxYear !== false ) {
521
- testDate = new Date(o.maxYear, 0, 1);
522
- testDate.setDate(testDate.getDate() - 1);
523
- if ( self.theDate > testDate ) { self.theDate = testDate; }
524
- }
525
- if ( o.minYear !== false ) {
526
- testDate = new Date(o.minYear, 0, 1);
527
- if ( self.theDate < testDate ) { self.theDate = testDate; }
528
- }
529
-
530
- inheritDate = self._makeDate(self.input.val());
531
-
532
- self.controlsHeader.html( self._formatHeader(self.theDate) );
533
-
534
- for ( y=0; y<o.fieldsOrder.length; y++ ) {
535
- tmpVal = true;
536
- switch (o.fieldsOrder[y]) {
537
- case 'y':
538
- thisRow = self.pickerYar.find('ul');
539
- thisRow.html('');
540
- for ( i=-15; i<16; i++ ) {
541
- cTheme = ((inheritDate.getFullYear()===(self.theDate.getFullYear() + i))?o.pickPageHighButtonTheme:o.pickPageFlipButtonTheme);
542
- if ( i === 0 ) { cTheme = o.pickPageButtonTheme; }
543
- $("<li>", { 'class' : 'ui-body-'+cTheme, 'style':''+((tmpVal===true)?'margin-top: -453px':'') })
544
- .html("<span>"+(self.theDate.getFullYear() + i)+"</span>")
545
- .attr('data-offset', i)
546
- .attr('data-theme', cTheme)
547
- .appendTo(thisRow);
548
- if ( tmpVal === true ) { tmpVal = false; }
549
- }
550
- break;
551
- case 'm':
552
- thisRow = self.pickerMon.find('ul');
553
- thisRow.html('');
554
- for ( i=-12; i<13; i++ ) {
555
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), 1);
556
- testDate.setMonth(testDate.getMonth()+i);
557
- cTheme = ( inheritDate.getMonth() === testDate.getMonth() && inheritDate.getYear() === testDate.getYear() ) ? o.pickPageHighButtonTheme : o.pickPageFlipButtonTheme;
558
- if ( i === 0 ) { cTheme = o.pickPageButtonTheme; }
559
- $("<li>", { 'class' : 'ui-body-'+cTheme, 'style':''+((tmpVal===true)?'margin-top: -357px':'') })
560
- .attr('data-offset',i)
561
- .attr('data-theme', cTheme)
562
- .html("<span>"+o.monthsOfYearShort[testDate.getMonth()]+"</span>")
563
- .appendTo(thisRow);
564
- if ( tmpVal === true ) { tmpVal = false; }
565
- }
566
- break;
567
- case 'd':
568
- thisRow = self.pickerDay.find('ul');
569
- thisRow.html('');
570
- for ( i=-15; i<16; i++ ) {
571
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate());
572
- testDate.setDate(testDate.getDate()+i);
573
- cTheme = ( inheritDate.getDate() === testDate.getDate() && inheritDate.getMonth() === testDate.getMonth() && inheritDate.getYear() === testDate.getYear() ) ? o.pickPageHighButtonTheme : o.pickPageFlipButtonTheme;
574
- if ( i === 0 ) { cTheme = o.pickPageButtonTheme; }
575
- $("<li>", { 'class' : 'ui-body-'+cTheme, 'style':''+((tmpVal===true)?'margin-top: -453px':'') })
576
- .attr('data-offset', i)
577
- .attr('data-theme', cTheme)
578
- .html("<span>"+testDate.getDate()+"</span>")
579
- .appendTo(thisRow);
580
- if ( tmpVal === true ) { tmpVal = false; }
581
- }
582
- break;
583
- case 'h':
584
- thisRow = self.pickerHour.find('ul');
585
- thisRow.html('');
586
- for ( i=-12; i<13; i++ ) {
587
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate(), self.theDate.getHours());
588
- testDate.setHours(testDate.getHours()+i);
589
- cTheme = ( i === 0 ) ? o.pickPageButtonTheme : o.pickPageFlipButtonTheme;
590
- $("<li>", { 'class' : 'ui-body-'+cTheme, 'style':''+((tmpVal===true)?'margin-top: -357px':'') })
591
- .attr('data-offset',i)
592
- .attr('data-theme', cTheme)
593
- .html("<span>"+( ( o.timeFormat === 12 ) ? ( ( testDate.getHours() === 0 ) ? '12' : ( ( testDate.getHours() < 12 ) ? testDate.getHours() : ( ( testDate.getHours() === 12 ) ? '12' : (testDate.getHours()-12) ) ) ) : testDate.getHours() )+"</span>")
594
- .appendTo(thisRow);
595
- if ( tmpVal === true ) { tmpVal = false; }
596
- }
597
- break;
598
- case 'i':
599
- thisRow = self.pickerMins.find('ul');
600
- thisRow.html('');
601
- for ( i=-30; i<31; i++ ) {
602
- if ( o.minuteStep > 1 ) { self.theDate.setMinutes(self.theDate.getMinutes() - (self.theDate.getMinutes() % o.minuteStep)); }
603
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate(), self.theDate.getHours(), self.theDate.getMinutes());
604
- testDate.setMinutes(testDate.getMinutes()+(i*o.minuteStep));
605
- cTheme = ( i === 0 ) ? o.pickPageButtonTheme : o.pickPageFlipButtonTheme;
606
- $("<li>", { 'class' : 'ui-body-'+cTheme, 'style':''+((tmpVal===true)?'margin-top: -933px':'') })
607
- .attr('data-offset',(i*o.minuteStep))
608
- .attr('data-theme', cTheme)
609
- .html("<span>"+self._zeroPad(testDate.getMinutes())+"</span>")
610
- .appendTo(thisRow);
611
- if ( tmpVal === true ) { tmpVal = false; }
612
- }
613
- break;
614
- case 'a':
615
- thisRow = self.pickerMeri.find('ul');
616
- thisRow.html('');
617
- if ( self.theDate.getHours() > 11 ) {
618
- tmpVal = '-65';
619
- cTheme = [o.pickPageFlipButtonTheme, o.pickPageButtonTheme]
620
- } else {
621
- tmpVal = '-33';
622
- cTheme = [o.pickPageButtonTheme, o.pickPageFlipButtonTheme]
623
- }
624
- $("<li>").appendTo(thisRow).clone().appendTo(thisRow);
625
- $("<li>", { 'class' : 'ui-body-'+cTheme[0], 'style':'margin-top: '+tmpVal+'px' })
626
- .attr('data-offset',1)
627
- .attr('data-theme', cTheme[0])
628
- .html("<span>"+o.meridiemLetters[0]+"</span>")
629
- .appendTo(thisRow);
630
- $("<li>", { 'class' : 'ui-body-'+cTheme[1] })
631
- .attr('data-offset',1)
632
- .attr('data-theme', cTheme[1])
633
- .html("<span>"+o.meridiemLetters[1]+"</span>")
634
- .appendTo(thisRow);
635
- $("<li>").appendTo(thisRow).clone().appendTo(thisRow);
636
- break;
637
- }
638
- }
639
- }
640
- /* END:FLIPBOX */
641
- /* BEGIN:SLIDEBOX */
642
- if ( o.mode === 'slidebox' ) {
643
- if ( o.afterToday !== false ) {
644
- testDate = new Date();
645
- if ( self.theDate < testDate ) { self.theDate = testDate; }
646
- }
647
- if ( o.maxDays !== false ) {
648
- testDate = new Date();
649
- testDate.setDate(testDate.getDate() + o.maxDays);
650
- if ( self.theDate > testDate ) { self.theDate = testDate; }
651
- }
652
- if ( o.minDays !== false ) {
653
- testDate = new Date();
654
- testDate.setDate(testDate.getDate() - o.minDays);
655
- if ( self.theDate < testDate ) { self.theDate = testDate; }
656
- }
657
- if ( o.maxYear !== false ) {
658
- testDate = new Date(o.maxYear, 0, 1);
659
- testDate.setDate(testDate.getDate() - 1);
660
- if ( self.theDate > testDate ) { self.theDate = testDate; }
661
- }
662
- if ( o.minYear !== false ) {
663
- testDate = new Date(o.minYear, 0, 1);
664
- if ( self.theDate < testDate ) { self.theDate = testDate; }
665
- }
666
-
667
- inheritDate = self._makeDate(self.input.val());
668
-
669
- self.controlsHeader.html( self._formatHeader(self.theDate) );
670
- self.controlsInput.html('');
671
-
672
- for ( y=0; y<o.fieldsOrder.length; y++ ) {
673
- thisPRow = $("<div>", {'data-rowtype': o.fieldsOrder[y]});
674
-
675
- if ( o.wheelExists ) {
676
- thisPRow.bind('mousewheel', function(e,d) {
677
- e.preventDefault();
678
- self._offset($(this).attr('data-rowtype'), ((d>0)?1:-1));
679
- });
680
- }
681
-
682
- thisRow = $("<div>", {'class': 'ui-datebox-sliderow-int', 'data-rowtype': o.fieldsOrder[y]}).appendTo(thisPRow);
683
-
684
- if ( o.swipeEnabled ) {
685
- thisRow
686
- .bind(self.START_DRAG, function(e) {
687
- if ( !self.dragMove ) {
688
- self.dragMove = true;
689
- self.dragTarget = $(this);
690
- self.dragPos = parseInt(self.dragTarget.css('marginLeft').replace(/px/i, ''),10);
691
- self.dragStart = self.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
692
- self.dragEnd = false;
693
- e.stopPropagation();
694
- e.preventDefault();
695
- }
696
- });
697
- }
698
- switch (o.fieldsOrder[y]) {
699
- case 'y':
700
- thisPRow.addClass('ui-datebox-sliderow-ym');
701
- thisRow.css('marginLeft', '-333px');
702
- for ( i=-5; i<6; i++ ) {
703
- cTheme = ((inheritDate.getFullYear()===(self.theDate.getFullYear() + i))?o.pickPageHighButtonTheme:o.pickPageSlideButtonTheme);
704
- if ( i === 0 ) { cTheme = o.pickPageButtonTheme; }
705
- $("<div>", { 'class' : 'ui-datebox-slideyear ui-corner-all ui-btn-up-'+cTheme })
706
- .text(self.theDate.getFullYear() + i)
707
- .attr('data-offset', i)
708
- .attr('data-theme', cTheme)
709
- .bind('vmouseover vmouseout', function() { self._hoover(this); })
710
- .bind('vclick', function(e) { e.preventDefault(); self._offset('y', parseInt($(this).attr('data-offset'),10)); })
711
- .appendTo(thisRow);
712
- }
713
- break;
714
- case 'm':
715
- thisPRow.addClass('ui-datebox-sliderow-ym');
716
- thisRow.css('marginLeft', '-204px');
717
- for ( i=-6; i<7; i++ ) {
718
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), 1);
719
- testDate.setMonth(testDate.getMonth()+i);
720
- cTheme = ( inheritDate.getMonth() === testDate.getMonth() && inheritDate.getYear() === testDate.getYear() ) ? o.pickPageHighButtonTheme : o.pickPageSlideButtonTheme;
721
- if ( i === 0 ) { cTheme = o.pickPageButtonTheme; }
722
- $("<div>", { 'class' : 'ui-datebox-slidemonth ui-corner-all ui-btn-up-'+cTheme })
723
- .attr('data-offset',i)
724
- .attr('data-theme', cTheme)
725
- .text(o.monthsOfYearShort[testDate.getMonth()])
726
- .bind('vmouseover vmouseout', function() { self._hoover(this); })
727
- .bind('vclick', function(e) { e.preventDefault(); self._offset('m', parseInt($(this).attr('data-offset'),10)); })
728
- .appendTo(thisRow);
729
- }
730
- break;
731
- case 'd':
732
- thisPRow.addClass('ui-datebox-sliderow-d');
733
- thisRow.css('marginLeft', '-386px');
734
- for ( i=-15; i<16; i++ ) {
735
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate());
736
- testDate.setDate(testDate.getDate()+i);
737
- cTheme = ( inheritDate.getDate() === testDate.getDate() && inheritDate.getMonth() === testDate.getMonth() && inheritDate.getYear() === testDate.getYear() ) ? o.pickPageHighButtonTheme : o.pickPageSlideButtonTheme;
738
- if ( i === 0 ) { cTheme = o.pickPageButtonTheme; }
739
-
740
- $("<div>", { 'class' : 'ui-datebox-slideday ui-corner-all ui-btn-up-'+cTheme })
741
- .attr('data-offset', i)
742
- .attr('data-theme', cTheme)
743
- .html(testDate.getDate() + '<br /><span class="ui-datebox-slidewday">' + o.daysOfWeekShort[testDate.getDay()] + '</span>')
744
- .bind('vmouseover vmouseout', function() { self._hoover(this); })
745
- .bind('vclick', function(e) { e.preventDefault(); self._offset('d', parseInt($(this).attr('data-offset'),10)); })
746
- .appendTo(thisRow);
747
- }
748
- break;
749
- case 'h':
750
- thisPRow.addClass('ui-datebox-sliderow-hi');
751
- thisRow.css('marginLeft', '-284px');
752
- for ( i=-12; i<13; i++ ) {
753
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate(), self.theDate.getHours());
754
- testDate.setHours(testDate.getHours()+i);
755
- cTheme = ( i === 0 ) ? o.pickPageButtonTheme : o.pickPageSlideButtonTheme;
756
- $("<div>", { 'class' : 'ui-datebox-slidehour ui-corner-all ui-btn-up-'+cTheme })
757
- .attr('data-offset',i)
758
- .attr('data-theme', cTheme)
759
- .html(( ( o.timeFormat === 12 ) ? ( ( testDate.getHours() === 0 ) ? '12<span class="ui-datebox-slidewday">AM</span>' : ( ( testDate.getHours() < 12 ) ? testDate.getHours() + '<span class="ui-datebox-slidewday">AM</span>' : ( ( testDate.getHours() === 12 ) ? '12<span class="ui-datebox-slidewday">PM</span>' : (testDate.getHours()-12) + '<span class="ui-datebox-slidewday">PM</span>') ) ) : testDate.getHours() ))
760
- .bind('vmouseover vmouseout', function() { self._hoover(this); })
761
- .bind('vclick', function(e) { e.preventDefault(); self._offset('h', parseInt($(this).attr('data-offset'),10)); })
762
- .appendTo(thisRow);
763
- }
764
- break;
765
- case 'i':
766
- thisPRow.addClass('ui-datebox-sliderow-hi');
767
- thisRow.css('marginLeft', '-896px');
768
- for ( i=-30; i<31; i++ ) {
769
- testDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate(), self.theDate.getHours(), self.theDate.getMinutes());
770
- testDate.setMinutes(testDate.getMinutes()+i);
771
- cTheme = ( i === 0 ) ? o.pickPageButtonTheme : o.pickPageSlideButtonTheme;
772
- $("<div>", { 'class' : 'ui-datebox-slidemins ui-corner-all ui-btn-up-'+cTheme })
773
- .attr('data-offset',i)
774
- .attr('data-theme', cTheme)
775
- .text(self._zeroPad(testDate.getMinutes()))
776
- .bind('vmouseover vmouseout', function() { self._hoover(this); })
777
- .bind('vclick', function(e) { e.preventDefault(); self._offset('i', parseInt($(this).attr('data-offset'),10)); })
778
- .appendTo(thisRow);
779
- }
780
- break;
781
- }
782
- thisPRow.appendTo(self.controlsInput);
783
- }
784
- }
785
- /* END:SLIDEBOX */
786
- /* BEGIN:DATEBOX */
787
- if ( o.mode === 'datebox' ) {
788
- if ( o.afterToday !== false ) {
789
- testDate = new Date();
790
- if ( self.theDate < testDate ) { self.theDate = testDate; }
791
- }
792
- if ( o.beforeToday !== false ) {
793
- testDate = new Date();
794
- if ( self.theDate > testDate ) { self.theDate = testDate; }
795
- }
796
- if ( o.maxDays !== false ) {
797
- testDate = new Date();
798
- testDate.setDate(testDate.getDate() + o.maxDays);
799
- if ( self.theDate > testDate ) { self.theDate = testDate; }
800
- }
801
- if ( o.minDays !== false ) {
802
- testDate = new Date();
803
- testDate.setDate(testDate.getDate() - o.minDays);
804
- if ( self.theDate < testDate ) { self.theDate = testDate; }
805
- }
806
- if ( o.maxYear !== false ) {
807
- testDate = new Date(o.maxYear, 0, 1);
808
- testDate.setDate(testDate.getDate() - 1);
809
- if ( self.theDate > testDate ) { self.theDate = testDate; }
810
- }
811
- if ( o.minYear !== false ) {
812
- testDate = new Date(o.minYear, 0, 1);
813
- if ( self.theDate < testDate ) { self.theDate = testDate; }
814
- }
815
-
816
- self.controlsHeader.html( self._formatHeader(self.theDate) );
817
- self.pickerMon.val(self.theDate.getMonth() + 1);
818
- self.pickerDay.val(self.theDate.getDate());
819
- self.pickerYar.val(self.theDate.getFullYear());
820
- }
821
- /* END:DATEBOX */
822
- /* BEGIN:CALBOX */
823
- if ( o.mode === 'calbox' ) { // Meat and potatos - make the calendar grid.
824
- self.controlsInput.text( o.monthsOfYear[self.theDate.getMonth()] + " " + self.theDate.getFullYear() );
825
- self.controlsSet.html('');
826
-
827
- calmode = {'today': -1, 'highlightDay': -1, 'presetDay': -1, 'nexttoday': 1,
828
- 'thisDate': new Date(), 'maxDate': new Date(), 'minDate': new Date(),
829
- 'currentMonth': false, 'weekMode': 0, 'weekDays': null, 'thisTheme': o.pickPageButtonTheme };
830
- calmode.start = self._getFirstDay(self.theDate);
831
- calmode.end = self._getLastDate(self.theDate);
832
- calmode.lastend = self._getLastDateBefore(self.theDate);
833
- calmode.presetDate = self._makeDate(self.input.val());
834
-
835
- if ( o.calStartDay > 0 ) {
836
- calmode.start = calmode.start - o.calStartDay;
837
- if ( calmode.start < 0 ) { calmode.start = calmode.start + 7; }
838
- }
839
-
840
- calmode.prevtoday = calmode.lastend - (calmode.start - 1);
841
- calmode.checkDates = ( o.afterToday !== false || o.beforeToday !== false || o.notToday !== false || o.maxDays !== false || o.minDays !== false || o.blackDates !== false || o.blackDays !== false );
842
-
843
- if ( calmode.thisDate.getMonth() === self.theDate.getMonth() && calmode.thisDate.getFullYear() === self.theDate.getFullYear() ) { calmode.currentMonth = true; calmode.highlightDay = calmode.thisDate.getDate(); }
844
- if ( self._checker(calmode.presetDate) === self._checker(self.theDate) ) { calmode.presetDay = calmode.presetDate.getDate(); }
845
-
846
- self.calNoPrev = false; self.calNoNext = false;
847
-
848
- if ( o.afterToday === true &&
849
- ( calmode.currentMonth === true || ( calmode.thisDate.getMonth() >= self.theDate.getMonth() && self.theDate.getFullYear() === calmode.thisDate.getFullYear() ) ) ) {
850
- self.calNoPrev = true; }
851
- if ( o.beforeToday === true &&
852
- ( calmode.currentMonth === true || ( calmode.thisDate.getMonth() <= self.theDate.getMonth() && self.theDate.getFullYear() === calmode.thisDate.getFullYear() ) ) ) {
853
- self.calNoNext = true; }
854
-
855
- if ( o.minDays !== false ) {
856
- calmode.minDate.setDate(calmode.minDate.getDate() - o.minDays);
857
- if ( self.theDate.getFullYear() === calmode.minDate.getFullYear() && self.theDate.getMonth() <= calmode.minDate.getMonth() ) { self.calNoPrev = true;}
858
- }
859
- if ( o.maxDays !== false ) {
860
- calmode.maxDate.setDate(calmode.maxDate.getDate() + o.maxDays);
861
- if ( self.theDate.getFullYear() === calmode.maxDate.getFullYear() && self.theDate.getMonth() >= calmode.maxDate.getMonth() ) { self.calNoNext = true;}
862
- }
863
-
864
- if ( o.calShowDays ) {
865
- if ( o.daysOfWeekShort.length < 8 ) { o.daysOfWeekShort = o.daysOfWeekShort.concat(o.daysOfWeekShort); }
866
- calmode.weekDays = $("<div>", {'class':'ui-datebox-gridrow'}).appendTo(self.controlsSet);
867
- for ( i=0; i<=6;i++ ) {
868
- $("<div>"+o.daysOfWeekShort[i+o.calStartDay]+"</div>").addClass('ui-datebox-griddate ui-datebox-griddate-empty ui-datebox-griddate-label').appendTo(calmode.weekDays);
869
- }
870
- }
871
-
872
- for ( gridWeek=0; gridWeek<=5; gridWeek++ ) {
873
- if ( gridWeek === 0 || ( gridWeek > 0 && (calmode.today > 0 && calmode.today <= calmode.end) ) ) {
874
- thisRow = $("<div>", {'class': 'ui-datebox-gridrow'}).appendTo(self.controlsSet);
875
- for ( gridDay=0; gridDay<=6; gridDay++) {
876
- if ( gridDay === 0 ) { calmode.weekMode = ( calmode.today < 1 ) ? (calmode.prevtoday - calmode.lastend + o.calWeekModeFirstDay) : (calmode.today + o.calWeekModeFirstDay); }
877
- if ( gridDay === calmode.start && gridWeek === 0 ) { calmode.today = 1; }
878
- if ( calmode.today > calmode.end ) { calmode.today = -1; }
879
- if ( calmode.today < 1 ) {
880
- if ( o.calShowOnlyMonth ) {
881
- $("<div>", {'class': 'ui-datebox-griddate ui-datebox-griddate-empty'}).appendTo(thisRow);
882
- } else {
883
- if (
884
- ( o.blackDays !== false && $.inArray(gridDay, o.blackDays) > -1 ) ||
885
- ( o.blackDates !== false && $.inArray(self._isoDate(self.theDate.getFullYear(), (self.theDate.getMonth()), calmode.prevtoday), o.blackDates) > -1 ) ||
886
- ( o.blackDates !== false && $.inArray(self._isoDate(self.theDate.getFullYear(), (self.theDate.getMonth()+2), calmode.nexttoday), o.blackDates) > -1 ) ) {
887
- skipThis = true;
888
- } else { skipThis = false; }
889
-
890
- if ( gridWeek === 0 ) {
891
- $("<div>"+String(calmode.prevtoday)+"</div>")
892
- .addClass('ui-datebox-griddate ui-datebox-griddate-empty').appendTo(thisRow)
893
- .attr('data-date', ((o.calWeekMode)?(calmode.weekMode+calmode.lastend):calmode.prevtoday))
894
- .bind((!skipThis)?'vclick':'error', function(e) {
895
- e.preventDefault();
896
- if ( !self.calNoPrev ) {
897
- self.theDate.setMonth(self.theDate.getMonth() - 1);
898
- self.theDate.setDate($(this).attr('data-date'));
899
- self.input.trigger('datebox', {'method':'set', 'value':self._formatDate(self.theDate)});
900
- self.input.trigger('datebox', {'method':'close'});
901
- }
902
- });
903
- calmode.prevtoday++;
904
- } else {
905
- $("<div>"+String(calmode.nexttoday)+"</div>")
906
- .addClass('ui-datebox-griddate ui-datebox-griddate-empty').appendTo(thisRow)
907
- .attr('data-date', ((o.calWeekMode)?calmode.weekMode:calmode.nexttoday))
908
- .bind((!skipThis)?'vclick':'error', function(e) {
909
- e.preventDefault();
910
- if ( !self.calNoNext ) {
911
- self.theDate.setDate($(this).attr('data-date'));
912
- if ( !o.calWeekMode ) { self.theDate.setMonth(self.theDate.getMonth() + 1); }
913
- self.input.trigger('datebox', {'method':'set', 'value':self._formatDate(self.theDate)});
914
- self.input.trigger('datebox', {'method':'close'});
915
- }
916
- });
917
- calmode.nexttoday++;
918
- }
919
- }
920
- } else {
921
- skipThis = false;
922
- if ( calmode.checkDates ) {
923
- if ( o.afterToday && self._checker(calmode.thisDate) > (self._checker(self.theDate)+calmode.today-self.theDate.getDate()) ) {
924
- skipThis = true;
925
- }
926
- if ( !skipThis && o.beforeToday && self._checker(calmode.thisDate) < (self._checker(self.theDate)+calmode.today-self.theDate.getDate()) ) {
927
- skipThis = true;
928
- }
929
- if ( !skipThis && o.notToday && calmode.today === calmode.highlightDay ) {
930
- skipThis = true;
931
- }
932
- if ( !skipThis && o.maxDays !== false && self._checker(calmode.maxDate) < (self._checker(self.theDate)+calmode.today-self.theDate.getDate()) ) {
933
- skipThis = true;
934
- }
935
- if ( !skipThis && o.minDays !== false && self._checker(calmode.minDate) > (self._checker(self.theDate)+calmode.today-self.theDate.getDate()) ) {
936
- skipThis = true;
937
- }
938
- if ( !skipThis && ( o.blackDays !== false || o.blackDates !== false ) ) { // Blacklists
939
- if (
940
- ( $.inArray(gridDay, o.blackDays) > -1 ) ||
941
- ( $.inArray(self._isoDate(self.theDate.getFullYear(), self.theDate.getMonth()+1, calmode.today), o.blackDates) > -1 ) ) {
942
- skipThis = true;
943
- }
944
- }
945
- }
946
-
947
- if ( o.calHighPicked && calmode.today === calmode.presetDay ) {
948
- calmode.thisTheme = o.pickPageHighButtonTheme;
949
- } else if ( o.calHighToday && calmode.today === calmode.highlightDay ) {
950
- calmode.thisTheme = o.pickPageTodayButtonTheme;
951
- } else if ( $.isArray(o.highDates) && ($.inArray(self._isoDate(self.theDate.getFullYear(), self.theDate.getMonth()+1, calmode.today), o.highDates) > -1 ) ) {
952
- calmode.thisTheme = o.pickPageOHighButtonTheme;
953
- } else if ( $.isArray(o.highDays) && $.inArray(gridDay, o.highDays) > -1 ) {
954
- calmode.thisTheme = o.pickPageODHighButtonTheme;
955
- } else {
956
- calmode.thisTheme = o.pickPageButtonTheme;
957
- }
958
-
959
- $("<div>"+String(calmode.today)+"</div>")
960
- .addClass('ui-datebox-griddate ui-corner-all')
961
- .attr('data-date', ((o.calWeekMode)?calmode.weekMode:calmode.today))
962
- .attr('data-theme', calmode.thisTheme)
963
- .appendTo(thisRow)
964
- .addClass('ui-btn-up-'+calmode.thisTheme)
965
- .bind('vmouseover vmouseout', function() {
966
- if ( o.calWeekMode !== false && o.calWeekModeHighlight === true ) {
967
- $(this).parent().find('div').each(function() { self._hoover(this); });
968
- } else { self._hoover(this); }
969
- })
970
- .bind((!skipThis)?'vclick':'error', function(e) {
971
- e.preventDefault();
972
- self.theDate.setDate($(this).attr('data-date'));
973
- self.input.trigger('datebox', {'method':'set', 'value':self._formatDate(self.theDate)});
974
- self.input.trigger('datebox', {'method':'close'});
975
- })
976
- .css((skipThis)?'color':'nocolor', o.disabledDayColor);
977
-
978
- calmode.today++;
979
- }
980
- }
981
- }
982
- }
983
- }
984
- /* END:CALBOX */
985
- },
986
- _create: function() {
987
- // Create the widget, called automatically by widget system
988
- var self = this,
989
- o = $.extend(this.options, this.element.data('options')),
990
- input = this.element,
991
- focusedEl = input.wrap('<div class="ui-input-datebox ui-shadow-inset ui-corner-all ui-body-'+ o.theme +'"></div>').parent(),
992
- theDate = new Date(), // Internal date object, used for all operations
993
- initDate = new Date(theDate.getTime()), // Initilization time - used for duration
994
- dialogTitle = ((o.titleDialogLabel === false)?((o.mode==='timebox')?o.titleTimeDialogLabel:o.titleDateDialogLabel):o.titleDialogLabel),
995
-
996
- // This is the button that is added to the original input
997
- openbutton = $('<a href="#" class="ui-input-clear" title="date picker">date picker</a>')
998
- .bind('vclick', function (e) {
999
- e.preventDefault();
1000
- if ( !o.disabled ) { self.input.trigger('datebox', {'method': 'open'}); }
1001
- setTimeout( function() { $(e.target).closest("a").removeClass($.mobile.activeBtnClass); }, 300);
1002
- })
1003
- .appendTo(focusedEl).buttonMarkup({icon: 'grid', iconpos: 'notext', corners:true, shadow:true})
1004
- .css({'vertical-align': 'middle', 'float': 'right'}),
1005
- thisPage = input.closest('.ui-page'),
1006
- pickPage = $("<div data-role='dialog' class='ui-dialog-datebox' data-theme='" + o.pickPageTheme + "' >" +
1007
- "<div data-role='header' data-backbtn='false' data-theme='a'>" +
1008
- "<div class='ui-title'>" + dialogTitle + "</div>"+
1009
- "</div>"+
1010
- "<div data-role='content'></div>"+
1011
- "</div>")
1012
- .appendTo( $.mobile.pageContainer )
1013
- .page().css('minHeight', '0px').css('zIndex', o.zindex).addClass('pop'),
1014
- pickPageContent = pickPage.find( ".ui-content" ),
1015
- touch = ('ontouchstart' in window),
1016
- START_EVENT = touch ? 'touchstart' : 'mousedown',
1017
- MOVE_EVENT = touch ? 'touchmove' : 'mousemove',
1018
- END_EVENT = touch ? 'touchend' : 'mouseup',
1019
- dragMove = false,
1020
- dragStart = false,
1021
- dragEnd = false,
1022
- dragPos = false,
1023
- dragTarget = false,
1024
- dragThisDelta = 0;
1025
-
1026
- if(o.defaultPickerValue===false && o.defaultDate!==false){
1027
- o.defaultPickerValue = o.defaultDate;
1028
- }
1029
-
1030
- $('label[for='+input.attr('id')+']').addClass('ui-input-text').css('verticalAlign', 'middle');
1031
-
1032
- /* BUILD:MODE */
1033
-
1034
- if ( o.mode === "timeflipbox" ) { // No header in time flipbox.
1035
- o.headerFormat = ' ';
1036
- }
1037
-
1038
- // Select the appropriate output format if not otherwise specified
1039
- if ( o.timeOutput === false ) {
1040
- o.timeOutput = o.timeFormats[o.timeFormat];
1041
- }
1042
- if ( o.fieldsOrder === false ) {
1043
- switch (o.mode) {
1044
- case 'timebox':
1045
- case 'timeflipbox':
1046
- o.fieldsOrder = o.timeFieldOrder;
1047
- break;
1048
- case 'slidebox':
1049
- o.fieldsOrder = o.slideFieldOrder;
1050
- break;
1051
- default:
1052
- o.fieldsOrder = o.dateFieldOrder;
1053
- }
1054
- }
1055
-
1056
- // For focus mode, disable button, and bind click of input element and it's parent
1057
- if ( o.noButtonFocusMode || o.useInline || o.noButton ) { openbutton.hide(); }
1058
-
1059
- focusedEl.bind('vclick', function() {
1060
- if ( !o.disabled && o.noButtonFocusMode ) { input.trigger('datebox', {'method': 'open'}); }
1061
- });
1062
-
1063
-
1064
- input
1065
- .removeClass('ui-corner-all ui-shadow-inset')
1066
- .focus(function(){
1067
- if ( ! o.disabled ) {
1068
- focusedEl.addClass('ui-focus');
1069
- if ( o.noButtonFocusMode ) { focusedEl.addClass('ui-focus'); input.trigger('datebox', {'method': 'open'}); }
1070
- }
1071
- input.removeClass('ui-focus');
1072
- })
1073
- .blur(function(){
1074
- focusedEl.removeClass('ui-focus');
1075
- input.removeClass('ui-focus');
1076
- })
1077
- .change(function() {
1078
- self.theDate = self._makeDate(self.input.val());
1079
- self._update();
1080
- });
1081
-
1082
- // Bind the master handler.
1083
- input.bind('datebox', self._dateboxHandler);
1084
-
1085
- // Bind the close button on the DIALOG mode.
1086
- pickPage.find( ".ui-header a").bind('vclick', function(e) {
1087
- e.preventDefault();
1088
- e.stopImmediatePropagation();
1089
- self.input.trigger('datebox', {'method':'close'});
1090
- });
1091
-
1092
- $.extend(self, {
1093
- pickPage: pickPage,
1094
- thisPage: thisPage,
1095
- pickPageContent: pickPageContent,
1096
- input: input,
1097
- theDate: theDate,
1098
- initDate: initDate,
1099
- focusedEl: focusedEl,
1100
- touch: touch,
1101
- START_DRAG: START_EVENT,
1102
- MOVE_DRAG: MOVE_EVENT,
1103
- END_DRAG: END_EVENT,
1104
- dragMove: dragMove,
1105
- dragStart: dragStart,
1106
- dragEnd: dragEnd,
1107
- dragPos: dragPos
1108
- });
1109
-
1110
- // Check if mousewheel plugin is loaded
1111
- if ( typeof $.event.special.mousewheel !== 'undefined' ) { o.wheelExists = true; }
1112
-
1113
- self._buildPage();
1114
-
1115
- // drag and drop support, all ending and moving events are defined here, start events are handled in _buildPage or update
1116
- if ( o.swipeEnabled ) {
1117
- $(document).bind(self.MOVE_DRAG, function(e) {
1118
- if ( self.dragMove ) {
1119
- if ( o.mode === 'slidebox' ) {
1120
- self.dragEnd = self.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
1121
- self.dragTarget.css('marginLeft', (self.dragPos + self.dragEnd - self.dragStart) + 'px');
1122
- e.preventDefault();
1123
- e.stopPropagation();
1124
- return false;
1125
- } else if ( o.mode === 'flipbox' || o.mode === 'timeflipbox' ) {
1126
- self.dragEnd = self.touch ? e.originalEvent.changedTouches[0].pageY : e.pageY;
1127
- self.dragTarget.css('marginTop', (self.dragPos + self.dragEnd - self.dragStart) + 'px');
1128
- e.preventDefault();
1129
- e.stopPropagation();
1130
- return false;
1131
- } else if ( o.mode === 'durationbox' || o.mode === 'timebox' || o.mode === 'datebox' ) {
1132
- self.dragEnd = self.touch ? e.originalEvent.changedTouches[0].pageY : e.pageY;
1133
- if ( (self.dragEnd - self.dragStart) % 2 === 0 ) {
1134
- dragThisDelta = (self.dragEnd - self.dragStart) / -2;
1135
- if ( dragThisDelta < self.dragPos ) {
1136
- self._offset(self.dragTarget, -1*(self.dragTarget==='i'?o.minuteStep:1));
1137
- } else if ( dragThisDelta > self.dragPos ) {
1138
- self._offset(self.dragTarget, 1*(self.dragTarget==='i'?o.minuteStep:1));
1139
- }
1140
- self.dragPos = dragThisDelta;
1141
- }
1142
- e.preventDefault();
1143
- e.stopPropagation();
1144
- return false;
1145
- }
1146
- }
1147
- });
1148
- $(document).bind(self.END_DRAG, function(e) {
1149
- if ( self.dragMove ) {
1150
- self.dragMove = false;
1151
- if ( o.mode === 'slidebox' ) {
1152
- if ( self.dragEnd !== false && Math.abs(self.dragStart - self.dragEnd) > 25 ) {
1153
- e.preventDefault();
1154
- e.stopPropagation();
1155
- switch(self.dragTarget.parent().data('rowtype')) {
1156
- case 'y':
1157
- self._offset('y', parseInt(( self.dragStart - self.dragEnd ) / 84, 10));
1158
- break;
1159
- case 'm':
1160
- self._offset('m', parseInt(( self.dragStart - self.dragEnd ) / 51, 10));
1161
- break;
1162
- case 'd':
1163
- self._offset('d', parseInt(( self.dragStart - self.dragEnd ) / 32, 10));
1164
- break;
1165
- case 'h':
1166
- self._offset('h', parseInt(( self.dragStart - self.dragEnd ) / 32, 10));
1167
- break;
1168
- case 'i':
1169
- self._offset('i', parseInt(( self.dragStart - self.dragEnd ) / 32, 10));
1170
- break;
1171
- }
1172
- }
1173
- } else if ( o.mode === 'flipbox' || o.mode === 'timeflipbox' ) {
1174
- if ( self.dragEnd !== false ) {
1175
- e.preventDefault();
1176
- e.stopPropagation();
1177
- self._offset(self.dragTarget.parent().parent().data('field'), parseInt(( self.dragStart - self.dragEnd ) / 30, 10));
1178
- }
1179
- }
1180
- self.dragStart = false;
1181
- self.dragEnd = false;
1182
- }
1183
- });
1184
- }
1185
-
1186
- // Disable when done if element attribute disabled is true.
1187
- if ( input.is(':disabled') ) {
1188
- self.disable();
1189
- }
1190
- // Turn input readonly if requested (on by default)
1191
- if ( o.disableManualInput === true ) {
1192
- input.attr("readonly", true);
1193
- }
1194
- },
1195
- _buildPage: function () {
1196
- // Build the controls
1197
- var self = this,
1198
- o = self.options, x, newHour, fld,
1199
- linkdiv =$("<div><a href='#'></a></div>"),
1200
- pickerContent = $("<div>", { "class": 'ui-datebox-container ui-overlay-shadow ui-corner-all ui-datebox-hidden pop ui-body-'+o.pickPageTheme} ).css('zIndex', o.zindex),
1201
- templInput = $("<input type='text' />").addClass('ui-input-text ui-corner-all ui-shadow-inset ui-datebox-input ui-body-'+o.pickPageInputTheme),
1202
- templControls = $("<div>", { "class":'ui-datebox-controls' }),
1203
- templFlip = $("<div class='ui-overlay-shadow'><ul></ul></div>"),
1204
- controlsPlus, controlsInput, controlsMinus, controlsSet, controlsHeader,
1205
- pickerHour, pickerMins, pickerMeri, pickerMon, pickerDay, pickerYar, pickerSecs,
1206
- calNoNext = false,
1207
- calNoPrev = false,
1208
- screen = $("<div>", {'class':'ui-datebox-screen ui-datebox-hidden'+((o.useModal)?' ui-datebox-screen-modal':'')})
1209
- .css({'z-index': o.zindex-1})
1210
- .appendTo(self.thisPage)
1211
- .bind("vclick", function(event) {
1212
- event.preventDefault();
1213
- self.input.trigger('datebox', {'method':'close'});
1214
- });
1215
-
1216
- if ( o.noAnimation ) { pickerContent.removeClass('pop'); }
1217
-
1218
- /* BEGIN:FLIPBOX */
1219
- if ( o.mode === 'flipbox' || o.mode === 'timeflipbox' ) {
1220
- controlsHeader = $("<div class='ui-datebox-header'><h4>Unitialized</h4></div>").appendTo(pickerContent).find("h4");
1221
- controlsInput = $("<div>", {"class":'ui-datebox-flipcontent'}).appendTo(pickerContent);
1222
- controlsPlus = $("<div>", {"class":'ui-datebox-flipcenter ui-overlay-shadow'}).appendTo(pickerContent);
1223
- controlsSet = templControls.clone().appendTo(pickerContent);
1224
-
1225
- pickerDay = templFlip.clone().attr('data-field', 'd');
1226
- pickerMon = templFlip.clone().attr('data-field', 'm');
1227
- pickerYar = templFlip.clone().attr('data-field', 'y');
1228
- pickerHour = templFlip.clone().attr('data-field', 'h');
1229
- pickerMins = templFlip.clone().attr('data-field', 'i');
1230
- pickerMeri = templFlip.clone().attr('data-field', 'a');
1231
-
1232
- if ( o.wheelExists ) { // Mousewheel operation, if the plugin is loaded.
1233
- pickerYar.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('y', (d<0)?-1:1); });
1234
- pickerMon.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('m', (d<0)?-1:1); });
1235
- pickerDay.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('d', (d<0)?-1:1); });
1236
- pickerHour.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('h', (d<0)?-1:1); });
1237
- pickerMins.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('i', ((d<0)?-1:1)*o.minuteStep); });
1238
- pickerMeri.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('a', d); });
1239
- controlsPlus.bind('mousewheel', function(e,d) {
1240
- e.preventDefault();
1241
- if ( o.fieldsOrder.length === 3 ) {
1242
- fld = o.fieldsOrder[parseInt((e.pageX - $(e.currentTarget).offset().left) / 87, 10)];
1243
- } else if ( o.fieldsOrder.length === 2 ) {
1244
- fld = o.fieldsOrder[parseInt((e.pageX - $(e.currentTarget).offset().left) / 130, 10)];
1245
- }
1246
- self._offset(fld, ((d<0)?-1:1) * ((fld==="i")?o.minuteStep:1));
1247
- });
1248
- }
1249
-
1250
- for(x=0; x<=o.fieldsOrder.length; x++) { // Use fieldsOrder to decide which to show.
1251
- if (o.fieldsOrder[x] === 'y') { pickerYar.appendTo(controlsInput); }
1252
- if (o.fieldsOrder[x] === 'm') { pickerMon.appendTo(controlsInput); }
1253
- if (o.fieldsOrder[x] === 'd') { pickerDay.appendTo(controlsInput); }
1254
- if (o.fieldsOrder[x] === 'h') { pickerHour.appendTo(controlsInput); }
1255
- if (o.fieldsOrder[x] === 'i') { pickerMins.appendTo(controlsInput); }
1256
- if (o.fieldsOrder[x] === 'a' && o.timeFormat === 12 ) { pickerMeri.appendTo(controlsInput); }
1257
- }
1258
-
1259
- if ( o.swipeEnabled ) { // Drag and drop support
1260
- controlsInput.find('ul').bind(self.START_DRAG, function(e,f) {
1261
- if ( !self.dragMove ) {
1262
- if ( typeof f !== "undefined" ) { e = f; }
1263
- self.dragMove = true;
1264
- self.dragTarget = $(this).find('li').first();
1265
- self.dragPos = parseInt(self.dragTarget.css('marginTop').replace(/px/i, ''),10);
1266
- self.dragStart = self.touch ? e.originalEvent.changedTouches[0].pageY : e.pageY;
1267
- self.dragEnd = false;
1268
- e.stopPropagation();
1269
- e.preventDefault();
1270
- }
1271
- });
1272
- controlsPlus.bind(self.START_DRAG, function(e) {
1273
- if ( !self.dragMove ) {
1274
- self.dragTarget = self.touch ? e.originalEvent.changedTouches[0].pageX - $(e.currentTarget).offset().left : e.pageX - $(e.currentTarget).offset().left;
1275
- if ( o.fieldsOrder.length === 3 ) {
1276
- $(self.controlsInput.find('ul').get(parseInt(self.dragTarget / 87, 10))).trigger(self.START_DRAG, e);
1277
- } else if ( o.fieldsOrder.length === 2 ) {
1278
- $(self.controlsInput.find('ul').get(parseInt(self.dragTarget / 130, 10))).trigger(self.START_DRAG, e);
1279
- }
1280
- }
1281
- });
1282
- }
1283
-
1284
- if ( o.noSetButton === false ) { // Set button at bottom
1285
- $("<a href='#'>" + ((o.mode==='timeflipbox')?o.setTimeButtonLabel:o.setDateButtonLabel) + "</a>")
1286
- .appendTo(controlsSet).buttonMarkup({theme: o.pickPageTheme, icon: 'check', iconpos: 'left', corners:true, shadow:true})
1287
- .bind('vclick', function(e) {
1288
- e.preventDefault();
1289
- if ( o.mode === 'timeflipbox' ) { self.input.trigger('datebox', {'method':'set', 'value':self._formatTime(self.theDate)}); }
1290
- else { self.input.trigger('datebox', {'method':'set', 'value':self._formatDate(self.theDate)}); }
1291
- self.input.trigger('datebox', {'method':'close'});
1292
- });
1293
- }
1294
-
1295
- $.extend(self, {
1296
- controlsHeader: controlsHeader,
1297
- controlsInput: controlsInput,
1298
- pickerDay: pickerDay,
1299
- pickerMon: pickerMon,
1300
- pickerYar: pickerYar,
1301
- pickerHour: pickerHour,
1302
- pickerMins: pickerMins,
1303
- pickerMeri: pickerMeri
1304
- });
1305
-
1306
- pickerContent.appendTo(self.thisPage);
1307
-
1308
- }
1309
- /* END:FLIPBOX */
1310
- /* BEGIN:DURATIONBOX */
1311
- if ( o.mode === 'durationbox' ) {
1312
- controlsPlus = templControls.clone().removeClass('ui-datebox-controls').addClass('ui-datebox-scontrols').appendTo(pickerContent);
1313
- controlsInput = controlsPlus.clone().appendTo(pickerContent);
1314
- controlsMinus = controlsPlus.clone().appendTo(pickerContent);
1315
- controlsSet = templControls.clone().appendTo(pickerContent);
1316
-
1317
- pickerDay = templInput.removeClass('ui-datebox-input').clone()
1318
- .keyup(function() { if ( $(this).val() !== '' ) { self._updateduration(); } });
1319
-
1320
- pickerHour = pickerDay.clone().keyup(function() { if ( $(this).val() !== '' ) { self._updateduration(); } });
1321
- pickerMins = pickerDay.clone().keyup(function() { if ( $(this).val() !== '' ) { self._updateduration(); } });
1322
- pickerSecs = pickerDay.clone().keyup(function() { if ( $(this).val() !== '' ) { self._updateduration(); } });
1323
-
1324
- if ( o.wheelExists ) { // Mousewheel operation, if the plgin is loaded
1325
- pickerDay.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('d', ((d<0)?-1:1)*o.durationSteppers['d']); });
1326
- pickerHour.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('h', ((d<0)?-1:1)*o.durationSteppers['h']); });
1327
- pickerMins.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('i', ((d<0)?-1:1)*o.durationSteppers['i']); });
1328
- pickerSecs.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('s', ((d<0)?-1:1)*o.durationSteppers['s']); });
1329
- }
1330
-
1331
- for ( x=0; x<o.durationOrder.length; x++ ) { // Use durationOrder to decide what goes where
1332
- switch ( o.durationOrder[x] ) {
1333
- case 'd':
1334
- $('<div>', {'class': 'ui-datebox-sinput', 'data-field': 'd'}).append(pickerDay).appendTo(controlsInput).prepend('<label>'+o.durationLabel[0]+'</label>');
1335
- break;
1336
- case 'h':
1337
- $('<div>', {'class': 'ui-datebox-sinput', 'data-field': 'h'}).append(pickerHour).appendTo(controlsInput).prepend('<label>'+o.durationLabel[1]+'</label>');
1338
- break;
1339
- case 'i':
1340
- $('<div>', {'class': 'ui-datebox-sinput', 'data-field': 'i'}).append(pickerMins).appendTo(controlsInput).prepend('<label>'+o.durationLabel[2]+'</label>');
1341
- break;
1342
- case 's':
1343
- $('<div>', {'class': 'ui-datebox-sinput', 'data-field': 's'}).append(pickerSecs).appendTo(controlsInput).prepend('<label>'+o.durationLabel[3]+'</label>');
1344
- break;
1345
- }
1346
- }
1347
-
1348
- if ( o.swipeEnabled ) { // Drag and drop operation
1349
- controlsInput.find('input').bind(self.START_DRAG, function(e) {
1350
- if ( !self.dragMove ) {
1351
- self.dragMove = true;
1352
- self.dragTarget = $(this).parent().data('field');
1353
- self.dragPos = 0;
1354
- self.dragStart = self.touch ? e.originalEvent.changedTouches[0].pageY : e.pageY;
1355
- self.dragEnd = false;
1356
- e.stopPropagation();
1357
- }
1358
- });
1359
- }
1360
-
1361
- if ( o.noSetButton === false ) { // Bottom set button
1362
- $("<a href='#'>" + o.setDurationButtonLabel + "</a>")
1363
- .appendTo(controlsSet).buttonMarkup({theme: o.pickPageTheme, icon: 'check', iconpos: 'left', corners:true, shadow:true})
1364
- .bind('vclick', function(e) {
1365
- e.preventDefault();
1366
- self.input.trigger('datebox', {'method':'set', 'value':self._formatTime(self.theDate)});
1367
- self.input.trigger('datebox', {'method':'close'});
1368
- });
1369
- }
1370
-
1371
- for ( x=0; x<o.durationOrder.length; x++ ) {
1372
- linkdiv.clone()
1373
- .appendTo(controlsPlus).buttonMarkup({theme: o.pickPageButtonTheme, icon: 'plus', iconpos: 'bottom', corners:true, shadow:true})
1374
- .attr('data-field', o.durationOrder[x])
1375
- .bind('vclick', function(e) {
1376
- e.preventDefault();
1377
- self._offset($(this).attr('data-field'),o.durationSteppers[$(this).attr('data-field')]);
1378
- });
1379
-
1380
- linkdiv.clone()
1381
- .appendTo(controlsMinus).buttonMarkup({theme: o.pickPageButtonTheme, icon: 'minus', iconpos: 'top', corners:true, shadow:true})
1382
- .attr('data-field', o.durationOrder[x])
1383
- .bind('vclick', function(e) {
1384
- e.preventDefault();
1385
- self._offset($(this).attr('data-field'),-1*o.durationSteppers[$(this).attr('data-field')]);
1386
- });
1387
- }
1388
-
1389
- $.extend(self, {
1390
- pickerHour: pickerHour,
1391
- pickerMins: pickerMins,
1392
- pickerDay: pickerDay,
1393
- pickerSecs: pickerSecs
1394
- });
1395
-
1396
- pickerContent.appendTo(self.thisPage);
1397
- }
1398
- /* END:DURATIONBOX */
1399
- /* BEGIN:DATETIME */
1400
- if ( o.mode === 'datebox' || o.mode === 'timebox' ) {
1401
- controlsHeader = $("<div class='ui-datebox-header'><h4>Unitialized</h4></div>").appendTo(pickerContent).find("h4");
1402
- controlsPlus = templControls.clone().appendTo(pickerContent);
1403
- controlsInput = templControls.clone().appendTo(pickerContent);
1404
- controlsMinus = templControls.clone().appendTo(pickerContent);
1405
- controlsSet = templControls.clone().appendTo(pickerContent);
1406
-
1407
- if ( o.mode === 'timebox' ) { controlsHeader.parent().html(''); } // Time mode has no header
1408
-
1409
- pickerMon = templInput.clone()
1410
- .attr('data-field', 'm')
1411
- .keyup(function() {
1412
- if ( $(this).val() !== '' && self._isInt($(this).val()) ) {
1413
- self.theDate.setMonth(parseInt($(this).val(),10)-1);
1414
- self._update();
1415
- }
1416
- });
1417
-
1418
- pickerDay = pickerMon.clone()
1419
- .attr('data-field', 'd')
1420
- .keyup(function() {
1421
- if ( $(this).val() !== '' && self._isInt($(this).val()) ) {
1422
- self.theDate.setDate(parseInt($(this).val(),10));
1423
- self._update();
1424
- }
1425
- });
1426
-
1427
- pickerYar = pickerMon.clone()
1428
- .attr('data-field', 'y')
1429
- .keyup(function() {
1430
- if ( $(this).val() !== '' && self._isInt($(this).val()) ) {
1431
- self.theDate.setFullYear(parseInt($(this).val(),10));
1432
- self._update();
1433
- }
1434
- });
1435
-
1436
- pickerHour = templInput.clone()
1437
- .attr('data-field', 'h')
1438
- .keyup(function() {
1439
- if ( $(this).val() !== '' && self._isInt($(this).val()) ) {
1440
- newHour = parseInt($(this).val(),10);
1441
- if ( newHour === 12 ) {
1442
- if ( o.timeFormat === 12 && pickerMeri.val() === o.meridiemLetters[0] ) { newHour = 0; }
1443
- }
1444
- self.theDate.setHours(newHour);
1445
- self._update();
1446
- }
1447
- });
1448
-
1449
- pickerMins = templInput.clone()
1450
- .attr('data-field', 'i')
1451
- .keyup(function() {
1452
- if ( $(this).val() !== '' && self._isInt($(this).val()) ) {
1453
- self.theDate.setMinutes(parseInt($(this).val(),10));
1454
- self._update();
1455
- }
1456
- });
1457
-
1458
- pickerMeri = templInput.clone()
1459
- .attr('data-field', 'a')
1460
- .keyup(function() {
1461
- if ( $(this).val() !== '' ) {
1462
- self._update();
1463
- }
1464
- });
1465
-
1466
- if ( o.wheelExists ) { // Mousewheel operation, if plugin is loaded
1467
- pickerYar.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('y', (d<0)?-1:1); });
1468
- pickerMon.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('m', (d<0)?-1:1); });
1469
- pickerDay.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('d', (d<0)?-1:1); });
1470
- pickerHour.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('h', (d<0)?-1:1); });
1471
- pickerMins.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('i', ((d<0)?-1:1)*o.minuteStep); });
1472
- pickerMeri.bind('mousewheel', function(e,d) { e.preventDefault(); self._offset('a', d); });
1473
- }
1474
-
1475
- for(x=0; x<=o.fieldsOrder.length; x++) { // Use fieldsOrder to decide what goes where
1476
- if (o.fieldsOrder[x] === 'y') { pickerYar.appendTo(controlsInput); }
1477
- if (o.fieldsOrder[x] === 'm') { pickerMon.appendTo(controlsInput); }
1478
- if (o.fieldsOrder[x] === 'd') { pickerDay.appendTo(controlsInput); }
1479
- if (o.fieldsOrder[x] === 'h') { pickerHour.appendTo(controlsInput); }
1480
- if (o.fieldsOrder[x] === 'i') { pickerMins.appendTo(controlsInput); }
1481
- if (o.fieldsOrder[x] === 'a' && o.timeFormat === 12 ) { pickerMeri.appendTo(controlsInput); }
1482
- }
1483
-
1484
- if ( o.swipeEnabled ) { // Drag and drop support
1485
- controlsInput.find('input').bind(self.START_DRAG, function(e) {
1486
- if ( !self.dragMove ) {
1487
- self.dragMove = true;
1488
- self.dragTarget = $(this).data('field');
1489
- self.dragPos = 0;
1490
- self.dragStart = self.touch ? e.originalEvent.changedTouches[0].pageY : e.pageY;
1491
- self.dragEnd = false;
1492
- e.stopPropagation();
1493
- }
1494
- });
1495
- }
1496
-
1497
- if ( o.noSetButton === false ) { // Set button at bottom
1498
- $("<a href='#'>" + ((o.mode==='timebox')?o.setTimeButtonLabel:o.setDateButtonLabel) + "</a>")
1499
- .appendTo(controlsSet).buttonMarkup({theme: o.pickPageTheme, icon: 'check', iconpos: 'left', corners:true, shadow:true})
1500
- .bind('vclick', function(e) {
1501
- e.preventDefault();
1502
- if ( o.mode === 'timebox' ) { self.input.trigger('datebox', {'method':'set', 'value':self._formatTime(self.theDate)}); }
1503
- else { self.input.trigger('datebox', {'method':'set', 'value':self._formatDate(self.theDate)}); }
1504
- self.input.trigger('datebox', {'method':'close'});
1505
- });
1506
- }
1507
-
1508
- for( x=0; x<self.options.fieldsOrder.length; x++ ) { // Generate the plus and minus buttons, use fieldsOrder again
1509
- if ( o.fieldsOrder[x] !== 'a' || o.timeFormat === 12 ) {
1510
- linkdiv.clone()
1511
- .appendTo(controlsPlus).buttonMarkup({theme: o.pickPageButtonTheme, icon: 'plus', iconpos: 'bottom', corners:true, shadow:true})
1512
- .attr('data-field', o.fieldsOrder[x])
1513
- .bind('vclick', function(e) {
1514
- e.preventDefault();
1515
- self._offset($(this).attr('data-field'),1*($(this).attr('data-field')==='i'?o.minuteStep:1));
1516
- });
1517
- linkdiv.clone()
1518
- .appendTo(controlsMinus).buttonMarkup({theme: o.pickPageButtonTheme, icon: 'minus', iconpos: 'top', corners:true, shadow:true})
1519
- .attr('data-field', o.fieldsOrder[x])
1520
- .bind('vclick', function(e) {
1521
- e.preventDefault();
1522
- self._offset($(this).attr('data-field'),-1*($(this).attr('data-field')==='i'?o.minuteStep:1));
1523
- });
1524
- }
1525
- }
1526
-
1527
- $.extend(self, {
1528
- controlsHeader: controlsHeader,
1529
- pickerDay: pickerDay,
1530
- pickerMon: pickerMon,
1531
- pickerYar: pickerYar,
1532
- pickerHour: pickerHour,
1533
- pickerMins: pickerMins,
1534
- pickerMeri: pickerMeri
1535
- });
1536
-
1537
- pickerContent.appendTo(self.thisPage);
1538
- }
1539
- /* END:DATETIME */
1540
- /* BEGIN:CALBOX */
1541
- if ( o.mode === 'calbox' ) {
1542
- controlsHeader = $("<div>", {"class": 'ui-datebox-gridheader'}).appendTo(pickerContent);
1543
- controlsSet = $("<div>", {"class": 'ui-datebox-grid'}).appendTo(pickerContent);
1544
- controlsInput = $("<div class='ui-datebox-gridlabel'><h4>Uninitialized</h4></div>").appendTo(controlsHeader).find('h4');
1545
-
1546
- if ( o.swipeEnabled ) { // Calendar swipe left and right
1547
- pickerContent
1548
- .bind('swipeleft', function() { if ( !self.calNoNext ) { self._offset('m', 1); } })
1549
- .bind('swiperight', function() { if ( !self.calNoPrev ) { self._offset('m', -1); } });
1550
- }
1551
-
1552
- if ( o.wheelExists) { // Mousewheel operations, if plugin is loaded
1553
- pickerContent.bind('mousewheel', function(e,d) {
1554
- e.preventDefault();
1555
- if ( d > 0 && !self.calNoNext ) {
1556
- if ( self.theDate.getDate() > 28 ) { self.theDate.setDate(1); }
1557
- self._offset('m', 1);
1558
- }
1559
- if ( d < 0 && !self.calNoPrev ) {
1560
- if ( self.theDate.getDate() > 28 ) { self.theDate.setDate(1); }
1561
- self._offset('m', -1);
1562
- }
1563
- });
1564
- }
1565
-
1566
- // Previous and next month buttons, define booleans to decide if they should do anything
1567
- $("<div class='ui-datebox-gridplus'><a href='#'>Next Month</a></div>")
1568
- .prependTo(controlsHeader).buttonMarkup({theme: o.pickPageButtonTheme, icon: 'plus', inline: true, iconpos: 'notext', corners:true, shadow:true})
1569
- .bind('vclick', function(e) {
1570
- e.preventDefault();
1571
- if ( ! self.calNoNext ) {
1572
- if ( self.theDate.getDate() > 28 ) { self.theDate.setDate(1); }
1573
- self._offset('m',1);
1574
- }
1575
- });
1576
- $("<div class='ui-datebox-gridminus'><a href='#'>Prev Month</a></div>")
1577
- .prependTo(controlsHeader).buttonMarkup({theme: o.pickPageButtonTheme, icon: 'minus', inline: true, iconpos: 'notext', corners:true, shadow:true})
1578
- .bind('vclick', function(e) {
1579
- e.preventDefault();
1580
- if ( ! self.calNoPrev ) {
1581
- if ( self.theDate.getDate() > 28 ) { self.theDate.setDate(1); }
1582
- self._offset('m',-1);
1583
- }
1584
- });
1585
-
1586
- if ( o.calTodayButton === true ) { // Show today button at bottom
1587
- $("<a href='#'>" + o.calTodayButtonLabel + "</a>")
1588
- .appendTo(pickerContent).buttonMarkup({theme: o.pickPageTheme, icon: 'check', iconpos: 'left', corners:true, shadow:true})
1589
- .bind('vclick', function(e) {
1590
- e.preventDefault();
1591
- self.theDate = new Date();
1592
- self.theDate = new Date(self.theDate.getFullYear(), self.theDate.getMonth(), self.theDate.getDate(), 0,0,0,0);
1593
- self.input.trigger('datebox', {'method':'doset'});
1594
- });
1595
- }
1596
-
1597
- $.extend(self, {
1598
- controlsInput: controlsInput,
1599
- controlsSet: controlsSet,
1600
- calNoNext: calNoNext,
1601
- calNoPrev: calNoPrev
1602
- });
1603
-
1604
- pickerContent.appendTo(self.thisPage);
1605
- }
1606
- /* END:CALBOX */
1607
- /* BEGIN:SLIDEBOX */
1608
- if ( o.mode === 'slidebox' ) {
1609
- controlsHeader = $("<div class='ui-datebox-header'><h4>Unitialized</h4></div>").appendTo(pickerContent).find("h4");
1610
- controlsInput = $('<div>').addClass('ui-datebox-slide').appendTo(pickerContent);
1611
- controlsSet = $("<div>", { "class":'ui-datebox-controls'}).appendTo(pickerContent);
1612
-
1613
- if ( o.noSetButton === false ) { // Show set button at bottom
1614
- $("<a href='#'>" + o.setDateButtonLabel + "</a>")
1615
- .appendTo(controlsSet).buttonMarkup({theme: o.pickPageTheme, icon: 'check', iconpos: 'left', corners:true, shadow:true})
1616
- .bind('vclick', function(e) {
1617
- e.preventDefault();
1618
- self.input.trigger('datebox', {'method':'set', 'value':self._formatDate(self.theDate)});
1619
- self.input.trigger('datebox', {'method':'close'});
1620
- });
1621
- }
1622
-
1623
- $.extend(self, {
1624
- controlsHeader: controlsHeader,
1625
- controlsInput: controlsInput
1626
- });
1627
-
1628
- pickerContent.appendTo(self.thisPage);
1629
- }
1630
- /* END:SLIDEBOX */
1631
-
1632
- $.extend(self, {
1633
- pickerContent: pickerContent,
1634
- screen: screen
1635
- });
1636
-
1637
- // If useInline mode, drop it into the document, and stop a few events from working (or just hide the trigger)
1638
- if ( o.useInline ) {
1639
- self.input.parent().parent().append(self.pickerContent);
1640
- if ( o.useInlineHideInput ) { self.input.parent().hide(); }
1641
- self.input.trigger('change');
1642
- self.pickerContent.removeClass('ui-datebox-hidden');
1643
- }
1644
-
1645
- },
1646
- refresh: function() {
1647
- // Pulic shortcut to _update, with an extra hook for inline mode.
1648
- if ( this.options.useInline === true ) {
1649
- this.input.trigger('change');
1650
- }
1651
- this._update();
1652
- },
1653
- open: function() {
1654
- // Open the controls
1655
- if ( this.options.useInline ) { return false; } // Ignore if inline
1656
- if ( this.pickPage.is(':visible') ) { return false; } // Ignore if already open
1657
-
1658
- this.input.trigger('change').blur(); // Grab latest value of input, in case it changed
1659
-
1660
- var self = this,
1661
- o = this.options,
1662
- inputOffset = self.focusedEl.offset(),
1663
- pickWinHeight = self.pickerContent.outerHeight(),
1664
- pickWinWidth = self.pickerContent.innerWidth(),
1665
- pickWinTop = inputOffset.top + ( self.focusedEl.outerHeight() / 2 )- ( pickWinHeight / 2),
1666
- pickWinLeft = inputOffset.left + ( self.focusedEl.outerWidth() / 2) - ( pickWinWidth / 2),
1667
- transition = o.noAnimation ? 'none' : 'pop',
1668
- activePage;
1669
-
1670
- // TOO FAR RIGHT TRAP
1671
- if ( (pickWinLeft + pickWinWidth) > $(document).width() ) {
1672
- pickWinLeft = $(document).width() - pickWinWidth - 1;
1673
- }
1674
- // TOO FAR LEFT TRAP
1675
- if ( pickWinLeft < 0 ) {
1676
- pickWinLeft = 0;
1677
- }
1678
- // Center popup on request - centered in document, not any containing div.
1679
- if ( o.centerWindow ) {
1680
- pickWinLeft = ( $(document).width() / 2 ) - ( pickWinWidth / 2 );
1681
- }
1682
-
1683
- if ( (pickWinHeight + pickWinTop) > $(document).height() ) {
1684
- pickWinTop = $(document).height() - (pickWinHeight + 2);
1685
- }
1686
- if ( pickWinTop < 45 ) { pickWinTop = 45; }
1687
-
1688
- // If the window is less than 400px wide, use the jQM dialog method unless otherwise forced
1689
- if ( ( $(document).width() > 400 && !o.useDialogForceTrue ) || o.useDialogForceFalse ) {
1690
- o.useDialog = false;
1691
- if ( o.nestedBox ) {
1692
- if ( pickWinHeight === 0 ) { // The box may have no height since it dosen't exist yet. working on it.
1693
- pickWinHeight = 250;
1694
- pickWinTop = inputOffset.top + ( self.focusedEl.outerHeight() / 2 )- ( pickWinHeight / 2);
1695
- }
1696
- activePage = $('.ui-page-active').first();
1697
- $(activePage).append(self.pickerContent);
1698
- $(activePage).append(self.screen);
1699
- }
1700
- if ( o.useModal ) { // If model, fade the background screen
1701
- self.screen.fadeIn('slow');
1702
- } else { // Else just unhide it since it's transparent
1703
- self.screen.removeClass('ui-datebox-hidden');
1704
- }
1705
- self.pickerContent.addClass('ui-overlay-shadow in').css({'position': 'absolute', 'top': pickWinTop, 'left': pickWinLeft}).removeClass('ui-datebox-hidden');
1706
- } else {
1707
- // prevent the parent page from being removed from the DOM,
1708
- self.thisPage.unbind( "pagehide.remove" );
1709
- o.useDialog = true;
1710
- self.pickPageContent.append(self.pickerContent);
1711
- self.pickerContent.css({'top': 'auto', 'left': 'auto', 'marginLeft': 'auto', 'marginRight': 'auto'}).removeClass('ui-overlay-shadow ui-datebox-hidden');
1712
- $.mobile.changePage(self.pickPage, {'transition': transition});
1713
- }
1714
- },
1715
- close: function() {
1716
- // Close the controls
1717
- var self = this,
1718
- callback;
1719
-
1720
- if ( self.options.useInline ) {
1721
- return true;
1722
- }
1723
-
1724
- // Check options to see if we are closing a dialog, or removing a popup
1725
- if ( self.options.useDialog ) {
1726
- $(self.pickPage).dialog('close');
1727
- if( !self.thisPage.data("page").options.domCache ){
1728
- self.thisPage.bind( "pagehide.remove", function() {
1729
- $(self).remove();
1730
- });
1731
- }
1732
- self.pickerContent.addClass('ui-datebox-hidden').removeAttr('style').css('zIndex', self.options.zindex);
1733
- self.thisPage.append(self.pickerContent);
1734
- } else {
1735
- if ( self.options.useModal ) {
1736
- self.screen.fadeOut('slow');
1737
- } else {
1738
- self.screen.addClass('ui-datebox-hidden');
1739
- }
1740
- self.pickerContent.addClass('ui-datebox-hidden').removeAttr('style').css('zIndex', self.options.zindex).removeClass('in');
1741
- }
1742
- self.focusedEl.removeClass('ui-focus');
1743
-
1744
- if ( self.options.closeCallback !== false ) { callback = new Function(self.options.closeCallback); callback(); }
1745
- },
1746
- disable: function(){
1747
- // Disable the element
1748
- this.element.attr("disabled",true);
1749
- this.element.parent().addClass("ui-disabled");
1750
- this.options.disabled = true;
1751
- this.element.blur();
1752
- this.input.trigger('datebox', {'method':'disable'});
1753
- },
1754
- enable: function(){
1755
- // Enable the element
1756
- this.element.attr("disabled", false);
1757
- this.element.parent().removeClass("ui-disabled");
1758
- this.options.disabled = false;
1759
- this.input.trigger('datebox', {'method':'enable'});
1760
- }
1761
-
1762
- });
1763
-
1764
- // Degrade date inputs to text inputs, suppress standard UI functions.
1765
- $( document ).bind( "pagebeforecreate", function( e ) {
1766
- $( ":jqmData(role='datebox')", e.target ).each(function() {
1767
- $(this).replaceWith(
1768
- $( "<div>" ).html( $(this).clone() ).html()
1769
- .replace( /\s+type=["']date['"]?/, " type=\"text\" " )
1770
- );
1771
- });
1772
- });
1773
- // Automatically bind to data-role='datebox' items.
1774
- $( document ).bind( "pagecreate", function( e ){
1775
- $( ":jqmData(role='datebox')", e.target ).datebox();
1776
- });
1777
-
1778
- })( jQuery );