constructor-pages 0.7.0 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (352) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +13 -0
  5. data/.yardopts +9 -0
  6. data/Gemfile +31 -0
  7. data/Guardfile +15 -0
  8. data/LICENSE.md +7 -0
  9. data/README.md +35 -0
  10. data/Rakefile +19 -0
  11. data/bin/rails +8 -0
  12. data/config.ru +4 -0
  13. data/config/routes.rb +4 -27
  14. data/constructor-cms.gemspec +26 -0
  15. data/core/app/assets/images/constructor_core/glyphicons-halflings-white.png +0 -0
  16. data/core/app/assets/images/constructor_core/glyphicons-halflings.png +0 -0
  17. data/core/app/assets/images/constructor_core/minus.gif +0 -0
  18. data/core/app/assets/images/constructor_core/plus.gif +0 -0
  19. data/core/app/assets/images/constructor_core/rss.png +0 -0
  20. data/core/app/assets/images/constructor_core/treeview-black-line.gif +0 -0
  21. data/core/app/assets/images/constructor_core/treeview-black.gif +0 -0
  22. data/core/app/assets/images/constructor_core/treeview-default-line.gif +0 -0
  23. data/core/app/assets/images/constructor_core/treeview-default.gif +0 -0
  24. data/core/app/assets/images/constructor_core/treeview-famfamfam-line.gif +0 -0
  25. data/core/app/assets/images/constructor_core/treeview-famfamfam.gif +0 -0
  26. data/core/app/assets/images/constructor_core/treeview-gray-line.gif +0 -0
  27. data/core/app/assets/images/constructor_core/treeview-gray.gif +0 -0
  28. data/core/app/assets/images/constructor_core/treeview-red-line.gif +0 -0
  29. data/core/app/assets/images/constructor_core/treeview-red.gif +0 -0
  30. data/core/app/assets/images/constructor_core/twitter.png +0 -0
  31. data/core/app/assets/images/constructor_core/widgets.png +0 -0
  32. data/core/app/assets/javascripts/constructor_core/application.js.coffee +52 -0
  33. data/core/app/assets/javascripts/constructor_core/bootstrap.js +2276 -0
  34. data/core/app/assets/javascripts/constructor_core/jquery.cookie.js +92 -0
  35. data/core/app/assets/javascripts/constructor_core/jquery_bundle.js.coffee +3 -0
  36. data/core/app/assets/javascripts/constructor_core/keys_snippet.js +33 -0
  37. data/core/app/assets/javascripts/constructor_core/retina.js +148 -0
  38. data/core/app/assets/javascripts/constructor_core/urlify.js +82 -0
  39. data/core/app/assets/stylesheets/constructor_core/application.css.scss +3 -0
  40. data/core/app/assets/stylesheets/constructor_core/main.css.scss +229 -0
  41. data/core/app/controllers/constructor_core/application_controller.rb +31 -0
  42. data/core/app/controllers/constructor_core/sessions_controller.rb +15 -0
  43. data/core/app/controllers/constructor_core/users_controller.rb +24 -0
  44. data/core/app/helpers/constructor_core/application_helper.rb +9 -0
  45. data/core/app/models/constructor_core/user.rb +7 -0
  46. data/core/app/views/constructor_core/devise/confirmations/new.html.haml +10 -0
  47. data/core/app/views/constructor_core/devise/mailer/confirmation_instructions.html.haml +5 -0
  48. data/core/app/views/constructor_core/devise/mailer/reset_password_instructions.html.haml +7 -0
  49. data/core/app/views/constructor_core/devise/mailer/unlock_instructions.html.haml +5 -0
  50. data/core/app/views/constructor_core/devise/passwords/edit.html.haml +21 -0
  51. data/core/app/views/constructor_core/devise/passwords/new.html.haml +13 -0
  52. data/core/app/views/constructor_core/devise/registrations/edit.html.haml +28 -0
  53. data/core/app/views/constructor_core/devise/registrations/new.html.haml +20 -0
  54. data/core/app/views/constructor_core/devise/shared/_links.html.haml +19 -0
  55. data/core/app/views/constructor_core/devise/unlocks/new.html.haml +9 -0
  56. data/core/app/views/constructor_core/sessions/new.html.haml +22 -0
  57. data/core/app/views/constructor_core/users/profile.haml +16 -0
  58. data/core/app/views/layouts/constructor_core/application.haml +93 -0
  59. data/core/config/environments/production.rb +3 -0
  60. data/core/config/initializers/devise.rb +15 -0
  61. data/core/config/locales/devise.en.yml +56 -0
  62. data/core/config/locales/devise.fr.yml +74 -0
  63. data/core/config/locales/devise.ru.yml +52 -0
  64. data/core/config/locales/en.yml +15 -0
  65. data/core/config/locales/fr.yml +15 -0
  66. data/core/config/locales/ru.yml +27 -0
  67. data/core/config/routes.rb +18 -0
  68. data/core/constructor-core.gemspec +24 -0
  69. data/core/db/migrate/1_devise_users.rb +24 -0
  70. data/core/db/migrate/2_add_default_user.rb +9 -0
  71. data/core/lib/constructor-core.rb +25 -0
  72. data/core/lib/constructor_core/engine.rb +6 -0
  73. data/core/lib/constructor_core/version.rb +3 -0
  74. data/{spec/helpers/constructor_pages/.keep → core/vendor/assets/javascripts/.gitkeep} +0 -0
  75. data/core/vendor/assets/javascripts/ckeditor/ckeditor.js +913 -0
  76. data/core/vendor/assets/javascripts/ckeditor/config.js +38 -0
  77. data/core/vendor/assets/javascripts/ckeditor/lang/en.js +5 -0
  78. data/core/vendor/assets/javascripts/ckeditor/lang/ru.js +5 -0
  79. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +10 -0
  80. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt +25 -0
  81. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js +9 -0
  82. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js +9 -0
  83. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js +9 -0
  84. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js +10 -0
  85. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js +9 -0
  86. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/da.js +9 -0
  87. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/de.js +10 -0
  88. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/el.js +10 -0
  89. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/en.js +9 -0
  90. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js +10 -0
  91. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/es.js +10 -0
  92. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/et.js +9 -0
  93. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js +9 -0
  94. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js +10 -0
  95. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js +10 -0
  96. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js +9 -0
  97. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/he.js +9 -0
  98. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js +9 -0
  99. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js +9 -0
  100. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js +9 -0
  101. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/it.js +10 -0
  102. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js +9 -0
  103. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/km.js +9 -0
  104. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js +10 -0
  105. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js +9 -0
  106. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js +10 -0
  107. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js +9 -0
  108. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js +9 -0
  109. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js +9 -0
  110. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js +10 -0
  111. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/no.js +9 -0
  112. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js +10 -0
  113. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js +9 -0
  114. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js +9 -0
  115. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js +9 -0
  116. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js +9 -0
  117. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js +10 -0
  118. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js +9 -0
  119. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js +10 -0
  120. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/th.js +9 -0
  121. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js +10 -0
  122. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js +9 -0
  123. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js +9 -0
  124. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js +9 -0
  125. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js +7 -0
  126. data/core/vendor/assets/javascripts/ckeditor/plugins/about/dialogs/about.js +6 -0
  127. data/core/vendor/assets/javascripts/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  128. data/core/vendor/assets/javascripts/ckeditor/plugins/clipboard/dialogs/paste.js +11 -0
  129. data/core/vendor/assets/javascripts/ckeditor/plugins/colordialog/dialogs/colordialog.js +13 -0
  130. data/core/vendor/assets/javascripts/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  131. data/core/vendor/assets/javascripts/ckeditor/plugins/div/dialogs/div.js +9 -0
  132. data/core/vendor/assets/javascripts/ckeditor/plugins/fakeobjects/images/spacer.gif +0 -0
  133. data/core/vendor/assets/javascripts/ckeditor/plugins/find/dialogs/find.js +24 -0
  134. data/core/vendor/assets/javascripts/ckeditor/plugins/icons.png +0 -0
  135. data/core/vendor/assets/javascripts/ckeditor/plugins/iframe/dialogs/iframe.js +10 -0
  136. data/core/vendor/assets/javascripts/ckeditor/plugins/iframe/images/placeholder.png +0 -0
  137. data/core/vendor/assets/javascripts/ckeditor/plugins/image/dialogs/image.js +43 -0
  138. data/core/vendor/assets/javascripts/ckeditor/plugins/image/images/noimage.png +0 -0
  139. data/core/vendor/assets/javascripts/ckeditor/plugins/link/dialogs/anchor.js +8 -0
  140. data/core/vendor/assets/javascripts/ckeditor/plugins/link/dialogs/link.js +36 -0
  141. data/core/vendor/assets/javascripts/ckeditor/plugins/link/images/anchor.png +0 -0
  142. data/core/vendor/assets/javascripts/ckeditor/plugins/liststyle/dialogs/liststyle.js +10 -0
  143. data/core/vendor/assets/javascripts/ckeditor/plugins/magicline/images/icon.png +0 -0
  144. data/core/vendor/assets/javascripts/ckeditor/plugins/pastefromword/filter/default.js +31 -0
  145. data/core/vendor/assets/javascripts/ckeditor/plugins/preview/preview.html +10 -0
  146. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/LICENSE.md +28 -0
  147. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/README.md +25 -0
  148. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/dialogs/options.js +20 -0
  149. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/dialogs/toolbar.css +71 -0
  150. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  151. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  152. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  153. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  154. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  155. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  156. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  157. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  158. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  159. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  160. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  161. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt +20 -0
  162. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/ca.js +13 -0
  163. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/cs.js +13 -0
  164. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/cy.js +14 -0
  165. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/de.js +13 -0
  166. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/el.js +13 -0
  167. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/en.js +13 -0
  168. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/eo.js +12 -0
  169. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/et.js +13 -0
  170. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/fa.js +12 -0
  171. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/fi.js +13 -0
  172. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/fr.js +11 -0
  173. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/he.js +13 -0
  174. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/hr.js +13 -0
  175. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/it.js +14 -0
  176. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/ku.js +13 -0
  177. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/lv.js +13 -0
  178. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/nb.js +11 -0
  179. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/nl.js +13 -0
  180. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/no.js +11 -0
  181. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/pl.js +12 -0
  182. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js +11 -0
  183. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/sk.js +13 -0
  184. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/sv.js +11 -0
  185. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/th.js +13 -0
  186. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/tr.js +12 -0
  187. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/ug.js +13 -0
  188. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js +9 -0
  189. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/specialchar.js +14 -0
  190. data/core/vendor/assets/javascripts/ckeditor/plugins/table/dialogs/table.js +21 -0
  191. data/core/vendor/assets/javascripts/ckeditor/plugins/tabletools/dialogs/tableCell.js +16 -0
  192. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/dialogs/templates.css +84 -0
  193. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/dialogs/templates.js +10 -0
  194. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/default.js +6 -0
  195. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  196. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  197. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  198. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/LICENSE.md +28 -0
  199. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/README.md +25 -0
  200. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  201. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  202. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.css +82 -0
  203. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.js +11 -0
  204. data/core/vendor/assets/javascripts/ckeditor/styles.js +111 -0
  205. data/{spec/routing/constructor_pages/.keep → core/vendor/assets/stylesheets/.gitkeep} +0 -0
  206. data/core/vendor/assets/stylesheets/ckeditor/contents.css +103 -0
  207. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog.css +5 -0
  208. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_ie.css +5 -0
  209. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_ie7.css +5 -0
  210. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_ie8.css +5 -0
  211. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_opera.css +5 -0
  212. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor.css +5 -0
  213. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_gecko.css +5 -0
  214. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_ie.css +5 -0
  215. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_ie7.css +5 -0
  216. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_ie8.css +5 -0
  217. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/icons.png +0 -0
  218. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/images/arrow.png +0 -0
  219. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/images/close.png +0 -0
  220. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/images/mini.png +0 -0
  221. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/readme.md +51 -0
  222. data/lib/constructor-cms.rb +3 -0
  223. data/lib/constructor-cms/engine.rb +6 -0
  224. data/{app → pages/app}/assets/images/constructor_pages/arrow_down.png +0 -0
  225. data/{app → pages/app}/assets/images/constructor_pages/arrow_up.png +0 -0
  226. data/{app → pages/app}/assets/images/constructor_pages/information.png +0 -0
  227. data/{app → pages/app}/assets/images/constructor_pages/page_white_edit.png +0 -0
  228. data/{app → pages/app}/assets/images/constructor_pages/photos.png +0 -0
  229. data/{app → pages/app}/assets/javascripts/constructor_pages/ajax_pages.js +0 -0
  230. data/{app → pages/app}/assets/javascripts/constructor_pages/jquery.history.js +0 -0
  231. data/{app → pages/app}/controllers/constructor_pages/application_controller.rb +0 -0
  232. data/{app → pages/app}/controllers/constructor_pages/fields_controller.rb +10 -15
  233. data/{app → pages/app}/controllers/constructor_pages/pages_controller.rb +0 -0
  234. data/{app → pages/app}/controllers/constructor_pages/templates_controller.rb +0 -0
  235. data/pages/app/helpers/constructor_pages/code_name_uniq.rb +7 -0
  236. data/{app → pages/app}/helpers/constructor_pages/fields_helper.rb +0 -0
  237. data/{app → pages/app}/helpers/constructor_pages/pages_helper.rb +0 -0
  238. data/{app → pages/app}/helpers/constructor_pages/templates_helper.rb +0 -0
  239. data/{app → pages/app}/helpers/constructor_pages/treeview_helper.rb +0 -0
  240. data/{app → pages/app}/models/constructor_pages/field.rb +12 -40
  241. data/{app → pages/app}/models/constructor_pages/page.rb +26 -70
  242. data/{app → pages/app}/models/constructor_pages/template.rb +4 -12
  243. data/{app → pages/app}/models/constructor_pages/types/boolean_type.rb +0 -0
  244. data/{app → pages/app}/models/constructor_pages/types/date_type.rb +0 -0
  245. data/{app → pages/app}/models/constructor_pages/types/float_type.rb +0 -0
  246. data/{app → pages/app}/models/constructor_pages/types/html_type.rb +0 -0
  247. data/{app → pages/app}/models/constructor_pages/types/image_type.rb +0 -0
  248. data/{app → pages/app}/models/constructor_pages/types/integer_type.rb +0 -0
  249. data/{app → pages/app}/models/constructor_pages/types/string_type.rb +0 -0
  250. data/{app → pages/app}/models/constructor_pages/types/text_type.rb +0 -0
  251. data/{app → pages/app}/views/constructor_pages/fields/_form.haml +0 -0
  252. data/{app → pages/app}/views/constructor_pages/fields/edit.haml +0 -0
  253. data/{app → pages/app}/views/constructor_pages/fields/new.haml +0 -0
  254. data/{app → pages/app}/views/constructor_pages/fields/types/_boolean.haml +0 -0
  255. data/{app → pages/app}/views/constructor_pages/fields/types/_date.haml +0 -0
  256. data/{app → pages/app}/views/constructor_pages/fields/types/_float.haml +0 -0
  257. data/{app → pages/app}/views/constructor_pages/fields/types/_html.haml +0 -0
  258. data/{app → pages/app}/views/constructor_pages/fields/types/_image.haml +0 -0
  259. data/{app → pages/app}/views/constructor_pages/fields/types/_integer.haml +0 -0
  260. data/{app → pages/app}/views/constructor_pages/fields/types/_string.haml +0 -0
  261. data/{app → pages/app}/views/constructor_pages/fields/types/_text.haml +0 -0
  262. data/{app → pages/app}/views/constructor_pages/pages/_breadcrumbs.haml +0 -0
  263. data/{app → pages/app}/views/constructor_pages/pages/_form.haml +0 -0
  264. data/{app → pages/app}/views/constructor_pages/pages/_menu.haml +0 -0
  265. data/{app → pages/app}/views/constructor_pages/pages/_submenu.haml +0 -0
  266. data/{app → pages/app}/views/constructor_pages/pages/edit.haml +0 -0
  267. data/{app → pages/app}/views/constructor_pages/pages/index.haml +0 -0
  268. data/{app → pages/app}/views/constructor_pages/pages/new.haml +0 -0
  269. data/{app → pages/app}/views/constructor_pages/pages/show.haml +0 -0
  270. data/{app → pages/app}/views/constructor_pages/partials/_arrow_buttons.haml +0 -0
  271. data/{app → pages/app}/views/constructor_pages/templates/_form.haml +0 -0
  272. data/{app → pages/app}/views/constructor_pages/templates/edit.haml +0 -0
  273. data/{app → pages/app}/views/constructor_pages/templates/index.haml +0 -0
  274. data/{app → pages/app}/views/constructor_pages/templates/new.haml +0 -0
  275. data/{config → pages/config}/initializers/dragonfly.rb +0 -0
  276. data/{config → pages/config}/locales/en.yml +0 -0
  277. data/{config → pages/config}/locales/fr.yml +0 -0
  278. data/{config → pages/config}/locales/ru.yml +0 -0
  279. data/pages/config/routes.rb +26 -0
  280. data/{constructor-pages.gemspec → pages/constructor-pages.gemspec} +0 -0
  281. data/{db → pages/db}/migrate/10_create_html_types.rb +0 -0
  282. data/{db → pages/db}/migrate/11_create_image_types.rb +0 -0
  283. data/{db → pages/db}/migrate/12_add_default_template.rb +0 -0
  284. data/{db → pages/db}/migrate/1_create_pages.rb +0 -0
  285. data/{db → pages/db}/migrate/2_create_templates.rb +0 -0
  286. data/{db → pages/db}/migrate/3_create_fields.rb +0 -0
  287. data/{db → pages/db}/migrate/4_create_string_types.rb +0 -0
  288. data/{db → pages/db}/migrate/5_create_float_types.rb +0 -0
  289. data/{db → pages/db}/migrate/6_create_boolean_types.rb +0 -0
  290. data/{db → pages/db}/migrate/7_create_integer_types.rb +0 -0
  291. data/{db → pages/db}/migrate/8_create_text_types.rb +0 -0
  292. data/{db → pages/db}/migrate/9_create_date_types.rb +0 -0
  293. data/{lib → pages/lib}/constructor-pages.rb +0 -0
  294. data/{lib → pages/lib}/constructor_pages/engine.rb +0 -0
  295. data/{public → pages/public}/hello.txt +0 -0
  296. data/{spec/features/constructor_pages/fields_controller_spec.rb → pages/spec/features/constructor_pages/fields_spec.rb} +0 -0
  297. data/{spec/features/constructor_pages/pages_controller_spec.rb → pages/spec/features/constructor_pages/pages_spec.rb} +0 -0
  298. data/{spec/features/constructor_pages/templates_controller_spec.rb → pages/spec/features/constructor_pages/templates_spec.rb} +0 -0
  299. data/pages/spec/helpers/constructor_pages/.keep +0 -0
  300. data/{spec/models/constructor_pages/field_model_spec.rb → pages/spec/models/constructor_pages/field_spec.rb} +0 -0
  301. data/{spec/models/constructor_pages/page_model_spec.rb → pages/spec/models/constructor_pages/page_spec.rb} +2 -1
  302. data/{spec/models/constructor_pages/template_model_spec.rb → pages/spec/models/constructor_pages/template_spec.rb} +0 -0
  303. data/{spec/models/constructor_pages/types/boolean_type_model_spec.rb → pages/spec/models/constructor_pages/types/boolean_type_spec.rb} +0 -0
  304. data/{spec/models/constructor_pages/types/date_type_model_spec.rb → pages/spec/models/constructor_pages/types/date_type_spec.rb} +0 -0
  305. data/{spec/models/constructor_pages/types/float_type_model_spec.rb → pages/spec/models/constructor_pages/types/float_type_spec.rb} +0 -0
  306. data/{spec/models/constructor_pages/types/html_type_model_spec.rb → pages/spec/models/constructor_pages/types/html_type_spec.rb} +0 -0
  307. data/{spec/models/constructor_pages/types/integer_type_model_spec.rb → pages/spec/models/constructor_pages/types/integer_type_spec.rb} +0 -0
  308. data/{spec/models/constructor_pages/types/string_type_model_spec.rb → pages/spec/models/constructor_pages/types/string_type_spec.rb} +0 -0
  309. data/{spec/models/constructor_pages/types/text_type_model_spec.rb → pages/spec/models/constructor_pages/types/text_type_spec.rb} +0 -0
  310. data/pages/spec/routing/constructor_pages/.keep +0 -0
  311. data/spec/dummy/README.rdoc +28 -0
  312. data/spec/dummy/Rakefile +6 -0
  313. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  314. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  315. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  316. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  317. data/spec/dummy/app/mailers/.gitkeep +0 -0
  318. data/spec/dummy/app/models/.gitkeep +0 -0
  319. data/spec/dummy/app/views/html_templates/page.haml +1 -0
  320. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  321. data/spec/dummy/bin/bundle +3 -0
  322. data/spec/dummy/bin/rails +4 -0
  323. data/spec/dummy/bin/rake +4 -0
  324. data/spec/dummy/config.ru +4 -0
  325. data/spec/dummy/config/application.rb +23 -0
  326. data/spec/dummy/config/boot.rb +5 -0
  327. data/spec/dummy/config/database.yml +25 -0
  328. data/spec/dummy/config/environment.rb +5 -0
  329. data/spec/dummy/config/environments/development.rb +29 -0
  330. data/spec/dummy/config/environments/production.rb +80 -0
  331. data/spec/dummy/config/environments/test.rb +36 -0
  332. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  333. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  334. data/spec/dummy/config/initializers/inflections.rb +16 -0
  335. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  336. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  337. data/spec/dummy/config/initializers/session_store.rb +3 -0
  338. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  339. data/spec/dummy/config/locales/en.yml +5 -0
  340. data/spec/dummy/config/routes.rb +3 -0
  341. data/spec/dummy/lib/assets/.gitkeep +0 -0
  342. data/spec/dummy/lib/tasks/.gitkeep +0 -0
  343. data/spec/dummy/log/.gitkeep +0 -0
  344. data/spec/dummy/public/404.html +58 -0
  345. data/spec/dummy/public/422.html +58 -0
  346. data/spec/dummy/public/500.html +57 -0
  347. data/spec/dummy/public/favicon.ico +0 -0
  348. data/spec/dummy/public/robots.txt +5 -0
  349. data/spec/spec_helper.rb +46 -0
  350. data/tasks/constructor-cms_tasks.rake +15 -0
  351. metadata +397 -107
  352. data/app/helpers/constructor_pages/code_name_uniq.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ff60c9222205c836e13b7f7cdcf98bf338bf4b7
