kms 0.9.0 → 1.0.0

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