fae-railsz 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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);