fae-railsz 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +5 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/fonts/fae/icons.eot +0 -0
  5. data/app/assets/fonts/fae/icons.svg +56 -0
  6. data/app/assets/fonts/fae/icons.ttf +0 -0
  7. data/app/assets/fonts/fae/icons.woff +0 -0
  8. data/app/assets/fonts/fae/lato-bold-webfont.eot +0 -0
  9. data/app/assets/fonts/fae/lato-bold-webfont.svg +4551 -0
  10. data/app/assets/fonts/fae/lato-bold-webfont.ttf +0 -0
  11. data/app/assets/fonts/fae/lato-bold-webfont.woff +0 -0
  12. data/app/assets/fonts/fae/lato-light-webfont.eot +0 -0
  13. data/app/assets/fonts/fae/lato-light-webfont.svg +4241 -0
  14. data/app/assets/fonts/fae/lato-light-webfont.ttf +0 -0
  15. data/app/assets/fonts/fae/lato-light-webfont.woff +0 -0
  16. data/app/assets/fonts/fae/lato-regular-webfont.eot +0 -0
  17. data/app/assets/fonts/fae/lato-regular-webfont.svg +4241 -0
  18. data/app/assets/fonts/fae/lato-regular-webfont.ttf +0 -0
  19. data/app/assets/fonts/fae/lato-regular-webfont.woff +0 -0
  20. data/app/assets/fonts/fae/selection.json +1334 -0
  21. data/app/assets/images/fae/error_bg.jpg +0 -0
  22. data/app/assets/images/fae/error_sad_face.png +0 -0
  23. data/app/assets/images/fae/icons/alert.svg +9 -0
  24. data/app/assets/images/fae/icons/arrow_down.svg +8 -0
  25. data/app/assets/images/fae/icons/arrow_left.svg +9 -0
  26. data/app/assets/images/fae/icons/arrow_right.svg +9 -0
  27. data/app/assets/images/fae/icons/arrow_stacked.svg +8 -0
  28. data/app/assets/images/fae/icons/arrow_up.svg +8 -0
  29. data/app/assets/images/fae/icons/calendar.svg +17 -0
  30. data/app/assets/images/fae/icons/check.svg +7 -0
  31. data/app/assets/images/fae/icons/checkmark.svg +8 -0
  32. data/app/assets/images/fae/icons/chevron_down.svg +7 -0
  33. data/app/assets/images/fae/icons/chevron_left.svg +10 -0
  34. data/app/assets/images/fae/icons/chevron_right.svg +10 -0
  35. data/app/assets/images/fae/icons/chevron_up.svg +7 -0
  36. data/app/assets/images/fae/icons/delete.svg +8 -0
  37. data/app/assets/images/fae/icons/delete_x.svg +8 -0
  38. data/app/assets/images/fae/icons/edit.svg +11 -0
  39. data/app/assets/images/fae/icons/handle.svg +13 -0
  40. data/app/assets/images/fae/icons/home.svg +10 -0
  41. data/app/assets/images/fae/icons/logout.svg +12 -0
  42. data/app/assets/images/fae/icons/magnifying_glass.svg +10 -0
  43. data/app/assets/images/fae/icons/menu.svg +11 -0
  44. data/app/assets/images/fae/icons/offlink.svg +25 -0
  45. data/app/assets/images/fae/icons/plus.svg +8 -0
  46. data/app/assets/images/fae/icons/pulldown.svg +11 -0
  47. data/app/assets/images/fae/icons/search.svg +11 -0
  48. data/app/assets/images/fae/icons/settings.svg +12 -0
  49. data/app/assets/images/fae/icons/sort.svg +11 -0
  50. data/app/assets/images/fae/icons/support.svg +15 -0
  51. data/app/assets/images/fae/icons/trash.svg +10 -0
  52. data/app/assets/images/fae/icons/trumbowyg.svg +1 -0
  53. data/app/assets/images/fae/icons/user.svg +13 -0
  54. data/app/assets/images/fae/icons/users.svg +19 -0
  55. data/app/assets/images/fae/icons/zoom.svg +12 -0
  56. data/app/assets/images/fae/tutorial_model_location.png +0 -0
  57. data/app/assets/images/fae/youtube_helper.jpg +0 -0
  58. data/app/assets/javascripts/fae/_modals.js +60 -0
  59. data/app/assets/javascripts/fae/_tables.js +403 -0
  60. data/app/assets/javascripts/fae/admin.js.erb +11 -0
  61. data/app/assets/javascripts/fae/application.js +63 -0
  62. data/app/assets/javascripts/fae/fae_init.js +8 -0
  63. data/app/assets/javascripts/fae/form/_ajax.js +380 -0
  64. data/app/assets/javascripts/fae/form/_cancel.js +38 -0
  65. data/app/assets/javascripts/fae/form/_filtering.js +276 -0
  66. data/app/assets/javascripts/fae/form/_form.js +60 -0
  67. data/app/assets/javascripts/fae/form/_slugger.js.erb +100 -0
  68. data/app/assets/javascripts/fae/form/_validator.js +459 -0
  69. data/app/assets/javascripts/fae/form/fae_chosen.js +44 -0
  70. data/app/assets/javascripts/fae/form/fileinputer.js +178 -0
  71. data/app/assets/javascripts/fae/form/hinter.js +111 -0
  72. data/app/assets/javascripts/fae/form/inputs/_checkbox.js +27 -0
  73. data/app/assets/javascripts/fae/form/inputs/_color.js +42 -0
  74. data/app/assets/javascripts/fae/form/inputs/_dates.js +78 -0
  75. data/app/assets/javascripts/fae/form/inputs/_select.js +162 -0
  76. data/app/assets/javascripts/fae/form/inputs/_text.js +118 -0
  77. data/app/assets/javascripts/fae/navigation/_global_search.js +184 -0
  78. data/app/assets/javascripts/fae/navigation/_language.js +89 -0
  79. data/app/assets/javascripts/fae/navigation/_navigation.js +206 -0
  80. data/app/assets/javascripts/fae/navigation/_subnav_highlighter.js +81 -0
  81. data/app/assets/javascripts/fae/navigation/sticky.js +186 -0
  82. data/app/assets/javascripts/fae/vendor/chosen.jquery.min.js +2 -0
  83. data/app/assets/javascripts/fae/vendor/frob_core_helpers.js +587 -0
  84. data/app/assets/javascripts/fae/vendor/fryr.js +437 -0
  85. data/app/assets/javascripts/fae/vendor/jqColorPicker.min.js +4 -0
  86. data/app/assets/javascripts/fae/vendor/jquery.daterangepicker.js +1292 -0
  87. data/app/assets/javascripts/fae/vendor/jquery.multi-select.js +534 -0
  88. data/app/assets/javascripts/fae/vendor/jquery.simplemodal.1.4.4.js +719 -0
  89. data/app/assets/javascripts/fae/vendor/jquery.tablesorter.js +1901 -0
  90. data/app/assets/javascripts/fae/vendor/js.cookie.js +139 -0
  91. data/app/assets/javascripts/fae/vendor/moment.min.js +7 -0
  92. data/app/assets/javascripts/fae/vendor/simplemde.min.js +13 -0
  93. data/app/assets/javascripts/fae/vendor/touch_punch.js +11 -0
  94. data/app/assets/javascripts/fae/vendor/trumbowyg.js.erb +4 -0
  95. data/app/assets/javascripts/fae/vendor/trumbowyg/plugins/upload/trumbowyg.upload.js +223 -0
  96. data/app/assets/javascripts/fae/vendor/trumbowyg/trumbowyg.js +1603 -0
  97. data/app/assets/stylesheets/fae/application.css +8 -0
  98. data/app/assets/stylesheets/fae/base.scss +82 -0
  99. data/app/assets/stylesheets/fae/globals/_fonts.scss +43 -0
  100. data/app/assets/stylesheets/fae/globals/_icons.scss +15 -0
  101. data/app/assets/stylesheets/fae/globals/_plugins.scss +51 -0
  102. data/app/assets/stylesheets/fae/globals/_tags.scss +68 -0
  103. data/app/assets/stylesheets/fae/globals/imports/_extends.scss +53 -0
  104. data/app/assets/stylesheets/fae/globals/imports/_mixins.scss +58 -0
  105. data/app/assets/stylesheets/fae/globals/imports/_variables.scss +165 -0
  106. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine.scss +7 -0
  107. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine_functions.scss +88 -0
  108. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine_mixins.scss +280 -0
  109. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine_variables.scss +30 -0
  110. data/app/assets/stylesheets/fae/globals/layout/_base.scss +48 -0
  111. data/app/assets/stylesheets/fae/globals/layout/_breadcrumbs.scss +45 -0
  112. data/app/assets/stylesheets/fae/globals/layout/_content-header.scss +99 -0
  113. data/app/assets/stylesheets/fae/globals/legacy/_pre-1.3.scss +659 -0
  114. data/app/assets/stylesheets/fae/globals/navigation/_base.scss +22 -0
  115. data/app/assets/stylesheets/fae/globals/navigation/_footer.scss +50 -0
  116. data/app/assets/stylesheets/fae/globals/navigation/_header.scss +149 -0
  117. data/app/assets/stylesheets/fae/globals/navigation/_mobilenav.scss +149 -0
  118. data/app/assets/stylesheets/fae/globals/navigation/_search.scss +76 -0
  119. data/app/assets/stylesheets/fae/globals/navigation/_sidenav.scss +142 -0
  120. data/app/assets/stylesheets/fae/globals/navigation/_utility.scss +95 -0
  121. data/app/assets/stylesheets/fae/modules/_alerts.scss +50 -0
  122. data/app/assets/stylesheets/fae/modules/_buttons.scss +62 -0
  123. data/app/assets/stylesheets/fae/modules/_modal.scss +78 -0
  124. data/app/assets/stylesheets/fae/modules/_toggles.scss +48 -0
  125. data/app/assets/stylesheets/fae/modules/forms/_asset-actions.scss +83 -0
  126. data/app/assets/stylesheets/fae/modules/forms/_base.scss +100 -0
  127. data/app/assets/stylesheets/fae/modules/forms/_checkbox.scss +87 -0
  128. data/app/assets/stylesheets/fae/modules/forms/_colorpicker.scss +57 -0
  129. data/app/assets/stylesheets/fae/modules/forms/_date.scss +335 -0
  130. data/app/assets/stylesheets/fae/modules/forms/_hints.scss +40 -0
  131. data/app/assets/stylesheets/fae/modules/forms/_label.scss +57 -0
  132. data/app/assets/stylesheets/fae/modules/forms/_radio.scss +69 -0
  133. data/app/assets/stylesheets/fae/modules/forms/_select.scss +317 -0
  134. data/app/assets/stylesheets/fae/modules/forms/_simple-mde.scss +29 -0
  135. data/app/assets/stylesheets/fae/modules/forms/_text.scss +62 -0
  136. data/app/assets/stylesheets/fae/modules/forms/_textarea.scss +16 -0
  137. data/app/assets/stylesheets/fae/modules/forms/_validation.scss +63 -0
  138. data/app/assets/stylesheets/fae/modules/tables/_actions.scss +41 -0
  139. data/app/assets/stylesheets/fae/modules/tables/_base.scss +63 -0
  140. data/app/assets/stylesheets/fae/modules/tables/_collapsible.scss +76 -0
  141. data/app/assets/stylesheets/fae/modules/tables/_filters.scss +61 -0
  142. data/app/assets/stylesheets/fae/modules/tables/_image.scss +21 -0
  143. data/app/assets/stylesheets/fae/modules/tables/_pagination.scss +34 -0
  144. data/app/assets/stylesheets/fae/modules/tables/_sorting.scss +58 -0
  145. data/app/assets/stylesheets/fae/modules/tables/_sticky.scss +9 -0
  146. data/app/assets/stylesheets/fae/modules/tables/_tooltips.scss +24 -0
  147. data/app/assets/stylesheets/fae/pages/_error.scss +35 -0
  148. data/app/assets/stylesheets/fae/pages/_help.scss +28 -0
  149. data/app/assets/stylesheets/fae/pages/_home.scss +18 -0
  150. data/app/assets/stylesheets/fae/pages/_login.scss +137 -0
  151. data/app/assets/stylesheets/fae/vendor/chosen.css +377 -0
  152. data/app/assets/stylesheets/fae/vendor/daterangepicker.css +227 -0
  153. data/app/assets/stylesheets/fae/vendor/reset.css +48 -0
  154. data/app/assets/stylesheets/fae/vendor/simplemde.min.css +7 -0
  155. data/app/assets/stylesheets/fae/vendor/trumbowyg.css +584 -0
  156. data/app/controllers/concerns/fae/application_controller_concern.rb +1 -0
  157. data/app/controllers/concerns/fae/asset_cloner.rb +46 -0
  158. data/app/controllers/concerns/fae/cloneable.rb +136 -0
  159. data/app/controllers/fae/application_controller.rb +123 -0
  160. data/app/controllers/fae/base_controller.rb +117 -0
  161. data/app/controllers/fae/files_controller.rb +26 -0
  162. data/app/controllers/fae/images_controller.rb +37 -0
  163. data/app/controllers/fae/nested_base_controller.rb +100 -0
  164. data/app/controllers/fae/options_controller.rb +29 -0
  165. data/app/controllers/fae/pages_controller.rb +44 -0
  166. data/app/controllers/fae/setup_controller.rb +54 -0
  167. data/app/controllers/fae/static_pages_controller.rb +54 -0
  168. data/app/controllers/fae/users_controller.rb +71 -0
  169. data/app/controllers/fae/utilities_controller.rb +61 -0
  170. data/app/helpers/fae/application_helper.rb +114 -0
  171. data/app/helpers/fae/fae_helper.rb +6 -0
  172. data/app/helpers/fae/form_helper.rb +240 -0
  173. data/app/helpers/fae/nested_form_helper.rb +39 -0
  174. data/app/helpers/fae/view_helper.rb +175 -0
  175. data/app/inputs/date_range_input.rb +17 -0
  176. data/app/inputs/radio_collection_input.rb +17 -0
  177. data/app/inputs/symbol_input.rb +5 -0
  178. data/app/models/concerns/fae/assets_validatable.rb +12 -0
  179. data/app/models/concerns/fae/authorization_concern.rb +12 -0
  180. data/app/models/concerns/fae/base_model_concern.rb +105 -0
  181. data/app/models/concerns/fae/change_concern.rb +1 -0
  182. data/app/models/concerns/fae/file_concern.rb +1 -0
  183. data/app/models/concerns/fae/image_concern.rb +1 -0
  184. data/app/models/concerns/fae/navigation_concern.rb +10 -0
  185. data/app/models/concerns/fae/option_concern.rb +1 -0
  186. data/app/models/concerns/fae/page_validatable.rb +26 -0
  187. data/app/models/concerns/fae/paper_trailer.rb +8 -0
  188. data/app/models/concerns/fae/role_concern.rb +1 -0
  189. data/app/models/concerns/fae/sortable.rb +51 -0
  190. data/app/models/concerns/fae/static_page_concern.rb +1 -0
  191. data/app/models/concerns/fae/text_area_concern.rb +1 -0
  192. data/app/models/concerns/fae/text_field_concern.rb +1 -0
  193. data/app/models/concerns/fae/trackable.rb +124 -0
  194. data/app/models/concerns/fae/user_concern.rb +7 -0
  195. data/app/models/fae/authorization.rb +8 -0
  196. data/app/models/fae/change.rb +53 -0
  197. data/app/models/fae/file.rb +24 -0
  198. data/app/models/fae/image.rb +33 -0
  199. data/app/models/fae/navigation.rb +132 -0
  200. data/app/models/fae/option.rb +38 -0
  201. data/app/models/fae/role.rb +18 -0
  202. data/app/models/fae/static_page.rb +109 -0
  203. data/app/models/fae/text_area.rb +14 -0
  204. data/app/models/fae/text_field.rb +14 -0
  205. data/app/models/fae/user.rb +67 -0
  206. data/app/uploaders/fae/file_uploader.rb +26 -0
  207. data/app/uploaders/fae/image_uploader.rb +28 -0
  208. data/app/validators/fae/cross_model_uniqueness_validator.rb +14 -0
  209. data/app/views/devise/confirmations/new.html.slim +13 -0
  210. data/app/views/devise/mailer/confirmation_instructions.html.slim +3 -0
  211. data/app/views/devise/mailer/reset_password_instructions.html.slim +5 -0
  212. data/app/views/devise/mailer/unlock_instructions.html.slim +4 -0
  213. data/app/views/devise/passwords/edit.html.slim +10 -0
  214. data/app/views/devise/passwords/new.html.slim +10 -0
  215. data/app/views/devise/registrations/edit.html.slim +22 -0
  216. data/app/views/devise/registrations/new.html.slim +15 -0
  217. data/app/views/devise/sessions/new.html.slim +7 -0
  218. data/app/views/devise/shared/_links.slim +25 -0
  219. data/app/views/devise/unlocks/new.html.slim +13 -0
  220. data/app/views/fae/application/_breadcrumb.html.slim +19 -0
  221. data/app/views/fae/application/_content_form.html.slim +55 -0
  222. data/app/views/fae/application/_credit.slim +6 -0
  223. data/app/views/fae/application/_file_uploader.html.slim +36 -0
  224. data/app/views/fae/application/_flash_messages.slim +2 -0
  225. data/app/views/fae/application/_global_search_results.html.slim +37 -0
  226. data/app/views/fae/application/_header.slim +50 -0
  227. data/app/views/fae/application/_markdown_helper.slim +41 -0
  228. data/app/views/fae/application/_mobilenav.slim +66 -0
  229. data/app/views/fae/application/_sidenav.slim +23 -0
  230. data/app/views/fae/application/_user_log.html.slim +36 -0
  231. data/app/views/fae/images/_image_uploader.html.slim +66 -0
  232. data/app/views/fae/options/_form.html.slim +16 -0
  233. data/app/views/fae/options/edit.html.slim +1 -0
  234. data/app/views/fae/pages/activity_log.html.slim +32 -0
  235. data/app/views/fae/pages/disabled_environment.html.slim +4 -0
  236. data/app/views/fae/pages/error404.html.slim +7 -0
  237. data/app/views/fae/pages/help.html.slim +35 -0
  238. data/app/views/fae/pages/home.html.slim +36 -0
  239. data/app/views/fae/setup/first_user.html.slim +11 -0
  240. data/app/views/fae/shared/_errors.slim +4 -0
  241. data/app/views/fae/shared/_form_header.html.slim +40 -0
  242. data/app/views/fae/shared/_index_header.html.slim +26 -0
  243. data/app/views/fae/shared/_nested_table.html.slim +49 -0
  244. data/app/views/fae/shared/_recent_changes.html.slim +22 -0
  245. data/app/views/fae/shared/_shared_nested_table.html.slim +46 -0
  246. data/app/views/fae/static_pages/index.html.slim +13 -0
  247. data/app/views/fae/users/_form.html.slim +19 -0
  248. data/app/views/fae/users/edit.html.slim +1 -0
  249. data/app/views/fae/users/index.html.slim +23 -0
  250. data/app/views/fae/users/new.html.slim +1 -0
  251. data/app/views/fae/users/settings.html.slim +1 -0
  252. data/app/views/kaminari/fae/_gap.html.slim +8 -0
  253. data/app/views/kaminari/fae/_next_page.html.slim +9 -0
  254. data/app/views/kaminari/fae/_page.html.slim +15 -0
  255. data/app/views/kaminari/fae/_paginator.html.slim +15 -0
  256. data/app/views/kaminari/fae/_prev_page.html.slim +9 -0
  257. data/app/views/layouts/devise.html.slim +29 -0
  258. data/app/views/layouts/fae/application.html.slim +23 -0
  259. data/app/views/layouts/fae/error.html.slim +11 -0
  260. data/config/deploy.rb +73 -0
  261. data/config/deploy/dev.rb +19 -0
  262. data/config/deploy/prod.rb +19 -0
  263. data/config/deploy/stage.rb +19 -0
  264. data/config/initializers/assets.rb +1 -0
  265. data/config/initializers/carrierwave.rb +3 -0
  266. data/config/initializers/devise.rb +258 -0
  267. data/config/initializers/devise_monkeypatch.rb +11 -0
  268. data/config/initializers/fae_judge.rb +3 -0
  269. data/config/initializers/inflections.rb +16 -0
  270. data/config/initializers/kaminari_config.rb +10 -0
  271. data/config/initializers/simple_form.rb +147 -0
  272. data/config/initializers/time_formats.rb +3 -0
  273. data/config/locales/devise.en.yml +59 -0
  274. data/config/locales/devise.zh-CN.yml +59 -0
  275. data/config/locales/fae.en.yml +10 -0
  276. data/config/locales/fae.zh-CN.yml +10 -0
  277. data/config/locales/simple_form.en.yml +26 -0
  278. data/config/locales/simple_form.zh-CN.yml +26 -0
  279. data/config/routes.rb +46 -0
  280. data/db/migrate/20140809222030_add_user_table.rb +49 -0
  281. data/db/migrate/20140822224029_create_fae_roles.rb +10 -0
  282. data/db/migrate/20141008180718_create_fae_images_table.rb +19 -0
  283. data/db/migrate/20141017194616_create_fae_options.rb +16 -0
  284. data/db/migrate/20141021181327_create_fae_files.rb +17 -0
  285. data/db/migrate/20141021183047_create_fae_text_areas.rb +16 -0
  286. data/db/migrate/20141021184311_create_fae_pages.rb +13 -0
  287. data/db/migrate/20141105214814_create_fae_text_fields.rb +15 -0
  288. data/db/migrate/20150930224821_create_fae_changes.rb +17 -0
  289. data/lib/fae-rails.rb +6 -0
  290. data/lib/fae/concerns/models/base.rb +8 -0
  291. data/lib/fae/engine.rb +37 -0
  292. data/lib/fae/options.rb +35 -0
  293. data/lib/fae/validation_helper_collection.rb +76 -0
  294. data/lib/fae/version.rb +3 -0
  295. data/lib/file_size_validator.rb +71 -0
  296. data/lib/generators/fae/base_generator.rb +156 -0
  297. data/lib/generators/fae/controller_generator.rb +13 -0
  298. data/lib/generators/fae/install_generator.rb +61 -0
  299. data/lib/generators/fae/model_generator.rb +11 -0
  300. data/lib/generators/fae/nested_index_scaffold_generator.rb +36 -0
  301. data/lib/generators/fae/nested_scaffold_generator.rb +51 -0
  302. data/lib/generators/fae/page_generator.rb +65 -0
  303. data/lib/generators/fae/scaffold_generator.rb +15 -0
  304. data/lib/generators/fae/templates/assets/fae.js +6 -0
  305. data/lib/generators/fae/templates/assets/fae.scss +2 -0
  306. data/lib/generators/fae/templates/controllers/nested_index_scaffold_controller.rb +81 -0
  307. data/lib/generators/fae/templates/controllers/nested_scaffold_controller.rb +13 -0
  308. data/lib/generators/fae/templates/controllers/scaffold_controller.rb +13 -0
  309. data/lib/generators/fae/templates/controllers/static_pages_controller.rb +10 -0
  310. data/lib/generators/fae/templates/initializers/fae.rb +63 -0
  311. data/lib/generators/fae/templates/initializers/fae_fine.rb +51 -0
  312. data/lib/generators/fae/templates/initializers/judge.rb +6 -0
  313. data/lib/generators/fae/templates/models/concerns/authorization_concern.rb +27 -0
  314. data/lib/generators/fae/templates/models/concerns/navigation_concern.rb +33 -0
  315. data/lib/generators/fae/templates/models/pages_model.rb +14 -0
  316. data/lib/generators/fae/templates/tasks/fae_tasks.rake +19 -0
  317. data/lib/generators/fae/templates/views/_form.html.slim +18 -0
  318. data/lib/generators/fae/templates/views/_form_index_nested.html.slim +13 -0
  319. data/lib/generators/fae/templates/views/_form_nested.html.slim +17 -0
  320. data/lib/generators/fae/templates/views/edit.html.slim +1 -0
  321. data/lib/generators/fae/templates/views/edit_nested.html.slim +3 -0
  322. data/lib/generators/fae/templates/views/index.html.slim +35 -0
  323. data/lib/generators/fae/templates/views/index_nested.html.slim +8 -0
  324. data/lib/generators/fae/templates/views/new.html.slim +1 -0
  325. data/lib/generators/fae/templates/views/new_nested.html.slim +3 -0
  326. data/lib/generators/fae/templates/views/static_page_form.html.slim +15 -0
  327. data/lib/generators/fae/templates/views/table_nested.html.slim +4 -0
  328. metadata +692 -0
