mongo_request_logger 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. data/CHANGELOG.md +9 -0
  2. data/README.md +3 -11
  3. data/angular/.gitignore +8 -0
  4. data/angular/README.md +143 -0
  5. data/angular/app/css/.gitignore +0 -0
  6. data/angular/app/css/app.css +30 -0
  7. data/angular/app/img/.gitignore +0 -0
  8. data/{public → angular/app}/img/flags/ad.png +0 -0
  9. data/{public → angular/app}/img/flags/ae.png +0 -0
  10. data/{public → angular/app}/img/flags/af.png +0 -0
  11. data/{public → angular/app}/img/flags/ag.png +0 -0
  12. data/{public → angular/app}/img/flags/ai.png +0 -0
  13. data/{public → angular/app}/img/flags/al.png +0 -0
  14. data/{public → angular/app}/img/flags/am.png +0 -0
  15. data/{public → angular/app}/img/flags/an.png +0 -0
  16. data/{public → angular/app}/img/flags/ao.png +0 -0
  17. data/{public → angular/app}/img/flags/ar.png +0 -0
  18. data/{public → angular/app}/img/flags/as.png +0 -0
  19. data/{public → angular/app}/img/flags/at.png +0 -0
  20. data/{public → angular/app}/img/flags/au.png +0 -0
  21. data/{public → angular/app}/img/flags/aw.png +0 -0
  22. data/{public → angular/app}/img/flags/ax.png +0 -0
  23. data/{public → angular/app}/img/flags/az.png +0 -0
  24. data/{public → angular/app}/img/flags/ba.png +0 -0
  25. data/{public → angular/app}/img/flags/bb.png +0 -0
  26. data/{public → angular/app}/img/flags/bd.png +0 -0
  27. data/{public → angular/app}/img/flags/be.png +0 -0
  28. data/{public → angular/app}/img/flags/bf.png +0 -0
  29. data/{public → angular/app}/img/flags/bg.png +0 -0
  30. data/{public → angular/app}/img/flags/bh.png +0 -0
  31. data/{public → angular/app}/img/flags/bi.png +0 -0
  32. data/{public → angular/app}/img/flags/bj.png +0 -0
  33. data/{public → angular/app}/img/flags/bm.png +0 -0
  34. data/{public → angular/app}/img/flags/bn.png +0 -0
  35. data/{public → angular/app}/img/flags/bo.png +0 -0
  36. data/{public → angular/app}/img/flags/br.png +0 -0
  37. data/{public → angular/app}/img/flags/bs.png +0 -0
  38. data/{public → angular/app}/img/flags/bt.png +0 -0
  39. data/{public → angular/app}/img/flags/bv.png +0 -0
  40. data/{public → angular/app}/img/flags/bw.png +0 -0
  41. data/{public → angular/app}/img/flags/by.png +0 -0
  42. data/{public → angular/app}/img/flags/bz.png +0 -0
  43. data/{public → angular/app}/img/flags/ca.png +0 -0
  44. data/{public → angular/app}/img/flags/catalonia.png +0 -0
  45. data/{public → angular/app}/img/flags/cc.png +0 -0
  46. data/{public → angular/app}/img/flags/cd.png +0 -0
  47. data/{public → angular/app}/img/flags/cf.png +0 -0
  48. data/{public → angular/app}/img/flags/cg.png +0 -0
  49. data/{public → angular/app}/img/flags/ch.png +0 -0
  50. data/{public → angular/app}/img/flags/ci.png +0 -0
  51. data/{public → angular/app}/img/flags/ck.png +0 -0
  52. data/{public → angular/app}/img/flags/cl.png +0 -0
  53. data/{public → angular/app}/img/flags/cm.png +0 -0
  54. data/{public → angular/app}/img/flags/cn.png +0 -0
  55. data/{public → angular/app}/img/flags/co.png +0 -0
  56. data/{public → angular/app}/img/flags/cr.png +0 -0
  57. data/{public → angular/app}/img/flags/cs.png +0 -0
  58. data/{public → angular/app}/img/flags/cu.png +0 -0
  59. data/{public → angular/app}/img/flags/cv.png +0 -0
  60. data/{public → angular/app}/img/flags/cx.png +0 -0
  61. data/{public → angular/app}/img/flags/cy.png +0 -0
  62. data/{public → angular/app}/img/flags/cz.png +0 -0
  63. data/{public → angular/app}/img/flags/de.png +0 -0
  64. data/{public → angular/app}/img/flags/dj.png +0 -0
  65. data/{public → angular/app}/img/flags/dk.png +0 -0
  66. data/{public → angular/app}/img/flags/dm.png +0 -0
  67. data/{public → angular/app}/img/flags/do.png +0 -0
  68. data/{public → angular/app}/img/flags/dz.png +0 -0
  69. data/{public → angular/app}/img/flags/ec.png +0 -0
  70. data/{public → angular/app}/img/flags/ee.png +0 -0
  71. data/{public → angular/app}/img/flags/eg.png +0 -0
  72. data/{public → angular/app}/img/flags/eh.png +0 -0
  73. data/{public → angular/app}/img/flags/england.png +0 -0
  74. data/{public → angular/app}/img/flags/er.png +0 -0
  75. data/{public → angular/app}/img/flags/es.png +0 -0
  76. data/{public → angular/app}/img/flags/et.png +0 -0
  77. data/{public → angular/app}/img/flags/europeanunion.png +0 -0
  78. data/{public → angular/app}/img/flags/fam.png +0 -0
  79. data/{public → angular/app}/img/flags/fi.png +0 -0
  80. data/{public → angular/app}/img/flags/fj.png +0 -0
  81. data/{public → angular/app}/img/flags/fk.png +0 -0
  82. data/{public → angular/app}/img/flags/fm.png +0 -0
  83. data/{public → angular/app}/img/flags/fo.png +0 -0
  84. data/{public → angular/app}/img/flags/fr.png +0 -0
  85. data/{public → angular/app}/img/flags/ga.png +0 -0
  86. data/{public → angular/app}/img/flags/gb.png +0 -0
  87. data/{public → angular/app}/img/flags/gd.png +0 -0
  88. data/{public → angular/app}/img/flags/ge.png +0 -0
  89. data/{public → angular/app}/img/flags/gf.png +0 -0
  90. data/{public → angular/app}/img/flags/gh.png +0 -0
  91. data/{public → angular/app}/img/flags/gi.png +0 -0
  92. data/{public → angular/app}/img/flags/gl.png +0 -0
  93. data/{public → angular/app}/img/flags/gm.png +0 -0
  94. data/{public → angular/app}/img/flags/gn.png +0 -0
  95. data/{public → angular/app}/img/flags/gp.png +0 -0
  96. data/{public → angular/app}/img/flags/gq.png +0 -0
  97. data/{public → angular/app}/img/flags/gr.png +0 -0
  98. data/{public → angular/app}/img/flags/gs.png +0 -0
  99. data/{public → angular/app}/img/flags/gt.png +0 -0
  100. data/{public → angular/app}/img/flags/gu.png +0 -0
  101. data/{public → angular/app}/img/flags/gw.png +0 -0
  102. data/{public → angular/app}/img/flags/gy.png +0 -0
  103. data/{public → angular/app}/img/flags/hk.png +0 -0
  104. data/{public → angular/app}/img/flags/hm.png +0 -0
  105. data/{public → angular/app}/img/flags/hn.png +0 -0
  106. data/{public → angular/app}/img/flags/hr.png +0 -0
  107. data/{public → angular/app}/img/flags/ht.png +0 -0
  108. data/{public → angular/app}/img/flags/hu.png +0 -0
  109. data/{public → angular/app}/img/flags/id.png +0 -0
  110. data/{public → angular/app}/img/flags/ie.png +0 -0
  111. data/{public → angular/app}/img/flags/il.png +0 -0
  112. data/{public → angular/app}/img/flags/in.png +0 -0
  113. data/{public → angular/app}/img/flags/io.png +0 -0
  114. data/{public → angular/app}/img/flags/iq.png +0 -0
  115. data/{public → angular/app}/img/flags/ir.png +0 -0
  116. data/{public → angular/app}/img/flags/is.png +0 -0
  117. data/{public → angular/app}/img/flags/it.png +0 -0
  118. data/{public → angular/app}/img/flags/jm.png +0 -0
  119. data/{public → angular/app}/img/flags/jo.png +0 -0
  120. data/{public → angular/app}/img/flags/jp.png +0 -0
  121. data/{public → angular/app}/img/flags/ke.png +0 -0
  122. data/{public → angular/app}/img/flags/kg.png +0 -0
  123. data/{public → angular/app}/img/flags/kh.png +0 -0
  124. data/{public → angular/app}/img/flags/ki.png +0 -0
  125. data/{public → angular/app}/img/flags/km.png +0 -0
  126. data/{public → angular/app}/img/flags/kn.png +0 -0
  127. data/{public → angular/app}/img/flags/kp.png +0 -0
  128. data/{public → angular/app}/img/flags/kr.png +0 -0
  129. data/{public → angular/app}/img/flags/kw.png +0 -0
  130. data/{public → angular/app}/img/flags/ky.png +0 -0
  131. data/{public → angular/app}/img/flags/kz.png +0 -0
  132. data/{public → angular/app}/img/flags/la.png +0 -0
  133. data/{public → angular/app}/img/flags/lb.png +0 -0
  134. data/{public → angular/app}/img/flags/lc.png +0 -0
  135. data/{public → angular/app}/img/flags/li.png +0 -0
  136. data/{public → angular/app}/img/flags/lk.png +0 -0
  137. data/{public → angular/app}/img/flags/lr.png +0 -0
  138. data/{public → angular/app}/img/flags/ls.png +0 -0
  139. data/{public → angular/app}/img/flags/lt.png +0 -0
  140. data/{public → angular/app}/img/flags/lu.png +0 -0
  141. data/{public → angular/app}/img/flags/lv.png +0 -0
  142. data/{public → angular/app}/img/flags/ly.png +0 -0
  143. data/{public → angular/app}/img/flags/ma.png +0 -0
  144. data/{public → angular/app}/img/flags/mc.png +0 -0
  145. data/{public → angular/app}/img/flags/md.png +0 -0
  146. data/{public → angular/app}/img/flags/me.png +0 -0
  147. data/{public → angular/app}/img/flags/mg.png +0 -0
  148. data/{public → angular/app}/img/flags/mh.png +0 -0
  149. data/{public → angular/app}/img/flags/mk.png +0 -0
  150. data/{public → angular/app}/img/flags/ml.png +0 -0
  151. data/{public → angular/app}/img/flags/mm.png +0 -0
  152. data/{public → angular/app}/img/flags/mn.png +0 -0
  153. data/{public → angular/app}/img/flags/mo.png +0 -0
  154. data/{public → angular/app}/img/flags/mp.png +0 -0
  155. data/{public → angular/app}/img/flags/mq.png +0 -0
  156. data/{public → angular/app}/img/flags/mr.png +0 -0
  157. data/{public → angular/app}/img/flags/ms.png +0 -0
  158. data/{public → angular/app}/img/flags/mt.png +0 -0
  159. data/{public → angular/app}/img/flags/mu.png +0 -0
  160. data/{public → angular/app}/img/flags/mv.png +0 -0
  161. data/{public → angular/app}/img/flags/mw.png +0 -0
  162. data/{public → angular/app}/img/flags/mx.png +0 -0
  163. data/{public → angular/app}/img/flags/my.png +0 -0
  164. data/{public → angular/app}/img/flags/mz.png +0 -0
  165. data/{public → angular/app}/img/flags/na.png +0 -0
  166. data/{public → angular/app}/img/flags/nc.png +0 -0
  167. data/{public → angular/app}/img/flags/ne.png +0 -0
  168. data/{public → angular/app}/img/flags/nf.png +0 -0
  169. data/{public → angular/app}/img/flags/ng.png +0 -0
  170. data/{public → angular/app}/img/flags/ni.png +0 -0
  171. data/{public → angular/app}/img/flags/nl.png +0 -0
  172. data/{public → angular/app}/img/flags/no.png +0 -0
  173. data/{public → angular/app}/img/flags/np.png +0 -0
  174. data/{public → angular/app}/img/flags/nr.png +0 -0
  175. data/{public → angular/app}/img/flags/nu.png +0 -0
  176. data/{public → angular/app}/img/flags/nz.png +0 -0
  177. data/{public → angular/app}/img/flags/om.png +0 -0
  178. data/{public → angular/app}/img/flags/pa.png +0 -0
  179. data/{public → angular/app}/img/flags/pe.png +0 -0
  180. data/{public → angular/app}/img/flags/pf.png +0 -0
  181. data/{public → angular/app}/img/flags/pg.png +0 -0
  182. data/{public → angular/app}/img/flags/ph.png +0 -0
  183. data/{public → angular/app}/img/flags/pk.png +0 -0
  184. data/{public → angular/app}/img/flags/pl.png +0 -0
  185. data/{public → angular/app}/img/flags/pm.png +0 -0
  186. data/{public → angular/app}/img/flags/pn.png +0 -0
  187. data/{public → angular/app}/img/flags/pr.png +0 -0
  188. data/{public → angular/app}/img/flags/ps.png +0 -0
  189. data/{public → angular/app}/img/flags/pt.png +0 -0
  190. data/{public → angular/app}/img/flags/pw.png +0 -0
  191. data/{public → angular/app}/img/flags/py.png +0 -0
  192. data/{public → angular/app}/img/flags/qa.png +0 -0
  193. data/{public → angular/app}/img/flags/re.png +0 -0
  194. data/{public → angular/app}/img/flags/ro.png +0 -0
  195. data/{public → angular/app}/img/flags/rs.png +0 -0
  196. data/{public → angular/app}/img/flags/ru.png +0 -0
  197. data/{public → angular/app}/img/flags/rw.png +0 -0
  198. data/{public → angular/app}/img/flags/sa.png +0 -0
  199. data/{public → angular/app}/img/flags/sb.png +0 -0
  200. data/{public → angular/app}/img/flags/sc.png +0 -0
  201. data/{public → angular/app}/img/flags/scotland.png +0 -0
  202. data/{public → angular/app}/img/flags/sd.png +0 -0
  203. data/{public → angular/app}/img/flags/se.png +0 -0
  204. data/{public → angular/app}/img/flags/sg.png +0 -0
  205. data/{public → angular/app}/img/flags/sh.png +0 -0
  206. data/{public → angular/app}/img/flags/si.png +0 -0
  207. data/{public → angular/app}/img/flags/sj.png +0 -0
  208. data/{public → angular/app}/img/flags/sk.png +0 -0
  209. data/{public → angular/app}/img/flags/sl.png +0 -0
  210. data/{public → angular/app}/img/flags/sm.png +0 -0
  211. data/{public → angular/app}/img/flags/sn.png +0 -0
  212. data/{public → angular/app}/img/flags/so.png +0 -0
  213. data/{public → angular/app}/img/flags/sr.png +0 -0
  214. data/{public → angular/app}/img/flags/st.png +0 -0
  215. data/{public → angular/app}/img/flags/sv.png +0 -0
  216. data/{public → angular/app}/img/flags/sy.png +0 -0
  217. data/{public → angular/app}/img/flags/sz.png +0 -0
  218. data/{public → angular/app}/img/flags/tc.png +0 -0
  219. data/{public → angular/app}/img/flags/td.png +0 -0
  220. data/{public → angular/app}/img/flags/tf.png +0 -0
  221. data/{public → angular/app}/img/flags/tg.png +0 -0
  222. data/{public → angular/app}/img/flags/th.png +0 -0
  223. data/{public → angular/app}/img/flags/tj.png +0 -0
  224. data/{public → angular/app}/img/flags/tk.png +0 -0
  225. data/{public → angular/app}/img/flags/tl.png +0 -0
  226. data/{public → angular/app}/img/flags/tm.png +0 -0
  227. data/{public → angular/app}/img/flags/tn.png +0 -0
  228. data/{public → angular/app}/img/flags/to.png +0 -0
  229. data/{public → angular/app}/img/flags/tr.png +0 -0
  230. data/{public → angular/app}/img/flags/tt.png +0 -0
  231. data/{public → angular/app}/img/flags/tv.png +0 -0
  232. data/{public → angular/app}/img/flags/tw.png +0 -0
  233. data/{public → angular/app}/img/flags/tz.png +0 -0
  234. data/{public → angular/app}/img/flags/ua.png +0 -0
  235. data/{public → angular/app}/img/flags/ug.png +0 -0
  236. data/{public → angular/app}/img/flags/uk.png +0 -0
  237. data/{public → angular/app}/img/flags/um.png +0 -0
  238. data/{public → angular/app}/img/flags/us.png +0 -0
  239. data/{public → angular/app}/img/flags/uy.png +0 -0
  240. data/{public → angular/app}/img/flags/uz.png +0 -0
  241. data/{public → angular/app}/img/flags/va.png +0 -0
  242. data/{public → angular/app}/img/flags/vc.png +0 -0
  243. data/{public → angular/app}/img/flags/ve.png +0 -0
  244. data/{public → angular/app}/img/flags/vg.png +0 -0
  245. data/{public → angular/app}/img/flags/vi.png +0 -0
  246. data/{public → angular/app}/img/flags/vn.png +0 -0
  247. data/{public → angular/app}/img/flags/vu.png +0 -0
  248. data/{public → angular/app}/img/flags/wales.png +0 -0
  249. data/{public → angular/app}/img/flags/wf.png +0 -0
  250. data/{public → angular/app}/img/flags/ws.png +0 -0
  251. data/{public → angular/app}/img/flags/ye.png +0 -0
  252. data/{public → angular/app}/img/flags/yt.png +0 -0
  253. data/{public → angular/app}/img/flags/za.png +0 -0
  254. data/{public → angular/app}/img/flags/zm.png +0 -0
  255. data/{public → angular/app}/img/flags/zw.png +0 -0
  256. data/angular/app/js/app.js +9 -0
  257. data/angular/app/js/controllers.js +184 -0
  258. data/angular/app/js/directives.js +7 -0
  259. data/angular/app/js/filters.js +34 -0
  260. data/angular/app/js/services.js +6 -0
  261. data/angular/app/lib/angular-ui/angular-ui-ieshiv.js +81 -0
  262. data/angular/app/lib/angular-ui/angular-ui-ieshiv.min.js +7 -0
  263. data/angular/app/lib/angular-ui/angular-ui.css +50 -0
  264. data/angular/app/lib/angular-ui/angular-ui.js +1316 -0
  265. data/angular/app/lib/angular-ui/angular-ui.min.css +1 -0
  266. data/angular/app/lib/angular-ui/angular-ui.min.js +7 -0
  267. data/angular/app/lib/angular/angular-cookies.js +171 -0
  268. data/angular/app/lib/angular/angular-cookies.min.js +7 -0
  269. data/angular/app/lib/angular/angular-loader.js +276 -0
  270. data/angular/app/lib/angular/angular-loader.min.js +7 -0
  271. data/angular/app/lib/angular/angular-resource.js +445 -0
  272. data/angular/app/lib/angular/angular-resource.min.js +10 -0
  273. data/angular/app/lib/angular/angular-sanitize.js +535 -0
  274. data/angular/app/lib/angular/angular-sanitize.min.js +13 -0
  275. data/angular/app/lib/angular/angular.js +14604 -0
  276. data/angular/app/lib/angular/angular.min.js +160 -0
  277. data/angular/app/lib/angular/version.txt +1 -0
  278. data/angular/app/lib/bootstrap/css/bootstrap.css +6103 -0
  279. data/angular/app/lib/bootstrap/css/bootstrap.min.css +868 -0
  280. data/{public → angular/app/lib/bootstrap}/img/glyphicons-halflings-white.png +0 -0
  281. data/angular/app/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  282. data/{public → angular/app/lib/bootstrap}/js/bootstrap.js +1210 -865
  283. data/angular/app/lib/bootstrap/js/bootstrap.min.js +7 -0
  284. data/{public/js → angular/app/lib/jquery}/jquery-1.7.2.min.js +0 -0
  285. data/angular/app/partials/.gitignore +0 -0
  286. data/angular/app/partials/logs.html +91 -0
  287. data/angular/app/partials/page.html +18 -0
  288. data/angular/config/testacular-e2e.conf.js +22 -0
  289. data/angular/config/testacular.conf.js +20 -0
  290. data/angular/logs/.gitignore +2 -0
  291. data/angular/scripts/e2e-test.bat +11 -0
  292. data/angular/scripts/e2e-test.sh +9 -0
  293. data/angular/scripts/test.bat +11 -0
  294. data/angular/scripts/test.sh +9 -0
  295. data/angular/scripts/watchr.rb +19 -0
  296. data/angular/scripts/web-server.js +244 -0
  297. data/angular/test/e2e/runner.html +10 -0
  298. data/angular/test/e2e/scenarios.js +45 -0
  299. data/angular/test/lib/angular/angular-mocks.js +1764 -0
  300. data/angular/test/lib/angular/angular-scenario.js +26066 -0
  301. data/angular/test/lib/angular/version.txt +1 -0
  302. data/angular/test/unit/controllersSpec.js +31 -0
  303. data/angular/test/unit/directivesSpec.js +19 -0
  304. data/angular/test/unit/filtersSpec.js +19 -0
  305. data/angular/test/unit/servicesSpec.js +14 -0
  306. data/config.ru +1 -2
  307. data/lib/mongo_request_logger/adapters/mongo.rb +1 -1
  308. data/lib/mongo_request_logger/adapters/moped.rb +1 -1
  309. data/lib/mongo_request_logger/log_message.rb +22 -7
  310. data/lib/mongo_request_logger/version.rb +1 -1
  311. data/lib/mongo_request_logger/viewer.rb +40 -15
  312. data/spec/mongo_logger_spec.rb +1 -1
  313. data/spec/moped_logger_spec.rb +1 -1
  314. data/views/index.erb +69 -0
  315. metadata +318 -275
  316. data/public/css/bootstrap-responsive.css +0 -815
  317. data/public/css/bootstrap-responsive.min.css +0 -9
  318. data/public/css/bootstrap.css +0 -4983
  319. data/public/css/bootstrap.min.css +0 -9
  320. data/public/img/glyphicons-halflings.png +0 -0
  321. data/public/js/bootstrap.min.js +0 -6
  322. data/public/js/logs.js +0 -194
  323. data/views/layout.erb +0 -61
  324. data/views/log_page.erb +0 -22
  325. data/views/logs.erb +0 -76
