upstream-rails_admin 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (556) hide show
  1. data/Gemfile +74 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +162 -0
  4. data/Rakefile +19 -0
  5. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  6. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  7. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  8. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  9. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  10. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  11. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  12. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  13. data/app/assets/images/rails_admin/calendar.png +0 -0
  14. data/app/assets/images/rails_admin/clock.png +0 -0
  15. data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  16. data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  17. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  18. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  19. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  20. data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  21. data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  22. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  23. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  24. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  25. data/app/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  26. data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  27. data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  28. data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  29. data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  30. data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  31. data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  32. data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  33. data/app/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  34. data/app/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  35. data/app/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  36. data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  37. data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
  38. data/app/assets/images/rails_admin/colorpicker/select2.png +0 -0
  39. data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
  40. data/app/assets/images/rails_admin/logo.png +0 -0
  41. data/app/assets/images/rails_admin/magnifier.png +0 -0
  42. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  43. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  44. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  45. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  46. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  47. data/app/assets/javascripts/rails_admin/custom/ui.js +12 -0
  48. data/app/assets/javascripts/rails_admin/jquery.colorpicker.js +484 -0
  49. data/app/assets/javascripts/rails_admin/jquery.pjax.js +543 -0
  50. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +1371 -0
  51. data/app/assets/javascripts/rails_admin/ra.datetimepicker.js +67 -0
  52. data/app/assets/javascripts/rails_admin/ra.filter-box.js +129 -0
  53. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +280 -0
  54. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +181 -0
  55. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee +41 -0
  56. data/app/assets/javascripts/rails_admin/ra.remote-form.js +152 -0
  57. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +135 -0
  58. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +27 -0
  59. data/app/assets/javascripts/rails_admin/themes/cerulean/ui.js +0 -0
  60. data/app/assets/javascripts/rails_admin/themes/default/ui.js +12 -0
  61. data/app/assets/javascripts/rails_admin/ui.js.coffee +65 -0
  62. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  63. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  64. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  65. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  66. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  67. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  68. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss +733 -0
  69. data/app/assets/stylesheets/rails_admin/base/README +2 -0
  70. data/app/assets/stylesheets/rails_admin/base/mixins.css.scss +1 -0
  71. data/app/assets/stylesheets/rails_admin/base/theming.css.scss +270 -0
  72. data/app/assets/stylesheets/rails_admin/base/variables.css.scss +1 -0
  73. data/app/assets/stylesheets/rails_admin/custom/mixins.css.scss +12 -0
  74. data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
  75. data/app/assets/stylesheets/rails_admin/custom/variables.css.scss +15 -0
  76. data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +78 -0
  77. data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +180 -0
  78. data/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss +69 -0
  79. data/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss +25 -0
  80. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss +85 -0
  81. data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
  82. data/app/assets/stylesheets/rails_admin/themes/cerulean/mixins.css.scss +0 -0
  83. data/app/assets/stylesheets/rails_admin/themes/cerulean/theming.css.scss +97 -0
  84. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.css.scss +168 -0
  85. data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +8 -0
  86. data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +11 -0
  87. data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +12 -0
  88. data/app/controllers/rails_admin/application_controller.rb +82 -0
  89. data/app/controllers/rails_admin/main_controller.rb +155 -0
  90. data/app/helpers/rails_admin/application_helper.rb +125 -0
  91. data/app/helpers/rails_admin/form_builder.rb +113 -0
  92. data/app/helpers/rails_admin/main_helper.rb +36 -0
  93. data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
  94. data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
  95. data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
  96. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
  97. data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
  98. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +12 -0
  99. data/app/views/layouts/rails_admin/application.html.haml +26 -0
  100. data/app/views/layouts/rails_admin/pjax.html.haml +20 -0
  101. data/app/views/rails_admin/main/_dashboard_history.html.haml +10 -0
  102. data/app/views/rails_admin/main/_delete_notice.html.haml +18 -0
  103. data/app/views/rails_admin/main/_form_colorpicker.html.haml +1 -0
  104. data/app/views/rails_admin/main/_form_datetime.html.haml +1 -0
  105. data/app/views/rails_admin/main/_form_enumeration.html.haml +1 -0
  106. data/app/views/rails_admin/main/_form_field.html.haml +1 -0
  107. data/app/views/rails_admin/main/_form_file_upload.html.haml +13 -0
  108. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +47 -0
  109. data/app/views/rails_admin/main/_form_filtering_select.html.haml +37 -0
  110. data/app/views/rails_admin/main/_form_nested_many.html.haml +14 -0
  111. data/app/views/rails_admin/main/_form_nested_one.html.haml +10 -0
  112. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +10 -0
  113. data/app/views/rails_admin/main/_form_text.html.haml +15 -0
  114. data/app/views/rails_admin/main/_submit_buttons.html.haml +15 -0
  115. data/app/views/rails_admin/main/bulk_delete.html.haml +11 -0
  116. data/app/views/rails_admin/main/dashboard.html.haml +31 -0
  117. data/app/views/rails_admin/main/delete.html.haml +18 -0
  118. data/app/views/rails_admin/main/edit.html.haml +2 -0
  119. data/app/views/rails_admin/main/export.html.haml +75 -0
  120. data/app/views/rails_admin/main/history.html.haml +42 -0
  121. data/app/views/rails_admin/main/index.html.haml +140 -0
  122. data/app/views/rails_admin/main/new.html.haml +2 -0
  123. data/app/views/rails_admin/main/show.html.haml +14 -0
  124. data/config/initializers/active_record_extensions.rb +19 -0
  125. data/config/initializers/devise_patch.rb +9 -0
  126. data/config/initializers/haml.rb +2 -0
  127. data/config/initializers/mongoid_extensions.rb +5 -0
  128. data/config/locales/fr.yml +24 -0
  129. data/config/locales/rails_admin.en.yml +130 -0
  130. data/config/routes.rb +12 -0
  131. data/lib/generators/rails_admin/install_generator.rb +84 -0
  132. data/lib/generators/rails_admin/templates/drop.rb +18 -0
  133. data/lib/generators/rails_admin/templates/initializer.erb +101 -0
  134. data/lib/generators/rails_admin/templates/migration.rb +18 -0
  135. data/lib/generators/rails_admin/uninstall_generator.rb +22 -0
  136. data/lib/generators/rails_admin/utils.rb +30 -0
  137. data/lib/rails_admin.rb +34 -0
  138. data/lib/rails_admin/abstract_model.rb +108 -0
  139. data/lib/rails_admin/adapters/active_record.rb +255 -0
  140. data/lib/rails_admin/adapters/active_record/abstract_object.rb +32 -0
  141. data/lib/rails_admin/adapters/mongoid.rb +390 -0
  142. data/lib/rails_admin/adapters/mongoid/abstract_object.rb +48 -0
  143. data/lib/rails_admin/adapters/mongoid/extension.rb +48 -0
  144. data/lib/rails_admin/config.rb +323 -0
  145. data/lib/rails_admin/config/actions.rb +121 -0
  146. data/lib/rails_admin/config/actions/base.rb +117 -0
  147. data/lib/rails_admin/config/actions/bulk_delete.rb +55 -0
  148. data/lib/rails_admin/config/actions/dashboard.rb +46 -0
  149. data/lib/rails_admin/config/actions/delete.rb +53 -0
  150. data/lib/rails_admin/config/actions/edit.rb +60 -0
  151. data/lib/rails_admin/config/actions/export.rb +40 -0
  152. data/lib/rails_admin/config/actions/history_index.rb +38 -0
  153. data/lib/rails_admin/config/actions/history_show.rb +38 -0
  154. data/lib/rails_admin/config/actions/index.rb +85 -0
  155. data/lib/rails_admin/config/actions/new.rb +64 -0
  156. data/lib/rails_admin/config/actions/show.rb +32 -0
  157. data/lib/rails_admin/config/actions/show_in_app.rb +28 -0
  158. data/lib/rails_admin/config/configurable.rb +92 -0
  159. data/lib/rails_admin/config/fields.rb +88 -0
  160. data/lib/rails_admin/config/fields/association.rb +108 -0
  161. data/lib/rails_admin/config/fields/base.rb +298 -0
  162. data/lib/rails_admin/config/fields/factories/association.rb +32 -0
  163. data/lib/rails_admin/config/fields/factories/carrierwave.rb +31 -0
  164. data/lib/rails_admin/config/fields/factories/devise.rb +27 -0
  165. data/lib/rails_admin/config/fields/factories/dragonfly.rb +27 -0
  166. data/lib/rails_admin/config/fields/factories/enum.rb +11 -0
  167. data/lib/rails_admin/config/fields/factories/paperclip.rb +26 -0
  168. data/lib/rails_admin/config/fields/factories/password.rb +17 -0
  169. data/lib/rails_admin/config/fields/factories/serialized.rb +17 -0
  170. data/lib/rails_admin/config/fields/group.rb +78 -0
  171. data/lib/rails_admin/config/fields/types.rb +27 -0
  172. data/lib/rails_admin/config/fields/types/all.rb +25 -0
  173. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +41 -0
  174. data/lib/rails_admin/config/fields/types/boolean.rb +31 -0
  175. data/lib/rails_admin/config/fields/types/bson_object_id.rb +42 -0
  176. data/lib/rails_admin/config/fields/types/carrierwave.rb +31 -0
  177. data/lib/rails_admin/config/fields/types/color.rb +37 -0
  178. data/lib/rails_admin/config/fields/types/date.rb +24 -0
  179. data/lib/rails_admin/config/fields/types/datetime.rb +163 -0
  180. data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
  181. data/lib/rails_admin/config/fields/types/dragonfly.rb +41 -0
  182. data/lib/rails_admin/config/fields/types/enum.rb +35 -0
  183. data/lib/rails_admin/config/fields/types/file_upload.rb +61 -0
  184. data/lib/rails_admin/config/fields/types/float.rb +14 -0
  185. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
  186. data/lib/rails_admin/config/fields/types/has_many_association.rb +32 -0
  187. data/lib/rails_admin/config/fields/types/has_one_association.rb +39 -0
  188. data/lib/rails_admin/config/fields/types/hidden.rb +21 -0
  189. data/lib/rails_admin/config/fields/types/integer.rb +22 -0
  190. data/lib/rails_admin/config/fields/types/paperclip.rb +28 -0
  191. data/lib/rails_admin/config/fields/types/password.rb +39 -0
  192. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +76 -0
  193. data/lib/rails_admin/config/fields/types/serialized.rb +22 -0
  194. data/lib/rails_admin/config/fields/types/string.rb +41 -0
  195. data/lib/rails_admin/config/fields/types/text.rb +36 -0
  196. data/lib/rails_admin/config/fields/types/time.rb +36 -0
  197. data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
  198. data/lib/rails_admin/config/groupable.rb +18 -0
  199. data/lib/rails_admin/config/has_fields.rb +135 -0
  200. data/lib/rails_admin/config/has_groups.rb +23 -0
  201. data/lib/rails_admin/config/hideable.rb +28 -0
  202. data/lib/rails_admin/config/model.rb +88 -0
  203. data/lib/rails_admin/config/proxyable.rb +12 -0
  204. data/lib/rails_admin/config/proxyable/proxy.rb +43 -0
  205. data/lib/rails_admin/config/sections.rb +39 -0
  206. data/lib/rails_admin/config/sections/base.rb +29 -0
  207. data/lib/rails_admin/config/sections/create.rb +11 -0
  208. data/lib/rails_admin/config/sections/edit.rb +11 -0
  209. data/lib/rails_admin/config/sections/export.rb +11 -0
  210. data/lib/rails_admin/config/sections/list.rb +27 -0
  211. data/lib/rails_admin/config/sections/modal.rb +10 -0
  212. data/lib/rails_admin/config/sections/nested.rb +10 -0
  213. data/lib/rails_admin/config/sections/show.rb +10 -0
  214. data/lib/rails_admin/config/sections/update.rb +10 -0
  215. data/lib/rails_admin/engine.rb +22 -0
  216. data/lib/rails_admin/extension.rb +29 -0
  217. data/lib/rails_admin/extensions/cancan.rb +5 -0
  218. data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +59 -0
  219. data/lib/rails_admin/extensions/history.rb +5 -0
  220. data/lib/rails_admin/extensions/history/auditing_adapter.rb +37 -0
  221. data/lib/rails_admin/extensions/history/history.rb +70 -0
  222. data/lib/rails_admin/extensions/paper_trail.rb +5 -0
  223. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +92 -0
  224. data/lib/rails_admin/i18n_support.rb +43 -0
  225. data/lib/rails_admin/support/core_extensions.rb +44 -0
  226. data/lib/rails_admin/support/csv_converter.rb +109 -0
  227. data/lib/rails_admin/version.rb +3 -0
  228. data/lib/tasks/prepare_ci_env.rake +27 -0
  229. data/lib/tasks/rails_admin.rake +18 -0
  230. data/spec/ci.sh +2 -0
  231. data/spec/controllers/application_controller_spec.rb +30 -0
  232. data/spec/controllers/main_controller_spec.rb +179 -0
  233. data/spec/dummy_app/Gemfile +71 -0
  234. data/spec/dummy_app/Gemfile.lock +205 -0
  235. data/spec/dummy_app/Rakefile +7 -0
  236. data/spec/dummy_app/app/active_record/abstract.rb +5 -0
  237. data/spec/dummy_app/app/active_record/ball.rb +9 -0
  238. data/spec/dummy_app/app/active_record/carrierwave_uploader.rb +53 -0
  239. data/spec/dummy_app/app/active_record/category.rb +5 -0
  240. data/spec/dummy_app/app/active_record/cms.rb +5 -0
  241. data/spec/dummy_app/app/active_record/cms/basic_page.rb +9 -0
  242. data/spec/dummy_app/app/active_record/cms/unscoped_page.rb +3 -0
  243. data/spec/dummy_app/app/active_record/comment.rb +5 -0
  244. data/spec/dummy_app/app/active_record/division.rb +15 -0
  245. data/spec/dummy_app/app/active_record/draft.rb +13 -0
  246. data/spec/dummy_app/app/active_record/fan.rb +7 -0
  247. data/spec/dummy_app/app/active_record/field_test.rb +20 -0
  248. data/spec/dummy_app/app/active_record/hardball.rb +2 -0
  249. data/spec/dummy_app/app/active_record/league.rb +12 -0
  250. data/spec/dummy_app/app/active_record/nested_field_test.rb +7 -0
  251. data/spec/dummy_app/app/active_record/player.rb +23 -0
  252. data/spec/dummy_app/app/active_record/team.rb +27 -0
  253. data/spec/dummy_app/app/active_record/user.rb +21 -0
  254. data/spec/dummy_app/app/assets/images/rails.png +0 -0
  255. data/spec/dummy_app/app/assets/javascripts/application.js +15 -0
  256. data/spec/dummy_app/app/assets/stylesheets/application.css +13 -0
  257. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  258. data/spec/dummy_app/app/controllers/players_controller.rb +5 -0
  259. data/spec/dummy_app/app/locales/models.en.yml +20 -0
  260. data/spec/dummy_app/app/mongoid/ball.rb +14 -0
  261. data/spec/dummy_app/app/mongoid/carrierwave_uploader.rb +53 -0
  262. data/spec/dummy_app/app/mongoid/category.rb +7 -0
  263. data/spec/dummy_app/app/mongoid/cms.rb +5 -0
  264. data/spec/dummy_app/app/mongoid/cms/basic_page.rb +12 -0
  265. data/spec/dummy_app/app/mongoid/cms/unscoped_page.rb +5 -0
  266. data/spec/dummy_app/app/mongoid/comment.rb +9 -0
  267. data/spec/dummy_app/app/mongoid/division.rb +14 -0
  268. data/spec/dummy_app/app/mongoid/draft.rb +22 -0
  269. data/spec/dummy_app/app/mongoid/embed.rb +6 -0
  270. data/spec/dummy_app/app/mongoid/fan.rb +12 -0
  271. data/spec/dummy_app/app/mongoid/field_test.rb +56 -0
  272. data/spec/dummy_app/app/mongoid/hardball.rb +2 -0
  273. data/spec/dummy_app/app/mongoid/league.rb +16 -0
  274. data/spec/dummy_app/app/mongoid/nested_field_test.rb +12 -0
  275. data/spec/dummy_app/app/mongoid/player.rb +37 -0
  276. data/spec/dummy_app/app/mongoid/team.rb +47 -0
  277. data/spec/dummy_app/app/mongoid/user.rb +61 -0
  278. data/spec/dummy_app/app/views/layouts/application.html.erb +14 -0
  279. data/spec/dummy_app/app/views/players/show.html.haml +1 -0
  280. data/spec/dummy_app/config.ru +4 -0
  281. data/spec/dummy_app/config/application.rb +69 -0
  282. data/spec/dummy_app/config/boot.rb +9 -0
  283. data/spec/dummy_app/config/database.yml +25 -0
  284. data/spec/dummy_app/config/environment.rb +5 -0
  285. data/spec/dummy_app/config/environments/development.rb +37 -0
  286. data/spec/dummy_app/config/environments/production.rb +67 -0
  287. data/spec/dummy_app/config/environments/test.rb +37 -0
  288. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  289. data/spec/dummy_app/config/initializers/devise.rb +223 -0
  290. data/spec/dummy_app/config/initializers/dragonfly.rb +14 -0
  291. data/spec/dummy_app/config/initializers/inflections.rb +15 -0
  292. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  293. data/spec/dummy_app/config/initializers/rails_admin.rb +8 -0
  294. data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
  295. data/spec/dummy_app/config/initializers/session_patch.rb +16 -0
  296. data/spec/dummy_app/config/initializers/session_store.rb +8 -0
  297. data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  298. data/spec/dummy_app/config/mongoid.yml +11 -0
  299. data/spec/dummy_app/config/routes.rb +10 -0
  300. data/spec/dummy_app/db/development.sqlite3 +0 -0
  301. data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
  302. data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
  303. data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
  304. data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
  305. data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
  306. data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +49 -0
  307. data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
  308. data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
  309. data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
  310. data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
  311. data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
  312. data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
  313. data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
  314. data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
  315. data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
  316. data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
  317. data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
  318. data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
  319. data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
  320. data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
  321. data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
  322. data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
  323. data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
  324. data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
  325. data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
  326. data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
  327. data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
  328. data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
  329. data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
  330. data/spec/dummy_app/db/migrate/20111115041025_add_type_to_balls.rb +5 -0
  331. data/spec/dummy_app/db/migrate/20111123092549_create_nested_field_tests.rb +10 -0
  332. data/spec/dummy_app/db/migrate/20111130075338_add_dragonfly_asset_name_to_field_tests.rb +5 -0
  333. data/spec/dummy_app/db/migrate/20111215083258_create_foo_bars.rb +8 -0
  334. data/spec/dummy_app/db/migrate/20120117151733_add_custom_field_to_teams.rb +5 -0
  335. data/spec/dummy_app/db/migrate/20120118122004_add_categories.rb +7 -0
  336. data/spec/dummy_app/db/migrate/20120319041705_drop_rel_tests.rb +15 -0
  337. data/spec/dummy_app/db/schema.rb +188 -0
  338. data/spec/dummy_app/db/seeds.rb +29 -0
  339. data/spec/dummy_app/db/test.sqlite3 +0 -0
  340. data/spec/dummy_app/doc/README_FOR_APP +2 -0
  341. data/spec/dummy_app/log/development.log +865 -0
  342. data/spec/dummy_app/log/test.log +36651 -0
  343. data/spec/dummy_app/public/404.html +26 -0
  344. data/spec/dummy_app/public/422.html +26 -0
  345. data/spec/dummy_app/public/500.html +25 -0
  346. data/spec/dummy_app/public/favicon.ico +0 -0
  347. data/spec/dummy_app/public/robots.txt +5 -0
  348. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg +0 -0
  349. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg.meta +1 -0
  350. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg +0 -0
  351. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg.meta +1 -0
  352. data/spec/dummy_app/public/system/paperclip_assets/1/original/Boston City Flow.jpg +0 -0
  353. data/spec/dummy_app/public/system/paperclip_assets/1/thumb/Boston City Flow.jpg +0 -0
  354. data/spec/dummy_app/public/system/paperclip_assets/3/original/Costa Rican Frog.jpg +0 -0
  355. data/spec/dummy_app/public/system/paperclip_assets/3/thumb/Costa Rican Frog.jpg +0 -0
  356. data/spec/dummy_app/public/system/paperclip_assets/6/original/liste-electorale.pdf +0 -0
  357. data/spec/dummy_app/public/system/paperclip_assets/6/thumb/liste-electorale.pdf +148 -0
  358. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/Boston_City_Flow.jpg +0 -0
  359. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/thumb_Boston_City_Flow.jpg +0 -0
  360. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/Costa_Rican_Frog.jpg +0 -0
  361. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/thumb_Costa_Rican_Frog.jpg +0 -0
  362. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/Pensive_Parakeet.jpg +0 -0
  363. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/thumb_Pensive_Parakeet.jpg +0 -0
  364. data/spec/dummy_app/script/rails +6 -0
  365. data/spec/dummy_app/tmp/cache/assets/BE5/B00/sprockets%2F47892969925432da563a88e366309859 +1833 -0
  366. data/spec/dummy_app/tmp/cache/assets/C1C/C90/sprockets%2F4c1f0504074864b8b21792c77391e206 +0 -0
  367. data/spec/dummy_app/tmp/cache/assets/C29/F50/sprockets%2F6d087f33314fd5091b1270969287268b +0 -0
  368. data/spec/dummy_app/tmp/cache/assets/C2C/130/sprockets%2F2d09a75917207f5a55929639226b4b48 +26 -0
  369. data/spec/dummy_app/tmp/cache/assets/C49/FD0/sprockets%2F07901b5391110eea9648d5c25d481327 +0 -0
  370. data/spec/dummy_app/tmp/cache/assets/C63/BF0/sprockets%2F600472e1a4718315162a7cb0f285a02b +547 -0
  371. data/spec/dummy_app/tmp/cache/assets/C66/0B0/sprockets%2F2560ef2871b489690ff209e164d86665 +635 -0
  372. data/spec/dummy_app/tmp/cache/assets/C68/560/sprockets%2F5996692771c33962a9a2c72790ddd754 +0 -0
  373. data/spec/dummy_app/tmp/cache/assets/C83/F90/sprockets%2Fa580b424c36c26dd59f660078d541755 +0 -0
  374. data/spec/dummy_app/tmp/cache/assets/C86/C30/sprockets%2F23ca33803f8248991f3fa8d2104e9961 +0 -0
  375. data/spec/dummy_app/tmp/cache/assets/C88/790/sprockets%2F538d9562b05167d03d26b0e5e9f78830 +5 -0
  376. data/spec/dummy_app/tmp/cache/assets/C89/3B0/sprockets%2F503f729e1bc985e17b730122c7176f97 +0 -0
  377. data/spec/dummy_app/tmp/cache/assets/C95/A00/sprockets%2F458c72992a558902c05a9d6d99339af2 +4 -0
  378. data/spec/dummy_app/tmp/cache/assets/C97/4C0/sprockets%2F97a81a953151b41a100165fb83dfa023 +133 -0
  379. data/spec/dummy_app/tmp/cache/assets/C9A/C90/sprockets%2F400271d29a3bb9124a286ba761c3f254 +0 -0
  380. data/spec/dummy_app/tmp/cache/assets/C9D/BA0/sprockets%2F1bfd091b2034980851caa077c0892c40 +490 -0
  381. data/spec/dummy_app/tmp/cache/assets/CA2/FA0/sprockets%2F0c3f1c8708606aa0440c866138d1e9a2 +0 -0
  382. data/spec/dummy_app/tmp/cache/assets/CA7/480/sprockets%2F23a375f496616605e4144a21fb4dc83a +4 -0
  383. data/spec/dummy_app/tmp/cache/assets/CB1/8A0/sprockets%2F25c2eb1d72087ed5e863f217109b6069 +0 -0
  384. data/spec/dummy_app/tmp/cache/assets/CB3/B50/sprockets%2F03a7c1f7144eb79946ceb8e151772127 +0 -0
  385. data/spec/dummy_app/tmp/cache/assets/CC4/220/sprockets%2F8d947b008798f16134b7d576fa456ce4 +285 -0
  386. data/spec/dummy_app/tmp/cache/assets/CC7/F70/sprockets%2F1a1af5b2c6473f104b2f0b252a729338 +0 -0
  387. data/spec/dummy_app/tmp/cache/assets/CD1/C70/sprockets%2F75b65e7751a3f030d43c1cf6827cc100 +133 -0
  388. data/spec/dummy_app/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  389. data/spec/dummy_app/tmp/cache/assets/CD8/430/sprockets%2Fc89f860631079a34d3c0d662aac0d256 +635 -0
  390. data/spec/dummy_app/tmp/cache/assets/CD8/AF0/sprockets%2Ffa2b25b3f4c05f51086482175c970ca7 +0 -0
  391. data/spec/dummy_app/tmp/cache/assets/CD9/590/sprockets%2F6882cdc2e05726d5172e2b9b334ec007 +0 -0
  392. data/spec/dummy_app/tmp/cache/assets/CD9/E00/sprockets%2F233f366461a5722d7dfb7a0ecd064087 +0 -0
  393. data/spec/dummy_app/tmp/cache/assets/CDA/880/sprockets%2Fa1e3e4ae81b451c8b4b798061148a358 +275 -0
  394. data/spec/dummy_app/tmp/cache/assets/CE2/490/sprockets%2Fab26cd4524240da60a93659780f9ae78 +0 -0
  395. data/spec/dummy_app/tmp/cache/assets/CEC/270/sprockets%2Fb531a7fa499c7953ab753fa911a61799 +328 -0
  396. data/spec/dummy_app/tmp/cache/assets/CFD/D70/sprockets%2F79acf34495d5196bd47278685b4ee68b +237 -0
  397. data/spec/dummy_app/tmp/cache/assets/CFE/060/sprockets%2Fd97e1e070419bcfe35c7000d1a70427b +303 -0
  398. data/spec/dummy_app/tmp/cache/assets/D02/8B0/sprockets%2F0c493e35ea651c55155b2a383bf2d34d +0 -0
  399. data/spec/dummy_app/tmp/cache/assets/D04/A20/sprockets%2Fa264585296de2351212f1063ebcccd9b +1092 -0
  400. data/spec/dummy_app/tmp/cache/assets/D0F/EA0/sprockets%2F4a754f04f5d1c8995a01927bbd074fa4 +0 -0
  401. data/spec/dummy_app/tmp/cache/assets/D11/470/sprockets%2F67d64aa5490686515e07cdb8ae05b4c6 +9 -0
  402. data/spec/dummy_app/tmp/cache/assets/D12/F60/sprockets%2F6ac89a4a48bf0e3bb6364925661da565 +0 -0
  403. data/spec/dummy_app/tmp/cache/assets/D15/3D0/sprockets%2F7ef98ea43116410c4c50ffff444428c8 +1376 -0
  404. data/spec/dummy_app/tmp/cache/assets/D17/9B0/sprockets%2F3154059ed98209719dc1a7c493cb0fff +381 -0
  405. data/spec/dummy_app/tmp/cache/assets/D20/9E0/sprockets%2F9e5560466ce41eac747392c97eef4c51 +0 -0
  406. data/spec/dummy_app/tmp/cache/assets/D24/B30/sprockets%2F69d62273002dffc74f5368f55dfb97f3 +0 -0
  407. data/spec/dummy_app/tmp/cache/assets/D2D/840/sprockets%2F6f3b681ef8ba260acc705e3b262425a0 +0 -0
  408. data/spec/dummy_app/tmp/cache/assets/D2F/7C0/sprockets%2F99f6619fe89012fb9908a47ebb9b92a8 +7 -0
  409. data/spec/dummy_app/tmp/cache/assets/D2F/D60/sprockets%2Fa0cb0b3d7d775c4707c42a58fb0d2615 +9409 -0
  410. data/spec/dummy_app/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  411. data/spec/dummy_app/tmp/cache/assets/D3A/260/sprockets%2F35a5b51d1927651a39e3edca8c483dd1 +0 -0
  412. data/spec/dummy_app/tmp/cache/assets/D3B/F80/sprockets%2F304efb1d2d219915606f3fd96b3bf5c2 +9409 -0
  413. data/spec/dummy_app/tmp/cache/assets/D3C/7C0/sprockets%2F6a50cb4a5d265838f510fc8e6178bae1 +0 -0
  414. data/spec/dummy_app/tmp/cache/assets/D3D/0A0/sprockets%2Fa92066280edcd6b188dc38e35361dd3b +0 -0
  415. data/spec/dummy_app/tmp/cache/assets/D40/9B0/sprockets%2F704cfd791b468a6fba4fb820ec128941 +237 -0
  416. data/spec/dummy_app/tmp/cache/assets/D40/E10/sprockets%2F97d56619e64ca8c9c514a3aa2a4b339c +0 -0
  417. data/spec/dummy_app/tmp/cache/assets/D42/1F0/sprockets%2Fcaf59e1c6d22bae908a06e476b752791 +0 -0
  418. data/spec/dummy_app/tmp/cache/assets/D43/E30/sprockets%2Fece324b9d4dc935a92333fd0149bf773 +0 -0
  419. data/spec/dummy_app/tmp/cache/assets/D47/520/sprockets%2Ff142cf9478904f9e3ebb31ecc8c50913 +0 -0
  420. data/spec/dummy_app/tmp/cache/assets/D4B/390/sprockets%2Feb90dbdd2a6275f48086881f7b74ee32 +0 -0
  421. data/spec/dummy_app/tmp/cache/assets/D4B/6D0/sprockets%2F760ec9c344d334cfe919a55cf7f6a165 +0 -0
  422. data/spec/dummy_app/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  423. data/spec/dummy_app/tmp/cache/assets/D53/5C0/sprockets%2Fa93098db097c86d1e33dc86dece09991 +1092 -0
  424. data/spec/dummy_app/tmp/cache/assets/D56/F00/sprockets%2F48f6039e6745b557cbe83957abc8df2d +303 -0
  425. data/spec/dummy_app/tmp/cache/assets/D58/940/sprockets%2F0c3d05522ea3be49ba23372222fdcde7 +328 -0
  426. data/spec/dummy_app/tmp/cache/assets/D58/950/sprockets%2F6ade11e1b9d3ac4736b05aaf039c0804 +0 -0
  427. data/spec/dummy_app/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  428. data/spec/dummy_app/tmp/cache/assets/D5C/D10/sprockets%2F3fddf4c16115fad562082a5d4f1bd520 +0 -0
  429. data/spec/dummy_app/tmp/cache/assets/D5D/950/sprockets%2F9ed4c3b788618998fefb569a0a58da80 +0 -0
  430. data/spec/dummy_app/tmp/cache/assets/D5F/F30/sprockets%2Fc93672decbf5fb650336d1a67001fba0 +547 -0
  431. data/spec/dummy_app/tmp/cache/assets/D62/4A0/sprockets%2F47b7cb361e1f2e2ce081ea52fe32f640 +0 -0
  432. data/spec/dummy_app/tmp/cache/assets/D65/140/sprockets%2F5cc4a9317d68e31bb0c5b8d3f517a0e4 +0 -0
  433. data/spec/dummy_app/tmp/cache/assets/D6C/170/sprockets%2Fdc1a668e0c34eb1206fc67cf526249cf +0 -0
  434. data/spec/dummy_app/tmp/cache/assets/D71/9B0/sprockets%2Fc98bb1ca9b745d615b0f2f0d963c44d8 +5 -0
  435. data/spec/dummy_app/tmp/cache/assets/D74/020/sprockets%2Fd99999af4693dfa5998fdaf5b68276e6 +0 -0
  436. data/spec/dummy_app/tmp/cache/assets/D74/050/sprockets%2Fab9217b6ce5c3c8969791adc819b2a2b +0 -0
  437. data/spec/dummy_app/tmp/cache/assets/D7A/410/sprockets%2Fd1decdae4824f395df114687f262e78a +381 -0
  438. data/spec/dummy_app/tmp/cache/assets/D7C/630/sprockets%2Fff49f6b45a167453dabfa743e588dd16 +0 -0
  439. data/spec/dummy_app/tmp/cache/assets/D85/CC0/sprockets%2F09f7b34bbc050700a3bcbf6c6c5c1b45 +0 -0
  440. data/spec/dummy_app/tmp/cache/assets/D8F/DD0/sprockets%2F7bd51d74d575ec0bfad624acc81a6040 +0 -0
  441. data/spec/dummy_app/tmp/cache/assets/D93/C20/sprockets%2F2f48ab1ea8216fd918beb173c2a4f04d +0 -0
  442. data/spec/dummy_app/tmp/cache/assets/D9B/920/sprockets%2F4a02c68d7d2e9a072b8cdd5f715ab7c4 +26 -0
  443. data/spec/dummy_app/tmp/cache/assets/D9D/720/sprockets%2Fc7c311fcebe12a3cf86631a4a47f849f +490 -0
  444. data/spec/dummy_app/tmp/cache/assets/D9F/F20/sprockets%2F32f6c0bcea62f9ab09385db3217ee7e8 +0 -0
  445. data/spec/dummy_app/tmp/cache/assets/DA0/8A0/sprockets%2F9aff0ec8777da07337a51280eacd3f4e +768 -0
  446. data/spec/dummy_app/tmp/cache/assets/DA2/DB0/sprockets%2Fa6cfbef08a491ac3397e006bed885b38 +275 -0
  447. data/spec/dummy_app/tmp/cache/assets/DA4/010/sprockets%2F9663c5eebc07fdb49dd221cf84804c6b +0 -0
  448. data/spec/dummy_app/tmp/cache/assets/DA5/FE0/sprockets%2Fc5d487522471a6ab39cac1bf8e7e9b9b +0 -0
  449. data/spec/dummy_app/tmp/cache/assets/DA6/0A0/sprockets%2Fae11a6ff426fe2d094a5cde67159f94d +0 -0
  450. data/spec/dummy_app/tmp/cache/assets/DA9/170/sprockets%2F88a844719bb0fc081d9cfafc0e76ca96 +0 -0
  451. data/spec/dummy_app/tmp/cache/assets/DC2/720/sprockets%2F6a32e6f352ddd183d19dcac10cfc456b +0 -0
  452. data/spec/dummy_app/tmp/cache/assets/DCA/070/sprockets%2F8ec1ae13cf7ba342507cbb8f877a6dd1 +768 -0
  453. data/spec/dummy_app/tmp/cache/assets/DCB/120/sprockets%2Fc29be206ce74d90a4ad1f9a3d9d20f7d +0 -0
  454. data/spec/dummy_app/tmp/cache/assets/DD6/9B0/sprockets%2Fb92fb5cec0493bfdbe8248cd5673f71b +0 -0
  455. data/spec/dummy_app/tmp/cache/assets/DD7/5C0/sprockets%2Fe0912ed75a6ed23afdf293deed66871c +1376 -0
  456. data/spec/dummy_app/tmp/cache/assets/DD8/110/sprockets%2F8dfc7ac2667a017ee469f4cd443cfa8c +0 -0
  457. data/spec/dummy_app/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +21 -0
  458. data/spec/dummy_app/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +21 -0
  459. data/spec/dummy_app/tmp/cache/assets/E05/140/sprockets%2F41bf6f07f45b76cd2eef60ed2ffbb908 +0 -0
  460. data/spec/dummy_app/tmp/cache/assets/E09/FE0/sprockets%2Fc5df928b0e066c9e19ee3f2be8f6dbd0 +0 -0
  461. data/spec/dummy_app/tmp/cache/assets/E30/BF0/sprockets%2Fd35aca629e1763dd5a9deeb6caa78b6c +285 -0
  462. data/spec/dummy_app/tmp/cache/assets/E42/8C0/sprockets%2Faff1c93e2a43b887cbdebf8f9df9087b +0 -0
  463. data/spec/dummy_app/tmp/cache/assets/E61/F10/sprockets%2Fe616dbbacda8602fc9c589aefaf4c34f +1833 -0
  464. data/spec/dummy_app/tmp/cache/assets/E87/8F0/sprockets%2Ff90a7f08fcd06d0faf133fed3edbfa6a +0 -0
  465. data/spec/dummy_app/tmp/cache/sass/0591c977016a0bb372763f6f1cfb8002d44de3b2/mixins.css.scssc +0 -0
  466. data/spec/dummy_app/tmp/cache/sass/0591c977016a0bb372763f6f1cfb8002d44de3b2/theming.css.scssc +0 -0
  467. data/spec/dummy_app/tmp/cache/sass/0591c977016a0bb372763f6f1cfb8002d44de3b2/variables.css.scssc +0 -0
  468. data/spec/dummy_app/tmp/cache/sass/10238403c134661921596d094764445b02e815fe/mixins.css.scssc +0 -0
  469. data/spec/dummy_app/tmp/cache/sass/10238403c134661921596d094764445b02e815fe/theming.css.scssc +0 -0
  470. data/spec/dummy_app/tmp/cache/sass/10238403c134661921596d094764445b02e815fe/variables.css.scssc +0 -0
  471. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/imports.css.scss.erbc +0 -0
  472. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/jquery.colorpicker.css.scssc +0 -0
  473. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/jquery.ui.timepicker.css.scssc +0 -0
  474. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/ra.calendar-additions.css.scssc +0 -0
  475. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/ra.filtering-multiselect.css.scssc +0 -0
  476. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_accordion.scssc +0 -0
  477. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_alerts.scssc +0 -0
  478. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_breadcrumbs.scssc +0 -0
  479. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_button-groups.scssc +0 -0
  480. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_buttons.scssc +0 -0
  481. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_carousel.scssc +0 -0
  482. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_close.scssc +0 -0
  483. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_code.scssc +0 -0
  484. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_component-animations.scssc +0 -0
  485. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_dropdowns.scssc +0 -0
  486. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_forms.scssc +0 -0
  487. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_grid.scssc +0 -0
  488. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_hero-unit.scssc +0 -0
  489. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_labels.scssc +0 -0
  490. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_layouts.scssc +0 -0
  491. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_mixins.scssc +0 -0
  492. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_modals.scssc +0 -0
  493. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_navbar.scssc +0 -0
  494. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_navs.scssc +0 -0
  495. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_pager.scssc +0 -0
  496. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_pagination.scssc +0 -0
  497. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_popovers.scssc +0 -0
  498. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_progress-bars.scssc +0 -0
  499. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_reset.scssc +0 -0
  500. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_scaffolding.scssc +0 -0
  501. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_sprites.scssc +0 -0
  502. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_tables.scssc +0 -0
  503. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_thumbnails.scssc +0 -0
  504. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_tooltip.scssc +0 -0
  505. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_type.scssc +0 -0
  506. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_utilities.scssc +0 -0
  507. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_variables.scssc +0 -0
  508. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_wells.scssc +0 -0
  509. data/spec/dummy_app/tmp/cache/sass/ea17b334a44bfc0f3681b2e3e4202c941da9ee82/jquery-ui-1.8.7.custom.css.scssc +0 -0
  510. data/spec/dummy_app/tmp/cache/sass/fb68f840f6ad0344d3dcaecafd4b6ac4e35ca8fe/mixins.css.scssc +0 -0
  511. data/spec/dummy_app/tmp/cache/sass/fb68f840f6ad0344d3dcaecafd4b6ac4e35ca8fe/theming.css.scssc +0 -0
  512. data/spec/dummy_app/tmp/cache/sass/fb68f840f6ad0344d3dcaecafd4b6ac4e35ca8fe/variables.css.scssc +0 -0
  513. data/spec/dummy_app/tmp/dragonfly/cache/body/67/c49ea211b51fee9c0ccde26af73f27446aa071 +1 -0
  514. data/spec/dummy_app/tmp/dragonfly/cache/body/da/39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
  515. data/spec/dummy_app/tmp/dragonfly/cache/body/e7/536a0250f5395f318c24bee30dbbb0a2a28714 +24 -0
  516. data/spec/dummy_app/tmp/dragonfly/cache/body/f0/76846cb5891d588ad63ea7f6451e26b4f48c3d +19 -0
  517. data/spec/dummy_app/tmp/dragonfly/cache/meta/26/1464d915347774c08b1ddf6d305783e3acfadb +0 -0
  518. data/spec/dummy_app/tmp/dragonfly/cache/meta/7f/29e62b90d2b255e74d7e1a8ee8ed509c3f0406 +0 -0
  519. data/spec/dummy_app/tmp/dragonfly/cache/meta/c1/0f5c4fe64b3d3cffe2793ad7a8e51aeb4f3eec +0 -0
  520. data/spec/dummy_app/tmp/dragonfly/cache/meta/fe/97fd48b64023fee9cc7d8a12f0f1e9097058da +0 -0
  521. data/spec/factories.rb +71 -0
  522. data/spec/helpers/application_helper_spec.rb +277 -0
  523. data/spec/integration/authorization/cancan_spec.rb +358 -0
  524. data/spec/integration/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
  525. data/spec/integration/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +42 -0
  526. data/spec/integration/basic/create/rails_admin_basic_create_spec.rb +141 -0
  527. data/spec/integration/basic/create/rails_admin_namespaced_model_create_spec.rb +23 -0
  528. data/spec/integration/basic/delete/rails_admin_basic_delete_spec.rb +27 -0
  529. data/spec/integration/basic/destroy/rails_admin_basic_destroy_spec.rb +56 -0
  530. data/spec/integration/basic/edit/rails_admin_basic_edit_spec.rb +109 -0
  531. data/spec/integration/basic/export/rails_admin_basic_export_spec.rb +106 -0
  532. data/spec/integration/basic/list/rails_admin_basic_list_spec.rb +400 -0
  533. data/spec/integration/basic/new/rails_admin_basic_new_spec.rb +74 -0
  534. data/spec/integration/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
  535. data/spec/integration/basic/show/rails_admin_basic_show_spec.rb +91 -0
  536. data/spec/integration/basic/update/rails_admin_basic_update_spec.rb +223 -0
  537. data/spec/integration/config/edit/rails_admin_config_edit_spec.rb +1043 -0
  538. data/spec/integration/config/list/rails_admin_config_list_spec.rb +521 -0
  539. data/spec/integration/config/show/rails_admin_config_show_spec.rb +312 -0
  540. data/spec/integration/history/rails_admin_history_spec.rb +65 -0
  541. data/spec/integration/rails_admin_spec.rb +113 -0
  542. data/spec/integration/relation_spec.rb +35 -0
  543. data/spec/orm/active_record.rb +42 -0
  544. data/spec/orm/mongoid.rb +19 -0
  545. data/spec/spec_helper.rb +79 -0
  546. data/spec/unit/abstract_model_spec.rb +45 -0
  547. data/spec/unit/adapters/active_record/abstract_object_spec.rb +132 -0
  548. data/spec/unit/adapters/active_record_spec.rb +373 -0
  549. data/spec/unit/adapters/mongoid/abstract_object_spec.rb +31 -0
  550. data/spec/unit/adapters/mongoid_spec.rb +686 -0
  551. data/spec/unit/config/actions_spec.rb +181 -0
  552. data/spec/unit/config/fields/base_spec.rb +339 -0
  553. data/spec/unit/config/model_spec.rb +75 -0
  554. data/spec/unit/config/sections_spec.rb +123 -0
  555. data/spec/unit/config_spec.rb +278 -0
  556. metadata +1317 -0