4
- data.tar.gz: 9b17ef0094167efb7b2a9636875c998f87b140d5
3
+ metadata.gz: 63ef39f68dac8f72fa5e9d9b4d3b72f7e36f31b3
4
+ data.tar.gz: 9336100ad846bcea8c4b95488309f004c1ffd42a
5
5
  SHA512:
6
- metadata.gz: b4db872702c2d39a43e23be9438da7d41d554db34074b26c1dfaffee563dd497497d1eae54deb29cacd4314e032ebe49ea2d43d233971d84e685ddec86752d63
7
- data.tar.gz: acc0136940c01694589752f680078626631b4fc90e80a79224c35101107a9a2845c4fd6ad5aa39c59c6b866a40f18990405d6785618fbbfefea52f9d0df05223
6
+ metadata.gz: b35eaa007793be95dce5f71cbed6377a126df7d2a89b0121a18d7e59e2aa2d4e59ff9c3328dda439731c3957a499430caf6fc48e82a846a5eb8566460192750a
7
+ data.tar.gz: 4be0984e5c783571f4f8fa82d17d14fecb2aeb341da30056ed2a787dba298ae164b6f22ee8a7fb444c3eee4a3786c0f45ff867ad9ba237ca4a9e8550d39baaa1
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ .bundle/
2
+ .idea/
3
+ log/*.log
4
+ Gemfile.lock
5
+ coverage/
6
+ .DS_Store
7
+ spec/dummy/log/*.log
8
+ spec/dummy/db/
9
+ spec/dummy/public/system
10
+ spec/dummy/tmp
11
+ doc/
12
+ .yardoc/
13
+ tmp/
14
+ pkg/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --colour
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ notifications:
3
+ email:
4
+ - ivanzotov@gmail.com
5
+ before_script:
6
+ - "rake app:railties:install:migrations"
7
+ - "rake app:db:migrate"
8
+ script: bundle exec rake spec
9
+ rvm:
10
+ - 2.0.0
11
+ - 1.9.3
12
+ - rbx-19mode
13
+ - jruby-19mode
data/.yardopts ADDED
@@ -0,0 +1,9 @@
1
+ --title "Constructor CMS"
2
+ Gemfile
3
+ lib/**/*
4
+ Rakefile
5
+ core/**/*.rb
6
+ pages/**/*.rb
7
+ -
8
+ README.md
9
+ LICENSE.md
data/Gemfile ADDED
@@ -0,0 +1,31 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'awesome_nested_set', github: 'ivanzotov/awesome_nested_set', branch: 'rails4'
6
+
7
+ group :test do
8
+ gem 'coveralls', require: false
9
+ gem 'simplecov', :require => false
10
+ gem 'guard-rspec'
11
+ end
12
+
13
+ group :assets do
14
+ gem 'sass-rails', '~> 4.0.0.rc2'
15
+ gem 'coffee-rails', '~> 4.0.0'
16
+ gem 'less-rails'
17
+ gem 'therubyracer', :platforms => :ruby
18
+
19
+ gem 'uglifier', '>= 1.3.0'
20
+ end
21
+
22
+ gem 'jquery-rails'
23
+
24
+ platform :jruby do
25
+ gem 'activerecord-jdbcsqlite3-adapter', '1.3.0.beta2'
26
+ gem 'therubyrhino', group: :assets
27
+ end
28
+
29
+ platform :ruby do
30
+ gem 'sqlite3'
31
+ end
data/Guardfile ADDED
@@ -0,0 +1,15 @@
1
+ extensions = %w(pages)
2
+
3
+ guard 'rspec', :spec_paths => extensions.map{|e| "#{e}/spec"}, :cli => (['~/.rspec', '.rspec'].map{|f| File.read(File.expand_path(f)).split("\n").join(' ') if File.exists?(File.expand_path(f))}.join(' ')) do
4
+ extensions.each do |extension|
5
+ watch(%r{^#{extension}/spec/.+_spec\.rb$})
6
+ watch(%r{^#{extension}/app/(.+)\.rb$}) { |m| "#{extension}/spec/#{m[1]}_spec.rb" }
7
+ watch(%r{^#{extension}/lib/(.+)\.rb$}) { |m| "#{extension}/spec/lib/#{m[1]}_spec.rb" }
8
+ watch(%r{^#{extension}/app/controllers/constructor_#{extension}/(.+)_(controller)\.rb$}) { |m| "#{extension}/spec/features/constructor_#{extension}/#{m[1]}_spec.rb" }
9
+ watch(%r{^#{extension}/spec/support/(.+)\.rb$}) { "#{extension}/spec" }
10
+ watch("#{extension}/spec/spec_helper.rb") { "#{extension}/spec" }
11
+ # Capybara request specs
12
+ watch(%r{^#{extension}/app/views/(.+)/.*\.(erb|haml)$}) { |m| "#{extension}/spec/requests/#{m[1]}_spec.rb" }
13
+ end
14
+ end
15
+
data/LICENSE.md ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2012—2013 Ivan Zotov
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Constructor CMS
2
+
3
+ Constructor – an open source Ruby on Rails content management system for Rails 4.
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/constructor-cms.png)](https://rubygems.org/gems/constructor-cms)
6
+ [![Build Status](https://travis-ci.org/ivanzotov/constructor.png?branch=master)](https://travis-ci.org/ivanzotov/constructor)
7
+ [![Dependency Status](https://gemnasium.com/ivanzotov/constructor.png)](https://gemnasium.com/ivanzotov/constructor)
8
+ [![Code Climate](https://codeclimate.com/github/ivanzotov/constructor.png)](https://codeclimate.com/github/ivanzotov/constructor)
9
+ [![Coverage Status](https://coveralls.io/repos/ivanzotov/constructor/badge.png)](https://coveralls.io/r/ivanzotov/constructor)
10
+
11
+ ## Installation
12
+
13
+ ### Add to Gemfile
14
+
15
+ gem 'constructor-cms', '~> 0.7.2'
16
+
17
+ ### Install
18
+
19
+ bundle install
20
+
21
+ ### Migrate
22
+
23
+ rake railties:install:migrations
24
+
25
+ rake db:migrate
26
+
27
+ ## Screenshots
28
+ ![Screenshot structure](https://s3-eu-west-1.amazonaws.com/constructorcms/screenshot_structure_0.5.3.png)
29
+
30
+ ## Copyright
31
+ Copyright © 2012—2013 Ivan Zotov. See [LICENSE][] for details.
32
+
33
+ [license]: LICENSE.md
34
+
35
+
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ Bundler::GemHelper.install_tasks
9
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
10
+ load 'rails/tasks/engine.rake'
11
+ require 'rspec/core/rake_task'
12
+
13
+ Dir[File.expand_path('../tasks/**/*', __FILE__)].each {|task| load task}
14
+
15
+ RSpec::Core::RakeTask.new(:spec) do |t|
16
+ t.pattern = './**/*_spec.rb'
17
+ end
18
+
19
+ task :default => :spec
data/bin/rails ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/constructor-cms/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
data/config.ru ADDED
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require File.expand_path('../spec/dummy/config/environment', __FILE__)
4
+ run Dummy::Application
data/config/routes.rb CHANGED
@@ -1,27 +1,4 @@
1
- ConstructorPages::Engine.routes.draw do
2
- scope '/admin' do
3
- resources :pages, except: [:show]
4
- resources :templates, except: [:show]
5
- resources :fields, except: [:show, :new, :edit]
6
-
7
- %w{page template field}.each do |c|
8
- %w{up down}.each do |d|
9
- get "#{c.pluralize}/move/#{d}/:id" => "#{c.pluralize}#move_#{d}", as: "#{c}_move_#{d}"
10
- end
11
- end
12
-
13
- scope '/fields' do
14
- get ':template_id/new/' => 'fields#new', as: :new_field
15
- get ':id/:template_id/edit/' => 'fields#edit', as: :edit_field
16
- end
17
-
18
- scope '/pages' do
19
- get ':page/new' => 'pages#new', as: :new_child_page
20
- end
21
- end
22
-
23
- root :to => 'pages#show'
24
- get '*all/search/:what_search' => 'pages#search', format: false
25
- get '*all.:format' => 'pages#show'
26
- get '*all' => 'pages#show'
27
- end
1
+ Rails.application.routes.draw do
2
+ mount ConstructorCore::Engine => '/', :as => :core
3
+ mount ConstructorPages::Engine => '/', :as => :pages
4
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../core/lib/constructor_core/version', __FILE__)
4
+
5
+ Gem::Specification.new do |s|
6
+ s.platform = Gem::Platform::RUBY
7
+ s.name = %q{constructor-cms}
8
+ s.version = ConstructorCore::VERSION
9
+ s.summary = %q{ConstructorCms}
10
+ s.authors = ['Ivan Zotov']
11
+ s.require_paths = %w(lib)
12
+ s.email = 'ivanzotov@gmail.com'
13
+ s.homepage = 'http://ivanzotov.github.com/constructor'
14
+ s.description = 'Constructor – content management system'
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- spec/*`.split("\n")
18
+
19
+ s.add_dependency 'constructor-core', ConstructorCore::VERSION
20
+ s.add_dependency 'constructor-pages', ConstructorCore::VERSION
21
+
22
+ s.add_development_dependency 'rspec-rails', '~> 2.12'
23
+ s.add_development_dependency 'database_cleaner'
24
+ s.add_development_dependency 'capybara'
25
+ s.add_development_dependency 'launchy'
26
+ end
@@ -0,0 +1,52 @@
1
+ #= require constructor_core/jquery_bundle
2
+ #= require constructor_core/bootstrap
3
+ #= require ckeditor/ckeditor
4
+ #= require constructor_core/urlify
5
+ #= require_self
6
+
7
+ $(document).ready ->
8
+ $(".alert").alert()
9
+ $(".collapse").collapse()
10
+
11
+ $('#url-if-empty').popover({
12
+ offset: 10
13
+ })
14
+
15
+ $('.auto_url').hide()
16
+ $('#page_url').hide()
17
+
18
+ auto_url = $('#page_auto_url').is(':checked')
19
+
20
+ unless auto_url
21
+ auto_url_true()
22
+
23
+ $('#page_name').keyup -> $('.address').html(parameterize())
24
+ $('#page_parent_id').change ->
25
+ parent_full_url = $('#page_parent_id option:selected').data('full_url')
26
+ if parent_full_url
27
+ $('.path').html(parent_full_url)
28
+ else
29
+ $('.path').html('')
30
+
31
+ $('.address, .address_icon').click ->
32
+ if $('#page_auto_url').is(':checked') == true
33
+ $('#page_url').prop('value', parameterize())
34
+ auto_url_true()
35
+ else
36
+ $('.address').html(parameterize())
37
+ auto_url_false()
38
+
39
+ auto_url_true = ->
40
+ $('#page_url').show()
41
+ $('#page_auto_url').prop('checked', false)
42
+ $('.address_icon').addClass('icon-remove').removeClass('icon-pencil')
43
+ $('.address').hide()
44
+
45
+ auto_url_false = ->
46
+ $('#page_url').hide()
47
+ $('#page_auto_url').prop('checked', true)
48
+ $('.address_icon').addClass('icon-pencil').removeClass('icon-remove')
49
+ $('.address').show()
50
+
51
+ parameterize = ->
52
+ URLify($('#page_name').prop('value'))
@@ -0,0 +1,2276 @@
1
+ /* ===================================================
2
+ * bootstrap-transition.js v2.3.1
3
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
4
+ * ===================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+ !function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27
+ * ======================================================= */
28
+
29
+ $(function () {
30
+
31
+ $.support.transition = (function () {
32
+
33
+ var transitionEnd = (function () {
34
+
35
+ var el = document.createElement('bootstrap')
36
+ , transEndEventNames = {
37
+ 'WebkitTransition' : 'webkitTransitionEnd'
38
+ , 'MozTransition' : 'transitionend'
39
+ , 'OTransition' : 'oTransitionEnd otransitionend'
40
+ , 'transition' : 'transitionend'
41
+ }
42
+ , name
43
+
44
+ for (name in transEndEventNames){
45
+ if (el.style[name] !== undefined) {
46
+ return transEndEventNames[name]
47
+ }
48
+ }
49
+
50
+ }())
51
+
52
+ return transitionEnd && {
53
+ end: transitionEnd
54
+ }
55
+
56
+ })()
57
+
58
+ })
59
+
60
+ }(window.jQuery);/* ==========================================================
61
+ * bootstrap-alert.js v2.3.1
62
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
63
+ * ==========================================================
64
+ * Copyright 2012 Twitter, Inc.
65
+ *
66
+ * Licensed under the Apache License, Version 2.0 (the "License");
67
+ * you may not use this file except in compliance with the License.
68
+ * You may obtain a copy of the License at
69
+ *
70
+ * http://www.apache.org/licenses/LICENSE-2.0
71
+ *
72
+ * Unless required by applicable law or agreed to in writing, software
73
+ * distributed under the License is distributed on an "AS IS" BASIS,
74
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75
+ * See the License for the specific language governing permissions and
76
+ * limitations under the License.
77
+ * ========================================================== */
78
+
79
+
80
+ !function ($) {
81
+
82
+ "use strict"; // jshint ;_;
83
+
84
+
85
+ /* ALERT CLASS DEFINITION
86
+ * ====================== */
87
+
88
+ var dismiss = '[data-dismiss="alert"]'
89
+ , Alert = function (el) {
90
+ $(el).on('click', dismiss, this.close)
91
+ }
92
+
93
+ Alert.prototype.close = function (e) {
94
+ var $this = $(this)
95
+ , selector = $this.attr('data-target')
96
+ , $parent
97
+
98
+ if (!selector) {
99
+ selector = $this.attr('href')
100
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
101
+ }
102
+
103
+ $parent = $(selector)
104
+
105
+ e && e.preventDefault()
106
+
107
+ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
108
+
109
+ $parent.trigger(e = $.Event('close'))
110
+
111
+ if (e.isDefaultPrevented()) return
112
+
113
+ $parent.removeClass('in')
114
+
115
+ function removeElement() {
116
+ $parent
117
+ .trigger('closed')
118
+ .remove()
119
+ }
120
+
121
+ $.support.transition && $parent.hasClass('fade') ?
122
+ $parent.on($.support.transition.end, removeElement) :
123
+ removeElement()
124
+ }
125
+
126
+
127
+ /* ALERT PLUGIN DEFINITION
128
+ * ======================= */
129
+
130
+ var old = $.fn.alert
131
+
132
+ $.fn.alert = function (option) {
133
+ return this.each(function () {
134
+ var $this = $(this)
135
+ , data = $this.data('alert')
136
+ if (!data) $this.data('alert', (data = new Alert(this)))
137
+ if (typeof option == 'string') data[option].call($this)
138
+ })
139
+ }
140
+
141
+ $.fn.alert.Constructor = Alert
142
+
143
+
144
+ /* ALERT NO CONFLICT
145
+ * ================= */
146
+
147
+ $.fn.alert.noConflict = function () {
148
+ $.fn.alert = old
149
+ return this
150
+ }
151
+
152
+
153
+ /* ALERT DATA-API
154
+ * ============== */
155
+
156
+ $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
157
+
158
+ }(window.jQuery);/* ============================================================
159
+ * bootstrap-button.js v2.3.1
160
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
161
+ * ============================================================
162
+ * Copyright 2012 Twitter, Inc.
163
+ *
164
+ * Licensed under the Apache License, Version 2.0 (the "License");
165
+ * you may not use this file except in compliance with the License.
166
+ * You may obtain a copy of the License at
167
+ *
168
+ * http://www.apache.org/licenses/LICENSE-2.0
169
+ *
170
+ * Unless required by applicable law or agreed to in writing, software
171
+ * distributed under the License is distributed on an "AS IS" BASIS,
172
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
173
+ * See the License for the specific language governing permissions and
174
+ * limitations under the License.
175
+ * ============================================================ */
176
+
177
+
178
+ !function ($) {
179
+
180
+ "use strict"; // jshint ;_;
181
+
182
+
183
+ /* BUTTON PUBLIC CLASS DEFINITION
184
+ * ============================== */
185
+
186
+ var Button = function (element, options) {
187
+ this.$element = $(element)
188
+ this.options = $.extend({}, $.fn.button.defaults, options)
189
+ }
190
+
191
+ Button.prototype.setState = function (state) {
192
+ var d = 'disabled'
193
+ , $el = this.$element
194
+ , data = $el.data()
195
+ , val = $el.is('input') ? 'val' : 'html'
196
+
197
+ state = state + 'Text'
198
+ data.resetText || $el.data('resetText', $el[val]())
199
+
200
+ $el[val](data[state] || this.options[state])
201
+
202
+ // push to event loop to allow forms to submit
203
+ setTimeout(function () {
204
+ state == 'loadingText' ?
205
+ $el.addClass(d).attr(d, d) :
206
+ $el.removeClass(d).removeAttr(d)
207
+ }, 0)
208
+ }
209
+
210
+ Button.prototype.toggle = function () {
211
+ var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
212
+
213
+ $parent && $parent
214
+ .find('.active')
215
+ .removeClass('active')
216
+
217
+ this.$element.toggleClass('active')
218
+ }
219
+
220
+
221
+ /* BUTTON PLUGIN DEFINITION
222
+ * ======================== */
223
+
224
+ var old = $.fn.button
225
+
226
+ $.fn.button = function (option) {
227
+ return this.each(function () {
228
+ var $this = $(this)
229
+ , data = $this.data('button')
230
+ , options = typeof option == 'object' && option
231
+ if (!data) $this.data('button', (data = new Button(this, options)))
232
+ if (option == 'toggle') data.toggle()
233
+ else if (option) data.setState(option)
234
+ })
235
+ }
236
+
237
+ $.fn.button.defaults = {
238
+ loadingText: 'loading...'
239
+ }
240
+
241
+ $.fn.button.Constructor = Button
242
+
243
+
244
+ /* BUTTON NO CONFLICT
245
+ * ================== */
246
+
247
+ $.fn.button.noConflict = function () {
248
+ $.fn.button = old
249
+ return this
250
+ }
251
+
252
+
253
+ /* BUTTON DATA-API
254
+ * =============== */
255
+
256
+ $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
257
+ var $btn = $(e.target)
258
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
259
+ $btn.button('toggle')
260
+ })
261
+
262
+ }(window.jQuery);/* ==========================================================
263
+ * bootstrap-carousel.js v2.3.1
264
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
265
+ * ==========================================================
266
+ * Copyright 2012 Twitter, Inc.
267
+ *
268
+ * Licensed under the Apache License, Version 2.0 (the "License");
269
+ * you may not use this file except in compliance with the License.
270
+ * You may obtain a copy of the License at
271
+ *
272
+ * http://www.apache.org/licenses/LICENSE-2.0
273
+ *
274
+ * Unless required by applicable law or agreed to in writing, software
275
+ * distributed under the License is distributed on an "AS IS" BASIS,
276
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
277
+ * See the License for the specific language governing permissions and
278
+ * limitations under the License.
279
+ * ========================================================== */
280
+
281
+
282
+ !function ($) {
283
+
284
+ "use strict"; // jshint ;_;
285
+
286
+
287
+ /* CAROUSEL CLASS DEFINITION
288
+ * ========================= */
289
+
290
+ var Carousel = function (element, options) {
291
+ this.$element = $(element)
292
+ this.$indicators = this.$element.find('.carousel-indicators')
293
+ this.options = options
294
+ this.options.pause == 'hover' && this.$element
295
+ .on('mouseenter', $.proxy(this.pause, this))
296
+ .on('mouseleave', $.proxy(this.cycle, this))
297
+ }
298
+
299
+ Carousel.prototype = {
300
+
301
+ cycle: function (e) {
302
+ if (!e) this.paused = false
303
+ if (this.interval) clearInterval(this.interval);
304
+ this.options.interval
305
+ && !this.paused
306
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
307
+ return this
308
+ }
309
+
310
+ , getActiveIndex: function () {
311
+ this.$active = this.$element.find('.item.active')
312
+ this.$items = this.$active.parent().children()
313
+ return this.$items.index(this.$active)
314
+ }
315
+
316
+ , to: function (pos) {
317
+ var activeIndex = this.getActiveIndex()
318
+ , that = this
319
+
320
+ if (pos > (this.$items.length - 1) || pos < 0) return
321
+
322
+ if (this.sliding) {
323
+ return this.$element.one('slid', function () {
324
+ that.to(pos)
325
+ })
326
+ }
327
+
328
+ if (activeIndex == pos) {
329
+ return this.pause().cycle()
330
+ }
331
+
332
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
333
+ }
334
+
335
+ , pause: function (e) {
336
+ if (!e) this.paused = true
337
+ if (this.$element.find('.next, .prev').length && $.support.transition.end) {
338
+ this.$element.trigger($.support.transition.end)
339
+ this.cycle(true)
340
+ }
341
+ clearInterval(this.interval)
342
+ this.interval = null
343
+ return this
344
+ }
345
+
346
+ , next: function () {
347
+ if (this.sliding) return
348
+ return this.slide('next')
349
+ }
350
+
351
+ , prev: function () {
352
+ if (this.sliding) return
353
+ return this.slide('prev')
354
+ }
355
+
356
+ , slide: function (type, next) {
357
+ var $active = this.$element.find('.item.active')
358
+ , $next = next || $active[type]()
359
+ , isCycling = this.interval
360
+ , direction = type == 'next' ? 'left' : 'right'
361
+ , fallback = type == 'next' ? 'first' : 'last'
362
+ , that = this
363
+ , e
364
+
365
+ this.sliding = true
366
+
367
+ isCycling && this.pause()
368
+
369
+ $next = $next.length ? $next : this.$element.find('.item')[fallback]()
370
+
371
+ e = $.Event('slide', {
372
+ relatedTarget: $next[0]
373
+ , direction: direction
374
+ })
375
+
376
+ if ($next.hasClass('active')) return
377
+
378
+ if (this.$indicators.length) {
379
+ this.$indicators.find('.active').removeClass('active')
380
+ this.$element.one('slid', function () {
381
+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
382
+ $nextIndicator && $nextIndicator.addClass('active')
383
+ })
384
+ }
385
+
386
+ if ($.support.transition && this.$element.hasClass('slide')) {
387
+ this.$element.trigger(e)
388
+ if (e.isDefaultPrevented()) return
389
+ $next.addClass(type)
390
+ $next[0].offsetWidth // force reflow
391
+ $active.addClass(direction)
392
+ $next.addClass(direction)
393
+ this.$element.one($.support.transition.end, function () {
394
+ $next.removeClass([type, direction].join(' ')).addClass('active')
395
+ $active.removeClass(['active', direction].join(' '))
396
+ that.sliding = false
397
+ setTimeout(function () { that.$element.trigger('slid') }, 0)
398
+ })
399
+ } else {
400
+ this.$element.trigger(e)
401
+ if (e.isDefaultPrevented()) return
402
+ $active.removeClass('active')
403
+ $next.addClass('active')
404
+ this.sliding = false
405
+ this.$element.trigger('slid')
406
+ }
407
+
408
+ isCycling && this.cycle()
409
+
410
+ return this
411
+ }
412
+
413
+ }
414
+
415
+
416
+ /* CAROUSEL PLUGIN DEFINITION
417
+ * ========================== */
418
+
419
+ var old = $.fn.carousel
420
+
421
+ $.fn.carousel = function (option) {
422
+ return this.each(function () {
423
+ var $this = $(this)
424
+ , data = $this.data('carousel')
425
+ , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
426
+ , action = typeof option == 'string' ? option : options.slide
427
+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))
428
+ if (typeof option == 'number') data.to(option)
429
+ else if (action) data[action]()
430
+ else if (options.interval) data.pause().cycle()
431
+ })
432
+ }
433
+
434
+ $.fn.carousel.defaults = {
435
+ interval: 5000
436
+ , pause: 'hover'
437
+ }
438
+
439
+ $.fn.carousel.Constructor = Carousel
440
+
441
+
442
+ /* CAROUSEL NO CONFLICT
443
+ * ==================== */
444
+
445
+ $.fn.carousel.noConflict = function () {
446
+ $.fn.carousel = old
447
+ return this
448
+ }
449
+
450
+ /* CAROUSEL DATA-API
451
+ * ================= */
452
+
453
+ $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
454
+ var $this = $(this), href
455
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
456
+ , options = $.extend({}, $target.data(), $this.data())
457
+ , slideIndex
458
+
459
+ $target.carousel(options)
460
+
461
+ if (slideIndex = $this.attr('data-slide-to')) {
462
+ $target.data('carousel').pause().to(slideIndex).cycle()
463
+ }
464
+
465
+ e.preventDefault()
466
+ })
467
+
468
+ }(window.jQuery);/* =============================================================
469
+ * bootstrap-collapse.js v2.3.1
470
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
471
+ * =============================================================
472
+ * Copyright 2012 Twitter, Inc.
473
+ *
474
+ * Licensed under the Apache License, Version 2.0 (the "License");
475
+ * you may not use this file except in compliance with the License.
476
+ * You may obtain a copy of the License at
477
+ *
478
+ * http://www.apache.org/licenses/LICENSE-2.0
479
+ *
480
+ * Unless required by applicable law or agreed to in writing, software
481
+ * distributed under the License is distributed on an "AS IS" BASIS,
482
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
483
+ * See the License for the specific language governing permissions and
484
+ * limitations under the License.
485
+ * ============================================================ */
486
+
487
+
488
+ !function ($) {
489
+
490
+ "use strict"; // jshint ;_;
491
+
492
+
493
+ /* COLLAPSE PUBLIC CLASS DEFINITION
494
+ * ================================ */
495
+
496
+ var Collapse = function (element, options) {
497
+ this.$element = $(element)
498
+ this.options = $.extend({}, $.fn.collapse.defaults, options)
499
+
500
+ if (this.options.parent) {
501
+ this.$parent = $(this.options.parent)
502
+ }
503
+
504
+ this.options.toggle && this.toggle()
505
+ }
506
+
507
+ Collapse.prototype = {
508
+
509
+ constructor: Collapse
510
+
511
+ , dimension: function () {
512
+ var hasWidth = this.$element.hasClass('width')
513
+ return hasWidth ? 'width' : 'height'
514
+ }
515
+
516
+ , show: function () {
517
+ var dimension
518
+ , scroll
519
+ , actives
520
+ , hasData
521
+
522
+ if (this.transitioning || this.$element.hasClass('in')) return
523
+
524
+ dimension = this.dimension()
525
+ scroll = $.camelCase(['scroll', dimension].join('-'))
526
+ actives = this.$parent && this.$parent.find('> .accordion-group > .in')
527
+
528
+ if (actives && actives.length) {
529
+ hasData = actives.data('collapse')
530
+ if (hasData && hasData.transitioning) return
531
+ actives.collapse('hide')
532
+ hasData || actives.data('collapse', null)
533
+ }
534
+
535
+ this.$element[dimension](0)
536
+ this.transition('addClass', $.Event('show'), 'shown')
537
+ $.support.transition && this.$element[dimension](this.$element[0][scroll])
538
+ }
539
+
540
+ , hide: function () {
541
+ var dimension
542
+ if (this.transitioning || !this.$element.hasClass('in')) return
543
+ dimension = this.dimension()
544
+ this.reset(this.$element[dimension]())
545
+ this.transition('removeClass', $.Event('hide'), 'hidden')
546
+ this.$element[dimension](0)
547
+ }
548
+
549
+ , reset: function (size) {
550
+ var dimension = this.dimension()
551
+
552
+ this.$element
553
+ .removeClass('collapse')
554
+ [dimension](size || 'auto')
555
+ [0].offsetWidth
556
+
557
+ this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
558
+
559
+ return this
560
+ }
561
+
562
+ , transition: function (method, startEvent, completeEvent) {
563
+ var that = this
564
+ , complete = function () {
565
+ if (startEvent.type == 'show') that.reset()
566
+ that.transitioning = 0
567
+ that.$element.trigger(completeEvent)
568
+ }
569
+
570
+ this.$element.trigger(startEvent)
571
+
572
+ if (startEvent.isDefaultPrevented()) return
573
+
574
+ this.transitioning = 1
575
+
576
+ this.$element[method]('in')
577
+
578
+ $.support.transition && this.$element.hasClass('collapse') ?
579
+ this.$element.one($.support.transition.end, complete) :
580
+ complete()
581
+ }
582
+
583
+ , toggle: function () {
584
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
585
+ }
586
+
587
+ }
588
+
589
+
590
+ /* COLLAPSE PLUGIN DEFINITION
591
+ * ========================== */
592
+
593
+ var old = $.fn.collapse
594
+
595
+ $.fn.collapse = function (option) {
596
+ return this.each(function () {
597
+ var $this = $(this)
598
+ , data = $this.data('collapse')
599
+ , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
600
+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))
601
+ if (typeof option == 'string') data[option]()
602
+ })
603
+ }
604
+
605
+ $.fn.collapse.defaults = {
606
+ toggle: true
607
+ }
608
+
609
+ $.fn.collapse.Constructor = Collapse
610
+
611
+
612
+ /* COLLAPSE NO CONFLICT
613
+ * ==================== */
614
+
615
+ $.fn.collapse.noConflict = function () {
616
+ $.fn.collapse = old
617
+ return this
618
+ }
619
+
620
+
621
+ /* COLLAPSE DATA-API
622
+ * ================= */
623
+
624
+ $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
625
+ var $this = $(this), href
626
+ , target = $this.attr('data-target')
627
+ || e.preventDefault()
628
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
629
+ , option = $(target).data('collapse') ? 'toggle' : $this.data()
630
+ $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
631
+ $(target).collapse(option)
632
+ })
633
+
634
+ }(window.jQuery);/* ============================================================
635
+ * bootstrap-dropdown.js v2.3.1
636
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
637
+ * ============================================================
638
+ * Copyright 2012 Twitter, Inc.
639
+ *
640
+ * Licensed under the Apache License, Version 2.0 (the "License");
641
+ * you may not use this file except in compliance with the License.
642
+ * You may obtain a copy of the License at
643
+ *
644
+ * http://www.apache.org/licenses/LICENSE-2.0
645
+ *
646
+ * Unless required by applicable law or agreed to in writing, software
647
+ * distributed under the License is distributed on an "AS IS" BASIS,
648
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
649
+ * See the License for the specific language governing permissions and
650
+ * limitations under the License.
651
+ * ============================================================ */
652
+
653
+
654
+ !function ($) {
655
+
656
+ "use strict"; // jshint ;_;
657
+
658
+
659
+ /* DROPDOWN CLASS DEFINITION
660
+ * ========================= */
661
+
662
+ var toggle = '[data-toggle=dropdown]'
663
+ , Dropdown = function (element) {
664
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
665
+ $('html').on('click.dropdown.data-api', function () {
666
+ $el.parent().removeClass('open')
667
+ })
668
+ }
669
+
670
+ Dropdown.prototype = {
671
+
672
+ constructor: Dropdown
673
+
674
+ , toggle: function (e) {
675
+ var $this = $(this)
676
+ , $parent
677
+ , isActive
678
+
679
+ if ($this.is('.disabled, :disabled')) return
680
+
681
+ $parent = getParent($this)
682
+
683
+ isActive = $parent.hasClass('open')
684
+
685
+ clearMenus()
686
+
687
+ if (!isActive) {
688
+ $parent.toggleClass('open')
689
+ }
690
+
691
+ $this.focus()
692
+
693
+ return false
694
+ }
695
+
696
+ , keydown: function (e) {
697
+ var $this
698
+ , $items
699
+ , $active
700
+ , $parent
701
+ , isActive
702
+ , index
703
+
704
+ if (!/(38|40|27)/.test(e.keyCode)) return
705
+
706
+ $this = $(this)
707
+
708
+ e.preventDefault()
709
+ e.stopPropagation()
710
+
711
+ if ($this.is('.disabled, :disabled')) return
712
+
713
+ $parent = getParent($this)
714
+
715
+ isActive = $parent.hasClass('open')
716
+
717
+ if (!isActive || (isActive && e.keyCode == 27)) {
718
+ if (e.which == 27) $parent.find(toggle).focus()
719
+ return $this.click()
720
+ }
721
+
722
+ $items = $('[role=menu] li:not(.divider):visible a', $parent)
723
+
724
+ if (!$items.length) return
725
+
726
+ index = $items.index($items.filter(':focus'))
727
+
728
+ if (e.keyCode == 38 && index > 0) index-- // up
729
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
730
+ if (!~index) index = 0
731
+
732
+ $items
733
+ .eq(index)
734
+ .focus()
735
+ }
736
+
737
+ }
738
+
739
+ function clearMenus() {
740
+ $(toggle).each(function () {
741
+ getParent($(this)).removeClass('open')
742
+ })
743
+ }
744
+
745
+ function getParent($this) {
746
+ var selector = $this.attr('data-target')
747
+ , $parent
748
+
749
+ if (!selector) {
750
+ selector = $this.attr('href')
751
+ selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
752
+ }
753
+
754
+ $parent = selector && $(selector)
755
+
756
+ if (!$parent || !$parent.length) $parent = $this.parent()
757
+
758
+ return $parent
759
+ }
760
+
761
+
762
+ /* DROPDOWN PLUGIN DEFINITION
763
+ * ========================== */
764
+
765
+ var old = $.fn.dropdown
766
+
767
+ $.fn.dropdown = function (option) {
768
+ return this.each(function () {
769
+ var $this = $(this)
770
+ , data = $this.data('dropdown')
771
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
772
+ if (typeof option == 'string') data[option].call($this)
773
+ })
774
+ }
775
+
776
+ $.fn.dropdown.Constructor = Dropdown
777
+
778
+
779
+ /* DROPDOWN NO CONFLICT
780
+ * ==================== */
781
+
782
+ $.fn.dropdown.noConflict = function () {
783
+ $.fn.dropdown = old
784
+ return this
785
+ }
786
+
787
+
788
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
789
+ * =================================== */
790
+
791
+ $(document)
792
+ .on('click.dropdown.data-api', clearMenus)
793
+ .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
794
+ .on('click.dropdown-menu', function (e) { e.stopPropagation() })
795
+ .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
796
+ .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
797
+
798
+ }(window.jQuery);
799
+ /* =========================================================
800
+ * bootstrap-modal.js v2.3.1
801
+ * http://twitter.github.com/bootstrap/javascript.html#modals
802
+ * =========================================================
803
+ * Copyright 2012 Twitter, Inc.
804
+ *
805
+ * Licensed under the Apache License, Version 2.0 (the "License");
806
+ * you may not use this file except in compliance with the License.
807
+ * You may obtain a copy of the License at
808
+ *
809
+ * http://www.apache.org/licenses/LICENSE-2.0
810
+ *
811
+ * Unless required by applicable law or agreed to in writing, software
812
+ * distributed under the License is distributed on an "AS IS" BASIS,
813
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
814
+ * See the License for the specific language governing permissions and
815
+ * limitations under the License.
816
+ * ========================================================= */
817
+
818
+
819
+ !function ($) {
820
+
821
+ "use strict"; // jshint ;_;
822
+
823
+
824
+ /* MODAL CLASS DEFINITION
825
+ * ====================== */
826
+
827
+ var Modal = function (element, options) {
828
+ this.options = options
829
+ this.$element = $(element)
830
+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
831
+ this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
832
+ }
833
+
834
+ Modal.prototype = {
835
+
836
+ constructor: Modal
837
+
838
+ , toggle: function () {
839
+ return this[!this.isShown ? 'show' : 'hide']()
840
+ }
841
+
842
+ , show: function () {
843
+ var that = this
844
+ , e = $.Event('show')
845
+
846
+ this.$element.trigger(e)
847
+
848
+ if (this.isShown || e.isDefaultPrevented()) return
849
+
850
+ this.isShown = true
851
+
852
+ this.escape()
853
+
854
+ this.backdrop(function () {
855
+ var transition = $.support.transition && that.$element.hasClass('fade')
856
+
857
+ if (!that.$element.parent().length) {
858
+ that.$element.appendTo(document.body) //don't move modals dom position
859
+ }
860
+
861
+ that.$element.show()
862
+
863
+ if (transition) {
864
+ that.$element[0].offsetWidth // force reflow
865
+ }
866
+
867
+ that.$element
868
+ .addClass('in')
869
+ .attr('aria-hidden', false)
870
+
871
+ that.enforceFocus()
872
+
873
+ transition ?
874
+ that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
875
+ that.$element.focus().trigger('shown')
876
+
877
+ })
878
+ }
879
+
880
+ , hide: function (e) {
881
+ e && e.preventDefault()
882
+
883
+ var that = this
884
+
885
+ e = $.Event('hide')
886
+
887
+ this.$element.trigger(e)
888
+
889
+ if (!this.isShown || e.isDefaultPrevented()) return
890
+
891
+ this.isShown = false
892
+
893
+ this.escape()
894
+
895
+ $(document).off('focusin.modal')
896
+
897
+ this.$element
898
+ .removeClass('in')
899
+ .attr('aria-hidden', true)
900
+
901
+ $.support.transition && this.$element.hasClass('fade') ?
902
+ this.hideWithTransition() :
903
+ this.hideModal()
904
+ }
905
+
906
+ , enforceFocus: function () {
907
+ var that = this
908
+ $(document).on('focusin.modal', function (e) {
909
+ if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
910
+ that.$element.focus()
911
+ }
912
+ })
913
+ }
914
+
915
+ , escape: function () {
916
+ var that = this
917
+ if (this.isShown && this.options.keyboard) {
918
+ this.$element.on('keyup.dismiss.modal', function ( e ) {
919
+ e.which == 27 && that.hide()
920
+ })
921
+ } else if (!this.isShown) {
922
+ this.$element.off('keyup.dismiss.modal')
923
+ }
924
+ }
925
+
926
+ , hideWithTransition: function () {
927
+ var that = this
928
+ , timeout = setTimeout(function () {
929
+ that.$element.off($.support.transition.end)
930
+ that.hideModal()
931
+ }, 500)
932
+
933
+ this.$element.one($.support.transition.end, function () {
934
+ clearTimeout(timeout)
935
+ that.hideModal()
936
+ })
937
+ }
938
+
939
+ , hideModal: function () {
940
+ var that = this
941
+ this.$element.hide()
942
+ this.backdrop(function () {
943
+ that.removeBackdrop()
944
+ that.$element.trigger('hidden')
945
+ })
946
+ }
947
+
948
+ , removeBackdrop: function () {
949
+ this.$backdrop && this.$backdrop.remove()
950
+ this.$backdrop = null
951
+ }
952
+
953
+ , backdrop: function (callback) {
954
+ var that = this
955
+ , animate = this.$element.hasClass('fade') ? 'fade' : ''
956
+
957
+ if (this.isShown && this.options.backdrop) {
958
+ var doAnimate = $.support.transition && animate
959
+
960
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
961
+ .appendTo(document.body)
962
+
963
+ this.$backdrop.click(
964
+ this.options.backdrop == 'static' ?
965
+ $.proxy(this.$element[0].focus, this.$element[0])
966
+ : $.proxy(this.hide, this)
967
+ )
968
+
969
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
970
+
971
+ this.$backdrop.addClass('in')
972
+
973
+ if (!callback) return
974
+
975
+ doAnimate ?
976
+ this.$backdrop.one($.support.transition.end, callback) :
977
+ callback()
978
+
979
+ } else if (!this.isShown && this.$backdrop) {
980
+ this.$backdrop.removeClass('in')
981
+
982
+ $.support.transition && this.$element.hasClass('fade')?
983
+ this.$backdrop.one($.support.transition.end, callback) :
984
+ callback()
985
+
986
+ } else if (callback) {
987
+ callback()
988
+ }
989
+ }
990
+ }
991
+
992
+
993
+ /* MODAL PLUGIN DEFINITION
994
+ * ======================= */
995
+
996
+ var old = $.fn.modal
997
+
998
+ $.fn.modal = function (option) {
999
+ return this.each(function () {
1000
+ var $this = $(this)
1001
+ , data = $this.data('modal')
1002
+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
1003
+ if (!data) $this.data('modal', (data = new Modal(this, options)))
1004
+ if (typeof option == 'string') data[option]()
1005
+ else if (options.show) data.show()
1006
+ })
1007
+ }
1008
+
1009
+ $.fn.modal.defaults = {
1010
+ backdrop: true
1011
+ , keyboard: true
1012
+ , show: true
1013
+ }
1014
+
1015
+ $.fn.modal.Constructor = Modal
1016
+
1017
+
1018
+ /* MODAL NO CONFLICT
1019
+ * ================= */
1020
+
1021
+ $.fn.modal.noConflict = function () {
1022
+ $.fn.modal = old
1023
+ return this
1024
+ }
1025
+
1026
+
1027
+ /* MODAL DATA-API
1028
+ * ============== */
1029
+
1030
+ $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
1031
+ var $this = $(this)
1032
+ , href = $this.attr('href')
1033
+ , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1034
+ , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
1035
+
1036
+ e.preventDefault()
1037
+
1038
+ $target
1039
+ .modal(option)
1040
+ .one('hide', function () {
1041
+ $this.focus()
1042
+ })
1043
+ })
1044
+
1045
+ }(window.jQuery);
1046
+ /* ===========================================================
1047
+ * bootstrap-tooltip.js v2.3.1
1048
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
1049
+ * Inspired by the original jQuery.tipsy by Jason Frame
1050
+ * ===========================================================
1051
+ * Copyright 2012 Twitter, Inc.
1052
+ *
1053
+ * Licensed under the Apache License, Version 2.0 (the "License");
1054
+ * you may not use this file except in compliance with the License.
1055
+ * You may obtain a copy of the License at
1056
+ *
1057
+ * http://www.apache.org/licenses/LICENSE-2.0
1058
+ *
1059
+ * Unless required by applicable law or agreed to in writing, software
1060
+ * distributed under the License is distributed on an "AS IS" BASIS,
1061
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1062
+ * See the License for the specific language governing permissions and
1063
+ * limitations under the License.
1064
+ * ========================================================== */
1065
+
1066
+
1067
+ !function ($) {
1068
+
1069
+ "use strict"; // jshint ;_;
1070
+
1071
+
1072
+ /* TOOLTIP PUBLIC CLASS DEFINITION
1073
+ * =============================== */
1074
+
1075
+ var Tooltip = function (element, options) {
1076
+ this.init('tooltip', element, options)
1077
+ }
1078
+
1079
+ Tooltip.prototype = {
1080
+
1081
+ constructor: Tooltip
1082
+
1083
+ , init: function (type, element, options) {
1084
+ var eventIn
1085
+ , eventOut
1086
+ , triggers
1087
+ , trigger
1088
+ , i
1089
+
1090
+ this.type = type
1091
+ this.$element = $(element)
1092
+ this.options = this.getOptions(options)
1093
+ this.enabled = true
1094
+
1095
+ triggers = this.options.trigger.split(' ')
1096
+
1097
+ for (i = triggers.length; i--;) {
1098
+ trigger = triggers[i]
1099
+ if (trigger == 'click') {
1100
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1101
+ } else if (trigger != 'manual') {
1102
+ eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
1103
+ eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
1104
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1105
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1106
+ }
1107
+ }
1108
+
1109
+ this.options.selector ?
1110
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1111
+ this.fixTitle()
1112
+ }
1113
+
1114
+ , getOptions: function (options) {
1115
+ options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
1116
+
1117
+ if (options.delay && typeof options.delay == 'number') {
1118
+ options.delay = {
1119
+ show: options.delay
1120
+ , hide: options.delay
1121
+ }
1122
+ }
1123
+
1124
+ return options
1125
+ }
1126
+
1127
+ , enter: function (e) {
1128
+ var defaults = $.fn[this.type].defaults
1129
+ , options = {}
1130
+ , self
1131
+
1132
+ this._options && $.each(this._options, function (key, value) {
1133
+ if (defaults[key] != value) options[key] = value
1134
+ }, this)
1135
+
1136
+ self = $(e.currentTarget)[this.type](options).data(this.type)
1137
+
1138
+ if (!self.options.delay || !self.options.delay.show) return self.show()
1139
+
1140
+ clearTimeout(this.timeout)
1141
+ self.hoverState = 'in'
1142
+ this.timeout = setTimeout(function() {
1143
+ if (self.hoverState == 'in') self.show()
1144
+ }, self.options.delay.show)
1145
+ }
1146
+
1147
+ , leave: function (e) {
1148
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1149
+
1150
+ if (this.timeout) clearTimeout(this.timeout)
1151
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
1152
+
1153
+ self.hoverState = 'out'
1154
+ this.timeout = setTimeout(function() {
1155
+ if (self.hoverState == 'out') self.hide()
1156
+ }, self.options.delay.hide)
1157
+ }
1158
+
1159
+ , show: function () {
1160
+ var $tip
1161
+ , pos
1162
+ , actualWidth
1163
+ , actualHeight
1164
+ , placement
1165
+ , tp
1166
+ , e = $.Event('show')
1167
+
1168
+ if (this.hasContent() && this.enabled) {
1169
+ this.$element.trigger(e)
1170
+ if (e.isDefaultPrevented()) return
1171
+ $tip = this.tip()
1172
+ this.setContent()
1173
+
1174
+ if (this.options.animation) {
1175
+ $tip.addClass('fade')
1176
+ }
1177
+
1178
+ placement = typeof this.options.placement == 'function' ?
1179
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
1180
+ this.options.placement
1181
+
1182
+ $tip
1183
+ .detach()
1184
+ .css({ top: 0, left: 0, display: 'block' })
1185
+
1186
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1187
+
1188
+ pos = this.getPosition()
1189
+
1190
+ actualWidth = $tip[0].offsetWidth
1191
+ actualHeight = $tip[0].offsetHeight
1192
+
1193
+ switch (placement) {
1194
+ case 'bottom':
1195
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
1196
+ break
1197
+ case 'top':
1198
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
1199
+ break
1200
+ case 'left':
1201
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
1202
+ break
1203
+ case 'right':
1204
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
1205
+ break
1206
+ }
1207
+
1208
+ this.applyPlacement(tp, placement)
1209
+ this.$element.trigger('shown')
1210
+ }
1211
+ }
1212
+
1213
+ , applyPlacement: function(offset, placement){
1214
+ var $tip = this.tip()
1215
+ , width = $tip[0].offsetWidth
1216
+ , height = $tip[0].offsetHeight
1217
+ , actualWidth
1218
+ , actualHeight
1219
+ , delta
1220
+ , replace
1221
+
1222
+ $tip
1223
+ .offset(offset)
1224
+ .addClass(placement)
1225
+ .addClass('in')
1226
+
1227
+ actualWidth = $tip[0].offsetWidth
1228
+ actualHeight = $tip[0].offsetHeight
1229
+
1230
+ if (placement == 'top' && actualHeight != height) {
1231
+ offset.top = offset.top + height - actualHeight
1232
+ replace = true
1233
+ }
1234
+
1235
+ if (placement == 'bottom' || placement == 'top') {
1236
+ delta = 0
1237
+
1238
+ if (offset.left < 0){
1239
+ delta = offset.left * -2
1240
+ offset.left = 0
1241
+ $tip.offset(offset)
1242
+ actualWidth = $tip[0].offsetWidth
1243
+ actualHeight = $tip[0].offsetHeight
1244
+ }
1245
+
1246
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
1247
+ } else {
1248
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
1249
+ }
1250
+
1251
+ if (replace) $tip.offset(offset)
1252
+ }
1253
+
1254
+ , replaceArrow: function(delta, dimension, position){
1255
+ this
1256
+ .arrow()
1257
+ .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
1258
+ }
1259
+
1260
+ , setContent: function () {
1261
+ var $tip = this.tip()
1262
+ , title = this.getTitle()
1263
+
1264
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1265
+ $tip.removeClass('fade in top bottom left right')
1266
+ }
1267
+
1268
+ , hide: function () {
1269
+ var that = this
1270
+ , $tip = this.tip()
1271
+ , e = $.Event('hide')
1272
+
1273
+ this.$element.trigger(e)
1274
+ if (e.isDefaultPrevented()) return
1275
+
1276
+ $tip.removeClass('in')
1277
+
1278
+ function removeWithAnimation() {
1279
+ var timeout = setTimeout(function () {
1280
+ $tip.off($.support.transition.end).detach()
1281
+ }, 500)
1282
+
1283
+ $tip.one($.support.transition.end, function () {
1284
+ clearTimeout(timeout)
1285
+ $tip.detach()
1286
+ })
1287
+ }
1288
+
1289
+ $.support.transition && this.$tip.hasClass('fade') ?
1290
+ removeWithAnimation() :
1291
+ $tip.detach()
1292
+
1293
+ this.$element.trigger('hidden')
1294
+
1295
+ return this
1296
+ }
1297
+
1298
+ , fixTitle: function () {
1299
+ var $e = this.$element
1300
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1301
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1302
+ }
1303
+ }
1304
+
1305
+ , hasContent: function () {
1306
+ return this.getTitle()
1307
+ }
1308
+
1309
+ , getPosition: function () {
1310
+ var el = this.$element[0]
1311
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
1312
+ width: el.offsetWidth
1313
+ , height: el.offsetHeight
1314
+ }, this.$element.offset())
1315
+ }
1316
+
1317
+ , getTitle: function () {
1318
+ var title
1319
+ , $e = this.$element
1320
+ , o = this.options
1321
+
1322
+ title = $e.attr('data-original-title')
1323
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1324
+
1325
+ return title
1326
+ }
1327
+
1328
+ , tip: function () {
1329
+ return this.$tip = this.$tip || $(this.options.template)
1330
+ }
1331
+
1332
+ , arrow: function(){
1333
+ return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
1334
+ }
1335
+
1336
+ , validate: function () {
1337
+ if (!this.$element[0].parentNode) {
1338
+ this.hide()
1339
+ this.$element = null
1340
+ this.options = null
1341
+ }
1342
+ }
1343
+
1344
+ , enable: function () {
1345
+ this.enabled = true
1346
+ }
1347
+
1348
+ , disable: function () {
1349
+ this.enabled = false
1350
+ }
1351
+
1352
+ , toggleEnabled: function () {
1353
+ this.enabled = !this.enabled
1354
+ }
1355
+
1356
+ , toggle: function (e) {
1357
+ var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
1358
+ self.tip().hasClass('in') ? self.hide() : self.show()
1359
+ }
1360
+
1361
+ , destroy: function () {
1362
+ this.hide().$element.off('.' + this.type).removeData(this.type)
1363
+ }
1364
+
1365
+ }
1366
+
1367
+
1368
+ /* TOOLTIP PLUGIN DEFINITION
1369
+ * ========================= */
1370
+
1371
+ var old = $.fn.tooltip
1372
+
1373
+ $.fn.tooltip = function ( option ) {
1374
+ return this.each(function () {
1375
+ var $this = $(this)
1376
+ , data = $this.data('tooltip')
1377
+ , options = typeof option == 'object' && option
1378
+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
1379
+ if (typeof option == 'string') data[option]()
1380
+ })
1381
+ }
1382
+
1383
+ $.fn.tooltip.Constructor = Tooltip
1384
+
1385
+ $.fn.tooltip.defaults = {
1386
+ animation: true
1387
+ , placement: 'top'
1388
+ , selector: false
1389
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1390
+ , trigger: 'hover focus'
1391
+ , title: ''
1392
+ , delay: 0
1393
+ , html: false
1394
+ , container: false
1395
+ }
1396
+
1397
+
1398
+ /* TOOLTIP NO CONFLICT
1399
+ * =================== */
1400
+
1401
+ $.fn.tooltip.noConflict = function () {
1402
+ $.fn.tooltip = old
1403
+ return this
1404
+ }
1405
+
1406
+ }(window.jQuery);
1407
+ /* ===========================================================
1408
+ * bootstrap-popover.js v2.3.1
1409
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
1410
+ * ===========================================================
1411
+ * Copyright 2012 Twitter, Inc.
1412
+ *
1413
+ * Licensed under the Apache License, Version 2.0 (the "License");
1414
+ * you may not use this file except in compliance with the License.
1415
+ * You may obtain a copy of the License at
1416
+ *
1417
+ * http://www.apache.org/licenses/LICENSE-2.0
1418
+ *
1419
+ * Unless required by applicable law or agreed to in writing, software
1420
+ * distributed under the License is distributed on an "AS IS" BASIS,
1421
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1422
+ * See the License for the specific language governing permissions and
1423
+ * limitations under the License.
1424
+ * =========================================================== */
1425
+
1426
+
1427
+ !function ($) {
1428
+
1429
+ "use strict"; // jshint ;_;
1430
+
1431
+
1432
+ /* POPOVER PUBLIC CLASS DEFINITION
1433
+ * =============================== */
1434
+
1435
+ var Popover = function (element, options) {
1436
+ this.init('popover', element, options)
1437
+ }
1438
+
1439
+
1440
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1441
+ ========================================== */
1442
+
1443
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1444
+
1445
+ constructor: Popover
1446
+
1447
+ , setContent: function () {
1448
+ var $tip = this.tip()
1449
+ , title = this.getTitle()
1450
+ , content = this.getContent()
1451
+
1452
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1453
+ $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
1454
+
1455
+ $tip.removeClass('fade top bottom left right in')
1456
+ }
1457
+
1458
+ , hasContent: function () {
1459
+ return this.getTitle() || this.getContent()
1460
+ }
1461
+
1462
+ , getContent: function () {
1463
+ var content
1464
+ , $e = this.$element
1465
+ , o = this.options
1466
+
1467
+ content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1468
+ || $e.attr('data-content')
1469
+
1470
+ return content
1471
+ }
1472
+
1473
+ , tip: function () {
1474
+ if (!this.$tip) {
1475
+ this.$tip = $(this.options.template)
1476
+ }
1477
+ return this.$tip
1478
+ }
1479
+
1480
+ , destroy: function () {
1481
+ this.hide().$element.off('.' + this.type).removeData(this.type)
1482
+ }
1483
+
1484
+ })
1485
+
1486
+
1487
+ /* POPOVER PLUGIN DEFINITION
1488
+ * ======================= */
1489
+
1490
+ var old = $.fn.popover
1491
+
1492
+ $.fn.popover = function (option) {
1493
+ return this.each(function () {
1494
+ var $this = $(this)
1495
+ , data = $this.data('popover')
1496
+ , options = typeof option == 'object' && option
1497
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
1498
+ if (typeof option == 'string') data[option]()
1499
+ })
1500
+ }
1501
+
1502
+ $.fn.popover.Constructor = Popover
1503
+
1504
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1505
+ placement: 'right'
1506
+ , trigger: 'click'
1507
+ , content: ''
1508
+ , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1509
+ })
1510
+
1511
+
1512
+ /* POPOVER NO CONFLICT
1513
+ * =================== */
1514
+
1515
+ $.fn.popover.noConflict = function () {
1516
+ $.fn.popover = old
1517
+ return this
1518
+ }
1519
+
1520
+ }(window.jQuery);
1521
+ /* =============================================================
1522
+ * bootstrap-scrollspy.js v2.3.1
1523
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1524
+ * =============================================================
1525
+ * Copyright 2012 Twitter, Inc.
1526
+ *
1527
+ * Licensed under the Apache License, Version 2.0 (the "License");
1528
+ * you may not use this file except in compliance with the License.
1529
+ * You may obtain a copy of the License at
1530
+ *
1531
+ * http://www.apache.org/licenses/LICENSE-2.0
1532
+ *
1533
+ * Unless required by applicable law or agreed to in writing, software
1534
+ * distributed under the License is distributed on an "AS IS" BASIS,
1535
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1536
+ * See the License for the specific language governing permissions and
1537
+ * limitations under the License.
1538
+ * ============================================================== */
1539
+
1540
+
1541
+ !function ($) {
1542
+
1543
+ "use strict"; // jshint ;_;
1544
+
1545
+
1546
+ /* SCROLLSPY CLASS DEFINITION
1547
+ * ========================== */
1548
+
1549
+ function ScrollSpy(element, options) {
1550
+ var process = $.proxy(this.process, this)
1551
+ , $element = $(element).is('body') ? $(window) : $(element)
1552
+ , href
1553
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1554
+ this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
1555
+ this.selector = (this.options.target
1556
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1557
+ || '') + ' .nav li > a'
1558
+ this.$body = $('body')
1559
+ this.refresh()
1560
+ this.process()
1561
+ }
1562
+
1563
+ ScrollSpy.prototype = {
1564
+
1565
+ constructor: ScrollSpy
1566
+
1567
+ , refresh: function () {
1568
+ var self = this
1569
+ , $targets
1570
+
1571
+ this.offsets = $([])
1572
+ this.targets = $([])
1573
+
1574
+ $targets = this.$body
1575
+ .find(this.selector)
1576
+ .map(function () {
1577
+ var $el = $(this)
1578
+ , href = $el.data('target') || $el.attr('href')
1579
+ , $href = /^#\w/.test(href) && $(href)
1580
+ return ( $href
1581
+ && $href.length
1582
+ && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
1583
+ })
1584
+ .sort(function (a, b) { return a[0] - b[0] })
1585
+ .each(function () {
1586
+ self.offsets.push(this[0])
1587
+ self.targets.push(this[1])
1588
+ })
1589
+ }
1590
+
1591
+ , process: function () {
1592
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1593
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1594
+ , maxScroll = scrollHeight - this.$scrollElement.height()
1595
+ , offsets = this.offsets
1596
+ , targets = this.targets
1597
+ , activeTarget = this.activeTarget
1598
+ , i
1599
+
1600
+ if (scrollTop >= maxScroll) {
1601
+ return activeTarget != (i = targets.last()[0])
1602
+ && this.activate ( i )
1603
+ }
1604
+
1605
+ for (i = offsets.length; i--;) {
1606
+ activeTarget != targets[i]
1607
+ && scrollTop >= offsets[i]
1608
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1609
+ && this.activate( targets[i] )
1610
+ }
1611
+ }
1612
+
1613
+ , activate: function (target) {
1614
+ var active
1615
+ , selector
1616
+
1617
+ this.activeTarget = target
1618
+
1619
+ $(this.selector)
1620
+ .parent('.active')
1621
+ .removeClass('active')
1622
+
1623
+ selector = this.selector
1624
+ + '[data-target="' + target + '"],'
1625
+ + this.selector + '[href="' + target + '"]'
1626
+
1627
+ active = $(selector)
1628
+ .parent('li')
1629
+ .addClass('active')
1630
+
1631
+ if (active.parent('.dropdown-menu').length) {
1632
+ active = active.closest('li.dropdown').addClass('active')
1633
+ }
1634
+
1635
+ active.trigger('activate')
1636
+ }
1637
+
1638
+ }
1639
+
1640
+
1641
+ /* SCROLLSPY PLUGIN DEFINITION
1642
+ * =========================== */
1643
+
1644
+ var old = $.fn.scrollspy
1645
+
1646
+ $.fn.scrollspy = function (option) {
1647
+ return this.each(function () {
1648
+ var $this = $(this)
1649
+ , data = $this.data('scrollspy')
1650
+ , options = typeof option == 'object' && option
1651
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1652
+ if (typeof option == 'string') data[option]()
1653
+ })
1654
+ }
1655
+
1656
+ $.fn.scrollspy.Constructor = ScrollSpy
1657
+
1658
+ $.fn.scrollspy.defaults = {
1659
+ offset: 10
1660
+ }
1661
+
1662
+
1663
+ /* SCROLLSPY NO CONFLICT
1664
+ * ===================== */
1665
+
1666
+ $.fn.scrollspy.noConflict = function () {
1667
+ $.fn.scrollspy = old
1668
+ return this
1669
+ }
1670
+
1671
+
1672
+ /* SCROLLSPY DATA-API
1673
+ * ================== */
1674
+
1675
+ $(window).on('load', function () {
1676
+ $('[data-spy="scroll"]').each(function () {
1677
+ var $spy = $(this)
1678
+ $spy.scrollspy($spy.data())
1679
+ })
1680
+ })
1681
+
1682
+ }(window.jQuery);/* ========================================================
1683
+ * bootstrap-tab.js v2.3.1
1684
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
1685
+ * ========================================================
1686
+ * Copyright 2012 Twitter, Inc.
1687
+ *
1688
+ * Licensed under the Apache License, Version 2.0 (the "License");
1689
+ * you may not use this file except in compliance with the License.
1690
+ * You may obtain a copy of the License at
1691
+ *
1692
+ * http://www.apache.org/licenses/LICENSE-2.0
1693
+ *
1694
+ * Unless required by applicable law or agreed to in writing, software
1695
+ * distributed under the License is distributed on an "AS IS" BASIS,
1696
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1697
+ * See the License for the specific language governing permissions and
1698
+ * limitations under the License.
1699
+ * ======================================================== */
1700
+
1701
+
1702
+ !function ($) {
1703
+
1704
+ "use strict"; // jshint ;_;
1705
+
1706
+
1707
+ /* TAB CLASS DEFINITION
1708
+ * ==================== */
1709
+
1710
+ var Tab = function (element) {
1711
+ this.element = $(element)
1712
+ }
1713
+
1714
+ Tab.prototype = {
1715
+
1716
+ constructor: Tab
1717
+
1718
+ , show: function () {
1719
+ var $this = this.element
1720
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
1721
+ , selector = $this.attr('data-target')
1722
+ , previous
1723
+ , $target
1724
+ , e
1725
+
1726
+ if (!selector) {
1727
+ selector = $this.attr('href')
1728
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1729
+ }
1730
+
1731
+ if ( $this.parent('li').hasClass('active') ) return
1732
+
1733
+ previous = $ul.find('.active:last a')[0]
1734
+
1735
+ e = $.Event('show', {
1736
+ relatedTarget: previous
1737
+ })
1738
+
1739
+ $this.trigger(e)
1740
+
1741
+ if (e.isDefaultPrevented()) return
1742
+
1743
+ $target = $(selector)
1744
+
1745
+ this.activate($this.parent('li'), $ul)
1746
+ this.activate($target, $target.parent(), function () {
1747
+ $this.trigger({
1748
+ type: 'shown'
1749
+ , relatedTarget: previous
1750
+ })
1751
+ })
1752
+ }
1753
+
1754
+ , activate: function ( element, container, callback) {
1755
+ var $active = container.find('> .active')
1756
+ , transition = callback
1757
+ && $.support.transition
1758
+ && $active.hasClass('fade')
1759
+
1760
+ function next() {
1761
+ $active
1762
+ .removeClass('active')
1763
+ .find('> .dropdown-menu > .active')
1764
+ .removeClass('active')
1765
+
1766
+ element.addClass('active')
1767
+
1768
+ if (transition) {
1769
+ element[0].offsetWidth // reflow for transition
1770
+ element.addClass('in')
1771
+ } else {
1772
+ element.removeClass('fade')
1773
+ }
1774
+
1775
+ if ( element.parent('.dropdown-menu') ) {
1776
+ element.closest('li.dropdown').addClass('active')
1777
+ }
1778
+
1779
+ callback && callback()
1780
+ }
1781
+
1782
+ transition ?
1783
+ $active.one($.support.transition.end, next) :
1784
+ next()
1785
+
1786
+ $active.removeClass('in')
1787
+ }
1788
+ }
1789
+
1790
+
1791
+ /* TAB PLUGIN DEFINITION
1792
+ * ===================== */
1793
+
1794
+ var old = $.fn.tab
1795
+
1796
+ $.fn.tab = function ( option ) {
1797
+ return this.each(function () {
1798
+ var $this = $(this)
1799
+ , data = $this.data('tab')
1800
+ if (!data) $this.data('tab', (data = new Tab(this)))
1801
+ if (typeof option == 'string') data[option]()
1802
+ })
1803
+ }
1804
+
1805
+ $.fn.tab.Constructor = Tab
1806
+
1807
+
1808
+ /* TAB NO CONFLICT
1809
+ * =============== */
1810
+
1811
+ $.fn.tab.noConflict = function () {
1812
+ $.fn.tab = old
1813
+ return this
1814
+ }
1815
+
1816
+
1817
+ /* TAB DATA-API
1818
+ * ============ */
1819
+
1820
+ $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1821
+ e.preventDefault()
1822
+ $(this).tab('show')
1823
+ })
1824
+
1825
+ }(window.jQuery);/* =============================================================
1826
+ * bootstrap-typeahead.js v2.3.1
1827
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
1828
+ * =============================================================
1829
+ * Copyright 2012 Twitter, Inc.
1830
+ *
1831
+ * Licensed under the Apache License, Version 2.0 (the "License");
1832
+ * you may not use this file except in compliance with the License.
1833
+ * You may obtain a copy of the License at
1834
+ *
1835
+ * http://www.apache.org/licenses/LICENSE-2.0
1836
+ *
1837
+ * Unless required by applicable law or agreed to in writing, software
1838
+ * distributed under the License is distributed on an "AS IS" BASIS,
1839
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1840
+ * See the License for the specific language governing permissions and
1841
+ * limitations under the License.
1842
+ * ============================================================ */
1843
+
1844
+
1845
+ !function($){
1846
+
1847
+ "use strict"; // jshint ;_;
1848
+
1849
+
1850
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
1851
+ * ================================= */
1852
+
1853
+ var Typeahead = function (element, options) {
1854
+ this.$element = $(element)
1855
+ this.options = $.extend({}, $.fn.typeahead.defaults, options)
1856
+ this.matcher = this.options.matcher || this.matcher
1857
+ this.sorter = this.options.sorter || this.sorter
1858
+ this.highlighter = this.options.highlighter || this.highlighter
1859
+ this.updater = this.options.updater || this.updater
1860
+ this.source = this.options.source
1861
+ this.$menu = $(this.options.menu)
1862
+ this.shown = false
1863
+ this.listen()
1864
+ }
1865
+
1866
+ Typeahead.prototype = {
1867
+
1868
+ constructor: Typeahead
1869
+
1870
+ , select: function () {
1871
+ var val = this.$menu.find('.active').attr('data-value')
1872
+ this.$element
1873
+ .val(this.updater(val))
1874
+ .change()
1875
+ return this.hide()
1876
+ }
1877
+
1878
+ , updater: function (item) {
1879
+ return item
1880
+ }
1881
+
1882
+ , show: function () {
1883
+ var pos = $.extend({}, this.$element.position(), {
1884
+ height: this.$element[0].offsetHeight
1885
+ })
1886
+
1887
+ this.$menu
1888
+ .insertAfter(this.$element)
1889
+ .css({
1890
+ top: pos.top + pos.height
1891
+ , left: pos.left
1892
+ })
1893
+ .show()
1894
+
1895
+ this.shown = true
1896
+ return this
1897
+ }
1898
+
1899
+ , hide: function () {
1900
+ this.$menu.hide()
1901
+ this.shown = false
1902
+ return this
1903
+ }
1904
+
1905
+ , lookup: function (event) {
1906
+ var items
1907
+
1908
+ this.query = this.$element.val()
1909
+
1910
+ if (!this.query || this.query.length < this.options.minLength) {
1911
+ return this.shown ? this.hide() : this
1912
+ }
1913
+
1914
+ items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
1915
+
1916
+ return items ? this.process(items) : this
1917
+ }
1918
+
1919
+ , process: function (items) {
1920
+ var that = this
1921
+
1922
+ items = $.grep(items, function (item) {
1923
+ return that.matcher(item)
1924
+ })
1925
+
1926
+ items = this.sorter(items)
1927
+
1928
+ if (!items.length) {
1929
+ return this.shown ? this.hide() : this
1930
+ }
1931
+
1932
+ return this.render(items.slice(0, this.options.items)).show()
1933
+ }
1934
+
1935
+ , matcher: function (item) {
1936
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1937
+ }
1938
+
1939
+ , sorter: function (items) {
1940
+ var beginswith = []
1941
+ , caseSensitive = []
1942
+ , caseInsensitive = []
1943
+ , item
1944
+
1945
+ while (item = items.shift()) {
1946
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1947
+ else if (~item.indexOf(this.query)) caseSensitive.push(item)
1948
+ else caseInsensitive.push(item)
1949
+ }
1950
+
1951
+ return beginswith.concat(caseSensitive, caseInsensitive)
1952
+ }
1953
+
1954
+ , highlighter: function (item) {
1955
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1956
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
1957
+ return '<strong>' + match + '</strong>'
1958
+ })
1959
+ }
1960
+
1961
+ , render: function (items) {
1962
+ var that = this
1963
+
1964
+ items = $(items).map(function (i, item) {
1965
+ i = $(that.options.item).attr('data-value', item)
1966
+ i.find('a').html(that.highlighter(item))
1967
+ return i[0]
1968
+ })
1969
+
1970
+ items.first().addClass('active')
1971
+ this.$menu.html(items)
1972
+ return this
1973
+ }
1974
+
1975
+ , next: function (event) {
1976
+ var active = this.$menu.find('.active').removeClass('active')
1977
+ , next = active.next()
1978
+
1979
+ if (!next.length) {
1980
+ next = $(this.$menu.find('li')[0])
1981
+ }
1982
+
1983
+ next.addClass('active')
1984
+ }
1985
+
1986
+ , prev: function (event) {
1987
+ var active = this.$menu.find('.active').removeClass('active')
1988
+ , prev = active.prev()
1989
+
1990
+ if (!prev.length) {
1991
+ prev = this.$menu.find('li').last()
1992
+ }
1993
+
1994
+ prev.addClass('active')
1995
+ }
1996
+
1997
+ , listen: function () {
1998
+ this.$element
1999
+ .on('focus', $.proxy(this.focus, this))
2000
+ .on('blur', $.proxy(this.blur, this))
2001
+ .on('keypress', $.proxy(this.keypress, this))
2002
+ .on('keyup', $.proxy(this.keyup, this))
2003
+
2004
+ if (this.eventSupported('keydown')) {
2005
+ this.$element.on('keydown', $.proxy(this.keydown, this))
2006
+ }
2007
+
2008
+ this.$menu
2009
+ .on('click', $.proxy(this.click, this))
2010
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
2011
+ .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
2012
+ }
2013
+
2014
+ , eventSupported: function(eventName) {
2015
+ var isSupported = eventName in this.$element
2016
+ if (!isSupported) {
2017
+ this.$element.setAttribute(eventName, 'return;')
2018
+ isSupported = typeof this.$element[eventName] === 'function'
2019
+ }
2020
+ return isSupported
2021
+ }
2022
+
2023
+ , move: function (e) {
2024
+ if (!this.shown) return
2025
+
2026
+ switch(e.keyCode) {
2027
+ case 9: // tab
2028
+ case 13: // enter
2029
+ case 27: // escape
2030
+ e.preventDefault()
2031
+ break
2032
+
2033
+ case 38: // up arrow
2034
+ e.preventDefault()
2035
+ this.prev()
2036
+ break
2037
+
2038
+ case 40: // down arrow
2039
+ e.preventDefault()
2040
+ this.next()
2041
+ break
2042
+ }
2043
+
2044
+ e.stopPropagation()
2045
+ }
2046
+
2047
+ , keydown: function (e) {
2048
+ this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
2049
+ this.move(e)
2050
+ }
2051
+
2052
+ , keypress: function (e) {
2053
+ if (this.suppressKeyPressRepeat) return
2054
+ this.move(e)
2055
+ }
2056
+
2057
+ , keyup: function (e) {
2058
+ switch(e.keyCode) {
2059
+ case 40: // down arrow
2060
+ case 38: // up arrow
2061
+ case 16: // shift
2062
+ case 17: // ctrl
2063
+ case 18: // alt
2064
+ break
2065
+
2066
+ case 9: // tab
2067
+ case 13: // enter
2068
+ if (!this.shown) return
2069
+ this.select()
2070
+ break
2071
+
2072
+ case 27: // escape
2073
+ if (!this.shown) return
2074
+ this.hide()
2075
+ break
2076
+
2077
+ default:
2078
+ this.lookup()
2079
+ }
2080
+
2081
+ e.stopPropagation()
2082
+ e.preventDefault()
2083
+ }
2084
+
2085
+ , focus: function (e) {
2086
+ this.focused = true
2087
+ }
2088
+
2089
+ , blur: function (e) {
2090
+ this.focused = false
2091
+ if (!this.mousedover && this.shown) this.hide()
2092
+ }
2093
+
2094
+ , click: function (e) {
2095
+ e.stopPropagation()
2096
+ e.preventDefault()
2097
+ this.select()
2098
+ this.$element.focus()
2099
+ }
2100
+
2101
+ , mouseenter: function (e) {
2102
+ this.mousedover = true
2103
+ this.$menu.find('.active').removeClass('active')
2104
+ $(e.currentTarget).addClass('active')
2105
+ }
2106
+
2107
+ , mouseleave: function (e) {
2108
+ this.mousedover = false
2109
+ if (!this.focused && this.shown) this.hide()
2110
+ }
2111
+
2112
+ }
2113
+
2114
+
2115
+ /* TYPEAHEAD PLUGIN DEFINITION
2116
+ * =========================== */
2117
+
2118
+ var old = $.fn.typeahead
2119
+
2120
+ $.fn.typeahead = function (option) {
2121
+ return this.each(function () {
2122
+ var $this = $(this)
2123
+ , data = $this.data('typeahead')
2124
+ , options = typeof option == 'object' && option
2125
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
2126
+ if (typeof option == 'string') data[option]()
2127
+ })
2128
+ }
2129
+
2130
+ $.fn.typeahead.defaults = {
2131
+ source: []
2132
+ , items: 8
2133
+ , menu: '<ul class="typeahead dropdown-menu"></ul>'
2134
+ , item: '<li><a href="#"></a></li>'
2135
+ , minLength: 1
2136
+ }
2137
+
2138
+ $.fn.typeahead.Constructor = Typeahead
2139
+
2140
+
2141
+ /* TYPEAHEAD NO CONFLICT
2142
+ * =================== */
2143
+
2144
+ $.fn.typeahead.noConflict = function () {
2145
+ $.fn.typeahead = old
2146
+ return this
2147
+ }
2148
+
2149
+
2150
+ /* TYPEAHEAD DATA-API
2151
+ * ================== */
2152
+
2153
+ $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
2154
+ var $this = $(this)
2155
+ if ($this.data('typeahead')) return
2156
+ $this.typeahead($this.data())
2157
+ })
2158
+
2159
+ }(window.jQuery);
2160
+ /* ==========================================================
2161
+ * bootstrap-affix.js v2.3.1
2162
+ * http://twitter.github.com/bootstrap/javascript.html#affix
2163
+ * ==========================================================
2164
+ * Copyright 2012 Twitter, Inc.
2165
+ *
2166
+ * Licensed under the Apache License, Version 2.0 (the "License");
2167
+ * you may not use this file except in compliance with the License.
2168
+ * You may obtain a copy of the License at
2169
+ *
2170
+ * http://www.apache.org/licenses/LICENSE-2.0
2171
+ *
2172
+ * Unless required by applicable law or agreed to in writing, software
2173
+ * distributed under the License is distributed on an "AS IS" BASIS,
2174
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2175
+ * See the License for the specific language governing permissions and
2176
+ * limitations under the License.
2177
+ * ========================================================== */
2178
+
2179
+
2180
+ !function ($) {
2181
+
2182
+ "use strict"; // jshint ;_;
2183
+
2184
+
2185
+ /* AFFIX CLASS DEFINITION
2186
+ * ====================== */
2187
+
2188
+ var Affix = function (element, options) {
2189
+ this.options = $.extend({}, $.fn.affix.defaults, options)
2190
+ this.$window = $(window)
2191
+ .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
2192
+ .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
2193
+ this.$element = $(element)
2194
+ this.checkPosition()
2195
+ }
2196
+
2197
+ Affix.prototype.checkPosition = function () {
2198
+ if (!this.$element.is(':visible')) return
2199
+
2200
+ var scrollHeight = $(document).height()
2201
+ , scrollTop = this.$window.scrollTop()
2202
+ , position = this.$element.offset()
2203
+ , offset = this.options.offset
2204
+ , offsetBottom = offset.bottom
2205
+ , offsetTop = offset.top
2206
+ , reset = 'affix affix-top affix-bottom'
2207
+ , affix
2208
+
2209
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
2210
+ if (typeof offsetTop == 'function') offsetTop = offset.top()
2211
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
2212
+
2213
+ affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
2214
+ false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
2215
+ 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
2216
+ 'top' : false
2217
+
2218
+ if (this.affixed === affix) return
2219
+
2220
+ this.affixed = affix
2221
+ this.unpin = affix == 'bottom' ? position.top - scrollTop : null
2222
+
2223
+ this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
2224
+ }
2225
+
2226
+
2227
+ /* AFFIX PLUGIN DEFINITION
2228
+ * ======================= */
2229
+
2230
+ var old = $.fn.affix
2231
+
2232
+ $.fn.affix = function (option) {
2233
+ return this.each(function () {
2234
+ var $this = $(this)
2235
+ , data = $this.data('affix')
2236
+ , options = typeof option == 'object' && option
2237
+ if (!data) $this.data('affix', (data = new Affix(this, options)))
2238
+ if (typeof option == 'string') data[option]()
2239
+ })
2240
+ }
2241
+
2242
+ $.fn.affix.Constructor = Affix
2243
+
2244
+ $.fn.affix.defaults = {
2245
+ offset: 0
2246
+ }
2247
+
2248
+
2249
+ /* AFFIX NO CONFLICT
2250
+ * ================= */
2251
+
2252
+ $.fn.affix.noConflict = function () {
2253
+ $.fn.affix = old
2254
+ return this
2255
+ }
2256
+
2257
+
2258
+ /* AFFIX DATA-API
2259
+ * ============== */
2260
+
2261
+ $(window).on('load', function () {
2262
+ $('[data-spy="affix"]').each(function () {
2263
+ var $spy = $(this)
2264
+ , data = $spy.data()
2265
+
2266
+ data.offset = data.offset || {}
2267
+
2268
+ data.offsetBottom && (data.offset.bottom = data.offsetBottom)
2269
+ data.offsetTop && (data.offset.top = data.offsetTop)
2270
+
2271
+ $spy.affix(data)
2272
+ })
2273
+ })
2274
+
2275
+
2276
+ }(window.jQuery);