kms 0.9.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. checksums.yaml +4 -4
  2. data/{vendor/assets/bower_components/Responsive-Dashboard/src/img → app/assets/images}/avatar.jpg +0 -0
  3. data/app/assets/javascripts/kms/application.js +3 -0
  4. data/app/assets/javascripts/kms/application/controllers/assets_controller.coffee.erb +14 -7
  5. data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee.erb +11 -3
  6. data/app/assets/javascripts/kms/application/controllers/snippets_controller.coffee.erb +3 -0
  7. data/app/assets/javascripts/kms/application/controllers/templates_controller.coffee.erb +3 -0
  8. data/app/assets/javascripts/kms/application/controllers/users_controller.coffee +4 -4
  9. data/app/assets/javascripts/kms/application/routes.coffee.erb +1 -1
  10. data/app/assets/javascripts/kms/application/services/transliteration_service.js +160 -0
  11. data/app/assets/javascripts/templates/assets/edit.html.slim +24 -2
  12. data/app/assets/javascripts/templates/assets/form.html.slim +23 -0
  13. data/app/assets/javascripts/templates/assets/index.html.slim +13 -12
  14. data/app/assets/javascripts/templates/assets/new.html.slim +1 -15
  15. data/app/assets/javascripts/templates/help.html.slim +1 -1
  16. data/app/assets/javascripts/templates/pages/index.html.slim +16 -5
  17. data/app/assets/javascripts/templates/snippets/index.html.slim +16 -5
  18. data/app/assets/javascripts/templates/templates/index.html.slim +16 -6
  19. data/app/assets/stylesheets/kms/application.css +2 -2
  20. data/app/assets/stylesheets/kms/custom.css.scss +38 -0
  21. data/app/controllers/kms/assets_controller.rb +8 -9
  22. data/app/controllers/kms/pages_controller.rb +10 -11
  23. data/app/controllers/kms/public/pages_controller.rb +5 -4
  24. data/app/controllers/kms/public/search_controller.rb +2 -0
  25. data/app/controllers/kms/settings_controller.rb +1 -1
  26. data/app/controllers/kms/snippets_controller.rb +2 -1
  27. data/app/controllers/kms/templates_controller.rb +6 -5
  28. data/app/controllers/kms/users_controller.rb +11 -8
  29. data/app/models/ability.rb +1 -0
  30. data/app/models/concerns/kms/permalinkable.rb +1 -1
  31. data/app/models/kms/page.rb +13 -4
  32. data/app/serializers/kms/asset_serializer.rb +6 -0
  33. data/app/serializers/kms/page_serializer.rb +5 -0
  34. data/app/serializers/kms/template_serializer.rb +5 -0
  35. data/app/serializers/kms/user_serializer.rb +5 -0
  36. data/app/services/kms/page_fetcher.rb +30 -0
  37. data/app/services/kms/search_service.rb +28 -3
  38. data/app/services/kms/template_processor.rb +19 -0
  39. data/app/views/devise/passwords/edit.html.erb +1 -1
  40. data/app/views/devise/passwords/new.html.erb +1 -1
  41. data/app/views/devise/registrations/new.html.erb +1 -1
  42. data/app/views/devise/sessions/new.html.erb +1 -1
  43. data/app/views/layouts/kms/devise.html.erb +1 -1
  44. data/app/views/layouts/kms/kms.html.erb +47 -18
  45. data/config/initializers/externals.rb +6 -32
  46. data/config/initializers/search.rb +1 -0
  47. data/config/locales/en.yml +17 -1
  48. data/config/locales/ru.yml +17 -1
  49. data/config/routes.rb +7 -6
  50. data/lib/kms/dependencies.rb +1 -4
  51. data/lib/kms/engine.rb +1 -2
  52. data/lib/kms/search_item.rb +18 -0
  53. data/lib/kms/version.rb +1 -1
  54. data/spec/controllers/kms/assets_controller_spec.rb +51 -0
  55. data/spec/controllers/kms/pages_controller_spec.rb +82 -0
  56. data/spec/controllers/kms/public/pages_controller_spec.rb +30 -0
  57. data/spec/controllers/kms/snippets_controller_spec.rb +61 -47
  58. data/spec/controllers/kms/templates_controller_spec.rb +51 -0
  59. data/spec/controllers/kms/users_controller_spec.rb +56 -0
  60. data/spec/factories/assets.rb +8 -0
  61. data/spec/factories/pages.rb +33 -0
  62. data/spec/factories/templates.rb +20 -0
  63. data/spec/factories/users.rb +9 -4
  64. data/spec/internal/config/routes.rb +12 -1
  65. data/spec/internal/log/test.log +81239 -0
  66. data/spec/internal/public/404.html +67 -0
  67. data/spec/internal/public/avatar.jpg +0 -0
  68. data/spec/internal/public/style.css +1 -0
  69. data/spec/internal/public/uploads/kms/asset/file/1/avatar.jpg +0 -0
  70. data/spec/internal/public/uploads/kms/asset/file/2/avatar.jpg +0 -0
  71. data/spec/internal/public/uploads/kms/asset/file/2/style.css +1 -0
  72. data/spec/internal/public/uploads/kms/asset/file/3/style.css +1 -0
  73. data/spec/internal/public/uploads/kms/asset/file/4/style.css +1 -0
  74. data/spec/internal/public/uploads/tmp/1500976987-41025-0002-0883/style.css +1 -0
  75. data/spec/internal/public/uploads/tmp/1500977082-41195-0002-6495/style.css +1 -0
  76. data/spec/internal/public/uploads/tmp/1500977109-41364-0002-4518/style.css +1 -0
  77. data/spec/internal/public/uploads/tmp/1500977152-41405-0002-2345/style.css +1 -0
  78. data/spec/internal/public/uploads/tmp/1500977327-41694-0002-5448/style.css +1 -0
  79. data/spec/internal/public/uploads/tmp/1500977376-41732-0002-7916/style.css +1 -0
  80. data/spec/internal/public/uploads/tmp/1500977392-41759-0002-7593/style.css +1 -0
  81. data/spec/internal/public/uploads/tmp/1500977410-42259-0002-7527/style.css +1 -0
  82. data/spec/internal/public/uploads/tmp/1500977429-42306-0002-5937/style.css +1 -0
  83. data/spec/internal/public/uploads/tmp/1500977437-42324-0002-5880/style.css +1 -0
  84. data/spec/internal/public/uploads/tmp/1500983228-53594-0002-4559/style.css +1 -0
  85. data/spec/internal/public/uploads/tmp/1500983284-53632-0002-6590/style.css +1 -0
  86. data/spec/internal/public/uploads/tmp/1500983360-53784-0002-7289/style.css +1 -0
  87. data/spec/internal/public/uploads/tmp/1500983469-54321-0002-0386/avatar.jpg +0 -0
  88. data/spec/internal/public/uploads/tmp/1500983469-54321-0004-5691/style.css +1 -0
  89. data/spec/internal/public/uploads/tmp/1500983511-54352-0002-5720/avatar.jpg +0 -0
  90. data/spec/internal/public/uploads/tmp/1500983511-54352-0004-1399/style.css +1 -0
  91. data/spec/internal/public/uploads/tmp/1500983610-54507-0002-4280/avatar.jpg +0 -0
  92. data/spec/internal/public/uploads/tmp/1500983610-54507-0004-9758/style.css +1 -0
  93. data/spec/internal/public/uploads/tmp/1500984466-57012-0002-4146/avatar.jpg +0 -0
  94. data/spec/internal/public/uploads/tmp/1500984466-57012-0004-5895/style.css +1 -0
  95. data/spec/internal/public/uploads/tmp/1500984509-57158-0002-9657/avatar.jpg +0 -0
  96. data/spec/internal/public/uploads/tmp/1500984509-57158-0004-5003/style.css +1 -0
  97. data/spec/internal/public/uploads/tmp/1500984616-57697-0002-7201/avatar.jpg +0 -0
  98. data/spec/internal/public/uploads/tmp/1500984616-57697-0004-6255/style.css +1 -0
  99. data/spec/internal/public/uploads/tmp/1500985257-58947-0002-3629/avatar.jpg +0 -0
  100. data/spec/internal/public/uploads/tmp/1500985257-58947-0004-5338/style.css +1 -0
  101. data/spec/internal/public/uploads/tmp/1500985407-58947-0006-5929/style.css +1 -0
  102. data/spec/internal/public/uploads/tmp/1500985473-59264-0002-0397/avatar.jpg +0 -0
  103. data/spec/internal/public/uploads/tmp/1500985473-59264-0004-6493/style.css +1 -0
  104. data/spec/internal/public/uploads/tmp/1500985475-59264-0007-8674/style.css +1 -0
  105. data/spec/internal/public/uploads/tmp/1500985538-59468-0002-9206/avatar.jpg +0 -0
  106. data/spec/internal/public/uploads/tmp/1500985538-59468-0004-2586/style.css +1 -0
  107. data/spec/internal/public/uploads/tmp/1500985538-59468-0007-6200/style.css +1 -0
  108. data/spec/internal/public/uploads/tmp/1500988358-65877-0002-4528/avatar.jpg +0 -0
  109. data/spec/internal/public/uploads/tmp/1500988358-65877-0004-5904/style.css +1 -0
  110. data/spec/internal/public/uploads/tmp/1500988358-65877-0007-7320/style.css +1 -0
  111. data/spec/internal/public/uploads/tmp/1500988407-65916-0002-3138/avatar.jpg +0 -0
  112. data/spec/internal/public/uploads/tmp/1500988407-65916-0004-5400/style.css +1 -0
  113. data/spec/internal/public/uploads/tmp/1500988407-65916-0007-1655/style.css +1 -0
  114. data/spec/internal/public/uploads/tmp/1500988421-65950-0002-9415/avatar.jpg +0 -0
  115. data/spec/internal/public/uploads/tmp/1500988421-65950-0004-7130/style.css +1 -0
  116. data/spec/internal/public/uploads/tmp/1500988421-65950-0007-9886/style.css +1 -0
  117. data/spec/internal/public/uploads/tmp/1500988435-65981-0002-3228/avatar.jpg +0 -0
  118. data/spec/internal/public/uploads/tmp/1500988435-65981-0004-3682/style.css +1 -0
  119. data/spec/internal/public/uploads/tmp/1500988435-65981-0007-1582/style.css +1 -0
  120. data/spec/internal/public/uploads/tmp/1500988475-66122-0002-9516/avatar.jpg +0 -0
  121. data/spec/internal/public/uploads/tmp/1500988475-66122-0004-5634/style.css +1 -0
  122. data/spec/internal/public/uploads/tmp/1500988530-66122-0007-2272/style.css +1 -0
  123. data/spec/internal/public/uploads/tmp/1500988554-66315-0002-6262/avatar.jpg +0 -0
  124. data/spec/internal/public/uploads/tmp/1500988554-66315-0004-6099/style.css +1 -0
  125. data/spec/internal/public/uploads/tmp/1500988554-66315-0007-1632/style.css +1 -0
  126. data/spec/internal/public/uploads/tmp/1500991751-73722-0002-9937/avatar.jpg +0 -0
  127. data/spec/internal/public/uploads/tmp/1500991751-73722-0004-8034/style.css +1 -0
  128. data/spec/internal/public/uploads/tmp/1500991751-73722-0007-7763/style.css +1 -0
  129. data/spec/internal/public/uploads/tmp/1501233238-34385-0002-3210/avatar.jpg +0 -0
  130. data/spec/internal/public/uploads/tmp/1501233238-34385-0004-5881/style.css +1 -0
  131. data/spec/internal/public/uploads/tmp/1501233238-34385-0007-6280/style.css +1 -0
  132. data/spec/models/kms/page_spec.rb +31 -0
  133. data/spec/models/kms/template_spec.rb +15 -0
  134. data/spec/services/kms/page_fetcher_spec.rb +36 -0
  135. data/spec/services/kms/search_service_spec.rb +53 -0
  136. data/spec/services/kms/template_processor_spec.rb +20 -0
  137. data/spec/support/controller_macros.rb +9 -1
  138. data/vendor/assets/bower.json +3 -2
  139. data/vendor/assets/bower_components/angular-ui-select/CHANGELOG.md +169 -0
  140. data/vendor/assets/bower_components/angular-ui-select/CONTRIBUTING.md +161 -0
  141. data/vendor/assets/bower_components/angular-ui-select/README.md +27 -13
  142. data/vendor/assets/bower_components/angular-ui-select/bower.json +6 -3
  143. data/vendor/assets/bower_components/angular-ui-select/composer.json +29 -0
  144. data/vendor/assets/bower_components/angular-ui-select/deploy-docs.sh +31 -0
  145. data/vendor/assets/bower_components/angular-ui-select/dist/select.css +48 -2
  146. data/vendor/assets/bower_components/angular-ui-select/dist/select.js +454 -111
  147. data/vendor/assets/bower_components/angular-ui-select/dist/select.min.css +2 -2
  148. data/vendor/assets/bower_components/angular-ui-select/dist/select.min.js +2 -2
  149. data/vendor/assets/bower_components/angular-ui-select/docs/assets/app.js +1 -0
  150. data/vendor/assets/bower_components/angular-ui-select/docs/assets/demo.js +461 -0
  151. data/vendor/assets/bower_components/angular-ui-select/docs/assets/docs.css +339 -0
  152. data/vendor/assets/bower_components/angular-ui-select/docs/assets/plunkr.js +110 -0
  153. data/vendor/assets/bower_components/angular-ui-select/docs/index.html +191 -0
  154. data/vendor/assets/bower_components/angular-ui-select/docs/partials/_footer.html +2 -0
  155. data/vendor/assets/bower_components/angular-ui-select/docs/partials/_header.html +64 -0
  156. data/vendor/assets/bower_components/angular-ui-select/index.js +2 -0
  157. data/vendor/assets/bower_components/angular-ui-select/package.json +36 -15
  158. data/vendor/assets/bower_components/bootstrap/CHANGELOG.md +5 -0
  159. data/vendor/assets/bower_components/bootstrap/Gemfile +6 -0
  160. data/vendor/assets/bower_components/bootstrap/Gemfile.lock +43 -0
  161. data/vendor/assets/bower_components/bootstrap/Gruntfile.js +176 -145
  162. data/vendor/assets/bower_components/bootstrap/ISSUE_TEMPLATE.md +22 -0
  163. data/vendor/assets/bower_components/bootstrap/LICENSE +1 -1
  164. data/vendor/assets/bower_components/bootstrap/README.md +55 -40
  165. data/vendor/assets/bower_components/bootstrap/bower.json +5 -9
  166. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css +204 -59
  167. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css.map +1 -1
  168. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +4 -3
  169. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css.map +1 -0
  170. data/vendor/assets/bower_components/bootstrap/dist/css/{bootstrap.less → bootstrap.css} +881 -327
  171. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css.map +1 -1
  172. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css +6 -0
  173. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css.map +1 -0
  174. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  175. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +272 -213
  176. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  177. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  178. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  179. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.js +549 -286
  180. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.min.js +5 -4
  181. data/vendor/assets/bower_components/bootstrap/dist/js/npm.js +13 -0
  182. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  183. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg +272 -213
  184. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  185. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  186. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  187. data/vendor/assets/bower_components/bootstrap/grunt/bs-commonjs-generator.js +30 -0
  188. data/vendor/assets/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js +5 -4
  189. data/vendor/assets/bower_components/bootstrap/grunt/bs-lessdoc-parser.js +13 -12
  190. data/vendor/assets/bower_components/bootstrap/grunt/bs-raw-files-generator.js +6 -8
  191. data/vendor/assets/bower_components/bootstrap/grunt/change-version.js +109 -0
  192. data/vendor/assets/bower_components/bootstrap/grunt/configBridge.json +46 -0
  193. data/vendor/assets/bower_components/bootstrap/grunt/npm-shrinkwrap.json +2679 -0
  194. data/vendor/assets/bower_components/bootstrap/grunt/sauce_browsers.yml +5 -5
  195. data/vendor/assets/bower_components/bootstrap/js/affix.js +46 -26
  196. data/vendor/assets/bower_components/bootstrap/js/alert.js +8 -6
  197. data/vendor/assets/bower_components/bootstrap/js/button.js +34 -19
  198. data/vendor/assets/bower_components/bootstrap/js/carousel.js +35 -21
  199. data/vendor/assets/bower_components/bootstrap/js/collapse.js +69 -27
  200. data/vendor/assets/bower_components/bootstrap/js/dropdown.js +55 -41
  201. data/vendor/assets/bower_components/bootstrap/js/modal.js +91 -32
  202. data/vendor/assets/bower_components/bootstrap/js/popover.js +5 -10
  203. data/vendor/assets/bower_components/bootstrap/js/scrollspy.js +28 -26
  204. data/vendor/assets/bower_components/bootstrap/js/tab.js +45 -18
  205. data/vendor/assets/bower_components/bootstrap/js/tooltip.js +117 -54
  206. data/vendor/assets/bower_components/bootstrap/js/transition.js +2 -2
  207. data/vendor/assets/bower_components/bootstrap/less/alerts.less +5 -0
  208. data/vendor/assets/bower_components/bootstrap/less/badges.less +14 -3
  209. data/vendor/assets/bower_components/bootstrap/less/bootstrap.less +6 -0
  210. data/vendor/assets/bower_components/bootstrap/less/button-groups.less +22 -18
  211. data/vendor/assets/bower_components/bootstrap/less/buttons.less +19 -10
  212. data/vendor/assets/bower_components/bootstrap/less/carousel.less +34 -7
  213. data/vendor/assets/bower_components/bootstrap/less/close.less +1 -0
  214. data/vendor/assets/bower_components/bootstrap/less/code.less +1 -0
  215. data/vendor/assets/bower_components/bootstrap/less/component-animations.less +3 -1
  216. data/vendor/assets/bower_components/bootstrap/less/dropdowns.less +9 -8
  217. data/vendor/assets/bower_components/bootstrap/less/forms.less +123 -50
  218. data/vendor/assets/bower_components/bootstrap/less/glyphicons.less +75 -3
  219. data/vendor/assets/bower_components/bootstrap/less/input-groups.less +8 -3
  220. data/vendor/assets/bower_components/bootstrap/less/jumbotron.less +10 -4
  221. data/vendor/assets/bower_components/bootstrap/less/list-group.less +10 -11
  222. data/vendor/assets/bower_components/bootstrap/less/media.less +40 -30
  223. data/vendor/assets/bower_components/bootstrap/less/mixins.less +1 -0
  224. data/vendor/assets/bower_components/bootstrap/less/mixins/background-variant.less +2 -1
  225. data/vendor/assets/bower_components/bootstrap/less/mixins/buttons.less +19 -4
  226. data/vendor/assets/bower_components/bootstrap/less/mixins/forms.less +5 -1
  227. data/vendor/assets/bower_components/bootstrap/less/mixins/grid-framework.less +4 -4
  228. data/vendor/assets/bower_components/bootstrap/less/mixins/grid.less +4 -4
  229. data/vendor/assets/bower_components/bootstrap/less/mixins/hide-text.less +2 -2
  230. data/vendor/assets/bower_components/bootstrap/less/mixins/image.less +0 -1
  231. data/vendor/assets/bower_components/bootstrap/less/mixins/labels.less +1 -1
  232. data/vendor/assets/bower_components/bootstrap/less/mixins/list-group.less +2 -1
  233. data/vendor/assets/bower_components/bootstrap/less/mixins/pagination.less +2 -1
  234. data/vendor/assets/bower_components/bootstrap/less/mixins/reset-text.less +18 -0
  235. data/vendor/assets/bower_components/bootstrap/less/mixins/responsive-visibility.less +1 -1
  236. data/vendor/assets/bower_components/bootstrap/less/mixins/tab-focus.less +3 -3
  237. data/vendor/assets/bower_components/bootstrap/less/mixins/text-emphasis.less +2 -1
  238. data/vendor/assets/bower_components/bootstrap/less/mixins/vendor-prefixes.less +8 -5
  239. data/vendor/assets/bower_components/bootstrap/less/modals.less +3 -3
  240. data/vendor/assets/bower_components/bootstrap/less/navbar.less +30 -25
  241. data/vendor/assets/bower_components/bootstrap/less/navs.less +1 -1
  242. data/vendor/assets/bower_components/bootstrap/less/normalize.less +12 -13
  243. data/vendor/assets/bower_components/bootstrap/less/pager.less +1 -2
  244. data/vendor/assets/bower_components/bootstrap/less/pagination.less +5 -4
  245. data/vendor/assets/bower_components/bootstrap/less/panels.less +33 -5
  246. data/vendor/assets/bower_components/bootstrap/less/popovers.less +5 -7
  247. data/vendor/assets/bower_components/bootstrap/less/print.less +96 -96
  248. data/vendor/assets/bower_components/bootstrap/less/progress-bars.less +1 -19
  249. data/vendor/assets/bower_components/bootstrap/less/responsive-embed.less +10 -9
  250. data/vendor/assets/bower_components/bootstrap/less/scaffolding.less +13 -2
  251. data/vendor/assets/bower_components/bootstrap/less/tables.less +14 -13
  252. data/vendor/assets/bower_components/bootstrap/less/theme.less +49 -16
  253. data/vendor/assets/bower_components/bootstrap/less/thumbnails.less +1 -1
  254. data/vendor/assets/bower_components/bootstrap/less/tooltip.less +13 -7
  255. data/vendor/assets/bower_components/bootstrap/less/type.less +2 -13
  256. data/vendor/assets/bower_components/bootstrap/less/utilities.less +0 -2
  257. data/vendor/assets/bower_components/bootstrap/less/variables.less +45 -22
  258. data/vendor/assets/bower_components/bootstrap/nuget/MyGet.ps1 +8 -0
  259. data/vendor/assets/bower_components/bootstrap/nuget/bootstrap.less.nuspec +28 -0
  260. data/vendor/assets/bower_components/bootstrap/nuget/bootstrap.nuspec +28 -0
  261. data/vendor/assets/bower_components/bootstrap/package.js +32 -0
  262. data/vendor/assets/bower_components/bootstrap/package.json +49 -41
  263. data/vendor/assets/bower_components/flow.js/README.md +79 -64
  264. data/vendor/assets/bower_components/flow.js/bower.json +6 -2
  265. data/vendor/assets/bower_components/flow.js/dist/flow.js +1635 -1532
  266. data/vendor/assets/bower_components/flow.js/dist/flow.min.js +2 -2
  267. data/vendor/assets/bower_components/flow.js/package.js +24 -0
  268. data/vendor/assets/bower_components/flow.js/travis.sh +19 -0
  269. data/vendor/assets/bower_components/font-awesome/scss/_path.scss +5 -5
  270. data/vendor/assets/bower_components/font-awesome/scss/_variables.scss +1 -2
  271. data/vendor/assets/bower_components/ng-flow/bower.json +1 -1
  272. data/vendor/assets/bower_components/ng-flow/dist/ng-flow-standalone.js +1655 -1542
  273. data/vendor/assets/bower_components/ng-flow/dist/ng-flow-standalone.min.js +2 -2
  274. data/vendor/assets/bower_components/ng-flow/dist/ng-flow.js +19 -9
  275. data/vendor/assets/bower_components/ng-flow/dist/ng-flow.min.js +2 -2
  276. data/vendor/assets/bower_components/ng-flow/index.js +3 -0
  277. data/vendor/assets/bower_components/ng-flow/package.js +25 -0
  278. data/vendor/assets/bower_components/ng-flow/src/directives/drag-events.js +2 -1
  279. data/vendor/assets/bower_components/ng-flow/src/directives/events.js +2 -1
  280. data/vendor/assets/bower_components/ng-flow/src/directives/init.js +7 -1
  281. data/vendor/assets/bower_components/ng-flow/travis.sh +19 -0
  282. data/vendor/assets/bower_components/{Responsive-Dashboard → rdash-ui}/LICENSE +21 -21
  283. data/vendor/assets/bower_components/rdash-ui/README.md +55 -0
  284. data/vendor/assets/bower_components/rdash-ui/bower.json +33 -0
  285. data/vendor/assets/bower_components/rdash-ui/dist/css/rdash.min.css +1 -0
  286. data/vendor/assets/bower_components/rdash-ui/dist/css/rdash.scss +489 -0
  287. data/vendor/assets/bower_components/{Responsive-Dashboard/src → rdash-ui/dist}/fonts/montserrat-regular-webfont.eot +0 -0
  288. data/vendor/assets/bower_components/{Responsive-Dashboard/src → rdash-ui/dist}/fonts/montserrat-regular-webfont.svg +1316 -1316
  289. data/vendor/assets/bower_components/{Responsive-Dashboard/src → rdash-ui/dist}/fonts/montserrat-regular-webfont.ttf +0 -0
  290. data/vendor/assets/bower_components/{Responsive-Dashboard/src → rdash-ui/dist}/fonts/montserrat-regular-webfont.woff +0 -0
  291. metadata +227 -180
  292. data/config/initializers/bower_rails.rb +0 -16
  293. data/vendor/assets/bower_components/Responsive-Dashboard/CONTRIBUTING.md +0 -21
  294. data/vendor/assets/bower_components/Responsive-Dashboard/README.md +0 -119
  295. data/vendor/assets/bower_components/Responsive-Dashboard/bower.json +0 -32
  296. data/vendor/assets/bower_components/Responsive-Dashboard/gulpfile.js +0 -81
  297. data/vendor/assets/bower_components/Responsive-Dashboard/package.json +0 -21
  298. data/vendor/assets/bower_components/Responsive-Dashboard/src/index.html +0 -413
  299. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/controllers/alerts-ctrl.js +0 -19
  300. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/controllers/master-ctrl.js +0 -51
  301. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/directives/loading.js +0 -13
  302. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/directives/widget-body.js +0 -16
  303. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/directives/widget-header.js +0 -17
  304. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/directives/widget.js +0 -16
  305. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/module.js +0 -1
  306. data/vendor/assets/bower_components/Responsive-Dashboard/src/js/dashboard/routes.js +0 -22
  307. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/content.less +0 -19
  308. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/hamburg.less +0 -29
  309. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/header.less +0 -92
  310. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/loading.less +0 -40
  311. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/main.less +0 -73
  312. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/mixins.less +0 -5
  313. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/sidebar.less +0 -122
  314. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/variables.less +0 -10
  315. data/vendor/assets/bower_components/Responsive-Dashboard/src/less/dashboard/widgets.less +0 -95
  316. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css.erb +0 -5
  317. data/vendor/assets/bower_components/flow.js/CHANGELOG.md +0 -37
  318. data/vendor/assets/bower_components/flow.js/Gruntfile.js +0 -132
  319. data/vendor/assets/bower_components/flow.js/karma.conf.js +0 -114
  320. data/vendor/assets/bower_components/flow.js/package.json +0 -50
  321. data/vendor/assets/bower_components/flow.js/src/flow.js +0 -1532
  322. data/vendor/assets/bower_components/jquery/MIT-LICENSE.txt +0 -21
  323. data/vendor/assets/bower_components/jquery/bower.json +0 -27
  324. data/vendor/assets/bower_components/jquery/dist/jquery.js +0 -9190
  325. data/vendor/assets/bower_components/jquery/dist/jquery.min.js +0 -5
  326. data/vendor/assets/bower_components/jquery/dist/jquery.min.map +0 -1
  327. data/vendor/assets/bower_components/jquery/src/ajax.js +0 -806
  328. data/vendor/assets/bower_components/jquery/src/ajax/jsonp.js +0 -89
  329. data/vendor/assets/bower_components/jquery/src/ajax/load.js +0 -75
  330. data/vendor/assets/bower_components/jquery/src/ajax/parseJSON.js +0 -13
  331. data/vendor/assets/bower_components/jquery/src/ajax/parseXML.js +0 -28
  332. data/vendor/assets/bower_components/jquery/src/ajax/script.js +0 -64
  333. data/vendor/assets/bower_components/jquery/src/ajax/var/nonce.js +0 -5
  334. data/vendor/assets/bower_components/jquery/src/ajax/var/rquery.js +0 -3
  335. data/vendor/assets/bower_components/jquery/src/ajax/xhr.js +0 -135
  336. data/vendor/assets/bower_components/jquery/src/attributes.js +0 -11
  337. data/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -143
  338. data/vendor/assets/bower_components/jquery/src/attributes/classes.js +0 -158
  339. data/vendor/assets/bower_components/jquery/src/attributes/prop.js +0 -96
  340. data/vendor/assets/bower_components/jquery/src/attributes/support.js +0 -35
  341. data/vendor/assets/bower_components/jquery/src/attributes/val.js +0 -163
  342. data/vendor/assets/bower_components/jquery/src/callbacks.js +0 -205
  343. data/vendor/assets/bower_components/jquery/src/core.js +0 -498
  344. data/vendor/assets/bower_components/jquery/src/core/access.js +0 -60
  345. data/vendor/assets/bower_components/jquery/src/core/init.js +0 -123
  346. data/vendor/assets/bower_components/jquery/src/core/parseHTML.js +0 -39
  347. data/vendor/assets/bower_components/jquery/src/core/ready.js +0 -97
  348. data/vendor/assets/bower_components/jquery/src/core/var/rsingleTag.js +0 -4
  349. data/vendor/assets/bower_components/jquery/src/css.js +0 -451
  350. data/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +0 -24
  351. data/vendor/assets/bower_components/jquery/src/css/curCSS.js +0 -57
  352. data/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +0 -70
  353. data/vendor/assets/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
  354. data/vendor/assets/bower_components/jquery/src/css/support.js +0 -91
  355. data/vendor/assets/bower_components/jquery/src/css/swap.js +0 -28
  356. data/vendor/assets/bower_components/jquery/src/css/var/cssExpand.js +0 -3
  357. data/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +0 -5
  358. data/vendor/assets/bower_components/jquery/src/css/var/isHidden.js +0 -13
  359. data/vendor/assets/bower_components/jquery/src/css/var/rmargin.js +0 -3
  360. data/vendor/assets/bower_components/jquery/src/css/var/rnumnonpx.js +0 -5
  361. data/vendor/assets/bower_components/jquery/src/data.js +0 -179
  362. data/vendor/assets/bower_components/jquery/src/data/Data.js +0 -181
  363. data/vendor/assets/bower_components/jquery/src/data/accepts.js +0 -20
  364. data/vendor/assets/bower_components/jquery/src/data/var/data_priv.js +0 -5
  365. data/vendor/assets/bower_components/jquery/src/data/var/data_user.js +0 -5
  366. data/vendor/assets/bower_components/jquery/src/deferred.js +0 -149
  367. data/vendor/assets/bower_components/jquery/src/deprecated.js +0 -13
  368. data/vendor/assets/bower_components/jquery/src/dimensions.js +0 -50
  369. data/vendor/assets/bower_components/jquery/src/effects.js +0 -649
  370. data/vendor/assets/bower_components/jquery/src/effects/Tween.js +0 -114
  371. data/vendor/assets/bower_components/jquery/src/effects/animatedSelector.js +0 -13
  372. data/vendor/assets/bower_components/jquery/src/event.js +0 -868
  373. data/vendor/assets/bower_components/jquery/src/event/alias.js +0 -39
  374. data/vendor/assets/bower_components/jquery/src/event/support.js +0 -9
  375. data/vendor/assets/bower_components/jquery/src/exports/amd.js +0 -24
  376. data/vendor/assets/bower_components/jquery/src/exports/global.js +0 -32
  377. data/vendor/assets/bower_components/jquery/src/intro.js +0 -44
  378. data/vendor/assets/bower_components/jquery/src/jquery.js +0 -36
  379. data/vendor/assets/bower_components/jquery/src/manipulation.js +0 -582
  380. data/vendor/assets/bower_components/jquery/src/manipulation/_evalUrl.js +0 -18
  381. data/vendor/assets/bower_components/jquery/src/manipulation/support.js +0 -31
  382. data/vendor/assets/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -3
  383. data/vendor/assets/bower_components/jquery/src/offset.js +0 -204
  384. data/vendor/assets/bower_components/jquery/src/outro.js +0 -1
  385. data/vendor/assets/bower_components/jquery/src/queue.js +0 -142
  386. data/vendor/assets/bower_components/jquery/src/queue/delay.js +0 -22
  387. data/vendor/assets/bower_components/jquery/src/selector-native.js +0 -172
  388. data/vendor/assets/bower_components/jquery/src/selector-sizzle.js +0 -14
  389. data/vendor/assets/bower_components/jquery/src/selector.js +0 -1
  390. data/vendor/assets/bower_components/jquery/src/serialize.js +0 -111
  391. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +0 -2044
  392. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +0 -3
  393. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +0 -1
  394. data/vendor/assets/bower_components/jquery/src/traversing.js +0 -200
  395. data/vendor/assets/bower_components/jquery/src/traversing/findFilter.js +0 -100
  396. data/vendor/assets/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -6
  397. data/vendor/assets/bower_components/jquery/src/var/arr.js +0 -3
  398. data/vendor/assets/bower_components/jquery/src/var/class2type.js +0 -4
  399. data/vendor/assets/bower_components/jquery/src/var/concat.js +0 -5
  400. data/vendor/assets/bower_components/jquery/src/var/hasOwn.js +0 -5
  401. data/vendor/assets/bower_components/jquery/src/var/indexOf.js +0 -5
  402. data/vendor/assets/bower_components/jquery/src/var/pnum.js +0 -3
  403. data/vendor/assets/bower_components/jquery/src/var/push.js +0 -5
  404. data/vendor/assets/bower_components/jquery/src/var/rnotwhite.js +0 -3
  405. data/vendor/assets/bower_components/jquery/src/var/slice.js +0 -5
  406. data/vendor/assets/bower_components/jquery/src/var/strundefined.js +0 -3
  407. data/vendor/assets/bower_components/jquery/src/var/support.js +0 -4
  408. data/vendor/assets/bower_components/jquery/src/var/toString.js +0 -5
  409. data/vendor/assets/bower_components/jquery/src/wrap.js +0 -78