@@ -1,5 +1,5 @@
1
1
  /* ===================================================
2
- * bootstrap-transition.js v2.0.4
2
+ * bootstrap-transition.js v2.2.2
3
3
  * http://twitter.github.com/bootstrap/javascript.html#transitions
4
4
  * ===================================================
5
5
  * Copyright 2012 Twitter, Inc.
@@ -20,13 +20,13 @@
20
20
 
21
21
  !function ($) {
22
22
 
23
- $(function () {
23
+ "use strict"; // jshint ;_;
24
24
 
25
- "use strict"; // jshint ;_;
26
25
 
26
+ /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27
+ * ======================================================= */
27
28
 
28
- /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
29
- * ======================================================= */
29
+ $(function () {
30
30
 
31
31
  $.support.transition = (function () {
32
32
 
@@ -36,8 +36,7 @@
36
36
  , transEndEventNames = {
37
37
  'WebkitTransition' : 'webkitTransitionEnd'
38
38
  , 'MozTransition' : 'transitionend'
39
- , 'OTransition' : 'oTransitionEnd'
40
- , 'msTransition' : 'MSTransitionEnd'
39
+ , 'OTransition' : 'oTransitionEnd otransitionend'
41
40
  , 'transition' : 'transitionend'
42
41
  }
43
42
  , name
@@ -58,10 +57,11 @@
58
57
 
59
58
  })
60
59
 
61
- }(window.jQuery);/* ==========================================================
62
- * bootstrap-alert.js v2.0.4
63
- * http://twitter.github.com/bootstrap/javascript.html#alerts
64
- * ==========================================================
60
+ }(window.jQuery);
61
+ /* =========================================================
62
+ * bootstrap-modal.js v2.2.2
63
+ * http://twitter.github.com/bootstrap/javascript.html#modals
64
+ * =========================================================
65
65
  * Copyright 2012 Twitter, Inc.
66
66
  *
67
67
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -75,7 +75,7 @@
75
75
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76
76
  * See the License for the specific language governing permissions and
77
77
  * limitations under the License.
78
- * ========================================================== */
78
+ * ========================================================= */
79
79
 
80
80
 
81
81
  !function ($) {
@@ -83,169 +83,231 @@
83
83
  "use strict"; // jshint ;_;
84
84
 
85
85
 
86
- /* ALERT CLASS DEFINITION
86
+ /* MODAL CLASS DEFINITION
87
87
  * ====================== */
88
88
 
89
- var dismiss = '[data-dismiss="alert"]'
90
- , Alert = function (el) {
91
- $(el).on('click', dismiss, this.close)
89
+ var Modal = function (element, options) {
90
+ this.options = options
91
+ this.$element = $(element)
92
+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
93
+ this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
94
+ }
95
+
96
+ Modal.prototype = {
97
+
98
+ constructor: Modal
99
+
100
+ , toggle: function () {
101
+ return this[!this.isShown ? 'show' : 'hide']()
92
102
  }
93
103
 
94
- Alert.prototype.close = function (e) {
95
- var $this = $(this)
96
- , selector = $this.attr('data-target')
97
- , $parent
104
+ , show: function () {
105
+ var that = this
106
+ , e = $.Event('show')
98
107
 
99
- if (!selector) {
100
- selector = $this.attr('href')
101
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
102
- }
108
+ this.$element.trigger(e)
103
109
 
104
- $parent = $(selector)
110
+ if (this.isShown || e.isDefaultPrevented()) return
105
111
 
106
- e && e.preventDefault()
112
+ this.isShown = true
107
113
 
108
- $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
114
+ this.escape()
109
115
 
110
- $parent.trigger(e = $.Event('close'))
116
+ this.backdrop(function () {
117
+ var transition = $.support.transition && that.$element.hasClass('fade')
111
118
 
112
- if (e.isDefaultPrevented()) return
119
+ if (!that.$element.parent().length) {
120
+ that.$element.appendTo(document.body) //don't move modals dom position
121
+ }
113
122
 
114
- $parent.removeClass('in')
123
+ that.$element
124
+ .show()
115
125
 
116
- function removeElement() {
117
- $parent
118
- .trigger('closed')
119
- .remove()
120
- }
126
+ if (transition) {
127
+ that.$element[0].offsetWidth // force reflow
128
+ }
121
129
 
122
- $.support.transition && $parent.hasClass('fade') ?
123
- $parent.on($.support.transition.end, removeElement) :
124
- removeElement()
125
- }
130
+ that.$element
131
+ .addClass('in')
132
+ .attr('aria-hidden', false)
126
133
 
134
+ that.enforceFocus()
127
135
 
128
- /* ALERT PLUGIN DEFINITION
129
- * ======================= */
136
+ transition ?
137
+ that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
138
+ that.$element.focus().trigger('shown')
130
139
 
131
- $.fn.alert = function (option) {
132
- return this.each(function () {
133
- var $this = $(this)
134
- , data = $this.data('alert')
135
- if (!data) $this.data('alert', (data = new Alert(this)))
136
- if (typeof option == 'string') data[option].call($this)
137
- })
138
- }
140
+ })
141
+ }
139
142
 
140
- $.fn.alert.Constructor = Alert
143
+ , hide: function (e) {
144
+ e && e.preventDefault()
141
145
 
146
+ var that = this
142
147
 
143
- /* ALERT DATA-API
144
- * ============== */
148
+ e = $.Event('hide')
145
149
 
146
- $(function () {
147
- $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
148
- })
150
+ this.$element.trigger(e)
149
151
 
150
- }(window.jQuery);/* ============================================================
151
- * bootstrap-button.js v2.0.4
152
- * http://twitter.github.com/bootstrap/javascript.html#buttons
153
- * ============================================================
154
- * Copyright 2012 Twitter, Inc.
155
- *
156
- * Licensed under the Apache License, Version 2.0 (the "License");
157
- * you may not use this file except in compliance with the License.
158
- * You may obtain a copy of the License at
159
- *
160
- * http://www.apache.org/licenses/LICENSE-2.0
161
- *
162
- * Unless required by applicable law or agreed to in writing, software
163
- * distributed under the License is distributed on an "AS IS" BASIS,
164
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
165
- * See the License for the specific language governing permissions and
166
- * limitations under the License.
167
- * ============================================================ */
152
+ if (!this.isShown || e.isDefaultPrevented()) return
168
153
 
154
+ this.isShown = false
169
155
 
170
- !function ($) {
156
+ this.escape()
171
157
 
172
- "use strict"; // jshint ;_;
158
+ $(document).off('focusin.modal')
173
159
 
160
+ this.$element
161
+ .removeClass('in')
162
+ .attr('aria-hidden', true)
174
163
 
175
- /* BUTTON PUBLIC CLASS DEFINITION
176
- * ============================== */
164
+ $.support.transition && this.$element.hasClass('fade') ?
165
+ this.hideWithTransition() :
166
+ this.hideModal()
167
+ }
177
168
 
178
- var Button = function (element, options) {
179
- this.$element = $(element)
180
- this.options = $.extend({}, $.fn.button.defaults, options)
181
- }
169
+ , enforceFocus: function () {
170
+ var that = this
171
+ $(document).on('focusin.modal', function (e) {
172
+ if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
173
+ that.$element.focus()
174
+ }
175
+ })
176
+ }
182
177
 
183
- Button.prototype.setState = function (state) {
184
- var d = 'disabled'
185
- , $el = this.$element
186
- , data = $el.data()
187
- , val = $el.is('input') ? 'val' : 'html'
178
+ , escape: function () {
179
+ var that = this
180
+ if (this.isShown && this.options.keyboard) {
181
+ this.$element.on('keyup.dismiss.modal', function ( e ) {
182
+ e.which == 27 && that.hide()
183
+ })
184
+ } else if (!this.isShown) {
185
+ this.$element.off('keyup.dismiss.modal')
186
+ }
187
+ }
188
188
 
189
- state = state + 'Text'
190
- data.resetText || $el.data('resetText', $el[val]())
189
+ , hideWithTransition: function () {
190
+ var that = this
191
+ , timeout = setTimeout(function () {
192
+ that.$element.off($.support.transition.end)
193
+ that.hideModal()
194
+ }, 500)
191
195
 
192
- $el[val](data[state] || this.options[state])
196
+ this.$element.one($.support.transition.end, function () {
197
+ clearTimeout(timeout)
198
+ that.hideModal()
199
+ })
200
+ }
193
201
 
194
- // push to event loop to allow forms to submit
195
- setTimeout(function () {
196
- state == 'loadingText' ?
197
- $el.addClass(d).attr(d, d) :
198
- $el.removeClass(d).removeAttr(d)
199
- }, 0)
200
- }
202
+ , hideModal: function (that) {
203
+ this.$element
204
+ .hide()
205
+ .trigger('hidden')
201
206
 
202
- Button.prototype.toggle = function () {
203
- var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
207
+ this.backdrop()
208
+ }
204
209
 
205
- $parent && $parent
206
- .find('.active')
207
- .removeClass('active')
210
+ , removeBackdrop: function () {
211
+ this.$backdrop.remove()
212
+ this.$backdrop = null
213
+ }
208
214
 
209
- this.$element.toggleClass('active')
215
+ , backdrop: function (callback) {
216
+ var that = this
217
+ , animate = this.$element.hasClass('fade') ? 'fade' : ''
218
+
219
+ if (this.isShown && this.options.backdrop) {
220
+ var doAnimate = $.support.transition && animate
221
+
222
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
223
+ .appendTo(document.body)
224
+
225
+ this.$backdrop.click(
226
+ this.options.backdrop == 'static' ?
227
+ $.proxy(this.$element[0].focus, this.$element[0])
228
+ : $.proxy(this.hide, this)
229
+ )
230
+
231
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
232
+
233
+ this.$backdrop.addClass('in')
234
+
235
+ doAnimate ?
236
+ this.$backdrop.one($.support.transition.end, callback) :
237
+ callback()
238
+
239
+ } else if (!this.isShown && this.$backdrop) {
240
+ this.$backdrop.removeClass('in')
241
+
242
+ $.support.transition && this.$element.hasClass('fade')?
243
+ this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
244
+ this.removeBackdrop()
245
+
246
+ } else if (callback) {
247
+ callback()
248
+ }
249
+ }
210
250
  }
211
251
 
212
252
 
213
- /* BUTTON PLUGIN DEFINITION
214
- * ======================== */
253
+ /* MODAL PLUGIN DEFINITION
254
+ * ======================= */
215
255
 
216
- $.fn.button = function (option) {
256
+ var old = $.fn.modal
257
+
258
+ $.fn.modal = function (option) {
217
259
  return this.each(function () {
218
260
  var $this = $(this)
219
- , data = $this.data('button')
220
- , options = typeof option == 'object' && option
221
- if (!data) $this.data('button', (data = new Button(this, options)))
222
- if (option == 'toggle') data.toggle()
223
- else if (option) data.setState(option)
261
+ , data = $this.data('modal')
262
+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
263
+ if (!data) $this.data('modal', (data = new Modal(this, options)))
264
+ if (typeof option == 'string') data[option]()
265
+ else if (options.show) data.show()
224
266
  })
225
267
  }
226
268
 
227
- $.fn.button.defaults = {
228
- loadingText: 'loading...'
269
+ $.fn.modal.defaults = {
270
+ backdrop: true
271
+ , keyboard: true
272
+ , show: true
229
273
  }
230
274
 
231
- $.fn.button.Constructor = Button
275
+ $.fn.modal.Constructor = Modal
232
276
 
233
277
 
234
- /* BUTTON DATA-API
235
- * =============== */
278
+ /* MODAL NO CONFLICT
279
+ * ================= */
236
280
 
237
- $(function () {
238
- $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
239
- var $btn = $(e.target)
240
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
241
- $btn.button('toggle')
242
- })
281
+ $.fn.modal.noConflict = function () {
282
+ $.fn.modal = old
283
+ return this
284
+ }
285
+
286
+
287
+ /* MODAL DATA-API
288
+ * ============== */
289
+
290
+ $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
291
+ var $this = $(this)
292
+ , href = $this.attr('href')
293
+ , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
294
+ , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
295
+
296
+ e.preventDefault()
297
+
298
+ $target
299
+ .modal(option)
300
+ .one('hide', function () {
301
+ $this.focus()
302
+ })
243
303
  })
244
304
 
245
- }(window.jQuery);/* ==========================================================
246
- * bootstrap-carousel.js v2.0.4
247
- * http://twitter.github.com/bootstrap/javascript.html#carousel
248
- * ==========================================================
305
+ }(window.jQuery);
306
+
307
+ /* ============================================================
308
+ * bootstrap-dropdown.js v2.2.2
309
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
310
+ * ============================================================
249
311
  * Copyright 2012 Twitter, Inc.
250
312
  *
251
313
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -259,7 +321,7 @@
259
321
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
260
322
  * See the License for the specific language governing permissions and
261
323
  * limitations under the License.
262
- * ========================================================== */
324
+ * ============================================================ */
263
325
 
264
326
 
265
327
  !function ($) {
@@ -267,309 +329,146 @@
267
329
  "use strict"; // jshint ;_;
268
330
 
269
331
 
270
- /* CAROUSEL CLASS DEFINITION
332
+ /* DROPDOWN CLASS DEFINITION
271
333
  * ========================= */
272
334
 
273
- var Carousel = function (element, options) {
274
- this.$element = $(element)
275
- this.options = options
276
- this.options.slide && this.slide(this.options.slide)
277
- this.options.pause == 'hover' && this.$element
278
- .on('mouseenter', $.proxy(this.pause, this))
279
- .on('mouseleave', $.proxy(this.cycle, this))
280
- }
335
+ var toggle = '[data-toggle=dropdown]'
336
+ , Dropdown = function (element) {
337
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
338
+ $('html').on('click.dropdown.data-api', function () {
339
+ $el.parent().removeClass('open')
340
+ })
341
+ }
281
342
 
282
- Carousel.prototype = {
343
+ Dropdown.prototype = {
283
344
 
284
- cycle: function (e) {
285
- if (!e) this.paused = false
286
- this.options.interval
287
- && !this.paused
288
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
289
- return this
290
- }
345
+ constructor: Dropdown
291
346
 
292
- , to: function (pos) {
293
- var $active = this.$element.find('.active')
294
- , children = $active.parent().children()
295
- , activePos = children.index($active)
296
- , that = this
347
+ , toggle: function (e) {
348
+ var $this = $(this)
349
+ , $parent
350
+ , isActive
297
351
 
298
- if (pos > (children.length - 1) || pos < 0) return
352
+ if ($this.is('.disabled, :disabled')) return
299
353
 
300
- if (this.sliding) {
301
- return this.$element.one('slid', function () {
302
- that.to(pos)
303
- })
304
- }
354
+ $parent = getParent($this)
305
355
 
306
- if (activePos == pos) {
307
- return this.pause().cycle()
308
- }
356
+ isActive = $parent.hasClass('open')
309
357
 
310
- return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
311
- }
312
-
313
- , pause: function (e) {
314
- if (!e) this.paused = true
315
- clearInterval(this.interval)
316
- this.interval = null
317
- return this
318
- }
319
-
320
- , next: function () {
321
- if (this.sliding) return
322
- return this.slide('next')
323
- }
324
-
325
- , prev: function () {
326
- if (this.sliding) return
327
- return this.slide('prev')
328
- }
329
-
330
- , slide: function (type, next) {
331
- var $active = this.$element.find('.active')
332
- , $next = next || $active[type]()
333
- , isCycling = this.interval
334
- , direction = type == 'next' ? 'left' : 'right'
335
- , fallback = type == 'next' ? 'first' : 'last'
336
- , that = this
337
- , e = $.Event('slide')
338
-
339
- this.sliding = true
340
-
341
- isCycling && this.pause()
342
-
343
- $next = $next.length ? $next : this.$element.find('.item')[fallback]()
344
-
345
- if ($next.hasClass('active')) return
358
+ clearMenus()
346
359
 
347
- if ($.support.transition && this.$element.hasClass('slide')) {
348
- this.$element.trigger(e)
349
- if (e.isDefaultPrevented()) return
350
- $next.addClass(type)
351
- $next[0].offsetWidth // force reflow
352
- $active.addClass(direction)
353
- $next.addClass(direction)
354
- this.$element.one($.support.transition.end, function () {
355
- $next.removeClass([type, direction].join(' ')).addClass('active')
356
- $active.removeClass(['active', direction].join(' '))
357
- that.sliding = false
358
- setTimeout(function () { that.$element.trigger('slid') }, 0)
359
- })
360
- } else {
361
- this.$element.trigger(e)
362
- if (e.isDefaultPrevented()) return
363
- $active.removeClass('active')
364
- $next.addClass('active')
365
- this.sliding = false
366
- this.$element.trigger('slid')
360
+ if (!isActive) {
361
+ $parent.toggleClass('open')
367
362
  }
368
363
 
369
- isCycling && this.cycle()
364
+ $this.focus()
370
365
 
371
- return this
366
+ return false
372
367
  }
373
368
 
374
- }
375
-
376
-
377
- /* CAROUSEL PLUGIN DEFINITION
378
- * ========================== */
379
-
380
- $.fn.carousel = function (option) {
381
- return this.each(function () {
382
- var $this = $(this)
383
- , data = $this.data('carousel')
384
- , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
385
- if (!data) $this.data('carousel', (data = new Carousel(this, options)))
386
- if (typeof option == 'number') data.to(option)
387
- else if (typeof option == 'string' || (option = options.slide)) data[option]()
388
- else if (options.interval) data.cycle()
389
- })
390
- }
391
-
392
- $.fn.carousel.defaults = {
393
- interval: 5000
394
- , pause: 'hover'
395
- }
396
-
397
- $.fn.carousel.Constructor = Carousel
369
+ , keydown: function (e) {
370
+ var $this
371
+ , $items
372
+ , $active
373
+ , $parent
374
+ , isActive
375
+ , index
398
376
 
377
+ if (!/(38|40|27)/.test(e.keyCode)) return
399
378
 
400
- /* CAROUSEL DATA-API
401
- * ================= */
379
+ $this = $(this)
402
380
 
403
- $(function () {
404
- $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
405
- var $this = $(this), href
406
- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
407
- , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
408
- $target.carousel(options)
409
381
  e.preventDefault()
410
- })
411
- })
412
-
413
- }(window.jQuery);/* =============================================================
414
- * bootstrap-collapse.js v2.0.4
415
- * http://twitter.github.com/bootstrap/javascript.html#collapse
416
- * =============================================================
417
- * Copyright 2012 Twitter, Inc.
418
- *
419
- * Licensed under the Apache License, Version 2.0 (the "License");
420
- * you may not use this file except in compliance with the License.
421
- * You may obtain a copy of the License at
422
- *
423
- * http://www.apache.org/licenses/LICENSE-2.0
424
- *
425
- * Unless required by applicable law or agreed to in writing, software
426
- * distributed under the License is distributed on an "AS IS" BASIS,
427
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
428
- * See the License for the specific language governing permissions and
429
- * limitations under the License.
430
- * ============================================================ */
431
-
432
-
433
- !function ($) {
434
-
435
- "use strict"; // jshint ;_;
436
-
437
-
438
- /* COLLAPSE PUBLIC CLASS DEFINITION
439
- * ================================ */
440
-
441
- var Collapse = function (element, options) {
442
- this.$element = $(element)
443
- this.options = $.extend({}, $.fn.collapse.defaults, options)
444
-
445
- if (this.options.parent) {
446
- this.$parent = $(this.options.parent)
447
- }
448
-
449
- this.options.toggle && this.toggle()
450
- }
451
-
452
- Collapse.prototype = {
453
-
454
- constructor: Collapse
455
-
456
- , dimension: function () {
457
- var hasWidth = this.$element.hasClass('width')
458
- return hasWidth ? 'width' : 'height'
459
- }
460
-
461
- , show: function () {
462
- var dimension
463
- , scroll
464
- , actives
465
- , hasData
382
+ e.stopPropagation()
466
383
 
467
- if (this.transitioning) return
384
+ if ($this.is('.disabled, :disabled')) return
468
385
 
469
- dimension = this.dimension()
470
- scroll = $.camelCase(['scroll', dimension].join('-'))
471
- actives = this.$parent && this.$parent.find('> .accordion-group > .in')
386
+ $parent = getParent($this)
472
387
 
473
- if (actives && actives.length) {
474
- hasData = actives.data('collapse')
475
- if (hasData && hasData.transitioning) return
476
- actives.collapse('hide')
477
- hasData || actives.data('collapse', null)
478
- }
388
+ isActive = $parent.hasClass('open')
479
389
 
480
- this.$element[dimension](0)
481
- this.transition('addClass', $.Event('show'), 'shown')
482
- this.$element[dimension](this.$element[0][scroll])
483
- }
390
+ if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
484
391
 
485
- , hide: function () {
486
- var dimension
487
- if (this.transitioning) return
488
- dimension = this.dimension()
489
- this.reset(this.$element[dimension]())
490
- this.transition('removeClass', $.Event('hide'), 'hidden')
491
- this.$element[dimension](0)
492
- }
392
+ $items = $('[role=menu] li:not(.divider):visible a', $parent)
493
393
 
494
- , reset: function (size) {
495
- var dimension = this.dimension()
394
+ if (!$items.length) return
496
395
 
497
- this.$element
498
- .removeClass('collapse')
499
- [dimension](size || 'auto')
500
- [0].offsetWidth
396
+ index = $items.index($items.filter(':focus'))
501
397
 
502
- this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
398
+ if (e.keyCode == 38 && index > 0) index-- // up
399
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
400
+ if (!~index) index = 0
503
401
 
504
- return this
402
+ $items
403
+ .eq(index)
404
+ .focus()
505
405
  }
506
406
 
507
- , transition: function (method, startEvent, completeEvent) {
508
- var that = this
509
- , complete = function () {
510
- if (startEvent.type == 'show') that.reset()
511
- that.transitioning = 0
512
- that.$element.trigger(completeEvent)
513
- }
514
-
515
- this.$element.trigger(startEvent)
516
-
517
- if (startEvent.isDefaultPrevented()) return
407
+ }
518
408
 
519
- this.transitioning = 1
409
+ function clearMenus() {
410
+ $(toggle).each(function () {
411
+ getParent($(this)).removeClass('open')
412
+ })
413
+ }
520
414
 
521
- this.$element[method]('in')
415
+ function getParent($this) {
416
+ var selector = $this.attr('data-target')
417
+ , $parent
522
418
 
523
- $.support.transition && this.$element.hasClass('collapse') ?
524
- this.$element.one($.support.transition.end, complete) :
525
- complete()
419
+ if (!selector) {
420
+ selector = $this.attr('href')
421
+ selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
526
422
  }
527
423
 
528
- , toggle: function () {
529
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
530
- }
424
+ $parent = $(selector)
425
+ $parent.length || ($parent = $this.parent())
531
426
 
427
+ return $parent
532
428
  }
533
429
 
534
430
 
535
- /* COLLAPSIBLE PLUGIN DEFINITION
536
- * ============================== */
431
+ /* DROPDOWN PLUGIN DEFINITION
432
+ * ========================== */
537
433
 
538
- $.fn.collapse = function (option) {
434
+ var old = $.fn.dropdown
435
+
436
+ $.fn.dropdown = function (option) {
539
437
  return this.each(function () {
540
438
  var $this = $(this)
541
- , data = $this.data('collapse')
542
- , options = typeof option == 'object' && option
543
- if (!data) $this.data('collapse', (data = new Collapse(this, options)))
544
- if (typeof option == 'string') data[option]()
439
+ , data = $this.data('dropdown')
440
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
441
+ if (typeof option == 'string') data[option].call($this)
545
442
  })
546
443
  }
547
444
 
548
- $.fn.collapse.defaults = {
549
- toggle: true
550
- }
551
-
552
- $.fn.collapse.Constructor = Collapse
445
+ $.fn.dropdown.Constructor = Dropdown
553
446
 
554
447
 
555
- /* COLLAPSIBLE DATA-API
448
+ /* DROPDOWN NO CONFLICT
556
449
  * ==================== */
557
450
 
558
- $(function () {
559
- $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
560
- var $this = $(this), href
561
- , target = $this.attr('data-target')
562
- || e.preventDefault()
563
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
564
- , option = $(target).data('collapse') ? 'toggle' : $this.data()
565
- $(target).collapse(option)
566
- })
567
- })
451
+ $.fn.dropdown.noConflict = function () {
452
+ $.fn.dropdown = old
453
+ return this
454
+ }
568
455
 
569
- }(window.jQuery);/* ============================================================
570
- * bootstrap-dropdown.js v2.0.4
571
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
572
- * ============================================================
456
+
457
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
458
+ * =================================== */
459
+
460
+ $(document)
461
+ .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
462
+ .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
463
+ .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })
464
+ .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
465
+ .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
466
+
467
+ }(window.jQuery);
468
+ /* =============================================================
469
+ * bootstrap-scrollspy.js v2.2.2
470
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
471
+ * =============================================================
573
472
  * Copyright 2012 Twitter, Inc.
574
473
  *
575
474
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -583,7 +482,7 @@
583
482
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
584
483
  * See the License for the specific language governing permissions and
585
484
  * limitations under the License.
586
- * ============================================================ */
485
+ * ============================================================== */
587
486
 
588
487
 
589
488
  !function ($) {
@@ -591,84 +490,147 @@
591
490
  "use strict"; // jshint ;_;
592
491
 
593
492
 
594
- /* DROPDOWN CLASS DEFINITION
595
- * ========================= */
493
+ /* SCROLLSPY CLASS DEFINITION
494
+ * ========================== */
596
495
 
597
- var toggle = '[data-toggle="dropdown"]'
598
- , Dropdown = function (element) {
599
- var $el = $(element).on('click.dropdown.data-api', this.toggle)
600
- $('html').on('click.dropdown.data-api', function () {
601
- $el.parent().removeClass('open')
602
- })
496
+ function ScrollSpy(element, options) {
497
+ var process = $.proxy(this.process, this)
498
+ , $element = $(element).is('body') ? $(window) : $(element)
499
+ , href
500
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
501
+ this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
502
+ this.selector = (this.options.target
503
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
504
+ || '') + ' .nav li > a'
505
+ this.$body = $('body')
506
+ this.refresh()
507
+ this.process()
508
+ }
509
+
510
+ ScrollSpy.prototype = {
511
+
512
+ constructor: ScrollSpy
513
+
514
+ , refresh: function () {
515
+ var self = this
516
+ , $targets
517
+
518
+ this.offsets = $([])
519
+ this.targets = $([])
520
+
521
+ $targets = this.$body
522
+ .find(this.selector)
523
+ .map(function () {
524
+ var $el = $(this)
525
+ , href = $el.data('target') || $el.attr('href')
526
+ , $href = /^#\w/.test(href) && $(href)
527
+ return ( $href
528
+ && $href.length
529
+ && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null
530
+ })
531
+ .sort(function (a, b) { return a[0] - b[0] })
532
+ .each(function () {
533
+ self.offsets.push(this[0])
534
+ self.targets.push(this[1])
535
+ })
603
536
  }
604
537
 
605
- Dropdown.prototype = {
606
-
607
- constructor: Dropdown
538
+ , process: function () {
539
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
540
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
541
+ , maxScroll = scrollHeight - this.$scrollElement.height()
542
+ , offsets = this.offsets
543
+ , targets = this.targets
544
+ , activeTarget = this.activeTarget
545
+ , i
608
546
 
609
- , toggle: function (e) {
610
- var $this = $(this)
611
- , $parent
612
- , selector
613
- , isActive
547
+ if (scrollTop >= maxScroll) {
548
+ return activeTarget != (i = targets.last()[0])
549
+ && this.activate ( i )
550
+ }
614
551
 
615
- if ($this.is('.disabled, :disabled')) return
552
+ for (i = offsets.length; i--;) {
553
+ activeTarget != targets[i]
554
+ && scrollTop >= offsets[i]
555
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
556
+ && this.activate( targets[i] )
557
+ }
558
+ }
616
559
 
617
- selector = $this.attr('data-target')
560
+ , activate: function (target) {
561
+ var active
562
+ , selector
618
563
 
619
- if (!selector) {
620
- selector = $this.attr('href')
621
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
622
- }
564
+ this.activeTarget = target
623
565
 
624
- $parent = $(selector)
625
- $parent.length || ($parent = $this.parent())
566
+ $(this.selector)
567
+ .parent('.active')
568
+ .removeClass('active')
626
569
 
627
- isActive = $parent.hasClass('open')
570
+ selector = this.selector
571
+ + '[data-target="' + target + '"],'
572
+ + this.selector + '[href="' + target + '"]'
628
573
 
629
- clearMenus()
574
+ active = $(selector)
575
+ .parent('li')
576
+ .addClass('active')
630
577
 
631
- if (!isActive) $parent.toggleClass('open')
578
+ if (active.parent('.dropdown-menu').length) {
579
+ active = active.closest('li.dropdown').addClass('active')
580
+ }
632
581
 
633
- return false
634
- }
582
+ active.trigger('activate')
583
+ }
635
584
 
636
585
  }
637
586
 
638
- function clearMenus() {
639
- $(toggle).parent().removeClass('open')
640
- }
641
587
 
588
+ /* SCROLLSPY PLUGIN DEFINITION
589
+ * =========================== */
642
590
 
643
- /* DROPDOWN PLUGIN DEFINITION
644
- * ========================== */
591
+ var old = $.fn.scrollspy
645
592
 
646
- $.fn.dropdown = function (option) {
593
+ $.fn.scrollspy = function (option) {
647
594
  return this.each(function () {
648
595
  var $this = $(this)
649
- , data = $this.data('dropdown')
650
- if (!data) $this.data('dropdown', (data = new Dropdown(this)))
651
- if (typeof option == 'string') data[option].call($this)
596
+ , data = $this.data('scrollspy')
597
+ , options = typeof option == 'object' && option
598
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
599
+ if (typeof option == 'string') data[option]()
652
600
  })
653
601
  }
654
602
 
655
- $.fn.dropdown.Constructor = Dropdown
603
+ $.fn.scrollspy.Constructor = ScrollSpy
656
604
 
605
+ $.fn.scrollspy.defaults = {
606
+ offset: 10
607
+ }
657
608
 
658
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
659
- * =================================== */
660
609
 
661
- $(function () {
662
- $('html').on('click.dropdown.data-api', clearMenus)
663
- $('body')
664
- .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
665
- .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
610
+ /* SCROLLSPY NO CONFLICT
611
+ * ===================== */
612
+
613
+ $.fn.scrollspy.noConflict = function () {
614
+ $.fn.scrollspy = old
615
+ return this
616
+ }
617
+
618
+
619
+ /* SCROLLSPY DATA-API
620
+ * ================== */
621
+
622
+ $(window).on('load', function () {
623
+ $('[data-spy="scroll"]').each(function () {
624
+ var $spy = $(this)
625
+ $spy.scrollspy($spy.data())
626
+ })
666
627
  })
667
628
 
668
- }(window.jQuery);/* =========================================================
669
- * bootstrap-modal.js v2.0.4
670
- * http://twitter.github.com/bootstrap/javascript.html#modals
671
- * =========================================================
629
+ }(window.jQuery);
630
+ /* ========================================================
631
+ * bootstrap-tab.js v2.2.2
632
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
633
+ * ========================================================
672
634
  * Copyright 2012 Twitter, Inc.
673
635
  *
674
636
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -682,7 +644,7 @@
682
644
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
683
645
  * See the License for the specific language governing permissions and
684
646
  * limitations under the License.
685
- * ========================================================= */
647
+ * ======================================================== */
686
648
 
687
649
 
688
650
  !function ($) {
@@ -690,200 +652,127 @@
690
652
  "use strict"; // jshint ;_;
691
653
 
692
654
 
693
- /* MODAL CLASS DEFINITION
694
- * ====================== */
655
+ /* TAB CLASS DEFINITION
656
+ * ==================== */
695
657
 
696
- var Modal = function (content, options) {
697
- this.options = options
698
- this.$element = $(content)
699
- .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
658
+ var Tab = function (element) {
659
+ this.element = $(element)
700
660
  }
701
661
 
702
- Modal.prototype = {
703
-
704
- constructor: Modal
705
-
706
- , toggle: function () {
707
- return this[!this.isShown ? 'show' : 'hide']()
708
- }
709
-
710
- , show: function () {
711
- var that = this
712
- , e = $.Event('show')
713
-
714
- this.$element.trigger(e)
715
-
716
- if (this.isShown || e.isDefaultPrevented()) return
717
-
718
- $('body').addClass('modal-open')
719
-
720
- this.isShown = true
721
-
722
- escape.call(this)
723
- backdrop.call(this, function () {
724
- var transition = $.support.transition && that.$element.hasClass('fade')
725
-
726
- if (!that.$element.parent().length) {
727
- that.$element.appendTo(document.body) //don't move modals dom position
728
- }
729
-
730
- that.$element
731
- .show()
732
-
733
- if (transition) {
734
- that.$element[0].offsetWidth // force reflow
735
- }
662
+ Tab.prototype = {
736
663
 
737
- that.$element.addClass('in')
664
+ constructor: Tab
738
665
 
739
- transition ?
740
- that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
741
- that.$element.trigger('shown')
666
+ , show: function () {
667
+ var $this = this.element
668
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
669
+ , selector = $this.attr('data-target')
670
+ , previous
671
+ , $target
672
+ , e
742
673
 
743
- })
674
+ if (!selector) {
675
+ selector = $this.attr('href')
676
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
744
677
  }
745
678
 
746
- , hide: function (e) {
747
- e && e.preventDefault()
748
-
749
- var that = this
750
-
751
- e = $.Event('hide')
752
-
753
- this.$element.trigger(e)
754
-
755
- if (!this.isShown || e.isDefaultPrevented()) return
756
-
757
- this.isShown = false
758
-
759
- $('body').removeClass('modal-open')
760
-
761
- escape.call(this)
762
-
763
- this.$element.removeClass('in')
679
+ if ( $this.parent('li').hasClass('active') ) return
764
680
 
765
- $.support.transition && this.$element.hasClass('fade') ?
766
- hideWithTransition.call(this) :
767
- hideModal.call(this)
768
- }
681
+ previous = $ul.find('.active:last a')[0]
769
682
 
770
- }
683
+ e = $.Event('show', {
684
+ relatedTarget: previous
685
+ })
771
686
 
687
+ $this.trigger(e)
772
688
 
773
- /* MODAL PRIVATE METHODS
774
- * ===================== */
689
+ if (e.isDefaultPrevented()) return
775
690
 
776
- function hideWithTransition() {
777
- var that = this
778
- , timeout = setTimeout(function () {
779
- that.$element.off($.support.transition.end)
780
- hideModal.call(that)
781
- }, 500)
691
+ $target = $(selector)
782
692
 
783
- this.$element.one($.support.transition.end, function () {
784
- clearTimeout(timeout)
785
- hideModal.call(that)
786
- })
787
- }
693
+ this.activate($this.parent('li'), $ul)
694
+ this.activate($target, $target.parent(), function () {
695
+ $this.trigger({
696
+ type: 'shown'
697
+ , relatedTarget: previous
698
+ })
699
+ })
700
+ }
788
701
 
789
- function hideModal(that) {
790
- this.$element
791
- .hide()
792
- .trigger('hidden')
702
+ , activate: function ( element, container, callback) {
703
+ var $active = container.find('> .active')
704
+ , transition = callback
705
+ && $.support.transition
706
+ && $active.hasClass('fade')
793
707
 
794
- backdrop.call(this)
795
- }
708
+ function next() {
709
+ $active
710
+ .removeClass('active')
711
+ .find('> .dropdown-menu > .active')
712
+ .removeClass('active')
796
713
 
797
- function backdrop(callback) {
798
- var that = this
799
- , animate = this.$element.hasClass('fade') ? 'fade' : ''
714
+ element.addClass('active')
800
715
 
801
- if (this.isShown && this.options.backdrop) {
802
- var doAnimate = $.support.transition && animate
716
+ if (transition) {
717
+ element[0].offsetWidth // reflow for transition
718
+ element.addClass('in')
719
+ } else {
720
+ element.removeClass('fade')
721
+ }
803
722
 
804
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
805
- .appendTo(document.body)
723
+ if ( element.parent('.dropdown-menu') ) {
724
+ element.closest('li.dropdown').addClass('active')
725
+ }
806
726
 
807
- if (this.options.backdrop != 'static') {
808
- this.$backdrop.click($.proxy(this.hide, this))
727
+ callback && callback()
809
728
  }
810
729
 
811
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
812
-
813
- this.$backdrop.addClass('in')
814
-
815
- doAnimate ?
816
- this.$backdrop.one($.support.transition.end, callback) :
817
- callback()
818
-
819
- } else if (!this.isShown && this.$backdrop) {
820
- this.$backdrop.removeClass('in')
821
-
822
- $.support.transition && this.$element.hasClass('fade')?
823
- this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
824
- removeBackdrop.call(this)
730
+ transition ?
731
+ $active.one($.support.transition.end, next) :
732
+ next()
825
733
 
826
- } else if (callback) {
827
- callback()
734
+ $active.removeClass('in')
828
735
  }
829
736
  }
830
737
 
831
- function removeBackdrop() {
832
- this.$backdrop.remove()
833
- this.$backdrop = null
834
- }
835
-
836
- function escape() {
837
- var that = this
838
- if (this.isShown && this.options.keyboard) {
839
- $(document).on('keyup.dismiss.modal', function ( e ) {
840
- e.which == 27 && that.hide()
841
- })
842
- } else if (!this.isShown) {
843
- $(document).off('keyup.dismiss.modal')
844
- }
845
- }
846
738
 
739
+ /* TAB PLUGIN DEFINITION
740
+ * ===================== */
847
741
 
848
- /* MODAL PLUGIN DEFINITION
849
- * ======================= */
742
+ var old = $.fn.tab
850
743
 
851
- $.fn.modal = function (option) {
744
+ $.fn.tab = function ( option ) {
852
745
  return this.each(function () {
853
746
  var $this = $(this)
854
- , data = $this.data('modal')
855
- , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
856
- if (!data) $this.data('modal', (data = new Modal(this, options)))
747
+ , data = $this.data('tab')
748
+ if (!data) $this.data('tab', (data = new Tab(this)))
857
749
  if (typeof option == 'string') data[option]()
858
- else if (options.show) data.show()
859
750
  })
860
751
  }
861
752
 
862
- $.fn.modal.defaults = {
863
- backdrop: true
864
- , keyboard: true
865
- , show: true
866
- }
753
+ $.fn.tab.Constructor = Tab
867
754
 
868
- $.fn.modal.Constructor = Modal
869
755
 
756
+ /* TAB NO CONFLICT
757
+ * =============== */
870
758
 
871
- /* MODAL DATA-API
872
- * ============== */
759
+ $.fn.tab.noConflict = function () {
760
+ $.fn.tab = old
761
+ return this
762
+ }
873
763
 
874
- $(function () {
875
- $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
876
- var $this = $(this), href
877
- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
878
- , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
879
764
 
880
- e.preventDefault()
881
- $target.modal(option)
882
- })
765
+ /* TAB DATA-API
766
+ * ============ */
767
+
768
+ $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
769
+ e.preventDefault()
770
+ $(this).tab('show')
883
771
  })
884
772
 
885
- }(window.jQuery);/* ===========================================================
886
- * bootstrap-tooltip.js v2.0.4
773
+ }(window.jQuery);
774
+ /* ===========================================================
775
+ * bootstrap-tooltip.js v2.2.2
887
776
  * http://twitter.github.com/bootstrap/javascript.html#tooltips
888
777
  * Inspired by the original jQuery.tipsy by Jason Frame
889
778
  * ===========================================================
@@ -928,11 +817,13 @@
928
817
  this.options = this.getOptions(options)
929
818
  this.enabled = true
930
819
 
931
- if (this.options.trigger != 'manual') {
932
- eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
820
+ if (this.options.trigger == 'click') {
821
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
822
+ } else if (this.options.trigger != 'manual') {
823
+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
933
824
  eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
934
- this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
935
- this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
825
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
826
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
936
827
  }
937
828
 
938
829
  this.options.selector ?
@@ -1001,9 +892,9 @@
1001
892
  inside = /in/.test(placement)
1002
893
 
1003
894
  $tip
1004
- .remove()
895
+ .detach()
1005
896
  .css({ top: 0, left: 0, display: 'block' })
1006
- .appendTo(inside ? this.$element : document.body)
897
+ .insertAfter(this.$element)
1007
898
 
1008
899
  pos = this.getPosition(inside)
1009
900
 
@@ -1026,26 +917,17 @@
1026
917
  }
1027
918
 
1028
919
  $tip
1029
- .css(tp)
920
+ .offset(tp)
1030
921
  .addClass(placement)
1031
922
  .addClass('in')
1032
923
  }
1033
924
  }
1034
925
 
1035
- , isHTML: function(text) {
1036
- // html string detection logic adapted from jQuery
1037
- return typeof text != 'string'
1038
- || ( text.charAt(0) === "<"
1039
- && text.charAt( text.length - 1 ) === ">"
1040
- && text.length >= 3
1041
- ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
1042
- }
1043
-
1044
926
  , setContent: function () {
1045
927
  var $tip = this.tip()
1046
928
  , title = this.getTitle()
1047
929
 
1048
- $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
930
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1049
931
  $tip.removeClass('fade in top bottom left right')
1050
932
  }
1051
933
 
@@ -1057,18 +939,20 @@
1057
939
 
1058
940
  function removeWithAnimation() {
1059
941
  var timeout = setTimeout(function () {
1060
- $tip.off($.support.transition.end).remove()
942
+ $tip.off($.support.transition.end).detach()
1061
943
  }, 500)
1062
944
 
1063
945
  $tip.one($.support.transition.end, function () {
1064
946
  clearTimeout(timeout)
1065
- $tip.remove()
947
+ $tip.detach()
1066
948
  })
1067
949
  }
1068
950
 
1069
951
  $.support.transition && this.$tip.hasClass('fade') ?
1070
952
  removeWithAnimation() :
1071
- $tip.remove()
953
+ $tip.detach()
954
+
955
+ return this
1072
956
  }
1073
957
 
1074
958
  , fixTitle: function () {
@@ -1124,8 +1008,13 @@
1124
1008
  this.enabled = !this.enabled
1125
1009
  }
1126
1010
 
1127
- , toggle: function () {
1128
- this[this.tip().hasClass('in') ? 'hide' : 'show']()
1011
+ , toggle: function (e) {
1012
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1013
+ self[self.tip().hasClass('in') ? 'hide' : 'show']()
1014
+ }
1015
+
1016
+ , destroy: function () {
1017
+ this.hide().$element.off('.' + this.type).removeData(this.type)
1129
1018
  }
1130
1019
 
1131
1020
  }
@@ -1134,6 +1023,8 @@
1134
1023
  /* TOOLTIP PLUGIN DEFINITION
1135
1024
  * ========================= */
1136
1025
 
1026
+ var old = $.fn.tooltip
1027
+
1137
1028
  $.fn.tooltip = function ( option ) {
1138
1029
  return this.each(function () {
1139
1030
  var $this = $(this)
@@ -1154,11 +1045,21 @@
1154
1045
  , trigger: 'hover'
1155
1046
  , title: ''
1156
1047
  , delay: 0
1048
+ , html: false
1049
+ }
1050
+
1051
+
1052
+ /* TOOLTIP NO CONFLICT
1053
+ * =================== */
1054
+
1055
+ $.fn.tooltip.noConflict = function () {
1056
+ $.fn.tooltip = old
1057
+ return this
1157
1058
  }
1158
1059
 
1159
1060
  }(window.jQuery);
1160
1061
  /* ===========================================================
1161
- * bootstrap-popover.js v2.0.4
1062
+ * bootstrap-popover.js v2.2.2
1162
1063
  * http://twitter.github.com/bootstrap/javascript.html#popovers
1163
1064
  * ===========================================================
1164
1065
  * Copyright 2012 Twitter, Inc.
@@ -1185,7 +1086,7 @@
1185
1086
  /* POPOVER PUBLIC CLASS DEFINITION
1186
1087
  * =============================== */
1187
1088
 
1188
- var Popover = function ( element, options ) {
1089
+ var Popover = function (element, options) {
1189
1090
  this.init('popover', element, options)
1190
1091
  }
1191
1092
 
@@ -1195,68 +1096,406 @@
1195
1096
 
1196
1097
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1197
1098
 
1198
- constructor: Popover
1099
+ constructor: Popover
1100
+
1101
+ , setContent: function () {
1102
+ var $tip = this.tip()
1103
+ , title = this.getTitle()
1104
+ , content = this.getContent()
1105
+
1106
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1107
+ $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
1108
+
1109
+ $tip.removeClass('fade top bottom left right in')
1110
+ }
1111
+
1112
+ , hasContent: function () {
1113
+ return this.getTitle() || this.getContent()
1114
+ }
1115
+
1116
+ , getContent: function () {
1117
+ var content
1118
+ , $e = this.$element
1119
+ , o = this.options
1120
+
1121
+ content = $e.attr('data-content')
1122
+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1123
+
1124
+ return content
1125
+ }
1126
+
1127
+ , tip: function () {
1128
+ if (!this.$tip) {
1129
+ this.$tip = $(this.options.template)
1130
+ }
1131
+ return this.$tip
1132
+ }
1133
+
1134
+ , destroy: function () {
1135
+ this.hide().$element.off('.' + this.type).removeData(this.type)
1136
+ }
1137
+
1138
+ })
1139
+
1140
+
1141
+ /* POPOVER PLUGIN DEFINITION
1142
+ * ======================= */
1143
+
1144
+ var old = $.fn.popover
1145
+
1146
+ $.fn.popover = function (option) {
1147
+ return this.each(function () {
1148
+ var $this = $(this)
1149
+ , data = $this.data('popover')
1150
+ , options = typeof option == 'object' && option
1151
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
1152
+ if (typeof option == 'string') data[option]()
1153
+ })
1154
+ }
1155
+
1156
+ $.fn.popover.Constructor = Popover
1157
+
1158
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1159
+ placement: 'right'
1160
+ , trigger: 'click'
1161
+ , content: ''
1162
+ , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>'
1163
+ })
1164
+
1165
+
1166
+ /* POPOVER NO CONFLICT
1167
+ * =================== */
1168
+
1169
+ $.fn.popover.noConflict = function () {
1170
+ $.fn.popover = old
1171
+ return this
1172
+ }
1173
+
1174
+ }(window.jQuery);
1175
+ /* ==========================================================
1176
+ * bootstrap-affix.js v2.2.2
1177
+ * http://twitter.github.com/bootstrap/javascript.html#affix
1178
+ * ==========================================================
1179
+ * Copyright 2012 Twitter, Inc.
1180
+ *
1181
+ * Licensed under the Apache License, Version 2.0 (the "License");
1182
+ * you may not use this file except in compliance with the License.
1183
+ * You may obtain a copy of the License at
1184
+ *
1185
+ * http://www.apache.org/licenses/LICENSE-2.0
1186
+ *
1187
+ * Unless required by applicable law or agreed to in writing, software
1188
+ * distributed under the License is distributed on an "AS IS" BASIS,
1189
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1190
+ * See the License for the specific language governing permissions and
1191
+ * limitations under the License.
1192
+ * ========================================================== */
1193
+
1194
+
1195
+ !function ($) {
1196
+
1197
+ "use strict"; // jshint ;_;
1198
+
1199
+
1200
+ /* AFFIX CLASS DEFINITION
1201
+ * ====================== */
1202
+
1203
+ var Affix = function (element, options) {
1204
+ this.options = $.extend({}, $.fn.affix.defaults, options)
1205
+ this.$window = $(window)
1206
+ .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
1207
+ .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
1208
+ this.$element = $(element)
1209
+ this.checkPosition()
1210
+ }
1211
+
1212
+ Affix.prototype.checkPosition = function () {
1213
+ if (!this.$element.is(':visible')) return
1214
+
1215
+ var scrollHeight = $(document).height()
1216
+ , scrollTop = this.$window.scrollTop()
1217
+ , position = this.$element.offset()
1218
+ , offset = this.options.offset
1219
+ , offsetBottom = offset.bottom
1220
+ , offsetTop = offset.top
1221
+ , reset = 'affix affix-top affix-bottom'
1222
+ , affix
1223
+
1224
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
1225
+ if (typeof offsetTop == 'function') offsetTop = offset.top()
1226
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
1227
+
1228
+ affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
1229
+ false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
1230
+ 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
1231
+ 'top' : false
1232
+
1233
+ if (this.affixed === affix) return
1234
+
1235
+ this.affixed = affix
1236
+ this.unpin = affix == 'bottom' ? position.top - scrollTop : null
1237
+
1238
+ this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
1239
+ }
1240
+
1241
+
1242
+ /* AFFIX PLUGIN DEFINITION
1243
+ * ======================= */
1244
+
1245
+ var old = $.fn.affix
1246
+
1247
+ $.fn.affix = function (option) {
1248
+ return this.each(function () {
1249
+ var $this = $(this)
1250
+ , data = $this.data('affix')
1251
+ , options = typeof option == 'object' && option
1252
+ if (!data) $this.data('affix', (data = new Affix(this, options)))
1253
+ if (typeof option == 'string') data[option]()
1254
+ })
1255
+ }
1256
+
1257
+ $.fn.affix.Constructor = Affix
1258
+
1259
+ $.fn.affix.defaults = {
1260
+ offset: 0
1261
+ }
1262
+
1263
+
1264
+ /* AFFIX NO CONFLICT
1265
+ * ================= */
1266
+
1267
+ $.fn.affix.noConflict = function () {
1268
+ $.fn.affix = old
1269
+ return this
1270
+ }
1271
+
1272
+
1273
+ /* AFFIX DATA-API
1274
+ * ============== */
1275
+
1276
+ $(window).on('load', function () {
1277
+ $('[data-spy="affix"]').each(function () {
1278
+ var $spy = $(this)
1279
+ , data = $spy.data()
1280
+
1281
+ data.offset = data.offset || {}
1282
+
1283
+ data.offsetBottom && (data.offset.bottom = data.offsetBottom)
1284
+ data.offsetTop && (data.offset.top = data.offsetTop)
1285
+
1286
+ $spy.affix(data)
1287
+ })
1288
+ })
1289
+
1290
+
1291
+ }(window.jQuery);
1292
+ /* ==========================================================
1293
+ * bootstrap-alert.js v2.2.2
1294
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
1295
+ * ==========================================================
1296
+ * Copyright 2012 Twitter, Inc.
1297
+ *
1298
+ * Licensed under the Apache License, Version 2.0 (the "License");
1299
+ * you may not use this file except in compliance with the License.
1300
+ * You may obtain a copy of the License at
1301
+ *
1302
+ * http://www.apache.org/licenses/LICENSE-2.0
1303
+ *
1304
+ * Unless required by applicable law or agreed to in writing, software
1305
+ * distributed under the License is distributed on an "AS IS" BASIS,
1306
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1307
+ * See the License for the specific language governing permissions and
1308
+ * limitations under the License.
1309
+ * ========================================================== */
1310
+
1311
+
1312
+ !function ($) {
1313
+
1314
+ "use strict"; // jshint ;_;
1315
+
1316
+
1317
+ /* ALERT CLASS DEFINITION
1318
+ * ====================== */
1319
+
1320
+ var dismiss = '[data-dismiss="alert"]'
1321
+ , Alert = function (el) {
1322
+ $(el).on('click', dismiss, this.close)
1323
+ }
1324
+
1325
+ Alert.prototype.close = function (e) {
1326
+ var $this = $(this)
1327
+ , selector = $this.attr('data-target')
1328
+ , $parent
1329
+
1330
+ if (!selector) {
1331
+ selector = $this.attr('href')
1332
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1333
+ }
1334
+
1335
+ $parent = $(selector)
1336
+
1337
+ e && e.preventDefault()
1338
+
1339
+ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
1340
+
1341
+ $parent.trigger(e = $.Event('close'))
1342
+
1343
+ if (e.isDefaultPrevented()) return
1344
+
1345
+ $parent.removeClass('in')
1346
+
1347
+ function removeElement() {
1348
+ $parent
1349
+ .trigger('closed')
1350
+ .remove()
1351
+ }
1352
+
1353
+ $.support.transition && $parent.hasClass('fade') ?
1354
+ $parent.on($.support.transition.end, removeElement) :
1355
+ removeElement()
1356
+ }
1357
+
1358
+
1359
+ /* ALERT PLUGIN DEFINITION
1360
+ * ======================= */
1361
+
1362
+ var old = $.fn.alert
1363
+
1364
+ $.fn.alert = function (option) {
1365
+ return this.each(function () {
1366
+ var $this = $(this)
1367
+ , data = $this.data('alert')
1368
+ if (!data) $this.data('alert', (data = new Alert(this)))
1369
+ if (typeof option == 'string') data[option].call($this)
1370
+ })
1371
+ }
1372
+
1373
+ $.fn.alert.Constructor = Alert
1374
+
1375
+
1376
+ /* ALERT NO CONFLICT
1377
+ * ================= */
1378
+
1379
+ $.fn.alert.noConflict = function () {
1380
+ $.fn.alert = old
1381
+ return this
1382
+ }
1383
+
1384
+
1385
+ /* ALERT DATA-API
1386
+ * ============== */
1387
+
1388
+ $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
1389
+
1390
+ }(window.jQuery);
1391
+ /* ============================================================
1392
+ * bootstrap-button.js v2.2.2
1393
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
1394
+ * ============================================================
1395
+ * Copyright 2012 Twitter, Inc.
1396
+ *
1397
+ * Licensed under the Apache License, Version 2.0 (the "License");
1398
+ * you may not use this file except in compliance with the License.
1399
+ * You may obtain a copy of the License at
1400
+ *
1401
+ * http://www.apache.org/licenses/LICENSE-2.0
1402
+ *
1403
+ * Unless required by applicable law or agreed to in writing, software
1404
+ * distributed under the License is distributed on an "AS IS" BASIS,
1405
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1406
+ * See the License for the specific language governing permissions and
1407
+ * limitations under the License.
1408
+ * ============================================================ */
1409
+
1410
+
1411
+ !function ($) {
1412
+
1413
+ "use strict"; // jshint ;_;
1414
+
1415
+
1416
+ /* BUTTON PUBLIC CLASS DEFINITION
1417
+ * ============================== */
1199
1418
 
1200
- , setContent: function () {
1201
- var $tip = this.tip()
1202
- , title = this.getTitle()
1203
- , content = this.getContent()
1419
+ var Button = function (element, options) {
1420
+ this.$element = $(element)
1421
+ this.options = $.extend({}, $.fn.button.defaults, options)
1422
+ }
1204
1423
 
1205
- $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
1206
- $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
1424
+ Button.prototype.setState = function (state) {
1425
+ var d = 'disabled'
1426
+ , $el = this.$element
1427
+ , data = $el.data()
1428
+ , val = $el.is('input') ? 'val' : 'html'
1207
1429
 
1208
- $tip.removeClass('fade top bottom left right in')
1209
- }
1430
+ state = state + 'Text'
1431
+ data.resetText || $el.data('resetText', $el[val]())
1210
1432
 
1211
- , hasContent: function () {
1212
- return this.getTitle() || this.getContent()
1213
- }
1433
+ $el[val](data[state] || this.options[state])
1214
1434
 
1215
- , getContent: function () {
1216
- var content
1217
- , $e = this.$element
1218
- , o = this.options
1435
+ // push to event loop to allow forms to submit
1436
+ setTimeout(function () {
1437
+ state == 'loadingText' ?
1438
+ $el.addClass(d).attr(d, d) :
1439
+ $el.removeClass(d).removeAttr(d)
1440
+ }, 0)
1441
+ }
1219
1442
 
1220
- content = $e.attr('data-content')
1221
- || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1443
+ Button.prototype.toggle = function () {
1444
+ var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
1222
1445
 
1223
- return content
1224
- }
1446
+ $parent && $parent
1447
+ .find('.active')
1448
+ .removeClass('active')
1225
1449
 
1226
- , tip: function () {
1227
- if (!this.$tip) {
1228
- this.$tip = $(this.options.template)
1229
- }
1230
- return this.$tip
1231
- }
1450
+ this.$element.toggleClass('active')
1451
+ }
1232
1452
 
1233
- })
1234
1453
 
1454
+ /* BUTTON PLUGIN DEFINITION
1455
+ * ======================== */
1235
1456
 
1236
- /* POPOVER PLUGIN DEFINITION
1237
- * ======================= */
1457
+ var old = $.fn.button
1238
1458
 
1239
- $.fn.popover = function (option) {
1459
+ $.fn.button = function (option) {
1240
1460
  return this.each(function () {
1241
1461
  var $this = $(this)
1242
- , data = $this.data('popover')
1462
+ , data = $this.data('button')
1243
1463
  , options = typeof option == 'object' && option
1244
- if (!data) $this.data('popover', (data = new Popover(this, options)))
1245
- if (typeof option == 'string') data[option]()
1464
+ if (!data) $this.data('button', (data = new Button(this, options)))
1465
+ if (option == 'toggle') data.toggle()
1466
+ else if (option) data.setState(option)
1246
1467
  })
1247
1468
  }
1248
1469
 
1249
- $.fn.popover.Constructor = Popover
1470
+ $.fn.button.defaults = {
1471
+ loadingText: 'loading...'
1472
+ }
1250
1473
 
1251
- $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1252
- placement: 'right'
1253
- , content: ''
1254
- , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
1474
+ $.fn.button.Constructor = Button
1475
+
1476
+
1477
+ /* BUTTON NO CONFLICT
1478
+ * ================== */
1479
+
1480
+ $.fn.button.noConflict = function () {
1481
+ $.fn.button = old
1482
+ return this
1483
+ }
1484
+
1485
+
1486
+ /* BUTTON DATA-API
1487
+ * =============== */
1488
+
1489
+ $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
1490
+ var $btn = $(e.target)
1491
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
1492
+ $btn.button('toggle')
1255
1493
  })
1256
1494
 
1257
- }(window.jQuery);/* =============================================================
1258
- * bootstrap-scrollspy.js v2.0.4
1259
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1495
+ }(window.jQuery);
1496
+ /* =============================================================
1497
+ * bootstrap-collapse.js v2.2.2
1498
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
1260
1499
  * =============================================================
1261
1500
  * Copyright 2012 Twitter, Inc.
1262
1501
  *
@@ -1271,7 +1510,7 @@
1271
1510
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1272
1511
  * See the License for the specific language governing permissions and
1273
1512
  * limitations under the License.
1274
- * ============================================================== */
1513
+ * ============================================================ */
1275
1514
 
1276
1515
 
1277
1516
  !function ($) {
@@ -1279,135 +1518,152 @@
1279
1518
  "use strict"; // jshint ;_;
1280
1519
 
1281
1520
 
1282
- /* SCROLLSPY CLASS DEFINITION
1283
- * ========================== */
1521
+ /* COLLAPSE PUBLIC CLASS DEFINITION
1522
+ * ================================ */
1284
1523
 
1285
- function ScrollSpy( element, options) {
1286
- var process = $.proxy(this.process, this)
1287
- , $element = $(element).is('body') ? $(window) : $(element)
1288
- , href
1289
- this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1290
- this.$scrollElement = $element.on('scroll.scroll.data-api', process)
1291
- this.selector = (this.options.target
1292
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1293
- || '') + ' .nav li > a'
1294
- this.$body = $('body')
1295
- this.refresh()
1296
- this.process()
1524
+ var Collapse = function (element, options) {
1525
+ this.$element = $(element)
1526
+ this.options = $.extend({}, $.fn.collapse.defaults, options)
1527
+
1528
+ if (this.options.parent) {
1529
+ this.$parent = $(this.options.parent)
1530
+ }
1531
+
1532
+ this.options.toggle && this.toggle()
1297
1533
  }
1298
1534
 
1299
- ScrollSpy.prototype = {
1535
+ Collapse.prototype = {
1300
1536
 
1301
- constructor: ScrollSpy
1537
+ constructor: Collapse
1302
1538
 
1303
- , refresh: function () {
1304
- var self = this
1305
- , $targets
1539
+ , dimension: function () {
1540
+ var hasWidth = this.$element.hasClass('width')
1541
+ return hasWidth ? 'width' : 'height'
1542
+ }
1306
1543
 
1307
- this.offsets = $([])
1308
- this.targets = $([])
1544
+ , show: function () {
1545
+ var dimension
1546
+ , scroll
1547
+ , actives
1548
+ , hasData
1309
1549
 
1310
- $targets = this.$body
1311
- .find(this.selector)
1312
- .map(function () {
1313
- var $el = $(this)
1314
- , href = $el.data('target') || $el.attr('href')
1315
- , $href = /^#\w/.test(href) && $(href)
1316
- return ( $href
1317
- && href.length
1318
- && [[ $href.position().top, href ]] ) || null
1319
- })
1320
- .sort(function (a, b) { return a[0] - b[0] })
1321
- .each(function () {
1322
- self.offsets.push(this[0])
1323
- self.targets.push(this[1])
1324
- })
1550
+ if (this.transitioning) return
1551
+
1552
+ dimension = this.dimension()
1553
+ scroll = $.camelCase(['scroll', dimension].join('-'))
1554
+ actives = this.$parent && this.$parent.find('> .accordion-group > .in')
1555
+
1556
+ if (actives && actives.length) {
1557
+ hasData = actives.data('collapse')
1558
+ if (hasData && hasData.transitioning) return
1559
+ actives.collapse('hide')
1560
+ hasData || actives.data('collapse', null)
1325
1561
  }
1326
1562
 
1327
- , process: function () {
1328
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1329
- , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1330
- , maxScroll = scrollHeight - this.$scrollElement.height()
1331
- , offsets = this.offsets
1332
- , targets = this.targets
1333
- , activeTarget = this.activeTarget
1334
- , i
1563
+ this.$element[dimension](0)
1564
+ this.transition('addClass', $.Event('show'), 'shown')
1565
+ $.support.transition && this.$element[dimension](this.$element[0][scroll])
1566
+ }
1335
1567
 
1336
- if (scrollTop >= maxScroll) {
1337
- return activeTarget != (i = targets.last()[0])
1338
- && this.activate ( i )
1339
- }
1568
+ , hide: function () {
1569
+ var dimension
1570
+ if (this.transitioning) return
1571
+ dimension = this.dimension()
1572
+ this.reset(this.$element[dimension]())
1573
+ this.transition('removeClass', $.Event('hide'), 'hidden')
1574
+ this.$element[dimension](0)
1575
+ }
1340
1576
 
1341
- for (i = offsets.length; i--;) {
1342
- activeTarget != targets[i]
1343
- && scrollTop >= offsets[i]
1344
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1345
- && this.activate( targets[i] )
1346
- }
1347
- }
1577
+ , reset: function (size) {
1578
+ var dimension = this.dimension()
1348
1579
 
1349
- , activate: function (target) {
1350
- var active
1351
- , selector
1580
+ this.$element
1581
+ .removeClass('collapse')
1582
+ [dimension](size || 'auto')
1583
+ [0].offsetWidth
1352
1584
 
1353
- this.activeTarget = target
1585
+ this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
1354
1586
 
1355
- $(this.selector)
1356
- .parent('.active')
1357
- .removeClass('active')
1587
+ return this
1588
+ }
1358
1589
 
1359
- selector = this.selector
1360
- + '[data-target="' + target + '"],'
1361
- + this.selector + '[href="' + target + '"]'
1590
+ , transition: function (method, startEvent, completeEvent) {
1591
+ var that = this
1592
+ , complete = function () {
1593
+ if (startEvent.type == 'show') that.reset()
1594
+ that.transitioning = 0
1595
+ that.$element.trigger(completeEvent)
1596
+ }
1362
1597
 
1363
- active = $(selector)
1364
- .parent('li')
1365
- .addClass('active')
1598
+ this.$element.trigger(startEvent)
1366
1599
 
1367
- if (active.parent('.dropdown-menu')) {
1368
- active = active.closest('li.dropdown').addClass('active')
1369
- }
1600
+ if (startEvent.isDefaultPrevented()) return
1370
1601
 
1371
- active.trigger('activate')
1372
- }
1602
+ this.transitioning = 1
1603
+
1604
+ this.$element[method]('in')
1605
+
1606
+ $.support.transition && this.$element.hasClass('collapse') ?
1607
+ this.$element.one($.support.transition.end, complete) :
1608
+ complete()
1609
+ }
1610
+
1611
+ , toggle: function () {
1612
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
1613
+ }
1373
1614
 
1374
1615
  }
1375
1616
 
1376
1617
 
1377
- /* SCROLLSPY PLUGIN DEFINITION
1378
- * =========================== */
1618
+ /* COLLAPSE PLUGIN DEFINITION
1619
+ * ========================== */
1379
1620
 
1380
- $.fn.scrollspy = function ( option ) {
1621
+ var old = $.fn.collapse
1622
+
1623
+ $.fn.collapse = function (option) {
1381
1624
  return this.each(function () {
1382
1625
  var $this = $(this)
1383
- , data = $this.data('scrollspy')
1626
+ , data = $this.data('collapse')
1384
1627
  , options = typeof option == 'object' && option
1385
- if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1628
+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))
1386
1629
  if (typeof option == 'string') data[option]()
1387
1630
  })
1388
1631
  }
1389
1632
 
1390
- $.fn.scrollspy.Constructor = ScrollSpy
1391
-
1392
- $.fn.scrollspy.defaults = {
1393
- offset: 10
1633
+ $.fn.collapse.defaults = {
1634
+ toggle: true
1394
1635
  }
1395
1636
 
1637
+ $.fn.collapse.Constructor = Collapse
1396
1638
 
1397
- /* SCROLLSPY DATA-API
1398
- * ================== */
1399
1639
 
1400
- $(function () {
1401
- $('[data-spy="scroll"]').each(function () {
1402
- var $spy = $(this)
1403
- $spy.scrollspy($spy.data())
1404
- })
1640
+ /* COLLAPSE NO CONFLICT
1641
+ * ==================== */
1642
+
1643
+ $.fn.collapse.noConflict = function () {
1644
+ $.fn.collapse = old
1645
+ return this
1646
+ }
1647
+
1648
+
1649
+ /* COLLAPSE DATA-API
1650
+ * ================= */
1651
+
1652
+ $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
1653
+ var $this = $(this), href
1654
+ , target = $this.attr('data-target')
1655
+ || e.preventDefault()
1656
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
1657
+ , option = $(target).data('collapse') ? 'toggle' : $this.data()
1658
+ $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
1659
+ $(target).collapse(option)
1405
1660
  })
1406
1661
 
1407
- }(window.jQuery);/* ========================================================
1408
- * bootstrap-tab.js v2.0.4
1409
- * http://twitter.github.com/bootstrap/javascript.html#tabs
1410
- * ========================================================
1662
+ }(window.jQuery);
1663
+ /* ==========================================================
1664
+ * bootstrap-carousel.js v2.2.2
1665
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
1666
+ * ==========================================================
1411
1667
  * Copyright 2012 Twitter, Inc.
1412
1668
  *
1413
1669
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1421,7 +1677,7 @@
1421
1677
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1422
1678
  * See the License for the specific language governing permissions and
1423
1679
  * limitations under the License.
1424
- * ======================================================== */
1680
+ * ========================================================== */
1425
1681
 
1426
1682
 
1427
1683
  !function ($) {
@@ -1429,117 +1685,168 @@
1429
1685
  "use strict"; // jshint ;_;
1430
1686
 
1431
1687
 
1432
- /* TAB CLASS DEFINITION
1433
- * ==================== */
1688
+ /* CAROUSEL CLASS DEFINITION
1689
+ * ========================= */
1434
1690
 
1435
- var Tab = function ( element ) {
1436
- this.element = $(element)
1691
+ var Carousel = function (element, options) {
1692
+ this.$element = $(element)
1693
+ this.options = options
1694
+ this.options.pause == 'hover' && this.$element
1695
+ .on('mouseenter', $.proxy(this.pause, this))
1696
+ .on('mouseleave', $.proxy(this.cycle, this))
1437
1697
  }
1438
1698
 
1439
- Tab.prototype = {
1440
-
1441
- constructor: Tab
1699
+ Carousel.prototype = {
1442
1700
 
1443
- , show: function () {
1444
- var $this = this.element
1445
- , $ul = $this.closest('ul:not(.dropdown-menu)')
1446
- , selector = $this.attr('data-target')
1447
- , previous
1448
- , $target
1449
- , e
1701
+ cycle: function (e) {
1702
+ if (!e) this.paused = false
1703
+ this.options.interval
1704
+ && !this.paused
1705
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
1706
+ return this
1707
+ }
1450
1708
 
1451
- if (!selector) {
1452
- selector = $this.attr('href')
1453
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1454
- }
1709
+ , to: function (pos) {
1710
+ var $active = this.$element.find('.item.active')
1711
+ , children = $active.parent().children()
1712
+ , activePos = children.index($active)
1713
+ , that = this
1455
1714
 
1456
- if ( $this.parent('li').hasClass('active') ) return
1715
+ if (pos > (children.length - 1) || pos < 0) return
1457
1716
 
1458
- previous = $ul.find('.active a').last()[0]
1717
+ if (this.sliding) {
1718
+ return this.$element.one('slid', function () {
1719
+ that.to(pos)
1720
+ })
1721
+ }
1459
1722
 
1460
- e = $.Event('show', {
1461
- relatedTarget: previous
1462
- })
1723
+ if (activePos == pos) {
1724
+ return this.pause().cycle()
1725
+ }
1463
1726
 
1464
- $this.trigger(e)
1727
+ return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
1728
+ }
1465
1729
 
1466
- if (e.isDefaultPrevented()) return
1730
+ , pause: function (e) {
1731
+ if (!e) this.paused = true
1732
+ if (this.$element.find('.next, .prev').length && $.support.transition.end) {
1733
+ this.$element.trigger($.support.transition.end)
1734
+ this.cycle()
1735
+ }
1736
+ clearInterval(this.interval)
1737
+ this.interval = null
1738
+ return this
1739
+ }
1467
1740
 
1468
- $target = $(selector)
1741
+ , next: function () {
1742
+ if (this.sliding) return
1743
+ return this.slide('next')
1744
+ }
1469
1745
 
1470
- this.activate($this.parent('li'), $ul)
1471
- this.activate($target, $target.parent(), function () {
1472
- $this.trigger({
1473
- type: 'shown'
1474
- , relatedTarget: previous
1475
- })
1476
- })
1746
+ , prev: function () {
1747
+ if (this.sliding) return
1748
+ return this.slide('prev')
1477
1749
  }
1478
1750
 
1479
- , activate: function ( element, container, callback) {
1480
- var $active = container.find('> .active')
1481
- , transition = callback
1482
- && $.support.transition
1483
- && $active.hasClass('fade')
1751
+ , slide: function (type, next) {
1752
+ var $active = this.$element.find('.item.active')
1753
+ , $next = next || $active[type]()
1754
+ , isCycling = this.interval
1755
+ , direction = type == 'next' ? 'left' : 'right'
1756
+ , fallback = type == 'next' ? 'first' : 'last'
1757
+ , that = this
1758
+ , e
1484
1759
 
1485
- function next() {
1486
- $active
1487
- .removeClass('active')
1488
- .find('> .dropdown-menu > .active')
1489
- .removeClass('active')
1760
+ this.sliding = true
1490
1761
 
1491
- element.addClass('active')
1762
+ isCycling && this.pause()
1492
1763
 
1493
- if (transition) {
1494
- element[0].offsetWidth // reflow for transition
1495
- element.addClass('in')
1496
- } else {
1497
- element.removeClass('fade')
1498
- }
1764
+ $next = $next.length ? $next : this.$element.find('.item')[fallback]()
1499
1765
 
1500
- if ( element.parent('.dropdown-menu') ) {
1501
- element.closest('li.dropdown').addClass('active')
1502
- }
1766
+ e = $.Event('slide', {
1767
+ relatedTarget: $next[0]
1768
+ })
1503
1769
 
1504
- callback && callback()
1770
+ if ($next.hasClass('active')) return
1771
+
1772
+ if ($.support.transition && this.$element.hasClass('slide')) {
1773
+ this.$element.trigger(e)
1774
+ if (e.isDefaultPrevented()) return
1775
+ $next.addClass(type)
1776
+ $next[0].offsetWidth // force reflow
1777
+ $active.addClass(direction)
1778
+ $next.addClass(direction)
1779
+ this.$element.one($.support.transition.end, function () {
1780
+ $next.removeClass([type, direction].join(' ')).addClass('active')
1781
+ $active.removeClass(['active', direction].join(' '))
1782
+ that.sliding = false
1783
+ setTimeout(function () { that.$element.trigger('slid') }, 0)
1784
+ })
1785
+ } else {
1786
+ this.$element.trigger(e)
1787
+ if (e.isDefaultPrevented()) return
1788
+ $active.removeClass('active')
1789
+ $next.addClass('active')
1790
+ this.sliding = false
1791
+ this.$element.trigger('slid')
1505
1792
  }
1506
1793
 
1507
- transition ?
1508
- $active.one($.support.transition.end, next) :
1509
- next()
1794
+ isCycling && this.cycle()
1510
1795
 
1511
- $active.removeClass('in')
1796
+ return this
1512
1797
  }
1798
+
1513
1799
  }
1514
1800
 
1515
1801
 
1516
- /* TAB PLUGIN DEFINITION
1517
- * ===================== */
1802
+ /* CAROUSEL PLUGIN DEFINITION
1803
+ * ========================== */
1518
1804
 
1519
- $.fn.tab = function ( option ) {
1805
+ var old = $.fn.carousel
1806
+
1807
+ $.fn.carousel = function (option) {
1520
1808
  return this.each(function () {
1521
1809
  var $this = $(this)
1522
- , data = $this.data('tab')
1523
- if (!data) $this.data('tab', (data = new Tab(this)))
1524
- if (typeof option == 'string') data[option]()
1810
+ , data = $this.data('carousel')
1811
+ , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
1812
+ , action = typeof option == 'string' ? option : options.slide
1813
+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))
1814
+ if (typeof option == 'number') data.to(option)
1815
+ else if (action) data[action]()
1816
+ else if (options.interval) data.cycle()
1525
1817
  })
1526
1818
  }
1527
1819
 
1528
- $.fn.tab.Constructor = Tab
1820
+ $.fn.carousel.defaults = {
1821
+ interval: 5000
1822
+ , pause: 'hover'
1823
+ }
1824
+
1825
+ $.fn.carousel.Constructor = Carousel
1529
1826
 
1530
1827
 
1531
- /* TAB DATA-API
1532
- * ============ */
1828
+ /* CAROUSEL NO CONFLICT
1829
+ * ==================== */
1533
1830
 
1534
- $(function () {
1535
- $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1536
- e.preventDefault()
1537
- $(this).tab('show')
1538
- })
1831
+ $.fn.carousel.noConflict = function () {
1832
+ $.fn.carousel = old
1833
+ return this
1834
+ }
1835
+
1836
+ /* CAROUSEL DATA-API
1837
+ * ================= */
1838
+
1839
+ $(document).on('click.carousel.data-api', '[data-slide]', function (e) {
1840
+ var $this = $(this), href
1841
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1842
+ , options = $.extend({}, $target.data(), $this.data())
1843
+ $target.carousel(options)
1844
+ e.preventDefault()
1539
1845
  })
1540
1846
 
1541
- }(window.jQuery);/* =============================================================
1542
- * bootstrap-typeahead.js v2.0.4
1847
+ }(window.jQuery);
1848
+ /* =============================================================
1849
+ * bootstrap-typeahead.js v2.2.2
1543
1850
  * http://twitter.github.com/bootstrap/javascript.html#typeahead
1544
1851
  * =============================================================
1545
1852
  * Copyright 2012 Twitter, Inc.
@@ -1573,8 +1880,8 @@
1573
1880
  this.sorter = this.options.sorter || this.sorter
1574
1881
  this.highlighter = this.options.highlighter || this.highlighter
1575
1882
  this.updater = this.options.updater || this.updater
1576
- this.$menu = $(this.options.menu).appendTo('body')
1577
1883
  this.source = this.options.source
1884
+ this.$menu = $(this.options.menu)
1578
1885
  this.shown = false
1579
1886
  this.listen()
1580
1887
  }
@@ -1596,16 +1903,18 @@
1596
1903
  }
1597
1904
 
1598
1905
  , show: function () {
1599
- var pos = $.extend({}, this.$element.offset(), {
1906
+ var pos = $.extend({}, this.$element.position(), {
1600
1907
  height: this.$element[0].offsetHeight
1601
1908
  })
1602
1909
 
1603
- this.$menu.css({
1604
- top: pos.top + pos.height
1605
- , left: pos.left
1606
- })
1910
+ this.$menu
1911
+ .insertAfter(this.$element)
1912
+ .css({
1913
+ top: pos.top + pos.height
1914
+ , left: pos.left
1915
+ })
1916
+ .show()
1607
1917
 
1608
- this.$menu.show()
1609
1918
  this.shown = true
1610
1919
  return this
1611
1920
  }
@@ -1617,17 +1926,23 @@
1617
1926
  }
1618
1927
 
1619
1928
  , lookup: function (event) {
1620
- var that = this
1621
- , items
1622
- , q
1929
+ var items
1623
1930
 
1624
1931
  this.query = this.$element.val()
1625
1932
 
1626
- if (!this.query) {
1933
+ if (!this.query || this.query.length < this.options.minLength) {
1627
1934
  return this.shown ? this.hide() : this
1628
1935
  }
1629
1936
 
1630
- items = $.grep(this.source, function (item) {
1937
+ items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
1938
+
1939
+ return items ? this.process(items) : this
1940
+ }
1941
+
1942
+ , process: function (items) {
1943
+ var that = this
1944
+
1945
+ items = $.grep(items, function (item) {
1631
1946
  return that.matcher(item)
1632
1947
  })
1633
1948
 
@@ -1708,8 +2023,8 @@
1708
2023
  .on('keypress', $.proxy(this.keypress, this))
1709
2024
  .on('keyup', $.proxy(this.keyup, this))
1710
2025
 
1711
- if ($.browser.webkit || $.browser.msie) {
1712
- this.$element.on('keydown', $.proxy(this.keypress, this))
2026
+ if (this.eventSupported('keydown')) {
2027
+ this.$element.on('keydown', $.proxy(this.keydown, this))
1713
2028
  }
1714
2029
 
1715
2030
  this.$menu
@@ -1717,32 +2032,16 @@
1717
2032
  .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
1718
2033
  }
1719
2034
 
1720
- , keyup: function (e) {
1721
- switch(e.keyCode) {
1722
- case 40: // down arrow
1723
- case 38: // up arrow
1724
- break
1725
-
1726
- case 9: // tab
1727
- case 13: // enter
1728
- if (!this.shown) return
1729
- this.select()
1730
- break
1731
-
1732
- case 27: // escape
1733
- if (!this.shown) return
1734
- this.hide()
1735
- break
1736
-
1737
- default:
1738
- this.lookup()
2035
+ , eventSupported: function(eventName) {
2036
+ var isSupported = eventName in this.$element
2037
+ if (!isSupported) {
2038
+ this.$element.setAttribute(eventName, 'return;')
2039
+ isSupported = typeof this.$element[eventName] === 'function'
1739
2040
  }
2041
+ return isSupported
2042
+ }
1740
2043
 
1741
- e.stopPropagation()
1742
- e.preventDefault()
1743
- }
1744
-
1745
- , keypress: function (e) {
2044
+ , move: function (e) {
1746
2045
  if (!this.shown) return
1747
2046
 
1748
2047
  switch(e.keyCode) {
@@ -1753,13 +2052,11 @@
1753
2052
  break
1754
2053
 
1755
2054
  case 38: // up arrow
1756
- if (e.type != 'keydown') break
1757
2055
  e.preventDefault()
1758
2056
  this.prev()
1759
2057
  break
1760
2058
 
1761
2059
  case 40: // down arrow
1762
- if (e.type != 'keydown') break
1763
2060
  e.preventDefault()
1764
2061
  this.next()
1765
2062
  break
@@ -1768,6 +2065,44 @@
1768
2065
  e.stopPropagation()
1769
2066
  }
1770
2067
 
2068
+ , keydown: function (e) {
2069
+ this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
2070
+ this.move(e)
2071
+ }
2072
+
2073
+ , keypress: function (e) {
2074
+ if (this.suppressKeyPressRepeat) return
2075
+ this.move(e)
2076
+ }
2077
+
2078
+ , keyup: function (e) {
2079
+ switch(e.keyCode) {
2080
+ case 40: // down arrow
2081
+ case 38: // up arrow
2082
+ case 16: // shift
2083
+ case 17: // ctrl
2084
+ case 18: // alt
2085
+ break
2086
+
2087
+ case 9: // tab
2088
+ case 13: // enter
2089
+ if (!this.shown) return
2090
+ this.select()
2091
+ break
2092
+
2093
+ case 27: // escape
2094
+ if (!this.shown) return
2095
+ this.hide()
2096
+ break
2097
+
2098
+ default:
2099
+ this.lookup()
2100
+ }
2101
+
2102
+ e.stopPropagation()
2103
+ e.preventDefault()
2104
+ }
2105
+
1771
2106
  , blur: function (e) {
1772
2107
  var that = this
1773
2108
  setTimeout(function () { that.hide() }, 150)
@@ -1790,6 +2125,8 @@
1790
2125
  /* TYPEAHEAD PLUGIN DEFINITION
1791
2126
  * =========================== */
1792
2127
 
2128
+ var old = $.fn.typeahead
2129
+
1793
2130
  $.fn.typeahead = function (option) {
1794
2131
  return this.each(function () {
1795
2132
  var $this = $(this)
@@ -1805,21 +2142,29 @@
1805
2142
  , items: 8
1806
2143
  , menu: '<ul class="typeahead dropdown-menu"></ul>'
1807
2144
  , item: '<li><a href="#"></a></li>'
2145
+ , minLength: 1
1808
2146
  }
1809
2147
 
1810
2148
  $.fn.typeahead.Constructor = Typeahead
1811
2149
 
1812
2150
 
2151
+ /* TYPEAHEAD NO CONFLICT
2152
+ * =================== */
2153
+
2154
+ $.fn.typeahead.noConflict = function () {
2155
+ $.fn.typeahead = old
2156
+ return this
2157
+ }
2158
+
2159
+
1813
2160
  /* TYPEAHEAD DATA-API
1814
2161
  * ================== */
1815
2162
 
1816
- $(function () {
1817
- $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
1818
- var $this = $(this)
1819
- if ($this.data('typeahead')) return
1820
- e.preventDefault()
1821
- $this.typeahead($this.data())
1822
- })
2163
+ $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
2164
+ var $this = $(this)
2165
+ if ($this.data('typeahead')) return
2166
+ e.preventDefault()
2167
+ $this.typeahead($this.data())
1823
2168
  })
1824
2169
 
1825
- }(window.jQuery);
2170
+ }(window.jQuery);