repsheet_visualizer 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/lib/repsheet_visualizer/application/app.rb +2 -2
  4. data/lib/repsheet_visualizer/application/public/javascripts/application.js +0 -4
  5. data/lib/repsheet_visualizer/application/views/activity.erb +5 -0
  6. data/lib/repsheet_visualizer/application/views/actors.erb +5 -0
  7. data/lib/repsheet_visualizer/application/views/breakdown.erb +5 -0
  8. data/lib/repsheet_visualizer/application/views/whitelist.erb +5 -0
  9. data/lib/repsheet_visualizer/application/views/worldview.erb +5 -0
  10. data/lib/repsheet_visualizer/version.rb +1 -1
  11. metadata +2 -289
  12. data/redesign/actor.html +0 -228
  13. data/redesign/chart-flot.html +0 -698
  14. data/redesign/chart-morris.html +0 -528
  15. data/redesign/chart-sparkline.html +0 -702
  16. data/redesign/css/App.css +0 -3436
  17. data/redesign/css/Login.css +0 -88
  18. data/redesign/css/bootstrap.min.css +0 -9
  19. data/redesign/css/custom.css +0 -0
  20. data/redesign/css/font-awesome.min.css +0 -395
  21. data/redesign/fonts/FontAwesome.otf +0 -0
  22. data/redesign/fonts/fontawesome-webfont.eot +0 -0
  23. data/redesign/fonts/fontawesome-webfont.svg +0 -414
  24. data/redesign/fonts/fontawesome-webfont.ttf +0 -0
  25. data/redesign/fonts/fontawesome-webfont.woff +0 -0
  26. data/redesign/fonts/glyphicons-halflings-regular.eot +0 -0
  27. data/redesign/fonts/glyphicons-halflings-regular.svg +0 -228
  28. data/redesign/fonts/glyphicons-halflings-regular.ttf +0 -0
  29. data/redesign/fonts/glyphicons-halflings-regular.woff +0 -0
  30. data/redesign/form-extended.html +0 -1052
  31. data/redesign/form-regular.html +0 -863
  32. data/redesign/form-validation.html +0 -678
  33. data/redesign/img/avatars/avatar-1.jpg +0 -0
  34. data/redesign/img/avatars/avatar-2.jpg +0 -0
  35. data/redesign/img/avatars/avatar-large-1.jpg +0 -0
  36. data/redesign/img/avatars/avatar-large-2.jpg +0 -0
  37. data/redesign/img/gallery/zoom.png +0 -0
  38. data/redesign/img/jquery/handle-vertical.png +0 -0
  39. data/redesign/img/jquery/handle.png +0 -0
  40. data/redesign/img/layout/sidebar-bg.png +0 -0
  41. data/redesign/img/loaders/ajax-loader.gif +0 -0
  42. data/redesign/img/logos/logo-login.png +0 -0
  43. data/redesign/img/logos/logo.png +0 -0
  44. data/redesign/img/mockup.png +0 -0
  45. data/redesign/img/photos/blur-lg.jpg +0 -0
  46. data/redesign/img/photos/blur-sm.jpg +0 -0
  47. data/redesign/img/photos/clock-lg.jpg +0 -0
  48. data/redesign/img/photos/clock-sm.jpg +0 -0
  49. data/redesign/img/photos/lens-lg.jpg +0 -0
  50. data/redesign/img/photos/lens-sm.jpg +0 -0
  51. data/redesign/img/photos/map.png +0 -0
  52. data/redesign/img/photos/rust-lg.jpg +0 -0
  53. data/redesign/img/photos/rust-sm.jpg +0 -0
  54. data/redesign/img/pricing/label-editable.png +0 -0
  55. data/redesign/img/pricing/label-red.png +0 -0
  56. data/redesign/img/pricing/label-yellow.png +0 -0
  57. data/redesign/index.html +0 -328
  58. data/redesign/js/App.js +0 -372
  59. data/redesign/js/Login.js +0 -17
  60. data/redesign/js/demos/buttons.js +0 -7
  61. data/redesign/js/demos/calendar.js +0 -142
  62. data/redesign/js/demos/charts/flot/area.js +0 -73
  63. data/redesign/js/demos/charts/flot/chart1.js +0 -77
  64. data/redesign/js/demos/charts/flot/chart2.js +0 -70
  65. data/redesign/js/demos/charts/flot/chart3.js +0 -71
  66. data/redesign/js/demos/charts/flot/chart4.js +0 -69
  67. data/redesign/js/demos/charts/flot/donut.js +0 -49
  68. data/redesign/js/demos/charts/flot/horizontal.js +0 -56
  69. data/redesign/js/demos/charts/flot/line.js +0 -76
  70. data/redesign/js/demos/charts/flot/pie.js +0 -50
  71. data/redesign/js/demos/charts/flot/scatter.js +0 -62
  72. data/redesign/js/demos/charts/flot/stacked-area.js +0 -86
  73. data/redesign/js/demos/charts/flot/stacked-horizontal.js +0 -60
  74. data/redesign/js/demos/charts/flot/stacked-vertical.js +0 -75
  75. data/redesign/js/demos/charts/flot/vertical.js +0 -70
  76. data/redesign/js/demos/charts/morris/area.js +0 -28
  77. data/redesign/js/demos/charts/morris/bar.js +0 -29
  78. data/redesign/js/demos/charts/morris/donut.js +0 -26
  79. data/redesign/js/demos/charts/morris/line.js +0 -30
  80. data/redesign/js/demos/dashboard.js +0 -26
  81. data/redesign/js/demos/form-extended.js +0 -61
  82. data/redesign/js/demos/popups.js +0 -16
  83. data/redesign/js/demos/pricing.js +0 -10
  84. data/redesign/js/demos/sliders.js +0 -77
  85. data/redesign/js/libs/bootstrap.js +0 -1999
  86. data/redesign/js/libs/bootstrap.min.js +0 -6
  87. data/redesign/js/libs/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  88. data/redesign/js/libs/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  89. data/redesign/js/libs/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  90. data/redesign/js/libs/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  91. data/redesign/js/libs/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  92. data/redesign/js/libs/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  93. data/redesign/js/libs/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  94. data/redesign/js/libs/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  95. data/redesign/js/libs/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  96. data/redesign/js/libs/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  97. data/redesign/js/libs/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  98. data/redesign/js/libs/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  99. data/redesign/js/libs/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  100. data/redesign/js/libs/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  101. data/redesign/js/libs/css/ui-lightness/jquery-ui-1.9.2.custom.css +0 -294
  102. data/redesign/js/libs/css/ui-lightness/jquery-ui-1.9.2.custom.min.css +0 -7
  103. data/redesign/js/libs/jquery-1.9.1.min.js +0 -5
  104. data/redesign/js/libs/jquery-ui-1.9.2.custom.min.js +0 -6
  105. data/redesign/js/libs/jquery.min.map +0 -1
  106. data/redesign/js/libs/raphael-2.1.2.min.js +0 -11
  107. data/redesign/js/plugins/autosize/jquery.autosize.min.js +0 -7
  108. data/redesign/js/plugins/datatables/DT_bootstrap.js +0 -148
  109. data/redesign/js/plugins/datatables/img/Sorting icons.psd +0 -0
  110. data/redesign/js/plugins/datatables/img/back_disabled.png +0 -0
  111. data/redesign/js/plugins/datatables/img/back_enabled.png +0 -0
  112. data/redesign/js/plugins/datatables/img/back_enabled_hover.png +0 -0
  113. data/redesign/js/plugins/datatables/img/datatable-row-openclose.png +0 -0
  114. data/redesign/js/plugins/datatables/img/favicon.ico +0 -0
  115. data/redesign/js/plugins/datatables/img/forward_disabled.png +0 -0
  116. data/redesign/js/plugins/datatables/img/forward_enabled.png +0 -0
  117. data/redesign/js/plugins/datatables/img/forward_enabled_hover.png +0 -0
  118. data/redesign/js/plugins/datatables/img/sort_asc.png +0 -0
  119. data/redesign/js/plugins/datatables/img/sort_asc_disabled.png +0 -0
  120. data/redesign/js/plugins/datatables/img/sort_both.png +0 -0
  121. data/redesign/js/plugins/datatables/img/sort_desc.png +0 -0
  122. data/redesign/js/plugins/datatables/img/sort_desc_disabled.png +0 -0
  123. data/redesign/js/plugins/datatables/jquery.dataTables.min.js +0 -155
  124. data/redesign/js/plugins/datepicker/bootstrap-datepicker.js +0 -1258
  125. data/redesign/js/plugins/datepicker/datepicker.css +0 -481
  126. data/redesign/js/plugins/datepicker/less/datepicker.less +0 -122
  127. data/redesign/js/plugins/fileupload/bootstrap-fileupload.css +0 -132
  128. data/redesign/js/plugins/fileupload/bootstrap-fileupload.js +0 -169
  129. data/redesign/js/plugins/fileupload/bootstrap-fileupload.min.css +0 -31
  130. data/redesign/js/plugins/fileupload/bootstrap-fileupload.min.js +0 -7
  131. data/redesign/js/plugins/flot/jquery.flot.js +0 -2599
  132. data/redesign/js/plugins/flot/jquery.flot.orderBars.js +0 -186
  133. data/redesign/js/plugins/flot/jquery.flot.pie.js +0 -750
  134. data/redesign/js/plugins/flot/jquery.flot.resize.js +0 -57
  135. data/redesign/js/plugins/flot/jquery.flot.stack.js +0 -184
  136. data/redesign/js/plugins/flot/jquery.flot.tooltip.min.js +0 -14
  137. data/redesign/js/plugins/fullcalendar/fullcalendar.css +0 -589
  138. data/redesign/js/plugins/fullcalendar/fullcalendar.js +0 -6110
  139. data/redesign/js/plugins/fullcalendar/fullcalendar.min.js +0 -7
  140. data/redesign/js/plugins/fullcalendar/fullcalendar.print.css +0 -32
  141. data/redesign/js/plugins/fullcalendar/gcal.js +0 -107
  142. data/redesign/js/plugins/howl/howl.js +0 -70
  143. data/redesign/js/plugins/howl/howl.min.js +0 -2
  144. data/redesign/js/plugins/icheck/jquery.icheck.js +0 -462
  145. data/redesign/js/plugins/icheck/jquery.icheck.min.js +0 -11
  146. data/redesign/js/plugins/icheck/skins/all.css +0 -61
  147. data/redesign/js/plugins/icheck/skins/flat/_all.css +0 -540
  148. data/redesign/js/plugins/icheck/skins/flat/aero.css +0 -54
  149. data/redesign/js/plugins/icheck/skins/flat/aero.png +0 -0
  150. data/redesign/js/plugins/icheck/skins/flat/aero@2x.png +0 -0
  151. data/redesign/js/plugins/icheck/skins/flat/blue.css +0 -54
  152. data/redesign/js/plugins/icheck/skins/flat/blue.png +0 -0
  153. data/redesign/js/plugins/icheck/skins/flat/blue@2x.png +0 -0
  154. data/redesign/js/plugins/icheck/skins/flat/flat.css +0 -54
  155. data/redesign/js/plugins/icheck/skins/flat/flat.png +0 -0
  156. data/redesign/js/plugins/icheck/skins/flat/flat@2x.png +0 -0
  157. data/redesign/js/plugins/icheck/skins/flat/green.css +0 -54
  158. data/redesign/js/plugins/icheck/skins/flat/green.png +0 -0
  159. data/redesign/js/plugins/icheck/skins/flat/green@2x.png +0 -0
  160. data/redesign/js/plugins/icheck/skins/flat/grey.css +0 -54
  161. data/redesign/js/plugins/icheck/skins/flat/grey.png +0 -0
  162. data/redesign/js/plugins/icheck/skins/flat/grey@2x.png +0 -0
  163. data/redesign/js/plugins/icheck/skins/flat/orange.css +0 -54
  164. data/redesign/js/plugins/icheck/skins/flat/orange.png +0 -0
  165. data/redesign/js/plugins/icheck/skins/flat/orange@2x.png +0 -0
  166. data/redesign/js/plugins/icheck/skins/flat/pink.css +0 -54
  167. data/redesign/js/plugins/icheck/skins/flat/pink.png +0 -0
  168. data/redesign/js/plugins/icheck/skins/flat/pink@2x.png +0 -0
  169. data/redesign/js/plugins/icheck/skins/flat/purple.css +0 -54
  170. data/redesign/js/plugins/icheck/skins/flat/purple.png +0 -0
  171. data/redesign/js/plugins/icheck/skins/flat/purple@2x.png +0 -0
  172. data/redesign/js/plugins/icheck/skins/flat/red.css +0 -54
  173. data/redesign/js/plugins/icheck/skins/flat/red.png +0 -0
  174. data/redesign/js/plugins/icheck/skins/flat/red@2x.png +0 -0
  175. data/redesign/js/plugins/icheck/skins/flat/yellow.css +0 -54
  176. data/redesign/js/plugins/icheck/skins/flat/yellow.png +0 -0
  177. data/redesign/js/plugins/icheck/skins/flat/yellow@2x.png +0 -0
  178. data/redesign/js/plugins/icheck/skins/futurico/futurico.css +0 -54
  179. data/redesign/js/plugins/icheck/skins/futurico/futurico.png +0 -0
  180. data/redesign/js/plugins/icheck/skins/futurico/futurico@2x.png +0 -0
  181. data/redesign/js/plugins/icheck/skins/line/_all.css +0 -740
  182. data/redesign/js/plugins/icheck/skins/line/aero.css +0 -74
  183. data/redesign/js/plugins/icheck/skins/line/blue.css +0 -74
  184. data/redesign/js/plugins/icheck/skins/line/green.css +0 -74
  185. data/redesign/js/plugins/icheck/skins/line/grey.css +0 -74
  186. data/redesign/js/plugins/icheck/skins/line/line.css +0 -74
  187. data/redesign/js/plugins/icheck/skins/line/line.png +0 -0
  188. data/redesign/js/plugins/icheck/skins/line/line@2x.png +0 -0
  189. data/redesign/js/plugins/icheck/skins/line/orange.css +0 -74
  190. data/redesign/js/plugins/icheck/skins/line/pink.css +0 -74
  191. data/redesign/js/plugins/icheck/skins/line/purple.css +0 -74
  192. data/redesign/js/plugins/icheck/skins/line/red.css +0 -74
  193. data/redesign/js/plugins/icheck/skins/line/yellow.css +0 -74
  194. data/redesign/js/plugins/icheck/skins/minimal/_all.css +0 -600
  195. data/redesign/js/plugins/icheck/skins/minimal/aero.css +0 -60
  196. data/redesign/js/plugins/icheck/skins/minimal/aero.png +0 -0
  197. data/redesign/js/plugins/icheck/skins/minimal/aero@2x.png +0 -0
  198. data/redesign/js/plugins/icheck/skins/minimal/blue.css +0 -60
  199. data/redesign/js/plugins/icheck/skins/minimal/blue.png +0 -0
  200. data/redesign/js/plugins/icheck/skins/minimal/blue@2x.png +0 -0
  201. data/redesign/js/plugins/icheck/skins/minimal/green.css +0 -60
  202. data/redesign/js/plugins/icheck/skins/minimal/green.png +0 -0
  203. data/redesign/js/plugins/icheck/skins/minimal/green@2x.png +0 -0
  204. data/redesign/js/plugins/icheck/skins/minimal/grey.css +0 -60
  205. data/redesign/js/plugins/icheck/skins/minimal/grey.png +0 -0
  206. data/redesign/js/plugins/icheck/skins/minimal/grey@2x.png +0 -0
  207. data/redesign/js/plugins/icheck/skins/minimal/minimal.css +0 -60
  208. data/redesign/js/plugins/icheck/skins/minimal/minimal.png +0 -0
  209. data/redesign/js/plugins/icheck/skins/minimal/minimal@2x.png +0 -0
  210. data/redesign/js/plugins/icheck/skins/minimal/orange.css +0 -60
  211. data/redesign/js/plugins/icheck/skins/minimal/orange.png +0 -0
  212. data/redesign/js/plugins/icheck/skins/minimal/orange@2x.png +0 -0
  213. data/redesign/js/plugins/icheck/skins/minimal/pink.css +0 -60
  214. data/redesign/js/plugins/icheck/skins/minimal/pink.png +0 -0
  215. data/redesign/js/plugins/icheck/skins/minimal/pink@2x.png +0 -0
  216. data/redesign/js/plugins/icheck/skins/minimal/purple.css +0 -60
  217. data/redesign/js/plugins/icheck/skins/minimal/purple.png +0 -0
  218. data/redesign/js/plugins/icheck/skins/minimal/purple@2x.png +0 -0
  219. data/redesign/js/plugins/icheck/skins/minimal/red.css +0 -60
  220. data/redesign/js/plugins/icheck/skins/minimal/red.png +0 -0
  221. data/redesign/js/plugins/icheck/skins/minimal/red@2x.png +0 -0
  222. data/redesign/js/plugins/icheck/skins/minimal/yellow.css +0 -60
  223. data/redesign/js/plugins/icheck/skins/minimal/yellow.png +0 -0
  224. data/redesign/js/plugins/icheck/skins/minimal/yellow@2x.png +0 -0
  225. data/redesign/js/plugins/icheck/skins/polaris/polaris.css +0 -60
  226. data/redesign/js/plugins/icheck/skins/polaris/polaris.png +0 -0
  227. data/redesign/js/plugins/icheck/skins/polaris/polaris@2x.png +0 -0
  228. data/redesign/js/plugins/icheck/skins/square/_all.css +0 -600
  229. data/redesign/js/plugins/icheck/skins/square/aero.css +0 -60
  230. data/redesign/js/plugins/icheck/skins/square/aero.png +0 -0
  231. data/redesign/js/plugins/icheck/skins/square/aero@2x.png +0 -0
  232. data/redesign/js/plugins/icheck/skins/square/blue.css +0 -60
  233. data/redesign/js/plugins/icheck/skins/square/blue.png +0 -0
  234. data/redesign/js/plugins/icheck/skins/square/blue@2x.png +0 -0
  235. data/redesign/js/plugins/icheck/skins/square/green.css +0 -60
  236. data/redesign/js/plugins/icheck/skins/square/green.png +0 -0
  237. data/redesign/js/plugins/icheck/skins/square/green@2x.png +0 -0
  238. data/redesign/js/plugins/icheck/skins/square/grey.css +0 -60
  239. data/redesign/js/plugins/icheck/skins/square/grey.png +0 -0
  240. data/redesign/js/plugins/icheck/skins/square/grey@2x.png +0 -0
  241. data/redesign/js/plugins/icheck/skins/square/orange.css +0 -60
  242. data/redesign/js/plugins/icheck/skins/square/orange.png +0 -0
  243. data/redesign/js/plugins/icheck/skins/square/orange@2x.png +0 -0
  244. data/redesign/js/plugins/icheck/skins/square/pink.css +0 -60
  245. data/redesign/js/plugins/icheck/skins/square/pink.png +0 -0
  246. data/redesign/js/plugins/icheck/skins/square/pink@2x.png +0 -0
  247. data/redesign/js/plugins/icheck/skins/square/purple.css +0 -60
  248. data/redesign/js/plugins/icheck/skins/square/purple.png +0 -0
  249. data/redesign/js/plugins/icheck/skins/square/purple@2x.png +0 -0
  250. data/redesign/js/plugins/icheck/skins/square/red.css +0 -60
  251. data/redesign/js/plugins/icheck/skins/square/red.png +0 -0
  252. data/redesign/js/plugins/icheck/skins/square/red@2x.png +0 -0
  253. data/redesign/js/plugins/icheck/skins/square/square.css +0 -60
  254. data/redesign/js/plugins/icheck/skins/square/square.png +0 -0
  255. data/redesign/js/plugins/icheck/skins/square/square@2x.png +0 -0
  256. data/redesign/js/plugins/icheck/skins/square/yellow.css +0 -60
  257. data/redesign/js/plugins/icheck/skins/square/yellow.png +0 -0
  258. data/redesign/js/plugins/icheck/skins/square/yellow@2x.png +0 -0
  259. data/redesign/js/plugins/magnific/jquery.magnific-popup.js +0 -2026
  260. data/redesign/js/plugins/magnific/jquery.magnific-popup.min.js +0 -4
  261. data/redesign/js/plugins/magnific/magnific-popup.css +0 -396
  262. data/redesign/js/plugins/morris/morris.css +0 -1
  263. data/redesign/js/plugins/morris/morris.min.js +0 -1
  264. data/redesign/js/plugins/parsley/parsley.js +0 -1363
  265. data/redesign/js/plugins/select2/select2-spinner.gif +0 -0
  266. data/redesign/js/plugins/select2/select2.css +0 -615
  267. data/redesign/js/plugins/select2/select2.js +0 -3217
  268. data/redesign/js/plugins/select2/select2.min.js +0 -22
  269. data/redesign/js/plugins/select2/select2.png +0 -0
  270. data/redesign/js/plugins/select2/select2x2.png +0 -0
  271. data/redesign/js/plugins/simplecolorpicker/jquery.simplecolorpicker.css +0 -98
  272. data/redesign/js/plugins/simplecolorpicker/jquery.simplecolorpicker.js +0 -211
  273. data/redesign/js/plugins/sparkline/jquery.sparkline.min.js +0 -5
  274. data/redesign/js/plugins/tableCheckable/jquery.tableCheckable.js +0 -122
  275. data/redesign/js/plugins/textarea-counter/jquery.textarea-counter.js +0 -163
  276. data/redesign/js/plugins/timepicker/bootstrap-timepicker.css +0 -121
  277. data/redesign/js/plugins/timepicker/bootstrap-timepicker.js +0 -893
  278. data/redesign/page-404.html +0 -446
  279. data/redesign/page-500.html +0 -453
  280. data/redesign/page-blank.html +0 -417
  281. data/redesign/page-calendar.html +0 -491
  282. data/redesign/page-gallery.html +0 -736
  283. data/redesign/page-invoice.html +0 -705
  284. data/redesign/page-login-social.html +0 -111
  285. data/redesign/page-login.html +0 -82
  286. data/redesign/page-pricing.html +0 -707
  287. data/redesign/page-settings.html +0 -665
  288. data/redesign/page-support.html +0 -825
  289. data/redesign/table-advanced.html +0 -1297
  290. data/redesign/table-basic.html +0 -777
  291. data/redesign/table-responsive.html +0 -720
  292. data/redesign/ui-buttons.html +0 -901
  293. data/redesign/ui-icons.html +0 -1392
  294. data/redesign/ui-popups.html +0 -781
  295. data/redesign/ui-portlets.html +0 -887
  296. data/redesign/ui-sliders.html +0 -520
  297. data/redesign/ui-tabs.html +0 -663
  298. data/redesign/ui-typography.html +0 -687