@@ -1,16 +1,26 @@
1
1
  /*!
2
- * Bootstrap v3.2.0 (http://getbootstrap.com)
3
- * Copyright 2011-2014 Twitter, Inc.
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
3
+ * Copyright 2011-2016 Twitter, Inc.
4
+ * Licensed under the MIT license
5
5
  */
6
6
 
7
- if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
7
+ if (typeof jQuery === 'undefined') {
8
+ throw new Error('Bootstrap\'s JavaScript requires jQuery')
9
+ }
10
+
11
+ +function ($) {
12
+ 'use strict';
13
+ var version = $.fn.jquery.split(' ')[0].split('.')
14
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
15
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
16
+ }
17
+ }(jQuery);
8
18
 
9
19
  /* ========================================================================
10
- * Bootstrap: transition.js v3.2.0
20
+ * Bootstrap: transition.js v3.3.7
11
21
  * http://getbootstrap.com/javascript/#transitions
12
22
  * ========================================================================
13
- * Copyright 2011-2014 Twitter, Inc.
23
+ * Copyright 2011-2016 Twitter, Inc.
14
24
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
25
  * ======================================================================== */
16
26
 
@@ -67,10 +77,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
67
77
  }(jQuery);
68
78
 
69
79
  /* ========================================================================
70
- * Bootstrap: alert.js v3.2.0
80
+ * Bootstrap: alert.js v3.3.7
71
81
  * http://getbootstrap.com/javascript/#alerts
72
82
  * ========================================================================
73
- * Copyright 2011-2014 Twitter, Inc.
83
+ * Copyright 2011-2016 Twitter, Inc.
74
84
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
75
85
  * ======================================================================== */