@@ -0,0 +1,9 @@
1
+ o: ActiveSupport::Cache::Entry :@expires_in0:@compressedF: @value"�"{"content_type"
2
+ class"ProcessedAsset"dependency_digest"%e9c0a6b76c0628968d71b4127d99196c"
3
+ mtime"2012-04-28T20:21:50-05:00"
4
+ mtime"2012-04-20T18:48:54-05:00" digest"%b92aeda5006fc00b5fab384c42f53b16" path"m/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_progress-bars.scss{@"2012-04-20T18:48:54-05:00@"%ff03f76168a171deac13948b8e930687@"t/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_component-animations.scss{@"2012-04-20T18:48:54-05:00@"%afe0fb6e4c436c6038c0c7b77adddfb5@"g/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_layouts.scss{@"2012-04-28T20:21:50-05:00@"%7e06741d32e360f755b27de48d06a880@"h/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss{@"2012-04-20T18:48:54-05:00@"%720f0f2ce44287b164807d5ebd8fa74e@"i/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_utilities.scss{@"2012-04-20T18:48:54-05:00@"%955d8883967b541c0a42b8733fcd6baa@"i/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_accordion.scss{@"2012-04-20T18:48:54-05:00@"%41cec980ef93eb27540978ca71bad9ae@"j/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_thumbnails.scss{@"2012-04-28T20:21:50-05:00@"%2f5af7edb94d6dc50096c2aaa57a1a76@"^/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/custom/theming.css.scss{@"2012-04-28T20:21:50-05:00@"%88253a5bde33b3760e8f77f2382ff2d0@"f/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss{@"2012-04-28T20:21:50-05:00@"%029ad82222779324b7a2f44699a2adab@"\/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/base/theming.css.scss{@"2012-04-20T18:48:54-05:00@"%67cc44616203b7e7a012ac4c69e1b355@"f/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_navbar.scss{@"2012-04-20T18:48:54-05:00@"%f4d5ff1b29ff7a09d816f46aa30d3204@"f/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_mixins.scss{@"2012-04-28T20:21:50-05:00@"%6dbcac2a975e1ade161b43f712fcff03@"d/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss{@"2012-04-28T20:21:50-05:00@"%e209c39e70b8f4515a59dc68e9d4ffc0@"m/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss{@"2012-04-20T18:48:54-05:00@"%6f469392bad0865739ffb1cdd9126869@"f/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_modals.scss{@"2012-04-20T18:48:54-05:00@"%ec07d24ea725d4d472a1c1dc535ee5d2@"k/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_breadcrumbs.scss{@"2012-04-20T18:48:54-05:00@"%97650ecb0dad4d57bc19b69233851450@"d/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_navs.scss{@"2012-04-20T18:48:54-05:00@"%ffe72cd261b04f92dcb2554b4c94db77@"e/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_wells.scss{@"2012-04-20T18:48:54-05:00@"%5a6a367b4e79c7617439a87e1314b8c2@"d/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_grid.scss{@"2012-04-28T20:21:50-05:00@"%42c4adc0d1b13a75e3dcc8a8abfa6a2c@"e/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss{@"2012-04-28T20:21:50-05:00@"%1f53a1fdf6aaa7d07086c4bf0e1865ea@"[/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/imports.css.scss.erb{@"2012-04-20T18:48:54-05:00@"%cc47e05a24ecf44baaecbfeb23f1da37@"d/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_type.scss{@"2012-04-20T18:48:54-05:00@"%86b6f7f6154711480642f91128746a35@"h/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_popovers.scss{@"2012-04-28T20:21:50-05:00@"%d8e9a597e3f4d45ea93aefd5610ae12b@"]/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/custom/mixins.css.scss{@"2012-04-28T20:21:50-05:00@"%cc2a1021fea9e11218a92f3ff216d87f@"e/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss{@"2012-04-28T20:21:50-05:00@"%10cb85d30070373d694353f418df7648@"`/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/custom/variables.css.scss{@"2012-04-28T20:21:50-05:00@"%6b3af9f949113f6704af7f880fe29f9f@"^/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/base/variables.css.scss{@"2012-04-28T20:21:50-05:00@"%1b299b5018a51c43d2993dded8e17f82@"V/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/rails_admin.css{@"2012-04-20T18:48:54-05:00@"%6855e862334cb74d62702a03136f8d8e@"j/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_pagination.scss{@"2012-04-20T18:48:54-05:00@"%fe025350544099599fecdad1ddcba617@"m/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_button-groups.scss{@"2012-04-20T18:48:54-05:00@"%24824ef056ed378e9daefbc7614a6533@"f/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_tables.scss{@"2012-04-20T18:48:54-05:00@"%e7f27b34ef368302782c1774a82223f9@"e/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_forms.scss{@"2012-04-28T20:21:50-05:00@"%371677f39ce8c9135b07817cb631709f@"b/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss{@"2012-04-20T18:48:54-05:00@"%e7e2436e67d02c197eef7eee3c7dbfe8@"e/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_reset.scss{@"2012-04-20T18:48:54-05:00@"%c2c741ce13453b871353c52e98d81338@"g/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_tooltip.scss{@"2012-04-20T18:48:54-05:00@"%30b10d26181ffb464f4b491321449443@"f/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_alerts.scss{@"2012-04-20T18:48:54-05:00@"%8ae398970f8bab1e0a46e293c3a7ce1b@"e/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_close.scss{@"2012-04-20T18:48:54-05:00@"%a6cfd5b337dbbb2fe62d9a9d80fc5e5a@"g/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_sprites.scss{@"2012-04-20T18:48:54-05:00@"%bb4cbc0fba34fcfb0de398c03ffe9445@"k/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_scaffolding.scss{@"2012-04-28T20:21:50-05:00@"%51319e86ab4bc6d0dacaea48462b95a2@"[/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/base/mixins.css.scss{@"2012-04-28T20:21:50-05:00@"%9d1908eb73214768a263068e67828812@"h/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss{@"2012-04-20T18:48:54-05:00@"%3cabfbc5656c927045eb4b52f97cb0b4@"i/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_hero-unit.scss{@"2012-04-20T18:48:54-05:00@"%46719b8532f9b3741c08e16328173f1a@"f/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_labels.scss{@"2012-04-20T18:48:54-05:00@"%2feac7d859a6725406f1fdce4cdab063@"i/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_dropdowns.scss{@"2012-04-20T18:48:54-05:00@"%c2677a589eb2168590306a424a2a40fc@"d/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_code.scss{@"2012-04-20T18:48:54-05:00@"%ce38db5d550aae2156e4fd2dc850a387@"i/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_variables.scss{@"2012-04-20T18:48:54-05:00@"%548a52a5c9198e586e0e7e75c821738a@"h/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_carousel.scss{@"2012-04-20T18:48:54-05:00@"%bc2dd65ffdb2eebdf77782791ff6c9a3@"e/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_pager.scss{@"2012-04-20T18:48:54-05:00@"%b4cb14a1b8365e510a9b1e619198d30a@"g/Library/Ruby/Gems/1.8/gems/bootstrap-sass-2.0.2/vendor/assets/stylesheets/bootstrap/_buttons.scss" digest"%293d8c4247cb480839e666e86e0eca8a"required_paths["[/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/imports.css.scss.erb"V/Users/njones/Code/rails_admin/app/assets/stylesheets/rails_admin/rails_admin.css"
5
+
6
+ */
7
+ /* Nothing else here (sass @import statements create weird pbs in a self required scss file) */
8
+
9
+ :@created_atf1335716310.968863�
@@ -0,0 +1,1376 @@
1
+ o: ActiveSupport::Cache::Entry :@expires_in0:@compressedF: @value"}�{"content_type"application/javascript"
2
+ class"ProcessedAsset"dependency_digest"%cd54d8b3b4dc45736be513046c26dc32"
3
+ mtime"2012-04-28T20:21:50-05:00"
4
+ mtime"2012-04-28T20:21:50-05:00" digest"%b1ccde9e0b7ccd56441d15e99f4301e1" path"^/Users/njones/Code/rails_admin/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js" digest"%cf97c3d3dfeafa89be4b113a0613e63a"required_paths["^/Users/njones/Code/rails_admin/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js"
5
+ * jQuery UI Timepicker 0.2.9
6
+ *
7
+ * Copyright 2010-2011, Francois Gelinas
8
+ * Dual licensed under the MIT or GPL Version 2 licenses.
9
+ * http://jquery.org/license
10
+ *
11
+ * http://fgelinas.com/code/timepicker
12
+ *
13
+ * Depends:
14
+ * jquery.ui.core.js
15
+ * jquery.ui.position.js (only if position settngs are used)
16
+ *
17
+ * Change version 0.1.0 - moved the t-rex up here
18
+ *
19
+ ____
20
+ ___ .-~. /_"-._
21
+ `-._~-. / /_ "~o\ :Y
22
+ \ \ / : \~x. ` ')
23
+ ] Y / | Y< ~-.__j
24
+ / ! _.--~T : l l< /.-~
25
+ / / ____.--~ . ` l /~\ \<|Y
26
+ / / .-~~" /| . ',-~\ \L|
27
+ / / / .^ \ Y~Y \.^>/l_ "--'
28
+ / Y .-"( . l__ j_j l_/ /~_.-~ .
29
+ Y l / \ ) ~~~." / `/"~ / \.__/l_
30
+ | \ _.-" ~-{__ l : l._Z~-.___.--~
31
+ | ~---~ / ~~"---\_ ' __[>
32
+ l . _.^ ___ _>-y~
33
+ \ \ . .-~ .-~ ~>--" /
34
+ \ ~---" / ./ _.-'
35
+ "-.,_____.,_ _.--~\ _.-~
36
+ ~~ ( _} -Row
37
+ `. ~(
38
+ ) \
39
+ /,`--'~\--'~\
40
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41
+ ->T-Rex<-
42
+ */
43
+
44
+
45
+ (function ($, undefined) {
46
+
47
+ $.extend($.ui, { timepicker: { version: "0.2.9"} });
48
+
49
+ var PROP_NAME = 'timepicker';
50
+ var tpuuid = new Date().getTime();
51
+
52
+ /* Time picker manager.
53
+ Use the singleton instance of this class, $.timepicker, to interact with the time picker.
54
+ Settings for (groups of) time pickers are maintained in an instance object,
55
+ allowing multiple different settings on the same page. */
56
+
57
+ function Timepicker() {
58
+ this.debug = true; // Change this to true to start debugging
59
+ this._curInst = null; // The current instance in use
60
+ this._isInline = false; // true if the instance is displayed inline
61
+ this._disabledInputs = []; // List of time picker inputs that have been disabled
62
+ this._timepickerShowing = false; // True if the popup picker is showing , false if not
63
+ this._inDialog = false; // True if showing within a "dialog", false if not
64
+ this._dialogClass = 'ui-timepicker-dialog'; // The name of the dialog marker class
65
+ this._mainDivId = 'ui-timepicker-div'; // The ID of the main timepicker division
66
+ this._inlineClass = 'ui-timepicker-inline'; // The name of the inline marker class
67
+ this._currentClass = 'ui-timepicker-current'; // The name of the current hour / minutes marker class
68
+ this._dayOverClass = 'ui-timepicker-days-cell-over'; // The name of the day hover marker class
69
+
70
+ this.regional = []; // Available regional settings, indexed by language code
71
+ this.regional[''] = { // Default regional settings
72
+ hourText: 'Hour', // Display text for hours section
73
+ minuteText: 'Minute', // Display text for minutes link
74
+ amPmText: ['AM', 'PM'], // Display text for AM PM
75
+ closeButtonText: 'Done', // Text for the confirmation button (ok button)
76
+ nowButtonText: 'Now', // Text for the now button
77
+ deselectButtonText: 'Deselect' // Text for the deselect button
78
+ };
79
+ this._defaults = { // Global defaults for all the time picker instances
80
+ showOn: 'focus', // 'focus' for popup on focus,
81
+ // 'button' for trigger button, or 'both' for either (not yet implemented)
82
+ button: null, // 'button' element that will trigger the timepicker
83
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
84
+ showOptions: {}, // Options for enhanced animations
85
+ appendText: '', // Display text following the input box, e.g. showing the format
86
+
87
+ beforeShow: null, // Define a callback function executed before the timepicker is shown
88
+ onSelect: null, // Define a callback function when a hour / minutes is selected
89
+ onClose: null, // Define a callback function when the timepicker is closed
90
+
91
+ timeSeparator: ':', // The character to use to separate hours and minutes.
92
+ periodSeparator: ' ', // The character to use to separate the time from the time period.
93
+ showPeriod: false, // Define whether or not to show AM/PM with selected time
94
+ showPeriodLabels: true, // Show the AM/PM labels on the left of the time picker
95
+ showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10. [true/false]
96
+ showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
97
+ altField: '', // Selector for an alternate field to store selected time into
98
+ defaultTime: 'now', // Used as default time when input field is empty or for inline timePicker
99
+ // (set to 'now' for the current time, '' for no highlighted time)
100
+ myPosition: 'left top', // Position of the dialog relative to the input.
101
+ // see the position utility for more info : http://jqueryui.com/demos/position/
102
+ atPosition: 'left bottom', // Position of the input element to match
103
+ // Note : if the position utility is not loaded, the timepicker will attach left top to left bottom
104
+ //NEW: 2011-02-03
105
+ onHourShow: null, // callback for enabling / disabling on selectable hours ex : function(hour) { return true; }
106
+ onMinuteShow: null, // callback for enabling / disabling on time selection ex : function(hour,minute) { return true; }
107
+
108
+ hours: {
109
+ starts: 0, // first displayed hour
110
+ ends: 23 // last displayed hour
111
+ },
112
+ minutes: {
113
+ starts: 0, // first displayed minute
114
+ ends: 55, // last displayed minute
115
+ interval: 5 // interval of displayed minutes
116
+ },
117
+ rows: 4, // number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
118
+ // 2011-08-05 0.2.4
119
+ showHours: true, // display the hours section of the dialog
120
+ showMinutes: true, // display the minute section of the dialog
121
+ optionalMinutes: false, // optionally parse inputs of whole hours with minutes omitted
122
+
123
+ // buttons
124
+ showCloseButton: false, // shows an OK button to confirm the edit
125
+ showNowButton: false, // Shows the 'now' button
126
+ showDeselectButton: false // Shows the deselect time button
127
+
128
+ };
129
+ $.extend(this._defaults, this.regional['']);
130
+
131
+ this.tpDiv = $('<div id="' + this._mainDivId + '" class="ui-timepicker ui-widget ui-helper-clearfix ui-corner-all " style="display: none"></div>');
132
+ }
133
+
134
+ $.extend(Timepicker.prototype, {
135
+ /* Class name added to elements to indicate already configured with a time picker. */
136
+ markerClassName: 'hasTimepicker',
137
+
138
+ /* Debug logging (if enabled). */
139
+ log: function () {
140
+ if (this.debug)
141
+ console.log.apply('', arguments);
142
+ },
143
+
144
+ _widgetTimepicker: function () {
145
+ return this.tpDiv;
146
+ },
147
+
148
+ /* Override the default settings for all instances of the time picker.
149
+ @param settings object - the new settings to use as defaults (anonymous object)
150
+ @return the manager object */
151
+ setDefaults: function (settings) {
152
+ extendRemove(this._defaults, settings || {});
153
+ return this;
154
+ },
155
+
156
+ /* Attach the time picker to a jQuery selection.
157
+ @param target element - the target input field or division or span
158
+ @param settings object - the new settings to use for this time picker instance (anonymous) */
159
+ _attachTimepicker: function (target, settings) {
160
+ // check for settings on the control itself - in namespace 'time:'
161
+ var inlineSettings = null;
162
+ for (var attrName in this._defaults) {
163
+ var attrValue = target.getAttribute('time:' + attrName);
164
+ if (attrValue) {
165
+ inlineSettings = inlineSettings || {};
166
+ try {
167
+ inlineSettings[attrName] = eval(attrValue);
168
+ } catch (err) {
169
+ inlineSettings[attrName] = attrValue;
170
+ }
171
+ }
172
+ }
173
+ var nodeName = target.nodeName.toLowerCase();
174
+ var inline = (nodeName == 'div' || nodeName == 'span');
175
+
176
+ if (!target.id) {
177
+ this.uuid += 1;
178
+ target.id = 'tp' + this.uuid;
179
+ }
180
+ var inst = this._newInst($(target), inline);
181
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
182
+ if (nodeName == 'input') {
183
+ this._connectTimepicker(target, inst);
184
+ // init inst.hours and inst.minutes from the input value
185
+ this._setTimeFromField(inst);
186
+ } else if (inline) {
187
+ this._inlineTimepicker(target, inst);
188
+ }
189
+
190
+
191
+ },
192
+
193
+ /* Create a new instance object. */
194
+ _newInst: function (target, inline) {
195
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
196
+ return {
197
+ id: id, input: target, // associated target
198
+ inline: inline, // is timepicker inline or not :
199
+ tpDiv: (!inline ? this.tpDiv : // presentation div
200
+ $('<div class="' + this._inlineClass + ' ui-timepicker ui-widget ui-helper-clearfix"></div>'))
201
+ };
202
+ },
203
+
204
+ /* Attach the time picker to an input field. */
205
+ _connectTimepicker: function (target, inst) {
206
+ var input = $(target);
207
+ inst.append = $([]);
208
+ inst.trigger = $([]);
209
+ if (input.hasClass(this.markerClassName)) { return; }
210
+ this._attachments(input, inst);
211
+ input.addClass(this.markerClassName).
212
+ keydown(this._doKeyDown).
213
+ keyup(this._doKeyUp).
214
+ bind("setData.timepicker", function (event, key, value) {
215
+ inst.settings[key] = value;
216
+ }).
217
+ bind("getData.timepicker", function (event, key) {
218
+ return this._get(inst, key);
219
+ });
220
+ $.data(target, PROP_NAME, inst);
221
+ },
222
+
223
+ /* Handle keystrokes. */
224
+ _doKeyDown: function (event) {
225
+ var inst = $.timepicker._getInst(event.target);
226
+ var handled = true;
227
+ inst._keyEvent = true;
228
+ if ($.timepicker._timepickerShowing) {
229
+ switch (event.keyCode) {
230
+ case 9: $.timepicker._hideTimepicker();
231
+ handled = false;
232
+ break; // hide on tab out
233
+ case 13:
234
+ $.timepicker._updateSelectedValue(inst);
235
+ $.timepicker._hideTimepicker();
236
+
237
+ return false; // don't submit the form
238
+ break; // select the value on enter
239
+ case 27: $.timepicker._hideTimepicker();
240
+ break; // hide on escape
241
+ default: handled = false;
242
+ }
243
+ }
244
+ else if (event.keyCode == 36 && event.ctrlKey) { // display the time picker on ctrl+home
245
+ $.timepicker._showTimepicker(this);
246
+ }
247
+ else {
248
+ handled = false;
249
+ }
250
+ if (handled) {
251
+ event.preventDefault();
252
+ event.stopPropagation();
253
+ }
254
+ },
255
+
256
+ /* Update selected time on keyUp */
257
+ /* Added verion 0.0.5 */
258
+ _doKeyUp: function (event) {
259
+ var inst = $.timepicker._getInst(event.target);
260
+ $.timepicker._setTimeFromField(inst);
261
+ $.timepicker._updateTimepicker(inst);
262
+ },
263
+
264
+ /* Make attachments based on settings. */
265
+ _attachments: function (input, inst) {
266
+ var appendText = this._get(inst, 'appendText');
267
+ var isRTL = this._get(inst, 'isRTL');
268
+ if (inst.append) { inst.append.remove(); }
269
+ if (appendText) {
270
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
271
+ input[isRTL ? 'before' : 'after'](inst.append);
272
+ }
273
+ input.unbind('focus.timepicker', this._showTimepicker);
274
+ input.unbind('click.timepicker', this._adjustZIndex);
275
+
276
+ if (inst.trigger) { inst.trigger.remove(); }
277
+
278
+ var showOn = this._get(inst, 'showOn');
279
+ if (showOn == 'focus' || showOn == 'both') { // pop-up time picker when in the marked field
280
+ input.bind("focus.timepicker", this._showTimepicker);
281
+ input.bind("click.timepicker", this._adjustZIndex);
282
+ }
283
+ if (showOn == 'button' || showOn == 'both') { // pop-up time picker when 'button' element is clicked
284
+ var button = this._get(inst, 'button');
285
+ $(button).bind("click.timepicker", function () {
286
+ if ($.timepicker._timepickerShowing && $.timepicker._lastInput == input[0]) {
287
+ $.timepicker._hideTimepicker();
288
+ } else if (!inst.input.is(':disabled')) {
289
+ $.timepicker._showTimepicker(input[0]);
290
+ }
291
+ return false;
292
+ });
293
+
294
+ }
295
+ },
296
+
297
+
298
+ /* Attach an inline time picker to a div. */
299
+ _inlineTimepicker: function(target, inst) {
300
+ var divSpan = $(target);
301
+ if (divSpan.hasClass(this.markerClassName))
302
+ return;
303
+ divSpan.addClass(this.markerClassName).append(inst.tpDiv).
304
+ bind("setData.timepicker", function(event, key, value){
305
+ inst.settings[key] = value;
306
+ }).bind("getData.timepicker", function(event, key){
307
+ return this._get(inst, key);
308
+ });
309
+ $.data(target, PROP_NAME, inst);
310
+
311
+ this._setTimeFromField(inst);
312
+ this._updateTimepicker(inst);
313
+ inst.tpDiv.show();
314
+ },
315
+
316
+ _adjustZIndex: function(input) {
317
+ input = input.target || input;
318
+ var inst = $.timepicker._getInst(input);
319
+ inst.tpDiv.css('zIndex', $.timepicker._getZIndex(input) +1);
320
+ },
321
+
322
+ /* Pop-up the time picker for a given input field.
323
+ @param input element - the input field attached to the time picker or
324
+ event - if triggered by focus */
325
+ _showTimepicker: function (input) {
326
+ input = input.target || input;
327
+ if (input.nodeName.toLowerCase() != 'input') { input = $('input', input.parentNode)[0]; } // find from button/image trigger
328
+
329
+ if ($.timepicker._isDisabledTimepicker(input) || $.timepicker._lastInput == input) { return; } // already here
330
+
331
+ // fix v 0.0.8 - close current timepicker before showing another one
332
+ $.timepicker._hideTimepicker();
333
+
334
+ var inst = $.timepicker._getInst(input);
335
+ if ($.timepicker._curInst && $.timepicker._curInst != inst) {
336
+ $.timepicker._curInst.tpDiv.stop(true, true);
337
+ }
338
+ var beforeShow = $.timepicker._get(inst, 'beforeShow');
339
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
340
+ inst.lastVal = null;
341
+ $.timepicker._lastInput = input;
342
+
343
+ $.timepicker._setTimeFromField(inst);
344
+
345
+ // calculate default position
346
+ if ($.timepicker._inDialog) { input.value = ''; } // hide cursor
347
+ if (!$.timepicker._pos) { // position below input
348
+ $.timepicker._pos = $.timepicker._findPos(input);
349
+ $.timepicker._pos[1] += input.offsetHeight; // add the height
350
+ }
351
+ var isFixed = false;
352
+ $(input).parents().each(function () {
353
+ isFixed |= $(this).css('position') == 'fixed';
354
+ return !isFixed;
355
+ });
356
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
357
+ $.timepicker._pos[0] -= document.documentElement.scrollLeft;
358
+ $.timepicker._pos[1] -= document.documentElement.scrollTop;
359
+ }
360
+
361
+ var offset = { left: $.timepicker._pos[0], top: $.timepicker._pos[1] };
362
+
363
+ $.timepicker._pos = null;
364
+ // determine sizing offscreen
365
+ inst.tpDiv.css({ position: 'absolute', display: 'block', top: '-1000px' });
366
+ $.timepicker._updateTimepicker(inst);
367
+
368
+
369
+ // position with the ui position utility, if loaded
370
+ if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
371
+ inst.tpDiv.position({
372
+ of: inst.input,
373
+ my: $.timepicker._get( inst, 'myPosition' ),
374
+ at: $.timepicker._get( inst, 'atPosition' ),
375
+ // offset: $( "#offset" ).val(),
376
+ // using: using,
377
+ collision: 'flip'
378
+ });
379
+ var offset = inst.tpDiv.offset();
380
+ $.timepicker._pos = [offset.top, offset.left];
381
+ }
382
+
383
+
384
+ // reset clicked state
385
+ inst._hoursClicked = false;
386
+ inst._minutesClicked = false;
387
+
388
+ // fix width for dynamic number of time pickers
389
+ // and adjust position before showing
390
+ offset = $.timepicker._checkOffset(inst, offset, isFixed);
391
+ inst.tpDiv.css({ position: ($.timepicker._inDialog && $.blockUI ?
392
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
393
+ left: offset.left + 'px', top: offset.top + 'px'
394
+ });
395
+ if ( ! inst.inline ) {
396
+ var showAnim = $.timepicker._get(inst, 'showAnim');
397
+ var duration = $.timepicker._get(inst, 'duration');
398
+
399
+ var postProcess = function () {
400
+ $.timepicker._timepickerShowing = true;
401
+ var borders = $.timepicker._getBorders(inst.tpDiv);
402
+ inst.tpDiv.find('iframe.ui-timepicker-cover'). // IE6- only
403
+ css({ left: -borders[0], top: -borders[1],
404
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
405
+ });
406
+ };
407
+
408
+ // Fixed the zIndex problem for real (I hope) - FG - v 0.2.9
409
+ $.timepicker._adjustZIndex(input);
410
+ //inst.tpDiv.css('zIndex', $.timepicker._getZIndex(input) +1);
411
+
412
+ if ($.effects && $.effects[showAnim]) {
413
+ inst.tpDiv.show(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
414
+ }
415
+ else {
416
+ inst.tpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
417
+ }
418
+ if (!showAnim || !duration) { postProcess(); }
419
+ if (inst.input.is(':visible') && !inst.input.is(':disabled')) { inst.input.focus(); }
420
+ $.timepicker._curInst = inst;
421
+ }
422
+ },
423
+
424
+ // This is a copy of the zIndex function of UI core 1.8.??
425
+ // Copied in the timepicker to stay backward compatible.
426
+ _getZIndex: function (target) {
427
+ var elem = $( target ), position, value;
428
+ while ( elem.length && elem[ 0 ] !== document ) {
429
+ position = elem.css( "position" );
430
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
431
+ value = parseInt( elem.css( "zIndex" ), 10 );
432
+ if ( !isNaN( value ) && value !== 0 ) {
433
+ return value;
434
+ }
435
+ }
436
+ elem = elem.parent();
437
+ }
438
+ },
439
+
440
+ /* Generate the time picker content. */
441
+ _updateTimepicker: function (inst) {
442
+ inst.tpDiv.empty().append(this._generateHTML(inst));
443
+ this._rebindDialogEvents(inst);
444
+
445
+ },
446
+
447
+ _rebindDialogEvents: function (inst) {
448
+ var borders = $.timepicker._getBorders(inst.tpDiv),
449
+ self = this;
450
+ inst.tpDiv
451
+ .find('iframe.ui-timepicker-cover') // IE6- only
452
+ .css({ left: -borders[0], top: -borders[1],
453
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
454
+ })
455
+ .end()
456
+ // after the picker html is appended bind the click & double click events (faster in IE this way
457
+ // then letting the browser interpret the inline events)
458
+ // the binding for the minute cells also exists in _updateMinuteDisplay
459
+ .find('.ui-timepicker-minute-cell')
460
+ .unbind()
461
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
462
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this))
463
+ .end()
464
+ .find('.ui-timepicker-hour-cell')
465
+ .unbind()
466
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectHours, this))
467
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectHours, this))
468
+ .end()
469
+ .find('.ui-timepicker td a')
470
+ .unbind()
471
+ .bind('mouseout', function () {
472
+ $(this).removeClass('ui-state-hover');
473
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
474
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
475
+ })
476
+ .bind('mouseover', function () {
477
+ if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
478
+ $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
479
+ $(this).addClass('ui-state-hover');
480
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
481
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
482
+ }
483
+ })
484
+ .end()
485
+ .find('.' + this._dayOverClass + ' a')
486
+ .trigger('mouseover')
487
+ .end()
488
+ .find('.ui-timepicker-now').bind("click",function(e) {
489
+ $.timepicker.selectNow(e);
490
+ }).end()
491
+ .find('.ui-timepicker-deselect').bind("click",function(e) {
492
+ $.timepicker.deselectTime(e);
493
+ }).end()
494
+ .find('.ui-timepicker-close').bind("click",function(e) {
495
+ $.timepicker._hideTimepicker();
496
+ }).end();
497
+ },
498
+
499
+ /* Generate the HTML for the current state of the time picker. */
500
+ _generateHTML: function (inst) {
501
+
502
+ var h, m, row, col, html, hoursHtml, minutesHtml = '',
503
+ showPeriod = (this._get(inst, 'showPeriod') == true),
504
+ showPeriodLabels = (this._get(inst, 'showPeriodLabels') == true),
505
+ showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
506
+ showHours = (this._get(inst, 'showHours') == true),
507
+ showMinutes = (this._get(inst, 'showMinutes') == true),
508
+ amPmText = this._get(inst, 'amPmText'),
509
+ rows = this._get(inst, 'rows'),
510
+ amRows = 0,
511
+ pmRows = 0,
512
+ amItems = 0,
513
+ pmItems = 0,
514
+ amFirstRow = 0,
515
+ pmFirstRow = 0,
516
+ hours = Array(),
517
+ hours_options = this._get(inst, 'hours'),
518
+ hoursPerRow = null,
519
+ hourCounter = 0,
520
+ hourLabel = this._get(inst, 'hourText'),
521
+ showCloseButton = this._get(inst, 'showCloseButton'),
522
+ closeButtonText = this._get(inst, 'closeButtonText'),
523
+ showNowButton = this._get(inst, 'showNowButton'),
524
+ nowButtonText = this._get(inst, 'nowButtonText'),
525
+ showDeselectButton = this._get(inst, 'showDeselectButton'),
526
+ deselectButtonText = this._get(inst, 'deselectButtonText'),
527
+ showButtonPanel = showCloseButton || showNowButton || showDeselectButton;
528
+
529
+
530
+
531
+ // prepare all hours and minutes, makes it easier to distribute by rows
532
+ for (h = hours_options.starts; h <= hours_options.ends; h++) {
533
+ hours.push (h);
534
+ }
535
+ hoursPerRow = Math.ceil(hours.length / rows); // always round up
536
+
537
+ if (showPeriodLabels) {
538
+ for (hourCounter = 0; hourCounter < hours.length; hourCounter++) {
539
+ if (hours[hourCounter] < 12) {
540
+ amItems++;
541
+ }
542
+ else {
543
+ pmItems++;
544
+ }
545
+ }
546
+ hourCounter = 0;
547
+
548
+ amRows = Math.floor(amItems / hours.length * rows);
549
+ pmRows = Math.floor(pmItems / hours.length * rows);
550
+
551
+ // assign the extra row to the period that is more densly populated
552
+ if (rows != amRows + pmRows) {
553
+ // Make sure: AM Has Items and either PM Does Not, AM has no rows yet, or AM is more dense
554
+ if (amItems && (!pmItems || !amRows || (pmRows && amItems / amRows >= pmItems / pmRows))) {
555
+ amRows++;
556
+ } else {
557
+ pmRows++;
558
+ }
559
+ }
560
+ amFirstRow = Math.min(amRows, 1);
561
+ pmFirstRow = amRows + 1;
562
+ hoursPerRow = Math.ceil(Math.max(amItems / amRows, pmItems / pmRows));
563
+ }
564
+
565
+
566
+ html = '<table class="ui-timepicker-table ui-widget-content ui-corner-all"><tr>';
567
+
568
+ if (showHours) {
569
+
570
+ html += '<td class="ui-timepicker-hours">' +
571
+ '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
572
+ hourLabel +
573
+ '</div>' +
574
+ '<table class="ui-timepicker">';
575
+
576
+ for (row = 1; row <= rows; row++) {
577
+ html += '<tr>';
578
+ // AM
579
+ if (row == amFirstRow && showPeriodLabels) {
580
+ html += '<th rowspan="' + amRows.toString() + '" class="periods" scope="row">' + amPmText[0] + '</th>';
581
+ }
582
+ // PM
583
+ if (row == pmFirstRow && showPeriodLabels) {
584
+ html += '<th rowspan="' + pmRows.toString() + '" class="periods" scope="row">' + amPmText[1] + '</th>';
585
+ }
586
+ for (col = 1; col <= hoursPerRow; col++) {
587
+ if (showPeriodLabels && row < pmFirstRow && hours[hourCounter] >= 12) {
588
+ html += this._generateHTMLHourCell(inst, undefined, showPeriod, showLeadingZero);
589
+ } else {
590
+ html += this._generateHTMLHourCell(inst, hours[hourCounter], showPeriod, showLeadingZero);
591
+ hourCounter++;
592
+ }
593
+ }
594
+ html += '</tr>';
595
+ }
596
+ html += '</tr></table>' + // Close the hours cells table
597
+ '</td>'; // Close the Hour td
598
+ }
599
+
600
+ if (showMinutes) {
601
+ html += '<td class="ui-timepicker-minutes">';
602
+ html += this._generateHTMLMinutes(inst);
603
+ html += '</td>';
604
+ }
605
+
606
+ html += '</tr>';
607
+
608
+
609
+ if (showButtonPanel) {
610
+ var buttonPanel = '<tr><td colspan="3"><div class="ui-timepicker-buttonpane ui-widget-content">';
611
+ if (showNowButton) {
612
+ buttonPanel += '<button type="button" class="ui-timepicker-now ui-state-default ui-corner-all" '
613
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
614
+ + nowButtonText + '</button>';
615
+ }
616
+ if (showDeselectButton) {
617
+ buttonPanel += '<button type="button" class="ui-timepicker-deselect ui-state-default ui-corner-all" '
618
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
619
+ + deselectButtonText + '</button>';
620
+ }
621
+ if (showCloseButton) {
622
+ buttonPanel += '<button type="button" class="ui-timepicker-close ui-state-default ui-corner-all" '
623
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
624
+ + closeButtonText + '</button>';
625
+ }
626
+
627
+ html += buttonPanel + '</div></td></tr>';
628
+ }
629
+ html += '</table>';
630
+
631
+ /* IE6 IFRAME FIX (taken from datepicker 1.5.3, fixed in 0.1.2 */
632
+ html += ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
633
+ '<iframe src="javascript:false;" class="ui-timepicker-cover" frameborder="0"></iframe>' : '');
634
+
635
+ return html;
636
+ },
637
+
638
+ /* Special function that update the minutes selection in currently visible timepicker
639
+ * called on hour selection when onMinuteShow is defined */
640
+ _updateMinuteDisplay: function (inst) {
641
+ var newHtml = this._generateHTMLMinutes(inst);
642
+ inst.tpDiv.find('td.ui-timepicker-minutes').html(newHtml);
643
+ this._rebindDialogEvents(inst);
644
+ // after the picker html is appended bind the click & double click events (faster in IE this way
645
+ // then letting the browser interpret the inline events)
646
+ // yes I know, duplicate code, sorry
647
+ /* .find('.ui-timepicker-minute-cell')
648
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
649
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
650
+ */
651
+
652
+ },
653
+
654
+ /*
655
+ * Generate the minutes table
656
+ * This is separated from the _generateHTML function because is can be called separately (when hours changes)
657
+ */
658
+ _generateHTMLMinutes: function (inst) {
659
+
660
+ var m, row, html = '',
661
+ rows = this._get(inst, 'rows'),
662
+ minutes = Array(),
663
+ minutes_options = this._get(inst, 'minutes'),
664
+ minutesPerRow = null,
665
+ minuteCounter = 0,
666
+ showMinutesLeadingZero = (this._get(inst, 'showMinutesLeadingZero') == true),
667
+ onMinuteShow = this._get(inst, 'onMinuteShow'),
668
+ minuteLabel = this._get(inst, 'minuteText');
669
+
670
+ if ( ! minutes_options.starts) {
671
+ minutes_options.starts = 0;
672
+ }
673
+ if ( ! minutes_options.ends) {
674
+ minutes_options.ends = 59;
675
+ }
676
+ for (m = minutes_options.starts; m <= minutes_options.ends; m += minutes_options.interval) {
677
+ minutes.push(m);
678
+ }
679
+ minutesPerRow = Math.round(minutes.length / rows + 0.49); // always round up
680
+
681
+ /*
682
+ * The minutes table
683
+ */
684
+ // if currently selected minute is not enabled, we have a problem and need to select a new minute.
685
+ if (onMinuteShow &&
686
+ (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours , inst.minutes]) == false) ) {
687
+ // loop minutes and select first available
688
+ for (minuteCounter = 0; minuteCounter < minutes.length; minuteCounter += 1) {
689
+ m = minutes[minuteCounter];
690
+ if (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours, m])) {
691
+ inst.minutes = m;
692
+ break;
693
+ }
694
+ }
695
+ }
696
+
697
+
698
+
699
+ html += '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
700
+ minuteLabel +
701
+ '</div>' +
702
+ '<table class="ui-timepicker">';
703
+
704
+ minuteCounter = 0;
705
+ for (row = 1; row <= rows; row++) {
706
+ html += '<tr>';
707
+ while (minuteCounter < row * minutesPerRow) {
708
+ var m = minutes[minuteCounter];
709
+ var displayText = '';
710
+ if (m !== undefined ) {
711
+ displayText = (m < 10) && showMinutesLeadingZero ? "0" + m.toString() : m.toString();
712
+ }
713
+ html += this._generateHTMLMinuteCell(inst, m, displayText);
714
+ minuteCounter++;
715
+ }
716
+ html += '</tr>';
717
+ }
718
+
719
+ html += '</table>';
720
+
721
+ return html;
722
+ },
723
+
724
+ /* Generate the content of a "Hour" cell */
725
+ _generateHTMLHourCell: function (inst, hour, showPeriod, showLeadingZero) {
726
+
727
+ var displayHour = hour;
728
+ if ((hour > 12) && showPeriod) {
729
+ displayHour = hour - 12;
730
+ }
731
+ if ((displayHour == 0) && showPeriod) {
732
+ displayHour = 12;
733
+ }
734
+ if ((displayHour < 10) && showLeadingZero) {
735
+ displayHour = '0' + displayHour;
736
+ }
737
+
738
+ var html = "";
739
+ var enabled = true;
740
+ var onHourShow = this._get(inst, 'onHourShow'); //custom callback
741
+
742
+ if (hour == undefined) {
743
+ html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
744
+ return html;
745
+ }
746
+
747
+ if (onHourShow) {
748
+ enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
749
+ }
750
+
751
+ if (enabled) {
752
+ html = '<td class="ui-timepicker-hour-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-hour="' + hour.toString() + '">' +
753
+ '<a class="ui-state-default ' +
754
+ (hour == inst.hours ? 'ui-state-active' : '') +
755
+ '">' +
756
+ displayHour.toString() +
757
+ '</a></td>';
758
+ }
759
+ else {
760
+ html =
761
+ '<td>' +
762
+ '<span class="ui-state-default ui-state-disabled ' +
763
+ (hour == inst.hours ? ' ui-state-active ' : ' ') +
764
+ '">' +
765
+ displayHour.toString() +
766
+ '</span>' +
767
+ '</td>';
768
+ }
769
+ return html;
770
+ },
771
+
772
+ /* Generate the content of a "Hour" cell */
773
+ _generateHTMLMinuteCell: function (inst, minute, displayText) {
774
+ var html = "";
775
+ var enabled = true;
776
+ var onMinuteShow = this._get(inst, 'onMinuteShow'); //custom callback
777
+ if (onMinuteShow) {
778
+ //NEW: 2011-02-03 we should give the hour as a parameter as well!
779
+ enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]); //trigger callback
780
+ }
781
+
782
+ if (minute == undefined) {
783
+ html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
784
+ return html;
785
+ }
786
+
787
+ if (enabled) {
788
+ html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
789
+ '<a class="ui-state-default ' +
790
+ (minute == inst.minutes ? 'ui-state-active' : '') +
791
+ '" >' +
792
+ displayText +
793
+ '</a></td>';
794
+ }
795
+ else {
796
+
797
+ html = '<td>' +
798
+ '<span class="ui-state-default ui-state-disabled" >' +
799
+ displayText +
800
+ '</span>' +
801
+ '</td>';
802
+ }
803
+ return html;
804
+ },
805
+
806
+
807
+ /* Enable the date picker to a jQuery selection.
808
+ @param target element - the target input field or division or span */
809
+ _enableTimepicker: function(target) {
810
+ var $target = $(target),
811
+ target_id = $target.attr('id'),
812
+ inst = $.data(target, PROP_NAME);
813
+
814
+ if (!$target.hasClass(this.markerClassName)) {
815
+ return;
816
+ }
817
+ var nodeName = target.nodeName.toLowerCase();
818
+ if (nodeName == 'input') {
819
+ target.disabled = false;
820
+ var button = this._get(inst, 'button');
821
+ $(button).removeClass('ui-state-disabled').disabled = false;
822
+ inst.trigger.filter('button').
823
+ each(function() { this.disabled = false; }).end();
824
+ }
825
+ else if (nodeName == 'div' || nodeName == 'span') {
826
+ var inline = $target.children('.' + this._inlineClass);
827
+ inline.children().removeClass('ui-state-disabled');
828
+ inline.find('button').each(
829
+ function() { this.disabled = false }
830
+ )
831
+ }
832
+ this._disabledInputs = $.map(this._disabledInputs,
833
+ function(value) { return (value == target_id ? null : value); }); // delete entry
834
+ },
835
+
836
+ /* Disable the time picker to a jQuery selection.
837
+ @param target element - the target input field or division or span */
838
+ _disableTimepicker: function(target) {
839
+ var $target = $(target);
840
+ var inst = $.data(target, PROP_NAME);
841
+ if (!$target.hasClass(this.markerClassName)) {
842
+ return;
843
+ }
844
+ var nodeName = target.nodeName.toLowerCase();
845
+ if (nodeName == 'input') {
846
+ var button = this._get(inst, 'button');
847
+
848
+ $(button).addClass('ui-state-disabled').disabled = true;
849
+ target.disabled = true;
850
+
851
+ inst.trigger.filter('button').
852
+ each(function() { this.disabled = true; }).end();
853
+
854
+ }
855
+ else if (nodeName == 'div' || nodeName == 'span') {
856
+ var inline = $target.children('.' + this._inlineClass);
857
+ inline.children().addClass('ui-state-disabled');
858
+ inline.find('button').each(
859
+ function() { this.disabled = true }
860
+ )
861
+
862
+ }
863
+ this._disabledInputs = $.map(this._disabledInputs,
864
+ function(value) { return (value == target ? null : value); }); // delete entry
865
+ this._disabledInputs[this._disabledInputs.length] = $target.attr('id');
866
+ },
867
+
868
+ /* Is the first field in a jQuery collection disabled as a timepicker?
869
+ @param target_id element - the target input field or division or span
870
+ @return boolean - true if disabled, false if enabled */
871
+ _isDisabledTimepicker: function (target_id) {
872
+ if ( ! target_id) { return false; }
873
+ for (var i = 0; i < this._disabledInputs.length; i++) {
874
+ if (this._disabledInputs[i] == target_id) { return true; }
875
+ }
876
+ return false;
877
+ },
878
+
879
+ /* Check positioning to remain on screen. */
880
+ _checkOffset: function (inst, offset, isFixed) {
881
+ var tpWidth = inst.tpDiv.outerWidth();
882
+ var tpHeight = inst.tpDiv.outerHeight();
883
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
884
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
885
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
886
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
887
+
888
+ offset.left -= (this._get(inst, 'isRTL') ? (tpWidth - inputWidth) : 0);
889
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
890
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
891
+
892
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
893
+ offset.left -= Math.min(offset.left, (offset.left + tpWidth > viewWidth && viewWidth > tpWidth) ?
894
+ Math.abs(offset.left + tpWidth - viewWidth) : 0);
895
+ offset.top -= Math.min(offset.top, (offset.top + tpHeight > viewHeight && viewHeight > tpHeight) ?
896
+ Math.abs(tpHeight + inputHeight) : 0);
897
+
898
+ return offset;
899
+ },
900
+
901
+ /* Find an object's position on the screen. */
902
+ _findPos: function (obj) {
903
+ var inst = this._getInst(obj);
904
+ var isRTL = this._get(inst, 'isRTL');
905
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
906
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
907
+ }
908
+ var position = $(obj).offset();
909
+ return [position.left, position.top];
910
+ },
911
+
912
+ /* Retrieve the size of left and top borders for an element.
913
+ @param elem (jQuery object) the element of interest
914
+ @return (number[2]) the left and top borders */
915
+ _getBorders: function (elem) {
916
+ var convert = function (value) {
917
+ return { thin: 1, medium: 2, thick: 3}[value] || value;
918
+ };
919
+ return [parseFloat(convert(elem.css('border-left-width'))),
920
+ parseFloat(convert(elem.css('border-top-width')))];
921
+ },
922
+
923
+
924
+ /* Close time picker if clicked elsewhere. */
925
+ _checkExternalClick: function (event) {
926
+ if (!$.timepicker._curInst) { return; }
927
+ var $target = $(event.target);
928
+ if ($target[0].id != $.timepicker._mainDivId &&
929
+ $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
930
+ !$target.hasClass($.timepicker.markerClassName) &&
931
+ !$target.hasClass($.timepicker._triggerClass) &&
932
+ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
933
+ $.timepicker._hideTimepicker();
934
+ },
935
+
936
+ /* Hide the time picker from view.
937
+ @param input element - the input field attached to the time picker */
938
+ _hideTimepicker: function (input) {
939
+ var inst = this._curInst;
940
+ if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
941
+ if (this._timepickerShowing) {
942
+ var showAnim = this._get(inst, 'showAnim');
943
+ var duration = this._get(inst, 'duration');
944
+ var postProcess = function () {
945
+ $.timepicker._tidyDialog(inst);
946
+ this._curInst = null;
947
+ };
948
+ if ($.effects && $.effects[showAnim]) {
949
+ inst.tpDiv.hide(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
950
+ }
951
+ else {
952
+ inst.tpDiv[(showAnim == 'slideDown' ? 'slideUp' :
953
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
954
+ }
955
+ if (!showAnim) { postProcess(); }
956
+ var onClose = this._get(inst, 'onClose');
957
+ if (onClose) {
958
+ onClose.apply(
959
+ (inst.input ? inst.input[0] : null),
960
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
961
+ }
962
+ this._timepickerShowing = false;
963
+ this._lastInput = null;
964
+ if (this._inDialog) {
965
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
966
+ if ($.blockUI) {
967
+ $.unblockUI();
968
+ $('body').append(this.tpDiv);
969
+ }
970
+ }
971
+ this._inDialog = false;
972
+ }
973
+ },
974
+
975
+
976
+
977
+ /* Tidy up after a dialog display. */
978
+ _tidyDialog: function (inst) {
979
+ inst.tpDiv.removeClass(this._dialogClass).unbind('.ui-timepicker');
980
+ },
981
+
982
+ /* Retrieve the instance data for the target control.
983
+ @param target element - the target input field or division or span
984
+ @return object - the associated instance data
985
+ @throws error if a jQuery problem getting data */
986
+ _getInst: function (target) {
987
+ try {
988
+ return $.data(target, PROP_NAME);
989
+ }
990
+ catch (err) {
991
+ throw 'Missing instance data for this timepicker';
992
+ }
993
+ },
994
+
995
+ /* Get a setting value, defaulting if necessary. */
996
+ _get: function (inst, name) {
997
+ return inst.settings[name] !== undefined ?
998
+ inst.settings[name] : this._defaults[name];
999
+ },
1000
+
1001
+ /* Parse existing time and initialise time picker. */
1002
+ _setTimeFromField: function (inst) {
1003
+ if (inst.input.val() == inst.lastVal) { return; }
1004
+ var defaultTime = this._get(inst, 'defaultTime');
1005
+
1006
+ var timeToParse = defaultTime == 'now' ? this._getCurrentTimeRounded(inst) : defaultTime;
1007
+ if ((inst.inline == false) && (inst.input.val() != '')) { timeToParse = inst.input.val() }
1008
+
1009
+ if (timeToParse instanceof Date) {
1010
+ inst.hours = timeToParse.getHours();
1011
+ inst.minutes = timeToParse.getMinutes();
1012
+ } else {
1013
+ var timeVal = inst.lastVal = timeToParse;
1014
+ if (timeToParse == '') {
1015
+ inst.hours = -1;
1016
+ inst.minutes = -1;
1017
+ } else {
1018
+ var time = this.parseTime(inst, timeVal);
1019
+ inst.hours = time.hours;
1020
+ inst.minutes = time.minutes;
1021
+ }
1022
+ }
1023
+
1024
+
1025
+ $.timepicker._updateTimepicker(inst);
1026
+ },
1027
+
1028
+ /* Update or retrieve the settings for an existing time picker.
1029
+ @param target element - the target input field or division or span
1030
+ @param name object - the new settings to update or
1031
+ string - the name of the setting to change or retrieve,
1032
+ when retrieving also 'all' for all instance settings or
1033
+ 'defaults' for all global defaults
1034
+ @param value any - the new value for the setting
1035
+ (omit if above is an object or to retrieve a value) */
1036
+ _optionTimepicker: function(target, name, value) {
1037
+ var inst = this._getInst(target);
1038
+ if (arguments.length == 2 && typeof name == 'string') {
1039
+ return (name == 'defaults' ? $.extend({}, $.timepicker._defaults) :
1040
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
1041
+ this._get(inst, name)) : null));
1042
+ }
1043
+ var settings = name || {};
1044
+ if (typeof name == 'string') {
1045
+ settings = {};
1046
+ settings[name] = value;
1047
+ }
1048
+ if (inst) {
1049
+ if (this._curInst == inst) {
1050
+ this._hideTimepicker();
1051
+ }
1052
+ extendRemove(inst.settings, settings);
1053
+ this._updateTimepicker(inst);
1054
+ }
1055
+ },
1056
+
1057
+
1058
+ /* Set the time for a jQuery selection.
1059
+ @param target element - the target input field or division or span
1060
+ @param time String - the new time */
1061
+ _setTimeTimepicker: function(target, time) {
1062
+ var inst = this._getInst(target);
1063
+ if (inst) {
1064
+ this._setTime(inst, time);
1065
+ this._updateTimepicker(inst);
1066
+ this._updateAlternate(inst, time);
1067
+ }
1068
+ },
1069
+
1070
+ /* Set the time directly. */
1071
+ _setTime: function(inst, time, noChange) {
1072
+ var origHours = inst.hours;
1073
+ var origMinutes = inst.minutes;
1074
+ var time = this.parseTime(inst, time);
1075
+ inst.hours = time.hours;
1076
+ inst.minutes = time.minutes;
1077
+
1078
+ if ((origHours != inst.hours || origMinutes != inst.minuts) && !noChange) {
1079
+ inst.input.trigger('change');
1080
+ }
1081
+ this._updateTimepicker(inst);
1082
+ this._updateSelectedValue(inst);
1083
+ },
1084
+
1085
+ /* Return the current time, ready to be parsed, rounded to the closest 5 minute */
1086
+ _getCurrentTimeRounded: function (inst) {
1087
+ var currentTime = new Date(),
1088
+ currentMinutes = currentTime.getMinutes(),
1089
+ // round to closest 5
1090
+ adjustedMinutes = Math.round( currentMinutes / 5 ) * 5;
1091
+ currentTime.setMinutes(adjustedMinutes);
1092
+ return currentTime;
1093
+ },
1094
+
1095
+ /*
1096
+ * Parse a time string into hours and minutes
1097
+ */
1098
+ parseTime: function (inst, timeVal) {
1099
+ var retVal = new Object();
1100
+ retVal.hours = -1;
1101
+ retVal.minutes = -1;
1102
+
1103
+ var timeSeparator = this._get(inst, 'timeSeparator'),
1104
+ amPmText = this._get(inst, 'amPmText'),
1105
+ showHours = this._get(inst, 'showHours'),
1106
+ showMinutes = this._get(inst, 'showMinutes'),
1107
+ optionalMinutes = this._get(inst, 'optionalMinutes'),
1108
+ showPeriod = (this._get(inst, 'showPeriod') == true),
1109
+ p = timeVal.indexOf(timeSeparator);
1110
+
1111
+ // check if time separator found
1112
+ if (p != -1) {
1113
+ retVal.hours = parseInt(timeVal.substr(0, p), 10);
1114
+ retVal.minutes = parseInt(timeVal.substr(p + 1), 10);
1115
+ }
1116
+ // check for hours only
1117
+ else if ( (showHours) && ( !showMinutes || optionalMinutes ) ) {
1118
+ retVal.hours = parseInt(timeVal, 10);
1119
+ }
1120
+ // check for minutes only
1121
+ else if ( ( ! showHours) && (showMinutes) ) {
1122
+ retVal.minutes = parseInt(timeVal, 10);
1123
+ }
1124
+
1125
+ if (showHours) {
1126
+ var timeValUpper = timeVal.toUpperCase();
1127
+ if ((retVal.hours < 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[1].toUpperCase()) != -1)) {
1128
+ retVal.hours += 12;
1129
+ }
1130
+ // fix for 12 AM
1131
+ if ((retVal.hours == 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[0].toUpperCase()) != -1)) {
1132
+ retVal.hours = 0;
1133
+ }
1134
+ }
1135
+
1136
+ return retVal;
1137
+ },
1138
+
1139
+ selectNow: function(e) {
1140
+
1141
+ var id = $(e.target).attr("data-timepicker-instance-id"),
1142
+ $target = $(id),
1143
+ inst = this._getInst($target[0]);
1144
+
1145
+ //if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
1146
+ var currentTime = new Date();
1147
+ inst.hours = currentTime.getHours();
1148
+ inst.minutes = currentTime.getMinutes();
1149
+ this._updateSelectedValue(inst);
1150
+ this._updateTimepicker(inst);
1151
+ this._hideTimepicker();
1152
+ },
1153
+
1154
+ deselectTime: function(e) {
1155
+ var id = $(e.target).attr("data-timepicker-instance-id"),
1156
+ $target = $(id),
1157
+ inst = this._getInst($target[0]);
1158
+ inst.hours = -1;
1159
+ inst.minutes = -1;
1160
+ this._updateSelectedValue(inst);
1161
+ this._hideTimepicker();
1162
+ },
1163
+
1164
+
1165
+ selectHours: function (event) {
1166
+ var $td = $(event.currentTarget),
1167
+ id = $td.attr("data-timepicker-instance-id"),
1168
+ newHours = parseInt($td.attr("data-hour")),
1169
+ fromDoubleClick = event.data.fromDoubleClick,
1170
+ $target = $(id),
1171
+ inst = this._getInst($target[0]),
1172
+ showMinutes = (this._get(inst, 'showMinutes') == true);
1173
+
1174
+ // don't select if disabled
1175
+ if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
1176
+
1177
+ $td.parents('.ui-timepicker-hours:first').find('a').removeClass('ui-state-active');
1178
+ $td.children('a').addClass('ui-state-active');
1179
+ inst.hours = newHours;
1180
+
1181
+ // added for onMinuteShow callback
1182
+ var onMinuteShow = this._get(inst, 'onMinuteShow');
1183
+ if (onMinuteShow) {
1184
+ // this will trigger a callback on selected hour to make sure selected minute is allowed.
1185
+ this._updateMinuteDisplay(inst);
1186
+ }
1187
+
1188
+ this._updateSelectedValue(inst);
1189
+
1190
+ inst._hoursClicked = true;
1191
+ if ((inst._minutesClicked) || (fromDoubleClick) || (showMinutes == false)) {
1192
+ $.timepicker._hideTimepicker();
1193
+ }
1194
+ // return false because if used inline, prevent the url to change to a hashtag
1195
+ return false;
1196
+ },
1197
+
1198
+ selectMinutes: function (event) {
1199
+ var $td = $(event.currentTarget),
1200
+ id = $td.attr("data-timepicker-instance-id"),
1201
+ newMinutes = parseInt($td.attr("data-minute")),
1202
+ fromDoubleClick = event.data.fromDoubleClick,
1203
+ $target = $(id),
1204
+ inst = this._getInst($target[0]),
1205
+ showHours = (this._get(inst, 'showHours') == true);
1206
+
1207
+ // don't select if disabled
1208
+ if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
1209
+
1210
+ $td.parents('.ui-timepicker-minutes:first').find('a').removeClass('ui-state-active');
1211
+ $td.children('a').addClass('ui-state-active');
1212
+
1213
+ inst.minutes = newMinutes;
1214
+ this._updateSelectedValue(inst);
1215
+
1216
+ inst._minutesClicked = true;
1217
+ if ((inst._hoursClicked) || (fromDoubleClick) || (showHours == false)) {
1218
+ $.timepicker._hideTimepicker();
1219
+ // return false because if used inline, prevent the url to change to a hashtag
1220
+ return false;
1221
+ }
1222
+
1223
+ // return false because if used inline, prevent the url to change to a hashtag
1224
+ return false;
1225
+ },
1226
+
1227
+ _updateSelectedValue: function (inst) {
1228
+ var newTime = this._getParsedTime(inst);
1229
+ if (inst.input) {
1230
+ inst.input.val(newTime);
1231
+ inst.input.trigger('change');
1232
+ }
1233
+ var onSelect = this._get(inst, 'onSelect');
1234
+ if (onSelect) { onSelect.apply((inst.input ? inst.input[0] : null), [newTime, inst]); } // trigger custom callback
1235
+ this._updateAlternate(inst, newTime);
1236
+ return newTime;
1237
+ },
1238
+
1239
+ /* this function process selected time and return it parsed according to instance options */
1240
+ _getParsedTime: function(inst) {
1241
+
1242
+ if (inst.hours == -1 && inst.minutes == -1) {
1243
+ return '';
1244
+ }
1245
+
1246
+ if ((inst.hours < 0) || (inst.hours > 23)) { inst.hours = 12; }
1247
+ if ((inst.minutes < 0) || (inst.minutes > 59)) { inst.minutes = 0; }
1248
+
1249
+ var period = "",
1250
+ showPeriod = (this._get(inst, 'showPeriod') == true),
1251
+ showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
1252
+ showHours = (this._get(inst, 'showHours') == true),
1253
+ showMinutes = (this._get(inst, 'showMinutes') == true),
1254
+ optionalMinutes = (this._get(inst, 'optionalMinutes') == true),
1255
+ amPmText = this._get(inst, 'amPmText'),
1256
+ selectedHours = inst.hours ? inst.hours : 0,
1257
+ selectedMinutes = inst.minutes ? inst.minutes : 0,
1258
+ displayHours = selectedHours ? selectedHours : 0,
1259
+ parsedTime = '';
1260
+
1261
+ if (showPeriod) {
1262
+ if (inst.hours == 0) {
1263
+ displayHours = 12;
1264
+ }
1265
+ if (inst.hours < 12) {
1266
+ period = amPmText[0];
1267
+ }
1268
+ else {
1269
+ period = amPmText[1];
1270
+ if (displayHours > 12) {
1271
+ displayHours -= 12;
1272
+ }
1273
+ }
1274
+ }
1275
+
1276
+ var h = displayHours.toString();
1277
+ if (showLeadingZero && (displayHours < 10)) { h = '0' + h; }
1278
+
1279
+ var m = selectedMinutes.toString();
1280
+ if (selectedMinutes < 10) { m = '0' + m; }
1281
+
1282
+ if (showHours) {
1283
+ parsedTime += h;
1284
+ }
1285
+ if (showHours && showMinutes && (!optionalMinutes || m != 0)) {
1286
+ parsedTime += this._get(inst, 'timeSeparator');
1287
+ }
1288
+ if (showMinutes && (!optionalMinutes || m != 0)) {
1289
+ parsedTime += m;
1290
+ }
1291
+ if (showHours) {
1292
+ if (period.length > 0) { parsedTime += this._get(inst, 'periodSeparator') + period; }
1293
+ }
1294
+
1295
+ return parsedTime;
1296
+ },
1297
+
1298
+ /* Update any alternate field to synchronise with the main field. */
1299
+ _updateAlternate: function(inst, newTime) {
1300
+ var altField = this._get(inst, 'altField');
1301
+ if (altField) { // update alternate field too
1302
+ $(altField).each(function(i,e) {
1303
+ $(e).val(newTime);
1304
+ });
1305
+ }
1306
+ },
1307
+
1308
+ /* This might look unused but it's called by the $.fn.timepicker function with param getTime */
1309
+ /* added v 0.2.3 - gitHub issue #5 - Thanks edanuff */
1310
+ _getTimeTimepicker : function(input) {
1311
+ var inst = this._getInst(input);
1312
+ return this._getParsedTime(inst);
1313
+ },
1314
+ _getHourTimepicker: function(input) {
1315
+ var inst = this._getInst(input);
1316
+ if ( inst == undefined) { return -1; }
1317
+ return inst.hours;
1318
+ },
1319
+ _getMinuteTimepicker: function(input) {
1320
+ var inst= this._getInst(input);
1321
+ if ( inst == undefined) { return -1; }
1322
+ return inst.minutes;
1323
+ }
1324
+
1325
+ });
1326
+
1327
+
1328
+
1329
+ /* Invoke the timepicker functionality.
1330
+ @param options string - a command, optionally followed by additional parameters or
1331
+ Object - settings for attaching new timepicker functionality
1332
+ @return jQuery object */
1333
+ $.fn.timepicker = function (options) {
1334
+
1335
+ /* Initialise the time picker. */
1336
+ if (!$.timepicker.initialized) {
1337
+ $(document).mousedown($.timepicker._checkExternalClick).
1338
+ find('body').append($.timepicker.tpDiv);
1339
+ $.timepicker.initialized = true;
1340
+ }
1341
+
1342
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
1343
+ if (typeof options == 'string' && (options == 'getTime' || options == 'getHour' || options == 'getMinute' ))
1344
+ return $.timepicker['_' + options + 'Timepicker'].
1345
+ apply($.timepicker, [this[0]].concat(otherArgs));
1346
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
1347
+ return $.timepicker['_' + options + 'Timepicker'].
1348
+ apply($.timepicker, [this[0]].concat(otherArgs));
1349
+ return this.each(function () {
1350
+ typeof options == 'string' ?
1351
+ $.timepicker['_' + options + 'Timepicker'].
1352
+ apply($.timepicker, [this].concat(otherArgs)) :
1353
+ $.timepicker._attachTimepicker(this, options);
1354
+ });
1355
+ };
1356
+
1357
+ /* jQuery extend now ignores nulls! */
1358
+ function extendRemove(target, props) {
1359
+ $.extend(target, props);
1360
+ for (var name in props)
1361
+ if (props[name] == null || props[name] == undefined)
1362
+ target[name] = props[name];
1363
+ return target;
1364
+ };
1365
+
1366
+ $.timepicker = new Timepicker(); // singleton instance
1367
+ $.timepicker.initialized = false;
1368
+ $.timepicker.uuid = new Date().getTime();
1369
+ $.timepicker.version = "0.2.9";
1370
+
1371
+ // Workaround for #4055
1372
+ // Add another global to avoid noConflict issues with inline event handlers
1373
+ window['TP_jQuery_' + tpuuid] = $;
1374
+
1375
+ })(jQuery);
1376
+ :@created_atf1335716315.682457�`