jinda_mind 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +4 -0
  4. data/Rakefile +3 -0
  5. data/app/assets/config/manifest.js +4 -0
  6. data/app/assets/images/4dcity-old.ico +0 -0
  7. data/app/assets/images/4dcity.ico +0 -0
  8. data/app/assets/images/account.png +0 -0
  9. data/app/assets/images/add.png +0 -0
  10. data/app/assets/images/ajax-loader-circle.gif +0 -0
  11. data/app/assets/images/ajax-loader.gif +0 -0
  12. data/app/assets/images/anchor.png +0 -0
  13. data/app/assets/images/application_double.png +0 -0
  14. data/app/assets/images/application_form_edit.png +0 -0
  15. data/app/assets/images/arrow_left.png +0 -0
  16. data/app/assets/images/arrow_right.png +0 -0
  17. data/app/assets/images/arrow_turn_left.png +0 -0
  18. data/app/assets/images/arrow_turn_right.png +0 -0
  19. data/app/assets/images/calendar.png +0 -0
  20. data/app/assets/images/cancel.png +0 -0
  21. data/app/assets/images/chart_bar.png +0 -0
  22. data/app/assets/images/clock.png +0 -0
  23. data/app/assets/images/cog.png +0 -0
  24. data/app/assets/images/control_fastforward.png +0 -0
  25. data/app/assets/images/control_play.png +0 -0
  26. data/app/assets/images/cross.png +0 -0
  27. data/app/assets/images/delete.png +0 -0
  28. data/app/assets/images/external-link.png +0 -0
  29. data/app/assets/images/facebook-continue-button.png +0 -0
  30. data/app/assets/images/facebooksmall.png +0 -0
  31. data/app/assets/images/favicon.ico +0 -0
  32. data/app/assets/images/freemind(mm).png +0 -0
  33. data/app/assets/images/google-continue-button.png +0 -0
  34. data/app/assets/images/help.png +0 -0
  35. data/app/assets/images/highway-menu.png +0 -0
  36. data/app/assets/images/highway.png +0 -0
  37. data/app/assets/images/house.png +0 -0
  38. data/app/assets/images/icons-18-black.png +0 -0
  39. data/app/assets/images/icons-18-white.png +0 -0
  40. data/app/assets/images/icons-36-black.png +0 -0
  41. data/app/assets/images/icons-36-white.png +0 -0
  42. data/app/assets/images/logo.png +0 -0
  43. data/app/assets/images/logo_jinda.png +0 -0
  44. data/app/assets/images/logout.png +0 -0
  45. data/app/assets/images/new.gif +0 -0
  46. data/app/assets/images/new.png +0 -0
  47. data/app/assets/images/page.png +0 -0
  48. data/app/assets/images/page_attach.png +0 -0
  49. data/app/assets/images/page_green.png +0 -0
  50. data/app/assets/images/page_output.png +0 -0
  51. data/app/assets/images/page_pdf.png +0 -0
  52. data/app/assets/images/pencil.png +0 -0
  53. data/app/assets/images/printer.png +0 -0
  54. data/app/assets/images/refresh.png +0 -0
  55. data/app/assets/images/report.png +0 -0
  56. data/app/assets/images/rssmall.png +0 -0
  57. data/app/assets/images/tick.png +0 -0
  58. data/app/assets/images/twittersmall.png +0 -0
  59. data/app/assets/images/user.png +0 -0
  60. data/app/assets/images/user_admin_gear.png +0 -0
  61. data/app/assets/images/view_code.png +0 -0
  62. data/app/assets/javascripts/application.js-org +24 -0
  63. data/app/assets/javascripts/cable.js +13 -0
  64. data/app/assets/javascripts/disable_enter_key.js +10 -0
  65. data/app/assets/javascripts/iscroll-wrapper.js +32 -0
  66. data/app/assets/javascripts/iscroll.js +1084 -0
  67. data/app/assets/javascripts/jinda.js +14 -0
  68. data/app/assets/javascripts/jinda_jqm.js +24 -0
  69. data/app/assets/javascripts/jquery.mobile-1.2.1.js +9272 -0
  70. data/app/assets/javascripts/jquery.mobile.datebox.js +1778 -0
  71. data/app/assets/javascripts/jquery.mobile.splitview.js +695 -0
  72. data/app/assets/stylesheets/app.scss +90 -0
  73. data/app/assets/stylesheets/articles.scss +94 -0
  74. data/app/assets/stylesheets/fonts/sarabun.eot +0 -0
  75. data/app/assets/stylesheets/fonts/sarabun.ttf +0 -0
  76. data/app/assets/stylesheets/fonts/sarabun.woff +0 -0
  77. data/app/assets/stylesheets/fonts/sarabun_bold.ttf +0 -0
  78. data/app/assets/stylesheets/fonts/sarabun_bolditalic.ttf +0 -0
  79. data/app/assets/stylesheets/fonts/sarabun_italic.ttf +0 -0
  80. data/app/assets/stylesheets/fonts/thsarabunnew-webfont.eot +0 -0
  81. data/app/assets/stylesheets/fonts/thsarabunnew-webfont.ttf +0 -0
  82. data/app/assets/stylesheets/fonts/thsarabunnew-webfont.woff +0 -0
  83. data/app/assets/stylesheets/fonts/thsarabunnew.css +47 -0
  84. data/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.eot +0 -0
  85. data/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.ttf +0 -0
  86. data/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.woff +0 -0
  87. data/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.eot +0 -0
  88. data/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.ttf +0 -0
  89. data/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.woff +0 -0
  90. data/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.eot +0 -0
  91. data/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.ttf +0 -0
  92. data/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.woff +0 -0
  93. data/app/assets/stylesheets/images/ajax-loader.gif +0 -0
  94. data/app/assets/stylesheets/images/button_black.png +0 -0
  95. data/app/assets/stylesheets/images/button_blue.png +0 -0
  96. data/app/assets/stylesheets/images/button_red.png +0 -0
  97. data/app/assets/stylesheets/images/gears.png +0 -0
  98. data/app/assets/stylesheets/images/icons-18-black.png +0 -0
  99. data/app/assets/stylesheets/images/icons-18-white.png +0 -0
  100. data/app/assets/stylesheets/images/icons-36-black.png +0 -0
  101. data/app/assets/stylesheets/images/icons-36-white.png +0 -0
  102. data/app/assets/stylesheets/images/indicator.gif +0 -0
  103. data/app/assets/stylesheets/jinda.scss +185 -0
  104. data/app/assets/stylesheets/jinda_jqm.css.scss +32 -0
  105. data/app/assets/stylesheets/jquery.mobile-1.2.1.css +2339 -0
  106. data/app/assets/stylesheets/jquery.mobile.datebox.css +65 -0
  107. data/app/assets/stylesheets/jquery.mobile.grids.collapsible.css +122 -0
  108. data/app/assets/stylesheets/jquery.mobile.splitview.css +128 -0
  109. data/app/assets/stylesheets/kul-4.2.css +1516 -0
  110. data/app/assets/stylesheets/kul-4.2.min.css +11 -0
  111. data/app/assets/stylesheets/modules.scss +84 -0
  112. data/app/assets/stylesheets/sarabun.css +37 -0
  113. data/app/assets/stylesheets/social.scss +133 -0
  114. data/app/controllers/concerns/jinda_general_concern.rb +179 -0
  115. data/app/controllers/concerns/jinda_run_concern.rb +368 -0
  116. data/app/controllers/jinda_controller.rb +66 -0
  117. data/bin/console +14 -0
  118. data/bin/setup +8 -0
  119. data/config/mongoid.yml +19 -0
  120. data/config/routes.rb +44 -0
  121. data/lib/generators/jinda/USAGE +2 -0
  122. data/lib/generators/jinda/config_generator.rb +102 -0
  123. data/lib/generators/jinda/install_generator.rb +269 -0
  124. data/lib/generators/jinda/installer/gems_install.rb +132 -0
  125. data/lib/generators/jinda/installer/test.rb +6 -0
  126. data/lib/generators/jinda/minitest_generator.rb +30 -0
  127. data/lib/generators/jinda/rspec_generator.rb +30 -0
  128. data/lib/generators/jinda/templates/Dockerfile +26 -0
  129. data/lib/generators/jinda/templates/README.md +173 -0
  130. data/lib/generators/jinda/templates/app/assets/config/manifest.js +4 -0
  131. data/lib/generators/jinda/templates/app/assets/javascripts/application.js +15 -0
  132. data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +15 -0
  133. data/lib/generators/jinda/templates/app/channels/application_cable/channel.rb +4 -0
  134. data/lib/generators/jinda/templates/app/channels/application_cable/connection.rb +4 -0
  135. data/lib/generators/jinda/templates/app/controllers/api/v1/notes_controller.rb +81 -0
  136. data/lib/generators/jinda/templates/app/controllers/jinda_org/admins_controller.rb +6 -0
  137. data/lib/generators/jinda/templates/app/controllers/jinda_org/application_controller.rb +41 -0
  138. data/lib/generators/jinda/templates/app/controllers/jinda_org/articles_controller.rb +110 -0
  139. data/lib/generators/jinda/templates/app/controllers/jinda_org/comments_controller.rb +31 -0
  140. data/lib/generators/jinda/templates/app/controllers/jinda_org/docs_controller.rb +56 -0
  141. data/lib/generators/jinda/templates/app/controllers/jinda_org/identities_controller.rb +5 -0
  142. data/lib/generators/jinda/templates/app/controllers/jinda_org/notes_controller.rb +84 -0
  143. data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets.rb +28 -0
  144. data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets_controller.rb +34 -0
  145. data/lib/generators/jinda/templates/app/controllers/jinda_org/sessions_controller.rb +44 -0
  146. data/lib/generators/jinda/templates/app/controllers/jinda_org/sitemap_controller.rb +12 -0
  147. data/lib/generators/jinda/templates/app/controllers/jinda_org/users_controller.rb +35 -0
  148. data/lib/generators/jinda/templates/app/helpers/admins_helper.rb +2 -0
  149. data/lib/generators/jinda/templates/app/helpers/application_helper.rb +33 -0
  150. data/lib/generators/jinda/templates/app/helpers/articles_helper.rb +2 -0
  151. data/lib/generators/jinda/templates/app/helpers/basic_helper.rb +2 -0
  152. data/lib/generators/jinda/templates/app/helpers/comments_helper.rb +2 -0
  153. data/lib/generators/jinda/templates/app/helpers/ctrs_helper.rb +2 -0
  154. data/lib/generators/jinda/templates/app/helpers/devs_helper.rb +2 -0
  155. data/lib/generators/jinda/templates/app/helpers/pictures_helper.rb +2 -0
  156. data/lib/generators/jinda/templates/app/helpers/sitemap_helper.rb +2 -0
  157. data/lib/generators/jinda/templates/app/helpers/users_helper.rb +2 -0
  158. data/lib/generators/jinda/templates/app/jinda/index.mm +486 -0
  159. data/lib/generators/jinda/templates/app/jinda/template/index.mm +366 -0
  160. data/lib/generators/jinda/templates/app/jinda/template/linkview.haml +21 -0
  161. data/lib/generators/jinda/templates/app/jinda/template/view.html.erb +34 -0
  162. data/lib/generators/jinda/templates/app/mailers/application_mailer.rb +4 -0
  163. data/lib/generators/jinda/templates/app/mailers/jinda_mailer.rb +7 -0
  164. data/lib/generators/jinda/templates/app/mailers/note_mailer.rb +10 -0
  165. data/lib/generators/jinda/templates/app/mailers/user_mailer.rb +15 -0
  166. data/lib/generators/jinda/templates/app/models/address.rb +14 -0
  167. data/lib/generators/jinda/templates/app/models/article.rb +14 -0
  168. data/lib/generators/jinda/templates/app/models/comment.rb +14 -0
  169. data/lib/generators/jinda/templates/app/models/identity.rb +18 -0
  170. data/lib/generators/jinda/templates/app/models/jinda/doc.rb +36 -0
  171. data/lib/generators/jinda/templates/app/models/jinda/module.rb +11 -0
  172. data/lib/generators/jinda/templates/app/models/jinda/notice.rb +14 -0
  173. data/lib/generators/jinda/templates/app/models/jinda/role.rb +8 -0
  174. data/lib/generators/jinda/templates/app/models/jinda/runseq.rb +24 -0
  175. data/lib/generators/jinda/templates/app/models/jinda/service.rb +17 -0
  176. data/lib/generators/jinda/templates/app/models/jinda/xmain.rb +38 -0
  177. data/lib/generators/jinda/templates/app/models/note.rb +22 -0
  178. data/lib/generators/jinda/templates/app/models/param.rb +41 -0
  179. data/lib/generators/jinda/templates/app/models/person.rb +14 -0
  180. data/lib/generators/jinda/templates/app/models/user.rb +66 -0
  181. data/lib/generators/jinda/templates/app/views/adminbsbs/content.haml +241 -0
  182. data/lib/generators/jinda/templates/app/views/admins/edit_role/edit_role.html.erb +7 -0
  183. data/lib/generators/jinda/templates/app/views/admins/edit_role/select_user.html.erb +4 -0
  184. data/lib/generators/jinda/templates/app/views/api/v1/note.haml +0 -0
  185. data/lib/generators/jinda/templates/app/views/articles/_report.haml +35 -0
  186. data/lib/generators/jinda/templates/app/views/articles/edit.haml +23 -0
  187. data/lib/generators/jinda/templates/app/views/articles/edit_article/edit_article.html.erb +15 -0
  188. data/lib/generators/jinda/templates/app/views/articles/edit_article/select_article.html.erb +12 -0
  189. data/lib/generators/jinda/templates/app/views/articles/index.haml +5 -0
  190. data/lib/generators/jinda/templates/app/views/articles/my.haml +5 -0
  191. data/lib/generators/jinda/templates/app/views/articles/new_article/form_article.html.erb +16 -0
  192. data/lib/generators/jinda/templates/app/views/articles/show.html.haml +58 -0
  193. data/lib/generators/jinda/templates/app/views/articles/xedit_article/edit_article.html.erb +13 -0
  194. data/lib/generators/jinda/templates/app/views/ctrs/vfolder1/viewfile1.html.erb +23 -0
  195. data/lib/generators/jinda/templates/app/views/ctrs/vfolder1/viewfile2.html.erb +23 -0
  196. data/lib/generators/jinda/templates/app/views/ctrs/vfolder2/viewfile2.html.erb +23 -0
  197. data/lib/generators/jinda/templates/app/views/custom/_adsense.haml +6 -0
  198. data/lib/generators/jinda/templates/app/views/docs/doc_edit/doc_edit.html.erb +21 -0
  199. data/lib/generators/jinda/templates/app/views/docs/doc_edit/doc_select.html.erb +14 -0
  200. data/lib/generators/jinda/templates/app/views/docs/doc_new/doc_form.html.erb +32 -0
  201. data/lib/generators/jinda/templates/app/views/docs/doc_new/doc_form.md +36 -0
  202. data/lib/generators/jinda/templates/app/views/docs/doc_xedit/doc_edit.html.erb +21 -0
  203. data/lib/generators/jinda/templates/app/views/docs/edit/select_note.html.erb +14 -0
  204. data/lib/generators/jinda/templates/app/views/docs/index.haml +21 -0
  205. data/lib/generators/jinda/templates/app/views/docs/my.haml +27 -0
  206. data/lib/generators/jinda/templates/app/views/identities/new.html.haml +32 -0
  207. data/lib/generators/jinda/templates/app/views/jinda/_activity.md +10 -0
  208. data/lib/generators/jinda/templates/app/views/jinda/_menu.haml +27 -0
  209. data/lib/generators/jinda/templates/app/views/jinda/_menu_mm.haml +44 -0
  210. data/lib/generators/jinda/templates/app/views/jinda/_model.md +5 -0
  211. data/lib/generators/jinda/templates/app/views/jinda/_modul.md +9 -0
  212. data/lib/generators/jinda/templates/app/views/jinda/_pending_home.haml +5 -0
  213. data/lib/generators/jinda/templates/app/views/jinda/_pending_page.haml +24 -0
  214. data/lib/generators/jinda/templates/app/views/jinda/_service.md +24 -0
  215. data/lib/generators/jinda/templates/app/views/jinda/_static.haml +13 -0
  216. data/lib/generators/jinda/templates/app/views/jinda/doc-thai.md +37 -0
  217. data/lib/generators/jinda/templates/app/views/jinda/doc.md +36 -0
  218. data/lib/generators/jinda/templates/app/views/jinda/error_logs.haml +22 -0
  219. data/lib/generators/jinda/templates/app/views/jinda/feed.rss.builder +27 -0
  220. data/lib/generators/jinda/templates/app/views/jinda/help.haml +20 -0
  221. data/lib/generators/jinda/templates/app/views/jinda/index.html.haml +53 -0
  222. data/lib/generators/jinda/templates/app/views/jinda/logs.haml +22 -0
  223. data/lib/generators/jinda/templates/app/views/jinda/notice_logs.haml +18 -0
  224. data/lib/generators/jinda/templates/app/views/jinda/pending.haml +1 -0
  225. data/lib/generators/jinda/templates/app/views/jinda/run_form.haml +42 -0
  226. data/lib/generators/jinda/templates/app/views/jinda/run_output.haml +38 -0
  227. data/lib/generators/jinda/templates/app/views/jinda/search.haml +20 -0
  228. data/lib/generators/jinda/templates/app/views/jinda/status.haml +61 -0
  229. data/lib/generators/jinda/templates/app/views/jinda_mailer/gmail.html.erb +9 -0
  230. data/lib/generators/jinda/templates/app/views/layouts/_head.html.erb +10 -0
  231. data/lib/generators/jinda/templates/app/views/layouts/_meta_tag.html.erb +19 -0
  232. data/lib/generators/jinda/templates/app/views/layouts/application.haml +4 -0
  233. data/lib/generators/jinda/templates/app/views/layouts/bsb/_footer.haml +7 -0
  234. data/lib/generators/jinda/templates/app/views/layouts/bsb/_header.haml +147 -0
  235. data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu.haml +47 -0
  236. data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu_mm.haml +34 -0
  237. data/lib/generators/jinda/templates/app/views/layouts/bsb/_rightbar.haml +123 -0
  238. data/lib/generators/jinda/templates/app/views/layouts/bsb/_sidebar.haml +155 -0
  239. data/lib/generators/jinda/templates/app/views/layouts/bsb/application.haml-bsb +47 -0
  240. data/lib/generators/jinda/templates/app/views/layouts/gmail.html.erb +9 -0
  241. data/lib/generators/jinda/templates/app/views/layouts/jqm/_full.haml +33 -0
  242. data/lib/generators/jinda/templates/app/views/layouts/jqm/_page.haml +16 -0
  243. data/lib/generators/jinda/templates/app/views/layouts/jqm/application.haml-jqm +4 -0
  244. data/lib/generators/jinda/templates/app/views/layouts/mailer.html.erb +13 -0
  245. data/lib/generators/jinda/templates/app/views/layouts/mailer.html.haml +3 -0
  246. data/lib/generators/jinda/templates/app/views/layouts/mailer.text.erb +1 -0
  247. data/lib/generators/jinda/templates/app/views/layouts/mailer.text.haml +1 -0
  248. data/lib/generators/jinda/templates/app/views/layouts/mobile.html.erb +13 -0
  249. data/lib/generators/jinda/templates/app/views/layouts/mobilejq.html.erb +31 -0
  250. data/lib/generators/jinda/templates/app/views/layouts/print.html.erb +22 -0
  251. data/lib/generators/jinda/templates/app/views/layouts/utf8.html.erb +22 -0
  252. data/lib/generators/jinda/templates/app/views/note_mailer/gmail.html.haml +7 -0
  253. data/lib/generators/jinda/templates/app/views/note_mailer/gmail.text.haml +8 -0
  254. data/lib/generators/jinda/templates/app/views/notes/delete/select_note.html.erb +14 -0
  255. data/lib/generators/jinda/templates/app/views/notes/edit/edit_note.html.erb +10 -0
  256. data/lib/generators/jinda/templates/app/views/notes/edit/select_note.html.erb +14 -0
  257. data/lib/generators/jinda/templates/app/views/notes/index.haml +71 -0
  258. data/lib/generators/jinda/templates/app/views/notes/mail/display_mail.html.erb +20 -0
  259. data/lib/generators/jinda/templates/app/views/notes/mail/select_note.html.erb +19 -0
  260. data/lib/generators/jinda/templates/app/views/notes/mail/show.html.haml +13 -0
  261. data/lib/generators/jinda/templates/app/views/notes/my.haml +21 -0
  262. data/lib/generators/jinda/templates/app/views/notes/new/new_note.html.erb +13 -0
  263. data/lib/generators/jinda/templates/app/views/notes/show.haml +10 -0
  264. data/lib/generators/jinda/templates/app/views/notes/xedit/edit_note.html.erb +10 -0
  265. data/lib/generators/jinda/templates/app/views/password_resets/edit.html.erb +21 -0
  266. data/lib/generators/jinda/templates/app/views/password_resets/new.html.haml +11 -0
  267. data/lib/generators/jinda/templates/app/views/sessions/new.html.haml +22 -0
  268. data/lib/generators/jinda/templates/app/views/sitemap/index.xml.haml +10 -0
  269. data/lib/generators/jinda/templates/app/views/user_mailer/password_reset.html.haml +3 -0
  270. data/lib/generators/jinda/templates/app/views/user_mailer/password_reset.text.erb +3 -0
  271. data/lib/generators/jinda/templates/app/views/user_mailer/password_reset.text.haml +3 -0
  272. data/lib/generators/jinda/templates/app/views/users/index.haml +13 -0
  273. data/lib/generators/jinda/templates/app/views/users/pwd/enter.html.erb +6 -0
  274. data/lib/generators/jinda/templates/app/views/users/user/enter_user.html.erb +10 -0
  275. data/lib/generators/jinda/templates/config/cloudinary.yml +9 -0
  276. data/lib/generators/jinda/templates/config/initializers/fix_mongoid_generator.rb-org +14 -0
  277. data/lib/generators/jinda/templates/config/mongoid.yml-docker +182 -0
  278. data/lib/generators/jinda/templates/config/mongoid.yml-localhost +182 -0
  279. data/lib/generators/jinda/templates/db/seeds.rb +6 -0
  280. data/lib/generators/jinda/templates/docker-compose.yml +17 -0
  281. data/lib/generators/jinda/templates/dot/dot.env +2 -0
  282. data/lib/generators/jinda/templates/dotrspec +3 -0
  283. data/lib/generators/jinda/templates/entrypoint.sh +13 -0
  284. data/lib/generators/jinda/templates/jinda.yml +10 -0
  285. data/lib/generators/jinda/templates/public/404.html +67 -0
  286. data/lib/generators/jinda/templates/public/422.html +67 -0
  287. data/lib/generators/jinda/templates/public/500.html +66 -0
  288. data/lib/generators/jinda/templates/public/assets/images/logo.png +0 -0
  289. data/lib/generators/jinda/templates/public/favicon.ico +0 -0
  290. data/lib/generators/jinda/templates/public/robots.txt +3 -0
  291. data/lib/generators/jinda/templates/spec/controllers/api/v1_get_index_spec.rb +23 -0
  292. data/lib/generators/jinda/templates/spec/controllers/api/v1_get_my_spec.rb +14 -0
  293. data/lib/generators/jinda/templates/spec/controllers/api/v1_post_spec.rb +19 -0
  294. data/lib/generators/jinda/templates/spec/controllers/sessions_controller_spec.rb +98 -0
  295. data/lib/generators/jinda/templates/spec/features/userlogins_spec.rb +23 -0
  296. data/lib/generators/jinda/templates/spec/mailers/note_spec.rb +24 -0
  297. data/lib/generators/jinda/templates/spec/mailers/previews/note_preview.rb +9 -0
  298. data/lib/generators/jinda/templates/spec/models/note_spec.rb +41 -0
  299. data/lib/generators/jinda/templates/spec/models/user_spec.rb +12 -0
  300. data/lib/generators/jinda/templates/spec/rails_helper.rb +42 -0
  301. data/lib/generators/jinda/templates/spec/spec_helper.rb +80 -0
  302. data/lib/generators/jinda/templates/spec/support/authentication_helper.rb +20 -0
  303. data/lib/generators/jinda/templates/spec/support/databasecleaner.rb +13 -0
  304. data/lib/generators/jinda/templates/spec/support/factory_bot.rb +12 -0
  305. data/lib/generators/jinda/templates/spec/support/omniauth_macros.rb +38 -0
  306. data/lib/generators/jinda/templates/spec/support/request_spec_helper.rb +8 -0
  307. data/lib/generators/jinda/templates/spec/views/articles/_article.html.erb_spec.rbx +14 -0
  308. data/lib/generators/jinda/templates/test/application_system_test_case.rb +5 -0
  309. data/lib/generators/jinda/templates/test/integration/jinda_routes_test.rb +42 -0
  310. data/lib/generators/jinda/templates/test/test_helper.rb +6 -0
  311. data/lib/jinda/date_helpers.rb +109 -0
  312. data/lib/jinda/gem_helpers.rb +11 -0
  313. data/lib/jinda/gen_class.rb +13 -0
  314. data/lib/jinda/gen_freemind.rb +33 -0
  315. data/lib/jinda/gen_helpers.rb +141 -0
  316. data/lib/jinda/gen_models.rb +137 -0
  317. data/lib/jinda/gen_modules.rb +17 -0
  318. data/lib/jinda/gen_runseq.rb +71 -0
  319. data/lib/jinda/gen_services.rb +90 -0
  320. data/lib/jinda/gen_xmain.rb +38 -0
  321. data/lib/jinda/get_app.rb +34 -0
  322. data/lib/jinda/helpers.rb +26 -0
  323. data/lib/jinda/init_vars.rb +36 -0
  324. data/lib/jinda/railtie.rb +18 -0
  325. data/lib/jinda/rake_views.rb +63 -0
  326. data/lib/jinda/refresh.rb +67 -0
  327. data/lib/jinda/themes.rb +175 -0
  328. data/lib/jinda.rb +7 -0
  329. data/lib/jquery.validate.js +1293 -0
  330. data/lib/tasks/jinda.rake +42 -0
  331. data/test/dummy/Rakefile +6 -0
  332. data/test/dummy/app/assets/config/manifest.js +3 -0
  333. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  334. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  335. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  336. data/test/dummy/app/controllers/application_controller.rb +2 -0
  337. data/test/dummy/app/helpers/application_helper.rb +2 -0
  338. data/test/dummy/app/javascript/packs/application.js +15 -0
  339. data/test/dummy/app/jobs/application_job.rb +7 -0
  340. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  341. data/test/dummy/app/models/application_record.rb +3 -0
  342. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  343. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  344. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  345. data/test/dummy/bin/rails +4 -0
  346. data/test/dummy/bin/rake +4 -0
  347. data/test/dummy/bin/setup +33 -0
  348. data/test/dummy/config/application.rb +19 -0
  349. data/test/dummy/config/boot.rb +5 -0
  350. data/test/dummy/config/cable.yml +10 -0
  351. data/test/dummy/config/database.yml +25 -0
  352. data/test/dummy/config/environment.rb +5 -0
  353. data/test/dummy/config/environments/development.rb +62 -0
  354. data/test/dummy/config/environments/production.rb +112 -0
  355. data/test/dummy/config/environments/test.rb +49 -0
  356. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  357. data/test/dummy/config/initializers/assets.rb +12 -0
  358. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  359. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  360. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  361. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  362. data/test/dummy/config/initializers/inflections.rb +16 -0
  363. data/test/dummy/config/initializers/mime_types.rb +4 -0
  364. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  365. data/test/dummy/config/locales/en.yml +33 -0
  366. data/test/dummy/config/puma.rb +38 -0
  367. data/test/dummy/config/routes.rb +3 -0
  368. data/test/dummy/config/spring.rb +6 -0
  369. data/test/dummy/config/storage.yml +34 -0
  370. data/test/dummy/config.ru +5 -0
  371. data/test/dummy/db/development.sqlite3 +0 -0
  372. data/test/dummy/log/development.log +8 -0
  373. data/test/dummy/public/404.html +67 -0
  374. data/test/dummy/public/422.html +67 -0
  375. data/test/dummy/public/500.html +66 -0
  376. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  377. data/test/dummy/public/apple-touch-icon.png +0 -0
  378. data/test/dummy/public/favicon.ico +0 -0
  379. data/test/dummy/tmp/development_secret.txt +1 -0
  380. data/test/integration/navigation_test.rb +7 -0
  381. data/test/jinda_test.rb +7 -0
  382. data/test/test_helper.rb +19 -0
  383. metadata +466 -0