76
86
 
@@ -86,7 +96,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
86
96
  $(el).on('click', dismiss, this.close)
87
97
  }
88
98
 
89
- Alert.VERSION = '3.2.0'
99
+ Alert.VERSION = '3.3.7'
100
+
101
+ Alert.TRANSITION_DURATION = 150
90
102
 
91
103
  Alert.prototype.close = function (e) {
92
104
  var $this = $(this)
@@ -97,12 +109,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
97
109
  selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
98
110
  }
99
111
 
100
- var $parent = $(selector)
112
+ var $parent = $(selector === '#' ? [] : selector)
101
113
 
102
114
  if (e) e.preventDefault()
103
115
 
104
116
  if (!$parent.length) {
105
- $parent = $this.hasClass('alert') ? $this : $this.parent()
117
+ $parent = $this.closest('.alert')
106
118
  }
107
119
 
108
120
  $parent.trigger(e = $.Event('close.bs.alert'))
@@ -119,7 +131,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
119
131
  $.support.transition && $parent.hasClass('fade') ?
120
132
  $parent
121
133
  .one('bsTransitionEnd', removeElement)
122
- .emulateTransitionEnd(150) :
134
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
123
135
  removeElement()
124
136
  }
125
137
 
@@ -160,10 +172,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
160
172
  }(jQuery);