@@ -1,4 +0,0 @@
1
- /*! Magnific Popup - v0.9.5 - 2013-08-21
2
- * http://dimsemenov.com/plugins/magnific-popup/
3
- * Copyright (c) 2013 Dmitry Semenov; */
4
- (function(e){var t,i,n,o,a,r,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",v="."+g,h="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,i){t.ev.on(g+e+v,i)},k=function(t,i,n,o){var a=document.createElement("div");return a.className="mfp-"+t,n&&(a.innerHTML=n),o?i&&i.appendChild(a):(a=e(a),i&&a.appendTo(i)),a},T=function(i,n){t.ev.triggerHandler(g+i,n),t.st.callbacks&&(i=i.charAt(0).toLowerCase()+i.slice(1),t.st.callbacks[i]&&t.st.callbacks[i].apply(t,e.isArray(n)?n:[n]))},E=function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},S=function(i){return i===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=i),t.currTemplate.closeBtn},P=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},_=function(i){if(!e(i).hasClass(y)){var n=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(n&&o)return!0;if(!t.content||e(i).hasClass("mfp-close")||t.preloader&&i===t.preloader[0])return!0;if(i===t.content[0]||e.contains(t.content[0],i)){if(n)return!0}else if(o&&e.contains(document,i))return!0;return!1}},O=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var i=navigator.appVersion;t.isIE7=-1!==i.indexOf("MSIE 7."),t.isIE8=-1!==i.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(i),t.isIOS=/iphone|ipad|ipod/gi.test(i),t.supportsTransition=O(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),n=e(document.body),o=e(document),t.popupsCache={}},open:function(i){var n;if(i.isObj===!1){t.items=i.items.toArray(),t.index=0;var a,s=i.items;for(n=0;s.length>n;n++)if(a=s[n],a.parsed&&(a=a.el[0]),a===i.el[0]){t.index=n;break}}else t.items=e.isArray(i.items)?i.items:[i.items],t.index=i.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],r="",t.ev=i.mainEl&&i.mainEl.length?i.mainEl.eq(0):o,i.key?(t.popupsCache[i.key]||(t.popupsCache[i.key]={}),t.currTemplate=t.popupsCache[i.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,i),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+v,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+v,function(e){_(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var l=e.magnificPopup.modules;for(n=0;l.length>n;n++){var c=l[n];c=c.charAt(0).toUpperCase()+c.slice(1),t["init"+c].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,i,n){i.close_replaceWith=S(n.type)}),r+=" mfp-close-btn-in"):t.wrap.append(S())),t.st.alignTop&&(r+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+v,function(e){27===e.keyCode&&t.close()}),I.on("resize"+v,function(){t.updateSize()}),t.st.closeOnContentClick||(r+=" mfp-auto-cursor"),r&&t.wrap.addClass(r);var d=t.wH=I.height(),u={};if(t.fixedContentPos&&t._hasScrollBar(d)){var m=t._getScrollbarSize();m&&(u.paddingRight=m)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):u.overflow="hidden");var g=t.st.mainClass;t.isIE7&&(g+=" mfp-ie7"),g&&t._addClassToMFP(g),t.updateItemHTML(),T("BuildControls"),e("html").css(u),t.bgOverlay.add(t.wrap).prependTo(document.body),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(h),E()):t.bgOverlay.addClass(h),o.on("focusin"+v,function(i){return i.target===t.wrap[0]||e.contains(t.wrap[0],i.target)?void 0:(E(),!1)})},16),t.isOpen=!0,t.updateSize(d),T(f)},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var i=C+" "+h+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(i+=t.st.mainClass+" "),t._removeClassFromMFP(i),t.fixedContentPos){var n={paddingRight:""};t.isIE7?e("body, html").css("overflow",""):n.overflow="",e("html").css(n)}o.off("keyup"+v+" focusin"+v),t.ev.off(v),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var i=document.documentElement.clientWidth/window.innerWidth,n=window.innerHeight*i;t.wrap.css("height",n),t.wH=n}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var i=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),i.parsed||(i=t.parseEl(t.index));var n=i.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",n]),t.currItem=i,!t.currTemplate[n]){var o=t.st[n]?t.st[n].markup:!1;T("FirstMarkupParse",o),t.currTemplate[n]=o?e(o):!0}a&&a!==i.type&&t.container.removeClass("mfp-"+a+"-holder");var r=t["get"+n.charAt(0).toUpperCase()+n.slice(1)](i,t.currTemplate[n]);t.appendContent(r,n),i.preloaded=!0,T(m,i),a=i.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,i){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[i]===!0?t.content.find(".mfp-close").length||t.content.append(S()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+i+"-holder"),t.contentContainer.append(t.content)},parseEl:function(i){var n=t.items[i],o=n.type;if(n=n.tagName?{el:e(n)}:{data:n,src:n.src},n.el){for(var a=t.types,r=0;a.length>r;r++)if(n.el.hasClass("mfp-"+a[r])){o=a[r];break}n.src=n.el.attr("data-mfp-src"),n.src||(n.src=n.el.attr("href"))}return n.type=o||t.st.type||"inline",n.index=i,n.parsed=!0,t.items[i]=n,T("ElementParse",n),t.items[i]},addGroup:function(e,i){var n=function(n){n.mfpEl=this,t._openClick(n,e,i)};i||(i={});var o="click.magnificPopup";i.mainEl=e,i.items?(i.isObj=!0,e.off(o).on(o,n)):(i.isObj=!1,i.delegate?e.off(o).on(o,i.delegate,n):(i.items=e,e.off(o).on(o,n)))},_openClick:function(i,n,o){var a=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(a||2!==i.which&&!i.ctrlKey&&!i.metaKey){var r=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(r)if(e.isFunction(r)){if(!r.call(t))return!0}else if(r>I.width())return!0;i.type&&(i.preventDefault(),t.isOpen&&i.stopPropagation()),o.el=e(i.mfpEl),o.delegate&&(o.items=n.find(o.delegate)),t.open(o)}},updateStatus:function(e,n){if(t.preloader){i!==e&&t.container.removeClass("mfp-s-"+i),n||"loading"!==e||(n=t.st.tLoading);var o={status:e,text:n};T("UpdateStatus",o),e=o.status,n=o.text,t.preloader.html(n),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),i=e}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_parseMarkup:function(t,i,n){var o;n.data&&(i=e.extend(n.data,i)),T(p,[t,i,n]),e.each(i,function(e,i){if(void 0===i||i===!1)return!0;if(o=e.split("_"),o.length>1){var n=t.find(v+"-"+o[0]);if(n.length>0){var a=o[1];"replaceWith"===a?n[0]!==i[0]&&n.replaceWith(i):"img"===a?n.is("img")?n.attr("src",i):n.replaceWith('<img src="'+i+'" class="'+n.attr("class")+'" />'):n.attr(o[1],i)}}else t.find(v+"-"+e).html(i)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(e,t){return P(),e||(e={}),e.isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return e.magnificPopup.instance.close()},registerModule:function(t,i){i.options&&(e.magnificPopup.defaults[t]=i.options),e.extend(this.proto,i.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">&times;</button>',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(i){P();var n=e(this);if("string"==typeof i)if("open"===i){var o,a=b?n.data("magnificPopup"):n[0].magnificPopup,r=parseInt(arguments[1],10)||0;a.items?o=a.items[r]:(o=n,a.delegate&&(o=o.find(a.delegate)),o=o.eq(r)),t._openClick({mfpEl:o},n,a)}else t.isOpen&&t[i].apply(t,Array.prototype.slice.call(arguments,1));else b?n.data("magnificPopup",i):n[0].magnificPopup=i,t.addGroup(n,i);return n};var z,M,B,H="inline",L=function(){B&&(M.after(B.addClass(z)).detach(),B=null)};e.magnificPopup.registerModule(H,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(H),x(l+"."+H,function(){L()})},getInline:function(i,n){if(L(),i.src){var o=t.st.inline,a=e(i.src);if(a.length){var r=a[0].parentNode;r&&r.tagName&&(M||(z=o.hiddenClass,M=k(z),z="mfp-"+z),B=a.after(M).detach().removeClass(z)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),a=e("<div>");return i.inlineElement=a,a}return t.updateStatus("ready"),t._parseMarkup(n,{},i),n}}});var A,F="ajax",j=function(){A&&n.removeClass(A)};e.magnificPopup.registerModule(F,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'<a href="%url%">The content</a> could not be loaded.'},proto:{initAjax:function(){t.types.push(F),A=t.st.ajax.cursor,x(l+"."+F,function(){j(),t.req&&t.req.abort()})},getAjax:function(i){A&&n.addClass(A),t.updateStatus("loading");var o=e.extend({url:i.src,success:function(n,o,a){var r={data:n,xhr:a};T("ParseAjax",r),t.appendContent(e(r.data),F),i.finished=!0,j(),E(),setTimeout(function(){t.wrap.addClass(h)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){j(),i.finished=i.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",i.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var N,W=function(i){if(i.data&&void 0!==i.data.title)return i.data.title;var n=t.st.image.titleSrc;if(n){if(e.isFunction(n))return n.call(t,i);if(i.el)return i.el.attr(n)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><div class="mfp-img"></div><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var e=t.st.image,i=".image";t.types.push("image"),x(f+i,function(){"image"===t.currItem.type&&e.cursor&&n.addClass(e.cursor)}),x(l+i,function(){e.cursor&&n.removeClass(e.cursor),I.off("resize"+v)}),x("Resize"+i,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var i=0;t.isLowIE&&(i=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-i)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,N&&clearInterval(N),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var i=0,n=e.img[0],o=function(a){N&&clearInterval(N),N=setInterval(function(){return n.naturalWidth>0?(t._onImageHasSize(e),void 0):(i>200&&clearInterval(N),i++,3===i?o(10):40===i?o(50):100===i&&o(500),void 0)},a)};o(1)},getImage:function(i,n){var o=0,a=function(){i&&(i.img[0].complete?(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("ready")),i.hasSize=!0,i.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(a,100):r()))},r=function(){i&&(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("error",s.tError.replace("%url%",i.src))),i.hasSize=!0,i.loaded=!0,i.loadError=!0)},s=t.st.image,l=n.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",i.img=e(c).on("load.mfploader",a).on("error.mfploader",r),c.src=i.src,l.is("img")&&(i.img=i.img.clone()),i.img[0].naturalWidth>0&&(i.hasSize=!0)}return t._parseMarkup(n,{title:W(i),img_replaceWith:i.img},i),t.resizeImage(),i.hasSize?(N&&clearInterval(N),i.loadError?(n.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",i.src))):(n.removeClass("mfp-loading"),t.updateStatus("ready")),n):(t.updateStatus("loading"),i.loading=!0,i.hasSize||(i.imgHidden=!0,n.addClass("mfp-loading"),t.findImageSize(i)),n)}}});var R,Z=function(){return void 0===R&&(R=void 0!==document.createElement("p").style.MozTransform),R};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e=t.st.zoom,i=".zoom";if(e.enabled&&t.supportsTransition){var n,o,a=e.duration,r=function(t){var i=t.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),n="all "+e.duration/1e3+"s "+e.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},a="transition";return o["-webkit-"+a]=o["-moz-"+a]=o["-o-"+a]=o[a]=n,i.css(o),i},s=function(){t.content.css("visibility","visible")};x("BuildControls"+i,function(){if(t._allowZoom()){if(clearTimeout(n),t.content.css("visibility","hidden"),image=t._getItemToZoom(),!image)return s(),void 0;o=r(image),o.css(t._getOffset()),t.wrap.append(o),n=setTimeout(function(){o.css(t._getOffset(!0)),n=setTimeout(function(){s(),setTimeout(function(){o.remove(),image=o=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+i,function(){if(t._allowZoom()){if(clearTimeout(n),t.st.removalDelay=a,!image){if(image=t._getItemToZoom(),!image)return;o=r(image)}o.css(t._getOffset(!0)),t.wrap.append(o),t.content.css("visibility","hidden"),setTimeout(function(){o.css(t._getOffset())},16)}}),x(l+i,function(){t._allowZoom()&&(s(),o&&o.remove())})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(i){var n;n=i?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=n.offset(),a=parseInt(n.css("padding-top"),10),r=parseInt(n.css("padding-bottom"),10);o.top-=e(window).scrollTop()-a;var s={width:n.width(),height:(b?n.innerHeight():n[0].offsetHeight)-r-a};return Z()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var q="iframe",D="//about:blank",K=function(e){if(t.currTemplate[q]){var i=t.currTemplate[q].find("iframe");i.length&&(e||(i[0].src=D),t.isIE8&&i.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(q,{options:{markup:'<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(q),x("BeforeChange",function(e,t,i){t!==i&&(t===q?K():i===q&&K(!0))}),x(l+"."+q,function(){K()})},getIframe:function(i,n){var o=i.src,a=t.st.iframe;e.each(a.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var r={};return a.srcAction&&(r[a.srcAction]=o),t._parseMarkup(n,r,i),t.updateStatus("ready"),n}}});var Y=function(e){var i=t.items.length;return e>i-1?e-i:0>e?i+e:e},U=function(e,t,i){return e.replace("%curr%",t+1).replace("%total%",i)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=t.st.gallery,n=".mfp-gallery",a=Boolean(e.fn.mfpFastClick);return t.direction=!0,i&&i.enabled?(r+=" mfp-gallery",x(f+n,function(){i.navigateByImgClick&&t.wrap.on("click"+n,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+n,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+n,function(e,i){i.text&&(i.text=U(i.text,t.currItem.index,t.items.length))}),x(p+n,function(e,n,o,a){var r=t.items.length;o.counter=r>1?U(i.tCounter,a.index,r):""}),x("BuildControls"+n,function(){if(t.items.length>1&&i.arrows&&!t.arrowLeft){var n=i.arrowMarkup,o=t.arrowLeft=e(n.replace("%title%",i.tPrev).replace("%dir%","left")).addClass(y),r=t.arrowRight=e(n.replace("%title%",i.tNext).replace("%dir%","right")).addClass(y),s=a?"mfpFastClick":"click";o[s](function(){t.prev()}),r[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",r[0],!1,!0),k("a",r[0],!1,!0)),t.container.append(o.add(r))}}),x(m+n,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+n,function(){o.off(n),t.wrap.off("click"+n),t.arrowLeft&&a&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=Y(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=Y(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,i=t.st.gallery.preload,n=Math.min(i[0],t.items.length),o=Math.min(i[1],t.items.length);for(e=1;(t.direction?o:n)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?n:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(i){if(i=Y(i),!t.items[i].preloaded){var n=t.items[i];n.parsed||(n=t.parseEl(i)),T("LazyLoad",n),"image"===n.type&&(n.img=e('<img class="mfp-img" />').on("load.mfploader",function(){n.hasSize=!0}).on("error.mfploader",function(){n.hasSize=!0,n.loadError=!0,T("LazyLoadError",n)}).attr("src",n.src)),n.preloaded=!0}}}});var G="retina";e.magnificPopup.registerModule(G,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,i=e.ratio;i=isNaN(i)?i():i,i>1&&(x("ImageHasSize."+G,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/i,width:"100%"})}),x("ElementParse."+G,function(t,n){n.src=e.replaceSrc(n,i)}))}}}}),function(){var t=1e3,i="ontouchstart"in window,n=function(){I.off("touchmove"+a+" touchend"+a)},o="mfpFastClick",a="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var r,s=e(this);if(i){var l,c,d,u,p,f;s.on("touchstart"+a,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+a,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,n())}).on("touchend"+a,function(e){n(),u||f>1||(r=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){r=!1},t),o())})})}s.on("click"+a,function(){r||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+a+" click"+a),i&&I.off("touchmove"+a+" touchend"+a)}}()})(window.jQuery||window.Zepto);
@@ -1,396 +0,0 @@
1
- /* Magnific Popup CSS */
2
- .mfp-bg {
3
- top: 0;
4
- left: 0;
5
- width: 100%;
6
- height: 100%;
7
- z-index: 1042;
8
- overflow: hidden;
9
- position: fixed;
10
- background: #0b0b0b;
11
- opacity: 0.8;
12
- filter: alpha(opacity=80); }
13
-
14
- .mfp-wrap {
15
- top: 0;
16
- left: 0;
17
- width: 100%;
18
- height: 100%;
19
- z-index: 1043;
20
- position: fixed;
21
- outline: none !important;
22
- -webkit-backface-visibility: hidden; }
23
-
24
- .mfp-container {
25
- text-align: center;
26
- position: absolute;
27
- width: 100%;
28
- height: 100%;
29
- left: 0;
30
- top: 0;
31
- padding: 0 8px;
32
- -webkit-box-sizing: border-box;
33
- -moz-box-sizing: border-box;
34
- box-sizing: border-box; }
35
-
36
- .mfp-container:before {
37
- content: '';
38
- display: inline-block;
39
- height: 100%;
40
- vertical-align: middle; }
41
-
42
- .mfp-align-top .mfp-container:before {
43
- display: none; }
44
-
45
- .mfp-content {
46
- position: relative;
47
- display: inline-block;
48
- vertical-align: middle;
49
- margin: 0 auto;
50
- text-align: left;
51
- z-index: 1045; }
52
-
53
- .mfp-inline-holder .mfp-content,
54
- .mfp-ajax-holder .mfp-content {
55
- width: 100%;
56
- cursor: auto; }
57
-
58
- .mfp-ajax-cur {
59
- cursor: progress; }
60
-
61
- .mfp-zoom-out-cur,
62
- .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
63
- cursor: -moz-zoom-out;
64
- cursor: -webkit-zoom-out;
65
- cursor: zoom-out; }
66
-
67
- .mfp-zoom {
68
- cursor: pointer;
69
- cursor: -webkit-zoom-in;
70
- cursor: -moz-zoom-in;
71
- cursor: zoom-in; }
72
-
73
- .mfp-auto-cursor .mfp-content {
74
- cursor: auto; }
75
-
76
- .mfp-close,
77
- .mfp-arrow,
78
- .mfp-preloader,
79
- .mfp-counter {
80
- -webkit-user-select: none;
81
- -moz-user-select: none;
82
- user-select: none; }
83
-
84
- .mfp-loading.mfp-figure {
85
- display: none; }
86
-
87
- .mfp-hide {
88
- display: none !important; }
89
-
90
- .mfp-preloader {
91
- color: #cccccc;
92
- position: absolute;
93
- top: 50%;
94
- width: auto;
95
- text-align: center;
96
- margin-top: -0.8em;
97
- left: 8px;
98
- right: 8px;
99
- z-index: 1044; }
100
-
101
- .mfp-preloader a {
102
- color: #cccccc; }
103
-
104
- .mfp-preloader a:hover {
105
- color: white; }
106
-
107
- .mfp-s-ready .mfp-preloader {
108
- display: none; }
109
-
110
- .mfp-s-error .mfp-content {
111
- display: none; }
112
-
113
- button.mfp-close,
114
- button.mfp-arrow {
115
- overflow: visible;
116
- cursor: pointer;
117
- background: transparent;
118
- border: 0;
119
- -webkit-appearance: none;
120
- display: block;
121
- padding: 0;
122
- z-index: 1046;
123
- -webkit-box-shadow: none;
124
- box-shadow: none; }
125
-
126
- button::-moz-focus-inner {
127
- padding: 0;
128
- border: 0; }
129
-
130
- .mfp-close {
131
- width: 44px;
132
- height: 44px;
133
- line-height: 44px;
134
- position: absolute;
135
- right: 0;
136
- top: 0;
137
- text-decoration: none;
138
- text-align: center;
139
- opacity: 0.65;
140
- padding: 0 0 18px 10px;
141
- color: white;
142
- font-style: normal;
143
- font-size: 28px;
144
- font-family: Arial, Baskerville, monospace; }
145
- .mfp-close:hover, .mfp-close:focus {
146
- opacity: 1; }
147
- .mfp-close:active {
148
- top: 1px; }
149
-
150
- .mfp-close-btn-in .mfp-close {
151
- color: #333333; }
152
-
153
- .mfp-image-holder .mfp-close,
154
- .mfp-iframe-holder .mfp-close {
155
- color: white;
156
- right: -6px;
157
- text-align: right;
158
- padding-right: 6px;
159
- width: 100%; }
160
-
161
- .mfp-counter {
162
- position: absolute;
163
- top: 0;
164
- right: 0;
165
- color: #cccccc;
166
- font-size: 12px;
167
- line-height: 18px; }
168
-
169
- .mfp-arrow {
170
- position: absolute;
171
- opacity: 0.65;
172
- margin: 0;
173
- top: 50%;
174
- margin-top: -55px;
175
- padding: 0;
176
- width: 90px;
177
- height: 110px;
178
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
179
-
180
- .mfp-arrow:active {
181
- margin-top: -54px; }
182
-
183
- .mfp-arrow:hover,
184
- .mfp-arrow:focus {
185
- opacity: 1; }
186
-
187
- .mfp-arrow:before, .mfp-arrow:after,
188
- .mfp-arrow .mfp-b,
189
- .mfp-arrow .mfp-a {
190
- content: '';
191
- display: block;
192
- width: 0;
193
- height: 0;
194
- position: absolute;
195
- left: 0;
196
- top: 0;
197
- margin-top: 35px;
198
- margin-left: 35px;
199
- border: medium inset transparent; }
200
- .mfp-arrow:after,
201
- .mfp-arrow .mfp-a {
202
- border-top-width: 13px;
203
- border-bottom-width: 13px;
204
- top: 8px; }
205
- .mfp-arrow:before,
206
- .mfp-arrow .mfp-b {
207
- border-top-width: 21px;
208
- border-bottom-width: 21px; }
209
-
210
- .mfp-arrow-left {
211
- left: 0; }
212
- .mfp-arrow-left:after,
213
- .mfp-arrow-left .mfp-a {
214
- border-right: 17px solid white;
215
- margin-left: 31px; }
216
- .mfp-arrow-left:before,
217
- .mfp-arrow-left .mfp-b {
218
- margin-left: 25px;
219
- border-right: 27px solid #3f3f3f; }
220
-
221
- .mfp-arrow-right {
222
- right: 0; }
223
- .mfp-arrow-right:after,
224
- .mfp-arrow-right .mfp-a {
225
- border-left: 17px solid white;
226
- margin-left: 39px; }
227
- .mfp-arrow-right:before,
228
- .mfp-arrow-right .mfp-b {
229
- border-left: 27px solid #3f3f3f; }
230
-
231
- .mfp-iframe-holder {
232
- padding-top: 40px;
233
- padding-bottom: 40px; }
234
-
235
- .mfp-iframe-holder .mfp-content {
236
- line-height: 0;
237
- width: 100%;
238
- max-width: 900px; }
239
-
240
- .mfp-iframe-scaler {
241
- width: 100%;
242
- height: 0;
243
- overflow: hidden;
244
- padding-top: 56.25%; }
245
-
246
- .mfp-iframe-scaler iframe {
247
- position: absolute;
248
- display: block;
249
- top: 0;
250
- left: 0;
251
- width: 100%;
252
- height: 100%;
253
- box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
254
- background: black; }
255
-
256
- .mfp-iframe-holder .mfp-close {
257
- top: -40px; }
258
-
259
- /* Main image in popup */
260
- img.mfp-img {
261
- width: auto;
262
- max-width: 100%;
263
- height: auto;
264
- display: block;
265
- line-height: 0;
266
- -webkit-box-sizing: border-box;
267
- -moz-box-sizing: border-box;
268
- box-sizing: border-box;
269
- padding: 40px 0 40px;
270
- margin: 0 auto; }
271
-
272
- /* The shadow behind the image */
273
- .mfp-figure:after {
274
- content: '';
275
- position: absolute;
276
- left: 0;
277
- top: 40px;
278
- bottom: 40px;
279
- display: block;
280
- right: 0;
281
- width: auto;
282
- height: auto;
283
- z-index: -1;
284
- box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
285
- background: #444444; }
286
-
287
- .mfp-figure {
288
- line-height: 0; }
289
-
290
- .mfp-bottom-bar {
291
- margin-top: -36px;
292
- position: absolute;
293
- top: 100%;
294
- left: 0;
295
- width: 100%;
296
- cursor: auto; }
297
-
298
- .mfp-title {
299
- text-align: left;
300
- line-height: 18px;
301
- color: #f3f3f3;
302
- word-wrap: break-word;
303
- padding-right: 36px; }
304
-
305
- .mfp-figure small {
306
- color: #bdbdbd;
307
- display: block;
308
- font-size: 12px;
309
- line-height: 14px; }
310
-
311
- .mfp-image-holder .mfp-content {
312
- max-width: 100%; }
313
-
314
- .mfp-gallery .mfp-image-holder .mfp-figure {
315
- cursor: pointer; }
316
-
317
- @media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
318
- /**
319
- * Remove all paddings around the image on small screen
320
- */
321
- .mfp-img-mobile .mfp-image-holder {
322
- padding-left: 0;
323
- padding-right: 0; }
324
-
325
- .mfp-img-mobile img.mfp-img {
326
- padding: 0; }
327
-
328
- /* The shadow behind the image */
329
- .mfp-img-mobile .mfp-figure:after {
330
- top: 0;
331
- bottom: 0; }
332
-
333
- .mfp-img-mobile .mfp-bottom-bar {
334
- background: rgba(0, 0, 0, 0.6);
335
- bottom: 0;
336
- margin: 0;
337
- top: auto;
338
- padding: 3px 5px;
339
- position: fixed;
340
- -webkit-box-sizing: border-box;
341
- -moz-box-sizing: border-box;
342
- box-sizing: border-box; }
343
-
344
- .mfp-img-mobile .mfp-bottom-bar:empty {
345
- padding: 0; }
346
-
347
- .mfp-img-mobile .mfp-counter {
348
- right: 5px;
349
- top: 3px; }
350
-
351
- .mfp-img-mobile .mfp-close {
352
- top: 0;
353
- right: 0;
354
- width: 35px;
355
- height: 35px;
356
- line-height: 35px;
357
- background: rgba(0, 0, 0, 0.6);
358
- position: fixed;
359
- text-align: center;
360
- padding: 0; }
361
-
362
- .mfp-img-mobile .mfp-figure small {
363
- display: inline;
364
- margin-left: 5px; } }
365
- @media all and (max-width: 900px) {
366
- .mfp-arrow {
367
- -webkit-transform: scale(0.75);
368
- transform: scale(0.75); }
369
-
370
- .mfp-arrow-left {
371
- -webkit-transform-origin: 0;
372
- transform-origin: 0; }
373
-
374
- .mfp-arrow-right {
375
- -webkit-transform-origin: 100%;
376
- transform-origin: 100%; }
377
-
378
- .mfp-container {
379
- padding-left: 6px;
380
- padding-right: 6px; } }
381
- .mfp-ie7 .mfp-img {
382
- padding: 0; }
383
- .mfp-ie7 .mfp-bottom-bar {
384
- width: 600px;
385
- left: 50%;
386
- margin-left: -300px;
387
- margin-top: 5px;
388
- padding-bottom: 5px; }
389
- .mfp-ie7 .mfp-container {
390
- padding: 0; }
391
- .mfp-ie7 .mfp-content {
392
- padding-top: 44px; }
393
- .mfp-ie7 .mfp-close {
394
- top: 0;
395
- right: 0;
396
- padding-top: 0; }
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- (function(){var e,t,n,r,i=[].slice,s={}.hasOwnProperty,o=function(e,t){function r(){this.constructor=e}for(var n in t)s.call(t,n)&&(e[n]=t[n]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e},u=function(e,t){return function(){return e.apply(t,arguments)}},a=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};t=window.Morris={},e=jQuery,t.EventEmitter=function(){function e(){}return e.prototype.on=function(e,t){return this.handlers==null&&(this.handlers={}),this.handlers[e]==null&&(this.handlers[e]=[]),this.handlers[e].push(t)},e.prototype.fire=function(){var e,t,n,r,s,o,u;n=arguments[0],e=2<=arguments.length?i.call(arguments,1):[];if(this.handlers!=null&&this.handlers[n]!=null){o=this.handlers[n],u=[];for(r=0,s=o.length;r<s;r++)t=o[r],u.push(t.apply(null,e));return u}},e}(),t.commas=function(e){var t,n,r,i;return e!=null?(r=e<0?"-":"",t=Math.abs(e),n=Math.floor(t).toFixed(0),r+=n.replace(/(?=(?:\d{3})+$)(?!^)/g,","),i=t.toString(),i.length>n.length&&(r+=i.slice(n.length)),r):"-"},t.pad2=function(e){return(e<10?"0":"")+e},t.Grid=function(n){function r(t){var n=this;typeof t.element=="string"?this.el=e(document.getElementById(t.element)):this.el=e(t.element);if(this.el==null||this.el.length===0)throw new Error("Graph container element not found");this.el.css("position")==="static"&&this.el.css("position","relative"),this.options=e.extend({},this.gridDefaults,this.defaults||{},t),typeof this.options.units=="string"&&(this.options.postUnits=t.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(e){var t;return t=n.el.offset(),n.fire("hovermove",e.pageX-t.left,e.pageY-t.top)}),this.el.bind("mouseout",function(e){return n.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(e){var t,r;return r=e.originalEvent.touches[0]||e.originalEvent.changedTouches[0],t=n.el.offset(),n.fire("hover",r.pageX-t.left,r.pageY-t.top),r}),this.postInit&&this.postInit()}return o(r,n),r.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,hideHover:!1,yLabelFormat:null,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"]},r.prototype.setData=function(e,n){var r,i,s,o,u,a,f,l,c,h,p,d;n==null&&(n=!0);if(e==null||e.length===0){this.data=[],this.raphael.clear(),this.hover!=null&&this.hover.hide();return}h=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(u=Math.min.apply(null,this.options.goals),o=Math.max.apply(null,this.options.goals),p=p!=null?Math.min(p,u):u,h=h!=null?Math.max(h,o):o),this.data=function(){var n,r,o;o=[];for(s=n=0,r=e.length;n<r;s=++n)f=e[s],a={},a.label=f[this.options.xkey],this.options.parseTime?(a.x=t.parseDate(a.label),this.options.dateFormat?a.label=this.options.dateFormat(a.x):typeof a.label=="number"&&(a.label=(new Date(a.label)).toString())):a.x=s,l=0,a.y=function(){var e,t,n,r;n=this.options.ykeys,r=[];for(i=e=0,t=n.length;e<t;i=++e)c=n[i],d=f[c],typeof d=="string"&&(d=parseFloat(d)),d!=null&&typeof d!="number"&&(d=null),d!=null&&(this.cumulative?l+=d:h!=null?(h=Math.max(d,h),p=Math.min(d,p)):h=p=d),this.cumulative&&l!=null&&(h=Math.max(l,h),p=Math.min(l,p)),r.push(d);return r}.call(this),o.push(a);return o}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(e,t){return(e.x>t.x)-(t.x>e.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.parseTime&&this.options.events.length>0&&(this.events=function(){var e,n,i,s;i=this.options.events,s=[];for(e=0,n=i.length;e<n;e++)r=i[e],s.push(t.parseDate(r));return s}.call(this),this.xmax=Math.max(this.xmax,Math.max.apply(null,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(null,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",h),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),this.yInterval=(this.ymax-this.ymin)/(this.options.numLines-1),this.yInterval>0&&this.yInterval<1?this.precision=-Math.floor(Math.log(this.yInterval)/Math.log(10)):this.precision=0,this.dirty=!0;if(n)return this.redraw()},r.prototype.yboundary=function(e,t){var n,r;return n=this.options["y"+e],typeof n=="string"?n.slice(0,4)==="auto"?n.length>5?(r=parseInt(n.slice(5),10),t==null?r:Math[e](t,r)):t!=null?t:0:parseInt(n,10):n},r.prototype._calc=function(){var e,t,n;n=this.el.width(),e=this.el.height();if(this.elementWidth!==n||this.elementHeight!==e||this.dirty){this.elementWidth=n,this.elementHeight=e,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,this.options.axes&&(t=Math.max(this.measureText(this.yAxisFormat(this.ymin),this.options.gridTextSize).width,this.measureText(this.yAxisFormat(this.ymax),this.options.gridTextSize).width),this.left+=t,this.bottom-=1.5*this.options.gridTextSize),this.width=this.right-this.left,this.height=this.bottom-this.top,this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin);if(this.calc)return this.calc()}},r.prototype.transY=function(e){return this.bottom-(e-this.ymin)*this.dy},r.prototype.transX=function(e){return this.data.length===1?(this.left+this.right)/2:this.left+(e-this.xmin)*this.dx},r.prototype.redraw=function(){this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents();if(this.draw)return this.draw()},r.prototype.measureText=function(e,t){var n,r;return t==null&&(t=12),r=this.raphael.text(100,100,e).attr("font-size",t),n=r.getBBox(),r.remove(),n},r.prototype.yAxisFormat=function(e){return this.yLabelFormat(e)},r.prototype.yLabelFormat=function(e){return typeof this.options.yLabelFormat=="function"?this.options.yLabelFormat(e):""+this.options.preUnits+t.commas(e)+this.options.postUnits},r.prototype.updateHover=function(e,t){var n,r;n=this.hitTest(e,t);if(n!=null)return(r=this.hover).update.apply(r,n)},r.prototype.drawGrid=function(){var e,t,n,r,i,s,o,u;if(this.options.grid===!1&&this.options.axes===!1)return;e=this.ymin,t=this.ymax,u=[];for(n=s=e,o=this.yInterval;e<=t?s<=t:s>=t;n=s+=o)r=parseFloat(n.toFixed(this.precision)),i=this.transY(r),this.options.axes&&this.drawYAxisLabel(this.left-this.options.padding/2,i,this.yAxisFormat(r)),this.options.grid?u.push(this.drawGridLine("M"+this.left+","+i+"H"+(this.left+this.width))):u.push(void 0);return u},r.prototype.drawGoals=function(){var e,t,n,r,i,s,o;s=this.options.goals,o=[];for(n=r=0,i=s.length;r<i;n=++r)t=s[n],e=this.options.goalLineColors[n%this.options.goalLineColors.length],o.push(this.drawGoal(t,e));return o},r.prototype.drawEvents=function(){var e,t,n,r,i,s,o;s=this.events,o=[];for(n=r=0,i=s.length;r<i;n=++r)t=s[n],e=this.options.eventLineColors[n%this.options.eventLineColors.length],o.push(this.drawEvent(t,e));return o},r.prototype.drawGoal=function(e,t){return this.raphael.path("M"+this.left+","+this.transY(e)+"H"+this.right).attr("stroke",t).attr("stroke-width",this.options.goalStrokeWidth)},r.prototype.drawEvent=function(e,t){return this.raphael.path("M"+this.transX(e)+","+this.bottom+"V"+this.top).attr("stroke",t).attr("stroke-width",this.options.eventStrokeWidth)},r.prototype.drawYAxisLabel=function(e,t,n){return this.raphael.text(e,t,n).attr("font-size",this.options.gridTextSize).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},r.prototype.drawGridLine=function(e){return this.raphael.path(e).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},r}(t.EventEmitter),t.parseDate=function(e){var t,n,r,i,s,o,u,a,f,l,c;return typeof e=="number"?e:(n=e.match(/^(\d+) Q(\d)$/),i=e.match(/^(\d+)-(\d+)$/),s=e.match(/^(\d+)-(\d+)-(\d+)$/),u=e.match(/^(\d+) W(\d+)$/),a=e.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),f=e.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),n?(new Date(parseInt(n[1],10),parseInt(n[2],10)*3-1,1)).getTime():i?(new Date(parseInt(i[1],10),parseInt(i[2],10)-1,1)).getTime():s?(new Date(parseInt(s[1],10),parseInt(s[2],10)-1,parseInt(s[3],10))).getTime():u?(l=new Date(parseInt(u[1],10),0,1),l.getDay()!==4&&l.setMonth(0,1+(4-l.getDay()+7)%7),l.getTime()+parseInt(u[2],10)*6048e5):a?a[6]?(o=0,a[6]!=="Z"&&(o=parseInt(a[8],10)*60+parseInt(a[9],10),a[7]==="+"&&(o=0-o)),Date.UTC(parseInt(a[1],10),parseInt(a[2],10)-1,parseInt(a[3],10),parseInt(a[4],10),parseInt(a[5],10)+o)):(new Date(parseInt(a[1],10),parseInt(a[2],10)-1,parseInt(a[3],10),parseInt(a[4],10),parseInt(a[5],10))).getTime():f?(c=parseFloat(f[6]),t=Math.floor(c),r=Math.round((c-t)*1e3),f[8]?(o=0,f[8]!=="Z"&&(o=parseInt(f[10],10)*60+parseInt(f[11],10),f[9]==="+"&&(o=0-o)),Date.UTC(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10),parseInt(f[4],10),parseInt(f[5],10)+o,t,r)):(new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10),parseInt(f[4],10),parseInt(f[5],10),t,r)).getTime()):(new Date(parseInt(e,10),0,1)).getTime())},t.Hover=function(){function n(n){n==null&&(n={}),this.options=e.extend({},t.Hover.defaults,n),this.el=e("<div class='"+this.options["class"]+"'></div>"),this.el.hide(),this.options.parent.append(this.el)}return n.defaults={"class":"morris-hover morris-default-style"},n.prototype.update=function(e,t,n){return this.html(e),this.show(),this.moveTo(t,n)},n.prototype.html=function(e){return this.el.html(e)},n.prototype.moveTo=function(e,t){var n,r,i,s,o,u;return o=this.options.parent.innerWidth(),s=this.options.parent.innerHeight(),r=this.el.outerWidth(),n=this.el.outerHeight(),i=Math.min(Math.max(0,e-r/2),o-r),t!=null?(u=t-n-10,u<0&&(u=t+10,u+n>s&&(u=s/2-n/2))):u=s/2-n/2,this.el.css({left:i+"px",top:u+"px"})},n.prototype.show=function(){return this.el.show()},n.prototype.hide=function(){return this.el.hide()},n}(),t.Line=function(e){function n(e){this.hilight=u(this.hilight,this),this.onHoverOut=u(this.onHoverOut,this),this.onHoverMove=u(this.onHoverMove,this);if(!(this instanceof t.Line))return new t.Line(e);n.__super__.constructor.call(this,e)}return o(n,e),n.prototype.init=function(){this.pointGrow=Raphael.animation({r:this.options.pointSize+3},25,"linear"),this.pointShrink=Raphael.animation({r:this.options.pointSize},25,"linear");if(this.options.hideHover!=="always")return this.hover=new t.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut)},n.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:50,continuousLine:!0,hideHover:!1},n.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},n.prototype.calcPoints=function(){var e,t,n,r,i,s;i=this.data,s=[];for(n=0,r=i.length;n<r;n++)e=i[n],e._x=this.transX(e.x),e._y=function(){var n,r,i,s;i=e.y,s=[];for(n=0,r=i.length;n<r;n++)t=i[n],t!=null?s.push(this.transY(t)):s.push(t);return s}.call(this),s.push(e._ymax=Math.min.apply(null,[this.bottom].concat(function(){var n,r,i,s;i=e._y,s=[];for(n=0,r=i.length;n<r;n++)t=i[n],t!=null&&s.push(t);return s}())));return s},n.prototype.hitTest=function(e,t){var n,r,i,s,o;if(this.data.length===0)return null;o=this.data.slice(1);for(n=i=0,s=o.length;i<s;n=++i){r=o[n];if(e<(r._x+this.data[n]._x)/2)break}return n},n.prototype.onHoverMove=function(e,t){var n;return n=this.hitTest(e,t),this.displayHoverForRow(n)},n.prototype.onHoverOut=function(){if(this.options.hideHover==="auto")return this.displayHoverForRow(null)},n.prototype.displayHoverForRow=function(e){var t;return e!=null?((t=this.hover).update.apply(t,this.hoverContentForRow(e)),this.hilight(e)):(this.hover.hide(),this.hilight())},n.prototype.hoverContentForRow=function(e){var t,n,r,i,s,o,u;r=this.data[e];if(typeof this.options.hoverCallback=="function")t=this.options.hoverCallback(e,this.options);else{t="<div class='morris-hover-row-label'>"+r.label+"</div>",u=r.y;for(n=s=0,o=u.length;s<o;n=++s)i=u[n],t+="<div class='morris-hover-point' style='color: "+this.colorFor(r,n,"label")+"'>\n "+this.options.labels[n]+":\n "+this.yLabelFormat(i)+"\n</div>"}return[t,r._x,r._ymax]},n.prototype.generatePaths=function(){var e,n,r,i,s;return this.paths=function(){var o,u,f,l;l=[];for(r=o=0,u=this.options.ykeys.length;0<=u?o<u:o>u;r=0<=u?++o:--o)s=this.options.smooth===!0||(f=this.options.ykeys[r],a.call(this.options.smooth,f)>=0),n=function(){var e,t,n,s;n=this.data,s=[];for(e=0,t=n.length;e<t;e++)i=n[e],i._y[r]!==void 0&&s.push({x:i._x,y:i._y[r]});return s}.call(this),this.options.continuousLine&&(n=function(){var t,r,i;i=[];for(t=0,r=n.length;t<r;t++)e=n[t],e.y!==null&&i.push(e);return i}()),n.length>1?l.push(t.Line.createPath(n,s,this.bottom)):l.push(null);return l}.call(this)},n.prototype.draw=function(){this.options.axes&&this.drawXAxis(),this.drawSeries();if(this.options.hideHover===!1)return this.displayHoverForRow(this.data.length-1)},n.prototype.drawXAxis=function(){var e,n,r,i,s,o,u,a,f,l=this;o=this.bottom+this.options.gridTextSize*1.25,i=null,e=function(e,t){var n,r;return n=l.drawXAxisLabel(l.transX(t),o,e),r=n.getBBox(),(i==null||i>=r.x+r.width)&&r.x>=0&&r.x+r.width<l.el.width()?i=r.x-l.options.xLabelMargin:n.remove()},this.options.parseTime?this.data.length===1&&this.options.xLabels==="auto"?r=[[this.data[0].label,this.data[0].x]]:r=t.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):r=function(){var e,t,n,r;n=this.data,r=[];for(e=0,t=n.length;e<t;e++)s=n[e],r.push([s.label,s.x]);return r}.call(this),r.reverse(),f=[];for(u=0,a=r.length;u<a;u++)n=r[u],f.push(e(n[0],n[1]));return f},n.prototype.drawSeries=function(){var e,t,n,r,i,s,o,u,a;for(t=i=o=this.options.ykeys.length-1;o<=0?i<=0:i>=0;t=o<=0?++i:--i)n=this.paths[t],n!==null&&this.drawLinePath(n,this.colorFor(r,t,"line"));this.seriesPoints=function(){var e,n,r;r=[];for(t=e=0,n=this.options.ykeys.length;0<=n?e<n:e>n;t=0<=n?++e:--e)r.push([]);return r}.call(this),a=[];for(t=s=u=this.options.ykeys.length-1;u<=0?s<=0:s>=0;t=u<=0?++s:--s)a.push(function(){var n,i,s,o;s=this.data,o=[];for(n=0,i=s.length;n<i;n++)r=s[n],r._y[t]!=null?e=this.drawLinePoint(r._x,r._y[t],this.options.pointSize,this.colorFor(r,t,"point"),t):e=null,o.push(this.seriesPoints[t].push(e));return o}.call(this));return a},n.createPath=function(e,n,r){var i,s,o,u,a,f,l,c,h,p,d,v,m,g;l="",n&&(o=t.Line.gradients(e)),c={y:null};for(u=m=0,g=e.length;m<g;u=++m){i=e[u];if(i.y!=null)if(c.y!=null)n?(s=o[u],f=o[u-1],a=(i.x-c.x)/4,h=c.x+a,d=Math.min(r,c.y+a*f),p=i.x-a,v=Math.min(r,i.y-a*s),l+="C"+h+","+d+","+p+","+v+","+i.x+","+i.y):l+="L"+i.x+","+i.y;else if(!n||o[u]!=null)l+="M"+i.x+","+i.y;c=i}return l},n.gradients=function(e){var t,n,r,i,s,o,u,a;n=function(e,t){return(e.y-t.y)/(e.x-t.x)},a=[];for(r=o=0,u=e.length;o<u;r=++o)t=e[r],t.y!=null?(i=e[r+1]||{y:null},s=e[r-1]||{y:null},s.y!=null&&i.y!=null?a.push(n(s,i)):s.y!=null?a.push(n(s,t)):i.y!=null?a.push(n(t,i)):a.push(null)):a.push(null);return a},n.prototype.hilight=function(e){var t,n,r,i,s;if(this.prevHilight!==null&&this.prevHilight!==e)for(t=n=0,i=this.seriesPoints.length-1;0<=i?n<=i:n>=i;t=0<=i?++n:--n)this.seriesPoints[t][this.prevHilight]&&this.seriesPoints[t][this.prevHilight].animate(this.pointShrink);if(e!==null&&this.prevHilight!==e)for(t=r=0,s=this.seriesPoints.length-1;0<=s?r<=s:r>=s;t=0<=s?++r:--r)this.seriesPoints[t][e]&&this.seriesPoints[t][e].animate(this.pointGrow);return this.prevHilight=e},n.prototype.colorFor=function(e,t,n){return typeof this.options.lineColors=="function"?this.options.lineColors.call(this,e,t,n):n==="point"?this.options.pointFillColors[t%this.options.pointFillColors.length]||this.options.lineColors[t%this.options.lineColors.length]:this.options.lineColors[t%this.options.lineColors.length]},n.prototype.drawXAxisLabel=function(e,t,n){return this.raphael.text(e,t,n).attr("font-size",this.options.gridTextSize).attr("fill",this.options.gridTextColor)},n.prototype.drawLinePath=function(e,t){return this.raphael.path(e).attr("stroke",t).attr("stroke-width",this.options.lineWidth)},n.prototype.drawLinePoint=function(e,t,n,r,i){return this.raphael.circle(e,t,n).attr("fill",r).attr("stroke-width",this.strokeWidthForSeries(i)).attr("stroke",this.strokeForSeries(i))},n.prototype.strokeWidthForSeries=function(e){return this.options.pointWidths[e%this.options.pointWidths.length]},n.prototype.strokeForSeries=function(e){return this.options.pointStrokeColors[e%this.options.pointStrokeColors.length]},n}(t.Grid),t.labelSeries=function(n,r,i,s,o){var u,a,f,l,c,h,p,d,v,m,g;f=200*(r-n)/i,a=new Date(n),p=t.LABEL_SPECS[s];if(p===void 0){g=t.AUTO_LABEL_ORDER;for(v=0,m=g.length;v<m;v++){l=g[v],h=t.LABEL_SPECS[l];if(f>=h.span){p=h;break}}}p===void 0&&(p=t.LABEL_SPECS.second),o&&(p=e.extend({},p,{fmt:o})),u=p.start(a),c=[];while((d=u.getTime())<=r)d>=n&&c.push([p.fmt(u),d]),p.incr(u);return c},n=function(e){return{span:e*60*1e3,start:function(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours())},fmt:function(e){return""+t.pad2(e.getHours())+":"+t.pad2(e.getMinutes())},incr:function(t){return t.setMinutes(t.getMinutes()+e)}}},r=function(e){return{span:e*1e3,start:function(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes())},fmt:function(e){return""+t.pad2(e.getHours())+":"+t.pad2(e.getMinutes())+":"+t.pad2(e.getSeconds())},incr:function(t){return t.setSeconds(t.getSeconds()+e)}}},t.LABEL_SPECS={decade:{span:1728e8,start:function(e){return new Date(e.getFullYear()-e.getFullYear()%10,0,1)},fmt:function(e){return""+e.getFullYear()},incr:function(e){return e.setFullYear(e.getFullYear()+10)}},year:{span:1728e7,start:function(e){return new Date(e.getFullYear(),0,1)},fmt:function(e){return""+e.getFullYear()},incr:function(e){return e.setFullYear(e.getFullYear()+1)}},month:{span:24192e5,start:function(e){return new Date(e.getFullYear(),e.getMonth(),1)},fmt:function(e){return""+e.getFullYear()+"-"+t.pad2(e.getMonth()+1)},incr:function(e){return e.setMonth(e.getMonth()+1)}},day:{span:864e5,start:function(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())},fmt:function(e){return""+e.getFullYear()+"-"+t.pad2(e.getMonth()+1)+"-"+t.pad2(e.getDate())},incr:function(e){return e.setDate(e.getDate()+1)}},hour:n(60),"30min":n(30),"15min":n(15),"10min":n(10),"5min":n(5),minute:n(1),"30sec":r(30),"15sec":r(15),"10sec":r(10),"5sec":r(5),second:r(1)},t.AUTO_LABEL_ORDER=["decade","year","month","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],t.Area=function(e){function n(e){if(!(this instanceof t.Area))return new t.Area(e);this.cumulative=!0,n.__super__.constructor.call(this,e)}return o(n,e),n.prototype.calcPoints=function(){var e,t,n,r,i,s,o;s=this.data,o=[];for(r=0,i=s.length;r<i;r++)e=s[r],e._x=this.transX(e.x),t=0,e._y=function(){var r,i,s,o;s=e.y,o=[];for(r=0,i=s.length;r<i;r++)n=s[r],t+=n||0,o.push(this.transY(t));return o}.call(this),o.push(e._ymax=e._y[e._y.length-1]);return o},n.prototype.drawSeries=function(){var e,t,r,i;for(e=r=i=this.options.ykeys.length-1;i<=0?r<=0:r>=0;e=i<=0?++r:--r)t=this.paths[e],t!==null&&(t+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(t,this.fillForSeries(e)));return n.__super__.drawSeries.call(this)},n.prototype.fillForSeries=function(e){var t;return t=Raphael.rgb2hsl(this.colorFor(this.data[e],e,"line")),Raphael.hsl(t.h,Math.min(255,t.s*.75),Math.min(255,t.l*1.25))},n.prototype.drawFilledPath=function(e,t){return this.raphael.path(e).attr("fill",t).attr("stroke-width",0)},n}(t.Line),t.Bar=function(n){function r(n){this.onHoverOut=u(this.onHoverOut,this),this.onHoverMove=u(this.onHoverMove,this);if(!(this instanceof t.Bar))return new t.Bar(n);r.__super__.constructor.call(this,e.extend({},n,{parseTime:!1}))}return o(r,n),r.prototype.init=function(){this.cumulative=this.options.stacked;if(this.options.hideHover!=="always")return this.hover=new t.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut)},r.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],xLabelMargin:50},r.prototype.calc=function(){var e;this.calcBars();if(this.options.hideHover===!1)return(e=this.hover).update.apply(e,this.hoverContentForRow(this.data.length-1))},r.prototype.calcBars=function(){var e,t,n,r,i,s,o;s=this.data,o=[];for(e=r=0,i=s.length;r<i;e=++r)t=s[e],t._x=this.left+this.width*(e+.5)/this.data.length,o.push(t._y=function(){var e,r,i,s;i=t.y,s=[];for(e=0,r=i.length;e<r;e++)n=i[e],n!=null?s.push(this.transY(n)):s.push(null);return s}.call(this));return o},r.prototype.draw=function(){return this.options.axes&&this.drawXAxis(),this.drawSeries()},r.prototype.drawXAxis=function(){var e,t,n,r,i,s,o,u,a;s=this.bottom+this.options.gridTextSize*1.25,r=null,a=[];for(e=o=0,u=this.data.length;0<=u?o<u:o>u;e=0<=u?++o:--o)i=this.data[this.data.length-1-e],t=this.drawXAxisLabel(i._x,s,i.label),n=t.getBBox(),(r==null||r>=n.x+n.width)&&n.x>=0&&n.x+n.width<this.el.width()?a.push(r=n.x-this.options.xLabelMargin):a.push(t.remove());return a},r.prototype.drawSeries=function(){var e,t,n,r,i,s,o,u,a,f,l,c,h,p;return n=this.width/this.options.data.length,u=this.options.stacked!=null?1:this.options.ykeys.length,e=(n*this.options.barSizeRatio-this.options.barGap*(u-1))/u,o=n*(1-this.options.barSizeRatio)/2,p=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var u,d,v,m;v=this.data,m=[];for(r=u=0,d=v.length;u<d;r=++u)a=v[r],i=0,m.push(function(){var u,d,v,m;v=a._y,m=[];for(f=u=0,d=v.length;u<d;f=++u)h=v[f],h!==null?(p?(c=Math.min(h,p),t=Math.max(h,p)):(c=h,t=this.bottom),s=this.left+r*n+o,this.options.stacked||(s+=f*(e+this.options.barGap)),l=t-c,this.options.stacked&&(c-=i),this.drawBar(s,c,e,l,this.colorFor(a,f,"bar")),m.push(i+=l)):m.push(null);return m}.call(this));return m}.call(this)},r.prototype.colorFor=function(e,t,n){var r,i;return typeof this.options.barColors=="function"?(r={x:e.x,y:e.y[t],label:e.label},i={index:t,key:this.options.ykeys[t],label:this.options.labels[t]},this.options.barColors.call(this,r,i,n)):this.options.barColors[t%this.options.barColors.length]},r.prototype.hitTest=function(e,t){return this.data.length===0?null:(e=Math.max(Math.min(e,this.right),this.left),Math.min(this.data.length-1,Math.floor((e-this.left)/(this.width/this.data.length))))},r.prototype.onHoverMove=function(e,t){var n,r;return n=this.hitTest(e,t),(r=this.hover).update.apply(r,this.hoverContentForRow(n))},r.prototype.onHoverOut=function(){if(this.options.hideHover==="auto")return this.hover.hide()},r.prototype.hoverContentForRow=function(e){var t,n,r,i,s,o,u,a;if(typeof this.options.hoverCallback=="function")t=this.options.hoverCallback(e,this.options);else{r=this.data[e],t="<div class='morris-hover-row-label'>"+r.label+"</div>",a=r.y;for(n=o=0,u=a.length;o<u;n=++o)s=a[n],t+="<div class='morris-hover-point' style='color: "+this.colorFor(r,n,"label")+"'>\n "+this.options.labels[n]+":\n "+this.yLabelFormat(s)+"\n</div>"}return i=this.left+(e+.5)*this.width/this.data.length,[t,i]},r.prototype.drawXAxisLabel=function(e,t,n){var r;return r=this.raphael.text(e,t,n).attr("font-size",this.options.gridTextSize).attr("fill",this.options.gridTextColor)},r.prototype.drawBar=function(e,t,n,r,i){return this.raphael.rect(e,t,n,r).attr("fill",i).attr("stroke-width",0)},r}(t.Grid),t.Donut=function(){function n(n){this.select=u(this.select,this);if(!(this instanceof t.Donut))return new t.Donut(n);typeof n.element=="string"?this.el=e(document.getElementById(n.element)):this.el=e(n.element),this.options=e.extend({},this.defaults,n);if(this.el===null||this.el.length===0)throw new Error("Graph placeholder not found.");if(n.data===void 0||n.data.length===0)return;this.data=n.data,this.redraw()}return n.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:t.commas},n.prototype.redraw=function(){var e,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x;this.el.empty(),this.raphael=new Raphael(this.el[0]),n=this.el.width()/2,r=this.el.height()/2,h=(Math.min(n,r)-10)/3,c=0,w=this.data;for(d=0,g=w.length;d<g;d++)p=w[d],c+=p.value;a=5/(2*h),e=1.9999*Math.PI-a*this.data.length,o=0,s=0,this.segments=[],E=this.data;for(v=0,y=E.length;v<y;v++)i=E[v],f=o+a+e*(i.value/c),l=new t.DonutSegment(n,r,h*2,h,o,f,this.options.colors[s%this.options.colors.length],this.options.backgroundColor,i,this.raphael),l.render(),this.segments.push(l),l.on("hover",this.select),o=f,s+=1;this.text1=this.drawEmptyDonutLabel(n,r-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(n,r+10,this.options.labelColor,14),u=Math.max.apply(null,function(){var e,t,n,r;n=this.data,r=[];for(e=0,t=n.length;e<t;e++)i=n[e],r.push(i.value);return r}.call(this)),s=0,S=this.data,x=[];for(m=0,b=S.length;m<b;m++){i=S[m];if(i.value===u){this.select(s);break}x.push(s+=1)}return x},n.prototype.select=function(e){var t,n,r,i,s;s=this.segments;for(r=0,i=s.length;r<i;r++)t=s[r],t.deselect();return typeof e=="number"?n=this.segments[e]:n=e,n.select(),this.setLabels(n.data.label,this.options.formatter(n.data.value,n.data))},n.prototype.setLabels=function(e,t){var n,r,i,s,o,u,a,f;return n=(Math.min(this.el.width()/2,this.el.height()/2)-10)*2/3,s=1.8*n,i=n/2,r=n/3,this.text1.attr({text:e,transform:""}),o=this.text1.getBBox(),u=Math.min(s/o.width,i/o.height),this.text1.attr({transform:"S"+u+","+u+","+(o.x+o.width/2)+","+(o.y+o.height)}),this.text2.attr({text:t,transform:""}),a=this.text2.getBBox(),f=Math.min(s/a.width,r/a.height),this.text2.attr({transform:"S"+f+","+f+","+(a.x+a.width/2)+","+a.y})},n.prototype.drawEmptyDonutLabel=function(e,t,n,r,i){var s;return s=this.raphael.text(e,t,"").attr("font-size",r).attr("fill",n),i!=null&&s.attr("font-weight",i),s},n}(),t.DonutSegment=function(e){function t(e,t,n,r,i,s,o,a,f,l){this.cx=e,this.cy=t,this.inner=n,this.outer=r,this.color=o,this.backgroundColor=a,this.data=f,this.raphael=l,this.deselect=u(this.deselect,this),this.select=u(this.select,this),this.sin_p0=Math.sin(i),this.cos_p0=Math.cos(i),this.sin_p1=Math.sin(s),this.cos_p1=Math.cos(s),this.is_long=s-i>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return o(t,e),t.prototype.calcArcPoints=function(e){return[this.cx+e*this.sin_p0,this.cy+e*this.cos_p0,this.cx+e*this.sin_p1,this.cy+e*this.cos_p1]},t.prototype.calcSegment=function(e,t){var n,r,i,s,o,u,a,f,l,c;return l=this.calcArcPoints(e),n=l[0],i=l[1],r=l[2],s=l[3],c=this.calcArcPoints(t),o=c[0],a=c[1],u=c[2],f=c[3],"M"+n+","+i+("A"+e+","+e+",0,"+this.is_long+",0,"+r+","+s)+("L"+u+","+f)+("A"+t+","+t+",0,"+this.is_long+",1,"+o+","+a)+"Z"},t.prototype.calcArc=function(e){var t,n,r,i,s;return s=this.calcArcPoints(e),t=s[0],r=s[1],n=s[2],i=s[3],"M"+t+","+r+("A"+e+","+e+",0,"+this.is_long+",0,"+n+","+i)},t.prototype.render=function(){var e=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return e.fire("hover",e)})},t.prototype.drawDonutArc=function(e,t){return this.raphael.path(e).attr({stroke:t,"stroke-width":2,opacity:0})},t.prototype.drawDonutSegment=function(e,t,n,r){return this.raphael.path(e).attr({fill:t,stroke:n,"stroke-width":3}).hover(r)},t.prototype.select=function(){if(!this.selected)return this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0},t.prototype.deselect=function(){if(this.selected)return this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1},t}(t.EventEmitter)}).call(this);
@@ -1,1363 +0,0 @@
1
- /*
2
- * Parsley.js allows you to verify your form inputs frontend side, without writing a line of javascript. Or so..
3
- *
4
- * Author: Guillaume Potier - @guillaumepotier
5
- */
6
-
7
- !function ($) {
8
-
9
- 'use strict';
10
-
11
- /**
12
- * Validator class stores all constraints functions and associated messages.
13
- * Provides public interface to add, remove or modify them
14
- *
15
- * @class Validator
16
- * @constructor
17
- */
18
- var Validator = function ( options ) {
19
- /**
20
- * Error messages
21
- *
22
- * @property messages
23
- * @type {Object}
24
- */
25
- this.messages = {
26
- defaultMessage: "This value seems to be invalid."
27
- , type: {
28
- email: "This value should be a valid email."
29
- , url: "This value should be a valid url."
30
- , urlstrict: "This value should be a valid url."
31
- , number: "This value should be a valid number."
32
- , digits: "This value should be digits."
33
- , dateIso: "This value should be a valid date (YYYY-MM-DD)."
34
- , alphanum: "This value should be alphanumeric."
35
- , phone: "This value should be a valid phone number."
36
- }
37
- , notnull: "This value should not be null."
38
- , notblank: "This value should not be blank."
39
- , required: "This value is required."
40
- , regexp: "This value seems to be invalid."
41
- , min: "This value should be greater than or equal to %s."
42
- , max: "This value should be lower than or equal to %s."
43
- , range: "This value should be between %s and %s."
44
- , minlength: "This value is too short. It should have %s characters or more."
45
- , maxlength: "This value is too long. It should have %s characters or less."
46
- , rangelength: "This value length is invalid. It should be between %s and %s characters long."
47
- , mincheck: "You must select at least %s choices."
48
- , maxcheck: "You must select %s choices or less."
49
- , rangecheck: "You must select between %s and %s choices."
50
- , equalto: "This value should be the same."
51
- },
52
-
53
- this.init( options );
54
- };
55
-
56
- Validator.prototype = {
57
-
58
- constructor: Validator
59
-
60
- /**
61
- * Validator list. Built-in validators functions
62
- *
63
- * @property validators
64
- * @type {Object}
65
- */
66
- , validators: {
67
- notnull: function ( val ) {
68
- return val.length > 0;
69
- }
70
-
71
- , notblank: function ( val ) {
72
- return 'string' === typeof val && '' !== val.replace( /^\s+/g, '' ).replace( /\s+$/g, '' );
73
- }
74
-
75
- // Works on all inputs. val is object for checkboxes
76
- , required: function ( val ) {
77
-
78
- // for checkboxes and select multiples. Check there is at least one required value
79
- if ( 'object' === typeof val ) {
80
- for ( var i in val ) {
81
- if ( this.required( val[ i ] ) ) {
82
- return true;
83
- }
84
- }
85
-
86
- return false;
87
- }
88
-
89
- return this.notnull( val ) && this.notblank( val );
90
- }
91
-
92
- , type: function ( val, type ) {
93
- var regExp;
94
-
95
- switch ( type ) {
96
- case 'number':
97
- regExp = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/;
98
- break;
99
- case 'digits':
100
- regExp = /^\d+$/;
101
- break;
102
- case 'alphanum':
103
- regExp = /^\w+$/;
104
- break;
105
- case 'email':
106
- regExp = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([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]))){2,6}$/i;
107
- break;
108
- case 'url':
109
- val = new RegExp( '(https?|s?ftp|git)', 'i' ).test( val ) ? val : 'http://' + val;
110
- /* falls through */
111
- case 'urlstrict':
112
- regExp = /^(https?|s?ftp|git):\/\/(((([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;
113
- break;
114
- case 'dateIso':
115
- regExp = /^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])$/;
116
- break;
117
- case 'phone':
118
- regExp = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
119
- break;
120
- default:
121
- return false;
122
- }
123
-
124
- // test regExp if not null
125
- return '' !== val ? regExp.test( val ) : false;
126
- }
127
-
128
- , regexp: function ( val, regExp, self ) {
129
- return new RegExp( regExp, self.options.regexpFlag || '' ).test( val );
130
- }
131
-
132
- , minlength: function ( val, min ) {
133
- return val.length >= min;
134
- }
135
-
136
- , maxlength: function ( val, max ) {
137
- return val.length <= max;
138
- }
139
-
140
- , rangelength: function ( val, arrayRange ) {
141
- return this.minlength( val, arrayRange[ 0 ] ) && this.maxlength( val, arrayRange[ 1 ] );
142
- }
143
-
144
- , min: function ( val, min ) {
145
- return Number( val ) >= min;
146
- }
147
-
148
- , max: function ( val, max ) {
149
- return Number( val ) <= max;
150
- }
151
-
152
- , range: function ( val, arrayRange ) {
153
- return val >= arrayRange[ 0 ] && val <= arrayRange[ 1 ];
154
- }
155
-
156
- , equalto: function ( val, elem, self ) {
157
- self.options.validateIfUnchanged = true;
158
-
159
- return val === $( elem ).val();
160
- }
161
-
162
- , remote: function ( val, url, self ) {
163
- var result = null
164
- , data = {}
165
- , dataType = {};
166
-
167
- data[ self.$element.attr( 'name' ) ] = val;
168
-
169
- if ( 'undefined' !== typeof self.options.remoteDatatype ) {
170
- dataType = { dataType: self.options.remoteDatatype };
171
- }
172
-
173
- var manage = function ( isConstraintValid, message ) {
174
- // remove error message if we got a server message, different from previous message
175
- if ( 'undefined' !== typeof message && 'undefined' !== typeof self.Validator.messages.remote && message !== self.Validator.messages.remote ) {
176
- $( self.ulError + ' .remote' ).remove();
177
- }
178
-
179
- self.updtConstraint( { name: 'remote', valid: isConstraintValid }, message );
180
- self.manageValidationResult();
181
- };
182
-
183
- // transform string response into object
184
- var handleResponse = function ( response ) {
185
- if ( 'object' === typeof response ) {
186
- return response;
187
- }
188
-
189
- try {
190
- response = $.parseJSON( response );
191
- } catch ( err ) {}
192
-
193
- return response;
194
- }
195
-
196
- var manageErrorMessage = function ( response ) {
197
- return 'object' === typeof response && null !== response ? ( 'undefined' !== typeof response.error ? response.error : ( 'undefined' !== typeof response.message ? response.message : null ) ) : null;
198
- }
199
-
200
- $.ajax( $.extend( {}, {
201
- url: url
202
- , data: data
203
- , type: self.options.remoteMethod || 'GET'
204
- , success: function ( response ) {
205
- response = handleResponse( response );
206
- manage( 1 === response || true === response || ( 'object' === typeof response && null !== response && 'undefined' !== typeof response.success ), manageErrorMessage( response )
207
- );
208
- }
209
- , error: function ( response ) {
210
- response = handleResponse( response );
211
- manage( false, manageErrorMessage( response ) );
212
- }
213
- }, dataType ) );
214
-
215
- return result;
216
- }
217
-
218
- /**
219
- * Aliases for checkboxes constraints
220
- */
221
- , mincheck: function ( obj, val ) {
222
- return this.minlength( obj, val );
223
- }
224
-
225
- , maxcheck: function ( obj, val ) {
226
- return this.maxlength( obj, val);
227
- }
228
-
229
- , rangecheck: function ( obj, arrayRange ) {
230
- return this.rangelength( obj, arrayRange );
231
- }
232
- }
233
-
234
- /*
235
- * Register custom validators and messages
236
- */
237
- , init: function ( options ) {
238
- var customValidators = options.validators
239
- , customMessages = options.messages;
240
-
241
- var key;
242
- for ( key in customValidators ) {
243
- this.addValidator(key, customValidators[ key ]);
244
- }
245
-
246
- for ( key in customMessages ) {
247
- this.addMessage(key, customMessages[ key ]);
248
- }
249
- }
250
-
251
- /**
252
- * Replace %s placeholders by values
253
- *
254
- * @method formatMesssage
255
- * @param {String} message Message key
256
- * @param {Mixed} args Args passed by validators functions. Could be string, number or object
257
- * @return {String} Formatted string
258
- */
259
- , formatMesssage: function ( message, args ) {
260
-
261
- if ( 'object' === typeof args ) {
262
- for ( var i in args ) {
263
- message = this.formatMesssage( message, args[ i ] );
264
- }
265
-
266
- return message;
267
- }
268
-
269
- return 'string' === typeof message ? message.replace( new RegExp( '%s', 'i' ), args ) : '';
270
- }
271
-
272
- /**
273
- * Add / override a validator in validators list
274
- *
275
- * @method addValidator
276
- * @param {String} name Validator name. Will automatically bindable through data-name=''
277
- * @param {Function} fn Validator function. Must return {Boolean}
278
- */
279
- , addValidator: function ( name, fn ) {
280
- this.validators[ name ] = fn;
281
- }
282
-
283
- /**
284
- * Add / override error message
285
- *
286
- * @method addMessage
287
- * @param {String} name Message name. Will automatically be binded to validator with same name
288
- * @param {String} message Message
289
- */
290
- , addMessage: function ( key, message, type ) {
291
-
292
- if ( 'undefined' !== typeof type && true === type ) {
293
- this.messages.type[ key ] = message;
294
- return;
295
- }
296
-
297
- // custom types messages are a bit tricky cuz' nested ;)
298
- if ( 'type' === key ) {
299
- for ( var i in message ) {
300
- this.messages.type[ i ] = message[ i ];
301
- }
302
-
303
- return;
304
- }
305
-
306
- this.messages[ key ] = message;
307
- }
308
- };
309
-
310
- /**
311
- * ParsleyField class manage each form field inside a validated Parsley form.
312
- * Returns if field valid or not depending on its value and constraints
313
- * Manage field error display and behavior, event triggers and more
314
- *
315
- * @class ParsleyField
316
- * @constructor
317
- */
318
- var ParsleyField = function ( element, options, type ) {
319
- this.options = options;
320
- this.Validator = new Validator( options );
321
-
322
- // if type is ParsleyFieldMultiple, just return this. used for clone
323
- if ( type === 'ParsleyFieldMultiple' ) {
324
- return this;
325
- }
326
-
327
- this.init( element, type || 'ParsleyField' );
328
- };
329
-
330
- ParsleyField.prototype = {
331
-
332
- constructor: ParsleyField
333
-
334
- /**
335
- * Set some properties, bind constraint validators and validation events
336
- *
337
- * @method init
338
- * @param {Object} element
339
- * @param {Object} options
340
- */
341
- , init: function ( element, type ) {
342
- this.type = type;
343
- this.valid = true;
344
- this.element = element;
345
- this.validatedOnce = false;
346
- this.$element = $( element );
347
- this.val = this.$element.val();
348
- this.isRequired = false;
349
- this.constraints = {};
350
-
351
- // overriden by ParsleyItemMultiple if radio or checkbox input
352
- if ( 'undefined' === typeof this.isRadioOrCheckbox ) {
353
- this.isRadioOrCheckbox = false;
354
- this.hash = this.generateHash();
355
- this.errorClassHandler = this.options.errors.classHandler( element, this.isRadioOrCheckbox ) || this.$element;
356
- }
357
-
358
- // error ul dom management done only once at init
359
- this.ulErrorManagement();
360
-
361
- // bind some html5 properties
362
- this.bindHtml5Constraints();
363
-
364
- // bind validators to field
365
- this.addConstraints();
366
-
367
- // bind parsley events if validators have been registered
368
- if ( this.hasConstraints() ) {
369
- this.bindValidationEvents();
370
- }
371
- }
372
-
373
- , setParent: function ( elem ) {
374
- this.$parent = $( elem );
375
- }
376
-
377
- , getParent: function () {
378
- return this.$parent;
379
- }
380
-
381
- /**
382
- * Bind some extra html5 types / validators
383
- *
384
- * @private
385
- * @method bindHtml5Constraints
386
- */
387
- , bindHtml5Constraints: function () {
388
- // add html5 required support + class required support
389
- if ( this.$element.hasClass( 'required' ) || this.$element.prop( 'required' ) ) {
390
- this.options.required = true;
391
- }
392
-
393
- // add html5 supported types & options
394
- if ( 'undefined' !== typeof this.$element.attr( 'type' ) && new RegExp( this.$element.attr( 'type' ), 'i' ).test( 'email url number range' ) ) {
395
- this.options.type = this.$element.attr( 'type' );
396
-
397
- // number and range types could have min and/or max values
398
- if ( new RegExp( this.options.type, 'i' ).test( 'number range' ) ) {
399
- this.options.type = 'number';
400
-
401
- // double condition to support jQuery and Zepto.. :(
402
- if ( 'undefined' !== typeof this.$element.attr( 'min' ) && this.$element.attr( 'min' ).length ) {
403
- this.options.min = this.$element.attr( 'min' );
404
- }
405
-
406
- if ( 'undefined' !== typeof this.$element.attr( 'max' ) && this.$element.attr( 'max' ).length ) {
407
- this.options.max = this.$element.attr( 'max' );
408
- }
409
- }
410
- }
411
-
412
- if ( 'string' === typeof this.$element.attr( 'pattern' ) && this.$element.attr( 'pattern' ).length ) {
413
- this.options.regexp = this.$element.attr( 'pattern' );
414
- }
415
-
416
- }
417
-
418
- /**
419
- * Attach field validators functions passed through data-api
420
- *
421
- * @private
422
- * @method addConstraints
423
- */
424
- , addConstraints: function () {
425
- for ( var constraint in this.options ) {
426
- var addConstraint = {};
427
- addConstraint[ constraint ] = this.options[ constraint ];
428
- this.addConstraint( addConstraint, true );
429
- }
430
- }
431
-
432
- /**
433
- * Dynamically add a new constraint to a field
434
- *
435
- * @method addConstraint
436
- * @param {Object} constraint { name: requirements }
437
- */
438
- , addConstraint: function ( constraint, doNotUpdateValidationEvents ) {
439
- for ( var name in constraint ) {
440
- name = name.toLowerCase();
441
-
442
- if ( 'function' === typeof this.Validator.validators[ name ] ) {
443
- this.constraints[ name ] = {
444
- name: name
445
- , requirements: constraint[ name ]
446
- , valid: null
447
- }
448
-
449
- if ( name === 'required' ) {
450
- this.isRequired = true;
451
- }
452
-
453
- this.addCustomConstraintMessage( name );
454
- }
455
- }
456
-
457
- // force field validation next check and reset validation events
458
- if ( 'undefined' === typeof doNotUpdateValidationEvents ) {
459
- this.bindValidationEvents();
460
- }
461
- }
462
-
463
- /**
464
- * Dynamically update an existing constraint to a field.
465
- * Simple API: { name: requirements }
466
- *
467
- * @method updtConstraint
468
- * @param {Object} constraint
469
- */
470
- , updateConstraint: function ( constraint, message ) {
471
- for ( var name in constraint ) {
472
- this.updtConstraint( { name: name, requirements: constraint[ name ], valid: null }, message );
473
- }
474
- }
475
-
476
- /**
477
- * Dynamically update an existing constraint to a field.
478
- * Complex API: { name: name, requirements: requirements, valid: boolean }
479
- *
480
- * @method updtConstraint
481
- * @param {Object} constraint
482
- */
483
- , updtConstraint: function ( constraint, message ) {
484
- this.constraints[ constraint.name ] = $.extend( true, this.constraints[ constraint.name ], constraint );
485
-
486
- if ( 'string' === typeof message ) {
487
- this.Validator.messages[ constraint.name ] = message ;
488
- }
489
-
490
- // force field validation next check and reset validation events
491
- this.bindValidationEvents();
492
- }
493
-
494
- /**
495
- * Dynamically remove an existing constraint to a field.
496
- *
497
- * @method removeConstraint
498
- * @param {String} constraintName
499
- */
500
- , removeConstraint: function ( constraintName ) {
501
- var constraintName = constraintName.toLowerCase();
502
-
503
- delete this.constraints[ constraintName ];
504
-
505
- if ( constraintName === 'required' ) {
506
- this.isRequired = false;
507
- }
508
-
509
- // if there are no more constraint, destroy parsley instance for this field
510
- if ( !this.hasConstraints() ) {
511
- // in a form context, remove item from parent
512
- if ( 'ParsleyForm' === typeof this.getParent() ) {
513
- this.getParent().removeItem( this.$element );
514
- return;
515
- }
516
-
517
- this.destroy();
518
- return;
519
- }
520
-
521
- this.bindValidationEvents();
522
- }
523
-
524
- /**
525
- * Add custom constraint message, passed through data-API
526
- *
527
- * @private
528
- * @method addCustomConstraintMessage
529
- * @param constraint
530
- */
531
- , addCustomConstraintMessage: function ( constraint ) {
532
- // custom message type data-type-email-message -> typeEmailMessage | data-minlength-error => minlengthMessage
533
- var customMessage = constraint
534
- + ( 'type' === constraint && 'undefined' !== typeof this.options[ constraint ] ? this.options[ constraint ].charAt( 0 ).toUpperCase() + this.options[ constraint ].substr( 1 ) : '' )
535
- + 'Message';
536
-
537
- if ( 'undefined' !== typeof this.options[ customMessage ] ) {
538
- this.Validator.addMessage( 'type' === constraint ? this.options[ constraint ] : constraint, this.options[ customMessage ], 'type' === constraint );
539
- }
540
- }
541
-
542
- /**
543
- * Bind validation events on a field
544
- *
545
- * @private
546
- * @method bindValidationEvents
547
- */
548
- , bindValidationEvents: function () {
549
- // this field has validation events, that means it has to be validated
550
- this.valid = null;
551
- this.$element.addClass( 'parsley-validated' );
552
-
553
- // remove eventually already binded events
554
- this.$element.off( '.' + this.type );
555
-
556
- // force add 'change' event if async remote validator here to have result before form submitting
557
- if ( this.options.remote && !new RegExp( 'change', 'i' ).test( this.options.trigger ) ) {
558
- this.options.trigger = !this.options.trigger ? 'change' : ' change';
559
- }
560
-
561
- // alaways bind keyup event, for better UX when a field is invalid
562
- var triggers = ( !this.options.trigger ? '' : this.options.trigger )
563
- + ( new RegExp( 'key', 'i' ).test( this.options.trigger ) ? '' : ' keyup' );
564
-
565
- // alaways bind change event, for better UX when a select is invalid
566
- if ( this.$element.is( 'select' ) ) {
567
- triggers += new RegExp( 'change', 'i' ).test( triggers ) ? '' : ' change';
568
- }
569
-
570
- // trim triggers to bind them correctly with .on()
571
- triggers = triggers.replace( /^\s+/g , '' ).replace( /\s+$/g , '' );
572
-
573
- this.$element.on( ( triggers + ' ' ).split( ' ' ).join( '.' + this.type + ' ' ), false, $.proxy( this.eventValidation, this ) );
574
- }
575
-
576
- /**
577
- * Hash management. Used for ul error
578
- *
579
- * @method generateHash
580
- * @returns {String} 5 letters unique hash
581
- */
582
- , generateHash: function () {
583
- return 'parsley-' + ( Math.random() + '' ).substring( 2 );
584
- }
585
-
586
- /**
587
- * Public getHash accessor
588
- *
589
- * @method getHash
590
- * @returns {String} hash
591
- */
592
- , getHash: function () {
593
- return this.hash;
594
- }
595
-
596
- /**
597
- * Returns field val needed for validation
598
- * Special treatment for radio & checkboxes
599
- *
600
- * @method getVal
601
- * @returns {String} val
602
- */
603
- , getVal: function () {
604
- return this.$element.data('value') || this.$element.val();
605
- }
606
-
607
- /**
608
- * Called when validation is triggered by an event
609
- * Do nothing if val.length < this.options.validationMinlength
610
- *
611
- * @method eventValidation
612
- * @param {Object} event jQuery event
613
- */
614
- , eventValidation: function ( event ) {
615
- var val = this.getVal();
616
-
617
- // do nothing on keypress event if not explicitely passed as data-trigger and if field has not already been validated once
618
- if ( event.type === 'keyup' && !/keyup/i.test( this.options.trigger ) && !this.validatedOnce ) {
619
- return true;
620
- }
621
-
622
- // do nothing on change event if not explicitely passed as data-trigger and if field has not already been validated once
623
- if ( event.type === 'change' && !/change/i.test( this.options.trigger ) && !this.validatedOnce ) {
624
- return true;
625
- }
626
-
627
- // start validation process only if field has enough chars and validation never started
628
- if ( !this.isRadioOrCheckbox && this.getLength(val) < this.options.validationMinlength && !this.validatedOnce ) {
629
- return true;
630
- }
631
-
632
- this.validate();
633
- }
634
-
635
- /**
636
- * Get the length of a given value
637
- *
638
- * @method getLength
639
- * @return {int} The length of the value
640
- */
641
- , getLength: function(val) {
642
- if (!val || !val.hasOwnProperty('length')) return 0;
643
- return val.length;
644
- }
645
-
646
- /**
647
- * Return if field verify its constraints
648
- *
649
- * @method isValid
650
- * @return {Boolean} Is field valid or not
651
- */
652
- , isValid: function () {
653
- return this.validate( false );
654
- }
655
-
656
- /**
657
- * Return if field has constraints
658
- *
659
- * @method hasConstraints
660
- * @return {Boolean} Is field has constraints or not
661
- */
662
- , hasConstraints: function () {
663
- for ( var constraint in this.constraints ) {
664
- return true;
665
- }
666
-
667
- return false;
668
- }
669
-
670
- /**
671
- * Validate a field & display errors
672
- *
673
- * @method validate
674
- * @param {Boolean} errorBubbling set to false if you just want valid boolean without error bubbling next to fields
675
- * @return {Boolean} Is field valid or not
676
- */
677
- , validate: function ( errorBubbling ) {
678
- var val = this.getVal()
679
- , valid = null;
680
-
681
- // do not even bother trying validating a field w/o constraints
682
- if ( !this.hasConstraints() ) {
683
- return null;
684
- }
685
-
686
- // reset Parsley validation if onFieldValidate returns true, or if field is empty and not required
687
- if ( this.options.listeners.onFieldValidate( this.element, this ) || ( '' === val && !this.isRequired ) ) {
688
- this.reset();
689
- return null;
690
- }
691
-
692
- // do not validate a field already validated and unchanged !
693
- if ( !this.needsValidation( val ) ) {
694
- return this.valid;
695
- }
696
-
697
- valid = this.applyValidators();
698
-
699
- if ( 'undefined' !== typeof errorBubbling ? errorBubbling : this.options.showErrors ) {
700
- this.manageValidationResult();
701
- }
702
-
703
- return valid;
704
- }
705
-
706
- /**
707
- * Check if value has changed since previous validation
708
- *
709
- * @method needsValidation
710
- * @param value
711
- * @return {Boolean}
712
- */
713
- , needsValidation: function ( val ) {
714
- if ( !this.options.validateIfUnchanged && this.valid !== null && this.val === val && this.validatedOnce ) {
715
- return false;
716
- }
717
-
718
- this.val = val;
719
- return this.validatedOnce = true;
720
- }
721
-
722
- /**
723
- * Loop through every fields validators
724
- * Adds errors after unvalid fields
725
- *
726
- * @method applyValidators
727
- * @return {Mixed} {Boolean} If field valid or not, null if not validated
728
- */
729
- , applyValidators: function () {
730
- var valid = null;
731
-
732
- for ( var constraint in this.constraints ) {
733
- var result = this.Validator.validators[ this.constraints[ constraint ].name ]( this.val, this.constraints[ constraint ].requirements, this );
734
-
735
- if ( false === result ) {
736
- valid = false;
737
- this.constraints[ constraint ].valid = valid;
738
- } else if ( true === result ) {
739
- this.constraints[ constraint ].valid = true;
740
- valid = false !== valid;
741
- }
742
- }
743
-
744
- // listeners' ballet
745
- if (false === valid) {
746
- this.options.listeners.onFieldError( this.element, this.constraints, this );
747
- } else if (true === valid && false === this.options.listeners.onFieldSuccess( this.element, this.constraints, this )) {
748
- // if onFieldSuccess returns (bool) false, consider that field si invalid
749
- valid = false;
750
- }
751
-
752
- return valid;
753
- }
754
-
755
- /**
756
- * Fired when all validators have be executed
757
- * Returns true or false if field is valid or not
758
- * Display errors messages below failed fields
759
- * Adds parsley-success or parsley-error class on fields
760
- *
761
- * @method manageValidationResult
762
- * @return {Boolean} Is field valid or not
763
- */
764
- , manageValidationResult: function () {
765
- var valid = null;
766
-
767
- for ( var constraint in this.constraints ) {
768
- if ( false === this.constraints[ constraint ].valid ) {
769
- this.manageError( this.constraints[ constraint ] );
770
- valid = false;
771
- } else if ( true === this.constraints[ constraint ].valid ) {
772
- this.removeError( this.constraints[ constraint ].name );
773
- valid = false !== valid;
774
- }
775
- }
776
-
777
- this.valid = valid;
778
-
779
- if ( true === this.valid ) {
780
- this.removeErrors();
781
- this.errorClassHandler.removeClass( this.options.errorClass ).addClass( this.options.successClass );
782
- return true;
783
- } else if ( false === this.valid ) {
784
- this.errorClassHandler.removeClass( this.options.successClass ).addClass( this.options.errorClass );
785
- return false;
786
- }
787
-
788
- // remove li error, and ul error if no more li inside
789
- if ( this.ulError && $( this.ulError ).children().length === 0 ) {
790
- this.removeErrors();
791
- }
792
-
793
- return valid;
794
- }
795
-
796
- /**
797
- * Manage ul error Container
798
- *
799
- * @private
800
- * @method ulErrorManagement
801
- */
802
- , ulErrorManagement: function () {
803
- this.ulError = '#' + this.hash;
804
- this.ulTemplate = $( this.options.errors.errorsWrapper ).attr( 'id', this.hash ).addClass( 'parsley-error-list' );
805
- }
806
-
807
- /**
808
- * Remove li / ul error
809
- *
810
- * @method removeError
811
- * @param {String} constraintName Method Name
812
- */
813
- , removeError: function ( constraintName ) {
814
- var liError = this.ulError + ' .' + constraintName
815
- , that = this;
816
-
817
- this.options.animate ? $( liError ).fadeOut( this.options.animateDuration, function () {
818
- $( this ).remove();
819
-
820
- if ( that.ulError && $( that.ulError ).children().length === 0 ) {
821
- that.removeErrors();
822
- } } ) : $( liError ).remove();
823
- }
824
-
825
- /**
826
- * Add li error
827
- *
828
- * @method addError
829
- * @param {Object} { minlength: "error message for minlength constraint" }
830
- */
831
- , addError: function ( error ) {
832
- for ( var constraint in error ) {
833
- var liTemplate = $( this.options.errors.errorElem ).addClass( constraint );
834
-
835
- $( this.ulError ).append( this.options.animate ? $( liTemplate ).html( error[ constraint ] ).hide().fadeIn( this.options.animateDuration ) : $( liTemplate ).html( error[ constraint ] ) );
836
- }
837
- }
838
-
839
- /**
840
- * Remove all ul / li errors
841
- *
842
- * @method removeErrors
843
- */
844
- , removeErrors: function () {
845
- this.options.animate ? $( this.ulError ).fadeOut( this.options.animateDuration, function () { $( this ).remove(); } ) : $( this.ulError ).remove();
846
- }
847
-
848
- /**
849
- * Remove ul errors and parsley error or success classes
850
- *
851
- * @method reset
852
- */
853
- , reset: function () {
854
- this.valid = null;
855
- this.removeErrors();
856
- this.validatedOnce = false;
857
- this.errorClassHandler.removeClass( this.options.successClass ).removeClass( this.options.errorClass );
858
-
859
- for ( var constraint in this.constraints ) {
860
- this.constraints[ constraint ].valid = null;
861
- }
862
-
863
- return this;
864
- }
865
-
866
- /**
867
- * Add li / ul errors messages
868
- *
869
- * @method manageError
870
- * @param {Object} constraint
871
- */
872
- , manageError: function ( constraint ) {
873
- // display ulError container if it has been removed previously (or never shown)
874
- if ( !$( this.ulError ).length ) {
875
- this.manageErrorContainer();
876
- }
877
-
878
- // TODO: refacto properly
879
- // if required constraint but field is not null, do not display
880
- if ( 'required' === constraint.name && null !== this.getVal() && this.getVal().length > 0 ) {
881
- return;
882
- // if empty required field and non required constraint fails, do not display
883
- } else if ( this.isRequired && 'required' !== constraint.name && ( null === this.getVal() || 0 === this.getVal().length ) ) {
884
- this.removeError(constraint.name);
885
- return;
886
- }
887
-
888
- // TODO: refacto error name w/ proper & readable function
889
- var constraintName = constraint.name
890
- , liClass = false !== this.options.errorMessage ? 'custom-error-message' : constraintName
891
- , liError = {}
892
- , message = false !== this.options.errorMessage ? this.options.errorMessage : ( constraint.name === 'type' ?
893
- this.Validator.messages[ constraintName ][ constraint.requirements ] : ( 'undefined' === typeof this.Validator.messages[ constraintName ] ?
894
- this.Validator.messages.defaultMessage : this.Validator.formatMesssage( this.Validator.messages[ constraintName ], constraint.requirements ) ) );
895
-
896
- // add liError if not shown. Do not add more than once custom errorMessage if exist
897
- if ( !$( this.ulError + ' .' + liClass ).length ) {
898
- liError[ liClass ] = message;
899
- this.addError( liError );
900
- }
901
- }
902
-
903
- /**
904
- * Create ul error container
905
- *
906
- * @method manageErrorContainer
907
- */
908
- , manageErrorContainer: function () {
909
- var errorContainer = this.options.errorContainer || this.options.errors.container( this.element, this.isRadioOrCheckbox )
910
- , ulTemplate = this.options.animate ? this.ulTemplate.show() : this.ulTemplate;
911
-
912
- if ( 'undefined' !== typeof errorContainer ) {
913
- $( errorContainer ).append( ulTemplate );
914
- return;
915
- }
916
-
917
- !this.isRadioOrCheckbox ? this.$element.after( ulTemplate ) : this.$element.parent().after( ulTemplate );
918
- }
919
-
920
- /**
921
- * Add custom listeners
922
- *
923
- * @param {Object} { listener: function () {} }, eg { onFormSubmit: function ( valid, event, focus ) { ... } }
924
- */
925
- , addListener: function ( object ) {
926
- for ( var listener in object ) {
927
- this.options.listeners[ listener ] = object[ listener ];
928
- }
929
- }
930
-
931
- /**
932
- * Destroy parsley field instance
933
- *
934
- * @private
935
- * @method destroy
936
- */
937
- , destroy: function () {
938
- this.$element.removeClass( 'parsley-validated' );
939
- this.reset().$element.off( '.' + this.type ).removeData( this.type );
940
- }
941
- };
942
-
943
- /**
944
- * ParsleyFieldMultiple override ParsleyField for checkbox and radio inputs
945
- * Pseudo-heritance to manage divergent behavior from ParsleyItem in dedicated methods
946
- *
947
- * @class ParsleyFieldMultiple
948
- * @constructor
949
- */
950
- var ParsleyFieldMultiple = function ( element, options, type ) {
951
- this.initMultiple( element, options );
952
- this.inherit( element, options );
953
- this.Validator = new Validator( options );
954
-
955
- // call ParsleyField constructor
956
- this.init( element, type || 'ParsleyFieldMultiple' );
957
- };
958
-
959
- ParsleyFieldMultiple.prototype = {
960
-
961
- constructor: ParsleyFieldMultiple
962
-
963
- /**
964
- * Set some specific properties, call some extra methods to manage radio / checkbox
965
- *
966
- * @method init
967
- * @param {Object} element
968
- * @param {Object} options
969
- */
970
- , initMultiple: function ( element, options ) {
971
- this.element = element;
972
- this.$element = $( element );
973
- this.group = options.group || false;
974
- this.hash = this.getName();
975
- this.siblings = this.group ? '[data-group="' + this.group + '"]' : 'input[name="' + this.$element.attr( 'name' ) + '"]';
976
- this.isRadioOrCheckbox = true;
977
- this.isRadio = this.$element.is( 'input[type=radio]' );
978
- this.isCheckbox = this.$element.is( 'input[type=checkbox]' );
979
- this.errorClassHandler = options.errors.classHandler( element, this.isRadioOrCheckbox ) || this.$element.parent();
980
- }
981
-
982
- /**
983
- * Set specific constraints messages, do pseudo-heritance
984
- *
985
- * @private
986
- * @method inherit
987
- * @param {Object} element
988
- * @param {Object} options
989
- */
990
- , inherit: function ( element, options ) {
991
- var clone = new ParsleyField( element, options, 'ParsleyFieldMultiple' );
992
-
993
- for ( var property in clone ) {
994
- if ( 'undefined' === typeof this[ property ] ) {
995
- this[ property ] = clone [ property ];
996
- }
997
- }
998
- }
999
-
1000
- /**
1001
- * Set specific constraints messages, do pseudo-heritance
1002
- *
1003
- * @method getName
1004
- * @returns {String} radio / checkbox hash is cleaned 'name' or data-group property
1005
- */
1006
- , getName: function () {
1007
- if ( this.group ) {
1008
- return 'parsley-' + this.group;
1009
- }
1010
-
1011
- if ( 'undefined' === typeof this.$element.attr( 'name' ) ) {
1012
- throw "A radio / checkbox input must have a data-group attribute or a name to be Parsley validated !";
1013
- }
1014
-
1015
- return 'parsley-' + this.$element.attr( 'name' ).replace( /(:|\.|\[|\])/g, '' );
1016
- }
1017
-
1018
- /**
1019
- * Special treatment for radio & checkboxes
1020
- * Returns checked radio or checkboxes values
1021
- *
1022
- * @method getVal
1023
- * @returns {String} val
1024
- */
1025
- , getVal: function () {
1026
- if ( this.isRadio ) {
1027
- return $( this.siblings + ':checked' ).val() || '';
1028
- }
1029
-
1030
- if ( this.isCheckbox ) {
1031
- var values = [];
1032
-
1033
- $( this.siblings + ':checked' ).each( function () {
1034
- values.push( $( this ).val() );
1035
- } );
1036
-
1037
- return values;
1038
- }
1039
- }
1040
-
1041
- /**
1042
- * Bind validation events on a field
1043
- *
1044
- * @private
1045
- * @method bindValidationEvents
1046
- */
1047
- , bindValidationEvents: function () {
1048
- // this field has validation events, that means it has to be validated
1049
- this.valid = null;
1050
- this.$element.addClass( 'parsley-validated' );
1051
-
1052
- // remove eventually already binded events
1053
- this.$element.off( '.' + this.type );
1054
-
1055
- // alaways bind keyup event, for better UX when a field is invalid
1056
- var self = this
1057
- , triggers = ( !this.options.trigger ? '' : this.options.trigger )
1058
- + ( new RegExp( 'change', 'i' ).test( this.options.trigger ) ? '' : ' change' );
1059
-
1060
- // trim triggers to bind them correctly with .on()
1061
- triggers = triggers.replace( /^\s+/g , '' ).replace( /\s+$/g ,'' );
1062
-
1063
- // bind trigger event on every siblings
1064
- $( this.siblings ).each(function () {
1065
- $( this ).on( triggers.split( ' ' ).join( '.' + self.type + ' ' ) , false, $.proxy( self.eventValidation, self ) );
1066
- } )
1067
- }
1068
- };
1069
-
1070
- /**
1071
- * ParsleyForm class manage Parsley validated form.
1072
- * Manage its fields and global validation
1073
- *
1074
- * @class ParsleyForm
1075
- * @constructor
1076
- */
1077
- var ParsleyForm = function ( element, options, type ) {
1078
- this.init( element, options, type || 'parsleyForm' );
1079
- };
1080
-
1081
- ParsleyForm.prototype = {
1082
-
1083
- constructor: ParsleyForm
1084
-
1085
- /* init data, bind jQuery on() actions */
1086
- , init: function ( element, options, type ) {
1087
- this.type = type;
1088
- this.items = [];
1089
- this.$element = $( element );
1090
- this.options = options;
1091
- var self = this;
1092
-
1093
- this.$element.find( options.inputs ).each( function () {
1094
- self.addItem( this );
1095
- });
1096
-
1097
- this.$element.on( 'submit.' + this.type , false, $.proxy( this.validate, this ) );
1098
- }
1099
-
1100
- /**
1101
- * Add custom listeners
1102
- *
1103
- * @param {Object} { listener: function () {} }, eg { onFormSubmit: function ( valid, event, focus ) { ... } }
1104
- */
1105
- , addListener: function ( object ) {
1106
- for ( var listener in object ) {
1107
- if ( new RegExp( 'Field' ).test( listener ) ) {
1108
- for ( var item = 0; item < this.items.length; item++ ) {
1109
- this.items[ item ].addListener( object );
1110
- }
1111
- } else {
1112
- this.options.listeners[ listener ] = object[ listener ];
1113
- }
1114
- }
1115
- }
1116
-
1117
- /**
1118
- * Adds a new parsleyItem child to ParsleyForm
1119
- *
1120
- * @method addItem
1121
- * @param elem
1122
- */
1123
- , addItem: function ( elem ) {
1124
- if ( $( elem ).is( this.options.excluded ) ) {
1125
- return false;
1126
- }
1127
-
1128
- var ParsleyField = $( elem ).parsley( this.options );
1129
- ParsleyField.setParent( this );
1130
-
1131
- this.items.push( ParsleyField );
1132
- }
1133
-
1134
- /**
1135
- * Removes a parsleyItem child from ParsleyForm
1136
- *
1137
- * @method removeItem
1138
- * @param elem
1139
- * @return {Boolean}
1140
- */
1141
- , removeItem: function ( elem ) {
1142
- var parsleyItem = $( elem ).parsley();
1143
-
1144
- // identify & remove item if same Parsley hash
1145
- for ( var i = 0; i < this.items.length; i++ ) {
1146
- if ( this.items[ i ].hash === parsleyItem.hash ) {
1147
- this.items[ i ].destroy();
1148
- this.items.splice( i, 1 );
1149
- return true;
1150
- }
1151
- }
1152
-
1153
- return false;
1154
- }
1155
-
1156
- /**
1157
- * Process each form field validation
1158
- * Display errors, call custom onFormSubmit() function
1159
- *
1160
- * @method validate
1161
- * @param {Object} event jQuery Event
1162
- * @return {Boolean} Is form valid or not
1163
- */
1164
- , validate: function ( event ) {
1165
- var valid = true;
1166
- this.focusedField = false;
1167
-
1168
- for ( var item = 0; item < this.items.length; item++ ) {
1169
- if ( 'undefined' !== typeof this.items[ item ] && false === this.items[ item ].validate() ) {
1170
- valid = false;
1171
-
1172
- if ( !this.focusedField && 'first' === this.options.focus || 'last' === this.options.focus ) {
1173
- this.focusedField = this.items[ item ].$element;
1174
- }
1175
- }
1176
- }
1177
-
1178
- // form is invalid, focus an error field depending on focus policy
1179
- if ( this.focusedField && !valid ) {
1180
- // Scroll smoothly
1181
- if ( this.options.scrollDuration > 0 ) {
1182
- var that = this,
1183
- top = this.focusedField.offset().top - $( window ).height() / 2; // Center the window on the field
1184
-
1185
- $( 'html, body' ).animate( {
1186
- scrollTop: top
1187
- },
1188
- this.options.scrollDuration,
1189
- function () {
1190
- that.focusedField.focus();
1191
- }
1192
- );
1193
- // Just focus on the field and let the browser do the rest
1194
- } else {
1195
- this.focusedField.focus();
1196
- }
1197
- }
1198
-
1199
- // if onFormSubmit returns (bool) false, form won't be submitted, even if valid
1200
- var onFormSubmit = this.options.listeners.onFormSubmit( valid, event, this );
1201
- if ('undefined' !== typeof onFormSubmit) {
1202
- return onFormSubmit;
1203
- }
1204
-
1205
- return valid;
1206
- }
1207
-
1208
- , isValid: function () {
1209
- for ( var item = 0; item < this.items.length; item++ ) {
1210
- if ( false === this.items[ item ].isValid() ) {
1211
- return false;
1212
- }
1213
- }
1214
-
1215
- return true;
1216
- }
1217
-
1218
- /**
1219
- * Remove all errors ul under invalid fields
1220
- *
1221
- * @method removeErrors
1222
- */
1223
- , removeErrors: function () {
1224
- for ( var item = 0; item < this.items.length; item++ ) {
1225
- this.items[ item ].parsley( 'reset' );
1226
- }
1227
- }
1228
-
1229
- /**
1230
- * destroy Parsley binded on the form and its fields
1231
- *
1232
- * @method destroy
1233
- */
1234
- , destroy: function () {
1235
- for ( var item = 0; item < this.items.length; item++ ) {
1236
- this.items[ item ].destroy();
1237
- }
1238
-
1239
- this.$element.off( '.' + this.type ).removeData( this.type );
1240
- }
1241
-
1242
- /**
1243
- * reset Parsley binded on the form and its fields
1244
- *
1245
- * @method reset
1246
- */
1247
- , reset: function () {
1248
- for ( var item = 0; item < this.items.length; item++ ) {
1249
- this.items[ item ].reset();
1250
- }
1251
- }
1252
- };
1253
-
1254
- /**
1255
- * Parsley plugin definition
1256
- * Provides an interface to access public Validator, ParsleyForm and ParsleyField functions
1257
- *
1258
- * @class Parsley
1259
- * @constructor
1260
- * @param {Mixed} Options. {Object} to configure Parsley or {String} method name to call a public class method
1261
- * @param {Function} Callback function
1262
- * @return {Mixed} public class method return
1263
- */
1264
- $.fn.parsley = function ( option, fn ) {
1265
- var options = $.extend( true, {}, $.fn.parsley.defaults, 'undefined' !== typeof window.ParsleyConfig ? window.ParsleyConfig : {}, option, this.data() )
1266
- , newInstance = null;
1267
-
1268
- function bind ( self, type ) {
1269
- var parsleyInstance = $( self ).data( type );
1270
-
1271
- // if data never binded or we want to clone a build (for radio & checkboxes), bind it right now!
1272
- if ( !parsleyInstance ) {
1273
- switch ( type ) {
1274
- case 'parsleyForm':
1275
- parsleyInstance = new ParsleyForm( self, options, 'parsleyForm' );
1276
- break;
1277
- case 'parsleyField':
1278
- parsleyInstance = new ParsleyField( self, options, 'parsleyField' );
1279
- break;
1280
- case 'parsleyFieldMultiple':
1281
- parsleyInstance = new ParsleyFieldMultiple( self, options, 'parsleyFieldMultiple' );
1282
- break;
1283
- default:
1284
- return;
1285
- }
1286
-
1287
- $( self ).data( type, parsleyInstance );
1288
- }
1289
-
1290
- // here is our parsley public function accessor
1291
- if ( 'string' === typeof option && 'function' === typeof parsleyInstance[ option ] ) {
1292
- var response = parsleyInstance[ option ]( fn );
1293
-
1294
- return 'undefined' !== typeof response ? response : $( self );
1295
- }
1296
-
1297
- return parsleyInstance;
1298
- }
1299
-
1300
- // if a form elem is given, bind all its input children
1301
- if ( $( this ).is( 'form' ) || true === $( this ).data( 'bind' ) ) {
1302
- newInstance = bind ( $( this ), 'parsleyForm' );
1303
-
1304
- // if it is a Parsley supported single element, bind it too, except inputs type hidden
1305
- // add here a return instance, cuz' we could call public methods on single elems with data[ option ]() above
1306
- } else if ( $( this ).is( options.inputs ) && !$( this ).is( options.excluded ) ) {
1307
- newInstance = bind( $( this ), !$( this ).is( 'input[type=radio], input[type=checkbox]' ) ? 'parsleyField' : 'parsleyFieldMultiple' );
1308
- }
1309
-
1310
- return 'function' === typeof fn ? fn() : newInstance;
1311
- };
1312
-
1313
- $.fn.parsley.Constructor = ParsleyForm;
1314
-
1315
- /**
1316
- * Parsley plugin configuration
1317
- *
1318
- * @property $.fn.parsley.defaults
1319
- * @type {Object}
1320
- */
1321
- $.fn.parsley.defaults = {
1322
- // basic data-api overridable properties here..
1323
- inputs: 'input, textarea, select' // Default supported inputs.
1324
- , excluded: 'input[type=hidden], input[type=file], :disabled' // Do not validate input[type=hidden] & :disabled.
1325
- , trigger: false // $.Event() that will trigger validation. eg: keyup, change..
1326
- , animate: true // fade in / fade out error messages
1327
- , animateDuration: 300 // fadein/fadout ms time
1328
- , scrollDuration: 500 // Duration in ms time of the window scroll when focusing on invalid field (0 = no scroll)
1329
- , focus: 'first' // 'fist'|'last'|'none' which error field would have focus first on form validation
1330
- , validationMinlength: 3 // If trigger validation specified, only if value.length > validationMinlength
1331
- , successClass: 'parsley-success' // Class name on each valid input
1332
- , errorClass: 'parsley-error' // Class name on each invalid input
1333
- , errorMessage: false // Customize an unique error message showed if one constraint fails
1334
- , validators: {} // Add your custom validators functions
1335
- , showErrors: true // Set to false if you don't want Parsley to display error messages
1336
- , messages: {} // Add your own error messages here
1337
-
1338
- //some quite advanced configuration here..
1339
- , validateIfUnchanged: false // false: validate once by field value change
1340
- , errors: {
1341
- classHandler: function ( elem, isRadioOrCheckbox ) {} // specify where parsley error-success classes are set
1342
- , container: function ( elem, isRadioOrCheckbox ) {} // specify an elem where errors will be **apened**
1343
- , errorsWrapper: '<ul></ul>' // do not set an id for this elem, it would have an auto-generated id
1344
- , errorElem: '<li></li>' // each field constraint fail in an li
1345
- }
1346
- , listeners: {
1347
- onFieldValidate: function ( elem, ParsleyForm ) { return false; } // Executed on validation. Return true to ignore field validation
1348
- , onFormSubmit: function ( isFormValid, event, ParsleyForm ) {} // Executed once on form validation. Return (bool) false to block submit, even if valid
1349
- , onFieldError: function ( elem, constraints, ParsleyField ) {} // Executed when a field is detected as invalid
1350
- , onFieldSuccess: function ( elem, constraints, ParsleyField ) {} // Executed when a field passes validation
1351
- }
1352
- };
1353
-
1354
- /* PARSLEY auto-bind DATA-API + Global config retrieving
1355
- * =================================================== */
1356
- $( window ).on( 'load', function () {
1357
- $( '[data-validate="parsley"]' ).each( function () {
1358
- $( this ).parsley();
1359
- } );
1360
- } );
1361
-
1362
- // This plugin works with jQuery or Zepto (with data extension built for Zepto.)
1363
- }(window.jQuery || window.Zepto);