@@ -0,0 +1,437 @@
1
+ /*!
2
+ * Fryr v1.2.2
3
+ * Command location.hash like a cook in the kitchen
4
+ * MIT License
5
+ */
6
+
7
+ (function (window, factory) {
8
+ 'use strict';
9
+
10
+ if (typeof define === 'function' && define.amd) {
11
+ define([], factory(window));
12
+ } else if (typeof exports === 'object') {
13
+ module.exports = factory(window);
14
+ } else {
15
+ window.Fryr = factory(window);
16
+ }
17
+
18
+ })(window, function factory(window) {
19
+ 'use strict';
20
+
21
+ /**
22
+ * Private variable used to hold the callback function
23
+ * Necessary for the destory method when we decouple the event listener
24
+ * @type {Function}
25
+ */
26
+ var hashCallback;
27
+
28
+ /**
29
+ * Remove all traces of a hash if it's blank
30
+ * @private
31
+ * @param {String} hash - The existing hash
32
+ * @see {@link http://stackoverflow.com/a/5298684}
33
+ * @fires history.pushState OR window.onhashchange
34
+ */
35
+ function removeHashIfBlank(hash) {
36
+ if(hash === '#') {
37
+ // Prevent scrolling by storing the page's current scroll offset
38
+ var scrollV = document.body.scrollTop;
39
+ var scrollH = document.body.scrollLeft;
40
+
41
+ window.location.hash = '';
42
+
43
+ // Restore the scroll offset
44
+ document.body.scrollTop = scrollV;
45
+ document.body.scrollLeft = scrollH;
46
+
47
+ } else {
48
+ // If the hash isn't blank, fire onhashchange
49
+ window.location.hash = hash;
50
+
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Delete value based on key
56
+ * @private
57
+ * @param {String} key - Param to target
58
+ * @param {String|Number} value - Value to delete from param
59
+ */
60
+ function removeValue(key, value) {
61
+ var hash = window.location.hash;
62
+ // check for key, anything between key and value, the value itself, and optionally the trailing comma
63
+ var regex_for_value = new RegExp('(' + key + '=.*)(' + value + ',?)');
64
+ // results come back [<search through value>, <search before value>, <value>]
65
+ var regex_match = hash.match(regex_for_value);
66
+ // replace <search through value> with everything before <value>
67
+ // Key is included in search in case multiple keys have the same value
68
+ hash = hash.replace(regex_match[0], regex_match[1]);
69
+
70
+ // Remove trailing commas, ,&, and =,
71
+ hash = hash.replace(/,$|(,(?=&))|((?==),)/, '')
72
+
73
+ removeHashIfBlank(hash);
74
+ }
75
+
76
+ /**
77
+ * Add value based on key
78
+ * @private
79
+ * @param {String} key - Param to target
80
+ * @param {String|Number} value - Value to add to param
81
+ * @param {Boolean} should_replace_value - if false, value will be appended to the param
82
+ * @fires window.onhashchange
83
+ */
84
+ function addValue(key, value, should_replace_value) {
85
+ var hash = window.location.hash;
86
+
87
+ var old_value = param(key);
88
+ var new_value;
89
+
90
+ // If it's blank or is the value of the next param
91
+ if(old_value.charAt(0) === '&' || old_value === '') {
92
+ old_value = key + '=';
93
+ new_value = old_value + value;
94
+
95
+ } else {
96
+ old_value = key + '=' + old_value;
97
+
98
+ // If the value of the param should be replaced, don't append it to the existing value
99
+ new_value = should_replace_value ? (key + '=' + value) : (old_value + ',' + value);
100
+ }
101
+
102
+ hash = hash.replace(old_value, new_value);
103
+
104
+ window.location.hash = hash;
105
+ }
106
+
107
+ /**
108
+ * Remove key from hash. Key's value must be removed prior to executing this function
109
+ * @private
110
+ * @param {String} key - Key to search and destroy
111
+ */
112
+ function removeKey(key) {
113
+ var hash = window.location.hash;
114
+ var key_search = new RegExp('[?&]' + key + '=', 'g');
115
+
116
+ hash = hash.replace(key_search, '');
117
+ // if initial key removed, replace ampersand with question
118
+ hash = hash.replace('#&', '#?');
119
+
120
+ removeHashIfBlank(hash);
121
+ }
122
+
123
+ /**
124
+ * @private
125
+ * @see {@link Fryr#param documentation in the public `param` function}
126
+ */
127
+ function param(key) {
128
+ if(!window.location.hash) {
129
+ return '';
130
+ }
131
+
132
+ var hash = window.location.hash;
133
+ var search = new RegExp('#.*[?&]' + key + '=([^&]+)(&|$)');
134
+ var key_value = hash.match(search);
135
+
136
+ return (key_value ? key_value[1] : '');
137
+ }
138
+
139
+ /**
140
+ * Apply value to variable if it has none
141
+ * @private
142
+ * @param {*} variable Variable to set default to
143
+ * @param {*} value - Default value to attribute to variable
144
+ * @return {*} Existing value or passed value argument
145
+ */
146
+ function setDefault(variable, value){
147
+ return (typeof variable === 'undefined') ? value : variable;
148
+ }
149
+
150
+ /**
151
+ * Remove key/value if present in hash; add key/value if not present in hash
152
+ * @private
153
+ * @param {String} key - Param key to query against
154
+ * @param {String|Number} value - Value for param key
155
+ * @param {Boolean} key_is_required - If the key is not required, it will be removed from the hash
156
+ * @param {Boolean} should_replace_value - If false, value will be appended to the key
157
+ * @see {@link Fryr#update}
158
+ * @see {@link Fryr#append}
159
+ * @fires window.onhashchange
160
+ */
161
+ function update(key, value, key_is_required, should_replace_value) {
162
+ var hash = window.location.hash;
163
+
164
+ // Ensure key exists in the hash
165
+ if(hash.indexOf(key) !== -1) {
166
+ var key_value = param(key);
167
+
168
+ // If the key is require or
169
+ // value isn't blank and is not in key_value
170
+ var value_not_in_key_value = key_value.split(',').indexOf(value) === -1;
171
+ if (key_is_required || (value_not_in_key_value && value !== '')) {
172
+
173
+ // add the value, replacing it if necessary
174
+ addValue(key, value, should_replace_value);
175
+
176
+ } else {
177
+
178
+ // If the value is blank, remove the original value from the key
179
+ if(value === '') {
180
+ removeValue(key, key_value);
181
+
182
+ // Otherwise remove the vanilla value if it's different than the original value
183
+ // or value should not be replaced (appended)
184
+ } else {
185
+ if(key_value !== value || !should_replace_value) {
186
+ removeValue(key, value);
187
+ }
188
+
189
+ }
190
+
191
+ // If key's value is blank, remove it from hash
192
+ if(param(key) === '') {
193
+ removeKey(key);
194
+ }
195
+
196
+ }
197
+
198
+ // Add key if it doesn't exist
199
+ } else {
200
+
201
+ if(window.location.hash && window.location.hash !== '#') {
202
+ window.location.hash += '&' + key + '=' + value;
203
+ } else {
204
+ // Use a question mark if first key
205
+ window.location.hash = '?' + key + '=' + value;
206
+ }
207
+
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Call once to initialize filtering
213
+ * @param {Function} hashChangeCallback - Called on every hashchange
214
+ * @param {Object} Updated params
215
+ * @param {Object} [defaults={}] - Key/value pairs for values that should be added on init. Pass {} to skip defaults
216
+ * @param {Boolean} [call_on_init=true] - Execute callback on initialization. Always true if defaults is supplied
217
+ * @return {Fryr}
218
+ */
219
+ function Fryr(hashChangeCallback, defaults, call_on_init) {
220
+ defaults = setDefault(defaults, {});
221
+ call_on_init = setDefault(call_on_init, true);
222
+
223
+ // Set for the privateHashChange
224
+ var _this = this;
225
+
226
+ /**
227
+ * Very important object holder
228
+ * @type {Object}
229
+ */
230
+ this.params = {};
231
+
232
+ /**
233
+ * Callback with new params. Callback defined in initialization
234
+ * @private
235
+ * @fires hashChangeCallback
236
+ */
237
+ function privateHashChange() {
238
+ var params = _this.parse();
239
+ hashChangeCallback.call(_this, params);
240
+ }
241
+
242
+ hashCallback = privateHashChange;
243
+
244
+ window.addEventListener('hashchange', hashCallback);
245
+
246
+ // Apply defaults (if present) to hash, which will file window.onhashchange
247
+ if( Object.keys(defaults).length && window.location.hash === '' ) {
248
+ this.merge(defaults, true);
249
+
250
+ // Execute the callback on load
251
+ } else if(call_on_init) {
252
+ privateHashChange.call(this);
253
+
254
+ }
255
+
256
+ return this;
257
+ }
258
+
259
+ Fryr.prototype = {
260
+
261
+ /**
262
+ * Replace key/value if present in hash; add key/value if not present in hash
263
+ * @param {String} key - Param key to query against
264
+ * @param {String|Number} value - Value for param key
265
+ * @param {Boolean} [key_is_required=false] - if the key is not required, it will be removed from the hash
266
+ * @see {@link Fryr#append}
267
+ */
268
+ update: function(key, value, key_is_required) {
269
+ key_is_required = setDefault(key_is_required, false);
270
+ update(key, value, key_is_required, true);
271
+ },
272
+
273
+ /**
274
+ * Add value to key's value in a comma-delineated list if it's not present in hash
275
+ * @param {String} key - Param key to query against
276
+ * @param {String|Number} value - Value for param key
277
+ * @see {@link Fryr#update}
278
+ */
279
+ append: function(key, value) {
280
+ update(key, value, false, false);
281
+ },
282
+
283
+ /**
284
+ * Evaluate the hash
285
+ * @return {Object} Key/value hash of the hash broken down by params
286
+ */
287
+ parse: function() {
288
+ var hash = window.location.hash;
289
+ var params;
290
+
291
+ // clear zombie keys and values
292
+ this.params = {};
293
+
294
+ if(window.location.hash && /\?/g.test(hash)) {
295
+ params = hash.split('?')[1];
296
+ params = params.split('&');
297
+
298
+ // Separate params into key values
299
+ for(var i = 0; i < params.length; i++) {
300
+ var key_value = params[i].split('=');
301
+ var key = key_value[0];
302
+ var value = key_value[1];
303
+
304
+ this.params[key] = value;
305
+ }
306
+ }
307
+
308
+ return this.params;
309
+ },
310
+
311
+ /**
312
+ * Change a JSON object into a string for the hash
313
+ * @param {Object|String} obj - object to convert
314
+ * @return {String|Boolean} For use in window.location.hash. Returns false if param is not object or string
315
+ */
316
+ convert: function(obj) {
317
+ if( obj.constructor === String ) {
318
+ obj = JSON.parse(obj);
319
+ }
320
+
321
+ // Escape if we're not dealing with an object
322
+ if( obj.constructor !== Object ) {
323
+ return false;
324
+ }
325
+
326
+ var keys = Object.keys(obj);
327
+ // Set start with a ?
328
+ var new_hash = '?';
329
+
330
+ // Loop through all keys in the obj
331
+ for(var i = 0; i < keys.length; i++) {
332
+ var key = keys[i];
333
+ var value = obj[ key ];
334
+
335
+ if (value === '') {
336
+ continue;
337
+ }
338
+
339
+ if( value.constructor === Array ) {
340
+ value = value.join(',');
341
+ }
342
+
343
+ // On next key, if it isn't the first, precede with an ampersand
344
+ if(new_hash !== '?') {
345
+ new_hash += '&';
346
+ }
347
+
348
+ // Append key/value to new_hash
349
+ new_hash += key + '=' + value;
350
+ }
351
+
352
+ if (new_hash === '?') {
353
+ new_hash = '';
354
+ }
355
+
356
+ return new_hash;
357
+ },
358
+
359
+ /**
360
+ * Wipe out or selectively replace keys in params
361
+ * @param {Object|String} obj - Query to replace
362
+ * @param {Boolean} [replace_all=false] - Whether or not to blast existing params away or replace only changed keys
363
+ * @fires window.onhashchange
364
+ * @return {String} The new hash
365
+ */
366
+ merge: function(obj, replace_all) {
367
+ replace_all = setDefault(replace_all, false);
368
+
369
+ // If it's a string, convert to an object
370
+ if( obj.constructor === String ) {
371
+ obj = JSON.parse(obj);
372
+ }
373
+
374
+ // Override or add key values from existing params and put them into the object
375
+ if( !replace_all ) {
376
+ var new_params = this.parse();
377
+
378
+ var keys = Object.keys(new_params);
379
+
380
+ for(var i = 0; i < keys.length; i++) {
381
+ var key = keys[i];
382
+ var value = new_params[ key ];
383
+
384
+ if(!obj.hasOwnProperty(key)) {
385
+ obj[key] = value;
386
+ }
387
+ }
388
+ }
389
+
390
+ // Change hash to string; if replace_all is false, original value is used
391
+ var new_hash = this.convert(obj);
392
+
393
+ window.location.hash = '#' + new_hash;
394
+
395
+ return new_hash;
396
+ },
397
+
398
+ /**
399
+ * Retrieve a key's value
400
+ * @param {String} key - Param to target
401
+ * @example
402
+ * window.location.hash = '?color=blue'
403
+ * fryr.param('color') // => 'blue'
404
+ * @return {String} The value of the key
405
+ */
406
+ param: function(key) {
407
+ return param(key);
408
+ },
409
+
410
+ /**
411
+ * Determine if param is blank or undefined
412
+ * @param {String} key - Param to target
413
+ * @return {Boolean}
414
+ */
415
+ paramPresent: function(key) {
416
+ var value = this.params[key];
417
+ return (typeof value !== 'undefined' && value !== '');
418
+ },
419
+
420
+ /**
421
+ * Destroy current initialization, unbind hashchange listener, and reset the hash to an empty state
422
+ * @param {Boolean} [retain_hash=false] - Keep items in hash
423
+ */
424
+ destroy: function(retain_hash){
425
+ retain_hash = setDefault(retain_hash, false);
426
+
427
+ window.removeEventListener('hashchange', hashCallback);
428
+
429
+ if(!retain_hash) {
430
+ window.location.hash = '';
431
+ }
432
+ }
433
+ };
434
+
435
+ return Fryr;
436
+
437
+ });
@@ -0,0 +1,4 @@
1
+ /*! tinyColorPicker - v1.1.1 2016-07-15 */
2
+
3
+ !function(a,b){"object"==typeof exports?module.exports=b(a):"function"==typeof define&&define.amd?define("colors",[],function(){return b(a)}):a.Colors=b(a)}(this,function(a,b){"use strict";function c(a,c,d,f,g){if("string"==typeof c){var c=v.txt2color(c);d=c.type,p[d]=c[d],g=g!==b?g:c.alpha}else if(c)for(var h in c)a[d][h]=k(c[h]/l[d][h][1],0,1);return g!==b&&(a.alpha=k(+g,0,1)),e(d,f?a:b)}function d(a,b,c){var d=o.options.grey,e={};return e.RGB={r:a.r,g:a.g,b:a.b},e.rgb={r:b.r,g:b.g,b:b.b},e.alpha=c,e.equivalentGrey=n(d.r*a.r+d.g*a.g+d.b*a.b),e.rgbaMixBlack=i(b,{r:0,g:0,b:0},c,1),e.rgbaMixWhite=i(b,{r:1,g:1,b:1},c,1),e.rgbaMixBlack.luminance=h(e.rgbaMixBlack,!0),e.rgbaMixWhite.luminance=h(e.rgbaMixWhite,!0),o.options.customBG&&(e.rgbaMixCustom=i(b,o.options.customBG,c,1),e.rgbaMixCustom.luminance=h(e.rgbaMixCustom,!0),o.options.customBG.luminance=h(o.options.customBG,!0)),e}function e(a,b){var c,e,k,q=b||p,r=v,s=o.options,t=l,u=q.RND,w="",x="",y={hsl:"hsv",rgb:a},z=u.rgb;if("alpha"!==a){for(var A in t)if(!t[A][A]){a!==A&&(x=y[A]||"rgb",q[A]=r[x+"2"+A](q[x])),u[A]||(u[A]={}),c=q[A];for(w in c)u[A][w]=n(c[w]*t[A][w][1])}z=u.rgb,q.HEX=r.RGB2HEX(z),q.equivalentGrey=s.grey.r*q.rgb.r+s.grey.g*q.rgb.g+s.grey.b*q.rgb.b,q.webSave=e=f(z,51),q.webSmart=k=f(z,17),q.saveColor=z.r===e.r&&z.g===e.g&&z.b===e.b?"web save":z.r===k.r&&z.g===k.g&&z.b===k.b?"web smart":"",q.hueRGB=v.hue2RGB(q.hsv.h),b&&(q.background=d(z,q.rgb,q.alpha))}var B,C,D,E=q.rgb,F=q.alpha,G="luminance",H=q.background;return B=i(E,{r:0,g:0,b:0},F,1),B[G]=h(B,!0),q.rgbaMixBlack=B,C=i(E,{r:1,g:1,b:1},F,1),C[G]=h(C,!0),q.rgbaMixWhite=C,s.customBG&&(D=i(E,H.rgbaMixCustom,F,1),D[G]=h(D,!0),D.WCAG2Ratio=j(D[G],H.rgbaMixCustom[G]),q.rgbaMixBGMixCustom=D,D.luminanceDelta=m.abs(D[G]-H.rgbaMixCustom[G]),D.hueDelta=g(H.rgbaMixCustom,D,!0)),q.RGBLuminance=h(z),q.HUELuminance=h(q.hueRGB),s.convertCallback&&s.convertCallback(q,a),q}function f(a,b){var c={},d=0,e=b/2;for(var f in a)d=a[f]%b,c[f]=a[f]+(d>e?b-d:-d);return c}function g(a,b,c){return(m.max(a.r-b.r,b.r-a.r)+m.max(a.g-b.g,b.g-a.g)+m.max(a.b-b.b,b.b-a.b))*(c?255:1)/765}function h(a,b){for(var c=b?1:255,d=[a.r/c,a.g/c,a.b/c],e=o.options.luminance,f=d.length;f--;)d[f]=d[f]<=.03928?d[f]/12.92:m.pow((d[f]+.055)/1.055,2.4);return e.r*d[0]+e.g*d[1]+e.b*d[2]}function i(a,c,d,e){var f={},g=d!==b?d:1,h=e!==b?e:1,i=g+h*(1-g);for(var j in a)f[j]=(a[j]*g+c[j]*h*(1-g))/i;return f.a=i,f}function j(a,b){var c=1;return c=a>=b?(a+.05)/(b+.05):(b+.05)/(a+.05),n(100*c)/100}function k(a,b,c){return a>c?c:b>a?b:a}var l={rgb:{r:[0,255],g:[0,255],b:[0,255]},hsv:{h:[0,360],s:[0,100],v:[0,100]},hsl:{h:[0,360],s:[0,100],l:[0,100]},alpha:{alpha:[0,1]},HEX:{HEX:[0,16777215]}},m=a.Math,n=m.round,o={},p={},q={r:.298954,g:.586434,b:.114612},r={r:.2126,g:.7152,b:.0722},s=function(a){this.colors={RND:{}},this.options={color:"rgba(0,0,0,0)",grey:q,luminance:r,valueRanges:l},t(this,a||{})},t=function(a,d){var e,f=a.options;u(a);for(var g in d)d[g]!==b&&(f[g]=d[g]);e=f.customBG,f.customBG="string"==typeof e?v.txt2color(e).rgb:e,p=c(a.colors,f.color,b,!0)},u=function(a){o!==a&&(o=a,p=a.colors)};s.prototype.setColor=function(a,d,f){return u(this),a?c(this.colors,a,d,b,f):(f!==b&&(this.colors.alpha=k(f,0,1)),e(d))},s.prototype.setCustomBackground=function(a){return u(this),this.options.customBG="string"==typeof a?v.txt2color(a).rgb:a,c(this.colors,b,"rgb")},s.prototype.saveAsBackground=function(){return u(this),c(this.colors,b,"rgb",!0)},s.prototype.toString=function(a,b){return v.color2text((a||"rgb").toLowerCase(),this.colors,b)};var v={txt2color:function(a){var b={},c=a.replace(/(?:#|\)|%)/g,"").split("("),d=(c[1]||"").split(/,\s*/),e=c[1]?c[0].substr(0,3):"rgb",f="";if(b.type=e,b[e]={},c[1])for(var g=3;g--;)f=e[g]||e.charAt(g),b[e][f]=+d[g]/l[e][f][1];else b.rgb=v.HEX2rgb(c[0]);return b.alpha=d[3]?+d[3]:1,b},color2text:function(a,b,c){var d=c!==!1&&n(100*b.alpha)/100,e="number"==typeof d&&c!==!1&&(c||1!==d),f=b.RND.rgb,g=b.RND.hsl,h="hex"===a&&e,i="hex"===a&&!h,j="rgb"===a||h,k=j?f.r+", "+f.g+", "+f.b:i?"#"+b.HEX:g.h+", "+g.s+"%, "+g.l+"%";return i?k:(h?"rgb":a)+(e?"a":"")+"("+k+(e?", "+d:"")+")"},RGB2HEX:function(a){return((a.r<16?"0":"")+a.r.toString(16)+(a.g<16?"0":"")+a.g.toString(16)+(a.b<16?"0":"")+a.b.toString(16)).toUpperCase()},HEX2rgb:function(a){return a=a.split(""),{r:+("0x"+a[0]+a[a[3]?1:0])/255,g:+("0x"+a[a[3]?2:1]+(a[3]||a[1]))/255,b:+("0x"+(a[4]||a[2])+(a[5]||a[2]))/255}},hue2RGB:function(a){var b=6*a,c=~~b%6,d=6===b?0:b-c;return{r:n(255*[1,1-d,0,0,d,1][c]),g:n(255*[d,1,1,1-d,0,0][c]),b:n(255*[0,0,d,1,1,1-d][c])}},rgb2hsv:function(a){var b,c,d,e=a.r,f=a.g,g=a.b,h=0;return g>f&&(f=g+(g=f,0),h=-1),c=g,f>e&&(e=f+(f=e,0),h=-2/6-h,c=m.min(f,g)),b=e-c,d=e?b/e:0,{h:1e-15>d?p&&p.hsl&&p.hsl.h||0:b?m.abs(h+(f-g)/(6*b)):0,s:e?b/e:p&&p.hsv&&p.hsv.s||0,v:e}},hsv2rgb:function(a){var b=6*a.h,c=a.s,d=a.v,e=~~b,f=b-e,g=d*(1-c),h=d*(1-f*c),i=d*(1-(1-f)*c),j=e%6;return{r:[d,h,g,g,i,d][j],g:[i,d,d,h,g,g][j],b:[g,g,i,d,d,h][j]}},hsv2hsl:function(a){var b=(2-a.s)*a.v,c=a.s*a.v;return c=a.s?1>b?b?c/b:0:c/(2-b):0,{h:a.h,s:a.v||c?c:p&&p.hsl&&p.hsl.s||0,l:b/2}},rgb2hsl:function(a,b){var c=v.rgb2hsv(a);return v.hsv2hsl(b?c:p.hsv=c)},hsl2rgb:function(a){var b=6*a.h,c=a.s,d=a.l,e=.5>d?d*(1+c):d+c-c*d,f=d+d-e,g=e?(e-f)/e:0,h=~~b,i=b-h,j=e*g*i,k=f+j,l=e-j,m=h%6;return{r:[e,l,f,f,k,e][m],g:[k,e,e,l,f,f][m],b:[f,f,k,e,e,l][m]}}};return s}),function(a,b){"object"==typeof exports?module.exports=b(a,require("jquery"),require("colors")):"function"==typeof define&&define.amd?define(["jquery","colors"],function(c,d){return b(a,c,d)}):b(a,a.jQuery,a.Colors)}(this,function(a,b,c,d){"use strict";function e(a){return a.value||a.getAttribute("value")||b(a).css("background-color")||"#FFF"}function f(a){return a=a.originalEvent&&a.originalEvent.touches?a.originalEvent.touches[0]:a,a.originalEvent?a.originalEvent:a}function g(a){return b(a.find(r.doRender)[0]||a[0])}function h(c){var d=b(this),f=d.offset(),h=b(a),k=r.gap;c?(s=g(d),s._colorMode=s.data("colorMode"),p.$trigger=d,(t||i()).css(r.positionCallback.call(p,d)||{left:(t._left=f.left)-((t._left+=t._width-(h.scrollLeft()+h.width()))+k>0?t._left+k:0),top:(t._top=f.top+d.outerHeight())-((t._top+=t._height-(h.scrollTop()+h.height()))+k>0?t._top+k:0)}).show(r.animationSpeed,function(){c!==!0&&(y.toggle(!!r.opacity)._width=y.width(),v._width=v.width(),v._height=v.height(),u._height=u.height(),q.setColor(e(s[0])),n(!0))}).off(".tcp").on(D,".cp-xy-slider,.cp-z-slider,.cp-alpha",j)):p.$trigger&&b(t).hide(r.animationSpeed,function(){n(!1),p.$trigger=null}).off(".tcp")}function i(){return b("head").append('<style type="text/css" id="tinyColorPickerStyles">'+(r.css||I)+(r.cssAddon||"")+"</style>"),b(H).css({margin:r.margin}).appendTo("body").show(0,function(){p.$UI=t=b(this),F=r.GPU&&t.css("perspective")!==d,u=b(".cp-z-slider",this),v=b(".cp-xy-slider",this),w=b(".cp-xy-cursor",this),x=b(".cp-z-cursor",this),y=b(".cp-alpha",this),z=b(".cp-alpha-cursor",this),r.buildCallback.call(p,t),t.prepend("<div>").children().eq(0).css("width",t.children().eq(0).width()),t._width=this.offsetWidth,t._height=this.offsetHeight}).hide()}function j(a){var c=this.className.replace(/cp-(.*?)(?:\s*|$)/,"$1").replace("-","_");(a.button||a.which)>1||(a.preventDefault&&a.preventDefault(),a.returnValue=!1,s._offset=b(this).offset(),(c="xy_slider"===c?k:"z_slider"===c?l:m)(a),n(),A.on(E,function(){A.off(".tcp")}).on(C,function(a){c(a),n()}))}function k(a){var b=f(a),c=b.pageX-s._offset.left,d=b.pageY-s._offset.top;q.setColor({s:c/v._width*100,v:100-d/v._height*100},"hsv")}function l(a){var b=f(a).pageY-s._offset.top;q.setColor({h:360-b/u._height*360},"hsv")}function m(a){var b=f(a).pageX-s._offset.left,c=b/y._width;q.setColor({},"rgb",c)}function n(a){var b=q.colors,c=b.hueRGB,e=(b.RND.rgb,b.RND.hsl,r.dark),f=r.light,g=q.toString(s._colorMode,r.forceAlpha),h=b.HUELuminance>.22?e:f,i=b.rgbaMixBlack.luminance>.22?e:f,j=(1-b.hsv.h)*u._height,k=b.hsv.s*v._width,l=(1-b.hsv.v)*v._height,m=b.alpha*y._width,n=F?"translate3d":"",p=s[0].value,t=s[0].hasAttribute("value")&&""===p&&a!==d;v._css={backgroundColor:"rgb("+c.r+","+c.g+","+c.b+")"},w._css={transform:n+"("+k+"px, "+l+"px, 0)",left:F?"":k,top:F?"":l,borderColor:b.RGBLuminance>.22?e:f},x._css={transform:n+"(0, "+j+"px, 0)",top:F?"":j,borderColor:"transparent "+h},y._css={backgroundColor:"#"+b.HEX},z._css={transform:n+"("+m+"px, 0, 0)",left:F?"":m,borderColor:i+" transparent"},s._css={backgroundColor:t?"":g,color:t?"":b.rgbaMixBGMixCustom.luminance>.22?e:f},s.text=t?"":p!==g?g:"",a!==d?o(a):G(o)}function o(a){v.css(v._css),w.css(w._css),x.css(x._css),y.css(y._css),z.css(z._css),r.doRender&&s.css(s._css),s.text&&s.val(s.text),r.renderCallback.call(p,s,"boolean"==typeof a?a:d)}var p,q,r,s,t,u,v,w,x,y,z,A=b(document),B=b(),C="touchmove.tcp mousemove.tcp pointermove.tcp",D="touchstart.tcp mousedown.tcp pointerdown.tcp",E="touchend.tcp mouseup.tcp pointerup.tcp",F=!1,G=a.requestAnimationFrame||a.webkitRequestAnimationFrame||function(a){a()},H='<div class="cp-color-picker"><div class="cp-z-slider"><div class="cp-z-cursor"></div></div><div class="cp-xy-slider"><div class="cp-white"></div><div class="cp-xy-cursor"></div></div><div class="cp-alpha"><div class="cp-alpha-cursor"></div></div></div>',I=".cp-color-picker{position:absolute;overflow:hidden;padding:6px 6px 0;background-color:#444;color:#bbb;font-family:Arial,Helvetica,sans-serif;font-size:12px;font-weight:400;cursor:default;border-radius:5px}.cp-color-picker>div{position:relative;overflow:hidden}.cp-xy-slider{float:left;height:128px;width:128px;margin-bottom:6px;background:linear-gradient(to right,#FFF,rgba(255,255,255,0))}.cp-white{height:100%;width:100%;background:linear-gradient(rgba(0,0,0,0),#000)}.cp-xy-cursor{position:absolute;top:0;width:10px;height:10px;margin:-5px;border:1px solid #fff;border-radius:100%;box-sizing:border-box}.cp-z-slider{float:right;margin-left:6px;height:128px;width:20px;background:linear-gradient(red 0,#f0f 17%,#00f 33%,#0ff 50%,#0f0 67%,#ff0 83%,red 100%)}.cp-z-cursor{position:absolute;margin-top:-4px;width:100%;border:4px solid #fff;border-color:transparent #fff;box-sizing:border-box}.cp-alpha{clear:both;width:100%;height:16px;margin:6px 0;background:linear-gradient(to right,#444,rgba(0,0,0,0))}.cp-alpha-cursor{position:absolute;margin-left:-4px;height:100%;border:4px solid #fff;border-color:#fff transparent;box-sizing:border-box}",J=function(a){q=this.color=new c(a),r=q.options,p=this};J.prototype={render:n,toggle:h},b.fn.colorPicker=function(c){var d=this,f=function(){};return c=b.extend({animationSpeed:150,GPU:!0,doRender:!0,customBG:"#FFF",opacity:!0,renderCallback:f,buildCallback:f,positionCallback:f,body:document.body,scrollResize:!0,gap:4,dark:"#222",light:"#DDD"},c),!p&&c.scrollResize&&b(a).on("resize.tcp scroll.tcp",function(){p.$trigger&&p.toggle.call(p.$trigger[0],!0)}),B=B.add(this),this.colorPicker=p||new J(c),this.options=c,b(c.body).off(".tcp").on(D,function(a){-1===B.add(t).add(b(t).find(a.target)).index(a.target)&&h()}),this.on("focusin.tcp click.tcp",function(a){p.color.options=b.extend(p.color.options,r=d.options),h.call(this,a)}).on("change.tcp",function(){q.setColor(this.value||"#FFF"),d.colorPicker.render(!0)}).each(function(){var a=e(this),d=a.split("("),f=g(b(this));f.data("colorMode",d[1]?d[0].substr(0,3):"HEX").attr("readonly",r.preventFocus),c.doRender&&f.css({"background-color":a,color:function(){return q.setColor(a).rgbaMixBGMixCustom.luminance>.22?c.dark:c.light}})})},b.fn.colorPicker.destroy=function(){b("*").off(".tcp"),p.toggle(!1),B=b()}});
4
+ //# sourceMappingURL=jqColorPicker.js.map
@@ -0,0 +1,1292 @@
1
+ // daterangepicker.js
2
+ // version : 0.0.5
3
+ // author : Chunlong Liu
4
+ // last updated at: 2014-05-27
5
+ // license : MIT
6
+ // www.jszen.com
7
+
8
+ (function($)
9
+ {
10
+
11
+ $.dateRangePickerLanguages =
12
+ {
13
+ 'cn':
14
+ {
15
+ 'selected': '已选择:',
16
+ 'day':'天',
17
+ 'days': '天',
18
+ 'apply': '确定',
19
+ 'week-1' : '一',
20
+ 'week-2' : '二',
21
+ 'week-3' : '三',
22
+ 'week-4' : '四',
23
+ 'week-5' : '五',
24
+ 'week-6' : '六',
25
+ 'week-7' : '日',
26
+ 'month-name': ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'],
27
+ 'shortcuts' : '快捷选择',
28
+ 'past': '过去',
29
+ 'following':'将来',
30
+ 'previous' : '&nbsp;&nbsp;&nbsp;',
31
+ 'prev-week' : '上周',
32
+ 'prev-month' : '上个月',
33
+ 'prev-year' : '去年',
34
+ 'next': '&nbsp;&nbsp;&nbsp;',
35
+ 'next-week':'下周',
36
+ 'next-month':'下个月',
37
+ 'next-year':'明年',
38
+ 'less-than' : '所选日期范围不能大于%d天',
39
+ 'more-than' : '所选日期范围不能小于%d天',
40
+ 'default-more' : '请选择大于%d天的日期范围',
41
+ 'default-less' : '请选择小于%d天的日期范围',
42
+ 'default-range' : '请选择%d天到%d天的日期范围',
43
+ 'default-single':'请选择一个日期',
44
+ 'default-default': '请选择一个日期范围'
45
+ },
46
+ 'en':
47
+ {
48
+ 'selected': 'Selected:',
49
+ 'day':'Day',
50
+ 'days': 'Days',
51
+ 'apply': 'Close',
52
+ 'week-1' : 'MO',
53
+ 'week-2' : 'TU',
54
+ 'week-3' : 'WE',
55
+ 'week-4' : 'TH',
56
+ 'week-5' : 'FR',
57
+ 'week-6' : 'SA',
58
+ 'week-7' : 'SU',
59
+ 'month-name': ['JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER'],
60
+ 'shortcuts' : 'Shortcuts',
61
+ 'past': 'Past',
62
+ 'following':'Following',
63
+ 'previous' : 'Previous',
64
+ 'prev-week' : 'Week',
65
+ 'prev-month' : 'Month',
66
+ 'prev-year' : 'Year',
67
+ 'next':'Next',
68
+ 'next-week':'Week',
69
+ 'next-month':'Month',
70
+ 'next-year':'Year',
71
+ 'less-than' : 'Date range should not be more than %d days',
72
+ 'more-than' : 'Date range should not be less than %d days',
73
+ 'default-more' : 'Please select a date range longer than %d days',
74
+ 'default-single' : 'Please select a date',
75
+ 'default-less' : 'Please select a date range less than %d days',
76
+ 'default-range' : 'Please select a date range between %d and %d days',
77
+ 'default-default': 'Please select a date range'
78
+ },
79
+ 'it':
80
+ {
81
+ 'selected': 'Selezionati:',
82
+ 'day':'Giorno',
83
+ 'days': 'Giorni',
84
+ 'apply': 'Chiudi',
85
+ 'week-1' : 'LU',
86
+ 'week-2' : 'MA',
87
+ 'week-3' : 'ME',
88
+ 'week-4' : 'GI',
89
+ 'week-5' : 'VE',
90
+ 'week-6' : 'SA',
91
+ 'week-7' : 'DO',
92
+ 'month-name': ['GENNAIO','FEBBRAIO','MARZO','APRILE','MAGGIO','GIUGNO','LUGLIO','AGOSTO','SETTEMBRE','OTTOBRE','NOVEMBRE','DICEMBRE'],
93
+ 'shortcuts' : 'Scorciatoie',
94
+ 'past': 'Scorso',
95
+ 'following':'Successivo',
96
+ 'previous' : 'Precedente',
97
+ 'prev-week' : 'Settimana',
98
+ 'prev-month' : 'Mese',
99
+ 'prev-year' : 'Anno',
100
+ 'next':'Prossimo',
101
+ 'next-week':'Settimana',
102
+ 'next-month':'Mese',
103
+ 'next-year':'Anno',
104
+ 'less-than' : 'L\'intervallo non dev\'essere maggiore di %d giorni',
105
+ 'more-than' : 'L\'intervallo non dev\'essere minore di %d giorni',
106
+ 'default-more' : 'Seleziona un intervallo maggiore di %d giorni',
107
+ 'default-single' : 'Seleziona una data',
108
+ 'default-less' : 'Seleziona un intervallo minore di %d giorni',
109
+ 'default-range' : 'Seleziona un intervallo compreso tra i %d e i %d giorni',
110
+ 'default-default': 'Seleziona un intervallo di date'
111
+ },
112
+ 'es':
113
+ {
114
+ 'selected': 'Seleccionado:',
115
+ 'day':'Dia',
116
+ 'days': 'Dias',
117
+ 'apply': 'Cerrar',
118
+ 'week-1' : 'LU',
119
+ 'week-2' : 'MA',
120
+ 'week-3' : 'MI',
121
+ 'week-4' : 'JU',
122
+ 'week-5' : 'VI',
123
+ 'week-6' : 'SA',
124
+ 'week-7' : 'DO',
125
+ 'month-name': ['ENERO','FEBRERO','MARZO','ABRIL','MAYO','JUNIO','JULIO','AGOSTO','SEPTIEMBRE','OCTUBRE','NOVIEMBRE','DICIEMBRE'],
126
+ 'shortcuts' : 'Accesos directos',
127
+ 'past': 'Pasado',
128
+ 'following':'Siguiente',
129
+ 'previous' : 'Anterior',
130
+ 'prev-week' : 'Semana',
131
+ 'prev-month' : 'Mes',
132
+ 'prev-year' : 'Año',
133
+ 'next':'Siguiente',
134
+ 'next-week':'Semana',
135
+ 'next-month':'Mes',
136
+ 'next-year':'Año',
137
+ 'less-than' : 'El rango no deberia ser mayor de %d dias',
138
+ 'more-than' : 'El rango no deberia ser menor de %d dias',
139
+ 'default-more' : 'Por favor selecciona un rango mayor a %d dias',
140
+ 'default-single' : 'Por favor selecciona un dia',
141
+ 'default-less' : 'Por favor selecciona un rango menor a %d dias',
142
+ 'default-range' : 'Por favor selecciona un rango entre %d y %d dias',
143
+ 'default-default': 'Por favor selecciona un rango de fechas.'
144
+ },
145
+ 'de':
146
+ {
147
+ 'selected': 'Auswahl:',
148
+ 'day':'Tag',
149
+ 'days': 'Tage',
150
+ 'apply': 'Schließen',
151
+ 'week-1' : 'MO',
152
+ 'week-2' : 'DI',
153
+ 'week-3' : 'MI',
154
+ 'week-4' : 'DO',
155
+ 'week-5' : 'FR',
156
+ 'week-6' : 'SA',
157
+ 'week-7' : 'SO',
158
+ 'month-name': ['JANUAR','FEBRUAR','MÄRZ','APRIL','MAI','JUNI','JULI','AUGUST','SEPTEMBER','OKTOBER','NOVEMBER','DEZEMBER'],
159
+ 'shortcuts' : 'Schnellwahl',
160
+ 'past': 'Vorherige',
161
+ 'following':'Folgende',
162
+ 'previous' : 'Vorherige',
163
+ 'prev-week' : 'Woche',
164
+ 'prev-month' : 'Monat',
165
+ 'prev-year' : 'Jahr',
166
+ 'next':'Nächste',
167
+ 'next-week':'Woche',
168
+ 'next-month':'Monat',
169
+ 'next-year':'Jahr',
170
+ 'less-than' : 'Datumsbereich darf nicht größer sein als %d Tage',
171
+ 'more-than' : 'Datumsbereich darf nicht kleiner sein als %d Tage',
172
+ 'default-more' : 'Bitte mindestens %d Tage auswählen',
173
+ 'default-single' : 'Bitte ein Datum auswählen',
174
+ 'default-less' : 'Bitte weniger als %d Tage auswählen',
175
+ 'default-range' : 'Bitte einen Datumsbereich zwischen %d und %d Tagen auswählen',
176
+ 'default-default': 'Bitte ein Start- und Enddatum auswählen'
177
+ },
178
+ 'ru':
179
+ {
180
+ 'selected': 'Выбрано:',
181
+ 'day': 'День',
182
+ 'days': 'Дней',
183
+ 'apply': 'Закрыть',
184
+ 'week-1': 'ПН',
185
+ 'week-2': 'ВТ',
186
+ 'week-3': 'СР',
187
+ 'week-4': 'ЧТ',
188
+ 'week-5': 'ПТ',
189
+ 'week-6': 'СБ',
190
+ 'week-7': 'ВС',
191
+ 'month-name': ['ЯНВАРЬ','ФЕВРАЛЬ','МАРТ','АПРЕЛЬ','МАЙ','ИЮНЬ','ИЮЛЬ','АВГУСТ','СЕНТЯБРЬ','ОКТЯБРЬ','НОЯБРЬ','ДЕКАБРЬ'],
192
+ 'shortcuts': 'Быстрый выбор',
193
+ 'past': 'Прошедшие',
194
+ 'following': 'Следующие',
195
+ 'previous': '&nbsp;&nbsp;&nbsp;',
196
+ 'prev-week': 'Неделя',
197
+ 'prev-month': 'Месяц',
198
+ 'prev-year': 'Год',
199
+ 'next': '&nbsp;&nbsp;&nbsp;',
200
+ 'next-week': 'Неделя',
201
+ 'next-month': 'Месяц',
202
+ 'next-year': 'Год',
203
+ 'less-than': 'Диапазон не может быть больше %d дней',
204
+ 'more-than': 'Диапазон не может быть меньше %d дней',
205
+ 'default-more': 'Пожалуйста выберите диапазон больше %d дней',
206
+ 'default-single': 'Пожалуйста выберите дату',
207
+ 'default-less': 'Пожалуйста выберите диапазон меньше %d дней',
208
+ 'default-range': 'Пожалуйста выберите диапазон между %d и %d днями',
209
+ 'default-default': 'Пожалуйста выберите диапазон'
210
+ }
211
+ };
212
+
213
+
214
+ if (window['moment'] === undefined)
215
+ {
216
+ if (window['console'] && console['warn']) console.warn('Please import moment.js before daterangepicker.js');
217
+ return;
218
+ }
219
+
220
+ $.fn.dateRangePicker = function(opt)
221
+ {
222
+ if (!opt) opt = {};
223
+ opt = $.extend(true,
224
+ {
225
+ autoClose: false,
226
+ format: 'YYYY-MM-DD',
227
+ separator: ' to ',
228
+ language: 'auto',
229
+ startOfWeek: 'sunday',// or monday
230
+ getValue: function()
231
+ {
232
+ return $(this).val();
233
+ },
234
+ setValue: function(s)
235
+ {
236
+ $(this).val(s);
237
+ },
238
+ startDate: false,
239
+ endDate: false,
240
+ time: {
241
+ enabled: false
242
+ },
243
+ minDays: 0,
244
+ maxDays: 0,
245
+ showShortcuts: true,
246
+ shortcuts:
247
+ {
248
+ //'prev-days': [1,3,5,7],
249
+ 'next-days': [3,5,7],
250
+ //'prev' : ['week','month','year'],
251
+ 'next' : ['week','month','year']
252
+ },
253
+ customShortcuts : [],
254
+ inline:false,
255
+ container:'body',
256
+ alwaysOpen:false,
257
+ singleDate:false,
258
+ batchMode: false
259
+ },opt);
260
+
261
+ opt.start = false;
262
+ opt.end = false;
263
+
264
+ if (opt.startDate && typeof opt.startDate == 'string') opt.startDate = moment(opt.startDate,opt.format).toDate();
265
+ if (opt.endDate && typeof opt.endDate == 'string') opt.endDate = moment(opt.endDate,opt.format).toDate();
266
+
267
+ var langs = getLanguages();
268
+ var box;
269
+ var initiated = false;
270
+ var self = this;
271
+ var selfDom = $(self).get(0);
272
+
273
+ $(this).unbind('.datepicker').bind('click.datepicker',function(evt)
274
+ {
275
+ evt.stopPropagation();
276
+ open(200);
277
+ });
278
+
279
+ init_datepicker.call(this);
280
+
281
+ if (opt.alwaysOpen)
282
+ {
283
+ open(0);
284
+ }
285
+
286
+ // expose some api
287
+ $(this).data('dateRangePicker',
288
+ {
289
+ setDateRange : function(d1,d2)
290
+ {
291
+ if (typeof d1 == 'string' && typeof d2 == 'string')
292
+ {
293
+ d1 = moment(d1,opt.format).toDate();
294
+ d2 = moment(d2,opt.format).toDate();
295
+ }
296
+ setDateRange(d1,d2);
297
+ },
298
+ clear: clearSelection,
299
+ close: closeDatePicker,
300
+ open: open,
301
+ destroy: function()
302
+ {
303
+ $(self).unbind('.datepicker');
304
+ $(self).data('dateRangePicker','');
305
+ box.remove();
306
+ $(window).unbind('resize.datepicker',calcPosition);
307
+ $(document).unbind('click.datepicker',closeDatePicker);
308
+ }
309
+ });
310
+
311
+ $(window).bind('resize.datepicker',calcPosition);
312
+
313
+ return this;
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ function init_datepicker()
326
+ {
327
+ var self = this;
328
+
329
+ if ($(this).data('date-picker-opened'))
330
+ {
331
+ closeDatePicker();
332
+ return;
333
+ }
334
+ $(this).data('date-picker-opened',true);
335
+
336
+
337
+
338
+
339
+
340
+ box = createDom().hide();
341
+ $(opt.container).append(box);
342
+
343
+ if (!opt.inline)
344
+ {
345
+ calcPosition();
346
+ }
347
+ else
348
+ {
349
+ box.css({position:'static'});
350
+ }
351
+
352
+ if (opt.alwaysOpen)
353
+ {
354
+ box.find('.apply-btn').hide();
355
+ }
356
+
357
+ var defaultTime = new Date();
358
+ if (opt.startDate && compare_month(defaultTime,opt.startDate) < 0 ) defaultTime = moment(opt.startDate).toDate();
359
+ if (opt.endDate && compare_month(nextMonth(defaultTime),opt.endDate) > 0 ) defaultTime = prevMonth(moment(opt.endDate).toDate());
360
+
361
+
362
+ showMonth(defaultTime,'month1');
363
+ showMonth(nextMonth(defaultTime),'month2');
364
+
365
+ if (opt.time.enabled) {
366
+ if ((opt.startDate && opt.endDate) || (opt.start && opt.end)) {
367
+ showTime(moment(opt.start || opt.startDate).toDate(),'time1');
368
+ showTime(moment(opt.end || opt.endDate).toDate(),'time2');
369
+ } else {
370
+ showTime(defaultTime,'time1');
371
+ showTime(defaultTime,'time2');
372
+ }
373
+ }
374
+
375
+ //showSelectedInfo();
376
+
377
+
378
+
379
+
380
+ var defaultTopText = '';
381
+ if (opt.singleDate)
382
+ defaultTopText = lang('default-single');
383
+ else if (opt.minDays && opt.maxDays)
384
+ defaultTopText = lang('default-range');
385
+ else if (opt.minDays)
386
+ defaultTopText = lang('default-more');
387
+ else if (opt.maxDays)
388
+ defaultTopText = lang('default-less');
389
+ else
390
+ defaultTopText = lang('default-default');
391
+
392
+ box.find('.default-top').html( defaultTopText.replace(/\%d/,opt.minDays).replace(/\%d/,opt.maxDays));
393
+
394
+
395
+
396
+
397
+ setTimeout(function()
398
+ {
399
+ initiated = true;
400
+ },0);
401
+
402
+ box.click(function(evt)
403
+ {
404
+ evt.stopPropagation();
405
+ });
406
+
407
+ $(document).bind('click.datepicker',closeDatePicker);
408
+
409
+ box.find('.next').click(function()
410
+ {
411
+ var isMonth2 = $(this).parents('table').hasClass('month2');
412
+ var month = isMonth2 ? opt.month2 : opt.month1;
413
+ month = nextMonth(month);
414
+ if (!opt.singleDate && !isMonth2 && compare_month(month,opt.month2) >= 0) return;
415
+ showMonth(month,isMonth2 ? 'month2' : 'month1');
416
+ showGap();
417
+ });
418
+
419
+ box.find('.prev').click(function()
420
+ {
421
+ var isMonth2 = $(this).parents('table').hasClass('month2');
422
+ var month = isMonth2 ? opt.month2 : opt.month1;
423
+ month = prevMonth(month);
424
+ //if (isMonth2 && month.getFullYear()+''+month.getMonth() <= opt.month1.getFullYear()+''+opt.month1.getMonth()) return;
425
+ if (isMonth2 && compare_month(month,opt.month1) <= 0) return;
426
+ showMonth(month,isMonth2 ? 'month2' : 'month1');
427
+ showGap();
428
+ });
429
+
430
+
431
+ box.bind('click',function(evt)
432
+ {
433
+ if ($(evt.target).hasClass('day'))
434
+ {
435
+ dayClicked($(evt.target));
436
+ }
437
+ });
438
+
439
+ box.attr('unselectable', 'on')
440
+ .css('user-select', 'none')
441
+ .bind('selectstart', function(e)
442
+ {
443
+ e.preventDefault(); return false;
444
+ });
445
+
446
+ box.find('.apply-btn').click(function()
447
+ {
448
+ closeDatePicker();
449
+ var dateRange = getDateString(new Date(opt.start))+ opt.separator +getDateString(new Date(opt.end));
450
+ $(self).trigger('datepicker-apply',
451
+ {
452
+ 'value': dateRange,
453
+ 'date1' : new Date(opt.start),
454
+ 'date2' : new Date(opt.end)
455
+ });
456
+ });
457
+
458
+ box.find('[shortcut]').click(function()
459
+ {
460
+ var shortcut = $(this).attr('shortcut');
461
+ var end = new Date(),start = false;
462
+ if (shortcut.indexOf('day') != -1)
463
+ {
464
+ var day = parseInt(shortcut.split(',',2)[1],10);
465
+ start = new Date(new Date().getTime() + 86400000*day);
466
+ end = new Date(end.getTime() + 86400000*(day>0?1:-1) );
467
+ }
468
+ else if (shortcut.indexOf('week')!= -1)
469
+ {
470
+ var dir = shortcut.indexOf('prev,') != -1 ? -1 : 1;
471
+
472
+ if (dir == 1)
473
+ var stopDay = opt.startOfWeek == 'monday' ? 1 : 0;
474
+ else
475
+ var stopDay = opt.startOfWeek == 'monday' ? 0 : 6;
476
+
477
+ end = new Date(end.getTime() - 86400000);
478
+ while(end.getDay() != stopDay) end = new Date(end.getTime() + dir*86400000);
479
+ start = new Date(end.getTime() + dir*86400000*6);
480
+ }
481
+ else if (shortcut.indexOf('month') != -1)
482
+ {
483
+ var dir = shortcut.indexOf('prev,') != -1 ? -1 : 1;
484
+ if (dir == 1)
485
+ start = nextMonth(end);
486
+ else
487
+ start = prevMonth(end);
488
+ start.setDate(1);
489
+ end = nextMonth(start);
490
+ end.setDate(1);
491
+ end = new Date(end.getTime() - 86400000);
492
+ }
493
+ else if (shortcut.indexOf('year') != -1)
494
+ {
495
+ var dir = shortcut.indexOf('prev,') != -1 ? -1 : 1;
496
+ start = new Date();
497
+ start.setFullYear(end.getFullYear() + dir);
498
+ start.setMonth(0);
499
+ start.setDate(1);
500
+ end.setFullYear(end.getFullYear() + dir);
501
+ end.setMonth(11);
502
+ end.setDate(31);
503
+ }
504
+ else if (shortcut == 'custom')
505
+ {
506
+ var name = $(this).html();
507
+ if (opt.customShortcuts && opt.customShortcuts.length > 0)
508
+ {
509
+ for(var i=0;i<opt.customShortcuts.length;i++)
510
+ {
511
+ var sh = opt.customShortcuts[i];
512
+ if (sh.name == name)
513
+ {
514
+ var data = [];
515
+ // try
516
+ // {
517
+ data = sh['dates'].call();
518
+ //}catch(e){}
519
+ if (data && data.length == 2)
520
+ {
521
+ start = data[0];
522
+ end = data[1];
523
+ }
524
+
525
+ // if only one date is specified then just move calendars there
526
+ // move calendars to show this date's month and next months
527
+ if (data && data.length == 1)
528
+ {
529
+ movetodate = data[0];
530
+ showMonth(movetodate,'month1');
531
+ showMonth(nextMonth(movetodate),'month2');
532
+ showGap();
533
+ }
534
+
535
+ break;
536
+ }
537
+ }
538
+ }
539
+ }
540
+ if (start && end)
541
+ {
542
+ setDateRange(start,end);
543
+ checkSelectionValid();
544
+ }
545
+ });
546
+
547
+ box.find(".time1 input[type=range]").bind("change mousemove", function (e) {
548
+ var target = e.target,
549
+ hour = target.name == "hour" ? $(target).val().replace(/^(\d{1})$/, "0$1") : undefined,
550
+ min = target.name == "minute" ? $(target).val().replace(/^(\d{1})$/, "0$1") : undefined;
551
+ setTime("time1", hour, min);
552
+ });
553
+
554
+ box.find(".time2 input[type=range]").bind("change mousemove", function (e) {
555
+ var target = e.target,
556
+ hour = target.name == "hour" ? $(target).val().replace(/^(\d{1})$/, "0$1") : undefined,
557
+ min = target.name == "minute" ? $(target).val().replace(/^(\d{1})$/, "0$1") : undefined;
558
+ setTime("time2", hour, min);
559
+ });
560
+
561
+ }
562
+
563
+
564
+ function calcPosition()
565
+ {
566
+ if (!opt.inline)
567
+ {
568
+ var offset = $(self).offset();
569
+ if (offset.left < 460) //left to right
570
+ {
571
+ box.css(
572
+ {
573
+ top: offset.top+$(self).outerHeight() + parseInt($('body').css('border-top') || 0,10 ),
574
+ left: offset.left
575
+ });
576
+ }
577
+ else
578
+ {
579
+ box.css(
580
+ {
581
+ top: offset.top+$(self).outerHeight() + parseInt($('body').css('border-top') || 0,10 ),
582
+ left: offset.left + $(self).width() - box.width() - 16
583
+ });
584
+ }
585
+ }
586
+ }
587
+
588
+ function open(animationTime)
589
+ {
590
+ calcPosition();
591
+ var __default_string = opt.getValue.call(selfDom);
592
+ var defaults = __default_string ? __default_string.split( opt.separator ) : '';
593
+
594
+ if (defaults && defaults.length >= 2)
595
+ {
596
+ var ___format = opt.format;
597
+ if (___format.match(/Do/))
598
+ {
599
+ ___format = ___format.replace(/Do/,'D');
600
+ defaults[0] = defaults[0].replace(/(\d+)(th|nd|st)/,'$1');
601
+ defaults[1] = defaults[1].replace(/(\d+)(th|nd|st)/,'$1');
602
+ }
603
+ // set initiated to avoid triggerring datepicker-change event
604
+ initiated = false;
605
+ setDateRange(moment(defaults[0], ___format).toDate(),moment(defaults[1], ___format).toDate());
606
+ initiated = true;
607
+ }
608
+ box.slideDown(animationTime);
609
+ }
610
+
611
+
612
+
613
+ function renderTime (name, date) {
614
+ box.find("." + name + " input[type=range].hour-range").val(moment(date).hours());
615
+ box.find("." + name + " input[type=range].minute-range").val(moment(date).minutes());
616
+ setTime(name, moment(date).format("HH"), moment(date).format("mm"));
617
+ }
618
+
619
+ function changeTime (name, date) {
620
+ opt[name] = parseInt(
621
+ moment(parseInt(date))
622
+ .startOf('day')
623
+ .add('h', moment(opt[name + "Time"]).format("HH"))
624
+ .add('m', moment(opt[name + "Time"]).format("mm")).valueOf()
625
+ );
626
+ }
627
+
628
+ function swapTime () {
629
+ renderTime("time1", opt.start);
630
+ renderTime("time2", opt.end);
631
+ }
632
+
633
+ function setTime (name, hour, minute) {
634
+ hour && (box.find("." + name + " .hour-val").text(hour));
635
+ minute && (box.find("." + name + " .minute-val").text(minute));
636
+ switch (name) {
637
+ case "time1":
638
+ if (opt.start) {
639
+ setRange("start", moment(opt.start));
640
+ }
641
+ setRange("startTime", moment(opt.startTime || moment().valueOf()));
642
+ break;
643
+ case "time2":
644
+ if (opt.end) {
645
+ setRange("end", moment(opt.end));
646
+ }
647
+ setRange("endTime", moment(opt.endTime || moment().valueOf()));
648
+ break;
649
+ }
650
+ function setRange(name, timePoint) {
651
+ var h = timePoint.format("HH"),
652
+ m = timePoint.format("mm");
653
+ opt[name] = timePoint
654
+ .startOf('day')
655
+ .add("h", hour || h)
656
+ .add("m", minute || m)
657
+ .valueOf();
658
+ }
659
+ checkSelectionValid();
660
+ showSelectedInfo();
661
+ showSelectedDays();
662
+ }
663
+
664
+ function clearSelection()
665
+ {
666
+ opt.start = false;
667
+ opt.end = false;
668
+ box.find('.day.checked').removeClass('checked');
669
+ opt.setValue.call(selfDom, '');
670
+ checkSelectionValid();
671
+ showSelectedInfo();
672
+ showSelectedDays();
673
+ }
674
+
675
+ function handleStart(time)
676
+ {
677
+ var r = time;
678
+ if (opt.batchMode === 'week-range') {
679
+ if (opt.startOfWeek === 'monday') {
680
+ r = moment(parseInt(time)).startOf('isoweek').valueOf();
681
+ } else {
682
+ r = moment(parseInt(time)).startOf('week').valueOf();
683
+ }
684
+ } else if (opt.batchMode === 'month-range') {
685
+ r = moment(parseInt(time)).startOf('month').valueOf();
686
+ }
687
+
688
+ return r;
689
+ }
690
+
691
+ function handleEnd(time)
692
+ {
693
+ var r = time;
694
+ if (opt.batchMode === 'week-range') {
695
+ if (opt.startOfWeek === 'monday') {
696
+ r = moment(parseInt(time)).endOf('isoweek').valueOf();
697
+ } else {
698
+ r = moment(parseInt(time)).endOf('week').valueOf();
699
+ }
700
+ } else if (opt.batchMode === 'month') {
701
+ r = moment(parseInt(time)).endOf('month').valueOf();
702
+ }
703
+
704
+ return r;
705
+ }
706
+
707
+
708
+ function dayClicked(day)
709
+ {
710
+ if (day.hasClass('invalid')) return;
711
+ var time = day.attr('time');
712
+ day.addClass('checked');
713
+ if ( opt.singleDate )
714
+ {
715
+ opt.start = time;
716
+ opt.end = false;
717
+ if (opt.time.enabled) {
718
+ changeTime("start", opt.start);
719
+ }
720
+ }
721
+ else if (opt.batchMode === 'week')
722
+ {
723
+ if (opt.startOfWeek === 'monday') {
724
+ opt.start = moment(parseInt(time)).startOf('isoweek').valueOf();
725
+ opt.end = moment(parseInt(time)).endOf('isoweek').valueOf();
726
+ } else {
727
+ opt.end = moment(parseInt(time)).endOf('week').valueOf();
728
+ opt.start = moment(parseInt(time)).startOf('week').valueOf();
729
+ }
730
+ }
731
+ else if (opt.batchMode === 'month')
732
+ {
733
+ opt.start = moment(parseInt(time)).startOf('month').valueOf();
734
+ opt.end = moment(parseInt(time)).endOf('month').valueOf();
735
+ }
736
+ else if ((opt.start && opt.end) || (!opt.start && !opt.end) )
737
+ {
738
+ opt.start = handleStart(time);
739
+ opt.end = false;
740
+ if (opt.time.enabled) {
741
+ changeTime("start", opt.start);
742
+ }
743
+ }
744
+ else if (opt.start)
745
+ {
746
+ opt.end = handleEnd(time);
747
+ if (opt.time.enabled) {
748
+ changeTime("end", opt.end);
749
+ }
750
+ }
751
+
752
+ if (!opt.singleDate && opt.start && opt.end && opt.start > opt.end)
753
+ {
754
+ var tmp = opt.end;
755
+ opt.end = handleEnd(opt.start);
756
+ opt.start = handleStart(tmp);
757
+ if (opt.time.enabled) {
758
+ swapTime();
759
+ }
760
+ }
761
+
762
+ opt.start = parseInt(opt.start);
763
+ opt.end = parseInt(opt.end);
764
+
765
+ checkSelectionValid();
766
+ showSelectedInfo();
767
+ showSelectedDays();
768
+ autoclose();
769
+ }
770
+
771
+ function autoclose () {
772
+ if (opt.singleDate === true) {
773
+ if (initiated && opt.start )
774
+ {
775
+ if (opt.autoClose) closeDatePicker();
776
+ }
777
+ } else {
778
+ if (initiated && opt.start && opt.end)
779
+ {
780
+ if (opt.autoClose) closeDatePicker();
781
+ }
782
+ }
783
+ }
784
+
785
+ function checkSelectionValid()
786
+ {
787
+ var days = Math.ceil( (opt.end - opt.start) / 86400000 ) + 1;
788
+ if (opt.singleDate) { // Validate if only start is there
789
+ if (opt.start && !opt.end)
790
+ box.find('.drp_top-bar').removeClass('error').addClass('normal');
791
+ else
792
+ box.find('.drp_top-bar').removeClass('error').removeClass('normal');
793
+ }
794
+ else if ( opt.maxDays && days > opt.maxDays)
795
+ {
796
+ opt.start = false;
797
+ opt.end = false;
798
+ box.find('.day').removeClass('checked');
799
+ box.find('.drp_top-bar').removeClass('normal').addClass('error').find('.error-top').html( lang('less-than').replace('%d',opt.maxDays) );
800
+ }
801
+ else if ( opt.minDays && days < opt.minDays)
802
+ {
803
+ opt.start = false;
804
+ opt.end = false;
805
+ box.find('.day').removeClass('checked');
806
+ box.find('.drp_top-bar').removeClass('normal').addClass('error').find('.error-top').html( lang('more-than').replace('%d',opt.minDays) );
807
+ }
808
+ else
809
+ {
810
+ if (opt.start || opt.end)
811
+ box.find('.drp_top-bar').removeClass('error').addClass('normal');
812
+ else
813
+ box.find('.drp_top-bar').removeClass('error').removeClass('normal');
814
+ }
815
+
816
+ if ( (opt.singleDate && opt.start && !opt.end) || (!opt.singleDate && opt.start && opt.end) )
817
+ {
818
+ box.find('.apply-btn').removeClass('disabled');
819
+ }
820
+ else
821
+ {
822
+ box.find('.apply-btn').addClass('disabled');
823
+ }
824
+
825
+ if (opt.batchMode)
826
+ {
827
+ if ( (opt.start && opt.startDate && compare_day(opt.start, opt.startDate) < 0)
828
+ || (opt.end && opt.endDate && compare_day(opt.end, opt.endDate) > 0) )
829
+ {
830
+ opt.start = false;
831
+ opt.end = false;
832
+ box.find('.day').removeClass('checked');
833
+ }
834
+ }
835
+ }
836
+
837
+ function showSelectedInfo()
838
+ {
839
+ box.find('.start-day').html('...');
840
+ box.find('.end-day').html('...');
841
+ box.find('.selected-days').hide();
842
+ if (opt.start)
843
+ {
844
+ box.find('.start-day').html(getDateString(new Date(parseInt(opt.start))));
845
+ }
846
+ if (opt.end)
847
+ {
848
+ box.find('.end-day').html(getDateString(new Date(parseInt(opt.end))));
849
+ }
850
+
851
+ if (opt.start && opt.singleDate)
852
+ {
853
+ box.find('.apply-btn').removeClass('disabled');
854
+ var dateRange = getDateString(new Date(opt.start));
855
+ opt.setValue.call(selfDom, dateRange, getDateString(new Date(opt.start)), getDateString(new Date(opt.end)));
856
+
857
+ if (initiated)
858
+ {
859
+ $(self).trigger('datepicker-change',
860
+ {
861
+ 'value': dateRange,
862
+ 'date1' : new Date(opt.start)
863
+ });
864
+ }
865
+ }
866
+ else if (opt.start && opt.end)
867
+ {
868
+ box.find('.selected-days').show().find('.selected-days-num').html(Math.round((opt.end-opt.start)/86400000)+1);
869
+ box.find('.apply-btn').removeClass('disabled');
870
+ var dateRange = getDateString(new Date(opt.start))+ opt.separator +getDateString(new Date(opt.end));
871
+ opt.setValue.call(selfDom,dateRange, getDateString(new Date(opt.start)), getDateString(new Date(opt.end)));
872
+ if (initiated)
873
+ {
874
+ $(self).trigger('datepicker-change',
875
+ {
876
+ 'value': dateRange,
877
+ 'date1' : new Date(opt.start),
878
+ 'date2' : new Date(opt.end)
879
+ });
880
+ }
881
+ }
882
+ else
883
+ {
884
+ box.find('.apply-btn').addClass('disabled');
885
+ }
886
+ }
887
+
888
+ function setDateRange(date1,date2)
889
+ {
890
+ if (date1.getTime() > date2.getTime())
891
+ {
892
+ var tmp = date2;
893
+ date2 = date1;
894
+ date1 = tmp;
895
+ tmp = null;
896
+ }
897
+ var valid = true;
898
+ if (opt.startDate && compare_day(date1,opt.startDate) < 0) valid = false;
899
+ if (opt.endDate && compare_day(date2,opt.endDate) > 0) valid = false;
900
+ if (!valid)
901
+ {
902
+ showMonth(opt.startDate,'month1');
903
+ showMonth(nextMonth(opt.startDate),'month2');
904
+ showGap();
905
+ return;
906
+ }
907
+
908
+ opt.start = date1.getTime();
909
+ opt.end = date2.getTime();
910
+ if (compare_month(date1,date2) == 0)
911
+ {
912
+ date2 = nextMonth(date1);
913
+ }
914
+ if (opt.time.enabled) {
915
+ renderTime("time1", date1);
916
+ renderTime("time2", date2);
917
+ }
918
+ showMonth(date1,'month1');
919
+ showMonth(date2,'month2');
920
+ showGap();
921
+ showSelectedInfo();
922
+ autoclose();
923
+ }
924
+
925
+ function showSelectedDays()
926
+ {
927
+ if (!opt.start && !opt.end) return;
928
+ box.find('.day').each(function()
929
+ {
930
+ var time = parseInt($(this).attr('time')),
931
+ start = opt.start,
932
+ end = opt.end;
933
+ if (opt.time.enabled) {
934
+ time = moment(time).startOf('day').valueOf();
935
+ start = moment(start || moment().valueOf()).startOf('day').valueOf();
936
+ end = moment(end || moment().valueOf()).startOf('day').valueOf();
937
+ }
938
+ if (
939
+ (opt.start && opt.end && end >= time && start <= time )
940
+ || ( opt.start && !opt.end && moment(start).format('YYYY-MM-DD') == moment(time).format('YYYY-MM-DD') )
941
+ )
942
+ {
943
+ $(this).addClass('checked');
944
+ }
945
+ else
946
+ {
947
+ $(this).removeClass('checked');
948
+ }
949
+ });
950
+ }
951
+
952
+ function showMonth(date,month)
953
+ {
954
+ date = moment(date).toDate();
955
+ var monthName = nameMonth(date.getMonth());
956
+ box.find('.'+month+' .month-name').html(monthName+' '+date.getFullYear());
957
+ box.find('.'+month+' tbody').html(createMonthHTML(date));
958
+ opt[month] = date;
959
+ }
960
+
961
+ function showTime(date,name)
962
+ {
963
+ box.find('.' + name).append(getTimeHTML());
964
+ renderTime(name, date);
965
+ }
966
+
967
+ function nameMonth(m)
968
+ {
969
+ return lang('month-name')[m];
970
+ }
971
+
972
+ function getDateString(d)
973
+ {
974
+ return moment(d).format(opt.format);
975
+ }
976
+
977
+ function showGap()
978
+ {
979
+ showSelectedDays();
980
+ var m1 = parseInt(moment(opt.month1).format('YYYYMM'));
981
+ var m2 = parseInt(moment(opt.month2).format('YYYYMM'));
982
+ var p = Math.abs(m1 - m2);
983
+ var shouldShow = (p > 1 && p !=89);
984
+ if (shouldShow)
985
+ box.find('.gap').show();
986
+ else
987
+ box.find('.gap').hide();
988
+ }
989
+
990
+ function closeDatePicker()
991
+ {
992
+ if (opt.alwaysOpen) return;
993
+ $(box).slideUp(200,function()
994
+ {
995
+ $(self).data('date-picker-opened',false);
996
+ });
997
+ //$(document).unbind('.datepicker');
998
+ $(self).trigger('datepicker-close');
999
+ }
1000
+
1001
+ function compare_month(m1,m2)
1002
+ {
1003
+ var p = parseInt(moment(m1).format('YYYYMM')) - parseInt(moment(m2).format('YYYYMM'));
1004
+ if (p > 0 ) return 1;
1005
+ if (p == 0) return 0;
1006
+ return -1;
1007
+ }
1008
+
1009
+ function compare_day(m1,m2)
1010
+ {
1011
+ var p = parseInt(moment(m1).format('YYYYMMDD')) - parseInt(moment(m2).format('YYYYMMDD'));
1012
+ if (p > 0 ) return 1;
1013
+ if (p == 0) return 0;
1014
+ return -1;
1015
+ }
1016
+
1017
+ function nextMonth(month)
1018
+ {
1019
+ month = moment(month).toDate();
1020
+ var toMonth = month.getMonth();
1021
+ while(month.getMonth() == toMonth) month = new Date(month.getTime()+86400000);
1022
+ return month;
1023
+ }
1024
+
1025
+ function prevMonth(month)
1026
+ {
1027
+ month = moment(month).toDate();
1028
+ var toMonth = month.getMonth();
1029
+ while(month.getMonth() == toMonth) month = new Date(month.getTime()-86400000);
1030
+ return month;
1031
+ }
1032
+
1033
+ function getTimeHTML()
1034
+ {
1035
+ var timeHtml = '<div>'
1036
+ +'<span>Time: <span class="hour-val">00</span>:<span class="minute-val">00</span></span>'
1037
+ +'</div>'
1038
+ +'<div class="hour">'
1039
+ +'<label>Hour: <input type="range" class="hour-range" name="hour" min="0" max="23"></label>'
1040
+ +'</div>'
1041
+ +'<div class="minute">'
1042
+ +'<label>Minute: <input type="range" class="minute-range" name="minute" min="0" max="59"></label>'
1043
+ +'</div>';
1044
+ return timeHtml;
1045
+ }
1046
+
1047
+ function createDom()
1048
+ {
1049
+ var html = '<div class="date-picker-wrapper'
1050
+ if ( opt.singleDate ) html += ' single-date';
1051
+ if ( !opt.showShortcuts ) html += ' no-shortcuts ';
1052
+ html += '">'
1053
+ +'<div class="drp_top-bar">\
1054
+ <div class="normal-top">\
1055
+ <span style="color:#333">'+lang('selected')+' </span> <b class="start-day">...</b>'
1056
+ if ( ! opt.singleDate ) {
1057
+ html += ' <span class="separator-day">'+opt.separator+'</span> <b class="end-day">...</b> <i class="selected-days">(<span class="selected-days-num">3</span> '+lang('days')+')</i>'
1058
+ }
1059
+ html += '</div>\
1060
+ <div class="error-top">error</div>\
1061
+ <div class="default-top">default</div>\
1062
+ <input type="button" class="apply-btn disabled '+ getHideClass() +'" value="'+lang('apply')+'" />\
1063
+ </div>'
1064
+ +'<div class="month-wrapper">'
1065
+ +'<table class="month1" cellspacing="0" border="0" cellpadding="0"><thead><tr class="caption"><th style="width:27px;"><span class="prev">&lt;</span></th><th colspan="5" class="month-name">January, 2011</th><th style="width:27px;"><span class="next">&gt;</span></th></tr><tr class="week-name">'+getWeekHead()+'</thead><tbody></tbody></table>'
1066
+ if ( ! opt.singleDate ) {
1067
+ html += '<div class="gap">'+getGapHTML()+'</div>'
1068
+ +'<table class="month2" cellspacing="0" border="0" cellpadding="0"><thead><tr class="caption"><th style="width:27px;"><span class="prev">&lt;</span></th><th colspan="5" class="month-name">January, 2011</th><th style="width:27px;"><span class="next">&gt;</span></th></tr><tr class="week-name">'+getWeekHead()+'</thead><tbody></tbody></table>'
1069
+ }
1070
+ //+'</div>'
1071
+ html += '<div style="clear:both;height:0;font-size:0;"></div>'
1072
+ +'<div class="time">'
1073
+ +'<div class="time1"></div>'
1074
+ if ( ! opt.singleDate ) {
1075
+ html += '<div class="time2"></div>'
1076
+ }
1077
+ html += '</div>'
1078
+ +'<div style="clear:both;height:0;font-size:0;"></div>'
1079
+ +'</div>';
1080
+
1081
+ if (opt.showShortcuts)
1082
+ {
1083
+ html += '<div class="footer"><b>'+lang('shortcuts')+'</b>';
1084
+
1085
+ var data = opt.shortcuts;
1086
+ if (data)
1087
+ {
1088
+ if (data['prev-days'] && data['prev-days'].length > 0)
1089
+ {
1090
+ html += '&nbsp;<span class="prev-days">'+lang('past');
1091
+ for(var i=0;i<data['prev-days'].length; i++)
1092
+ {
1093
+ var name = data['prev-days'][i];
1094
+ name += (data['prev-days'][i] > 1) ? lang('days') : lang('day');
1095
+ html += ' <a href="javascript:;" shortcut="day,-'+data['prev-days'][i]+'">'+name+'</a>';
1096
+ }
1097
+ html+='</span>';
1098
+ }
1099
+
1100
+ if (data['next-days'] && data['next-days'].length > 0)
1101
+ {
1102
+ html += '&nbsp;<span class="next-days">'+lang('following');
1103
+ for(var i=0;i<data['next-days'].length; i++)
1104
+ {
1105
+ var name = data['next-days'][i];
1106
+ name += (data['next-days'][i] > 1) ? lang('days') : lang('day');
1107
+ html += ' <a href="javascript:;" shortcut="day,'+data['next-days'][i]+'">'+name+'</a>';
1108
+ }
1109
+ html+= '</span>';
1110
+ }
1111
+
1112
+ if (data['prev'] && data['prev'].length > 0)
1113
+ {
1114
+ html += '&nbsp;<span class="prev-buttons">'+lang('previous');
1115
+ for(var i=0;i<data['prev'].length; i++)
1116
+ {
1117
+ var name = lang('prev-'+data['prev'][i]);
1118
+ html += ' <a href="javascript:;" shortcut="prev,'+data['prev'][i]+'">'+name+'</a>';
1119
+ }
1120
+ html+='</span>';
1121
+ }
1122
+
1123
+ if (data['next'] && data['next'].length > 0)
1124
+ {
1125
+ html += '&nbsp;<span class="next-buttons">'+lang('next');
1126
+ for(var i=0;i<data['next'].length; i++)
1127
+ {
1128
+ var name = lang('next-'+data['next'][i]);
1129
+ html += ' <a href="javascript:;" shortcut="next,'+data['next'][i]+'">'+name+'</a>';
1130
+ }
1131
+ html+='</span>';
1132
+ }
1133
+ }
1134
+
1135
+ if (opt.customShortcuts)
1136
+ {
1137
+ for(var i=0;i<opt.customShortcuts.length; i++)
1138
+ {
1139
+ var sh = opt.customShortcuts[i];
1140
+ html+= '&nbsp;<span class="custom-shortcut"><a href="javascript:;" shortcut="custom">'+sh.name+'</a></span>';
1141
+ }
1142
+ }
1143
+
1144
+ html +='</div>';
1145
+ }
1146
+ html += '</div>';
1147
+
1148
+
1149
+ return $(html);
1150
+ }
1151
+
1152
+ function getHideClass()
1153
+ {
1154
+ if (opt.autoClose === true) {
1155
+ return 'hide';
1156
+ }
1157
+ return '';
1158
+ }
1159
+
1160
+ function getWeekHead()
1161
+ {
1162
+ if (opt.startOfWeek == 'monday')
1163
+ {
1164
+ return '<th>'+lang('week-1')+'</th>\
1165
+ <th>'+lang('week-2')+'</th>\
1166
+ <th>'+lang('week-3')+'</th>\
1167
+ <th>'+lang('week-4')+'</th>\
1168
+ <th>'+lang('week-5')+'</th>\
1169
+ <th>'+lang('week-6')+'</th>\
1170
+ <th>'+lang('week-7')+'</th>';
1171
+ }
1172
+ else
1173
+ {
1174
+ return '<th>'+lang('week-7')+'</th>\
1175
+ <th>'+lang('week-1')+'</th>\
1176
+ <th>'+lang('week-2')+'</th>\
1177
+ <th>'+lang('week-3')+'</th>\
1178
+ <th>'+lang('week-4')+'</th>\
1179
+ <th>'+lang('week-5')+'</th>\
1180
+ <th>'+lang('week-6')+'</th>';
1181
+ }
1182
+ }
1183
+
1184
+ function getGapHTML()
1185
+ {
1186
+ var html = ['<div class="gap-top-mask"></div><div class="gap-bottom-mask"></div><div class="gap-lines">'];
1187
+ for(var i=0;i<20;i++)
1188
+ {
1189
+ html.push('<div class="gap-line">\
1190
+ <div class="gap-1"></div>\
1191
+ <div class="gap-2"></div>\
1192
+ <div class="gap-3"></div>\
1193
+ </div>');
1194
+ }
1195
+ html.push('</div>');
1196
+ return html.join('');
1197
+ }
1198
+
1199
+ function createMonthHTML(d)
1200
+ {
1201
+ var days = [];
1202
+ d.setDate(1);
1203
+ var lastMonth = new Date(d.getTime() - 86400000);
1204
+ var now = new Date();
1205
+
1206
+ var dayOfWeek = d.getDay();
1207
+ if((dayOfWeek == 0) && (opt.startOfWeek == 'monday')) {
1208
+ // add one week
1209
+ dayOfWeek = 7;
1210
+ }
1211
+
1212
+ if (dayOfWeek > 0)
1213
+ {
1214
+ for (var i = dayOfWeek; i > 0; i--)
1215
+ {
1216
+ var day = new Date(d.getTime() - 86400000*i);
1217
+ var valid = true;
1218
+ if (opt.startDate && compare_day(day,opt.startDate) < 0) valid = false;
1219
+ if (opt.endDate && compare_day(day,opt.endDate) > 0) valid = false;
1220
+ days.push({type:'lastMonth',day: day.getDate(),time:day.getTime(), valid:valid });
1221
+ }
1222
+ }
1223
+ var toMonth = d.getMonth();
1224
+ for(var i=0; i<40; i++)
1225
+ {
1226
+ var today = moment(d).add('days', i).toDate();
1227
+ var valid = true;
1228
+ if (opt.startDate && compare_day(today,opt.startDate) < 0) valid = false;
1229
+ if (opt.endDate && compare_day(today,opt.endDate) > 0) valid = false;
1230
+ days.push({type: today.getMonth() == toMonth ? 'toMonth' : 'nextMonth',day: today.getDate(),time:today.getTime(), valid:valid });
1231
+ }
1232
+ var html = [];
1233
+ for(var week=0; week<6; week++)
1234
+ {
1235
+ if (days[week*7].type == 'nextMonth') break;
1236
+ html.push('<tr>');
1237
+ for(var day = 0; day<7; day++)
1238
+ {
1239
+ var _day = (opt.startOfWeek == 'monday') ? day+1 : day;
1240
+ var today = days[week*7+_day];
1241
+ var highlightToday = moment(today.time).format('L') == moment(now).format('L');
1242
+ today.extraClass = '';
1243
+ today.tooltip = '';
1244
+ if(opt.beforeShowDay && typeof opt.beforeShowDay == 'function')
1245
+ {
1246
+ var _r = opt.beforeShowDay(moment(today.time).toDate());
1247
+ today.valid = _r[0];
1248
+ today.extraClass = _r[1] || '';
1249
+ today.tooltip = _r[2] || '';
1250
+ if (today.tooltip != '') today.extraClass += ' has-tooltip ';
1251
+ }
1252
+ html.push('<td><div time="'+today.time+'" title="'+today.tooltip+'" class="day '+today.type+' '+today.extraClass+' '+(today.valid ? 'valid' : 'invalid')+' '+(highlightToday?'real-today':'')+'">'+today.day+'</div></td>');
1253
+ }
1254
+ html.push('</tr>');
1255
+ }
1256
+ return html.join('');
1257
+ }
1258
+
1259
+ function getLanguages()
1260
+ {
1261
+ if (opt.language == 'auto')
1262
+ {
1263
+ var language = navigator.language ? navigator.language : navigator.browserLanguage;
1264
+ if (!language) return $.dateRangePickerLanguages['en'];
1265
+ var language = language.toLowerCase();
1266
+ for(var key in $.dateRangePickerLanguages)
1267
+ {
1268
+ if (language.indexOf(key) != -1)
1269
+ {
1270
+ return $.dateRangePickerLanguages[key];
1271
+ }
1272
+ }
1273
+ return $.dateRangePickerLanguages['en'];
1274
+ }
1275
+ else if ( opt.language && opt.language in $.dateRangePickerLanguages)
1276
+ {
1277
+ return $.dateRangePickerLanguages[opt.language];
1278
+ }
1279
+ else
1280
+ {
1281
+ return $.dateRangePickerLanguages['en'];
1282
+ }
1283
+ }
1284
+
1285
+ function lang(t)
1286
+ {
1287
+ return (t in langs)? langs[t] : t;
1288
+ }
1289
+
1290
+
1291
+ };
1292
+ })(jQuery);