161
173
 
162
174
  /* ========================================================================
163
- * Bootstrap: button.js v3.2.0
175
+ * Bootstrap: button.js v3.3.7
164
176
  * http://getbootstrap.com/javascript/#buttons
165
177
  * ========================================================================
166
- * Copyright 2011-2014 Twitter, Inc.
178
+ * Copyright 2011-2016 Twitter, Inc.
167
179
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
168
180
  * ======================================================================== */
169
181
 
@@ -180,7 +192,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
180
192
  this.isLoading = false
181
193
  }
182
194
 
183
- Button.VERSION = '3.2.0'
195
+ Button.VERSION = '3.3.7'
184
196
 
185
197
  Button.DEFAULTS = {
186
198
  loadingText: 'loading...'
@@ -192,20 +204,20 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
192
204
  var val = $el.is('input') ? 'val' : 'html'
193
205
  var data = $el.data()
194
206
 
195
- state = state + 'Text'
207
+ state += 'Text'
196
208
 
197
209
  if (data.resetText == null) $el.data('resetText', $el[val]())
198
210
 
199
- $el[val](data[state] == null ? this.options[state] : data[state])
200
-
201
211
  // push to event loop to allow forms to submit
202
212
  setTimeout($.proxy(function () {
213
+ $el[val](data[state] == null ? this.options[state] : data[state])
214
+
203
215
  if (state == 'loadingText') {
204
216
  this.isLoading = true
205
- $el.addClass(d).attr(d, d)
217
+ $el.addClass(d).attr(d, d).prop(d, true)
206
218
  } else if (this.isLoading) {
207
219
  this.isLoading = false
208
- $el.removeClass(d).removeAttr(d)
220
+ $el.removeClass(d).removeAttr(d).prop(d, false)
209
221
  }
210
222
  }, this), 0)
211
223
  }
@@ -217,13 +229,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
217
229
  if ($parent.length) {
218
230
  var $input = this.$element.find('input')
219
231
  if ($input.prop('type') == 'radio') {
220
- if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
221
- else $parent.find('.active').removeClass('active')
232
+ if ($input.prop('checked')) changed = false
233
+ $parent.find('.active').removeClass('active')
234
+ this.$element.addClass('active')
235
+ } else if ($input.prop('type') == 'checkbox') {
236
+ if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
237
+ this.$element.toggleClass('active')
222
238
  }
223
- if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
239
+ $input.prop('checked', this.$element.hasClass('active'))
240
+ if (changed) $input.trigger('change')
241
+ } else {
242
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
243
+ this.$element.toggleClass('active')
224
244
  }
225
-
226
- if (changed) this.$element.toggleClass('active')
227
245
  }
228
246
 
229
247
 
@@ -261,20 +279,29 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
261
279
  // BUTTON DATA-API
262
280
  // ===============
263
281
 
264
- $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
265
- var $btn = $(e.target)
266
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
267
- Plugin.call($btn, 'toggle')
268
- e.preventDefault()
269
- })
282
+ $(document)
283
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
284
+ var $btn = $(e.target).closest('.btn')
285
+ Plugin.call($btn, 'toggle')
286
+ if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
287
+ // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
288
+ e.preventDefault()
289
+ // The target component still receive the focus
290
+ if ($btn.is('input,button')) $btn.trigger('focus')
291
+ else $btn.find('input:visible,button:visible').first().trigger('focus')
292
+ }
293
+ })
294
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
295
+ $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
296
+ })
270
297
 
271
298
  }(jQuery);
272
299
 
273
300
  /* ========================================================================
274
- * Bootstrap: carousel.js v3.2.0
301
+ * Bootstrap: carousel.js v3.3.7
275
302
  * http://getbootstrap.com/javascript/#carousel
276
303
  * ========================================================================
277
- * Copyright 2011-2014 Twitter, Inc.
304
+ * Copyright 2011-2016 Twitter, Inc.
278
305
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
279
306
  * ======================================================================== */
280
307
 
@@ -286,29 +313,35 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
286
313
  // =========================
287
314
 
288
315
  var Carousel = function (element, options) {
289
- this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
316
+ this.$element = $(element)
290
317
  this.$indicators = this.$element.find('.carousel-indicators')
291
318
  this.options = options
292
- this.paused =
293
- this.sliding =
294
- this.interval =
295
- this.$active =
319
+ this.paused = null
320
+ this.sliding = null
321
+ this.interval = null
322
+ this.$active = null
296
323
  this.$items = null
297
324
 
298
- this.options.pause == 'hover' && this.$element
325
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
326
+
327
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
299
328
  .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
300
329
  .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
301
330
  }
302
331
 
303
- Carousel.VERSION = '3.2.0'
332
+ Carousel.VERSION = '3.3.7'
333
+
334
+ Carousel.TRANSITION_DURATION = 600
304
335
 
305
336
  Carousel.DEFAULTS = {
306
337
  interval: 5000,
307
338
  pause: 'hover',
308
- wrap: true
339
+ wrap: true,
340
+ keyboard: true
309
341
  }
310
342
 
311
343
  Carousel.prototype.keydown = function (e) {
344
+ if (/input|textarea/i.test(e.target.tagName)) return
312
345
  switch (e.which) {
313
346
  case 37: this.prev(); break
314
347
  case 39: this.next(); break
@@ -335,6 +368,16 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
335
368
  return this.$items.index(item || this.$active)
336
369
  }
337
370
 
371
+ Carousel.prototype.getItemForDirection = function (direction, active) {
372
+ var activeIndex = this.getItemIndex(active)
373
+ var willWrap = (direction == 'prev' && activeIndex === 0)
374
+ || (direction == 'next' && activeIndex == (this.$items.length - 1))
375
+ if (willWrap && !this.options.wrap) return active
376
+ var delta = direction == 'prev' ? -1 : 1
377
+ var itemIndex = (activeIndex + delta) % this.$items.length
378
+ return this.$items.eq(itemIndex)
379
+ }
380
+
338
381
  Carousel.prototype.to = function (pos) {
339
382
  var that = this
340
383
  var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
@@ -344,7 +387,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
344
387
  if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
345
388
  if (activeIndex == pos) return this.pause().cycle()
346
389
 
347
- return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
390
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
348
391
  }
349
392
 
350
393
  Carousel.prototype.pause = function (e) {
@@ -372,17 +415,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
372
415
 
373
416
  Carousel.prototype.slide = function (type, next) {
374
417
  var $active = this.$element.find('.item.active')
375
- var $next = next || $active[type]()
418
+ var $next = next || this.getItemForDirection(type, $active)
376
419
  var isCycling = this.interval
377
420
  var direction = type == 'next' ? 'left' : 'right'
378
- var fallback = type == 'next' ? 'first' : 'last'
379
421
  var that = this
380
422
 
381
- if (!$next.length) {
382
- if (!this.options.wrap) return
383
- $next = this.$element.find('.item')[fallback]()
384
- }
385
-
386
423
  if ($next.hasClass('active')) return (this.sliding = false)
387
424
 
388
425
  var relatedTarget = $next[0]
@@ -418,7 +455,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
418
455
  that.$element.trigger(slidEvent)
419
456
  }, 0)
420
457
  })
421
- .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
458
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
422
459
  } else {
423
460
  $active.removeClass('active')
424
461
  $next.addClass('active')
@@ -467,7 +504,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
467
504
  // CAROUSEL DATA-API
468
505
  // =================
469
506
 
470
- $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
507
+ var clickHandler = function (e) {
471
508
  var href
472
509
  var $this = $(this)
473
510
  var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
@@ -483,7 +520,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
483
520
  }
484
521
 
485
522
  e.preventDefault()
486
- })
523
+ }
524
+
525
+ $(document)
526
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
527
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
487
528
 
