pwb 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (367) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/javascripts/comfy/admin/cms/custom.js.coffee +1 -0
  4. data/app/assets/stylesheets/comfy/admin/cms/custom.sass +1 -0
  5. data/app/assets/stylesheets/pwb/themes/berlin/inmo.scss +6 -1
  6. data/app/assets/stylesheets/pwb/themes/berlin/main.scss +12 -11
  7. data/app/assets/stylesheets/pwb/themes/default/shame.scss +1 -1
  8. data/app/controllers/pwb/admin_panel_controller.rb +2 -2
  9. data/app/controllers/pwb/api/v1/cms_pages_controller.rb +102 -0
  10. data/app/controllers/pwb/api/v1/website_controller.rb +7 -0
  11. data/app/controllers/pwb/api_public/v1/props_controller.rb +2 -2
  12. data/app/controllers/pwb/application_api_controller.rb +3 -7
  13. data/app/controllers/pwb/application_controller.rb +2 -3
  14. data/app/controllers/pwb/comfy_controller.rb +106 -0
  15. data/app/controllers/pwb/css_controller.rb +1 -2
  16. data/app/controllers/pwb/devise/registrations_controller.rb +2 -5
  17. data/app/controllers/pwb/devise_controller.rb +3 -8
  18. data/app/controllers/pwb/export/properties_controller.rb +5 -6
  19. data/app/controllers/pwb/export/translations_controller.rb +1 -5
  20. data/app/controllers/pwb/export/web_contents_controller.rb +1 -4
  21. data/app/controllers/pwb/export/website_controller.rb +0 -1
  22. data/app/controllers/pwb/import/mls_controller.rb +3 -6
  23. data/app/controllers/pwb/import/properties_controller.rb +2 -4
  24. data/app/controllers/pwb/import/scrapper_controller.rb +6 -9
  25. data/app/controllers/pwb/props_controller.rb +10 -13
  26. data/app/controllers/pwb/search_controller.rb +16 -16
  27. data/app/controllers/pwb/sections_controller.rb +21 -22
  28. data/app/controllers/pwb/welcome_controller.rb +1 -2
  29. data/app/helpers/pwb/application_helper.rb +37 -0
  30. data/app/helpers/pwb/css_helper.rb +9 -0
  31. data/app/models/pwb/cms_page_container.rb +9 -0
  32. data/app/models/pwb/content.rb +10 -6
  33. data/app/models/pwb/prop.rb +12 -4
  34. data/app/models/pwb/section.rb +1 -1
  35. data/app/models/pwb/website.rb +14 -1
  36. data/app/resources/pwb/api/v1/cms_block_resource.rb +11 -0
  37. data/app/resources/pwb/api/v1/cms_page_resource.rb +27 -0
  38. data/app/themes/berlin/views/layouts/pwb/application.html.erb +25 -9
  39. data/app/themes/berlin/views/pwb/props/show.html.erb +5 -5
  40. data/app/themes/berlin/views/pwb/search/_search_results.html.erb +2 -1
  41. data/app/themes/berlin/views/pwb/search/buy.html.erb +1 -1
  42. data/app/themes/berlin/views/pwb/search/rent.html.erb +2 -1
  43. data/app/themes/berlin/views/pwb/sections/about_us.html.erb +3 -2
  44. data/app/themes/berlin/views/pwb/sections/cms.html.erb +34 -0
  45. data/app/themes/berlin/views/pwb/sections/contact_us.html.erb +2 -1
  46. data/app/themes/berlin/views/pwb/welcome/_about_us_to_del.html.erb +35 -0
  47. data/app/themes/berlin/views/pwb/welcome/{_adv_search.html.erb → _adv_search_to_del.html.erb} +0 -0
  48. data/app/themes/berlin/views/pwb/welcome/_landing_carousel.html.erb +1 -1
  49. data/app/themes/berlin/views/pwb/welcome/_latest_properties.html.erb +2 -1
  50. data/app/themes/default/views/layouts/pwb/application.html.erb +24 -3
  51. data/app/themes/default/views/pwb/sections/about_us.html.erb +1 -2
  52. data/app/themes/default/views/pwb/sections/cms.html.erb +30 -0
  53. data/app/themes/default/views/pwb/welcome/_single_property_row.html.erb +2 -1
  54. data/app/themes/default/views/pwb/welcome/index.html.erb +3 -1
  55. data/app/views/layouts/pwb/devise.html.erb +1 -0
  56. data/app/views/pwb/_analytics.html.erb +15 -0
  57. data/app/views/pwb/_footer.html.erb +0 -12
  58. data/app/views/pwb/custom_css/{berlin.css.erb → _berlin.css.erb} +0 -1
  59. data/app/views/pwb/custom_css/{default.css.erb → _default.css.erb} +0 -1
  60. data/app/views/pwb/custom_css/_shared.css.erb +1 -0
  61. data/app/views/pwb/props/_images_section_carousel.html.erb +13 -27
  62. data/app/views/pwb/props/_prop_info_list.html.erb +1 -1
  63. data/app/views/pwb/search/_search_result_item.html.erb +62 -64
  64. data/app/views/pwb/search/_search_result_item_to_del.html.erb +3 -3
  65. data/config/client_setups/default.json +59 -21
  66. data/config/cms_page_containers/about-us.json +18 -0
  67. data/config/cms_page_containers/about.json +107 -0
  68. data/config/cms_page_containers/landing.json +19 -0
  69. data/config/cms_page_containers/legal.json +17 -0
  70. data/config/cms_page_containers/sell.json +96 -0
  71. data/config/initializers/cloudinary.rb +3 -0
  72. data/config/initializers/comfortable_mexican_sofa.rb +142 -0
  73. data/config/locales/admin.en.yml +213 -0
  74. data/config/locales/admin.es.yml +32 -17
  75. data/config/locales/admin.ru.yml +432 -0
  76. data/config/locales/admin.zh.yml.tmp +226 -0
  77. data/config/locales/de.yml +31 -32
  78. data/config/locales/devise.zh-HK.yml +119 -0
  79. data/config/locales/en.yml +3 -0
  80. data/config/locales/es.yml +3 -5
  81. data/config/locales/rails.zh-HK.yml +210 -0
  82. data/config/locales/ru.yml +11 -11
  83. data/config/locales/zh-HK.yml +154 -0
  84. data/config/routes.rb +17 -2
  85. data/db/cms_fixtures/cms/categories/pages.yml +3 -0
  86. data/db/cms_fixtures/cms/files/_rerenting-landing_framed.png.yml +6 -0
  87. data/{spec/dummy/public/system/comfy/cms/files/files/000/000/003/original → db/cms_fixtures/cms/files}/rerenting-landing_framed.png +0 -0
  88. data/db/cms_fixtures/cms/layouts/about-us/attributes.yml +4 -0
  89. data/db/cms_fixtures/cms/layouts/about-us/content.html +0 -0
  90. data/db/cms_fixtures/cms/layouts/about-us/javascript.js +0 -0
  91. data/db/cms_fixtures/cms/layouts/about-us/people/attributes.yml +4 -0
  92. data/db/cms_fixtures/cms/layouts/about-us/people/content.html +55 -0
  93. data/db/cms_fixtures/cms/layouts/about-us/services/attributes.yml +4 -0
  94. data/db/cms_fixtures/cms/layouts/about-us/services/content.html +32 -0
  95. data/db/cms_fixtures/cms/layouts/about-us/services/javascript.js +0 -0
  96. data/db/cms_fixtures/cms/layouts/about-us/services/stylesheet.css +0 -0
  97. data/db/cms_fixtures/cms/layouts/about-us/stylesheet.css +0 -0
  98. data/db/cms_fixtures/cms/layouts/default-layout/attributes.yml +4 -0
  99. data/db/cms_fixtures/cms/layouts/default-layout/content.html +51 -0
  100. data/db/cms_fixtures/cms/layouts/default-layout/javascript.js +0 -0
  101. data/db/cms_fixtures/cms/layouts/default-layout/stylesheet.css +0 -0
  102. data/db/cms_fixtures/cms/pages/index/about-us/attributes.yml +8 -0
  103. data/db/cms_fixtures/cms/pages/index/about-us/people/attributes.yml +8 -0
  104. data/db/cms_fixtures/cms/pages/index/about-us/people/de/attributes.yml +8 -0
  105. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_details_a.html +1 -0
  106. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_details_b.html +1 -0
  107. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_details_c.html +1 -0
  108. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_details_d.html +1 -0
  109. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_img_url_a.html +1 -0
  110. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_img_url_b.html +1 -0
  111. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_img_url_c.html +1 -0
  112. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_img_url_d.html +1 -0
  113. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_name_a.html +1 -0
  114. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_name_b.html +1 -0
  115. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_name_c.html +1 -0
  116. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_name_d.html +1 -0
  117. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_title_a.html +1 -0
  118. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_title_b.html +1 -0
  119. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_title_c.html +1 -0
  120. data/db/cms_fixtures/cms/pages/index/about-us/people/de/person_title_d.html +1 -0
  121. data/db/cms_fixtures/cms/pages/index/about-us/people/en/attributes.yml +8 -0
  122. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_details_a.html +1 -0
  123. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_details_b.html +1 -0
  124. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_details_c.html +1 -0
  125. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_details_d.html +1 -0
  126. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_img_url_a.html +1 -0
  127. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_img_url_b.html +1 -0
  128. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_img_url_c.html +1 -0
  129. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_img_url_d.html +1 -0
  130. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_name_a.html +1 -0
  131. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_name_b.html +1 -0
  132. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_name_c.html +1 -0
  133. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_name_d.html +1 -0
  134. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_title_a.html +1 -0
  135. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_title_b.html +1 -0
  136. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_title_c.html +1 -0
  137. data/db/cms_fixtures/cms/pages/index/about-us/people/en/person_title_d.html +1 -0
  138. data/db/cms_fixtures/cms/pages/index/about-us/people/es/attributes.yml +8 -0
  139. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_details_a.html +1 -0
  140. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_details_b.html +1 -0
  141. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_details_c.html +1 -0
  142. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_details_d.html +1 -0
  143. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_img_url_a.html +1 -0
  144. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_img_url_b.html +1 -0
  145. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_img_url_c.html +1 -0
  146. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_img_url_d.html +1 -0
  147. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_name_a.html +1 -0
  148. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_name_b.html +1 -0
  149. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_name_c.html +1 -0
  150. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_name_d.html +1 -0
  151. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_title_a.html +1 -0
  152. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_title_b.html +1 -0
  153. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_title_c.html +1 -0
  154. data/db/cms_fixtures/cms/pages/index/about-us/people/es/person_title_d.html +1 -0
  155. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/attributes.yml +8 -0
  156. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_details_a.html +1 -0
  157. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_details_b.html +1 -0
  158. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_details_c.html +1 -0
  159. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_details_d.html +1 -0
  160. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_name_a.html +1 -0
  161. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_name_b.html +1 -0
  162. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_name_c.html +1 -0
  163. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_name_d.html +1 -0
  164. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_title_a.html +1 -0
  165. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_title_b.html +1 -0
  166. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_title_c.html +1 -0
  167. data/db/cms_fixtures/cms/pages/index/about-us/people/pt/person_title_d.html +1 -0
  168. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/attributes.yml +8 -0
  169. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_details_a.html +1 -0
  170. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_details_b.html +1 -0
  171. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_details_c.html +1 -0
  172. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_details_d.html +1 -0
  173. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_img_url_a.html +1 -0
  174. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_img_url_b.html +1 -0
  175. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_img_url_c.html +1 -0
  176. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_img_url_d.html +1 -0
  177. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_name_a.html +1 -0
  178. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_name_b.html +1 -0
  179. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_name_c.html +1 -0
  180. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_name_d.html +1 -0
  181. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_title_a.html +1 -0
  182. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_title_b.html +1 -0
  183. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_title_c.html +1 -0
  184. data/db/cms_fixtures/cms/pages/index/about-us/people/ru/person_title_d.html +1 -0
  185. data/db/cms_fixtures/cms/pages/index/about-us/services/attributes.yml +8 -0
  186. data/db/cms_fixtures/cms/pages/index/about-us/services/content_a.html +1 -0
  187. data/db/cms_fixtures/cms/pages/index/about-us/services/content_b.html +0 -0
  188. data/db/cms_fixtures/cms/pages/index/about-us/services/content_c.html +0 -0
  189. data/db/cms_fixtures/cms/pages/index/about-us/services/de/attributes.yml +8 -0
  190. data/db/cms_fixtures/cms/pages/index/about-us/services/de/content_a.html +1 -0
  191. data/db/cms_fixtures/cms/pages/index/about-us/services/de/content_b.html +1 -0
  192. data/db/cms_fixtures/cms/pages/index/about-us/services/de/content_c.html +1 -0
  193. data/db/cms_fixtures/cms/pages/index/about-us/services/de/title_a.html +1 -0
  194. data/db/cms_fixtures/cms/pages/index/about-us/services/de/title_b.html +1 -0
  195. data/db/cms_fixtures/cms/pages/index/about-us/services/de/title_c.html +1 -0
  196. data/db/cms_fixtures/cms/pages/index/about-us/services/en/attributes.yml +8 -0
  197. data/db/cms_fixtures/cms/pages/index/about-us/services/en/content_a.html +1 -0
  198. data/db/cms_fixtures/cms/pages/index/about-us/services/en/content_b.html +1 -0
  199. data/db/cms_fixtures/cms/pages/index/about-us/services/en/content_c.html +1 -0
  200. data/db/cms_fixtures/cms/pages/index/about-us/services/en/title_a.html +1 -0
  201. data/db/cms_fixtures/cms/pages/index/about-us/services/en/title_b.html +1 -0
  202. data/db/cms_fixtures/cms/pages/index/about-us/services/en/title_c.html +1 -0
  203. data/db/cms_fixtures/cms/pages/index/about-us/services/es/attributes.yml +8 -0
  204. data/db/cms_fixtures/cms/pages/index/about-us/services/es/content_a.html +1 -0
  205. data/db/cms_fixtures/cms/pages/index/about-us/services/es/content_b.html +1 -0
  206. data/db/cms_fixtures/cms/pages/index/about-us/services/es/content_c.html +1 -0
  207. data/db/cms_fixtures/cms/pages/index/about-us/services/es/title_a.html +1 -0
  208. data/db/cms_fixtures/cms/pages/index/about-us/services/es/title_b.html +1 -0
  209. data/db/cms_fixtures/cms/pages/index/about-us/services/es/title_c.html +1 -0
  210. data/db/cms_fixtures/cms/pages/index/about-us/services/title_a.html +1 -0
  211. data/db/cms_fixtures/cms/pages/index/about-us/services/title_b.html +0 -0
  212. data/db/cms_fixtures/cms/pages/index/about-us/services/title_c.html +0 -0
  213. data/db/cms_fixtures/cms/pages/index/attributes.yml +8 -0
  214. data/db/cms_fixtures/cms/pages/index/content.html +1 -0
  215. data/db/cms_fixtures/cms/pages/index/title.html +0 -0
  216. data/db/cms_fixtures/cms/snippets/snippet1/attributes.yml +3 -0
  217. data/db/cms_fixtures/cms/snippets/snippet1/content.html +1 -0
  218. data/db/cms_fixtures/sample-site/categories/files.yml +1 -0
  219. data/db/cms_fixtures/sample-site/categories/pages.yml +1 -0
  220. data/db/cms_fixtures/sample-site/categories/snippets.yml +1 -0
  221. data/db/cms_fixtures/sample-site/files/_sample.jpg.yml +5 -0
  222. data/db/cms_fixtures/sample-site/files/sample.jpg +0 -0
  223. data/db/cms_fixtures/sample-site/layouts/default/attributes.yml +1 -0
  224. data/db/cms_fixtures/sample-site/layouts/default/content.html +5 -0
  225. data/db/cms_fixtures/sample-site/layouts/default/javascript.js +1 -0
  226. data/db/cms_fixtures/sample-site/layouts/default/nested/attributes.yml +2 -0
  227. data/db/cms_fixtures/sample-site/layouts/default/nested/content.haml +3 -0
  228. data/db/cms_fixtures/sample-site/layouts/default/nested/javascript.js +1 -0
  229. data/db/cms_fixtures/sample-site/layouts/default/nested/stylesheet.css +1 -0
  230. data/db/cms_fixtures/sample-site/layouts/default/stylesheet.css +1 -0
  231. data/db/cms_fixtures/sample-site/pages/index/attributes.yml +6 -0
  232. data/db/cms_fixtures/sample-site/pages/index/child/attributes.yml +3 -0
  233. data/db/cms_fixtures/sample-site/pages/index/child/left.haml +1 -0
  234. data/db/cms_fixtures/sample-site/pages/index/child/right.html +1 -0
  235. data/db/cms_fixtures/sample-site/pages/index/child/thumbnail.png +0 -0
  236. data/db/cms_fixtures/sample-site/pages/index/content.html +2 -0
  237. data/db/cms_fixtures/sample-site/snippets/default/attributes.yml +4 -0
  238. data/db/cms_fixtures/sample-site/snippets/default/content.html +1 -0
  239. data/db/migrate/20170513221300_create_cms.rb +133 -0
  240. data/db/seeds/spain/translations.rb +2 -2
  241. data/db/seeds/translations_ca.rb +92 -0
  242. data/db/seeds/translations_de.rb +86 -85
  243. data/db/seeds/translations_en.rb +73 -73
  244. data/db/seeds/translations_es.rb +79 -78
  245. data/db/seeds/translations_ru.rb +92 -0
  246. data/db/yml_seeds/prop/flat_for_rent.yml +4 -4
  247. data/db/yml_seeds/sections.yml +2 -2
  248. data/db/yml_seeds/website.yml +3 -1
  249. data/lib/pwb/cms_data_loader.rb +38 -0
  250. data/lib/pwb/engine.rb +1 -0
  251. data/lib/pwb/locale_loader.rb +47 -0
  252. data/lib/pwb/seeder.rb +8 -5
  253. data/lib/pwb/version.rb +1 -1
  254. data/lib/tasks/pwb_tasks.rake +1 -0
  255. data/spec/dummy/config/routes.rb +5 -0
  256. data/spec/dummy/config/secrets.yml +5 -0
  257. data/spec/dummy/db/schema.rb +111 -1
  258. data/spec/dummy/log/development.log +0 -0
  259. data/spec/features/pwb/admin_spec.rb +14 -40
  260. data/spec/features/pwb/admin_spec_tmp.rb +54 -0
  261. data/spec/fixtures/to_import/pwb-properties.csv +2 -2
  262. data/spec/views/pwb/application_layout.html.erb_spec.rb +1 -0
  263. metadata +207 -235
  264. data/app/themes/berlin/views/pwb/welcome/_about_us.html.erb +0 -36
  265. data/db/seeds/translations_others.rb +0 -215
  266. data/spec/dummy/public/assets/application-af04b226fd7202dfc532ce7aedb95a0128277937e90d3b3a3d35e1cce9e16886.css +0 -16
  267. data/spec/dummy/public/assets/application-af04b226fd7202dfc532ce7aedb95a0128277937e90d3b3a3d35e1cce9e16886.css.gz +0 -0
  268. data/spec/dummy/public/assets/application-ec8550e416fd8df1557ddb7f132ccd38baaafd36e4c5c9aff8420fbd47c0313f.js +0 -617
  269. data/spec/dummy/public/assets/application-ec8550e416fd8df1557ddb7f132ccd38baaafd36e4c5c9aff8420fbd47c0313f.js.gz +0 -0
  270. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot +0 -0
  271. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot.gz +0 -0
  272. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg +0 -288
  273. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg.gz +0 -0
  274. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff +0 -0
  275. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf +0 -0
  276. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf.gz +0 -0
  277. data/spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2 +0 -0
  278. data/spec/dummy/public/assets/pwb/application-0dc6ff845cde8e032ed365593c17fe09c18a6966d44f551946bf1673d8d1ac51.css +0 -13
  279. data/spec/dummy/public/assets/pwb/application-0dc6ff845cde8e032ed365593c17fe09c18a6966d44f551946bf1673d8d1ac51.css.gz +0 -0
  280. data/spec/dummy/public/assets/pwb/application-b4df8e7ae7700a0d09d88175af77e7f457ca2fbe15ae08450551ebf3bfb0c4d1.js +0 -15656
  281. data/spec/dummy/public/assets/pwb/application-b4df8e7ae7700a0d09d88175af77e7f457ca2fbe15ae08450551ebf3bfb0c4d1.js.gz +0 -0
  282. data/spec/dummy/public/assets/pwb/themes/berlin-279c2e3a7fa11a902fdee83a6819dcc315ff8eb240cfad21b1322cedadb07ea7.js +0 -18690
  283. data/spec/dummy/public/assets/pwb/themes/berlin-279c2e3a7fa11a902fdee83a6819dcc315ff8eb240cfad21b1322cedadb07ea7.js.gz +0 -0
  284. data/spec/dummy/public/assets/pwb/themes/berlin-8038d5cfd670e73fbffb581f6bb8d8c00ac448957945622c5c34438c467d218b.css +0 -8582
  285. data/spec/dummy/public/assets/pwb/themes/berlin-8038d5cfd670e73fbffb581f6bb8d8c00ac448957945622c5c34438c467d218b.css.gz +0 -0
  286. data/spec/dummy/public/assets/pwb/themes/chic-facdff61de4827adfd797b6a36ffd6c8b432072df7190ed722d039f971caa539.css +0 -3500
  287. data/spec/dummy/public/assets/pwb/themes/chic-facdff61de4827adfd797b6a36ffd6c8b432072df7190ed722d039f971caa539.css.gz +0 -0
  288. data/spec/dummy/public/assets/pwb/themes/default-d697fb0c278f500986e614ddd7eb41fd7db502a54f3370b3e8166cc1714509d0.css +0 -8423
  289. data/spec/dummy/public/assets/pwb/themes/default-d697fb0c278f500986e614ddd7eb41fd7db502a54f3370b3e8166cc1714509d0.css.gz +0 -0
  290. data/spec/dummy/public/assets/pwb_admin_panel/application-2d624898965d7a347eb7f365feab34257032c25051633370811ed7dfd24d7c8c.js +0 -61
  291. data/spec/dummy/public/assets/pwb_admin_panel/application-2d624898965d7a347eb7f365feab34257032c25051633370811ed7dfd24d7c8c.js.gz +0 -0
  292. data/spec/dummy/public/assets/pwb_admin_panel/application-f0e38d58d1ce32501b22edd16697f45b561fa44b5be9265398a05e8dee169885.css +0 -17970
  293. data/spec/dummy/public/assets/pwb_admin_panel/application-f0e38d58d1ce32501b22edd16697f45b561fa44b5be9265398a05e8dee169885.css.gz +0 -0
  294. data/spec/dummy/public/img/about-us.png +0 -0
  295. data/spec/dummy/public/img/agents/agent-1.png +0 -0
  296. data/spec/dummy/public/img/agents/agent-3.png +0 -0
  297. data/spec/dummy/public/img/agents/agent-4.png +0 -0
  298. data/spec/dummy/public/img/agents/agent-5.png +0 -0
  299. data/spec/dummy/public/img/banner-ads.jpg +0 -0
  300. data/spec/dummy/public/img/blog-img-1.jpg +0 -0
  301. data/spec/dummy/public/img/blog-img-2.jpg +0 -0
  302. data/spec/dummy/public/img/blog-img-3.jpg +0 -0
  303. data/spec/dummy/public/img/client-brand-1.png +0 -0
  304. data/spec/dummy/public/img/client-brand-2.png +0 -0
  305. data/spec/dummy/public/img/client-brand-3.png +0 -0
  306. data/spec/dummy/public/img/client-brand-4.png +0 -0
  307. data/spec/dummy/public/img/client-brand-5.png +0 -0
  308. data/spec/dummy/public/img/favicon.ico +0 -0
  309. data/spec/dummy/public/img/gallery/big/1.jpg +0 -0
  310. data/spec/dummy/public/img/gallery/big/10.jpg +0 -0
  311. data/spec/dummy/public/img/gallery/big/11 - Copy.jpg +0 -0
  312. data/spec/dummy/public/img/gallery/big/12.jpg +0 -0
  313. data/spec/dummy/public/img/gallery/big/2.jpg +0 -0
  314. data/spec/dummy/public/img/gallery/big/3.jpg +0 -0
  315. data/spec/dummy/public/img/gallery/big/4.jpg +0 -0
  316. data/spec/dummy/public/img/gallery/big/5.jpg +0 -0
  317. data/spec/dummy/public/img/gallery/big/6.jpg +0 -0
  318. data/spec/dummy/public/img/gallery/big/7.jpg +0 -0
  319. data/spec/dummy/public/img/gallery/big/8.jpg +0 -0
  320. data/spec/dummy/public/img/gallery/big/9.jpg +0 -0
  321. data/spec/dummy/public/img/gallery/fancybox_buttons.png +0 -0
  322. data/spec/dummy/public/img/gallery/fancybox_loading.gif +0 -0
  323. data/spec/dummy/public/img/gallery/fancybox_loading@2x.gif +0 -0
  324. data/spec/dummy/public/img/gallery/fancybox_overlay.png +0 -0
  325. data/spec/dummy/public/img/gallery/fancybox_sprite.png +0 -0
  326. data/spec/dummy/public/img/gallery/fancybox_sprite@2x.png +0 -0
  327. data/spec/dummy/public/img/gallery/small/1.jpg +0 -0
  328. data/spec/dummy/public/img/gallery/small/10.jpg +0 -0
  329. data/spec/dummy/public/img/gallery/small/11.jpg +0 -0
  330. data/spec/dummy/public/img/gallery/small/12.jpg +0 -0
  331. data/spec/dummy/public/img/gallery/small/2.jpg +0 -0
  332. data/spec/dummy/public/img/gallery/small/3.jpg +0 -0
  333. data/spec/dummy/public/img/gallery/small/4.jpg +0 -0
  334. data/spec/dummy/public/img/gallery/small/5.jpg +0 -0
  335. data/spec/dummy/public/img/gallery/small/6.jpg +0 -0
  336. data/spec/dummy/public/img/gallery/small/7.jpg +0 -0
  337. data/spec/dummy/public/img/gallery/small/8.jpg +0 -0
  338. data/spec/dummy/public/img/gallery/small/9.jpg +0 -0
  339. data/spec/dummy/public/img/item/1.jpg +0 -0
  340. data/spec/dummy/public/img/item/2.jpg +0 -0
  341. data/spec/dummy/public/img/item/3.jpg +0 -0
  342. data/spec/dummy/public/img/item/4.jpg +0 -0
  343. data/spec/dummy/public/img/item/5.jpg +0 -0
  344. data/spec/dummy/public/img/item/6.jpg +0 -0
  345. data/spec/dummy/public/img/logo.png +0 -0
  346. data/spec/dummy/public/img/promo-banner.jpg +0 -0
  347. data/spec/dummy/public/img/property-header-bg.jpg +0 -0
  348. data/spec/dummy/public/img/property-view-2.jpg +0 -0
  349. data/spec/dummy/public/img/signin-bg.jpg +0 -0
  350. data/spec/dummy/public/img/slider/1.jpg +0 -0
  351. data/spec/dummy/public/img/slider/2.jpg +0 -0
  352. data/spec/dummy/public/img/slider/3.jpg +0 -0
  353. data/spec/dummy/public/img/slider/4.jpg +0 -0
  354. data/spec/dummy/public/img/slider/5.jpg +0 -0
  355. data/spec/dummy/public/img/slider/6.jpg +0 -0
  356. data/spec/dummy/public/img/testimonial-1.png +0 -0
  357. data/spec/dummy/public/img/testimonial-2.png +0 -0
  358. data/spec/dummy/public/img/testimonial-3.png +0 -0
  359. data/spec/dummy/public/img/testimonial-bg.jpg +0 -0
  360. data/spec/dummy/public/js/bootstrap.js +0 -2363
  361. data/spec/dummy/public/js/custom.js +0 -355
  362. data/spec/dummy/public/js/jquery.fancybox.pack.js +0 -46
  363. data/spec/dummy/public/js/jquery.min.js +0 -5
  364. data/spec/dummy/public/js/jquery.mixitup.js +0 -2098
  365. data/spec/dummy/public/js/nouislider.js +0 -1899
  366. data/spec/dummy/public/js/slick.js +0 -2670
  367. data/spec/dummy/public/system/comfy/cms/files/files/000/000/003/cms_thumb/rerenting-landing_framed.png +0 -0
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,2363 +0,0 @@
1
- /*!
2
- * Bootstrap v3.3.6 (http://getbootstrap.com)
3
- * Copyright 2011-2015 Twitter, Inc.
4
- * Licensed under the MIT license
5
- */
6
-
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] > 2)) {
15
- throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
16
- }
17
- }(jQuery);
18
-
19
- /* ========================================================================
20
- * Bootstrap: transition.js v3.3.6
21
- * http://getbootstrap.com/javascript/#transitions
22
- * ========================================================================
23
- * Copyright 2011-2015 Twitter, Inc.
24
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
25
- * ======================================================================== */
26
-
27
-
28
- +function ($) {
29
- 'use strict';
30
-
31
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
32
- // ============================================================
33
-
34
- function transitionEnd() {
35
- var el = document.createElement('bootstrap')
36
-
37
- var transEndEventNames = {
38
- WebkitTransition : 'webkitTransitionEnd',
39
- MozTransition : 'transitionend',
40
- OTransition : 'oTransitionEnd otransitionend',
41
- transition : 'transitionend'
42
- }
43
-
44
- for (var name in transEndEventNames) {
45
- if (el.style[name] !== undefined) {
46
- return { end: transEndEventNames[name] }
47
- }
48
- }
49
-
50
- return false // explicit for ie8 ( ._.)
51
- }
52
-
53
- // http://blog.alexmaccaw.com/css-transitions
54
- $.fn.emulateTransitionEnd = function (duration) {
55
- var called = false
56
- var $el = this
57
- $(this).one('bsTransitionEnd', function () { called = true })
58
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
59
- setTimeout(callback, duration)
60
- return this
61
- }
62
-
63
- $(function () {
64
- $.support.transition = transitionEnd()
65
-
66
- if (!$.support.transition) return
67
-
68
- $.event.special.bsTransitionEnd = {
69
- bindType: $.support.transition.end,
70
- delegateType: $.support.transition.end,
71
- handle: function (e) {
72
- if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
73
- }
74
- }
75
- })
76
-
77
- }(jQuery);
78
-
79
- /* ========================================================================
80
- * Bootstrap: alert.js v3.3.6
81
- * http://getbootstrap.com/javascript/#alerts
82
- * ========================================================================
83
- * Copyright 2011-2015 Twitter, Inc.
84
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
85
- * ======================================================================== */
86
-
87
-
88
- +function ($) {
89
- 'use strict';
90
-
91
- // ALERT CLASS DEFINITION
92
- // ======================
93
-
94
- var dismiss = '[data-dismiss="alert"]'
95
- var Alert = function (el) {
96
- $(el).on('click', dismiss, this.close)
97
- }
98
-
99
- Alert.VERSION = '3.3.6'
100
-
101
- Alert.TRANSITION_DURATION = 150
102
-
103
- Alert.prototype.close = function (e) {
104
- var $this = $(this)
105
- var selector = $this.attr('data-target')
106
-
107
- if (!selector) {
108
- selector = $this.attr('href')
109
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
110
- }
111
-
112
- var $parent = $(selector)
113
-
114
- if (e) e.preventDefault()
115
-
116
- if (!$parent.length) {
117
- $parent = $this.closest('.alert')
118
- }
119
-
120
- $parent.trigger(e = $.Event('close.bs.alert'))
121
-
122
- if (e.isDefaultPrevented()) return
123
-
124
- $parent.removeClass('in')
125
-
126
- function removeElement() {
127
- // detach from parent, fire event then clean up data
128
- $parent.detach().trigger('closed.bs.alert').remove()
129
- }
130
-
131
- $.support.transition && $parent.hasClass('fade') ?
132
- $parent
133
- .one('bsTransitionEnd', removeElement)
134
- .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
135
- removeElement()
136
- }
137
-
138
-
139
- // ALERT PLUGIN DEFINITION
140
- // =======================
141
-
142
- function Plugin(option) {
143
- return this.each(function () {
144
- var $this = $(this)
145
- var data = $this.data('bs.alert')
146
-
147
- if (!data) $this.data('bs.alert', (data = new Alert(this)))
148
- if (typeof option == 'string') data[option].call($this)
149
- })
150
- }
151
-
152
- var old = $.fn.alert
153
-
154
- $.fn.alert = Plugin
155
- $.fn.alert.Constructor = Alert
156
-
157
-
158
- // ALERT NO CONFLICT
159
- // =================
160
-
161
- $.fn.alert.noConflict = function () {
162
- $.fn.alert = old
163
- return this
164
- }
165
-
166
-
167
- // ALERT DATA-API
168
- // ==============
169
-
170
- $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
171
-
172
- }(jQuery);
173
-
174
- /* ========================================================================
175
- * Bootstrap: button.js v3.3.6
176
- * http://getbootstrap.com/javascript/#buttons
177
- * ========================================================================
178
- * Copyright 2011-2015 Twitter, Inc.
179
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
180
- * ======================================================================== */
181
-
182
-
183
- +function ($) {
184
- 'use strict';
185
-
186
- // BUTTON PUBLIC CLASS DEFINITION
187
- // ==============================
188
-
189
- var Button = function (element, options) {
190
- this.$element = $(element)
191
- this.options = $.extend({}, Button.DEFAULTS, options)
192
- this.isLoading = false
193
- }
194
-
195
- Button.VERSION = '3.3.6'
196
-
197
- Button.DEFAULTS = {
198
- loadingText: 'loading...'
199
- }
200
-
201
- Button.prototype.setState = function (state) {
202
- var d = 'disabled'
203
- var $el = this.$element
204
- var val = $el.is('input') ? 'val' : 'html'
205
- var data = $el.data()
206
-
207
- state += 'Text'
208
-
209
- if (data.resetText == null) $el.data('resetText', $el[val]())
210
-
211
- // push to event loop to allow forms to submit
212
- setTimeout($.proxy(function () {
213
- $el[val](data[state] == null ? this.options[state] : data[state])
214
-
215
- if (state == 'loadingText') {
216
- this.isLoading = true
217
- $el.addClass(d).attr(d, d)
218
- } else if (this.isLoading) {
219
- this.isLoading = false
220
- $el.removeClass(d).removeAttr(d)
221
- }
222
- }, this), 0)
223
- }
224
-
225
- Button.prototype.toggle = function () {
226
- var changed = true
227
- var $parent = this.$element.closest('[data-toggle="buttons"]')
228
-
229
- if ($parent.length) {
230
- var $input = this.$element.find('input')
231
- if ($input.prop('type') == 'radio') {
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')
238
- }
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')
244
- }
245
- }
246
-
247
-
248
- // BUTTON PLUGIN DEFINITION
249
- // ========================
250
-
251
- function Plugin(option) {
252
- return this.each(function () {
253
- var $this = $(this)
254
- var data = $this.data('bs.button')
255
- var options = typeof option == 'object' && option
256
-
257
- if (!data) $this.data('bs.button', (data = new Button(this, options)))
258
-
259
- if (option == 'toggle') data.toggle()
260
- else if (option) data.setState(option)
261
- })
262
- }
263
-
264
- var old = $.fn.button
265
-
266
- $.fn.button = Plugin
267
- $.fn.button.Constructor = Button
268
-
269
-
270
- // BUTTON NO CONFLICT
271
- // ==================
272
-
273
- $.fn.button.noConflict = function () {
274
- $.fn.button = old
275
- return this
276
- }
277
-
278
-
279
- // BUTTON DATA-API
280
- // ===============
281
-
282
- $(document)
283
- .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
284
- var $btn = $(e.target)
285
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
286
- Plugin.call($btn, 'toggle')
287
- if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
288
- })
289
- .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
290
- $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
291
- })
292
-
293
- }(jQuery);
294
-
295
- /* ========================================================================
296
- * Bootstrap: carousel.js v3.3.6
297
- * http://getbootstrap.com/javascript/#carousel
298
- * ========================================================================
299
- * Copyright 2011-2015 Twitter, Inc.
300
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
301
- * ======================================================================== */
302
-
303
-
304
- +function ($) {
305
- 'use strict';
306
-
307
- // CAROUSEL CLASS DEFINITION
308
- // =========================
309
-
310
- var Carousel = function (element, options) {
311
- this.$element = $(element)
312
- this.$indicators = this.$element.find('.carousel-indicators')
313
- this.options = options
314
- this.paused = null
315
- this.sliding = null
316
- this.interval = null
317
- this.$active = null
318
- this.$items = null
319
-
320
- this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
321
-
322
- this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
323
- .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
324
- .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
325
- }
326
-
327
- Carousel.VERSION = '3.3.6'
328
-
329
- Carousel.TRANSITION_DURATION = 600
330
-
331
- Carousel.DEFAULTS = {
332
- interval: 5000,
333
- pause: 'hover',
334
- wrap: true,
335
- keyboard: true
336
- }
337
-
338
- Carousel.prototype.keydown = function (e) {
339
- if (/input|textarea/i.test(e.target.tagName)) return
340
- switch (e.which) {
341
- case 37: this.prev(); break
342
- case 39: this.next(); break
343
- default: return
344
- }
345
-
346
- e.preventDefault()
347
- }
348
-
349
- Carousel.prototype.cycle = function (e) {
350
- e || (this.paused = false)
351
-
352
- this.interval && clearInterval(this.interval)
353
-
354
- this.options.interval
355
- && !this.paused
356
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
357
-
358
- return this
359
- }
360
-
361
- Carousel.prototype.getItemIndex = function (item) {
362
- this.$items = item.parent().children('.item')
363
- return this.$items.index(item || this.$active)
364
- }
365
-
366
- Carousel.prototype.getItemForDirection = function (direction, active) {
367
- var activeIndex = this.getItemIndex(active)
368
- var willWrap = (direction == 'prev' && activeIndex === 0)
369
- || (direction == 'next' && activeIndex == (this.$items.length - 1))
370
- if (willWrap && !this.options.wrap) return active
371
- var delta = direction == 'prev' ? -1 : 1
372
- var itemIndex = (activeIndex + delta) % this.$items.length
373
- return this.$items.eq(itemIndex)
374
- }
375
-
376
- Carousel.prototype.to = function (pos) {
377
- var that = this
378
- var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
379
-
380
- if (pos > (this.$items.length - 1) || pos < 0) return
381
-
382
- if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
383
- if (activeIndex == pos) return this.pause().cycle()
384
-
385
- return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
386
- }
387
-
388
- Carousel.prototype.pause = function (e) {
389
- e || (this.paused = true)
390
-
391
- if (this.$element.find('.next, .prev').length && $.support.transition) {
392
- this.$element.trigger($.support.transition.end)
393
- this.cycle(true)
394
- }
395
-
396
- this.interval = clearInterval(this.interval)
397
-
398
- return this
399
- }
400
-
401
- Carousel.prototype.next = function () {
402
- if (this.sliding) return
403
- return this.slide('next')
404
- }
405
-
406
- Carousel.prototype.prev = function () {
407
- if (this.sliding) return
408
- return this.slide('prev')
409
- }
410
-
411
- Carousel.prototype.slide = function (type, next) {
412
- var $active = this.$element.find('.item.active')
413
- var $next = next || this.getItemForDirection(type, $active)
414
- var isCycling = this.interval
415
- var direction = type == 'next' ? 'left' : 'right'
416
- var that = this
417
-
418
- if ($next.hasClass('active')) return (this.sliding = false)
419
-
420
- var relatedTarget = $next[0]
421
- var slideEvent = $.Event('slide.bs.carousel', {
422
- relatedTarget: relatedTarget,
423
- direction: direction
424
- })
425
- this.$element.trigger(slideEvent)
426
- if (slideEvent.isDefaultPrevented()) return
427
-
428
- this.sliding = true
429
-
430
- isCycling && this.pause()
431
-
432
- if (this.$indicators.length) {
433
- this.$indicators.find('.active').removeClass('active')
434
- var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
435
- $nextIndicator && $nextIndicator.addClass('active')
436
- }
437
-
438
- var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
439
- if ($.support.transition && this.$element.hasClass('slide')) {
440
- $next.addClass(type)
441
- $next[0].offsetWidth // force reflow
442
- $active.addClass(direction)
443
- $next.addClass(direction)
444
- $active
445
- .one('bsTransitionEnd', function () {
446
- $next.removeClass([type, direction].join(' ')).addClass('active')
447
- $active.removeClass(['active', direction].join(' '))
448
- that.sliding = false
449
- setTimeout(function () {
450
- that.$element.trigger(slidEvent)
451
- }, 0)
452
- })
453
- .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
454
- } else {
455
- $active.removeClass('active')
456
- $next.addClass('active')
457
- this.sliding = false
458
- this.$element.trigger(slidEvent)
459
- }
460
-
461
- isCycling && this.cycle()
462
-
463
- return this
464
- }
465
-
466
-
467
- // CAROUSEL PLUGIN DEFINITION
468
- // ==========================
469
-
470
- function Plugin(option) {
471
- return this.each(function () {
472
- var $this = $(this)
473
- var data = $this.data('bs.carousel')
474
- var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
475
- var action = typeof option == 'string' ? option : options.slide
476
-
477
- if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
478
- if (typeof option == 'number') data.to(option)
479
- else if (action) data[action]()
480
- else if (options.interval) data.pause().cycle()
481
- })
482
- }
483
-
484
- var old = $.fn.carousel
485
-
486
- $.fn.carousel = Plugin
487
- $.fn.carousel.Constructor = Carousel
488
-
489
-
490
- // CAROUSEL NO CONFLICT
491
- // ====================
492
-
493
- $.fn.carousel.noConflict = function () {
494
- $.fn.carousel = old
495
- return this
496
- }
497
-
498
-
499
- // CAROUSEL DATA-API
500
- // =================
501
-
502
- var clickHandler = function (e) {
503
- var href
504
- var $this = $(this)
505
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
506
- if (!$target.hasClass('carousel')) return
507
- var options = $.extend({}, $target.data(), $this.data())
508
- var slideIndex = $this.attr('data-slide-to')
509
- if (slideIndex) options.interval = false
510
-
511
- Plugin.call($target, options)
512
-
513
- if (slideIndex) {
514
- $target.data('bs.carousel').to(slideIndex)
515
- }
516
-
517
- e.preventDefault()
518
- }
519
-
520
- $(document)
521
- .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
522
- .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
523
-
524
- $(window).on('load', function () {
525
- $('[data-ride="carousel"]').each(function () {
526
- var $carousel = $(this)
527
- Plugin.call($carousel, $carousel.data())
528
- })
529
- })
530
-
531
- }(jQuery);
532
-
533
- /* ========================================================================
534
- * Bootstrap: collapse.js v3.3.6
535
- * http://getbootstrap.com/javascript/#collapse
536
- * ========================================================================
537
- * Copyright 2011-2015 Twitter, Inc.
538
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
539
- * ======================================================================== */
540
-
541
-
542
- +function ($) {
543
- 'use strict';
544
-
545
- // COLLAPSE PUBLIC CLASS DEFINITION
546
- // ================================
547
-
548
- var Collapse = function (element, options) {
549
- this.$element = $(element)
550
- this.options = $.extend({}, Collapse.DEFAULTS, options)
551
- this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
552
- '[data-toggle="collapse"][data-target="#' + element.id + '"]')
553
- this.transitioning = null
554
-
555
- if (this.options.parent) {
556
- this.$parent = this.getParent()
557
- } else {
558
- this.addAriaAndCollapsedClass(this.$element, this.$trigger)
559
- }
560
-
561
- if (this.options.toggle) this.toggle()
562
- }
563
-
564
- Collapse.VERSION = '3.3.6'
565
-
566
- Collapse.TRANSITION_DURATION = 350
567
-
568
- Collapse.DEFAULTS = {
569
- toggle: true
570
- }
571
-
572
- Collapse.prototype.dimension = function () {
573
- var hasWidth = this.$element.hasClass('width')
574
- return hasWidth ? 'width' : 'height'
575
- }
576
-
577
- Collapse.prototype.show = function () {
578
- if (this.transitioning || this.$element.hasClass('in')) return
579
-
580
- var activesData
581
- var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
582
-
583
- if (actives && actives.length) {
584
- activesData = actives.data('bs.collapse')
585
- if (activesData && activesData.transitioning) return
586
- }
587
-
588
- var startEvent = $.Event('show.bs.collapse')
589
- this.$element.trigger(startEvent)
590
- if (startEvent.isDefaultPrevented()) return
591
-
592
- if (actives && actives.length) {
593
- Plugin.call(actives, 'hide')
594
- activesData || actives.data('bs.collapse', null)
595
- }
596
-
597
- var dimension = this.dimension()
598
-
599
- this.$element
600
- .removeClass('collapse')
601
- .addClass('collapsing')[dimension](0)
602
- .attr('aria-expanded', true)
603
-
604
- this.$trigger
605
- .removeClass('collapsed')
606
- .attr('aria-expanded', true)
607
-
608
- this.transitioning = 1
609
-
610
- var complete = function () {
611
- this.$element
612
- .removeClass('collapsing')
613
- .addClass('collapse in')[dimension]('')
614
- this.transitioning = 0
615
- this.$element
616
- .trigger('shown.bs.collapse')
617
- }
618
-
619
- if (!$.support.transition) return complete.call(this)
620
-
621
- var scrollSize = $.camelCase(['scroll', dimension].join('-'))
622
-
623
- this.$element
624
- .one('bsTransitionEnd', $.proxy(complete, this))
625
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
626
- }
627
-
628
- Collapse.prototype.hide = function () {
629
- if (this.transitioning || !this.$element.hasClass('in')) return
630
-
631
- var startEvent = $.Event('hide.bs.collapse')
632
- this.$element.trigger(startEvent)
633
- if (startEvent.isDefaultPrevented()) return
634
-
635
- var dimension = this.dimension()
636
-
637
- this.$element[dimension](this.$element[dimension]())[0].offsetHeight
638
-
639
- this.$element
640
- .addClass('collapsing')
641
- .removeClass('collapse in')
642
- .attr('aria-expanded', false)
643
-
644
- this.$trigger
645
- .addClass('collapsed')
646
- .attr('aria-expanded', false)
647
-
648
- this.transitioning = 1
649
-
650
- var complete = function () {
651
- this.transitioning = 0
652
- this.$element
653
- .removeClass('collapsing')
654
- .addClass('collapse')
655
- .trigger('hidden.bs.collapse')
656
- }
657
-
658
- if (!$.support.transition) return complete.call(this)
659
-
660
- this.$element
661
- [dimension](0)
662
- .one('bsTransitionEnd', $.proxy(complete, this))
663
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
664
- }
665
-
666
- Collapse.prototype.toggle = function () {
667
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
668
- }
669
-
670
- Collapse.prototype.getParent = function () {
671
- return $(this.options.parent)
672
- .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
673
- .each($.proxy(function (i, element) {
674
- var $element = $(element)
675
- this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
676
- }, this))
677
- .end()
678
- }
679
-
680
- Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
681
- var isOpen = $element.hasClass('in')
682
-
683
- $element.attr('aria-expanded', isOpen)
684
- $trigger
685
- .toggleClass('collapsed', !isOpen)
686
- .attr('aria-expanded', isOpen)
687
- }
688
-
689
- function getTargetFromTrigger($trigger) {
690
- var href
691
- var target = $trigger.attr('data-target')
692
- || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
693
-
694
- return $(target)
695
- }
696
-
697
-
698
- // COLLAPSE PLUGIN DEFINITION
699
- // ==========================
700
-
701
- function Plugin(option) {
702
- return this.each(function () {
703
- var $this = $(this)
704
- var data = $this.data('bs.collapse')
705
- var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
706
-
707
- if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
708
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
709
- if (typeof option == 'string') data[option]()
710
- })
711
- }
712
-
713
- var old = $.fn.collapse
714
-
715
- $.fn.collapse = Plugin
716
- $.fn.collapse.Constructor = Collapse
717
-
718
-
719
- // COLLAPSE NO CONFLICT
720
- // ====================
721
-
722
- $.fn.collapse.noConflict = function () {
723
- $.fn.collapse = old
724
- return this
725
- }
726
-
727
-
728
- // COLLAPSE DATA-API
729
- // =================
730
-
731
- $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
732
- var $this = $(this)
733
-
734
- if (!$this.attr('data-target')) e.preventDefault()
735
-
736
- var $target = getTargetFromTrigger($this)
737
- var data = $target.data('bs.collapse')
738
- var option = data ? 'toggle' : $this.data()
739
-
740
- Plugin.call($target, option)
741
- })
742
-
743
- }(jQuery);
744
-
745
- /* ========================================================================
746
- * Bootstrap: dropdown.js v3.3.6
747
- * http://getbootstrap.com/javascript/#dropdowns
748
- * ========================================================================
749
- * Copyright 2011-2015 Twitter, Inc.
750
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
751
- * ======================================================================== */
752
-
753
-
754
- +function ($) {
755
- 'use strict';
756
-
757
- // DROPDOWN CLASS DEFINITION
758
- // =========================
759
-
760
- var backdrop = '.dropdown-backdrop'
761
- var toggle = '[data-toggle="dropdown"]'
762
- var Dropdown = function (element) {
763
- $(element).on('click.bs.dropdown', this.toggle)
764
- }
765
-
766
- Dropdown.VERSION = '3.3.6'
767
-
768
- function getParent($this) {
769
- var selector = $this.attr('data-target')
770
-
771
- if (!selector) {
772
- selector = $this.attr('href')
773
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
774
- }
775
-
776
- var $parent = selector && $(selector)
777
-
778
- return $parent && $parent.length ? $parent : $this.parent()
779
- }
780
-
781
- function clearMenus(e) {
782
- if (e && e.which === 3) return
783
- $(backdrop).remove()
784
- $(toggle).each(function () {
785
- var $this = $(this)
786
- var $parent = getParent($this)
787
- var relatedTarget = { relatedTarget: this }
788
-
789
- if (!$parent.hasClass('open')) return
790
-
791
- if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
792
-
793
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
794
-
795
- if (e.isDefaultPrevented()) return
796
-
797
- $this.attr('aria-expanded', 'false')
798
- $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
799
- })
800
- }
801
-
802
- Dropdown.prototype.toggle = function (e) {
803
- var $this = $(this)
804
-
805
- if ($this.is('.disabled, :disabled')) return
806
-
807
- var $parent = getParent($this)
808
- var isActive = $parent.hasClass('open')
809
-
810
- clearMenus()
811
-
812
- if (!isActive) {
813
- if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
814
- // if mobile we use a backdrop because click events don't delegate
815
- $(document.createElement('div'))
816
- .addClass('dropdown-backdrop')
817
- .insertAfter($(this))
818
- .on('click', clearMenus)
819
- }
820
-
821
- var relatedTarget = { relatedTarget: this }
822
- $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
823
-
824
- if (e.isDefaultPrevented()) return
825
-
826
- $this
827
- .trigger('focus')
828
- .attr('aria-expanded', 'true')
829
-
830
- $parent
831
- .toggleClass('open')
832
- .trigger($.Event('shown.bs.dropdown', relatedTarget))
833
- }
834
-
835
- return false
836
- }
837
-
838
- Dropdown.prototype.keydown = function (e) {
839
- if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
840
-
841
- var $this = $(this)
842
-
843
- e.preventDefault()
844
- e.stopPropagation()
845
-
846
- if ($this.is('.disabled, :disabled')) return
847
-
848
- var $parent = getParent($this)
849
- var isActive = $parent.hasClass('open')
850
-
851
- if (!isActive && e.which != 27 || isActive && e.which == 27) {
852
- if (e.which == 27) $parent.find(toggle).trigger('focus')
853
- return $this.trigger('click')
854
- }
855
-
856
- var desc = ' li:not(.disabled):visible a'
857
- var $items = $parent.find('.dropdown-menu' + desc)
858
-
859
- if (!$items.length) return
860
-
861
- var index = $items.index(e.target)
862
-
863
- if (e.which == 38 && index > 0) index-- // up
864
- if (e.which == 40 && index < $items.length - 1) index++ // down
865
- if (!~index) index = 0
866
-
867
- $items.eq(index).trigger('focus')
868
- }
869
-
870
-
871
- // DROPDOWN PLUGIN DEFINITION
872
- // ==========================
873
-
874
- function Plugin(option) {
875
- return this.each(function () {
876
- var $this = $(this)
877
- var data = $this.data('bs.dropdown')
878
-
879
- if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
880
- if (typeof option == 'string') data[option].call($this)
881
- })
882
- }
883
-
884
- var old = $.fn.dropdown
885
-
886
- $.fn.dropdown = Plugin
887
- $.fn.dropdown.Constructor = Dropdown
888
-
889
-
890
- // DROPDOWN NO CONFLICT
891
- // ====================
892
-
893
- $.fn.dropdown.noConflict = function () {
894
- $.fn.dropdown = old
895
- return this
896
- }
897
-
898
-
899
- // APPLY TO STANDARD DROPDOWN ELEMENTS
900
- // ===================================
901
-
902
- $(document)
903
- .on('click.bs.dropdown.data-api', clearMenus)
904
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
905
- .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
906
- .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
907
- .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
908
-
909
- }(jQuery);
910
-
911
- /* ========================================================================
912
- * Bootstrap: modal.js v3.3.6
913
- * http://getbootstrap.com/javascript/#modals
914
- * ========================================================================
915
- * Copyright 2011-2015 Twitter, Inc.
916
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
917
- * ======================================================================== */
918
-
919
-
920
- +function ($) {
921
- 'use strict';
922
-
923
- // MODAL CLASS DEFINITION
924
- // ======================
925
-
926
- var Modal = function (element, options) {
927
- this.options = options
928
- this.$body = $(document.body)
929
- this.$element = $(element)
930
- this.$dialog = this.$element.find('.modal-dialog')
931
- this.$backdrop = null
932
- this.isShown = null
933
- this.originalBodyPad = null
934
- this.scrollbarWidth = 0
935
- this.ignoreBackdropClick = false
936
-
937
- if (this.options.remote) {
938
- this.$element
939
- .find('.modal-content')
940
- .load(this.options.remote, $.proxy(function () {
941
- this.$element.trigger('loaded.bs.modal')
942
- }, this))
943
- }
944
- }
945
-
946
- Modal.VERSION = '3.3.6'
947
-
948
- Modal.TRANSITION_DURATION = 300
949
- Modal.BACKDROP_TRANSITION_DURATION = 150
950
-
951
- Modal.DEFAULTS = {
952
- backdrop: true,
953
- keyboard: true,
954
- show: true
955
- }
956
-
957
- Modal.prototype.toggle = function (_relatedTarget) {
958
- return this.isShown ? this.hide() : this.show(_relatedTarget)
959
- }
960
-
961
- Modal.prototype.show = function (_relatedTarget) {
962
- var that = this
963
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
964
-
965
- this.$element.trigger(e)
966
-
967
- if (this.isShown || e.isDefaultPrevented()) return
968
-
969
- this.isShown = true
970
-
971
- this.checkScrollbar()
972
- this.setScrollbar()
973
- this.$body.addClass('modal-open')
974
-
975
- this.escape()
976
- this.resize()
977
-
978
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
979
-
980
- this.$dialog.on('mousedown.dismiss.bs.modal', function () {
981
- that.$element.one('mouseup.dismiss.bs.modal', function (e) {
982
- if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
983
- })
984
- })
985
-
986
- this.backdrop(function () {
987
- var transition = $.support.transition && that.$element.hasClass('fade')
988
-
989
- if (!that.$element.parent().length) {
990
- that.$element.appendTo(that.$body) // don't move modals dom position
991
- }
992
-
993
- that.$element
994
- .show()
995
- .scrollTop(0)
996
-
997
- that.adjustDialog()
998
-
999
- if (transition) {
1000
- that.$element[0].offsetWidth // force reflow
1001
- }
1002
-
1003
- that.$element.addClass('in')
1004
-
1005
- that.enforceFocus()
1006
-
1007
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
1008
-
1009
- transition ?
1010
- that.$dialog // wait for modal to slide in
1011
- .one('bsTransitionEnd', function () {
1012
- that.$element.trigger('focus').trigger(e)
1013
- })
1014
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1015
- that.$element.trigger('focus').trigger(e)
1016
- })
1017
- }
1018
-
1019
- Modal.prototype.hide = function (e) {
1020
- if (e) e.preventDefault()
1021
-
1022
- e = $.Event('hide.bs.modal')
1023
-
1024
- this.$element.trigger(e)
1025
-
1026
- if (!this.isShown || e.isDefaultPrevented()) return
1027
-
1028
- this.isShown = false
1029
-
1030
- this.escape()
1031
- this.resize()
1032
-
1033
- $(document).off('focusin.bs.modal')
1034
-
1035
- this.$element
1036
- .removeClass('in')
1037
- .off('click.dismiss.bs.modal')
1038
- .off('mouseup.dismiss.bs.modal')
1039
-
1040
- this.$dialog.off('mousedown.dismiss.bs.modal')
1041
-
1042
- $.support.transition && this.$element.hasClass('fade') ?
1043
- this.$element
1044
- .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1045
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1046
- this.hideModal()
1047
- }
1048
-
1049
- Modal.prototype.enforceFocus = function () {
1050
- $(document)
1051
- .off('focusin.bs.modal') // guard against infinite focus loop
1052
- .on('focusin.bs.modal', $.proxy(function (e) {
1053
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
1054
- this.$element.trigger('focus')
1055
- }
1056
- }, this))
1057
- }
1058
-
1059
- Modal.prototype.escape = function () {
1060
- if (this.isShown && this.options.keyboard) {
1061
- this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
1062
- e.which == 27 && this.hide()
1063
- }, this))
1064
- } else if (!this.isShown) {
1065
- this.$element.off('keydown.dismiss.bs.modal')
1066
- }
1067
- }
1068
-
1069
- Modal.prototype.resize = function () {
1070
- if (this.isShown) {
1071
- $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
1072
- } else {
1073
- $(window).off('resize.bs.modal')
1074
- }
1075
- }
1076
-
1077
- Modal.prototype.hideModal = function () {
1078
- var that = this
1079
- this.$element.hide()
1080
- this.backdrop(function () {
1081
- that.$body.removeClass('modal-open')
1082
- that.resetAdjustments()
1083
- that.resetScrollbar()
1084
- that.$element.trigger('hidden.bs.modal')
1085
- })
1086
- }
1087
-
1088
- Modal.prototype.removeBackdrop = function () {
1089
- this.$backdrop && this.$backdrop.remove()
1090
- this.$backdrop = null
1091
- }
1092
-
1093
- Modal.prototype.backdrop = function (callback) {
1094
- var that = this
1095
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
1096
-
1097
- if (this.isShown && this.options.backdrop) {
1098
- var doAnimate = $.support.transition && animate
1099
-
1100
- this.$backdrop = $(document.createElement('div'))
1101
- .addClass('modal-backdrop ' + animate)
1102
- .appendTo(this.$body)
1103
-
1104
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
1105
- if (this.ignoreBackdropClick) {
1106
- this.ignoreBackdropClick = false
1107
- return
1108
- }
1109
- if (e.target !== e.currentTarget) return
1110
- this.options.backdrop == 'static'
1111
- ? this.$element[0].focus()
1112
- : this.hide()
1113
- }, this))
1114
-
1115
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1116
-
1117
- this.$backdrop.addClass('in')
1118
-
1119
- if (!callback) return
1120
-
1121
- doAnimate ?
1122
- this.$backdrop
1123
- .one('bsTransitionEnd', callback)
1124
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1125
- callback()
1126
-
1127
- } else if (!this.isShown && this.$backdrop) {
1128
- this.$backdrop.removeClass('in')
1129
-
1130
- var callbackRemove = function () {
1131
- that.removeBackdrop()
1132
- callback && callback()
1133
- }
1134
- $.support.transition && this.$element.hasClass('fade') ?
1135
- this.$backdrop
1136
- .one('bsTransitionEnd', callbackRemove)
1137
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1138
- callbackRemove()
1139
-
1140
- } else if (callback) {
1141
- callback()
1142
- }
1143
- }
1144
-
1145
- // these following methods are used to handle overflowing modals
1146
-
1147
- Modal.prototype.handleUpdate = function () {
1148
- this.adjustDialog()
1149
- }
1150
-
1151
- Modal.prototype.adjustDialog = function () {
1152
- var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1153
-
1154
- this.$element.css({
1155
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1156
- paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
1157
- })
1158
- }
1159
-
1160
- Modal.prototype.resetAdjustments = function () {
1161
- this.$element.css({
1162
- paddingLeft: '',
1163
- paddingRight: ''
1164
- })
1165
- }
1166
-
1167
- Modal.prototype.checkScrollbar = function () {
1168
- var fullWindowWidth = window.innerWidth
1169
- if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
1170
- var documentElementRect = document.documentElement.getBoundingClientRect()
1171
- fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
1172
- }
1173
- this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
1174
- this.scrollbarWidth = this.measureScrollbar()
1175
- }
1176
-
1177
- Modal.prototype.setScrollbar = function () {
1178
- var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1179
- this.originalBodyPad = document.body.style.paddingRight || ''
1180
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1181
- }
1182
-
1183
- Modal.prototype.resetScrollbar = function () {
1184
- this.$body.css('padding-right', this.originalBodyPad)
1185
- }
1186
-
1187
- Modal.prototype.measureScrollbar = function () { // thx walsh
1188
- var scrollDiv = document.createElement('div')
1189
- scrollDiv.className = 'modal-scrollbar-measure'
1190
- this.$body.append(scrollDiv)
1191
- var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
1192
- this.$body[0].removeChild(scrollDiv)
1193
- return scrollbarWidth
1194
- }
1195
-
1196
-
1197
- // MODAL PLUGIN DEFINITION
1198
- // =======================
1199
-
1200
- function Plugin(option, _relatedTarget) {
1201
- return this.each(function () {
1202
- var $this = $(this)
1203
- var data = $this.data('bs.modal')
1204
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1205
-
1206
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
1207
- if (typeof option == 'string') data[option](_relatedTarget)
1208
- else if (options.show) data.show(_relatedTarget)
1209
- })
1210
- }
1211
-
1212
- var old = $.fn.modal
1213
-
1214
- $.fn.modal = Plugin
1215
- $.fn.modal.Constructor = Modal
1216
-
1217
-
1218
- // MODAL NO CONFLICT
1219
- // =================
1220
-
1221
- $.fn.modal.noConflict = function () {
1222
- $.fn.modal = old
1223
- return this
1224
- }
1225
-
1226
-
1227
- // MODAL DATA-API
1228
- // ==============
1229
-
1230
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1231
- var $this = $(this)
1232
- var href = $this.attr('href')
1233
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
1234
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1235
-
1236
- if ($this.is('a')) e.preventDefault()
1237
-
1238
- $target.one('show.bs.modal', function (showEvent) {
1239
- if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
1240
- $target.one('hidden.bs.modal', function () {
1241
- $this.is(':visible') && $this.trigger('focus')
1242
- })
1243
- })
1244
- Plugin.call($target, option, this)
1245
- })
1246
-
1247
- }(jQuery);
1248
-
1249
- /* ========================================================================
1250
- * Bootstrap: tooltip.js v3.3.6
1251
- * http://getbootstrap.com/javascript/#tooltip
1252
- * Inspired by the original jQuery.tipsy by Jason Frame
1253
- * ========================================================================
1254
- * Copyright 2011-2015 Twitter, Inc.
1255
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1256
- * ======================================================================== */
1257
-
1258
-
1259
- +function ($) {
1260
- 'use strict';
1261
-
1262
- // TOOLTIP PUBLIC CLASS DEFINITION
1263
- // ===============================
1264
-
1265
- var Tooltip = function (element, options) {
1266
- this.type = null
1267
- this.options = null
1268
- this.enabled = null
1269
- this.timeout = null
1270
- this.hoverState = null
1271
- this.$element = null
1272
- this.inState = null
1273
-
1274
- this.init('tooltip', element, options)
1275
- }
1276
-
1277
- Tooltip.VERSION = '3.3.6'
1278
-
1279
- Tooltip.TRANSITION_DURATION = 150
1280
-
1281
- Tooltip.DEFAULTS = {
1282
- animation: true,
1283
- placement: 'top',
1284
- selector: false,
1285
- template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
1286
- trigger: 'hover focus',
1287
- title: '',
1288
- delay: 0,
1289
- html: false,
1290
- container: false,
1291
- viewport: {
1292
- selector: 'body',
1293
- padding: 0
1294
- }
1295
- }
1296
-
1297
- Tooltip.prototype.init = function (type, element, options) {
1298
- this.enabled = true
1299
- this.type = type
1300
- this.$element = $(element)
1301
- this.options = this.getOptions(options)
1302
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
1303
- this.inState = { click: false, hover: false, focus: false }
1304
-
1305
- if (this.$element[0] instanceof document.constructor && !this.options.selector) {
1306
- throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
1307
- }
1308
-
1309
- var triggers = this.options.trigger.split(' ')
1310
-
1311
- for (var i = triggers.length; i--;) {
1312
- var trigger = triggers[i]
1313
-
1314
- if (trigger == 'click') {
1315
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1316
- } else if (trigger != 'manual') {
1317
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
1318
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
1319
-
1320
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1321
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1322
- }
1323
- }
1324
-
1325
- this.options.selector ?
1326
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1327
- this.fixTitle()
1328
- }
1329
-
1330
- Tooltip.prototype.getDefaults = function () {
1331
- return Tooltip.DEFAULTS
1332
- }
1333
-
1334
- Tooltip.prototype.getOptions = function (options) {
1335
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1336
-
1337
- if (options.delay && typeof options.delay == 'number') {
1338
- options.delay = {
1339
- show: options.delay,
1340
- hide: options.delay
1341
- }
1342
- }
1343
-
1344
- return options
1345
- }
1346
-
1347
- Tooltip.prototype.getDelegateOptions = function () {
1348
- var options = {}
1349
- var defaults = this.getDefaults()
1350
-
1351
- this._options && $.each(this._options, function (key, value) {
1352
- if (defaults[key] != value) options[key] = value
1353
- })
1354
-
1355
- return options
1356
- }
1357
-
1358
- Tooltip.prototype.enter = function (obj) {
1359
- var self = obj instanceof this.constructor ?
1360
- obj : $(obj.currentTarget).data('bs.' + this.type)
1361
-
1362
- if (!self) {
1363
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1364
- $(obj.currentTarget).data('bs.' + this.type, self)
1365
- }
1366
-
1367
- if (obj instanceof $.Event) {
1368
- self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
1369
- }
1370
-
1371
- if (self.tip().hasClass('in') || self.hoverState == 'in') {
1372
- self.hoverState = 'in'
1373
- return
1374
- }
1375
-
1376
- clearTimeout(self.timeout)
1377
-
1378
- self.hoverState = 'in'
1379
-
1380
- if (!self.options.delay || !self.options.delay.show) return self.show()
1381
-
1382
- self.timeout = setTimeout(function () {
1383
- if (self.hoverState == 'in') self.show()
1384
- }, self.options.delay.show)
1385
- }
1386
-
1387
- Tooltip.prototype.isInStateTrue = function () {
1388
- for (var key in this.inState) {
1389
- if (this.inState[key]) return true
1390
- }
1391
-
1392
- return false
1393
- }
1394
-
1395
- Tooltip.prototype.leave = function (obj) {
1396
- var self = obj instanceof this.constructor ?
1397
- obj : $(obj.currentTarget).data('bs.' + this.type)
1398
-
1399
- if (!self) {
1400
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1401
- $(obj.currentTarget).data('bs.' + this.type, self)
1402
- }
1403
-
1404
- if (obj instanceof $.Event) {
1405
- self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
1406
- }
1407
-
1408
- if (self.isInStateTrue()) return
1409
-
1410
- clearTimeout(self.timeout)
1411
-
1412
- self.hoverState = 'out'
1413
-
1414
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
1415
-
1416
- self.timeout = setTimeout(function () {
1417
- if (self.hoverState == 'out') self.hide()
1418
- }, self.options.delay.hide)
1419
- }
1420
-
1421
- Tooltip.prototype.show = function () {
1422
- var e = $.Event('show.bs.' + this.type)
1423
-
1424
- if (this.hasContent() && this.enabled) {
1425
- this.$element.trigger(e)
1426
-
1427
- var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
1428
- if (e.isDefaultPrevented() || !inDom) return
1429
- var that = this
1430
-
1431
- var $tip = this.tip()
1432
-
1433
- var tipId = this.getUID(this.type)
1434
-
1435
- this.setContent()
1436
- $tip.attr('id', tipId)
1437
- this.$element.attr('aria-describedby', tipId)
1438
-
1439
- if (this.options.animation) $tip.addClass('fade')
1440
-
1441
- var placement = typeof this.options.placement == 'function' ?
1442
- this.options.placement.call(this, $tip[0], this.$element[0]) :
1443
- this.options.placement
1444
-
1445
- var autoToken = /\s?auto?\s?/i
1446
- var autoPlace = autoToken.test(placement)
1447
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1448
-
1449
- $tip
1450
- .detach()
1451
- .css({ top: 0, left: 0, display: 'block' })
1452
- .addClass(placement)
1453
- .data('bs.' + this.type, this)
1454
-
1455
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1456
- this.$element.trigger('inserted.bs.' + this.type)
1457
-
1458
- var pos = this.getPosition()
1459
- var actualWidth = $tip[0].offsetWidth
1460
- var actualHeight = $tip[0].offsetHeight
1461
-
1462
- if (autoPlace) {
1463
- var orgPlacement = placement
1464
- var viewportDim = this.getPosition(this.$viewport)
1465
-
1466
- placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
1467
- placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
1468
- placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
1469
- placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
1470
- placement
1471
-
1472
- $tip
1473
- .removeClass(orgPlacement)
1474
- .addClass(placement)
1475
- }
1476
-
1477
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1478
-
1479
- this.applyPlacement(calculatedOffset, placement)
1480
-
1481
- var complete = function () {
1482
- var prevHoverState = that.hoverState
1483
- that.$element.trigger('shown.bs.' + that.type)
1484
- that.hoverState = null
1485
-
1486
- if (prevHoverState == 'out') that.leave(that)
1487
- }
1488
-
1489
- $.support.transition && this.$tip.hasClass('fade') ?
1490
- $tip
1491
- .one('bsTransitionEnd', complete)
1492
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1493
- complete()
1494
- }
1495
- }
1496
-
1497
- Tooltip.prototype.applyPlacement = function (offset, placement) {
1498
- var $tip = this.tip()
1499
- var width = $tip[0].offsetWidth
1500
- var height = $tip[0].offsetHeight
1501
-
1502
- // manually read margins because getBoundingClientRect includes difference
1503
- var marginTop = parseInt($tip.css('margin-top'), 10)
1504
- var marginLeft = parseInt($tip.css('margin-left'), 10)
1505
-
1506
- // we must check for NaN for ie 8/9
1507
- if (isNaN(marginTop)) marginTop = 0
1508
- if (isNaN(marginLeft)) marginLeft = 0
1509
-
1510
- offset.top += marginTop
1511
- offset.left += marginLeft
1512
-
1513
- // $.fn.offset doesn't round pixel values
1514
- // so we use setOffset directly with our own function B-0
1515
- $.offset.setOffset($tip[0], $.extend({
1516
- using: function (props) {
1517
- $tip.css({
1518
- top: Math.round(props.top),
1519
- left: Math.round(props.left)
1520
- })
1521
- }
1522
- }, offset), 0)
1523
-
1524
- $tip.addClass('in')
1525
-
1526
- // check to see if placing tip in new offset caused the tip to resize itself
1527
- var actualWidth = $tip[0].offsetWidth
1528
- var actualHeight = $tip[0].offsetHeight
1529
-
1530
- if (placement == 'top' && actualHeight != height) {
1531
- offset.top = offset.top + height - actualHeight
1532
- }
1533
-
1534
- var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
1535
-
1536
- if (delta.left) offset.left += delta.left
1537
- else offset.top += delta.top
1538
-
1539
- var isVertical = /top|bottom/.test(placement)
1540
- var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
1541
- var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
1542
-
1543
- $tip.offset(offset)
1544
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
1545
- }
1546
-
1547
- Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
1548
- this.arrow()
1549
- .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
1550
- .css(isVertical ? 'top' : 'left', '')
1551
- }
1552
-
1553
- Tooltip.prototype.setContent = function () {
1554
- var $tip = this.tip()
1555
- var title = this.getTitle()
1556
-
1557
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1558
- $tip.removeClass('fade in top bottom left right')
1559
- }
1560
-
1561
- Tooltip.prototype.hide = function (callback) {
1562
- var that = this
1563
- var $tip = $(this.$tip)
1564
- var e = $.Event('hide.bs.' + this.type)
1565
-
1566
- function complete() {
1567
- if (that.hoverState != 'in') $tip.detach()
1568
- that.$element
1569
- .removeAttr('aria-describedby')
1570
- .trigger('hidden.bs.' + that.type)
1571
- callback && callback()
1572
- }
1573
-
1574
- this.$element.trigger(e)
1575
-
1576
- if (e.isDefaultPrevented()) return
1577
-
1578
- $tip.removeClass('in')
1579
-
1580
- $.support.transition && $tip.hasClass('fade') ?
1581
- $tip
1582
- .one('bsTransitionEnd', complete)
1583
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1584
- complete()
1585
-
1586
- this.hoverState = null
1587
-
1588
- return this
1589
- }
1590
-
1591
- Tooltip.prototype.fixTitle = function () {
1592
- var $e = this.$element
1593
- if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
1594
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1595
- }
1596
- }
1597
-
1598
- Tooltip.prototype.hasContent = function () {
1599
- return this.getTitle()
1600
- }
1601
-
1602
- Tooltip.prototype.getPosition = function ($element) {
1603
- $element = $element || this.$element
1604
-
1605
- var el = $element[0]
1606
- var isBody = el.tagName == 'BODY'
1607
-
1608
- var elRect = el.getBoundingClientRect()
1609
- if (elRect.width == null) {
1610
- // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
1611
- elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
1612
- }
1613
- var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
1614
- var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
1615
- var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
1616
-
1617
- return $.extend({}, elRect, scroll, outerDims, elOffset)
1618
- }
1619
-
1620
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1621
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1622
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1623
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1624
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1625
-
1626
- }
1627
-
1628
- Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
1629
- var delta = { top: 0, left: 0 }
1630
- if (!this.$viewport) return delta
1631
-
1632
- var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
1633
- var viewportDimensions = this.getPosition(this.$viewport)
1634
-
1635
- if (/right|left/.test(placement)) {
1636
- var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
1637
- var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
1638
- if (topEdgeOffset < viewportDimensions.top) { // top overflow
1639
- delta.top = viewportDimensions.top - topEdgeOffset
1640
- } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
1641
- delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
1642
- }
1643
- } else {
1644
- var leftEdgeOffset = pos.left - viewportPadding
1645
- var rightEdgeOffset = pos.left + viewportPadding + actualWidth
1646
- if (leftEdgeOffset < viewportDimensions.left) { // left overflow
1647
- delta.left = viewportDimensions.left - leftEdgeOffset
1648
- } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
1649
- delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1650
- }
1651
- }
1652
-
1653
- return delta
1654
- }
1655
-
1656
- Tooltip.prototype.getTitle = function () {
1657
- var title
1658
- var $e = this.$element
1659
- var o = this.options
1660
-
1661
- title = $e.attr('data-original-title')
1662
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1663
-
1664
- return title
1665
- }
1666
-
1667
- Tooltip.prototype.getUID = function (prefix) {
1668
- do prefix += ~~(Math.random() * 1000000)
1669
- while (document.getElementById(prefix))
1670
- return prefix
1671
- }
1672
-
1673
- Tooltip.prototype.tip = function () {
1674
- if (!this.$tip) {
1675
- this.$tip = $(this.options.template)
1676
- if (this.$tip.length != 1) {
1677
- throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
1678
- }
1679
- }
1680
- return this.$tip
1681
- }
1682
-
1683
- Tooltip.prototype.arrow = function () {
1684
- return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
1685
- }
1686
-
1687
- Tooltip.prototype.enable = function () {
1688
- this.enabled = true
1689
- }
1690
-
1691
- Tooltip.prototype.disable = function () {
1692
- this.enabled = false
1693
- }
1694
-
1695
- Tooltip.prototype.toggleEnabled = function () {
1696
- this.enabled = !this.enabled
1697
- }
1698
-
1699
- Tooltip.prototype.toggle = function (e) {
1700
- var self = this
1701
- if (e) {
1702
- self = $(e.currentTarget).data('bs.' + this.type)
1703
- if (!self) {
1704
- self = new this.constructor(e.currentTarget, this.getDelegateOptions())
1705
- $(e.currentTarget).data('bs.' + this.type, self)
1706
- }
1707
- }
1708
-
1709
- if (e) {
1710
- self.inState.click = !self.inState.click
1711
- if (self.isInStateTrue()) self.enter(self)
1712
- else self.leave(self)
1713
- } else {
1714
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1715
- }
1716
- }
1717
-
1718
- Tooltip.prototype.destroy = function () {
1719
- var that = this
1720
- clearTimeout(this.timeout)
1721
- this.hide(function () {
1722
- that.$element.off('.' + that.type).removeData('bs.' + that.type)
1723
- if (that.$tip) {
1724
- that.$tip.detach()
1725
- }
1726
- that.$tip = null
1727
- that.$arrow = null
1728
- that.$viewport = null
1729
- })
1730
- }
1731
-
1732
-
1733
- // TOOLTIP PLUGIN DEFINITION
1734
- // =========================
1735
-
1736
- function Plugin(option) {
1737
- return this.each(function () {
1738
- var $this = $(this)
1739
- var data = $this.data('bs.tooltip')
1740
- var options = typeof option == 'object' && option
1741
-
1742
- if (!data && /destroy|hide/.test(option)) return
1743
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1744
- if (typeof option == 'string') data[option]()
1745
- })
1746
- }
1747
-
1748
- var old = $.fn.tooltip
1749
-
1750
- $.fn.tooltip = Plugin
1751
- $.fn.tooltip.Constructor = Tooltip
1752
-
1753
-
1754
- // TOOLTIP NO CONFLICT
1755
- // ===================
1756
-
1757
- $.fn.tooltip.noConflict = function () {
1758
- $.fn.tooltip = old
1759
- return this
1760
- }
1761
-
1762
- }(jQuery);
1763
-
1764
- /* ========================================================================
1765
- * Bootstrap: popover.js v3.3.6
1766
- * http://getbootstrap.com/javascript/#popovers
1767
- * ========================================================================
1768
- * Copyright 2011-2015 Twitter, Inc.
1769
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1770
- * ======================================================================== */
1771
-
1772
-
1773
- +function ($) {
1774
- 'use strict';
1775
-
1776
- // POPOVER PUBLIC CLASS DEFINITION
1777
- // ===============================
1778
-
1779
- var Popover = function (element, options) {
1780
- this.init('popover', element, options)
1781
- }
1782
-
1783
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1784
-
1785
- Popover.VERSION = '3.3.6'
1786
-
1787
- Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1788
- placement: 'right',
1789
- trigger: 'click',
1790
- content: '',
1791
- template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1792
- })
1793
-
1794
-
1795
- // NOTE: POPOVER EXTENDS tooltip.js
1796
- // ================================
1797
-
1798
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1799
-
1800
- Popover.prototype.constructor = Popover
1801
-
1802
- Popover.prototype.getDefaults = function () {
1803
- return Popover.DEFAULTS
1804
- }
1805
-
1806
- Popover.prototype.setContent = function () {
1807
- var $tip = this.tip()
1808
- var title = this.getTitle()
1809
- var content = this.getContent()
1810
-
1811
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1812
- $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
1813
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
1814
- ](content)
1815
-
1816
- $tip.removeClass('fade top bottom left right in')
1817
-
1818
- // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
1819
- // this manually by checking the contents.
1820
- if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1821
- }
1822
-
1823
- Popover.prototype.hasContent = function () {
1824
- return this.getTitle() || this.getContent()
1825
- }
1826
-
1827
- Popover.prototype.getContent = function () {
1828
- var $e = this.$element
1829
- var o = this.options
1830
-
1831
- return $e.attr('data-content')
1832
- || (typeof o.content == 'function' ?
1833
- o.content.call($e[0]) :
1834
- o.content)
1835
- }
1836
-
1837
- Popover.prototype.arrow = function () {
1838
- return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
1839
- }
1840
-
1841
-
1842
- // POPOVER PLUGIN DEFINITION
1843
- // =========================
1844
-
1845
- function Plugin(option) {
1846
- return this.each(function () {
1847
- var $this = $(this)
1848
- var data = $this.data('bs.popover')
1849
- var options = typeof option == 'object' && option
1850
-
1851
- if (!data && /destroy|hide/.test(option)) return
1852
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1853
- if (typeof option == 'string') data[option]()
1854
- })
1855
- }
1856
-
1857
- var old = $.fn.popover
1858
-
1859
- $.fn.popover = Plugin
1860
- $.fn.popover.Constructor = Popover
1861
-
1862
-
1863
- // POPOVER NO CONFLICT
1864
- // ===================
1865
-
1866
- $.fn.popover.noConflict = function () {
1867
- $.fn.popover = old
1868
- return this
1869
- }
1870
-
1871
- }(jQuery);
1872
-
1873
- /* ========================================================================
1874
- * Bootstrap: scrollspy.js v3.3.6
1875
- * http://getbootstrap.com/javascript/#scrollspy
1876
- * ========================================================================
1877
- * Copyright 2011-2015 Twitter, Inc.
1878
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1879
- * ======================================================================== */
1880
-
1881
-
1882
- +function ($) {
1883
- 'use strict';
1884
-
1885
- // SCROLLSPY CLASS DEFINITION
1886
- // ==========================
1887
-
1888
- function ScrollSpy(element, options) {
1889
- this.$body = $(document.body)
1890
- this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
1891
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1892
- this.selector = (this.options.target || '') + ' .nav li > a'
1893
- this.offsets = []
1894
- this.targets = []
1895
- this.activeTarget = null
1896
- this.scrollHeight = 0
1897
-
1898
- this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
1899
- this.refresh()
1900
- this.process()
1901
- }
1902
-
1903
- ScrollSpy.VERSION = '3.3.6'
1904
-
1905
- ScrollSpy.DEFAULTS = {
1906
- offset: 10
1907
- }
1908
-
1909
- ScrollSpy.prototype.getScrollHeight = function () {
1910
- return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
1911
- }
1912
-
1913
- ScrollSpy.prototype.refresh = function () {
1914
- var that = this
1915
- var offsetMethod = 'offset'
1916
- var offsetBase = 0
1917
-
1918
- this.offsets = []
1919
- this.targets = []
1920
- this.scrollHeight = this.getScrollHeight()
1921
-
1922
- if (!$.isWindow(this.$scrollElement[0])) {
1923
- offsetMethod = 'position'
1924
- offsetBase = this.$scrollElement.scrollTop()
1925
- }
1926
-
1927
- this.$body
1928
- .find(this.selector)
1929
- .map(function () {
1930
- var $el = $(this)
1931
- var href = $el.data('target') || $el.attr('href')
1932
- var $href = /^#./.test(href) && $(href)
1933
-
1934
- return ($href
1935
- && $href.length
1936
- && $href.is(':visible')
1937
- && [[$href[offsetMethod]().top + offsetBase, href]]) || null
1938
- })
1939
- .sort(function (a, b) { return a[0] - b[0] })
1940
- .each(function () {
1941
- that.offsets.push(this[0])
1942
- that.targets.push(this[1])
1943
- })
1944
- }
1945
-
1946
- ScrollSpy.prototype.process = function () {
1947
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1948
- var scrollHeight = this.getScrollHeight()
1949
- var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
1950
- var offsets = this.offsets
1951
- var targets = this.targets
1952
- var activeTarget = this.activeTarget
1953
- var i
1954
-
1955
- if (this.scrollHeight != scrollHeight) {
1956
- this.refresh()
1957
- }
1958
-
1959
- if (scrollTop >= maxScroll) {
1960
- return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
1961
- }
1962
-
1963
- if (activeTarget && scrollTop < offsets[0]) {
1964
- this.activeTarget = null
1965
- return this.clear()
1966
- }
1967
-
1968
- for (i = offsets.length; i--;) {
1969
- activeTarget != targets[i]
1970
- && scrollTop >= offsets[i]
1971
- && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
1972
- && this.activate(targets[i])
1973
- }
1974
- }
1975
-
1976
- ScrollSpy.prototype.activate = function (target) {
1977
- this.activeTarget = target
1978
-
1979
- this.clear()
1980
-
1981
- var selector = this.selector +
1982
- '[data-target="' + target + '"],' +
1983
- this.selector + '[href="' + target + '"]'
1984
-
1985
- var active = $(selector)
1986
- .parents('li')
1987
- .addClass('active')
1988
-
1989
- if (active.parent('.dropdown-menu').length) {
1990
- active = active
1991
- .closest('li.dropdown')
1992
- .addClass('active')
1993
- }
1994
-
1995
- active.trigger('activate.bs.scrollspy')
1996
- }
1997
-
1998
- ScrollSpy.prototype.clear = function () {
1999
- $(this.selector)
2000
- .parentsUntil(this.options.target, '.active')
2001
- .removeClass('active')
2002
- }
2003
-
2004
-
2005
- // SCROLLSPY PLUGIN DEFINITION
2006
- // ===========================
2007
-
2008
- function Plugin(option) {
2009
- return this.each(function () {
2010
- var $this = $(this)
2011
- var data = $this.data('bs.scrollspy')
2012
- var options = typeof option == 'object' && option
2013
-
2014
- if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
2015
- if (typeof option == 'string') data[option]()
2016
- })
2017
- }
2018
-
2019
- var old = $.fn.scrollspy
2020
-
2021
- $.fn.scrollspy = Plugin
2022
- $.fn.scrollspy.Constructor = ScrollSpy
2023
-
2024
-
2025
- // SCROLLSPY NO CONFLICT
2026
- // =====================
2027
-
2028
- $.fn.scrollspy.noConflict = function () {
2029
- $.fn.scrollspy = old
2030
- return this
2031
- }
2032
-
2033
-
2034
- // SCROLLSPY DATA-API
2035
- // ==================
2036
-
2037
- $(window).on('load.bs.scrollspy.data-api', function () {
2038
- $('[data-spy="scroll"]').each(function () {
2039
- var $spy = $(this)
2040
- Plugin.call($spy, $spy.data())
2041
- })
2042
- })
2043
-
2044
- }(jQuery);
2045
-
2046
- /* ========================================================================
2047
- * Bootstrap: tab.js v3.3.6
2048
- * http://getbootstrap.com/javascript/#tabs
2049
- * ========================================================================
2050
- * Copyright 2011-2015 Twitter, Inc.
2051
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2052
- * ======================================================================== */
2053
-
2054
-
2055
- +function ($) {
2056
- 'use strict';
2057
-
2058
- // TAB CLASS DEFINITION
2059
- // ====================
2060
-
2061
- var Tab = function (element) {
2062
- // jscs:disable requireDollarBeforejQueryAssignment
2063
- this.element = $(element)
2064
- // jscs:enable requireDollarBeforejQueryAssignment
2065
- }
2066
-
2067
- Tab.VERSION = '3.3.6'
2068
-
2069
- Tab.TRANSITION_DURATION = 150
2070
-
2071
- Tab.prototype.show = function () {
2072
- var $this = this.element
2073
- var $ul = $this.closest('ul:not(.dropdown-menu)')
2074
- var selector = $this.data('target')
2075
-
2076
- if (!selector) {
2077
- selector = $this.attr('href')
2078
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
2079
- }
2080
-
2081
- if ($this.parent('li').hasClass('active')) return
2082
-
2083
- var $previous = $ul.find('.active:last a')
2084
- var hideEvent = $.Event('hide.bs.tab', {
2085
- relatedTarget: $this[0]
2086
- })
2087
- var showEvent = $.Event('show.bs.tab', {
2088
- relatedTarget: $previous[0]
2089
- })
2090
-
2091
- $previous.trigger(hideEvent)
2092
- $this.trigger(showEvent)
2093
-
2094
- if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
2095
-
2096
- var $target = $(selector)
2097
-
2098
- this.activate($this.closest('li'), $ul)
2099
- this.activate($target, $target.parent(), function () {
2100
- $previous.trigger({
2101
- type: 'hidden.bs.tab',
2102
- relatedTarget: $this[0]
2103
- })
2104
- $this.trigger({
2105
- type: 'shown.bs.tab',
2106
- relatedTarget: $previous[0]
2107
- })
2108
- })
2109
- }
2110
-
2111
- Tab.prototype.activate = function (element, container, callback) {
2112
- var $active = container.find('> .active')
2113
- var transition = callback
2114
- && $.support.transition
2115
- && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
2116
-
2117
- function next() {
2118
- $active
2119
- .removeClass('active')
2120
- .find('> .dropdown-menu > .active')
2121
- .removeClass('active')
2122
- .end()
2123
- .find('[data-toggle="tab"]')
2124
- .attr('aria-expanded', false)
2125
-
2126
- element
2127
- .addClass('active')
2128
- .find('[data-toggle="tab"]')
2129
- .attr('aria-expanded', true)
2130
-
2131
- if (transition) {
2132
- element[0].offsetWidth // reflow for transition
2133
- element.addClass('in')
2134
- } else {
2135
- element.removeClass('fade')
2136
- }
2137
-
2138
- if (element.parent('.dropdown-menu').length) {
2139
- element
2140
- .closest('li.dropdown')
2141
- .addClass('active')
2142
- .end()
2143
- .find('[data-toggle="tab"]')
2144
- .attr('aria-expanded', true)
2145
- }
2146
-
2147
- callback && callback()
2148
- }
2149
-
2150
- $active.length && transition ?
2151
- $active
2152
- .one('bsTransitionEnd', next)
2153
- .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
2154
- next()
2155
-
2156
- $active.removeClass('in')
2157
- }
2158
-
2159
-
2160
- // TAB PLUGIN DEFINITION
2161
- // =====================
2162
-
2163
- function Plugin(option) {
2164
- return this.each(function () {
2165
- var $this = $(this)
2166
- var data = $this.data('bs.tab')
2167
-
2168
- if (!data) $this.data('bs.tab', (data = new Tab(this)))
2169
- if (typeof option == 'string') data[option]()
2170
- })
2171
- }
2172
-
2173
- var old = $.fn.tab
2174
-
2175
- $.fn.tab = Plugin
2176
- $.fn.tab.Constructor = Tab
2177
-
2178
-
2179
- // TAB NO CONFLICT
2180
- // ===============
2181
-
2182
- $.fn.tab.noConflict = function () {
2183
- $.fn.tab = old
2184
- return this
2185
- }
2186
-
2187
-
2188
- // TAB DATA-API
2189
- // ============
2190
-
2191
- var clickHandler = function (e) {
2192
- e.preventDefault()
2193
- Plugin.call($(this), 'show')
2194
- }
2195
-
2196
- $(document)
2197
- .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
2198
- .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
2199
-
2200
- }(jQuery);
2201
-
2202
- /* ========================================================================
2203
- * Bootstrap: affix.js v3.3.6
2204
- * http://getbootstrap.com/javascript/#affix
2205
- * ========================================================================
2206
- * Copyright 2011-2015 Twitter, Inc.
2207
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2208
- * ======================================================================== */
2209
-
2210
-
2211
- +function ($) {
2212
- 'use strict';
2213
-
2214
- // AFFIX CLASS DEFINITION
2215
- // ======================
2216
-
2217
- var Affix = function (element, options) {
2218
- this.options = $.extend({}, Affix.DEFAULTS, options)
2219
-
2220
- this.$target = $(this.options.target)
2221
- .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
2222
- .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
2223
-
2224
- this.$element = $(element)
2225
- this.affixed = null
2226
- this.unpin = null
2227
- this.pinnedOffset = null
2228
-
2229
- this.checkPosition()
2230
- }
2231
-
2232
- Affix.VERSION = '3.3.6'
2233
-
2234
- Affix.RESET = 'affix affix-top affix-bottom'
2235
-
2236
- Affix.DEFAULTS = {
2237
- offset: 0,
2238
- target: window
2239
- }
2240
-
2241
- Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
2242
- var scrollTop = this.$target.scrollTop()
2243
- var position = this.$element.offset()
2244
- var targetHeight = this.$target.height()
2245
-
2246
- if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
2247
-
2248
- if (this.affixed == 'bottom') {
2249
- if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
2250
- return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
2251
- }
2252
-
2253
- var initializing = this.affixed == null
2254
- var colliderTop = initializing ? scrollTop : position.top
2255
- var colliderHeight = initializing ? targetHeight : height
2256
-
2257
- if (offsetTop != null && scrollTop <= offsetTop) return 'top'
2258
- if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
2259
-
2260
- return false
2261
- }
2262
-
2263
- Affix.prototype.getPinnedOffset = function () {
2264
- if (this.pinnedOffset) return this.pinnedOffset
2265
- this.$element.removeClass(Affix.RESET).addClass('affix')
2266
- var scrollTop = this.$target.scrollTop()
2267
- var position = this.$element.offset()
2268
- return (this.pinnedOffset = position.top - scrollTop)
2269
- }
2270
-
2271
- Affix.prototype.checkPositionWithEventLoop = function () {
2272
- setTimeout($.proxy(this.checkPosition, this), 1)
2273
- }
2274
-
2275
- Affix.prototype.checkPosition = function () {
2276
- if (!this.$element.is(':visible')) return
2277
-
2278
- var height = this.$element.height()
2279
- var offset = this.options.offset
2280
- var offsetTop = offset.top
2281
- var offsetBottom = offset.bottom
2282
- var scrollHeight = Math.max($(document).height(), $(document.body).height())
2283
-
2284
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
2285
- if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
2286
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2287
-
2288
- var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2289
-
2290
- if (this.affixed != affix) {
2291
- if (this.unpin != null) this.$element.css('top', '')
2292
-
2293
- var affixType = 'affix' + (affix ? '-' + affix : '')
2294
- var e = $.Event(affixType + '.bs.affix')
2295
-
2296
- this.$element.trigger(e)
2297
-
2298
- if (e.isDefaultPrevented()) return
2299
-
2300
- this.affixed = affix
2301
- this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2302
-
2303
- this.$element
2304
- .removeClass(Affix.RESET)
2305
- .addClass(affixType)
2306
- .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
2307
- }
2308
-
2309
- if (affix == 'bottom') {
2310
- this.$element.offset({
2311
- top: scrollHeight - height - offsetBottom
2312
- })
2313
- }
2314
- }
2315
-
2316
-
2317
- // AFFIX PLUGIN DEFINITION
2318
- // =======================
2319
-
2320
- function Plugin(option) {
2321
- return this.each(function () {
2322
- var $this = $(this)
2323
- var data = $this.data('bs.affix')
2324
- var options = typeof option == 'object' && option
2325
-
2326
- if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
2327
- if (typeof option == 'string') data[option]()
2328
- })
2329
- }
2330
-
2331
- var old = $.fn.affix
2332
-
2333
- $.fn.affix = Plugin
2334
- $.fn.affix.Constructor = Affix
2335
-
2336
-
2337
- // AFFIX NO CONFLICT
2338
- // =================
2339
-
2340
- $.fn.affix.noConflict = function () {
2341
- $.fn.affix = old
2342
- return this
2343
- }
2344
-
2345
-
2346
- // AFFIX DATA-API
2347
- // ==============
2348
-
2349
- $(window).on('load', function () {
2350
- $('[data-spy="affix"]').each(function () {
2351
- var $spy = $(this)
2352
- var data = $spy.data()
2353
-
2354
- data.offset = data.offset || {}
2355
-
2356
- if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
2357
- if (data.offsetTop != null) data.offset.top = data.offsetTop
2358
-
2359
- Plugin.call($spy, data)
2360
- })
2361
- })
2362
-
2363
- }(jQuery);