repsheet_visualizer 0.2.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (504) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/Gemfile.lock +8 -6
  4. data/lib/repsheet_visualizer/application/app.rb +51 -5
  5. data/lib/repsheet_visualizer/application/backend.rb +27 -0
  6. data/lib/repsheet_visualizer/application/public/fonts/FontAwesome.otf +0 -0
  7. data/lib/repsheet_visualizer/application/public/fonts/fontawesome-webfont.eot +0 -0
  8. data/lib/repsheet_visualizer/application/public/fonts/fontawesome-webfont.svg +414 -0
  9. data/lib/repsheet_visualizer/application/public/fonts/fontawesome-webfont.ttf +0 -0
  10. data/lib/repsheet_visualizer/application/public/fonts/fontawesome-webfont.woff +0 -0
  11. data/lib/repsheet_visualizer/application/public/fonts/glyphicons-halflings-regular.eot +0 -0
  12. data/lib/repsheet_visualizer/application/public/fonts/glyphicons-halflings-regular.svg +228 -0
  13. data/lib/repsheet_visualizer/application/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  14. data/lib/repsheet_visualizer/application/public/fonts/glyphicons-halflings-regular.woff +0 -0
  15. data/lib/repsheet_visualizer/application/public/img/jquery/handle-vertical.png +0 -0
  16. data/lib/repsheet_visualizer/application/public/img/jquery/handle.png +0 -0
  17. data/lib/repsheet_visualizer/application/public/img/layout/sidebar-bg.png +0 -0
  18. data/lib/repsheet_visualizer/application/public/img/loaders/ajax-loader.gif +0 -0
  19. data/lib/repsheet_visualizer/application/public/img/photos/map.png +0 -0
  20. data/lib/repsheet_visualizer/application/public/js/App.js +372 -0
  21. data/lib/repsheet_visualizer/application/public/js/Login.js +17 -0
  22. data/lib/repsheet_visualizer/application/public/js/demos/buttons.js +7 -0
  23. data/lib/repsheet_visualizer/application/public/js/demos/calendar.js +142 -0
  24. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/area.js +73 -0
  25. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/chart1.js +77 -0
  26. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/chart2.js +70 -0
  27. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/chart3.js +71 -0
  28. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/chart4.js +69 -0
  29. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/donut.js +49 -0
  30. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/horizontal.js +56 -0
  31. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/line.js +76 -0
  32. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/pie.js +50 -0
  33. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/scatter.js +62 -0
  34. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/stacked-area.js +86 -0
  35. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/stacked-horizontal.js +60 -0
  36. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/stacked-vertical.js +75 -0
  37. data/lib/repsheet_visualizer/application/public/js/demos/charts/flot/vertical.js +70 -0
  38. data/lib/repsheet_visualizer/application/public/js/demos/charts/morris/area.js +28 -0
  39. data/lib/repsheet_visualizer/application/public/js/demos/charts/morris/bar.js +29 -0
  40. data/lib/repsheet_visualizer/application/public/js/demos/charts/morris/donut.js +26 -0
  41. data/lib/repsheet_visualizer/application/public/js/demos/charts/morris/line.js +30 -0
  42. data/lib/repsheet_visualizer/application/public/js/demos/dashboard.js +26 -0
  43. data/lib/repsheet_visualizer/application/public/js/demos/form-extended.js +61 -0
  44. data/lib/repsheet_visualizer/application/public/js/demos/popups.js +16 -0
  45. data/lib/repsheet_visualizer/application/public/js/demos/pricing.js +10 -0
  46. data/lib/repsheet_visualizer/application/public/js/demos/sliders.js +77 -0
  47. data/lib/repsheet_visualizer/application/public/js/libs/bootstrap.js +1999 -0
  48. data/lib/repsheet_visualizer/application/public/js/libs/bootstrap.min.js +6 -0
  49. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  50. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  51. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  52. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  53. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  54. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  55. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  56. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  57. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  58. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  59. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  60. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  61. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  62. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  63. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/jquery-ui-1.9.2.custom.css +294 -0
  64. data/lib/repsheet_visualizer/application/public/js/libs/css/ui-lightness/jquery-ui-1.9.2.custom.min.css +7 -0
  65. data/lib/repsheet_visualizer/application/public/js/libs/jquery-1.9.1.min.js +5 -0
  66. data/lib/repsheet_visualizer/application/public/js/libs/jquery-ui-1.9.2.custom.min.js +6 -0
  67. data/lib/repsheet_visualizer/application/public/js/libs/jquery.min.map +1 -0
  68. data/lib/repsheet_visualizer/application/public/js/libs/raphael-2.1.2.min.js +11 -0
  69. data/lib/repsheet_visualizer/application/public/js/plugins/autosize/jquery.autosize.min.js +7 -0
  70. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/DT_bootstrap.js +148 -0
  71. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/Sorting icons.psd +0 -0
  72. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/back_disabled.png +0 -0
  73. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/back_enabled.png +0 -0
  74. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/back_enabled_hover.png +0 -0
  75. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/datatable-row-openclose.png +0 -0
  76. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/favicon.ico +0 -0
  77. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/forward_disabled.png +0 -0
  78. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/forward_enabled.png +0 -0
  79. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/forward_enabled_hover.png +0 -0
  80. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/sort_asc.png +0 -0
  81. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/sort_asc_disabled.png +0 -0
  82. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/sort_both.png +0 -0
  83. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/sort_desc.png +0 -0
  84. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/img/sort_desc_disabled.png +0 -0
  85. data/lib/repsheet_visualizer/application/public/js/plugins/datatables/jquery.dataTables.min.js +155 -0
  86. data/lib/repsheet_visualizer/application/public/js/plugins/datepicker/bootstrap-datepicker.js +1258 -0
  87. data/lib/repsheet_visualizer/application/public/js/plugins/datepicker/datepicker.css +481 -0
  88. data/lib/repsheet_visualizer/application/public/js/plugins/datepicker/less/datepicker.less +122 -0
  89. data/lib/repsheet_visualizer/application/public/js/plugins/fileupload/bootstrap-fileupload.css +132 -0
  90. data/lib/repsheet_visualizer/application/public/js/plugins/fileupload/bootstrap-fileupload.js +169 -0
  91. data/lib/repsheet_visualizer/application/public/js/plugins/fileupload/bootstrap-fileupload.min.css +31 -0
  92. data/lib/repsheet_visualizer/application/public/js/plugins/fileupload/bootstrap-fileupload.min.js +7 -0
  93. data/lib/repsheet_visualizer/application/public/js/plugins/flot/jquery.flot.js +2599 -0
  94. data/lib/repsheet_visualizer/application/public/js/plugins/flot/jquery.flot.orderBars.js +186 -0
  95. data/lib/repsheet_visualizer/application/public/js/plugins/flot/jquery.flot.pie.js +750 -0
  96. data/lib/repsheet_visualizer/application/public/js/plugins/flot/jquery.flot.resize.js +57 -0
  97. data/lib/repsheet_visualizer/application/public/js/plugins/flot/jquery.flot.stack.js +184 -0
  98. data/lib/repsheet_visualizer/application/public/js/plugins/flot/jquery.flot.tooltip.min.js +14 -0
  99. data/lib/repsheet_visualizer/application/public/js/plugins/fullcalendar/fullcalendar.css +589 -0
  100. data/lib/repsheet_visualizer/application/public/js/plugins/fullcalendar/fullcalendar.js +6110 -0
  101. data/lib/repsheet_visualizer/application/public/js/plugins/fullcalendar/fullcalendar.min.js +7 -0
  102. data/lib/repsheet_visualizer/application/public/js/plugins/fullcalendar/fullcalendar.print.css +32 -0
  103. data/lib/repsheet_visualizer/application/public/js/plugins/fullcalendar/gcal.js +107 -0
  104. data/lib/repsheet_visualizer/application/public/js/plugins/howl/howl.js +70 -0
  105. data/lib/repsheet_visualizer/application/public/js/plugins/howl/howl.min.js +2 -0
  106. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/jquery.icheck.js +462 -0
  107. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/jquery.icheck.min.js +11 -0
  108. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/all.css +61 -0
  109. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/_all.css +540 -0
  110. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/aero.css +54 -0
  111. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/aero.png +0 -0
  112. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/aero@2x.png +0 -0
  113. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/blue.css +54 -0
  114. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/blue.png +0 -0
  115. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/blue@2x.png +0 -0
  116. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/flat.css +54 -0
  117. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/flat.png +0 -0
  118. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/flat@2x.png +0 -0
  119. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/green.css +54 -0
  120. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/green.png +0 -0
  121. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/green@2x.png +0 -0
  122. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/grey.css +54 -0
  123. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/grey.png +0 -0
  124. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/grey@2x.png +0 -0
  125. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/orange.css +54 -0
  126. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/orange.png +0 -0
  127. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/orange@2x.png +0 -0
  128. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/pink.css +54 -0
  129. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/pink.png +0 -0
  130. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/pink@2x.png +0 -0
  131. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/purple.css +54 -0
  132. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/purple.png +0 -0
  133. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/purple@2x.png +0 -0
  134. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/red.css +54 -0
  135. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/red.png +0 -0
  136. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/red@2x.png +0 -0
  137. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/yellow.css +54 -0
  138. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/yellow.png +0 -0
  139. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/flat/yellow@2x.png +0 -0
  140. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/futurico/futurico.css +54 -0
  141. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/futurico/futurico.png +0 -0
  142. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/futurico/futurico@2x.png +0 -0
  143. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/_all.css +740 -0
  144. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/aero.css +74 -0
  145. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/blue.css +74 -0
  146. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/green.css +74 -0
  147. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/grey.css +74 -0
  148. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/line.css +74 -0
  149. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/line.png +0 -0
  150. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/line@2x.png +0 -0
  151. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/orange.css +74 -0
  152. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/pink.css +74 -0
  153. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/purple.css +74 -0
  154. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/red.css +74 -0
  155. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/line/yellow.css +74 -0
  156. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/_all.css +600 -0
  157. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/aero.css +60 -0
  158. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/aero.png +0 -0
  159. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/aero@2x.png +0 -0
  160. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/blue.css +60 -0
  161. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/blue.png +0 -0
  162. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/blue@2x.png +0 -0
  163. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/green.css +60 -0
  164. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/green.png +0 -0
  165. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/green@2x.png +0 -0
  166. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/grey.css +60 -0
  167. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/grey.png +0 -0
  168. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/grey@2x.png +0 -0
  169. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/minimal.css +60 -0
  170. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/minimal.png +0 -0
  171. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/minimal@2x.png +0 -0
  172. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/orange.css +60 -0
  173. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/orange.png +0 -0
  174. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/orange@2x.png +0 -0
  175. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/pink.css +60 -0
  176. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/pink.png +0 -0
  177. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/pink@2x.png +0 -0
  178. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/purple.css +60 -0
  179. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/purple.png +0 -0
  180. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/purple@2x.png +0 -0
  181. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/red.css +60 -0
  182. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/red.png +0 -0
  183. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/red@2x.png +0 -0
  184. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/yellow.css +60 -0
  185. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/yellow.png +0 -0
  186. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/minimal/yellow@2x.png +0 -0
  187. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/polaris/polaris.css +60 -0
  188. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/polaris/polaris.png +0 -0
  189. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/polaris/polaris@2x.png +0 -0
  190. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/_all.css +600 -0
  191. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/aero.css +60 -0
  192. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/aero.png +0 -0
  193. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/aero@2x.png +0 -0
  194. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/blue.css +60 -0
  195. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/blue.png +0 -0
  196. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/blue@2x.png +0 -0
  197. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/green.css +60 -0
  198. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/green.png +0 -0
  199. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/green@2x.png +0 -0
  200. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/grey.css +60 -0
  201. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/grey.png +0 -0
  202. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/grey@2x.png +0 -0
  203. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/orange.css +60 -0
  204. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/orange.png +0 -0
  205. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/orange@2x.png +0 -0
  206. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/pink.css +60 -0
  207. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/pink.png +0 -0
  208. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/pink@2x.png +0 -0
  209. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/purple.css +60 -0
  210. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/purple.png +0 -0
  211. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/purple@2x.png +0 -0
  212. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/red.css +60 -0
  213. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/red.png +0 -0
  214. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/red@2x.png +0 -0
  215. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/square.css +60 -0
  216. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/square.png +0 -0
  217. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/square@2x.png +0 -0
  218. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/yellow.css +60 -0
  219. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/yellow.png +0 -0
  220. data/lib/repsheet_visualizer/application/public/js/plugins/icheck/skins/square/yellow@2x.png +0 -0
  221. data/lib/repsheet_visualizer/application/public/js/plugins/magnific/jquery.magnific-popup.js +2026 -0
  222. data/lib/repsheet_visualizer/application/public/js/plugins/magnific/jquery.magnific-popup.min.js +4 -0
  223. data/lib/repsheet_visualizer/application/public/js/plugins/magnific/magnific-popup.css +396 -0
  224. data/lib/repsheet_visualizer/application/public/js/plugins/morris/morris.css +1 -0
  225. data/lib/repsheet_visualizer/application/public/js/plugins/morris/morris.min.js +1 -0
  226. data/lib/repsheet_visualizer/application/public/js/plugins/parsley/parsley.js +1363 -0
  227. data/lib/repsheet_visualizer/application/public/js/plugins/select2/select2-spinner.gif +0 -0
  228. data/lib/repsheet_visualizer/application/public/js/plugins/select2/select2.css +615 -0
  229. data/lib/repsheet_visualizer/application/public/js/plugins/select2/select2.js +3217 -0
  230. data/lib/repsheet_visualizer/application/public/js/plugins/select2/select2.min.js +22 -0
  231. data/lib/repsheet_visualizer/application/public/js/plugins/select2/select2.png +0 -0
  232. data/lib/repsheet_visualizer/application/public/js/plugins/select2/select2x2.png +0 -0
  233. data/lib/repsheet_visualizer/application/public/js/plugins/simplecolorpicker/jquery.simplecolorpicker.css +98 -0
  234. data/lib/repsheet_visualizer/application/public/js/plugins/simplecolorpicker/jquery.simplecolorpicker.js +211 -0
  235. data/lib/repsheet_visualizer/application/public/js/plugins/sparkline/jquery.sparkline.min.js +5 -0
  236. data/lib/repsheet_visualizer/application/public/js/plugins/tableCheckable/jquery.tableCheckable.js +122 -0
  237. data/lib/repsheet_visualizer/application/public/js/plugins/textarea-counter/jquery.textarea-counter.js +163 -0
  238. data/lib/repsheet_visualizer/application/public/js/plugins/timepicker/bootstrap-timepicker.css +121 -0
  239. data/lib/repsheet_visualizer/application/public/js/plugins/timepicker/bootstrap-timepicker.js +893 -0
  240. data/lib/repsheet_visualizer/application/public/stylesheets/App.css +3436 -0
  241. data/lib/repsheet_visualizer/application/public/stylesheets/Login.css +88 -0
  242. data/lib/repsheet_visualizer/application/public/stylesheets/bootstrap.min.css +9 -0
  243. data/lib/repsheet_visualizer/application/public/stylesheets/custom.css +0 -0
  244. data/lib/repsheet_visualizer/application/public/stylesheets/font-awesome.min.css +395 -0
  245. data/lib/repsheet_visualizer/application/views/actor.erb +169 -0
  246. data/lib/repsheet_visualizer/application/views/blacklist.erb +105 -0
  247. data/lib/repsheet_visualizer/application/views/index.erb +188 -0
  248. data/lib/repsheet_visualizer/application/views/layout.erb +73 -0
  249. data/lib/repsheet_visualizer/application/views/suspects.erb +105 -0
  250. data/lib/repsheet_visualizer/application/views/whitelist.erb +90 -78
  251. data/lib/repsheet_visualizer/application/views/worldview.erb +84 -78
  252. data/lib/repsheet_visualizer/version.rb +1 -1
  253. data/redesign/404.html +446 -0
  254. data/redesign/500.html +453 -0
  255. data/redesign/actor.html +237 -0
  256. data/redesign/blacklist.html +274 -0
  257. data/redesign/css/App.css +3436 -0
  258. data/redesign/css/Login.css +88 -0
  259. data/redesign/css/bootstrap.min.css +9 -0
  260. data/redesign/css/custom.css +0 -0
  261. data/redesign/css/font-awesome.min.css +395 -0
  262. data/redesign/fonts/FontAwesome.otf +0 -0
  263. data/redesign/fonts/fontawesome-webfont.eot +0 -0
  264. data/redesign/fonts/fontawesome-webfont.svg +414 -0
  265. data/redesign/fonts/fontawesome-webfont.ttf +0 -0
  266. data/redesign/fonts/fontawesome-webfont.woff +0 -0
  267. data/redesign/fonts/glyphicons-halflings-regular.eot +0 -0
  268. data/redesign/fonts/glyphicons-halflings-regular.svg +228 -0
  269. data/redesign/fonts/glyphicons-halflings-regular.ttf +0 -0
  270. data/redesign/fonts/glyphicons-halflings-regular.woff +0 -0
  271. data/redesign/img/jquery/handle-vertical.png +0 -0
  272. data/redesign/img/jquery/handle.png +0 -0
  273. data/redesign/img/layout/sidebar-bg.png +0 -0
  274. data/redesign/img/loaders/ajax-loader.gif +0 -0
  275. data/redesign/img/photos/map.png +0 -0
  276. data/redesign/index.html +333 -0
  277. data/redesign/js/App.js +372 -0
  278. data/redesign/js/Login.js +17 -0
  279. data/redesign/js/demos/buttons.js +7 -0
  280. data/redesign/js/demos/calendar.js +142 -0
  281. data/redesign/js/demos/charts/flot/area.js +73 -0
  282. data/redesign/js/demos/charts/flot/chart1.js +77 -0
  283. data/redesign/js/demos/charts/flot/chart2.js +70 -0
  284. data/redesign/js/demos/charts/flot/chart3.js +71 -0
  285. data/redesign/js/demos/charts/flot/chart4.js +69 -0
  286. data/redesign/js/demos/charts/flot/donut.js +49 -0
  287. data/redesign/js/demos/charts/flot/horizontal.js +56 -0
  288. data/redesign/js/demos/charts/flot/line.js +76 -0
  289. data/redesign/js/demos/charts/flot/pie.js +50 -0
  290. data/redesign/js/demos/charts/flot/scatter.js +62 -0
  291. data/redesign/js/demos/charts/flot/stacked-area.js +86 -0
  292. data/redesign/js/demos/charts/flot/stacked-horizontal.js +60 -0
  293. data/redesign/js/demos/charts/flot/stacked-vertical.js +75 -0
  294. data/redesign/js/demos/charts/flot/vertical.js +70 -0
  295. data/redesign/js/demos/charts/morris/area.js +28 -0
  296. data/redesign/js/demos/charts/morris/bar.js +29 -0
  297. data/redesign/js/demos/charts/morris/donut.js +26 -0
  298. data/redesign/js/demos/charts/morris/line.js +30 -0
  299. data/redesign/js/demos/dashboard.js +26 -0
  300. data/redesign/js/demos/form-extended.js +61 -0
  301. data/redesign/js/demos/popups.js +16 -0
  302. data/redesign/js/demos/pricing.js +10 -0
  303. data/redesign/js/demos/sliders.js +77 -0
  304. data/redesign/js/libs/bootstrap.js +1999 -0
  305. data/redesign/js/libs/bootstrap.min.js +6 -0
  306. data/redesign/js/libs/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  307. data/redesign/js/libs/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  308. data/redesign/js/libs/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  309. data/redesign/js/libs/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  310. data/redesign/js/libs/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  311. data/redesign/js/libs/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  312. data/redesign/js/libs/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  313. data/redesign/js/libs/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  314. data/redesign/js/libs/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  315. data/redesign/js/libs/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  316. data/redesign/js/libs/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  317. data/redesign/js/libs/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  318. data/redesign/js/libs/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  319. data/redesign/js/libs/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  320. data/redesign/js/libs/css/ui-lightness/jquery-ui-1.9.2.custom.css +294 -0
  321. data/redesign/js/libs/css/ui-lightness/jquery-ui-1.9.2.custom.min.css +7 -0
  322. data/redesign/js/libs/jquery-1.9.1.min.js +5 -0
  323. data/redesign/js/libs/jquery-ui-1.9.2.custom.min.js +6 -0
  324. data/redesign/js/libs/jquery.min.map +1 -0
  325. data/redesign/js/libs/raphael-2.1.2.min.js +11 -0
  326. data/redesign/js/plugins/autosize/jquery.autosize.min.js +7 -0
  327. data/redesign/js/plugins/datatables/DT_bootstrap.js +148 -0
  328. data/redesign/js/plugins/datatables/img/Sorting icons.psd +0 -0
  329. data/redesign/js/plugins/datatables/img/back_disabled.png +0 -0
  330. data/redesign/js/plugins/datatables/img/back_enabled.png +0 -0
  331. data/redesign/js/plugins/datatables/img/back_enabled_hover.png +0 -0
  332. data/redesign/js/plugins/datatables/img/datatable-row-openclose.png +0 -0
  333. data/redesign/js/plugins/datatables/img/favicon.ico +0 -0
  334. data/redesign/js/plugins/datatables/img/forward_disabled.png +0 -0
  335. data/redesign/js/plugins/datatables/img/forward_enabled.png +0 -0
  336. data/redesign/js/plugins/datatables/img/forward_enabled_hover.png +0 -0
  337. data/redesign/js/plugins/datatables/img/sort_asc.png +0 -0
  338. data/redesign/js/plugins/datatables/img/sort_asc_disabled.png +0 -0
  339. data/redesign/js/plugins/datatables/img/sort_both.png +0 -0
  340. data/redesign/js/plugins/datatables/img/sort_desc.png +0 -0
  341. data/redesign/js/plugins/datatables/img/sort_desc_disabled.png +0 -0
  342. data/redesign/js/plugins/datatables/jquery.dataTables.min.js +155 -0
  343. data/redesign/js/plugins/datepicker/bootstrap-datepicker.js +1258 -0
  344. data/redesign/js/plugins/datepicker/datepicker.css +481 -0
  345. data/redesign/js/plugins/datepicker/less/datepicker.less +122 -0
  346. data/redesign/js/plugins/fileupload/bootstrap-fileupload.css +132 -0
  347. data/redesign/js/plugins/fileupload/bootstrap-fileupload.js +169 -0
  348. data/redesign/js/plugins/fileupload/bootstrap-fileupload.min.css +31 -0
  349. data/redesign/js/plugins/fileupload/bootstrap-fileupload.min.js +7 -0
  350. data/redesign/js/plugins/flot/jquery.flot.js +2599 -0
  351. data/redesign/js/plugins/flot/jquery.flot.orderBars.js +186 -0
  352. data/redesign/js/plugins/flot/jquery.flot.pie.js +750 -0
  353. data/redesign/js/plugins/flot/jquery.flot.resize.js +57 -0
  354. data/redesign/js/plugins/flot/jquery.flot.stack.js +184 -0
  355. data/redesign/js/plugins/flot/jquery.flot.tooltip.min.js +14 -0
  356. data/redesign/js/plugins/fullcalendar/fullcalendar.css +589 -0
  357. data/redesign/js/plugins/fullcalendar/fullcalendar.js +6110 -0
  358. data/redesign/js/plugins/fullcalendar/fullcalendar.min.js +7 -0
  359. data/redesign/js/plugins/fullcalendar/fullcalendar.print.css +32 -0
  360. data/redesign/js/plugins/fullcalendar/gcal.js +107 -0
  361. data/redesign/js/plugins/howl/howl.js +70 -0
  362. data/redesign/js/plugins/howl/howl.min.js +2 -0
  363. data/redesign/js/plugins/icheck/jquery.icheck.js +462 -0
  364. data/redesign/js/plugins/icheck/jquery.icheck.min.js +11 -0
  365. data/redesign/js/plugins/icheck/skins/all.css +61 -0
  366. data/redesign/js/plugins/icheck/skins/flat/_all.css +540 -0
  367. data/redesign/js/plugins/icheck/skins/flat/aero.css +54 -0
  368. data/redesign/js/plugins/icheck/skins/flat/aero.png +0 -0
  369. data/redesign/js/plugins/icheck/skins/flat/aero@2x.png +0 -0
  370. data/redesign/js/plugins/icheck/skins/flat/blue.css +54 -0
  371. data/redesign/js/plugins/icheck/skins/flat/blue.png +0 -0
  372. data/redesign/js/plugins/icheck/skins/flat/blue@2x.png +0 -0
  373. data/redesign/js/plugins/icheck/skins/flat/flat.css +54 -0
  374. data/redesign/js/plugins/icheck/skins/flat/flat.png +0 -0
  375. data/redesign/js/plugins/icheck/skins/flat/flat@2x.png +0 -0
  376. data/redesign/js/plugins/icheck/skins/flat/green.css +54 -0
  377. data/redesign/js/plugins/icheck/skins/flat/green.png +0 -0
  378. data/redesign/js/plugins/icheck/skins/flat/green@2x.png +0 -0
  379. data/redesign/js/plugins/icheck/skins/flat/grey.css +54 -0
  380. data/redesign/js/plugins/icheck/skins/flat/grey.png +0 -0
  381. data/redesign/js/plugins/icheck/skins/flat/grey@2x.png +0 -0
  382. data/redesign/js/plugins/icheck/skins/flat/orange.css +54 -0
  383. data/redesign/js/plugins/icheck/skins/flat/orange.png +0 -0
  384. data/redesign/js/plugins/icheck/skins/flat/orange@2x.png +0 -0
  385. data/redesign/js/plugins/icheck/skins/flat/pink.css +54 -0
  386. data/redesign/js/plugins/icheck/skins/flat/pink.png +0 -0
  387. data/redesign/js/plugins/icheck/skins/flat/pink@2x.png +0 -0
  388. data/redesign/js/plugins/icheck/skins/flat/purple.css +54 -0
  389. data/redesign/js/plugins/icheck/skins/flat/purple.png +0 -0
  390. data/redesign/js/plugins/icheck/skins/flat/purple@2x.png +0 -0
  391. data/redesign/js/plugins/icheck/skins/flat/red.css +54 -0
  392. data/redesign/js/plugins/icheck/skins/flat/red.png +0 -0
  393. data/redesign/js/plugins/icheck/skins/flat/red@2x.png +0 -0
  394. data/redesign/js/plugins/icheck/skins/flat/yellow.css +54 -0
  395. data/redesign/js/plugins/icheck/skins/flat/yellow.png +0 -0
  396. data/redesign/js/plugins/icheck/skins/flat/yellow@2x.png +0 -0
  397. data/redesign/js/plugins/icheck/skins/futurico/futurico.css +54 -0
  398. data/redesign/js/plugins/icheck/skins/futurico/futurico.png +0 -0
  399. data/redesign/js/plugins/icheck/skins/futurico/futurico@2x.png +0 -0
  400. data/redesign/js/plugins/icheck/skins/line/_all.css +740 -0
  401. data/redesign/js/plugins/icheck/skins/line/aero.css +74 -0
  402. data/redesign/js/plugins/icheck/skins/line/blue.css +74 -0
  403. data/redesign/js/plugins/icheck/skins/line/green.css +74 -0
  404. data/redesign/js/plugins/icheck/skins/line/grey.css +74 -0
  405. data/redesign/js/plugins/icheck/skins/line/line.css +74 -0
  406. data/redesign/js/plugins/icheck/skins/line/line.png +0 -0
  407. data/redesign/js/plugins/icheck/skins/line/line@2x.png +0 -0
  408. data/redesign/js/plugins/icheck/skins/line/orange.css +74 -0
  409. data/redesign/js/plugins/icheck/skins/line/pink.css +74 -0
  410. data/redesign/js/plugins/icheck/skins/line/purple.css +74 -0
  411. data/redesign/js/plugins/icheck/skins/line/red.css +74 -0
  412. data/redesign/js/plugins/icheck/skins/line/yellow.css +74 -0
  413. data/redesign/js/plugins/icheck/skins/minimal/_all.css +600 -0
  414. data/redesign/js/plugins/icheck/skins/minimal/aero.css +60 -0
  415. data/redesign/js/plugins/icheck/skins/minimal/aero.png +0 -0
  416. data/redesign/js/plugins/icheck/skins/minimal/aero@2x.png +0 -0
  417. data/redesign/js/plugins/icheck/skins/minimal/blue.css +60 -0
  418. data/redesign/js/plugins/icheck/skins/minimal/blue.png +0 -0
  419. data/redesign/js/plugins/icheck/skins/minimal/blue@2x.png +0 -0
  420. data/redesign/js/plugins/icheck/skins/minimal/green.css +60 -0
  421. data/redesign/js/plugins/icheck/skins/minimal/green.png +0 -0
  422. data/redesign/js/plugins/icheck/skins/minimal/green@2x.png +0 -0
  423. data/redesign/js/plugins/icheck/skins/minimal/grey.css +60 -0
  424. data/redesign/js/plugins/icheck/skins/minimal/grey.png +0 -0
  425. data/redesign/js/plugins/icheck/skins/minimal/grey@2x.png +0 -0
  426. data/redesign/js/plugins/icheck/skins/minimal/minimal.css +60 -0
  427. data/redesign/js/plugins/icheck/skins/minimal/minimal.png +0 -0
  428. data/redesign/js/plugins/icheck/skins/minimal/minimal@2x.png +0 -0
  429. data/redesign/js/plugins/icheck/skins/minimal/orange.css +60 -0
  430. data/redesign/js/plugins/icheck/skins/minimal/orange.png +0 -0
  431. data/redesign/js/plugins/icheck/skins/minimal/orange@2x.png +0 -0
  432. data/redesign/js/plugins/icheck/skins/minimal/pink.css +60 -0
  433. data/redesign/js/plugins/icheck/skins/minimal/pink.png +0 -0
  434. data/redesign/js/plugins/icheck/skins/minimal/pink@2x.png +0 -0
  435. data/redesign/js/plugins/icheck/skins/minimal/purple.css +60 -0
  436. data/redesign/js/plugins/icheck/skins/minimal/purple.png +0 -0
  437. data/redesign/js/plugins/icheck/skins/minimal/purple@2x.png +0 -0
  438. data/redesign/js/plugins/icheck/skins/minimal/red.css +60 -0
  439. data/redesign/js/plugins/icheck/skins/minimal/red.png +0 -0
  440. data/redesign/js/plugins/icheck/skins/minimal/red@2x.png +0 -0
  441. data/redesign/js/plugins/icheck/skins/minimal/yellow.css +60 -0
  442. data/redesign/js/plugins/icheck/skins/minimal/yellow.png +0 -0
  443. data/redesign/js/plugins/icheck/skins/minimal/yellow@2x.png +0 -0
  444. data/redesign/js/plugins/icheck/skins/polaris/polaris.css +60 -0
  445. data/redesign/js/plugins/icheck/skins/polaris/polaris.png +0 -0
  446. data/redesign/js/plugins/icheck/skins/polaris/polaris@2x.png +0 -0
  447. data/redesign/js/plugins/icheck/skins/square/_all.css +600 -0
  448. data/redesign/js/plugins/icheck/skins/square/aero.css +60 -0
  449. data/redesign/js/plugins/icheck/skins/square/aero.png +0 -0
  450. data/redesign/js/plugins/icheck/skins/square/aero@2x.png +0 -0
  451. data/redesign/js/plugins/icheck/skins/square/blue.css +60 -0
  452. data/redesign/js/plugins/icheck/skins/square/blue.png +0 -0
  453. data/redesign/js/plugins/icheck/skins/square/blue@2x.png +0 -0
  454. data/redesign/js/plugins/icheck/skins/square/green.css +60 -0
  455. data/redesign/js/plugins/icheck/skins/square/green.png +0 -0
  456. data/redesign/js/plugins/icheck/skins/square/green@2x.png +0 -0
  457. data/redesign/js/plugins/icheck/skins/square/grey.css +60 -0
  458. data/redesign/js/plugins/icheck/skins/square/grey.png +0 -0
  459. data/redesign/js/plugins/icheck/skins/square/grey@2x.png +0 -0
  460. data/redesign/js/plugins/icheck/skins/square/orange.css +60 -0
  461. data/redesign/js/plugins/icheck/skins/square/orange.png +0 -0
  462. data/redesign/js/plugins/icheck/skins/square/orange@2x.png +0 -0
  463. data/redesign/js/plugins/icheck/skins/square/pink.css +60 -0
  464. data/redesign/js/plugins/icheck/skins/square/pink.png +0 -0
  465. data/redesign/js/plugins/icheck/skins/square/pink@2x.png +0 -0
  466. data/redesign/js/plugins/icheck/skins/square/purple.css +60 -0
  467. data/redesign/js/plugins/icheck/skins/square/purple.png +0 -0
  468. data/redesign/js/plugins/icheck/skins/square/purple@2x.png +0 -0
  469. data/redesign/js/plugins/icheck/skins/square/red.css +60 -0
  470. data/redesign/js/plugins/icheck/skins/square/red.png +0 -0
  471. data/redesign/js/plugins/icheck/skins/square/red@2x.png +0 -0
  472. data/redesign/js/plugins/icheck/skins/square/square.css +60 -0
  473. data/redesign/js/plugins/icheck/skins/square/square.png +0 -0
  474. data/redesign/js/plugins/icheck/skins/square/square@2x.png +0 -0
  475. data/redesign/js/plugins/icheck/skins/square/yellow.css +60 -0
  476. data/redesign/js/plugins/icheck/skins/square/yellow.png +0 -0
  477. data/redesign/js/plugins/icheck/skins/square/yellow@2x.png +0 -0
  478. data/redesign/js/plugins/magnific/jquery.magnific-popup.js +2026 -0
  479. data/redesign/js/plugins/magnific/jquery.magnific-popup.min.js +4 -0
  480. data/redesign/js/plugins/magnific/magnific-popup.css +396 -0
  481. data/redesign/js/plugins/morris/morris.css +1 -0
  482. data/redesign/js/plugins/morris/morris.min.js +1 -0
  483. data/redesign/js/plugins/parsley/parsley.js +1363 -0
  484. data/redesign/js/plugins/select2/select2-spinner.gif +0 -0
  485. data/redesign/js/plugins/select2/select2.css +615 -0
  486. data/redesign/js/plugins/select2/select2.js +3217 -0
  487. data/redesign/js/plugins/select2/select2.min.js +22 -0
  488. data/redesign/js/plugins/select2/select2.png +0 -0
  489. data/redesign/js/plugins/select2/select2x2.png +0 -0
  490. data/redesign/js/plugins/simplecolorpicker/jquery.simplecolorpicker.css +98 -0
  491. data/redesign/js/plugins/simplecolorpicker/jquery.simplecolorpicker.js +211 -0
  492. data/redesign/js/plugins/sparkline/jquery.sparkline.min.js +5 -0
  493. data/redesign/js/plugins/tableCheckable/jquery.tableCheckable.js +122 -0
  494. data/redesign/js/plugins/textarea-counter/jquery.textarea-counter.js +163 -0
  495. data/redesign/js/plugins/timepicker/bootstrap-timepicker.css +121 -0
  496. data/redesign/js/plugins/timepicker/bootstrap-timepicker.js +893 -0
  497. data/redesign/page-blank.html +417 -0
  498. data/redesign/suspects.html +273 -0
  499. data/redesign/whitelist.html +273 -0
  500. data/repsheet_visualizer.gemspec +1 -0
  501. data/script/fill +2 -0
  502. metadata +508 -5
  503. data/lib/repsheet_visualizer/application/views/activity.erb +0 -74
  504. data/lib/repsheet_visualizer/application/views/actors.erb +0 -130
@@ -0,0 +1,4 @@
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);
@@ -0,0 +1,396 @@
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; }
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
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);
@@ -0,0 +1,1363 @@
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);