488
529
  $(window).on('load', function () {
489
530
  $('[data-ride="carousel"]').each(function () {
@@ -495,13 +536,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
495
536
  }(jQuery);
496
537
 
497
538
  /* ========================================================================
498
- * Bootstrap: collapse.js v3.2.0
539
+ * Bootstrap: collapse.js v3.3.7
499
540
  * http://getbootstrap.com/javascript/#collapse
500
541
  * ========================================================================
501
- * Copyright 2011-2014 Twitter, Inc.
542
+ * Copyright 2011-2016 Twitter, Inc.
502
543
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
503
544
  * ======================================================================== */
504
545
 
546
+ /* jshint latedef: false */
505
547
 
506
548
  +function ($) {
507
549
  'use strict';
@@ -512,13 +554,22 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
512
554
  var Collapse = function (element, options) {
513
555
  this.$element = $(element)
514
556
  this.options = $.extend({}, Collapse.DEFAULTS, options)
557
+ this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
558
+ '[data-toggle="collapse"][data-target="#' + element.id + '"]')
515
559
  this.transitioning = null
516
560
 
517
- if (this.options.parent) this.$parent = $(this.options.parent)
561
+ if (this.options.parent) {
562
+ this.$parent = this.getParent()
563
+ } else {
564
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
565
+ }
566
+
518
567
  if (this.options.toggle) this.toggle()
519
568
  }
520
569
 
521
- Collapse.VERSION = '3.2.0'
570
+ Collapse.VERSION = '3.3.7'
571
+
572
+ Collapse.TRANSITION_DURATION = 350
522
573
 
523
574
  Collapse.DEFAULTS = {
524
575
  toggle: true
@@ -532,17 +583,21 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
532
583
  Collapse.prototype.show = function () {
533
584
  if (this.transitioning || this.$element.hasClass('in')) return
534
585
 
586
+ var activesData
587
+ var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
588
+
589
+ if (actives && actives.length) {
590
+ activesData = actives.data('bs.collapse')
591
+ if (activesData && activesData.transitioning) return
592
+ }
593
+
535
594
  var startEvent = $.Event('show.bs.collapse')
536
595
  this.$element.trigger(startEvent)
537
596
  if (startEvent.isDefaultPrevented()) return
538
597
 
539
- var actives = this.$parent && this.$parent.find('> .panel > .in')
540
-
541
598
  if (actives && actives.length) {
542
- var hasData = actives.data('bs.collapse')
543
- if (hasData && hasData.transitioning) return
544
599
  Plugin.call(actives, 'hide')
545
- hasData || actives.data('bs.collapse', null)
600
+ activesData || actives.data('bs.collapse', null)
546
601
  }
547
602
 
548
603
  var dimension = this.dimension()
@@ -550,6 +605,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
550
605
  this.$element
551
606
  .removeClass('collapse')
552
607
  .addClass('collapsing')[dimension](0)
608
+ .attr('aria-expanded', true)
609
+
610
+ this.$trigger
611
+ .removeClass('collapsed')
612
+ .attr('aria-expanded', true)
553
613
 
554
614
  this.transitioning = 1
555
615
 
@@ -568,7 +628,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
568
628
 
569
629
  this.$element
570
630
  .one('bsTransitionEnd', $.proxy(complete, this))
571
- .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
631
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
572
632
  }
573
633
 
574
634
  Collapse.prototype.hide = function () {
@@ -584,17 +644,21 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
584
644
 
585
645
  this.$element
586
646
  .addClass('collapsing')
587
- .removeClass('collapse')
588
- .removeClass('in')
647
+ .removeClass('collapse in')
648
+ .attr('aria-expanded', false)
649
+
650
+ this.$trigger
651
+ .addClass('collapsed')
652
+ .attr('aria-expanded', false)
589
653
 
590
654
  this.transitioning = 1
591
655
 
592
656
  var complete = function () {
593
657
  this.transitioning = 0
594
658
  this.$element
595
- .trigger('hidden.bs.collapse')
596
659
  .removeClass('collapsing')
597
660
  .addClass('collapse')
661
+ .trigger('hidden.bs.collapse')
598
662
  }
599
663
 
600
664
  if (!$.support.transition) return complete.call(this)
@@ -602,13 +666,40 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
602
666
  this.$element
603
667
  [dimension](0)
604
668
  .one('bsTransitionEnd', $.proxy(complete, this))
605
- .emulateTransitionEnd(350)
669
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
606
670
  }
607
671
 
608
672
  Collapse.prototype.toggle = function () {
609
673
  this[this.$element.hasClass('in') ? 'hide' : 'show']()
610
674
  }
611
675
 
676
+ Collapse.prototype.getParent = function () {
677
+ return $(this.options.parent)
678
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
679
+ .each($.proxy(function (i, element) {
680
+ var $element = $(element)
681
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
682
+ }, this))
683
+ .end()
684
+ }
685
+
686
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
687
+ var isOpen = $element.hasClass('in')
688
+
689
+ $element.attr('aria-expanded', isOpen)
690
+ $trigger
691
+ .toggleClass('collapsed', !isOpen)
692
+ .attr('aria-expanded', isOpen)
693
+ }
694
+
695
+ function getTargetFromTrigger($trigger) {
696
+ var href
697
+ var target = $trigger.attr('data-target')
698
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
699
+
700
+ return $(target)
701
+ }
702
+
612
703
 
613
704
  // COLLAPSE PLUGIN DEFINITION
614
705
  // ==========================
@@ -619,7 +710,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
619
710
  var data = $this.data('bs.collapse')
620
711
  var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
621
712
 
622
- if (!data && options.toggle && option == 'show') option = !option
713
+ if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
623
714
  if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
624
715
  if (typeof option == 'string') data[option]()
625
716
  })
@@ -644,21 +735,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
644
735
  // =================
645
736
 
646
737
  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
647
- var href
648
738
  var $this = $(this)
649
- var target = $this.attr('data-target')
650
- || e.preventDefault()
651
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
652
- var $target = $(target)
739
+
740
+ if (!$this.attr('data-target')) e.preventDefault()
741
+
742
+ var $target = getTargetFromTrigger($this)
653
743
  var data = $target.data('bs.collapse')
654
744
  var option = data ? 'toggle' : $this.data()
655
- var parent = $this.attr('data-parent')
656
- var $parent = parent && $(parent)
657
-
658
- if (!data || !data.transitioning) {
659
- if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
660
- $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
661
- }
662
745
 
663
746
  Plugin.call($target, option)
664
747
  })
@@ -666,10 +749,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
666
749
  }(jQuery);
667
750
 
668
751
  /* ========================================================================
669
- * Bootstrap: dropdown.js v3.2.0
752
+ * Bootstrap: dropdown.js v3.3.7
670
753
  * http://getbootstrap.com/javascript/#dropdowns
671
754
  * ========================================================================
672
- * Copyright 2011-2014 Twitter, Inc.
755
+ * Copyright 2011-2016 Twitter, Inc.
673
756
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
674
757
  * ======================================================================== */
675
758
 
@@ -686,7 +769,41 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
686
769
  $(element).on('click.bs.dropdown', this.toggle)
687
770
  }
688
771
 
689
- Dropdown.VERSION = '3.2.0'
772
+ Dropdown.VERSION = '3.3.7'
773
+
774
+ function getParent($this) {
775
+ var selector = $this.attr('data-target')
776
+
777
+ if (!selector) {
778
+ selector = $this.attr('href')
779
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
780
+ }
781
+
782
+ var $parent = selector && $(selector)
783
+
784
+ return $parent && $parent.length ? $parent : $this.parent()
785
+ }
786
+
787
+ function clearMenus(e) {
788
+ if (e && e.which === 3) return
789
+ $(backdrop).remove()
790
+ $(toggle).each(function () {
791
+ var $this = $(this)
792
+ var $parent = getParent($this)
793
+ var relatedTarget = { relatedTarget: this }
794
+
795
+ if (!$parent.hasClass('open')) return
796
+
797
+ if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
798
+
799
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
800
+
801
+ if (e.isDefaultPrevented()) return
802
+
803
+ $this.attr('aria-expanded', 'false')
804
+ $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
805
+ })
806
+ }
690
807
 
691
808
  Dropdown.prototype.toggle = function (e) {
692
809
  var $this = $(this)
@@ -701,7 +818,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
701
818
  if (!isActive) {
702
819
  if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
703
820
  // if mobile we use a backdrop because click events don't delegate
704
- $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
821
+ $(document.createElement('div'))
822
+ .addClass('dropdown-backdrop')
823
+ .insertAfter($(this))
824
+ .on('click', clearMenus)
705
825
  }
706
826
 
707
827
  var relatedTarget = { relatedTarget: this }
@@ -709,18 +829,20 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
709
829
 
710
830
  if (e.isDefaultPrevented()) return
711
831
 
712
- $this.trigger('focus')
832
+ $this
833
+ .trigger('focus')
834
+ .attr('aria-expanded', 'true')
713
835
 
714
836
  $parent
715
837
  .toggleClass('open')
716
- .trigger('shown.bs.dropdown', relatedTarget)
838
+ .trigger($.Event('shown.bs.dropdown', relatedTarget))
717
839
  }
718
840
 
719
841
  return false
720
842
  }
721
843
 
722
844
  Dropdown.prototype.keydown = function (e) {
723
- if (!/(38|40|27)/.test(e.keyCode)) return
845
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
724
846
 
725
847
  var $this = $(this)
726
848
 
@@ -732,51 +854,25 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
732
854
  var $parent = getParent($this)
733
855
  var isActive = $parent.hasClass('open')
734
856
 
735
- if (!isActive || (isActive && e.keyCode == 27)) {
857
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
736
858
  if (e.which == 27) $parent.find(toggle).trigger('focus')
737
859
  return $this.trigger('click')
738
860
  }
739
861
 
740
- var desc = ' li:not(.divider):visible a'
741
- var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
862
+ var desc = ' li:not(.disabled):visible a'
863
+ var $items = $parent.find('.dropdown-menu' + desc)
742
864
 
743
865
  if (!$items.length) return
744
866
 
745
- var index = $items.index($items.filter(':focus'))
867
+ var index = $items.index(e.target)
746
868
 
747
- if (e.keyCode == 38 && index > 0) index-- // up
748
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
749
- if (!~index) index = 0
869
+ if (e.which == 38 && index > 0) index-- // up
870
+ if (e.which == 40 && index < $items.length - 1) index++ // down
871
+ if (!~index) index = 0
750
872
 
751
873
  $items.eq(index).trigger('focus')
752
874
  }
753
875
 
754
- function clearMenus(e) {
755
- if (e && e.which === 3) return
756
- $(backdrop).remove()
757
- $(toggle).each(function () {
758
- var $parent = getParent($(this))
759
- var relatedTarget = { relatedTarget: this }
760
- if (!$parent.hasClass('open')) return
761
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
762
- if (e.isDefaultPrevented()) return
763
- $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
764
- })
765
- }
766
-
767
- function getParent($this) {
768
- var selector = $this.attr('data-target')
769
-
770
- if (!selector) {
771
- selector = $this.attr('href')
772
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
773
- }
774
-
775
- var $parent = selector && $(selector)
776
-
777
- return $parent && $parent.length ? $parent : $this.parent()
778
- }
779
-
780
876
 
781
877
  // DROPDOWN PLUGIN DEFINITION
782
878
  // ==========================
@@ -813,15 +909,16 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
813
909
  .on('click.bs.dropdown.data-api', clearMenus)
814
910
  .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
815
911
  .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
816
- .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
912
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
913
+ .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
817
914
 
818
915
  }(jQuery);
819
916
 
820
917
  /* ========================================================================
821
- * Bootstrap: modal.js v3.2.0
918
+ * Bootstrap: modal.js v3.3.7
822
919
  * http://getbootstrap.com/javascript/#modals
823
920
  * ========================================================================
824
- * Copyright 2011-2014 Twitter, Inc.
921
+ * Copyright 2011-2016 Twitter, Inc.
825
922
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
826
923
  * ======================================================================== */
827
924
 
@@ -833,12 +930,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
833
930
  // ======================
834
931
 
835
932
  var Modal = function (element, options) {
836
- this.options = options
837
- this.$body = $(document.body)
838
- this.$element = $(element)
839
- this.$backdrop =
840
- this.isShown = null
841
- this.scrollbarWidth = 0
933
+ this.options = options
934
+ this.$body = $(document.body)
935
+ this.$element = $(element)
936
+ this.$dialog = this.$element.find('.modal-dialog')
937
+ this.$backdrop = null
938
+ this.isShown = null
939
+ this.originalBodyPad = null
940
+ this.scrollbarWidth = 0
941
+ this.ignoreBackdropClick = false
842
942
 
843
943
  if (this.options.remote) {
844
944
  this.$element
@@ -849,7 +949,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
849
949
  }
850
950
  }
851
951
 
852
- Modal.VERSION = '3.2.0'
952
+ Modal.VERSION = '3.3.7'
953
+
954
+ Modal.TRANSITION_DURATION = 300
955
+ Modal.BACKDROP_TRANSITION_DURATION = 150
853
956
 