@@ -0,0 +1,1293 @@
1
+ /*!
2
+ * jQuery Validation Plugin v1.12.0
3
+ *
4
+ * http://jqueryvalidation.org/
5
+ *
6
+ * Copyright (c) 2014 Jörn Zaefferer
7
+ * Released under the MIT license
8
+ */
9
+ (function($) {
10
+
11
+ $.extend($.fn, {
12
+ // http://jqueryvalidation.org/validate/
13
+ validate: function( options ) {
14
+
15
+ // if nothing is selected, return nothing; can't chain anyway
16
+ if ( !this.length ) {
17
+ if ( options && options.debug && window.console ) {
18
+ console.warn( "Nothing selected, can't validate, returning nothing." );
19
+ }
20
+ return;
21
+ }
22
+
23
+ // check if a validator for this form was already created
24
+ var validator = $.data( this[0], "validator" );
25
+ if ( validator ) {
26
+ return validator;
27
+ }
28
+
29
+ // Add novalidate tag if HTML5.
30
+ this.attr( "novalidate", "novalidate" );
31
+
32
+ validator = new $.validator( options, this[0] );
33
+ $.data( this[0], "validator", validator );
34
+
35
+ if ( validator.settings.onsubmit ) {
36
+
37
+ this.validateDelegate( ":submit", "click", function( event ) {
38
+ if ( validator.settings.submitHandler ) {
39
+ validator.submitButton = event.target;
40
+ }
41
+ // allow suppressing validation by adding a cancel class to the submit button
42
+ if ( $(event.target).hasClass("cancel") ) {
43
+ validator.cancelSubmit = true;
44
+ }
45
+
46
+ // allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
47
+ if ( $(event.target).attr("formnovalidate") !== undefined ) {
48
+ validator.cancelSubmit = true;
49
+ }
50
+ });
51
+
52
+ // validate the form on submit
53
+ this.submit( function( event ) {
54
+ if ( validator.settings.debug ) {
55
+ // prevent form submit to be able to see console output
56
+ event.preventDefault();
57
+ }
58
+ function handle() {
59
+ var hidden;
60
+ if ( validator.settings.submitHandler ) {
61
+ if ( validator.submitButton ) {
62
+ // insert a hidden input as a replacement for the missing submit button
63
+ hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val( $(validator.submitButton).val() ).appendTo(validator.currentForm);
64
+ }
65
+ validator.settings.submitHandler.call( validator, validator.currentForm, event );
66
+ if ( validator.submitButton ) {
67
+ // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
68
+ hidden.remove();
69
+ }
70
+ return false;
71
+ }
72
+ return true;
73
+ }
74
+
75
+ // prevent submit for invalid forms or custom submit handlers
76
+ if ( validator.cancelSubmit ) {
77
+ validator.cancelSubmit = false;
78
+ return handle();
79
+ }
80
+ if ( validator.form() ) {
81
+ if ( validator.pendingRequest ) {
82
+ validator.formSubmitted = true;
83
+ return false;
84
+ }
85
+ return handle();
86
+ } else {
87
+ validator.focusInvalid();
88
+ return false;
89
+ }
90
+ });
91
+ }
92
+
93
+ return validator;
94
+ },
95
+ // http://jqueryvalidation.org/valid/
96
+ valid: function() {
97
+ var valid, validator;
98
+
99
+ if ( $(this[0]).is("form")) {
100
+ valid = this.validate().form();
101
+ } else {
102
+ valid = true;
103
+ validator = $(this[0].form).validate();
104
+ this.each(function() {
105
+ valid = validator.element(this) && valid;
106
+ });
107
+ }
108
+ return valid;
109
+ },
110
+ // attributes: space separated list of attributes to retrieve and remove
111
+ removeAttrs: function( attributes ) {
112
+ var result = {},
113
+ $element = this;
114
+ $.each(attributes.split(/\s/), function( index, value ) {
115
+ result[value] = $element.attr(value);
116
+ $element.removeAttr(value);
117
+ });
118
+ return result;
119
+ },
120
+ // http://jqueryvalidation.org/rules/
121
+ rules: function( command, argument ) {
122
+ var element = this[0],
123
+ settings, staticRules, existingRules, data, param, filtered;
124
+
125
+ if ( command ) {
126
+ settings = $.data(element.form, "validator").settings;
127
+ staticRules = settings.rules;
128
+ existingRules = $.validator.staticRules(element);
129
+ switch (command) {
130
+ case "add":
131
+ $.extend(existingRules, $.validator.normalizeRule(argument));
132
+ // remove messages from rules, but allow them to be set separately
133
+ delete existingRules.messages;
134
+ staticRules[element.name] = existingRules;
135
+ if ( argument.messages ) {
136
+ settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
137
+ }
138
+ break;
139
+ case "remove":
140
+ if ( !argument ) {
141
+ delete staticRules[element.name];
142
+ return existingRules;
143
+ }
144
+ filtered = {};
145
+ $.each(argument.split(/\s/), function( index, method ) {
146
+ filtered[method] = existingRules[method];
147
+ delete existingRules[method];
148
+ if ( method === "required" ) {
149
+ $(element).removeAttr("aria-required");
150
+ }
151
+ });
152
+ return filtered;
153
+ }
154
+ }
155
+
156
+ data = $.validator.normalizeRules(
157
+ $.extend(
158
+ {},
159
+ $.validator.classRules(element),
160
+ $.validator.attributeRules(element),
161
+ $.validator.dataRules(element),
162
+ $.validator.staticRules(element)
163
+ ), element);
164
+
165
+ // make sure required is at front
166
+ if ( data.required ) {
167
+ param = data.required;
168
+ delete data.required;
169
+ data = $.extend({ required: param }, data );
170
+ $(element).attr( "aria-required", "true" );
171
+ }
172
+
173
+ // make sure remote is at back
174
+ if ( data.remote ) {
175
+ param = data.remote;
176
+ delete data.remote;
177
+ data = $.extend( data, { remote: param });
178
+ }
179
+
180
+ return data;
181
+ }
182
+ });
183
+
184
+ // Custom selectors
185
+ $.extend($.expr[":"], {
186
+ // http://jqueryvalidation.org/blank-selector/
187
+ blank: function( a ) { return !$.trim("" + $(a).val()); },
188
+ // http://jqueryvalidation.org/filled-selector/
189
+ filled: function( a ) { return !!$.trim("" + $(a).val()); },
190
+ // http://jqueryvalidation.org/unchecked-selector/
191
+ unchecked: function( a ) { return !$(a).prop("checked"); }
192
+ });
193
+
194
+ // constructor for validator
195
+ $.validator = function( options, form ) {
196
+ this.settings = $.extend( true, {}, $.validator.defaults, options );
197
+ this.currentForm = form;
198
+ this.init();
199
+ };
200
+
201
+ // http://jqueryvalidation.org/jQuery.validator.format/
202
+ $.validator.format = function( source, params ) {
203
+ if ( arguments.length === 1 ) {
204
+ return function() {
205
+ var args = $.makeArray(arguments);
206
+ args.unshift(source);
207
+ return $.validator.format.apply( this, args );
208
+ };
209
+ }
210
+ if ( arguments.length > 2 && params.constructor !== Array ) {
211
+ params = $.makeArray(arguments).slice(1);
212
+ }
213
+ if ( params.constructor !== Array ) {
214
+ params = [ params ];
215
+ }
216
+ $.each(params, function( i, n ) {
217
+ source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() {
218
+ return n;
219
+ });
220
+ });
221
+ return source;
222
+ };
223
+
224
+ $.extend($.validator, {
225
+
226
+ defaults: {
227
+ messages: {},
228
+ groups: {},
229
+ rules: {},
230
+ errorClass: "error",
231
+ validClass: "valid",
232
+ errorElement: "label",
233
+ focusInvalid: true,
234
+ errorContainer: $([]),
235
+ errorLabelContainer: $([]),
236
+ onsubmit: true,
237
+ ignore: ":hidden",
238
+ ignoreTitle: false,
239
+ onfocusin: function( element ) {
240
+ this.lastActive = element;
241
+
242
+ // hide error label and remove error class on focus if enabled
243
+ if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
244
+ if ( this.settings.unhighlight ) {
245
+ this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
246
+ }
247
+ this.addWrapper(this.errorsFor(element)).hide();
248
+ }
249
+ },
250
+ onfocusout: function( element ) {
251
+ if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
252
+ this.element(element);
253
+ }
254
+ },
255
+ onkeyup: function( element, event ) {
256
+ if ( event.which === 9 && this.elementValue(element) === "" ) {
257
+ return;
258
+ } else if ( element.name in this.submitted || element === this.lastElement ) {
259
+ this.element(element);
260
+ }
261
+ },
262
+ onclick: function( element ) {
263
+ // click on selects, radiobuttons and checkboxes
264
+ if ( element.name in this.submitted ) {
265
+ this.element(element);
266
+
267
+ // or option elements, check parent select in that case
268
+ } else if ( element.parentNode.name in this.submitted ) {
269
+ this.element(element.parentNode);
270
+ }
271
+ },
272
+ highlight: function( element, errorClass, validClass ) {
273
+ if ( element.type === "radio" ) {
274
+ this.findByName(element.name).addClass(errorClass).removeClass(validClass);
275
+ } else {
276
+ $(element).addClass(errorClass).removeClass(validClass);
277
+ }
278
+ },
279
+ unhighlight: function( element, errorClass, validClass ) {
280
+ if ( element.type === "radio" ) {
281
+ this.findByName(element.name).removeClass(errorClass).addClass(validClass);
282
+ } else {
283
+ $(element).removeClass(errorClass).addClass(validClass);
284
+ }
285
+ }
286
+ },
287
+
288
+ // http://jqueryvalidation.org/jQuery.validator.setDefaults/
289
+ setDefaults: function( settings ) {
290
+ $.extend( $.validator.defaults, settings );
291
+ },
292
+
293
+ messages: {
294
+ required: "This field is required.",
295
+ remote: "Please fix this field.",
296
+ email: "Please enter a valid email address.",
297
+ url: "Please enter a valid URL.",
298
+ date: "Please enter a valid date.",
299
+ dateISO: "Please enter a valid date (ISO).",
300
+ number: "Please enter a valid number.",
301
+ digits: "Please enter only digits.",
302
+ creditcard: "Please enter a valid credit card number.",
303
+ equalTo: "Please enter the same value again.",
304
+ maxlength: $.validator.format("Please enter no more than {0} characters."),
305
+ minlength: $.validator.format("Please enter at least {0} characters."),
306
+ rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
307
+ range: $.validator.format("Please enter a value between {0} and {1}."),
308
+ max: $.validator.format("Please enter a value less than or equal to {0}."),
309
+ min: $.validator.format("Please enter a value greater than or equal to {0}.")
310
+ },
311
+
312
+ autoCreateRanges: false,
313
+
314
+ prototype: {
315
+
316
+ init: function() {
317
+ this.labelContainer = $(this.settings.errorLabelContainer);
318
+ this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
319
+ this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
320
+ this.submitted = {};
321
+ this.valueCache = {};
322
+ this.pendingRequest = 0;
323
+ this.pending = {};
324
+ this.invalid = {};
325
+ this.reset();
326
+
327
+ var groups = (this.groups = {}),
328
+ rules;
329
+ $.each(this.settings.groups, function( key, value ) {
330
+ if ( typeof value === "string" ) {
331
+ value = value.split(/\s/);
332
+ }
333
+ $.each(value, function( index, name ) {
334
+ groups[name] = key;
335
+ });
336
+ });
337
+ rules = this.settings.rules;
338
+ $.each(rules, function( key, value ) {
339
+ rules[key] = $.validator.normalizeRule(value);
340
+ });
341
+
342
+ function delegate(event) {
343
+ var validator = $.data(this[0].form, "validator"),
344
+ eventType = "on" + event.type.replace(/^validate/, ""),
345
+ settings = validator.settings;
346
+ if ( settings[eventType] && !this.is( settings.ignore ) ) {
347
+ settings[eventType].call(validator, this[0], event);
348
+ }
349
+ }
350
+ $(this.currentForm)
351
+ .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " +
352
+ "[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
353
+ "[type='email'], [type='datetime'], [type='date'], [type='month'], " +
354
+ "[type='week'], [type='time'], [type='datetime-local'], " +
355
+ "[type='range'], [type='color'] ",
356
+ "focusin focusout keyup", delegate)
357
+ .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate);
358
+
359
+ if ( this.settings.invalidHandler ) {
360
+ $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
361
+ }
362
+
363
+ // Add aria-required to any Static/Data/Class required fields before first validation
364
+ // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
365
+ $(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required", "true");
366
+ },
367
+
368
+ // http://jqueryvalidation.org/Validator.form/
369
+ form: function() {
370
+ this.checkForm();
371
+ $.extend(this.submitted, this.errorMap);
372
+ this.invalid = $.extend({}, this.errorMap);
373
+ if ( !this.valid() ) {
374
+ $(this.currentForm).triggerHandler("invalid-form", [ this ]);
375
+ }
376
+ this.showErrors();
377
+ return this.valid();
378
+ },
379
+
380
+ checkForm: function() {
381
+ this.prepareForm();
382
+ for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
383
+ this.check( elements[i] );
384
+ }
385
+ return this.valid();
386
+ },
387
+
388
+ // http://jqueryvalidation.org/Validator.element/
389
+ element: function( element ) {
390
+ var cleanElement = this.clean( element ),
391
+ checkElement = this.validationTargetFor( cleanElement ),
392
+ result = true;
393
+
394
+ this.lastElement = checkElement;
395
+
396
+ if ( checkElement === undefined ) {
397
+ delete this.invalid[ cleanElement.name ];
398
+ } else {
399
+ this.prepareElement( checkElement );
400
+ this.currentElements = $( checkElement );
401
+
402
+ result = this.check( checkElement ) !== false;
403
+ if (result) {
404
+ delete this.invalid[checkElement.name];
405
+ } else {
406
+ this.invalid[checkElement.name] = true;
407
+ }
408
+ }
409
+ // Add aria-invalid status for screen readers
410
+ $( element ).attr( "aria-invalid", !result );
411
+
412
+ if ( !this.numberOfInvalids() ) {
413
+ // Hide error containers on last error
414
+ this.toHide = this.toHide.add( this.containers );
415
+ }
416
+ this.showErrors();
417
+ return result;
418
+ },
419
+
420
+ // http://jqueryvalidation.org/Validator.showErrors/
421
+ showErrors: function( errors ) {
422
+ if ( errors ) {
423
+ // add items to error list and map
424
+ $.extend( this.errorMap, errors );
425
+ this.errorList = [];
426
+ for ( var name in errors ) {
427
+ this.errorList.push({
428
+ message: errors[name],
429
+ element: this.findByName(name)[0]
430
+ });
431
+ }
432
+ // remove items from success list
433
+ this.successList = $.grep( this.successList, function( element ) {
434
+ return !(element.name in errors);
435
+ });
436
+ }
437
+ if ( this.settings.showErrors ) {
438
+ this.settings.showErrors.call( this, this.errorMap, this.errorList );
439
+ } else {
440
+ this.defaultShowErrors();
441
+ }
442
+ },
443
+
444
+ // http://jqueryvalidation.org/Validator.resetForm/
445
+ resetForm: function() {
446
+ if ( $.fn.resetForm ) {
447
+ $(this.currentForm).resetForm();
448
+ }
449
+ this.submitted = {};
450
+ this.lastElement = null;
451
+ this.prepareForm();
452
+ this.hideErrors();
453
+ this.elements()
454
+ .removeClass( this.settings.errorClass )
455
+ .removeData( "previousValue" )
456
+ .removeAttr( "aria-invalid" );
457
+ },
458
+
459
+ numberOfInvalids: function() {
460
+ return this.objectLength(this.invalid);
461
+ },
462
+
463
+ objectLength: function( obj ) {
464
+ /* jshint unused: false */
465
+ var count = 0,
466
+ i;
467
+ for ( i in obj ) {
468
+ count++;
469
+ }
470
+ return count;
471
+ },
472
+
473
+ hideErrors: function() {
474
+ this.addWrapper( this.toHide ).hide();
475
+ },
476
+
477
+ valid: function() {
478
+ return this.size() === 0;
479
+ },
480
+
481
+ size: function() {
482
+ return this.errorList.length;
483
+ },
484
+
485
+ focusInvalid: function() {
486
+ if ( this.settings.focusInvalid ) {
487
+ try {
488
+ $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
489
+ .filter(":visible")
490
+ .focus()
491
+ // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
492
+ .trigger("focusin");
493
+ } catch(e) {
494
+ // ignore IE throwing errors when focusing hidden elements
495
+ }
496
+ }
497
+ },
498
+
499
+ findLastActive: function() {
500
+ var lastActive = this.lastActive;
501
+ return lastActive && $.grep(this.errorList, function( n ) {
502
+ return n.element.name === lastActive.name;
503
+ }).length === 1 && lastActive;
504
+ },
505
+
506
+ elements: function() {
507
+ var validator = this,
508
+ rulesCache = {};
509
+
510
+ // select all valid inputs inside the form (no submit or reset buttons)
511
+ return $(this.currentForm)
512
+ .find("input, select, textarea")
513
+ .not(":submit, :reset, :image, [disabled]")
514
+ .not( this.settings.ignore )
515
+ .filter(function() {
516
+ if ( !this.name && validator.settings.debug && window.console ) {
517
+ console.error( "%o has no name assigned", this);
518
+ }
519
+
520
+ // select only the first element for each name, and only those with rules specified
521
+ if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) {
522
+ return false;
523
+ }
524
+
525
+ rulesCache[this.name] = true;
526
+ return true;
527
+ });
528
+ },
529
+
530
+ clean: function( selector ) {
531
+ return $(selector)[0];
532
+ },
533
+
534
+ errors: function() {
535
+ var errorClass = this.settings.errorClass.split(" ").join(".");
536
+ return $(this.settings.errorElement + "." + errorClass, this.errorContext);
537
+ },
538
+
539
+ reset: function() {
540
+ this.successList = [];
541
+ this.errorList = [];
542
+ this.errorMap = {};
543
+ this.toShow = $([]);
544
+ this.toHide = $([]);
545
+ this.currentElements = $([]);
546
+ },
547
+
548
+ prepareForm: function() {
549
+ this.reset();
550
+ this.toHide = this.errors().add( this.containers );
551
+ },
552
+
553
+ prepareElement: function( element ) {
554
+ this.reset();
555
+ this.toHide = this.errorsFor(element);
556
+ },
557
+
558
+ elementValue: function( element ) {
559
+ var val,
560
+ $element = $(element),
561
+ type = $element.attr("type");
562
+
563
+ if ( type === "radio" || type === "checkbox" ) {
564
+ return $("input[name='" + $element.attr("name") + "']:checked").val();
565
+ }
566
+
567
+ val = $element.val();
568
+ if ( typeof val === "string" ) {
569
+ return val.replace(/\r/g, "");
570
+ }
571
+ return val;
572
+ },
573
+
574
+ check: function( element ) {
575
+ element = this.validationTargetFor( this.clean( element ) );
576
+
577
+ var rules = $(element).rules(),
578
+ rulesCount = $.map( rules, function(n, i) {
579
+ return i;
580
+ }).length,
581
+ dependencyMismatch = false,
582
+ val = this.elementValue(element),
583
+ result, method, rule;
584
+
585
+ for (method in rules ) {
586
+ rule = { method: method, parameters: rules[method] };
587
+ try {
588
+
589
+ result = $.validator.methods[method].call( this, val, element, rule.parameters );
590
+
591
+ // if a method indicates that the field is optional and therefore valid,
592
+ // don't mark it as valid when there are no other rules
593
+ if ( result === "dependency-mismatch" && rulesCount === 1 ) {
594
+ dependencyMismatch = true;
595
+ continue;
596
+ }
597
+ dependencyMismatch = false;
598
+
599
+ if ( result === "pending" ) {
600
+ this.toHide = this.toHide.not( this.errorsFor(element) );
601
+ return;
602
+ }
603
+
604
+ if ( !result ) {
605
+ this.formatAndAdd( element, rule );
606
+ return false;
607
+ }
608
+ } catch(e) {
609
+ if ( this.settings.debug && window.console ) {
610
+ console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
611
+ }
612
+ throw e;
613
+ }
614
+ }
615
+ if ( dependencyMismatch ) {
616
+ return;
617
+ }
618
+ if ( this.objectLength(rules) ) {
619
+ this.successList.push(element);
620
+ }
621
+ return true;
622
+ },
623
+
624
+ // return the custom message for the given element and validation method
625
+ // specified in the element's HTML5 data attribute
626
+ // return the generic message if present and no method specific message is present
627
+ customDataMessage: function( element, method ) {
628
+ return $( element ).data( "msg" + method[ 0 ].toUpperCase() +
629
+ method.substring( 1 ).toLowerCase() ) || $( element ).data("msg");
630
+ },
631
+
632
+ // return the custom message for the given element name and validation method
633
+ customMessage: function( name, method ) {
634
+ var m = this.settings.messages[name];
635
+ return m && (m.constructor === String ? m : m[method]);
636
+ },
637
+
638
+ // return the first defined argument, allowing empty strings
639
+ findDefined: function() {
640
+ for (var i = 0; i < arguments.length; i++) {
641
+ if ( arguments[i] !== undefined ) {
642
+ return arguments[i];
643
+ }
644
+ }
645
+ return undefined;
646
+ },
647
+
648
+ defaultMessage: function( element, method ) {
649
+ return this.findDefined(
650
+ this.customMessage( element.name, method ),
651
+ this.customDataMessage( element, method ),
652
+ // title is never undefined, so handle empty string as undefined
653
+ !this.settings.ignoreTitle && element.title || undefined,
654
+ $.validator.messages[method],
655
+ "<strong>Warning: No message defined for " + element.name + "</strong>"
656
+ );
657
+ },
658
+
659
+ formatAndAdd: function( element, rule ) {
660
+ var message = this.defaultMessage( element, rule.method ),
661
+ theregex = /\$?\{(\d+)\}/g;
662
+ if ( typeof message === "function" ) {
663
+ message = message.call(this, rule.parameters, element);
664
+ } else if (theregex.test(message)) {
665
+ message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters);
666
+ }
667
+ this.errorList.push({
668
+ message: message,
669
+ element: element,
670
+ method: rule.method
671
+ });
672
+
673
+ this.errorMap[element.name] = message;
674
+ this.submitted[element.name] = message;
675
+ },
676
+
677
+ addWrapper: function( toToggle ) {
678
+ if ( this.settings.wrapper ) {
679
+ toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
680
+ }
681
+ return toToggle;
682
+ },
683
+
684
+ defaultShowErrors: function() {
685
+ var i, elements, error;
686
+ for ( i = 0; this.errorList[i]; i++ ) {
687
+ error = this.errorList[i];
688
+ if ( this.settings.highlight ) {
689
+ this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
690
+ }
691
+ this.showLabel( error.element, error.message );
692
+ }
693
+ if ( this.errorList.length ) {
694
+ this.toShow = this.toShow.add( this.containers );
695
+ }
696
+ if ( this.settings.success ) {
697
+ for ( i = 0; this.successList[i]; i++ ) {
698
+ this.showLabel( this.successList[i] );
699
+ }
700
+ }
701
+ if ( this.settings.unhighlight ) {
702
+ for ( i = 0, elements = this.validElements(); elements[i]; i++ ) {
703
+ this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
704
+ }
705
+ }
706
+ this.toHide = this.toHide.not( this.toShow );
707
+ this.hideErrors();
708
+ this.addWrapper( this.toShow ).show();
709
+ },
710
+
711
+ validElements: function() {
712
+ return this.currentElements.not(this.invalidElements());
713
+ },
714
+
715
+ invalidElements: function() {
716
+ return $(this.errorList).map(function() {
717
+ return this.element;
718
+ });
719
+ },
720
+
721
+ showLabel: function( element, message ) {
722
+ var label = this.errorsFor( element );
723
+ if ( label.length ) {
724
+ // refresh error/success class
725
+ label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
726
+ // replace message on existing label
727
+ label.html(message);
728
+ } else {
729
+ // create label
730
+ label = $("<" + this.settings.errorElement + ">")
731
+ .attr("for", this.idOrName(element))
732
+ .addClass(this.settings.errorClass)
733
+ .html(message || "");
734
+ if ( this.settings.wrapper ) {
735
+ // make sure the element is visible, even in IE
736
+ // actually showing the wrapped element is handled elsewhere
737
+ label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
738
+ }
739
+ if ( !this.labelContainer.append(label).length ) {
740
+ if ( this.settings.errorPlacement ) {
741
+ this.settings.errorPlacement(label, $(element) );
742
+ } else {
743
+ label.insertAfter(element);
744
+ }
745
+ }
746
+ }
747
+ if ( !message && this.settings.success ) {
748
+ label.text("");
749
+ if ( typeof this.settings.success === "string" ) {
750
+ label.addClass( this.settings.success );
751
+ } else {
752
+ this.settings.success( label, element );
753
+ }
754
+ }
755
+ this.toShow = this.toShow.add(label);
756
+ },
757
+
758
+ errorsFor: function( element ) {
759
+ var name = this.idOrName(element);
760
+ return this.errors().filter(function() {
761
+ return $(this).attr("for") === name;
762
+ });
763
+ },
764
+
765
+ idOrName: function( element ) {
766
+ return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
767
+ },
768
+
769
+ validationTargetFor: function( element ) {
770
+ // if radio/checkbox, validate first element in group instead
771
+ if ( this.checkable(element) ) {
772
+ element = this.findByName( element.name ).not(this.settings.ignore)[0];
773
+ }
774
+ return element;
775
+ },
776
+
777
+ checkable: function( element ) {
778
+ return (/radio|checkbox/i).test(element.type);
779
+ },
780
+
781
+ findByName: function( name ) {
782
+ return $(this.currentForm).find("[name='" + name + "']");
783
+ },
784
+
785
+ getLength: function( value, element ) {
786
+ switch ( element.nodeName.toLowerCase() ) {
787
+ case "select":
788
+ return $("option:selected", element).length;
789
+ case "input":
790
+ if ( this.checkable( element) ) {
791
+ return this.findByName(element.name).filter(":checked").length;
792
+ }
793
+ }
794
+ return value.length;
795
+ },
796
+
797
+ depend: function( param, element ) {
798
+ return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true;
799
+ },
800
+
801
+ dependTypes: {
802
+ "boolean": function( param ) {
803
+ return param;
804
+ },
805
+ "string": function( param, element ) {
806
+ return !!$(param, element.form).length;
807
+ },
808
+ "function": function( param, element ) {
809
+ return param(element);
810
+ }
811
+ },
812
+
813
+ optional: function( element ) {
814
+ var val = this.elementValue(element);
815
+ return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch";
816
+ },
817
+
818
+ startRequest: function( element ) {
819
+ if ( !this.pending[element.name] ) {
820
+ this.pendingRequest++;
821
+ this.pending[element.name] = true;
822
+ }
823
+ },
824
+
825
+ stopRequest: function( element, valid ) {
826
+ this.pendingRequest--;
827
+ // sometimes synchronization fails, make sure pendingRequest is never < 0
828
+ if ( this.pendingRequest < 0 ) {
829
+ this.pendingRequest = 0;
830
+ }
831
+ delete this.pending[element.name];
832
+ if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
833
+ $(this.currentForm).submit();
834
+ this.formSubmitted = false;
835
+ } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {
836
+ $(this.currentForm).triggerHandler("invalid-form", [ this ]);
837
+ this.formSubmitted = false;
838
+ }
839
+ },
840
+
841
+ previousValue: function( element ) {
842
+ return $.data(element, "previousValue") || $.data(element, "previousValue", {
843
+ old: null,
844
+ valid: true,
845
+ message: this.defaultMessage( element, "remote" )
846
+ });
847
+ }
848
+
849
+ },
850
+
851
+ classRuleSettings: {
852
+ required: { required: true },
853
+ email: { email: true },
854
+ url: { url: true },
855
+ date: { date: true },
856
+ dateISO: { dateISO: true },
857
+ number: { number: true },
858
+ digits: { digits: true },
859
+ creditcard: { creditcard: true }
860
+ },
861
+
862
+ addClassRules: function( className, rules ) {
863
+ if ( className.constructor === String ) {
864
+ this.classRuleSettings[className] = rules;
865
+ } else {
866
+ $.extend(this.classRuleSettings, className);
867
+ }
868
+ },
869
+
870
+ classRules: function( element ) {
871
+ var rules = {},
872
+ classes = $(element).attr("class");
873
+
874
+ if ( classes ) {
875
+ $.each(classes.split(" "), function() {
876
+ if ( this in $.validator.classRuleSettings ) {
877
+ $.extend(rules, $.validator.classRuleSettings[this]);
878
+ }
879
+ });
880
+ }
881
+ return rules;
882
+ },
883
+
884
+ attributeRules: function( element ) {
885
+ var rules = {},
886
+ $element = $(element),
887
+ type = element.getAttribute("type"),
888
+ method, value;
889
+
890
+ for (method in $.validator.methods) {
891
+
892
+ // support for <input required> in both html5 and older browsers
893
+ if ( method === "required" ) {
894
+ value = element.getAttribute(method);
895
+ // Some browsers return an empty string for the required attribute
896
+ // and non-HTML5 browsers might have required="" markup
897
+ if ( value === "" ) {
898
+ value = true;
899
+ }
900
+ // force non-HTML5 browsers to return bool
901
+ value = !!value;
902
+ } else {
903
+ value = $element.attr(method);
904
+ }
905
+
906
+ // convert the value to a number for number inputs, and for text for backwards compability
907
+ // allows type="date" and others to be compared as strings
908
+ if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
909
+ value = Number(value);
910
+ }
911
+
912
+ if ( value || value === 0 ) {
913
+ rules[method] = value;
914
+ } else if ( type === method && type !== "range" ) {
915
+ // exception: the jquery validate 'range' method
916
+ // does not test for the html5 'range' type
917
+ rules[method] = true;
918
+ }
919
+ }
920
+
921
+ // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
922
+ if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) {
923
+ delete rules.maxlength;
924
+ }
925
+
926
+ return rules;
927
+ },
928
+
929
+ dataRules: function( element ) {
930
+ var method, value,
931
+ rules = {}, $element = $( element );
932
+ for ( method in $.validator.methods ) {
933
+ value = $element.data( "rule" + method[ 0 ].toUpperCase() + method.substring( 1 ).toLowerCase() );
934
+ if ( value !== undefined ) {
935
+ rules[ method ] = value;
936
+ }
937
+ }
938
+ return rules;
939
+ },
940
+
941
+ staticRules: function( element ) {
942
+ var rules = {},
943
+ validator = $.data(element.form, "validator");
944
+
945
+ if ( validator.settings.rules ) {
946
+ rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
947
+ }
948
+ return rules;
949
+ },
950
+
951
+ normalizeRules: function( rules, element ) {
952
+ // handle dependency check
953
+ $.each(rules, function( prop, val ) {
954
+ // ignore rule when param is explicitly false, eg. required:false
955
+ if ( val === false ) {
956
+ delete rules[prop];
957
+ return;
958
+ }
959
+ if ( val.param || val.depends ) {
960
+ var keepRule = true;
961
+ switch (typeof val.depends) {
962
+ case "string":
963
+ keepRule = !!$(val.depends, element.form).length;
964
+ break;
965
+ case "function":
966
+ keepRule = val.depends.call(element, element);
967
+ break;
968
+ }
969
+ if ( keepRule ) {
970
+ rules[prop] = val.param !== undefined ? val.param : true;
971
+ } else {
972
+ delete rules[prop];
973
+ }
974
+ }
975
+ });
976
+
977
+ // evaluate parameters
978
+ $.each(rules, function( rule, parameter ) {
979
+ rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
980
+ });
981
+
982
+ // clean number parameters
983
+ $.each([ "minlength", "maxlength" ], function() {
984
+ if ( rules[this] ) {
985
+ rules[this] = Number(rules[this]);
986
+ }
987
+ });
988
+ $.each([ "rangelength", "range" ], function() {
989
+ var parts;
990
+ if ( rules[this] ) {
991
+ if ( $.isArray(rules[this]) ) {
992
+ rules[this] = [ Number(rules[this][0]), Number(rules[this][1]) ];
993
+ } else if ( typeof rules[this] === "string" ) {
994
+ parts = rules[this].split(/[\s,]+/);
995
+ rules[this] = [ Number(parts[0]), Number(parts[1]) ];
996
+ }
997
+ }
998
+ });
999
+
1000
+ if ( $.validator.autoCreateRanges ) {
1001
+ // auto-create ranges
1002
+ if ( rules.min && rules.max ) {
1003
+ rules.range = [ rules.min, rules.max ];
1004
+ delete rules.min;
1005
+ delete rules.max;
1006
+ }
1007
+ if ( rules.minlength && rules.maxlength ) {
1008
+ rules.rangelength = [ rules.minlength, rules.maxlength ];
1009
+ delete rules.minlength;
1010
+ delete rules.maxlength;
1011
+ }
1012
+ }
1013
+
1014
+ return rules;
1015
+ },
1016
+
1017
+ // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
1018
+ normalizeRule: function( data ) {
1019
+ if ( typeof data === "string" ) {
1020
+ var transformed = {};
1021
+ $.each(data.split(/\s/), function() {
1022
+ transformed[this] = true;
1023
+ });
1024
+ data = transformed;
1025
+ }
1026
+ return data;
1027
+ },
1028
+
1029
+ // http://jqueryvalidation.org/jQuery.validator.addMethod/
1030
+ addMethod: function( name, method, message ) {
1031
+ $.validator.methods[name] = method;
1032
+ $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name];
1033
+ if ( method.length < 3 ) {
1034
+ $.validator.addClassRules(name, $.validator.normalizeRule(name));
1035
+ }
1036
+ },
1037
+
1038
+ methods: {
1039
+
1040
+ // http://jqueryvalidation.org/required-method/
1041
+ required: function( value, element, param ) {
1042
+ // check if dependency is met
1043
+ if ( !this.depend(param, element) ) {
1044
+ return "dependency-mismatch";
1045
+ }
1046
+ if ( element.nodeName.toLowerCase() === "select" ) {
1047
+ // could be an array for select-multiple or a string, both are fine this way
1048
+ var val = $(element).val();
1049
+ return val && val.length > 0;
1050
+ }
1051
+ if ( this.checkable(element) ) {
1052
+ return this.getLength(value, element) > 0;
1053
+ }
1054
+ return $.trim(value).length > 0;
1055
+ },
1056
+
1057
+ // http://jqueryvalidation.org/email-method/
1058
+ email: function( value, element ) {
1059
+ // From http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29
1060
+ // Retrieved 2014-01-14
1061
+ // If you have a problem with this implementation, report a bug against the above spec
1062
+ // Or use custom methods to implement your own email validation
1063
+ return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value);
1064
+ },
1065
+
1066
+ // http://jqueryvalidation.org/url-method/
1067
+ url: function( value, element ) {
1068
+ // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
1069
+ return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
1070
+ },
1071
+
1072
+ // http://jqueryvalidation.org/date-method/
1073
+ date: function( value, element ) {
1074
+ return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());
1075
+ },
1076
+
1077
+ // http://jqueryvalidation.org/dateISO-method/
1078
+ dateISO: function( value, element ) {
1079
+ return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value);
1080
+ },
1081
+
1082
+ // http://jqueryvalidation.org/number-method/
1083
+ number: function( value, element ) {
1084
+ return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
1085
+ },
1086
+
1087
+ // http://jqueryvalidation.org/digits-method/
1088
+ digits: function( value, element ) {
1089
+ return this.optional(element) || /^\d+$/.test(value);
1090
+ },
1091
+
1092
+ // http://jqueryvalidation.org/creditcard-method/
1093
+ // based on http://en.wikipedia.org/wiki/Luhn/
1094
+ creditcard: function( value, element ) {
1095
+ if ( this.optional(element) ) {
1096
+ return "dependency-mismatch";
1097
+ }
1098
+ // accept only spaces, digits and dashes
1099
+ if ( /[^0-9 \-]+/.test(value) ) {
1100
+ return false;
1101
+ }
1102
+ var nCheck = 0,
1103
+ nDigit = 0,
1104
+ bEven = false,
1105
+ n, cDigit;
1106
+
1107
+ value = value.replace(/\D/g, "");
1108
+
1109
+ // Basing min and max length on
1110
+ // http://developer.ean.com/general_info/Valid_Credit_Card_Types
1111
+ if ( value.length < 13 || value.length > 19 ) {
1112
+ return false;
1113
+ }
1114
+
1115
+ for ( n = value.length - 1; n >= 0; n--) {
1116
+ cDigit = value.charAt(n);
1117
+ nDigit = parseInt(cDigit, 10);
1118
+ if ( bEven ) {
1119
+ if ( (nDigit *= 2) > 9 ) {
1120
+ nDigit -= 9;
1121
+ }
1122
+ }
1123
+ nCheck += nDigit;
1124
+ bEven = !bEven;
1125
+ }
1126
+
1127
+ return (nCheck % 10) === 0;
1128
+ },
1129
+
1130
+ // http://jqueryvalidation.org/minlength-method/
1131
+ minlength: function( value, element, param ) {
1132
+ var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);
1133
+ return this.optional(element) || length >= param;
1134
+ },
1135
+
1136
+ // http://jqueryvalidation.org/maxlength-method/
1137
+ maxlength: function( value, element, param ) {
1138
+ var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);
1139
+ return this.optional(element) || length <= param;
1140
+ },
1141
+
1142
+ // http://jqueryvalidation.org/rangelength-method/
1143
+ rangelength: function( value, element, param ) {
1144
+ var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);
1145
+ return this.optional(element) || ( length >= param[0] && length <= param[1] );
1146
+ },
1147
+
1148
+ // http://jqueryvalidation.org/min-method/
1149
+ min: function( value, element, param ) {
1150
+ return this.optional(element) || value >= param;
1151
+ },
1152
+
1153
+ // http://jqueryvalidation.org/max-method/
1154
+ max: function( value, element, param ) {
1155
+ return this.optional(element) || value <= param;
1156
+ },
1157
+
1158
+ // http://jqueryvalidation.org/range-method/
1159
+ range: function( value, element, param ) {
1160
+ return this.optional(element) || ( value >= param[0] && value <= param[1] );
1161
+ },
1162
+
1163
+ // http://jqueryvalidation.org/equalTo-method/
1164
+ equalTo: function( value, element, param ) {
1165
+ // bind to the blur event of the target in order to revalidate whenever the target field is updated
1166
+ // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
1167
+ var target = $(param);
1168
+ if ( this.settings.onfocusout ) {
1169
+ target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
1170
+ $(element).valid();
1171
+ });
1172
+ }
1173
+ return value === target.val();
1174
+ },
1175
+
1176
+ // http://jqueryvalidation.org/remote-method/
1177
+ remote: function( value, element, param ) {
1178
+ if ( this.optional(element) ) {
1179
+ return "dependency-mismatch";
1180
+ }
1181
+
1182
+ var previous = this.previousValue(element),
1183
+ validator, data;
1184
+
1185
+ if (!this.settings.messages[element.name] ) {
1186
+ this.settings.messages[element.name] = {};
1187
+ }
1188
+ previous.originalMessage = this.settings.messages[element.name].remote;
1189
+ this.settings.messages[element.name].remote = previous.message;
1190
+
1191
+ param = typeof param === "string" && { url: param } || param;
1192
+
1193
+ if ( previous.old === value ) {
1194
+ return previous.valid;
1195
+ }
1196
+
1197
+ previous.old = value;
1198
+ validator = this;
1199
+ this.startRequest(element);
1200
+ data = {};
1201
+ data[element.name] = value;
1202
+ $.ajax($.extend(true, {
1203
+ url: param,
1204
+ mode: "abort",
1205
+ port: "validate" + element.name,
1206
+ dataType: "json",
1207
+ data: data,
1208
+ context: validator.currentForm,
1209
+ success: function( response ) {
1210
+ var valid = response === true || response === "true",
1211
+ errors, message, submitted;
1212
+
1213
+ validator.settings.messages[element.name].remote = previous.originalMessage;
1214
+ if ( valid ) {
1215
+ submitted = validator.formSubmitted;
1216
+ validator.prepareElement(element);
1217
+ validator.formSubmitted = submitted;
1218
+ validator.successList.push(element);
1219
+ delete validator.invalid[element.name];
1220
+ validator.showErrors();
1221
+ } else {
1222
+ errors = {};
1223
+ message = response || validator.defaultMessage( element, "remote" );
1224
+ errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
1225
+ validator.invalid[element.name] = true;
1226
+ validator.showErrors(errors);
1227
+ }
1228
+ previous.valid = valid;
1229
+ validator.stopRequest(element, valid);
1230
+ }
1231
+ }, param));
1232
+ return "pending";
1233
+ }
1234
+
1235
+ }
1236
+
1237
+ });
1238
+
1239
+ $.format = function deprecated() {
1240
+ throw "$.format has been deprecated. Please use $.validator.format instead.";
1241
+ };
1242
+
1243
+ }(jQuery));
1244
+
1245
+ // ajax mode: abort
1246
+ // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
1247
+ // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
1248
+ (function($) {
1249
+ var pendingRequests = {},
1250
+ ajax;
1251
+ // Use a prefilter if available (1.5+)
1252
+ if ( $.ajaxPrefilter ) {
1253
+ $.ajaxPrefilter(function( settings, _, xhr ) {
1254
+ var port = settings.port;
1255
+ if ( settings.mode === "abort" ) {
1256
+ if ( pendingRequests[port] ) {
1257
+ pendingRequests[port].abort();
1258
+ }
1259
+ pendingRequests[port] = xhr;
1260
+ }
1261
+ });
1262
+ } else {
1263
+ // Proxy ajax
1264
+ ajax = $.ajax;
1265
+ $.ajax = function( settings ) {
1266
+ var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
1267
+ port = ( "port" in settings ? settings : $.ajaxSettings ).port;
1268
+ if ( mode === "abort" ) {
1269
+ if ( pendingRequests[port] ) {
1270
+ pendingRequests[port].abort();
1271
+ }
1272
+ pendingRequests[port] = ajax.apply(this, arguments);
1273
+ return pendingRequests[port];
1274
+ }
1275
+ return ajax.apply(this, arguments);
1276
+ };
1277
+ }
1278
+ }(jQuery));
1279
+
1280
+ // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
1281
+ // handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
1282
+ (function($) {
1283
+ $.extend($.fn, {
1284
+ validateDelegate: function( delegate, type, handler ) {
1285
+ return this.bind(type, function( event ) {
1286
+ var target = $(event.target);
1287
+ if ( target.is(delegate) ) {
1288
+ return handler.apply(target, arguments);
1289
+ }
1290
+ });
1291
+ }
1292
+ });
1293
+ }(jQuery));