854
957
  Modal.DEFAULTS = {
855
958
  backdrop: true,
@@ -872,13 +975,20 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
872
975
  this.isShown = true
873
976
 
874
977
  this.checkScrollbar()
978
+ this.setScrollbar()
875
979
  this.$body.addClass('modal-open')
876
980
 
877
- this.setScrollbar()
878
981
  this.escape()
982
+ this.resize()
879
983
 
880
984
  this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
881
985
 
986
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
987
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
988
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
989
+ })
990
+ })
991
+
882
992
  this.backdrop(function () {
883
993
  var transition = $.support.transition && that.$element.hasClass('fade')
884
994
 
@@ -890,24 +1000,24 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
890
1000
  .show()
891
1001
  .scrollTop(0)
892
1002
 
1003
+ that.adjustDialog()
1004
+
893
1005
  if (transition) {
894
1006
  that.$element[0].offsetWidth // force reflow
895
1007
  }
896
1008
 
897
- that.$element
898
- .addClass('in')
899
- .attr('aria-hidden', false)
1009
+ that.$element.addClass('in')
900
1010
 
901
1011
  that.enforceFocus()
902
1012
 
903
1013
  var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
904
1014
 
905
1015
  transition ?
906
- that.$element.find('.modal-dialog') // wait for modal to slide in
1016
+ that.$dialog // wait for modal to slide in
907
1017
  .one('bsTransitionEnd', function () {
908
1018
  that.$element.trigger('focus').trigger(e)
909
1019
  })
910
- .emulateTransitionEnd(300) :
1020
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
911
1021
  that.$element.trigger('focus').trigger(e)
912
1022
  })
913
1023
  }
@@ -923,22 +1033,22 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
923
1033
 
924
1034
  this.isShown = false
925
1035
 
926
- this.$body.removeClass('modal-open')
927
-
928
- this.resetScrollbar()
929
1036
  this.escape()
1037
+ this.resize()
930
1038
 
931
1039
  $(document).off('focusin.bs.modal')
932
1040
 
933
1041
  this.$element
934
1042
  .removeClass('in')
935
- .attr('aria-hidden', true)
936
1043
  .off('click.dismiss.bs.modal')
1044
+ .off('mouseup.dismiss.bs.modal')
1045
+
1046
+ this.$dialog.off('mousedown.dismiss.bs.modal')
937
1047
 
938
1048
  $.support.transition && this.$element.hasClass('fade') ?
939
1049
  this.$element
940
1050
  .one('bsTransitionEnd', $.proxy(this.hideModal, this))
941
- .emulateTransitionEnd(300) :
1051
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
942
1052
  this.hideModal()
943
1053
  }
944
1054
 
@@ -946,7 +1056,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
946
1056
  $(document)
947
1057
  .off('focusin.bs.modal') // guard against infinite focus loop
948
1058
  .on('focusin.bs.modal', $.proxy(function (e) {
949
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
1059
+ if (document !== e.target &&
1060
+ this.$element[0] !== e.target &&
1061
+ !this.$element.has(e.target).length) {
950
1062
  this.$element.trigger('focus')
951
1063
  }
952
1064
  }, this))
@@ -954,11 +1066,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
954
1066
 
955
1067
  Modal.prototype.escape = function () {
956
1068
  if (this.isShown && this.options.keyboard) {
957
- this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
1069
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
958
1070
  e.which == 27 && this.hide()
959
1071
  }, this))
960
1072
  } else if (!this.isShown) {
961
- this.$element.off('keyup.dismiss.bs.modal')
1073
+ this.$element.off('keydown.dismiss.bs.modal')
1074
+ }
1075
+ }
1076
+
1077
+ Modal.prototype.resize = function () {
1078
+ if (this.isShown) {
1079
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
1080
+ } else {
1081
+ $(window).off('resize.bs.modal')
962
1082
  }
963
1083
  }
964
1084
 
@@ -966,6 +1086,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
966
1086
  var that = this
967
1087
  this.$element.hide()
968
1088
  this.backdrop(function () {
1089
+ that.$body.removeClass('modal-open')
1090
+ that.resetAdjustments()
1091
+ that.resetScrollbar()
969
1092
  that.$element.trigger('hidden.bs.modal')
970
1093
  })
971
1094
  }
@@ -982,14 +1105,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
982
1105
  if (this.isShown && this.options.backdrop) {
983
1106
  var doAnimate = $.support.transition && animate
984
1107
 
985
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1108
+ this.$backdrop = $(document.createElement('div'))
1109
+ .addClass('modal-backdrop ' + animate)
986
1110
  .appendTo(this.$body)
987
1111
 
988
1112
  this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
1113
+ if (this.ignoreBackdropClick) {
1114
+ this.ignoreBackdropClick = false
1115
+ return
1116
+ }
989
1117
  if (e.target !== e.currentTarget) return
990
1118
  this.options.backdrop == 'static'
991
- ? this.$element[0].focus.call(this.$element[0])
992
- : this.hide.call(this)
1119
+ ? this.$element[0].focus()
1120
+ : this.hide()
993
1121
  }, this))
994
1122
 
995
1123
  if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
@@ -1001,7 +1129,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1001
1129
  doAnimate ?
1002
1130
  this.$backdrop
1003
1131
  .one('bsTransitionEnd', callback)
1004
- .emulateTransitionEnd(150) :
1132
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1005
1133
  callback()
1006
1134
 
1007
1135
  } else if (!this.isShown && this.$backdrop) {
@@ -1014,7 +1142,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1014
1142
  $.support.transition && this.$element.hasClass('fade') ?
1015
1143
  this.$backdrop
1016
1144
  .one('bsTransitionEnd', callbackRemove)
1017
- .emulateTransitionEnd(150) :
1145
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1018
1146
  callbackRemove()
1019
1147
 
1020
1148
  } else if (callback) {
@@ -1022,18 +1150,46 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1022
1150
  }
1023
1151
  }
1024
1152
 
1153
+ // these following methods are used to handle overflowing modals
1154
+
1155
+ Modal.prototype.handleUpdate = function () {
1156
+ this.adjustDialog()
1157
+ }
1158
+
1159
+ Modal.prototype.adjustDialog = function () {
1160
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1161
+
1162
+ this.$element.css({
1163
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1164
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
1165
+ })
1166
+ }
1167
+
1168
+ Modal.prototype.resetAdjustments = function () {
1169
+ this.$element.css({
1170
+ paddingLeft: '',
1171
+ paddingRight: ''
1172
+ })
1173
+ }
1174
+
1025
1175
  Modal.prototype.checkScrollbar = function () {
1026
- if (document.body.clientWidth >= window.innerWidth) return
1027
- this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
1176
+ var fullWindowWidth = window.innerWidth
1177
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
1178
+ var documentElementRect = document.documentElement.getBoundingClientRect()
1179
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
1180
+ }
1181
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
1182
+ this.scrollbarWidth = this.measureScrollbar()
1028
1183
  }
1029
1184
 
1030
1185
  Modal.prototype.setScrollbar = function () {
1031
1186
  var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1032
- if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1187
+ this.originalBodyPad = document.body.style.paddingRight || ''
1188
+ if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1033
1189
  }
1034
1190
 
1035
1191
  Modal.prototype.resetScrollbar = function () {
1036
- this.$body.css('padding-right', '')
1192
+ this.$body.css('padding-right', this.originalBodyPad)
1037
1193
  }
1038
1194
 
1039
1195
  Modal.prototype.measureScrollbar = function () { // thx walsh
@@ -1099,11 +1255,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1099
1255
  }(jQuery);
1100
1256
 
1101
1257
  /* ========================================================================
1102
- * Bootstrap: tooltip.js v3.2.0
1258
+ * Bootstrap: tooltip.js v3.3.7
1103
1259
  * http://getbootstrap.com/javascript/#tooltip
1104
1260
  * Inspired by the original jQuery.tipsy by Jason Frame
1105
1261
  * ========================================================================
1106
- * Copyright 2011-2014 Twitter, Inc.
1262
+ * Copyright 2011-2016 Twitter, Inc.
1107
1263
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1108
1264
  * ======================================================================== */
1109
1265
 
@@ -1115,17 +1271,20 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1115
1271
  // ===============================
1116
1272
 
1117
1273
  var Tooltip = function (element, options) {
1118
- this.type =
1119
- this.options =
1120
- this.enabled =
1121
- this.timeout =
1122
- this.hoverState =
1274
+ this.type = null
1275
+ this.options = null
1276
+ this.enabled = null
1277
+ this.timeout = null
1278
+ this.hoverState = null
1123
1279
  this.$element = null
1280
+ this.inState = null
1124
1281
 
1125
1282
  this.init('tooltip', element, options)
1126
1283
  }
1127
1284
 
1128
- Tooltip.VERSION = '3.2.0'
1285
+ Tooltip.VERSION = '3.3.7'
1286
+
1287
+ Tooltip.TRANSITION_DURATION = 150
1129
1288
 
1130
1289
  Tooltip.DEFAULTS = {
1131
1290
  animation: true,
@@ -1148,7 +1307,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1148
1307
  this.type = type
1149
1308
  this.$element = $(element)
1150
1309
  this.options = this.getOptions(options)
1151
- this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
1310
+ this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
1311
+ this.inState = { click: false, hover: false, focus: false }
1312
+
1313
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
1314
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
1315
+ }
1152
1316
 
1153
1317
  var triggers = this.options.trigger.split(' ')
1154
1318
 
@@ -1208,6 +1372,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1208
1372
  $(obj.currentTarget).data('bs.' + this.type, self)
1209
1373
  }
1210
1374
 
1375
+ if (obj instanceof $.Event) {
1376
+ self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
1377
+ }
1378
+
1379
+ if (self.tip().hasClass('in') || self.hoverState == 'in') {
1380
+ self.hoverState = 'in'
1381
+ return
1382
+ }
1383
+
1211
1384
  clearTimeout(self.timeout)
1212
1385
 
1213
1386
  self.hoverState = 'in'
@@ -1219,6 +1392,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1219
1392
  }, self.options.delay.show)
1220
1393
  }
1221
1394
 
1395
+ Tooltip.prototype.isInStateTrue = function () {
1396
+ for (var key in this.inState) {
1397
+ if (this.inState[key]) return true
1398
+ }
1399
+
1400
+ return false
1401
+ }
1402
+
1222
1403
  Tooltip.prototype.leave = function (obj) {
1223
1404
  var self = obj instanceof this.constructor ?
1224
1405
  obj : $(obj.currentTarget).data('bs.' + this.type)
@@ -1228,6 +1409,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1228
1409
  $(obj.currentTarget).data('bs.' + this.type, self)
1229
1410
  }
1230
1411
 
1412
+ if (obj instanceof $.Event) {
1413
+ self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
1414
+ }
1415
+
1416
+ if (self.isInStateTrue()) return
1417
+
1231
1418
  clearTimeout(self.timeout)
1232
1419
 
1233
1420
  self.hoverState = 'out'
@@ -1245,7 +1432,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1245
1432
  if (this.hasContent() && this.enabled) {
1246
1433
  this.$element.trigger(e)
1247
1434
 
1248
- var inDom = $.contains(document.documentElement, this.$element[0])
1435
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
1249
1436
  if (e.isDefaultPrevented() || !inDom) return
1250
1437
  var that = this
1251
1438
 
@@ -1274,6 +1461,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1274
1461
  .data('bs.' + this.type, this)
1275
1462
 
1276
1463
  this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1464
+ this.$element.trigger('inserted.bs.' + this.type)
1277
1465
 
1278
1466
  var pos = this.getPosition()
1279
1467
  var actualWidth = $tip[0].offsetWidth
@@ -1281,13 +1469,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1281
1469
 
1282
1470
  if (autoPlace) {
1283
1471
  var orgPlacement = placement
1284
- var $parent = this.$element.parent()
1285
- var parentDim = this.getPosition($parent)
1472
+ var viewportDim = this.getPosition(this.$viewport)
1286
1473
 
1287
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' :
1288
- placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' :
1289
- placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' :
1290
- placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' :
1474
+ placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
1475
+ placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
1476
+ placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
1477
+ placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
1291
1478
  placement
1292
1479
 
1293
1480
  $tip
@@ -1300,14 +1487,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1300
1487
  this.applyPlacement(calculatedOffset, placement)
1301
1488
 
1302
1489
  var complete = function () {
1490
+ var prevHoverState = that.hoverState
1303
1491
  that.$element.trigger('shown.bs.' + that.type)
1304
1492
  that.hoverState = null
1493
+
1494
+ if (prevHoverState == 'out') that.leave(that)
1305
1495
  }
1306
1496
 
1307
1497
  $.support.transition && this.$tip.hasClass('fade') ?
1308
1498
  $tip
1309
1499
  .one('bsTransitionEnd', complete)
1310
- .emulateTransitionEnd(150) :
1500
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1311
1501
  complete()
1312
1502
  }
1313
1503
  }
@@ -1325,8 +1515,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1325
1515
  if (isNaN(marginTop)) marginTop = 0
1326
1516
  if (isNaN(marginLeft)) marginLeft = 0
1327
1517
 
1328
- offset.top = offset.top + marginTop
1329
- offset.left = offset.left + marginLeft
1518
+ offset.top += marginTop
1519
+ offset.left += marginLeft
1330
1520
 
1331
1521
  // $.fn.offset doesn't round pixel values
1332
1522
  // so we use setOffset directly with our own function B-0
@@ -1354,16 +1544,18 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1354
1544
  if (delta.left) offset.left += delta.left
1355
1545
  else offset.top += delta.top
1356
1546
 
1357
- var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
1358
- var arrowPosition = delta.left ? 'left' : 'top'
1359
- var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
1547
+ var isVertical = /top|bottom/.test(placement)
1548
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
1549
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
1360
1550
 
1361
1551
  $tip.offset(offset)
1362
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
1552
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
1363
1553
  }
1364
1554
 
1365
- Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
1366
- this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
1555
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
1556
+ this.arrow()
1557
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
1558
+ .css(isVertical ? 'top' : 'left', '')
1367
1559
  }
1368
1560
 
1369
1561
  Tooltip.prototype.setContent = function () {
@@ -1374,16 +1566,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1374
1566
  $tip.removeClass('fade in top bottom left right')
1375
1567
  }
1376
1568
 
1377
- Tooltip.prototype.hide = function () {
1569
+ Tooltip.prototype.hide = function (callback) {
1378
1570
  var that = this
1379
- var $tip = this.tip()
1571
+ var $tip = $(this.$tip)
1380
1572
  var e = $.Event('hide.bs.' + this.type)
1381
1573
 
1382
- this.$element.removeAttr('aria-describedby')
1383
-
1384
1574
  function complete() {
1385
1575
  if (that.hoverState != 'in') $tip.detach()
1386
- that.$element.trigger('hidden.bs.' + that.type)
1576
+ if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
1577
+ that.$element
1578
+ .removeAttr('aria-describedby')
1579
+ .trigger('hidden.bs.' + that.type)
1580
+ }
1581
+ callback && callback()
1387
1582
  }
1388
1583
 
1389
1584
  this.$element.trigger(e)
@@ -1392,10 +1587,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1392
1587
 
1393
1588
  $tip.removeClass('in')
1394
1589
 
1395
- $.support.transition && this.$tip.hasClass('fade') ?
1590
+ $.support.transition && $tip.hasClass('fade') ?
1396
1591
  $tip
1397
1592
  .one('bsTransitionEnd', complete)
1398
- .emulateTransitionEnd(150) :
1593
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1399
1594
  complete()
1400
1595
 
1401
1596
  this.hoverState = null
@@ -1405,7 +1600,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1405
1600
 
1406
1601
  Tooltip.prototype.fixTitle = function () {
1407
1602
  var $e = this.$element
1408
- if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
1603
+ if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
1409
1604
  $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1410
1605
  }
1411
1606
  }
@@ -1416,20 +1611,30 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1416
1611
 
1417
1612
  Tooltip.prototype.getPosition = function ($element) {
1418
1613
  $element = $element || this.$element
1614
+
1419
1615
  var el = $element[0]
1420
1616
  var isBody = el.tagName == 'BODY'
1421
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
1422
- scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
1423
- width: isBody ? $(window).width() : $element.outerWidth(),
1424
- height: isBody ? $(window).height() : $element.outerHeight()
1425
- }, isBody ? { top: 0, left: 0 } : $element.offset())
1617
+
1618
+ var elRect = el.getBoundingClientRect()
1619
+ if (elRect.width == null) {
1620
+ // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
1621
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
1622
+ }
1623
+ var isSvg = window.SVGElement && el instanceof window.SVGElement
1624
+ // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
1625
+ // See https://github.com/twbs/bootstrap/issues/20280
1626
+ var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
1627
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
1628
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
1629
+
1630
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
1426
1631
  }
1427
1632
 
1428
1633
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1429
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1430
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1634
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1635
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1431
1636
  placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1432
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1637
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1433
1638
 
1434
1639
  }
1435
1640
 
@@ -1453,7 +1658,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1453
1658
  var rightEdgeOffset = pos.left + viewportPadding + actualWidth
1454
1659
  if (leftEdgeOffset < viewportDimensions.left) { // left overflow
1455
1660
  delta.left = viewportDimensions.left - leftEdgeOffset
1456
- } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
1661
+ } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
1457
1662
  delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1458
1663
  }
1459
1664
  }
@@ -1479,21 +1684,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1479
1684
  }
1480
1685
 
1481
1686
  Tooltip.prototype.tip = function () {
1482
- return (this.$tip = this.$tip || $(this.options.template))
1687
+ if (!this.$tip) {
1688
+ this.$tip = $(this.options.template)
1689
+ if (this.$tip.length != 1) {
1690
+ throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
1691
+ }
1692
+ }
1693
+ return this.$tip
1483
1694
  }
1484
1695
 
1485
1696
  Tooltip.prototype.arrow = function () {
1486
1697
  return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
1487
1698
  }
1488
1699
 
1489
- Tooltip.prototype.validate = function () {
1490
- if (!this.$element[0].parentNode) {
1491
- this.hide()
1492
- this.$element = null
1493
- this.options = null
1494
- }
1495
- }
1496
-
1497
1700
  Tooltip.prototype.enable = function () {
1498
1701
  this.enabled = true
1499
1702
  }
@@ -1516,12 +1719,28 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1516
1719
  }
1517
1720
  }
1518
1721
 
1519
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1722
+ if (e) {
1723
+ self.inState.click = !self.inState.click
1724
+ if (self.isInStateTrue()) self.enter(self)
1725
+ else self.leave(self)
1726
+ } else {
1727
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1728
+ }
1520
1729
  }
1521
1730
 
1522
1731
  Tooltip.prototype.destroy = function () {
1732
+ var that = this
1523
1733
  clearTimeout(this.timeout)
1524
- this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
1734
+ this.hide(function () {
1735
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
1736
+ if (that.$tip) {
1737
+ that.$tip.detach()
1738
+ }
1739
+ that.$tip = null
1740
+ that.$arrow = null
1741
+ that.$viewport = null
1742
+ that.$element = null
1743
+ })
1525
1744
  }
1526
1745
 
1527
1746
 
@@ -1534,7 +1753,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1534
1753
  var data = $this.data('bs.tooltip')
1535
1754
  var options = typeof option == 'object' && option
1536
1755
 
1537
- if (!data && option == 'destroy') return
1756
+ if (!data && /destroy|hide/.test(option)) return
1538
1757
  if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1539
1758
  if (typeof option == 'string') data[option]()
1540
1759
  })
@@ -1557,10 +1776,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1557
1776
  }(jQuery);
1558
1777
 
1559
1778
  /* ========================================================================
1560
- * Bootstrap: popover.js v3.2.0
1779
+ * Bootstrap: popover.js v3.3.7
1561
1780
  * http://getbootstrap.com/javascript/#popovers
1562
1781
  * ========================================================================
1563
- * Copyright 2011-2014 Twitter, Inc.
1782
+ * Copyright 2011-2016 Twitter, Inc.
1564
1783
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1565
1784
  * ======================================================================== */
1566
1785
 
@@ -1577,7 +1796,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1577
1796
 
1578
1797
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1579
1798
 
1580
- Popover.VERSION = '3.2.0'
1799
+ Popover.VERSION = '3.3.7'
1581
1800
 
1582
1801
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1583
1802
  placement: 'right',
@@ -1604,7 +1823,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1604
1823
  var content = this.getContent()
1605
1824
 
1606
1825
  $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1607
- $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
1826
+ $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
1608
1827
  this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
1609
1828
  ](content)
1610
1829
 
@@ -1633,11 +1852,6 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1633
1852
  return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
1634
1853
  }
1635
1854
 
1636
- Popover.prototype.tip = function () {
1637
- if (!this.$tip) this.$tip = $(this.options.template)
1638
- return this.$tip
1639
- }
1640
-
1641
1855
 
1642
1856
  // POPOVER PLUGIN DEFINITION
1643
1857
  // =========================
@@ -1648,7 +1862,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1648
1862
  var data = $this.data('bs.popover')
1649
1863
  var options = typeof option == 'object' && option
1650
1864
 
1651
- if (!data && option == 'destroy') return
1865
+ if (!data && /destroy|hide/.test(option)) return
1652
1866
  if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1653
1867
  if (typeof option == 'string') data[option]()
1654
1868
  })
@@ -1671,10 +1885,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1671
1885
  }(jQuery);
1672
1886
 
1673
1887
  /* ========================================================================
1674
- * Bootstrap: scrollspy.js v3.2.0
1888
+ * Bootstrap: scrollspy.js v3.3.7
1675
1889
  * http://getbootstrap.com/javascript/#scrollspy
1676
1890
  * ========================================================================
1677
- * Copyright 2011-2014 Twitter, Inc.
1891
+ * Copyright 2011-2016 Twitter, Inc.
1678
1892
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1679
1893
  * ======================================================================== */
1680
1894
 
@@ -1686,10 +1900,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1686
1900
  // ==========================
1687
1901
 
1688
1902
  function ScrollSpy(element, options) {
1689
- var process = $.proxy(this.process, this)
1690
-
1691
- this.$body = $('body')
1692
- this.$scrollElement = $(element).is('body') ? $(window) : $(element)
1903
+ this.$body = $(document.body)
1904
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
1693
1905
  this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1694
1906
  this.selector = (this.options.target || '') + ' .nav li > a'
1695
1907
  this.offsets = []
@@ -1697,12 +1909,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1697
1909
  this.activeTarget = null
1698
1910
  this.scrollHeight = 0
1699
1911
 
1700
- this.$scrollElement.on('scroll.bs.scrollspy', process)
1912
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
1701
1913
  this.refresh()
1702
1914
  this.process()
1703
1915
  }
1704
1916
 
1705
- ScrollSpy.VERSION = '3.2.0'
1917
+ ScrollSpy.VERSION = '3.3.7'
1706
1918
 
1707
1919
  ScrollSpy.DEFAULTS = {
1708
1920
  offset: 10
@@ -1713,20 +1925,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1713
1925
  }
1714
1926
 
1715
1927
  ScrollSpy.prototype.refresh = function () {
1716
- var offsetMethod = 'offset'
1717
- var offsetBase = 0
1928
+ var that = this
1929
+ var offsetMethod = 'offset'
1930
+ var offsetBase = 0
1931
+
1932
+ this.offsets = []
1933
+ this.targets = []
1934
+ this.scrollHeight = this.getScrollHeight()
1718
1935
 
1719
1936
  if (!$.isWindow(this.$scrollElement[0])) {
1720
1937
  offsetMethod = 'position'
1721
1938
  offsetBase = this.$scrollElement.scrollTop()
1722
1939
  }
1723
1940
 
1724
- this.offsets = []
1725
- this.targets = []
1726
- this.scrollHeight = this.getScrollHeight()
1727
-
1728
- var self = this
1729
-
1730
1941
  this.$body
1731
1942
  .find(this.selector)
1732
1943
  .map(function () {
@@ -1741,8 +1952,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1741
1952
  })
1742
1953
  .sort(function (a, b) { return a[0] - b[0] })
1743
1954
  .each(function () {
1744
- self.offsets.push(this[0])
1745
- self.targets.push(this[1])
1955
+ that.offsets.push(this[0])
1956
+ that.targets.push(this[1])
1746
1957
  })
1747
1958
  }
1748
1959
 
@@ -1763,14 +1974,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1763
1974
  return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
1764
1975
  }
1765
1976
 
1766
- if (activeTarget && scrollTop <= offsets[0]) {
1767
- return activeTarget != (i = targets[0]) && this.activate(i)
1977
+ if (activeTarget && scrollTop < offsets[0]) {
1978
+ this.activeTarget = null
1979
+ return this.clear()
1768
1980
  }
1769
1981
 
1770
1982
  for (i = offsets.length; i--;) {
1771
1983
  activeTarget != targets[i]
1772
1984
  && scrollTop >= offsets[i]
1773
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1985
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
1774
1986
  && this.activate(targets[i])
1775
1987
  }
1776
1988
  }
@@ -1778,13 +1990,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1778
1990
  ScrollSpy.prototype.activate = function (target) {
1779
1991
  this.activeTarget = target
1780
1992
 
1781
- $(this.selector)
1782
- .parentsUntil(this.options.target, '.active')
1783
- .removeClass('active')
1993
+ this.clear()
1784
1994
 
1785
1995
  var selector = this.selector +
1786
- '[data-target="' + target + '"],' +
1787
- this.selector + '[href="' + target + '"]'
1996
+ '[data-target="' + target + '"],' +
1997
+ this.selector + '[href="' + target + '"]'
1788
1998
 
1789
1999
  var active = $(selector)
1790
2000
  .parents('li')
@@ -1799,6 +2009,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1799
2009
  active.trigger('activate.bs.scrollspy')
1800
2010
  }
1801
2011
 
2012
+ ScrollSpy.prototype.clear = function () {
2013
+ $(this.selector)
2014
+ .parentsUntil(this.options.target, '.active')
2015
+ .removeClass('active')
2016
+ }
2017
+
1802
2018
 
1803
2019
  // SCROLLSPY PLUGIN DEFINITION
1804
2020
  // ===========================
@@ -1842,10 +2058,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1842
2058
  }(jQuery);
1843
2059
 
1844
2060
  /* ========================================================================
1845
- * Bootstrap: tab.js v3.2.0
2061
+ * Bootstrap: tab.js v3.3.7
1846
2062
  * http://getbootstrap.com/javascript/#tabs
1847
2063
  * ========================================================================
1848
- * Copyright 2011-2014 Twitter, Inc.
2064
+ * Copyright 2011-2016 Twitter, Inc.
1849
2065
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1850
2066
  * ======================================================================== */
1851
2067
 
@@ -1857,10 +2073,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1857
2073
  // ====================
1858
2074
 
1859
2075
  var Tab = function (element) {
2076
+ // jscs:disable requireDollarBeforejQueryAssignment
1860
2077
  this.element = $(element)
2078
+ // jscs:enable requireDollarBeforejQueryAssignment
1861
2079
  }
1862
2080
 
1863
- Tab.VERSION = '3.2.0'
2081
+ Tab.VERSION = '3.3.7'
2082
+
2083
+ Tab.TRANSITION_DURATION = 150
1864
2084
 
1865
2085
  Tab.prototype.show = function () {
1866
2086
  var $this = this.element
@@ -1874,22 +2094,30 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1874
2094
 
1875
2095
  if ($this.parent('li').hasClass('active')) return
1876
2096
 
1877
- var previous = $ul.find('.active:last a')[0]
1878
- var e = $.Event('show.bs.tab', {
1879
- relatedTarget: previous
2097
+ var $previous = $ul.find('.active:last a')
2098
+ var hideEvent = $.Event('hide.bs.tab', {
2099
+ relatedTarget: $this[0]
2100
+ })
2101
+ var showEvent = $.Event('show.bs.tab', {
2102
+ relatedTarget: $previous[0]
1880
2103
  })
1881
2104
 
1882
- $this.trigger(e)
2105
+ $previous.trigger(hideEvent)
2106
+ $this.trigger(showEvent)
1883
2107
 
1884
- if (e.isDefaultPrevented()) return
2108
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
1885
2109
 
1886
2110
  var $target = $(selector)
1887
2111
 
1888
2112
  this.activate($this.closest('li'), $ul)
1889
2113
  this.activate($target, $target.parent(), function () {
2114
+ $previous.trigger({
2115
+ type: 'hidden.bs.tab',
2116
+ relatedTarget: $this[0]
2117
+ })
1890
2118
  $this.trigger({
1891
2119
  type: 'shown.bs.tab',
1892
- relatedTarget: previous
2120
+ relatedTarget: $previous[0]
1893
2121
  })
1894
2122
  })
1895
2123
  }
@@ -1898,15 +2126,21 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1898
2126
  var $active = container.find('> .active')
1899
2127
  var transition = callback
1900
2128
  && $.support.transition
1901
- && $active.hasClass('fade')
2129
+ && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
1902
2130
 
1903
2131
  function next() {
1904
2132
  $active
1905
2133
  .removeClass('active')
1906
2134
  .find('> .dropdown-menu > .active')
1907
- .removeClass('active')
2135
+ .removeClass('active')
2136
+ .end()
2137
+ .find('[data-toggle="tab"]')
2138
+ .attr('aria-expanded', false)
1908
2139
 
1909
- element.addClass('active')
2140
+ element
2141
+ .addClass('active')
2142
+ .find('[data-toggle="tab"]')
2143
+ .attr('aria-expanded', true)
1910
2144
 
1911
2145
  if (transition) {
1912
2146
  element[0].offsetWidth // reflow for transition
@@ -1915,17 +2149,22 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1915
2149
  element.removeClass('fade')
1916
2150
  }
1917
2151
 
1918
- if (element.parent('.dropdown-menu')) {
1919
- element.closest('li.dropdown').addClass('active')
2152
+ if (element.parent('.dropdown-menu').length) {
2153
+ element
2154
+ .closest('li.dropdown')
2155
+ .addClass('active')
2156
+ .end()
2157
+ .find('[data-toggle="tab"]')
2158
+ .attr('aria-expanded', true)
1920
2159
  }
1921
2160
 
1922
2161
  callback && callback()
1923
2162
  }
1924
2163
 
1925
- transition ?
2164
+ $active.length && transition ?
1926
2165
  $active
1927
2166
  .one('bsTransitionEnd', next)
1928
- .emulateTransitionEnd(150) :
2167
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
1929
2168
  next()
1930
2169
 
1931
2170
  $active.removeClass('in')
@@ -1963,18 +2202,22 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1963
2202
  // TAB DATA-API
1964
2203
  // ============
1965
2204
 
1966
- $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
2205
+ var clickHandler = function (e) {
1967
2206
  e.preventDefault()
1968
2207
  Plugin.call($(this), 'show')
1969
- })
2208
+ }
2209
+
2210
+ $(document)
2211
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
2212
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
1970
2213
 
1971
2214
  }(jQuery);
1972
2215
 
1973
2216
  /* ========================================================================
1974
- * Bootstrap: affix.js v3.2.0
2217
+ * Bootstrap: affix.js v3.3.7
1975
2218
  * http://getbootstrap.com/javascript/#affix
1976
2219
  * ========================================================================
1977
- * Copyright 2011-2014 Twitter, Inc.
2220
+ * Copyright 2011-2016 Twitter, Inc.
1978
2221
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1979
2222
  * ======================================================================== */
1980
2223
 
@@ -1993,14 +2236,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
1993
2236
  .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
1994
2237
 
1995
2238
  this.$element = $(element)
1996
- this.affixed =
1997
- this.unpin =
2239
+ this.affixed = null
2240
+ this.unpin = null
1998
2241
  this.pinnedOffset = null
1999
2242
 
2000
2243
  this.checkPosition()
2001
2244
  }
2002
2245
 
2003
- Affix.VERSION = '3.2.0'
2246
+ Affix.VERSION = '3.3.7'
2004
2247
 
2005
2248
  Affix.RESET = 'affix affix-top affix-bottom'
2006
2249
 
@@ -2009,6 +2252,28 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
2009
2252
  target: window
2010
2253
  }
2011
2254
 
2255
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
2256
+ var scrollTop = this.$target.scrollTop()
2257
+ var position = this.$element.offset()
2258
+ var targetHeight = this.$target.height()
2259
+
2260
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
2261
+
2262
+ if (this.affixed == 'bottom') {
2263
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
2264
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
2265
+ }
2266
+
2267
+ var initializing = this.affixed == null
2268
+ var colliderTop = initializing ? scrollTop : position.top
2269
+ var colliderHeight = initializing ? targetHeight : height
2270
+
2271
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
2272
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
2273
+
2274
+ return false
2275
+ }
2276
+
2012
2277
  Affix.prototype.getPinnedOffset = function () {
2013
2278
  if (this.pinnedOffset) return this.pinnedOffset
2014
2279
  this.$element.removeClass(Affix.RESET).addClass('affix')
@@ -2024,42 +2289,40 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
2024
2289
  Affix.prototype.checkPosition = function () {
2025
2290
  if (!this.$element.is(':visible')) return
2026
2291
 
2027
- var scrollHeight = $(document).height()
2028
- var scrollTop = this.$target.scrollTop()
2029
- var position = this.$element.offset()
2292
+ var height = this.$element.height()
2030
2293
  var offset = this.options.offset
2031
2294
  var offsetTop = offset.top
2032
2295
  var offsetBottom = offset.bottom
2296
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
2033
2297
 
2034
2298
  if (typeof offset != 'object') offsetBottom = offsetTop = offset
2035
2299
  if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
2036
2300
  if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2037
2301
 
2038
- var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
2039
- offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
2040
- offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
2302
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2041
2303
 
2042
- if (this.affixed === affix) return
2043
- if (this.unpin != null) this.$element.css('top', '')
2304
+ if (this.affixed != affix) {
2305
+ if (this.unpin != null) this.$element.css('top', '')
2044
2306
 
2045
- var affixType = 'affix' + (affix ? '-' + affix : '')
2046
- var e = $.Event(affixType + '.bs.affix')
2307
+ var affixType = 'affix' + (affix ? '-' + affix : '')
2308
+ var e = $.Event(affixType + '.bs.affix')
2047
2309
 
2048
- this.$element.trigger(e)
2310
+ this.$element.trigger(e)
2049
2311
 
2050
- if (e.isDefaultPrevented()) return
2312
+ if (e.isDefaultPrevented()) return
2051
2313
 
2052
- this.affixed = affix
2053
- this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2314
+ this.affixed = affix
2315
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2054
2316
 
2055
- this.$element
2056
- .removeClass(Affix.RESET)
2057
- .addClass(affixType)
2058
- .trigger($.Event(affixType.replace('affix', 'affixed')))
2317
+ this.$element
2318
+ .removeClass(Affix.RESET)
2319
+ .addClass(affixType)
2320
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
2321
+ }
2059
2322
 
2060
2323
  if (affix == 'bottom') {
2061
2324
  this.$element.offset({
2062
- top: scrollHeight - this.$element.height() - offsetBottom
2325
+ top: scrollHeight - height - offsetBottom
2063
2326
  })
2064
2327
  }
2065
2328
  }
@@ -2104,8 +2367,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
2104
2367
 
2105
2368
  data.offset = data.offset || {}
2106
2369
 
2107
- if (data.offsetBottom) data.offset.bottom = data.offsetBottom
2108
- if (data.offsetTop) data.offset.top = data.offsetTop
2370
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
2371
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
2109
2372
 
2110
2373
  Plugin.call($spy, data)
2111
2374
  })