angularjs-rails 1.0.7 → 1.0.8

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 (300) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2 -2
  3. data/lib/angularjs-rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/angular-bootstrap-prettify.js +14 -4
  5. data/vendor/assets/javascripts/angular-bootstrap.js +1 -1
  6. data/vendor/assets/javascripts/angular-cookies.js +12 -1
  7. data/vendor/assets/javascripts/angular-loader.js +3 -3
  8. data/vendor/assets/javascripts/angular-mocks.js +99 -82
  9. data/vendor/assets/javascripts/angular-resource.js +1 -1
  10. data/vendor/assets/javascripts/angular-sanitize.js +24 -5
  11. data/vendor/assets/javascripts/angular-scenario.js +484 -173
  12. data/vendor/assets/javascripts/angular.js +484 -173
  13. data/vendor/assets/javascripts/i18n/angular-locale_af-na.js +98 -0
  14. data/vendor/assets/javascripts/i18n/angular-locale_af-za.js +98 -0
  15. data/vendor/assets/javascripts/i18n/angular-locale_af.js +98 -0
  16. data/vendor/assets/javascripts/i18n/angular-locale_am-et.js +98 -0
  17. data/vendor/assets/javascripts/i18n/angular-locale_am.js +98 -0
  18. data/vendor/assets/javascripts/i18n/angular-locale_ar-001.js +98 -0
  19. data/vendor/assets/javascripts/i18n/angular-locale_ar-ae.js +98 -0
  20. data/vendor/assets/javascripts/i18n/angular-locale_ar-bh.js +98 -0
  21. data/vendor/assets/javascripts/i18n/angular-locale_ar-dz.js +98 -0
  22. data/vendor/assets/javascripts/i18n/angular-locale_ar-eg.js +98 -0
  23. data/vendor/assets/javascripts/i18n/angular-locale_ar-iq.js +98 -0
  24. data/vendor/assets/javascripts/i18n/angular-locale_ar-jo.js +98 -0
  25. data/vendor/assets/javascripts/i18n/angular-locale_ar-kw.js +98 -0
  26. data/vendor/assets/javascripts/i18n/angular-locale_ar-lb.js +98 -0
  27. data/vendor/assets/javascripts/i18n/angular-locale_ar-ly.js +98 -0
  28. data/vendor/assets/javascripts/i18n/angular-locale_ar-ma.js +98 -0
  29. data/vendor/assets/javascripts/i18n/angular-locale_ar-om.js +98 -0
  30. data/vendor/assets/javascripts/i18n/angular-locale_ar-qa.js +98 -0
  31. data/vendor/assets/javascripts/i18n/angular-locale_ar-sa.js +98 -0
  32. data/vendor/assets/javascripts/i18n/angular-locale_ar-sd.js +98 -0
  33. data/vendor/assets/javascripts/i18n/angular-locale_ar-sy.js +98 -0
  34. data/vendor/assets/javascripts/i18n/angular-locale_ar-tn.js +98 -0
  35. data/vendor/assets/javascripts/i18n/angular-locale_ar-ye.js +98 -0
  36. data/vendor/assets/javascripts/i18n/angular-locale_ar.js +98 -0
  37. data/vendor/assets/javascripts/i18n/angular-locale_bg-bg.js +98 -0
  38. data/vendor/assets/javascripts/i18n/angular-locale_bg.js +98 -0
  39. data/vendor/assets/javascripts/i18n/angular-locale_bn-bd.js +98 -0
  40. data/vendor/assets/javascripts/i18n/angular-locale_bn-in.js +98 -0
  41. data/vendor/assets/javascripts/i18n/angular-locale_bn.js +98 -0
  42. data/vendor/assets/javascripts/i18n/angular-locale_ca-ad.js +98 -0
  43. data/vendor/assets/javascripts/i18n/angular-locale_ca-es.js +98 -0
  44. data/vendor/assets/javascripts/i18n/angular-locale_ca.js +98 -0
  45. data/vendor/assets/javascripts/i18n/angular-locale_chr.js +4 -0
  46. data/vendor/assets/javascripts/i18n/angular-locale_cs-cz.js +98 -0
  47. data/vendor/assets/javascripts/i18n/angular-locale_cs.js +98 -0
  48. data/vendor/assets/javascripts/i18n/angular-locale_cy.js +4 -0
  49. data/vendor/assets/javascripts/i18n/angular-locale_da-dk.js +98 -0
  50. data/vendor/assets/javascripts/i18n/angular-locale_da.js +98 -0
  51. data/vendor/assets/javascripts/i18n/angular-locale_de-at.js +98 -0
  52. data/vendor/assets/javascripts/i18n/angular-locale_de-be.js +98 -0
  53. data/vendor/assets/javascripts/i18n/angular-locale_de-ch.js +98 -0
  54. data/vendor/assets/javascripts/i18n/angular-locale_de-de.js +98 -0
  55. data/vendor/assets/javascripts/i18n/angular-locale_de-li.js +98 -0
  56. data/vendor/assets/javascripts/i18n/angular-locale_de-lu.js +98 -0
  57. data/vendor/assets/javascripts/i18n/angular-locale_de.js +98 -0
  58. data/vendor/assets/javascripts/i18n/angular-locale_el-cy.js +98 -0
  59. data/vendor/assets/javascripts/i18n/angular-locale_el-gr.js +98 -0
  60. data/vendor/assets/javascripts/i18n/angular-locale_el-polyton.js +4 -0
  61. data/vendor/assets/javascripts/i18n/angular-locale_el.js +98 -0
  62. data/vendor/assets/javascripts/i18n/angular-locale_en-as.js +98 -0
  63. data/vendor/assets/javascripts/i18n/angular-locale_en-au.js +98 -0
  64. data/vendor/assets/javascripts/i18n/angular-locale_en-bb.js +98 -0
  65. data/vendor/assets/javascripts/i18n/angular-locale_en-be.js +98 -0
  66. data/vendor/assets/javascripts/i18n/angular-locale_en-bm.js +98 -0
  67. data/vendor/assets/javascripts/i18n/angular-locale_en-bw.js +98 -0
  68. data/vendor/assets/javascripts/i18n/angular-locale_en-bz.js +98 -0
  69. data/vendor/assets/javascripts/i18n/angular-locale_en-ca.js +98 -0
  70. data/vendor/assets/javascripts/i18n/angular-locale_en-dsrt-us.js +98 -0
  71. data/vendor/assets/javascripts/i18n/angular-locale_en-dsrt.js +98 -0
  72. data/vendor/assets/javascripts/i18n/angular-locale_en-fm.js +98 -0
  73. data/vendor/assets/javascripts/i18n/angular-locale_en-gb.js +98 -0
  74. data/vendor/assets/javascripts/i18n/angular-locale_en-gu.js +98 -0
  75. data/vendor/assets/javascripts/i18n/angular-locale_en-gy.js +98 -0
  76. data/vendor/assets/javascripts/i18n/angular-locale_en-hk.js +98 -0
  77. data/vendor/assets/javascripts/i18n/angular-locale_en-ie.js +98 -0
  78. data/vendor/assets/javascripts/i18n/angular-locale_en-in.js +98 -0
  79. data/vendor/assets/javascripts/i18n/angular-locale_en-iso.js +98 -0
  80. data/vendor/assets/javascripts/i18n/angular-locale_en-jm.js +98 -0
  81. data/vendor/assets/javascripts/i18n/angular-locale_en-mh.js +98 -0
  82. data/vendor/assets/javascripts/i18n/angular-locale_en-mp.js +98 -0
  83. data/vendor/assets/javascripts/i18n/angular-locale_en-mt.js +98 -0
  84. data/vendor/assets/javascripts/i18n/angular-locale_en-mu.js +98 -0
  85. data/vendor/assets/javascripts/i18n/angular-locale_en-na.js +98 -0
  86. data/vendor/assets/javascripts/i18n/angular-locale_en-nz.js +98 -0
  87. data/vendor/assets/javascripts/i18n/angular-locale_en-ph.js +98 -0
  88. data/vendor/assets/javascripts/i18n/angular-locale_en-pk.js +98 -0
  89. data/vendor/assets/javascripts/i18n/angular-locale_en-pr.js +98 -0
  90. data/vendor/assets/javascripts/i18n/angular-locale_en-pw.js +98 -0
  91. data/vendor/assets/javascripts/i18n/angular-locale_en-sg.js +98 -0
  92. data/vendor/assets/javascripts/i18n/angular-locale_en-tc.js +98 -0
  93. data/vendor/assets/javascripts/i18n/angular-locale_en-tt.js +98 -0
  94. data/vendor/assets/javascripts/i18n/angular-locale_en-um.js +98 -0
  95. data/vendor/assets/javascripts/i18n/angular-locale_en-us.js +98 -0
  96. data/vendor/assets/javascripts/i18n/angular-locale_en-vg.js +98 -0
  97. data/vendor/assets/javascripts/i18n/angular-locale_en-vi.js +98 -0
  98. data/vendor/assets/javascripts/i18n/angular-locale_en-za.js +98 -0
  99. data/vendor/assets/javascripts/i18n/angular-locale_en-zw.js +98 -0
  100. data/vendor/assets/javascripts/i18n/angular-locale_en-zz.js +4 -0
  101. data/vendor/assets/javascripts/i18n/angular-locale_en.js +98 -0
  102. data/vendor/assets/javascripts/i18n/angular-locale_es-419.js +98 -0
  103. data/vendor/assets/javascripts/i18n/angular-locale_es-ar.js +98 -0
  104. data/vendor/assets/javascripts/i18n/angular-locale_es-bo.js +98 -0
  105. data/vendor/assets/javascripts/i18n/angular-locale_es-cl.js +98 -0
  106. data/vendor/assets/javascripts/i18n/angular-locale_es-co.js +98 -0
  107. data/vendor/assets/javascripts/i18n/angular-locale_es-cr.js +98 -0
  108. data/vendor/assets/javascripts/i18n/angular-locale_es-do.js +98 -0
  109. data/vendor/assets/javascripts/i18n/angular-locale_es-ea.js +98 -0
  110. data/vendor/assets/javascripts/i18n/angular-locale_es-ec.js +98 -0
  111. data/vendor/assets/javascripts/i18n/angular-locale_es-es.js +98 -0
  112. data/vendor/assets/javascripts/i18n/angular-locale_es-gq.js +98 -0
  113. data/vendor/assets/javascripts/i18n/angular-locale_es-gt.js +98 -0
  114. data/vendor/assets/javascripts/i18n/angular-locale_es-hn.js +98 -0
  115. data/vendor/assets/javascripts/i18n/angular-locale_es-ic.js +98 -0
  116. data/vendor/assets/javascripts/i18n/angular-locale_es-mx.js +98 -0
  117. data/vendor/assets/javascripts/i18n/angular-locale_es-ni.js +98 -0
  118. data/vendor/assets/javascripts/i18n/angular-locale_es-pa.js +98 -0
  119. data/vendor/assets/javascripts/i18n/angular-locale_es-pe.js +98 -0
  120. data/vendor/assets/javascripts/i18n/angular-locale_es-pr.js +98 -0
  121. data/vendor/assets/javascripts/i18n/angular-locale_es-py.js +98 -0
  122. data/vendor/assets/javascripts/i18n/angular-locale_es-sv.js +98 -0
  123. data/vendor/assets/javascripts/i18n/angular-locale_es-us.js +98 -0
  124. data/vendor/assets/javascripts/i18n/angular-locale_es-uy.js +98 -0
  125. data/vendor/assets/javascripts/i18n/angular-locale_es-ve.js +98 -0
  126. data/vendor/assets/javascripts/i18n/angular-locale_es.js +98 -0
  127. data/vendor/assets/javascripts/i18n/angular-locale_et-ee.js +98 -0
  128. data/vendor/assets/javascripts/i18n/angular-locale_et.js +98 -0
  129. data/vendor/assets/javascripts/i18n/angular-locale_eu-es.js +98 -0
  130. data/vendor/assets/javascripts/i18n/angular-locale_eu.js +98 -0
  131. data/vendor/assets/javascripts/i18n/angular-locale_fa-af.js +98 -0
  132. data/vendor/assets/javascripts/i18n/angular-locale_fa-ir.js +98 -0
  133. data/vendor/assets/javascripts/i18n/angular-locale_fa.js +98 -0
  134. data/vendor/assets/javascripts/i18n/angular-locale_fi-fi.js +98 -0
  135. data/vendor/assets/javascripts/i18n/angular-locale_fi.js +98 -0
  136. data/vendor/assets/javascripts/i18n/angular-locale_fil-ph.js +98 -0
  137. data/vendor/assets/javascripts/i18n/angular-locale_fil.js +98 -0
  138. data/vendor/assets/javascripts/i18n/angular-locale_fr-be.js +98 -0
  139. data/vendor/assets/javascripts/i18n/angular-locale_fr-bf.js +98 -0
  140. data/vendor/assets/javascripts/i18n/angular-locale_fr-bi.js +98 -0
  141. data/vendor/assets/javascripts/i18n/angular-locale_fr-bj.js +98 -0
  142. data/vendor/assets/javascripts/i18n/angular-locale_fr-bl.js +98 -0
  143. data/vendor/assets/javascripts/i18n/angular-locale_fr-ca.js +98 -0
  144. data/vendor/assets/javascripts/i18n/angular-locale_fr-cd.js +98 -0
  145. data/vendor/assets/javascripts/i18n/angular-locale_fr-cf.js +98 -0
  146. data/vendor/assets/javascripts/i18n/angular-locale_fr-cg.js +98 -0
  147. data/vendor/assets/javascripts/i18n/angular-locale_fr-ch.js +98 -0
  148. data/vendor/assets/javascripts/i18n/angular-locale_fr-ci.js +98 -0
  149. data/vendor/assets/javascripts/i18n/angular-locale_fr-cm.js +98 -0
  150. data/vendor/assets/javascripts/i18n/angular-locale_fr-dj.js +98 -0
  151. data/vendor/assets/javascripts/i18n/angular-locale_fr-fr.js +98 -0
  152. data/vendor/assets/javascripts/i18n/angular-locale_fr-ga.js +98 -0
  153. data/vendor/assets/javascripts/i18n/angular-locale_fr-gf.js +98 -0
  154. data/vendor/assets/javascripts/i18n/angular-locale_fr-gn.js +98 -0
  155. data/vendor/assets/javascripts/i18n/angular-locale_fr-gp.js +98 -0
  156. data/vendor/assets/javascripts/i18n/angular-locale_fr-gq.js +98 -0
  157. data/vendor/assets/javascripts/i18n/angular-locale_fr-km.js +98 -0
  158. data/vendor/assets/javascripts/i18n/angular-locale_fr-lu.js +98 -0
  159. data/vendor/assets/javascripts/i18n/angular-locale_fr-mc.js +98 -0
  160. data/vendor/assets/javascripts/i18n/angular-locale_fr-mf.js +98 -0
  161. data/vendor/assets/javascripts/i18n/angular-locale_fr-mg.js +98 -0
  162. data/vendor/assets/javascripts/i18n/angular-locale_fr-ml.js +98 -0
  163. data/vendor/assets/javascripts/i18n/angular-locale_fr-mq.js +98 -0
  164. data/vendor/assets/javascripts/i18n/angular-locale_fr-ne.js +98 -0
  165. data/vendor/assets/javascripts/i18n/angular-locale_fr-re.js +98 -0
  166. data/vendor/assets/javascripts/i18n/angular-locale_fr-rw.js +98 -0
  167. data/vendor/assets/javascripts/i18n/angular-locale_fr-sn.js +98 -0
  168. data/vendor/assets/javascripts/i18n/angular-locale_fr-td.js +98 -0
  169. data/vendor/assets/javascripts/i18n/angular-locale_fr-tg.js +98 -0
  170. data/vendor/assets/javascripts/i18n/angular-locale_fr-yt.js +98 -0
  171. data/vendor/assets/javascripts/i18n/angular-locale_fr.js +98 -0
  172. data/vendor/assets/javascripts/i18n/angular-locale_gl-es.js +98 -0
  173. data/vendor/assets/javascripts/i18n/angular-locale_gl.js +98 -0
  174. data/vendor/assets/javascripts/i18n/angular-locale_gsw-ch.js +98 -0
  175. data/vendor/assets/javascripts/i18n/angular-locale_gsw.js +98 -0
  176. data/vendor/assets/javascripts/i18n/angular-locale_gu-in.js +98 -0
  177. data/vendor/assets/javascripts/i18n/angular-locale_gu.js +98 -0
  178. data/vendor/assets/javascripts/i18n/angular-locale_haw.js +4 -0
  179. data/vendor/assets/javascripts/i18n/angular-locale_he-il.js +98 -0
  180. data/vendor/assets/javascripts/i18n/angular-locale_he.js +98 -0
  181. data/vendor/assets/javascripts/i18n/angular-locale_hi-in.js +98 -0
  182. data/vendor/assets/javascripts/i18n/angular-locale_hi.js +98 -0
  183. data/vendor/assets/javascripts/i18n/angular-locale_hr-hr.js +98 -0
  184. data/vendor/assets/javascripts/i18n/angular-locale_hr.js +98 -0
  185. data/vendor/assets/javascripts/i18n/angular-locale_hu-hu.js +98 -0
  186. data/vendor/assets/javascripts/i18n/angular-locale_hu.js +98 -0
  187. data/vendor/assets/javascripts/i18n/angular-locale_id-id.js +98 -0
  188. data/vendor/assets/javascripts/i18n/angular-locale_id.js +98 -0
  189. data/vendor/assets/javascripts/i18n/angular-locale_in.js +98 -0
  190. data/vendor/assets/javascripts/i18n/angular-locale_is-is.js +98 -0
  191. data/vendor/assets/javascripts/i18n/angular-locale_is.js +98 -0
  192. data/vendor/assets/javascripts/i18n/angular-locale_it-ch.js +98 -0
  193. data/vendor/assets/javascripts/i18n/angular-locale_it-it.js +98 -0
  194. data/vendor/assets/javascripts/i18n/angular-locale_it-sm.js +98 -0
  195. data/vendor/assets/javascripts/i18n/angular-locale_it.js +98 -0
  196. data/vendor/assets/javascripts/i18n/angular-locale_iw.js +98 -0
  197. data/vendor/assets/javascripts/i18n/angular-locale_ja-jp.js +98 -0
  198. data/vendor/assets/javascripts/i18n/angular-locale_ja.js +98 -0
  199. data/vendor/assets/javascripts/i18n/angular-locale_kn-in.js +98 -0
  200. data/vendor/assets/javascripts/i18n/angular-locale_kn.js +98 -0
  201. data/vendor/assets/javascripts/i18n/angular-locale_ko-kr.js +98 -0
  202. data/vendor/assets/javascripts/i18n/angular-locale_ko.js +98 -0
  203. data/vendor/assets/javascripts/i18n/angular-locale_ln-cd.js +98 -0
  204. data/vendor/assets/javascripts/i18n/angular-locale_ln-cg.js +98 -0
  205. data/vendor/assets/javascripts/i18n/angular-locale_ln.js +98 -0
  206. data/vendor/assets/javascripts/i18n/angular-locale_lt-lt.js +98 -0
  207. data/vendor/assets/javascripts/i18n/angular-locale_lt.js +98 -0
  208. data/vendor/assets/javascripts/i18n/angular-locale_lv-lv.js +98 -0
  209. data/vendor/assets/javascripts/i18n/angular-locale_lv.js +98 -0
  210. data/vendor/assets/javascripts/i18n/angular-locale_ml-in.js +98 -0
  211. data/vendor/assets/javascripts/i18n/angular-locale_ml.js +98 -0
  212. data/vendor/assets/javascripts/i18n/angular-locale_mo.js +4 -0
  213. data/vendor/assets/javascripts/i18n/angular-locale_mr-in.js +98 -0
  214. data/vendor/assets/javascripts/i18n/angular-locale_mr.js +98 -0
  215. data/vendor/assets/javascripts/i18n/angular-locale_ms-bn.js +98 -0
  216. data/vendor/assets/javascripts/i18n/angular-locale_ms-my.js +98 -0
  217. data/vendor/assets/javascripts/i18n/angular-locale_ms.js +98 -0
  218. data/vendor/assets/javascripts/i18n/angular-locale_mt-mt.js +98 -0
  219. data/vendor/assets/javascripts/i18n/angular-locale_mt.js +98 -0
  220. data/vendor/assets/javascripts/i18n/angular-locale_nl-aw.js +98 -0
  221. data/vendor/assets/javascripts/i18n/angular-locale_nl-be.js +98 -0
  222. data/vendor/assets/javascripts/i18n/angular-locale_nl-cw.js +98 -0
  223. data/vendor/assets/javascripts/i18n/angular-locale_nl-nl.js +98 -0
  224. data/vendor/assets/javascripts/i18n/angular-locale_nl-sx.js +98 -0
  225. data/vendor/assets/javascripts/i18n/angular-locale_nl.js +98 -0
  226. data/vendor/assets/javascripts/i18n/angular-locale_no.js +98 -0
  227. data/vendor/assets/javascripts/i18n/angular-locale_or-in.js +98 -0
  228. data/vendor/assets/javascripts/i18n/angular-locale_or.js +98 -0
  229. data/vendor/assets/javascripts/i18n/angular-locale_pl-pl.js +98 -0
  230. data/vendor/assets/javascripts/i18n/angular-locale_pl.js +98 -0
  231. data/vendor/assets/javascripts/i18n/angular-locale_pt-ao.js +98 -0
  232. data/vendor/assets/javascripts/i18n/angular-locale_pt-br.js +98 -0
  233. data/vendor/assets/javascripts/i18n/angular-locale_pt-gw.js +98 -0
  234. data/vendor/assets/javascripts/i18n/angular-locale_pt-mz.js +98 -0
  235. data/vendor/assets/javascripts/i18n/angular-locale_pt-pt.js +98 -0
  236. data/vendor/assets/javascripts/i18n/angular-locale_pt-st.js +98 -0
  237. data/vendor/assets/javascripts/i18n/angular-locale_pt.js +98 -0
  238. data/vendor/assets/javascripts/i18n/angular-locale_ro-md.js +98 -0
  239. data/vendor/assets/javascripts/i18n/angular-locale_ro-ro.js +98 -0
  240. data/vendor/assets/javascripts/i18n/angular-locale_ro.js +98 -0
  241. data/vendor/assets/javascripts/i18n/angular-locale_ru-md.js +98 -0
  242. data/vendor/assets/javascripts/i18n/angular-locale_ru-ru.js +98 -0
  243. data/vendor/assets/javascripts/i18n/angular-locale_ru-ua.js +98 -0
  244. data/vendor/assets/javascripts/i18n/angular-locale_ru.js +98 -0
  245. data/vendor/assets/javascripts/i18n/angular-locale_sk-sk.js +98 -0
  246. data/vendor/assets/javascripts/i18n/angular-locale_sk.js +98 -0
  247. data/vendor/assets/javascripts/i18n/angular-locale_sl-si.js +98 -0
  248. data/vendor/assets/javascripts/i18n/angular-locale_sl.js +98 -0
  249. data/vendor/assets/javascripts/i18n/angular-locale_sq-al.js +98 -0
  250. data/vendor/assets/javascripts/i18n/angular-locale_sq.js +98 -0
  251. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl-ba.js +98 -0
  252. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl-me.js +98 -0
  253. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl-rs.js +98 -0
  254. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl.js +98 -0
  255. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn-ba.js +98 -0
  256. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn-me.js +98 -0
  257. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn-rs.js +98 -0
  258. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn.js +98 -0
  259. data/vendor/assets/javascripts/i18n/angular-locale_sr-rs.js +4 -0
  260. data/vendor/assets/javascripts/i18n/angular-locale_sr.js +98 -0
  261. data/vendor/assets/javascripts/i18n/angular-locale_sv-fi.js +98 -0
  262. data/vendor/assets/javascripts/i18n/angular-locale_sv-se.js +98 -0
  263. data/vendor/assets/javascripts/i18n/angular-locale_sv.js +98 -0
  264. data/vendor/assets/javascripts/i18n/angular-locale_sw-ke.js +98 -0
  265. data/vendor/assets/javascripts/i18n/angular-locale_sw-tz.js +98 -0
  266. data/vendor/assets/javascripts/i18n/angular-locale_sw.js +98 -0
  267. data/vendor/assets/javascripts/i18n/angular-locale_ta-in.js +98 -0
  268. data/vendor/assets/javascripts/i18n/angular-locale_ta-lk.js +98 -0
  269. data/vendor/assets/javascripts/i18n/angular-locale_ta.js +98 -0
  270. data/vendor/assets/javascripts/i18n/angular-locale_te-in.js +98 -0
  271. data/vendor/assets/javascripts/i18n/angular-locale_te.js +98 -0
  272. data/vendor/assets/javascripts/i18n/angular-locale_th-th.js +98 -0
  273. data/vendor/assets/javascripts/i18n/angular-locale_th.js +98 -0
  274. data/vendor/assets/javascripts/i18n/angular-locale_tl-ph.js +4 -0
  275. data/vendor/assets/javascripts/i18n/angular-locale_tl.js +98 -0
  276. data/vendor/assets/javascripts/i18n/angular-locale_tr-tr.js +98 -0
  277. data/vendor/assets/javascripts/i18n/angular-locale_tr.js +98 -0
  278. data/vendor/assets/javascripts/i18n/angular-locale_uk-ua.js +98 -0
  279. data/vendor/assets/javascripts/i18n/angular-locale_uk.js +98 -0
  280. data/vendor/assets/javascripts/i18n/angular-locale_ur-in.js +98 -0
  281. data/vendor/assets/javascripts/i18n/angular-locale_ur-pk.js +98 -0
  282. data/vendor/assets/javascripts/i18n/angular-locale_ur.js +98 -0
  283. data/vendor/assets/javascripts/i18n/angular-locale_vi-vn.js +98 -0
  284. data/vendor/assets/javascripts/i18n/angular-locale_vi.js +98 -0
  285. data/vendor/assets/javascripts/i18n/angular-locale_zh-cn.js +98 -0
  286. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-cn.js +98 -0
  287. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-hk.js +98 -0
  288. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-mo.js +98 -0
  289. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-sg.js +98 -0
  290. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans.js +98 -0
  291. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant-hk.js +98 -0
  292. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant-mo.js +98 -0
  293. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant-tw.js +98 -0
  294. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant.js +98 -0
  295. data/vendor/assets/javascripts/i18n/angular-locale_zh-hk.js +98 -0
  296. data/vendor/assets/javascripts/i18n/angular-locale_zh-tw.js +98 -0
  297. data/vendor/assets/javascripts/i18n/angular-locale_zh.js +98 -0
  298. data/vendor/assets/javascripts/i18n/angular-locale_zu-za.js +98 -0
  299. data/vendor/assets/javascripts/i18n/angular-locale_zu.js +98 -0
  300. metadata +294 -9
@@ -9405,7 +9405,7 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9405
9405
  })( window );
9406
9406
 
9407
9407
  /**
9408
- * @license AngularJS v1.0.7
9408
+ * @license AngularJS v1.0.8
9409
9409
  * (c) 2010-2012 Google, Inc. http://angularjs.org
9410
9410
  * License: MIT
9411
9411
  */
@@ -9688,7 +9688,7 @@ noop.$inject = [];
9688
9688
  *
9689
9689
  <pre>
9690
9690
  function transformer(transformationFn, value) {
9691
- return (transformationFn || identity)(value);
9691
+ return (transformationFn || angular.identity)(value);
9692
9692
  };
9693
9693
  </pre>
9694
9694
  */
@@ -9815,6 +9815,18 @@ function isArray(value) {
9815
9815
  function isFunction(value){return typeof value == 'function';}
9816
9816
 
9817
9817
 
9818
+ /**
9819
+ * Determines if a value is a regular expression object.
9820
+ *
9821
+ * @private
9822
+ * @param {*} value Reference to check.
9823
+ * @returns {boolean} True if `value` is a `RegExp`.
9824
+ */
9825
+ function isRegExp(value) {
9826
+ return toString.apply(value) == '[object RegExp]';
9827
+ }
9828
+
9829
+
9818
9830
  /**
9819
9831
  * Checks if `obj` is a window object.
9820
9832
  *
@@ -9842,9 +9854,20 @@ function isBoolean(value) {
9842
9854
  }
9843
9855
 
9844
9856
 
9845
- function trim(value) {
9846
- return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value;
9847
- }
9857
+ var trim = (function() {
9858
+ // native trim is way faster: http://jsperf.com/angular-trim-test
9859
+ // but IE doesn't have it... :-(
9860
+ // TODO: we should move this into IE/ES5 polyfill
9861
+ if (!String.prototype.trim) {
9862
+ return function(value) {
9863
+ return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value;
9864
+ };
9865
+ }
9866
+ return function(value) {
9867
+ return isString(value) ? value.trim() : value;
9868
+ };
9869
+ })();
9870
+
9848
9871
 
9849
9872
  /**
9850
9873
  * @ngdoc function
@@ -9987,6 +10010,8 @@ function copy(source, destination){
9987
10010
  destination = copy(source, []);
9988
10011
  } else if (isDate(source)) {
9989
10012
  destination = new Date(source.getTime());
10013
+ } else if (isRegExp(source)) {
10014
+ destination = new RegExp(source.source);
9990
10015
  } else if (isObject(source)) {
9991
10016
  destination = copy(source, {});
9992
10017
  }
@@ -10034,7 +10059,7 @@ function shallowCopy(src, dst) {
10034
10059
  * @function
10035
10060
  *
10036
10061
  * @description
10037
- * Determines if two objects or two values are equivalent. Supports value types, arrays and
10062
+ * Determines if two objects or two values are equivalent. Supports value types, regular expressions, arrays and
10038
10063
  * objects.
10039
10064
  *
10040
10065
  * Two objects or values are considered equivalent if at least one of the following is true:
@@ -10042,6 +10067,9 @@ function shallowCopy(src, dst) {
10042
10067
  * * Both objects or values pass `===` comparison.
10043
10068
  * * Both objects or values are of the same type and all of their properties pass `===` comparison.
10044
10069
  * * Both values are NaN. (In JavasScript, NaN == NaN => false. But we consider two NaN as equal)
10070
+ * * Both values represent the same regular expression (In JavasScript,
10071
+ * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
10072
+ * representation matches).
10045
10073
  *
10046
10074
  * During a property comparision, properties of `function` type and properties with names
10047
10075
  * that begin with `$` are ignored.
@@ -10060,6 +10088,7 @@ function equals(o1, o2) {
10060
10088
  if (t1 == t2) {
10061
10089
  if (t1 == 'object') {
10062
10090
  if (isArray(o1)) {
10091
+ if (!isArray(o2)) return false;
10063
10092
  if ((length = o1.length) == o2.length) {
10064
10093
  for(key=0; key<length; key++) {
10065
10094
  if (!equals(o1[key], o2[key])) return false;
@@ -10068,8 +10097,10 @@ function equals(o1, o2) {
10068
10097
  }
10069
10098
  } else if (isDate(o1)) {
10070
10099
  return isDate(o2) && o1.getTime() == o2.getTime();
10100
+ } else if (isRegExp(o1) && isRegExp(o2)) {
10101
+ return o1.toString() == o2.toString();
10071
10102
  } else {
10072
- if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false;
10103
+ if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;
10073
10104
  keySet = {};
10074
10105
  for(key in o1) {
10075
10106
  if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
@@ -10158,13 +10189,15 @@ function toJsonReplacer(key, value) {
10158
10189
  * @function
10159
10190
  *
10160
10191
  * @description
10161
- * Serializes input into a JSON-formatted string.
10192
+ * Serializes input into a JSON-formatted string. Properties with leading $ characters will be
10193
+ * stripped since angular uses this notation internally.
10162
10194
  *
10163
10195
  * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
10164
10196
  * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
10165
- * @returns {string} Jsonified string representing `obj`.
10197
+ * @returns {string|undefined} Jsonified string representing `obj`.
10166
10198
  */
10167
10199
  function toJson(obj, pretty) {
10200
+ if (typeof obj === 'undefined') return undefined;
10168
10201
  return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null);
10169
10202
  }
10170
10203
 
@@ -10224,6 +10257,23 @@ function startingTag(element) {
10224
10257
 
10225
10258
  /////////////////////////////////////////////////
10226
10259
 
10260
+ /**
10261
+ * Tries to decode the URI component without throwing an exception.
10262
+ *
10263
+ * @private
10264
+ * @param str value potential URI component to check.
10265
+ * @returns {boolean} True if `value` can be decoded
10266
+ * with the decodeURIComponent function.
10267
+ */
10268
+ function tryDecodeURIComponent(value) {
10269
+ try {
10270
+ return decodeURIComponent(value);
10271
+ } catch(e) {
10272
+ // Ignore any invalid uri component
10273
+ }
10274
+ }
10275
+
10276
+
10227
10277
  /**
10228
10278
  * Parses an escaped url query string into key-value pairs.
10229
10279
  * @returns Object.<(string|boolean)>
@@ -10231,10 +10281,12 @@ function startingTag(element) {
10231
10281
  function parseKeyValue(/**string*/keyValue) {
10232
10282
  var obj = {}, key_value, key;
10233
10283
  forEach((keyValue || "").split('&'), function(keyValue){
10234
- if (keyValue) {
10284
+ if ( keyValue ) {
10235
10285
  key_value = keyValue.split('=');
10236
- key = decodeURIComponent(key_value[0]);
10237
- obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true;
10286
+ key = tryDecodeURIComponent(key_value[0]);
10287
+ if ( isDefined(key) ) {
10288
+ obj[key] = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
10289
+ }
10238
10290
  }
10239
10291
  });
10240
10292
  return obj;
@@ -10300,10 +10352,14 @@ function encodeUriQuery(val, pctEncodeSpaces) {
10300
10352
  * @description
10301
10353
  *
10302
10354
  * Use this directive to auto-bootstrap an application. Only
10303
- * one directive can be used per HTML document. The directive
10355
+ * one ngApp directive can be used per HTML document. The directive
10304
10356
  * designates the root of the application and is typically placed
10305
10357
  * at the root of the page.
10306
10358
  *
10359
+ * The first ngApp found in the document will be auto-bootstrapped. To use multiple applications in an
10360
+ * HTML document you must manually bootstrap them using {@link angular.bootstrap}.
10361
+ * Applications cannot be nested.
10362
+ *
10307
10363
  * In the example below if the `ngApp` directive would not be placed
10308
10364
  * on the `html` element then the document would not be compiled
10309
10365
  * and the `{{ 1+2 }}` would not be resolved to `3`.
@@ -10369,12 +10425,15 @@ function angularInit(element, bootstrap) {
10369
10425
  *
10370
10426
  * See: {@link guide/bootstrap Bootstrap}
10371
10427
  *
10428
+ * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
10429
+ * They must use {@link api/ng.directive:ngApp ngApp}.
10430
+ *
10372
10431
  * @param {Element} element DOM element which is the root of angular application.
10373
10432
  * @param {Array<String|Function>=} modules an array of module declarations. See: {@link angular.module modules}
10374
10433
  * @returns {AUTO.$injector} Returns the newly created injector for this app.
10375
10434
  */
10376
10435
  function bootstrap(element, modules) {
10377
- var resumeBootstrapInternal = function() {
10436
+ var doBootstrap = function() {
10378
10437
  element = jqLite(element);
10379
10438
  modules = modules || [];
10380
10439
  modules.unshift(['$provide', function($provide) {
@@ -10396,7 +10455,7 @@ function bootstrap(element, modules) {
10396
10455
  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;
10397
10456
 
10398
10457
  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
10399
- return resumeBootstrapInternal();
10458
+ return doBootstrap();
10400
10459
  }
10401
10460
 
10402
10461
  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
@@ -10404,7 +10463,7 @@ function bootstrap(element, modules) {
10404
10463
  forEach(extraModules, function(module) {
10405
10464
  modules.push(module);
10406
10465
  });
10407
- resumeBootstrapInternal();
10466
+ doBootstrap();
10408
10467
  };
10409
10468
  }
10410
10469
 
@@ -10428,9 +10487,10 @@ function bindJQuery() {
10428
10487
  injector: JQLitePrototype.injector,
10429
10488
  inheritedData: JQLitePrototype.inheritedData
10430
10489
  });
10431
- JQLitePatchJQueryRemove('remove', true);
10432
- JQLitePatchJQueryRemove('empty');
10433
- JQLitePatchJQueryRemove('html');
10490
+ // Method signature: JQLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments)
10491
+ JQLitePatchJQueryRemove('remove', true, true, false);
10492
+ JQLitePatchJQueryRemove('empty', false, false, false);
10493
+ JQLitePatchJQueryRemove('html', false, false, true);
10434
10494
  } else {
10435
10495
  jqLite = JQLite;
10436
10496
  }
@@ -10457,6 +10517,33 @@ function assertArgFn(arg, name, acceptArrayAnnotation) {
10457
10517
  return arg;
10458
10518
  }
10459
10519
 
10520
+ /**
10521
+ * Return the value accessible from the object by path. Any undefined traversals are ignored
10522
+ * @param {Object} obj starting object
10523
+ * @param {string} path path to traverse
10524
+ * @param {boolean=true} bindFnToScope
10525
+ * @returns value as accessible by path
10526
+ */
10527
+ //TODO(misko): this function needs to be removed
10528
+ function getter(obj, path, bindFnToScope) {
10529
+ if (!path) return obj;
10530
+ var keys = path.split('.');
10531
+ var key;
10532
+ var lastInstance = obj;
10533
+ var len = keys.length;
10534
+
10535
+ for (var i = 0; i < len; i++) {
10536
+ key = keys[i];
10537
+ if (obj) {
10538
+ obj = (lastInstance = obj)[key];
10539
+ }
10540
+ }
10541
+ if (!bindFnToScope && isFunction(obj)) {
10542
+ return bind(lastInstance, obj);
10543
+ }
10544
+ return obj;
10545
+ }
10546
+
10460
10547
  /**
10461
10548
  * @ngdoc interface
10462
10549
  * @name angular.Module
@@ -10487,8 +10574,8 @@ function setupModuleLoader(window) {
10487
10574
  *
10488
10575
  * # Module
10489
10576
  *
10490
- * A module is a collocation of services, directives, filters, and configuration information. Module
10491
- * is used to configure the {@link AUTO.$injector $injector}.
10577
+ * A module is a collection of services, directives, filters, and configuration information.
10578
+ * `angular.module` is used to configure the {@link AUTO.$injector $injector}.
10492
10579
  *
10493
10580
  * <pre>
10494
10581
  * // Create a new module
@@ -10719,11 +10806,11 @@ function setupModuleLoader(window) {
10719
10806
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
10720
10807
  */
10721
10808
  var version = {
10722
- full: '1.0.7', // all of these placeholder strings will be replaced by grunt's
10809
+ full: '1.0.8', // all of these placeholder strings will be replaced by grunt's
10723
10810
  major: 1, // package task
10724
10811
  minor: 0,
10725
- dot: 7,
10726
- codeName: 'monochromatic-rainbow'
10812
+ dot: 8,
10813
+ codeName: 'bubble-burst'
10727
10814
  };
10728
10815
 
10729
10816
 
@@ -10792,7 +10879,6 @@ function publishExternalAPI(angular){
10792
10879
  ngPluralize: ngPluralizeDirective,
10793
10880
  ngRepeat: ngRepeatDirective,
10794
10881
  ngShow: ngShowDirective,
10795
- ngSubmit: ngSubmitDirective,
10796
10882
  ngStyle: ngStyleDirective,
10797
10883
  ngSwitch: ngSwitchDirective,
10798
10884
  ngSwitchWhen: ngSwitchWhenDirective,
@@ -10862,7 +10948,8 @@ function publishExternalAPI(angular){
10862
10948
  * Note: All element references in Angular are always wrapped with jQuery or jqLite; they are never
10863
10949
  * raw DOM references.
10864
10950
  *
10865
- * ## Angular's jQuery lite provides the following methods:
10951
+ * ## Angular's jqLite
10952
+ * Angular's lite version of jQuery provides only the following jQuery methods:
10866
10953
  *
10867
10954
  * - [addClass()](http://api.jquery.com/addClass/)
10868
10955
  * - [after()](http://api.jquery.com/after/)
@@ -10895,8 +10982,14 @@ function publishExternalAPI(angular){
10895
10982
  * - [val()](http://api.jquery.com/val/)
10896
10983
  * - [wrap()](http://api.jquery.com/wrap/)
10897
10984
  *
10898
- * ## In addtion to the above, Angular provides additional methods to both jQuery and jQuery lite:
10985
+ * ## jQuery/jqLite Extras
10986
+ * Angular also provides the following additional methods and events to both jQuery and jqLite:
10899
10987
  *
10988
+ * ### Events
10989
+ * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
10990
+ * on all DOM nodes being removed. This can be used to clean up and 3rd party bindings to the DOM
10991
+ * element before it is removed.
10992
+ * ### Methods
10900
10993
  * - `controller(name)` - retrieves the controller of the current element or its parent. By default
10901
10994
  * retrieves controller associated with the `ngController` directive. If `name` is provided as
10902
10995
  * camelCase directive name, then the controller for this directive will be retrieved (e.g.
@@ -10943,37 +11036,38 @@ function camelCase(name) {
10943
11036
  /////////////////////////////////////////////
10944
11037
  // jQuery mutation patch
10945
11038
  //
10946
- // In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a
11039
+ // In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a
10947
11040
  // $destroy event on all DOM nodes being removed.
10948
11041
  //
10949
11042
  /////////////////////////////////////////////
10950
11043
 
10951
- function JQLitePatchJQueryRemove(name, dispatchThis) {
11044
+ function JQLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) {
10952
11045
  var originalJqFn = jQuery.fn[name];
10953
11046
  originalJqFn = originalJqFn.$original || originalJqFn;
10954
11047
  removePatch.$original = originalJqFn;
10955
11048
  jQuery.fn[name] = removePatch;
10956
11049
 
10957
- function removePatch() {
10958
- var list = [this],
11050
+ function removePatch(param) {
11051
+ var list = filterElems && param ? [this.filter(param)] : [this],
10959
11052
  fireEvent = dispatchThis,
10960
11053
  set, setIndex, setLength,
10961
- element, childIndex, childLength, children,
10962
- fns, events;
10963
-
10964
- while(list.length) {
10965
- set = list.shift();
10966
- for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {
10967
- element = jqLite(set[setIndex]);
10968
- if (fireEvent) {
10969
- element.triggerHandler('$destroy');
10970
- } else {
10971
- fireEvent = !fireEvent;
10972
- }
10973
- for(childIndex = 0, childLength = (children = element.children()).length;
10974
- childIndex < childLength;
10975
- childIndex++) {
10976
- list.push(jQuery(children[childIndex]));
11054
+ element, childIndex, childLength, children;
11055
+
11056
+ if (!getterIfNoArguments || param != null) {
11057
+ while(list.length) {
11058
+ set = list.shift();
11059
+ for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {
11060
+ element = jqLite(set[setIndex]);
11061
+ if (fireEvent) {
11062
+ element.triggerHandler('$destroy');
11063
+ } else {
11064
+ fireEvent = !fireEvent;
11065
+ }
11066
+ for(childIndex = 0, childLength = (children = element.children()).length;
11067
+ childIndex < childLength;
11068
+ childIndex++) {
11069
+ list.push(jQuery(children[childIndex]));
11070
+ }
10977
11071
  }
10978
11072
  }
10979
11073
  }
@@ -11033,7 +11127,7 @@ function JQLiteUnbind(element, type, fn) {
11033
11127
  removeEventListenerFn(element, type, events[type]);
11034
11128
  delete events[type];
11035
11129
  } else {
11036
- arrayRemove(events[type], fn);
11130
+ arrayRemove(events[type] || [], fn);
11037
11131
  }
11038
11132
  }
11039
11133
  }
@@ -11307,6 +11401,15 @@ forEach({
11307
11401
 
11308
11402
  val: function(element, value) {
11309
11403
  if (isUndefined(value)) {
11404
+ if (nodeName_(element) === 'SELECT' && element.multiple) {
11405
+ var result = [];
11406
+ forEach(element.options, function (option) {
11407
+ if (option.selected) {
11408
+ result.push(option.value || option.text);
11409
+ }
11410
+ });
11411
+ return result.length === 0 ? null : result;
11412
+ }
11310
11413
  return element.value;
11311
11414
  }
11312
11415
  element.value = value;
@@ -11524,12 +11627,7 @@ forEach({
11524
11627
  if (element.nodeType === 1) {
11525
11628
  var index = element.firstChild;
11526
11629
  forEach(new JQLite(node), function(child){
11527
- if (index) {
11528
- element.insertBefore(child, index);
11529
- } else {
11530
- element.appendChild(child);
11531
- index = child;
11532
- }
11630
+ element.insertBefore(child, index);
11533
11631
  });
11534
11632
  }
11535
11633
  },
@@ -12522,7 +12620,8 @@ function Browser(window, document, $log, $sniffer) {
12522
12620
  //////////////////////////////////////////////////////////////
12523
12621
 
12524
12622
  var lastBrowserUrl = location.href,
12525
- baseElement = document.find('base');
12623
+ baseElement = document.find('base'),
12624
+ replacedUrl = null;
12526
12625
 
12527
12626
  /**
12528
12627
  * @name ng.$browser#url
@@ -12557,14 +12656,21 @@ function Browser(window, document, $log, $sniffer) {
12557
12656
  baseElement.attr('href', baseElement.attr('href'));
12558
12657
  }
12559
12658
  } else {
12560
- if (replace) location.replace(url);
12561
- else location.href = url;
12659
+ if (replace) {
12660
+ location.replace(url);
12661
+ replacedUrl = url;
12662
+ } else {
12663
+ location.href = url;
12664
+ replacedUrl = null;
12665
+ }
12562
12666
  }
12563
12667
  return self;
12564
12668
  // getter
12565
12669
  } else {
12566
- // the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
12567
- return location.href.replace(/%27/g,"'");
12670
+ // - the replacedUrl is a workaround for an IE8-9 issue with location.replace method that doesn't update
12671
+ // location.href synchronously
12672
+ // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
12673
+ return replacedUrl || location.href.replace(/%27/g,"'");
12568
12674
  }
12569
12675
  };
12570
12676
 
@@ -12771,7 +12877,20 @@ function $BrowserProvider(){
12771
12877
  * @name ng.$cacheFactory
12772
12878
  *
12773
12879
  * @description
12774
- * Factory that constructs cache objects.
12880
+ * Factory that constructs cache objects and gives access to them.
12881
+ *
12882
+ * <pre>
12883
+ *
12884
+ * var cache = $cacheFactory('cacheId');
12885
+ * expect($cacheFactory.get('cacheId')).toBe(cache);
12886
+ * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
12887
+ *
12888
+ * cache.put("key", "value");
12889
+ * cache.put("another key", "another value");
12890
+ *
12891
+ * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); // Since we've specified no options on creation
12892
+ *
12893
+ * </pre>
12775
12894
  *
12776
12895
  *
12777
12896
  * @param {string} cacheId Name or id of the newly created cache.
@@ -12903,6 +13022,16 @@ function $CacheFactoryProvider() {
12903
13022
  }
12904
13023
 
12905
13024
 
13025
+ /**
13026
+ * @ngdoc method
13027
+ * @name ng.$cacheFactory#info
13028
+ * @methodOf ng.$cacheFactory
13029
+ *
13030
+ * @description
13031
+ * Get information about all the of the caches that have been created
13032
+ *
13033
+ * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
13034
+ */
12906
13035
  cacheFactory.info = function() {
12907
13036
  var info = {};
12908
13037
  forEach(caches, function(cache, cacheId) {
@@ -12912,6 +13041,17 @@ function $CacheFactoryProvider() {
12912
13041
  };
12913
13042
 
12914
13043
 
13044
+ /**
13045
+ * @ngdoc method
13046
+ * @name ng.$cacheFactory#get
13047
+ * @methodOf ng.$cacheFactory
13048
+ *
13049
+ * @description
13050
+ * Get access to a cache object by the `cacheId` used when it was created.
13051
+ *
13052
+ * @param {string} cacheId Name or id of a cache to access.
13053
+ * @returns {object} Cache object identified by the cacheId or undefined if no such cache.
13054
+ */
12915
13055
  cacheFactory.get = function(cacheId) {
12916
13056
  return caches[cacheId];
12917
13057
  };
@@ -12926,8 +13066,44 @@ function $CacheFactoryProvider() {
12926
13066
  * @name ng.$templateCache
12927
13067
  *
12928
13068
  * @description
12929
- * Cache used for storing html templates.
12930
- *
13069
+ * The first time a template is used, it is loaded in the template cache for quick retrieval. You can
13070
+ * load templates directly into the cache in a `script` tag, or by consuming the `$templateCache`
13071
+ * service directly.
13072
+ *
13073
+ * Adding via the `script` tag:
13074
+ * <pre>
13075
+ * <html ng-app>
13076
+ * <head>
13077
+ * <script type="text/ng-template" id="templateId.html">
13078
+ * This is the content of the template
13079
+ * </script>
13080
+ * </head>
13081
+ * ...
13082
+ * </html>
13083
+ * </pre>
13084
+ *
13085
+ * **Note:** the `script` tag containing the template does not need to be included in the `head` of the document, but
13086
+ * it must be below the `ng-app` definition.
13087
+ *
13088
+ * Adding via the $templateCache service:
13089
+ *
13090
+ * <pre>
13091
+ * var myApp = angular.module('myApp', []);
13092
+ * myApp.run(function($templateCache) {
13093
+ * $templateCache.put('templateId.html', 'This is the content of the template');
13094
+ * });
13095
+ * </pre>
13096
+ *
13097
+ * To retrieve the template later, simply use it in your HTML:
13098
+ * <pre>
13099
+ * <div ng-include=" 'templateId.html' "></div>
13100
+ * </pre>
13101
+ *
13102
+ * or get it via Javascript:
13103
+ * <pre>
13104
+ * $templateCache.get('templateId.html')
13105
+ * </pre>
13106
+ *
12931
13107
  * See {@link ng.$cacheFactory $cacheFactory}.
12932
13108
  *
12933
13109
  */
@@ -13103,11 +13279,11 @@ function $CompileProvider($provide) {
13103
13279
  * @function
13104
13280
  *
13105
13281
  * @description
13106
- * Register a new directives with the compiler.
13282
+ * Register a new directive with the compiler.
13107
13283
  *
13108
13284
  * @param {string} name Name of the directive in camel-case. (ie <code>ngBind</code> which will match as
13109
13285
  * <code>ng-bind</code>).
13110
- * @param {function} directiveFactory An injectable directive factroy function. See {@link guide/directive} for more
13286
+ * @param {function|Array} directiveFactory An injectable directive factory function. See {@link guide/directive} for more
13111
13287
  * info.
13112
13288
  * @returns {ng.$compileProvider} Self for chaining.
13113
13289
  */
@@ -13230,7 +13406,7 @@ function $CompileProvider($provide) {
13230
13406
 
13231
13407
  // href property always returns normalized absolute url, so we can match against that
13232
13408
  normalizedVal = urlSanitizationNode.href;
13233
- if (!normalizedVal.match(urlSanitizationWhitelist)) {
13409
+ if (normalizedVal !== '' && !normalizedVal.match(urlSanitizationWhitelist)) {
13234
13410
  this[key] = value = 'unsafe:' + normalizedVal;
13235
13411
  }
13236
13412
  }
@@ -13454,7 +13630,7 @@ function $CompileProvider($provide) {
13454
13630
  for (var attr, name, nName, value, nAttrs = node.attributes,
13455
13631
  j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
13456
13632
  attr = nAttrs[j];
13457
- if (attr.specified) {
13633
+ if (!msie || msie >= 8 || attr.specified) {
13458
13634
  name = attr.name;
13459
13635
  nName = directiveNormalize(name.toLowerCase());
13460
13636
  attrsMap[nName] = name;
@@ -15833,33 +16009,6 @@ function setter(obj, path, setValue) {
15833
16009
  return setValue;
15834
16010
  }
15835
16011
 
15836
- /**
15837
- * Return the value accesible from the object by path. Any undefined traversals are ignored
15838
- * @param {Object} obj starting object
15839
- * @param {string} path path to traverse
15840
- * @param {boolean=true} bindFnToScope
15841
- * @returns value as accesbile by path
15842
- */
15843
- //TODO(misko): this function needs to be removed
15844
- function getter(obj, path, bindFnToScope) {
15845
- if (!path) return obj;
15846
- var keys = path.split('.');
15847
- var key;
15848
- var lastInstance = obj;
15849
- var len = keys.length;
15850
-
15851
- for (var i = 0; i < len; i++) {
15852
- key = keys[i];
15853
- if (obj) {
15854
- obj = (lastInstance = obj)[key];
15855
- }
15856
- }
15857
- if (!bindFnToScope && isFunction(obj)) {
15858
- return bind(lastInstance, obj);
15859
- }
15860
- return obj;
15861
- }
15862
-
15863
16012
  var getterFnCache = {};
15864
16013
 
15865
16014
  /**
@@ -16121,8 +16270,8 @@ function $ParseProvider() {
16121
16270
  * **Methods**
16122
16271
  *
16123
16272
  * - `then(successCallback, errorCallback)` – regardless of when the promise was or will be resolved
16124
- * or rejected calls one of the success or error callbacks asynchronously as soon as the result
16125
- * is available. The callbacks are called with a single argument the result or rejection reason.
16273
+ * or rejected, `then` calls one of the success or error callbacks asynchronously as soon as the result
16274
+ * is available. The callbacks are called with a single argument: the result or rejection reason.
16126
16275
  *
16127
16276
  * This method *returns a new promise* which is resolved or rejected via the return value of the
16128
16277
  * `successCallback` or `errorCallback`.
@@ -16130,7 +16279,7 @@ function $ParseProvider() {
16130
16279
  *
16131
16280
  * # Chaining promises
16132
16281
  *
16133
- * Because calling `then` api of a promise returns a new derived promise, it is easily possible
16282
+ * Because calling the `then` method of a promise returns a new derived promise, it is easily possible
16134
16283
  * to create a chain of promises:
16135
16284
  *
16136
16285
  * <pre>
@@ -16138,13 +16287,13 @@ function $ParseProvider() {
16138
16287
  * return result + 1;
16139
16288
  * });
16140
16289
  *
16141
- * // promiseB will be resolved immediately after promiseA is resolved and its value will be
16142
- * // the result of promiseA incremented by 1
16290
+ * // promiseB will be resolved immediately after promiseA is resolved and its value
16291
+ * // will be the result of promiseA incremented by 1
16143
16292
  * </pre>
16144
16293
  *
16145
16294
  * It is possible to create chains of any length and since a promise can be resolved with another
16146
16295
  * promise (which will defer its resolution further), it is possible to pause/defer resolution of
16147
- * the promises at any point in the chain. This makes it possible to implement powerful apis like
16296
+ * the promises at any point in the chain. This makes it possible to implement powerful APIs like
16148
16297
  * $http's response interceptors.
16149
16298
  *
16150
16299
  *
@@ -16251,8 +16400,8 @@ function qFactory(nextTick, exceptionHandler) {
16251
16400
  try {
16252
16401
  result.resolve((callback || defaultCallback)(value));
16253
16402
  } catch(e) {
16254
- exceptionHandler(e);
16255
16403
  result.reject(e);
16404
+ exceptionHandler(e);
16256
16405
  }
16257
16406
  };
16258
16407
 
@@ -16260,8 +16409,8 @@ function qFactory(nextTick, exceptionHandler) {
16260
16409
  try {
16261
16410
  result.resolve((errback || defaultErrback)(reason));
16262
16411
  } catch(e) {
16263
- exceptionHandler(e);
16264
16412
  result.reject(e);
16413
+ exceptionHandler(e);
16265
16414
  }
16266
16415
  };
16267
16416
 
@@ -16470,8 +16619,8 @@ function $RouteProvider(){
16470
16619
  * route definition.
16471
16620
  *
16472
16621
  * `path` can contain named groups starting with a colon (`:name`). All characters up to the
16473
- * next slash are matched and stored in `$routeParams` under the given `name` when the route
16474
- * matches.
16622
+ * next slash are matched and stored in `$routeParams` under the given `name` after the route
16623
+ * is resolved.
16475
16624
  *
16476
16625
  * @param {Object} route Mapping information to be assigned to `$route.current` on route
16477
16626
  * match.
@@ -16496,7 +16645,9 @@ function $RouteProvider(){
16496
16645
  * - `factory` - `{string|function}`: If `string` then it is an alias for a service.
16497
16646
  * Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected}
16498
16647
  * and the return value is treated as the dependency. If the result is a promise, it is resolved
16499
- * before its value is injected into the controller.
16648
+ * before its value is injected into the controller. Be aware that `ngRoute.$routeParams` will
16649
+ * still refer to the previous route within these resolve functions. Use `$route.current.params`
16650
+ * to access the new route parameters, instead.
16500
16651
  *
16501
16652
  * - `redirectTo` – {(string|function())=} – value to update
16502
16653
  * {@link ng.$location $location} path with and trigger route redirection.
@@ -16931,6 +17082,10 @@ function $RouteProvider(){
16931
17082
  * The service guarantees that the identity of the `$routeParams` object will remain unchanged
16932
17083
  * (but its properties will likely change) even when a route change occurs.
16933
17084
  *
17085
+ * Note that the `$routeParams` are only updated *after* a route change completes successfully.
17086
+ * This means that you cannot rely on `$routeParams` being correct in route resolve functions.
17087
+ * Instead you can use `$route.current.params` to access the new route's parameters.
17088
+ *
16934
17089
  * @example
16935
17090
  * <pre>
16936
17091
  * // Given:
@@ -17338,7 +17493,7 @@ function $RootScopeProvider(){
17338
17493
  watch = watchers[length];
17339
17494
  // Most common watches are on primitives, in which case we can short
17340
17495
  // circuit it with === operator, only when === fails do we use .equals
17341
- if ((value = watch.get(current)) !== (last = watch.last) &&
17496
+ if (watch && (value = watch.get(current)) !== (last = watch.last) &&
17342
17497
  !(watch.eq
17343
17498
  ? equals(value, last)
17344
17499
  : (typeof value == 'number' && typeof last == 'number'
@@ -17391,6 +17546,9 @@ function $RootScopeProvider(){
17391
17546
  *
17392
17547
  * @description
17393
17548
  * Broadcasted when a scope and its children are being destroyed.
17549
+ *
17550
+ * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
17551
+ * clean up DOM bindings before an element is removed from the DOM.
17394
17552
  */
17395
17553
 
17396
17554
  /**
@@ -17412,6 +17570,9 @@ function $RootScopeProvider(){
17412
17570
  * Just before a scope is destroyed a `$destroy` event is broadcasted on this scope.
17413
17571
  * Application code can register a `$destroy` event handler that will give it chance to
17414
17572
  * perform any necessary cleanup.
17573
+ *
17574
+ * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
17575
+ * clean up DOM bindings before an element is removed from the DOM.
17415
17576
  */
17416
17577
  $destroy: function() {
17417
17578
  // we can't destroy the root scope or a scope that has been already destroyed
@@ -17816,8 +17977,10 @@ function $SnifferProvider() {
17816
17977
  * it is a global variable. In angular we always refer to it through the
17817
17978
  * `$window` service, so it may be overriden, removed or mocked for testing.
17818
17979
  *
17819
- * All expressions are evaluated with respect to current scope so they don't
17820
- * suffer from window globality.
17980
+ * Expressions, like the one defined for the `ngClick` directive in the example
17981
+ * below, are evaluated with respect to the current scope. Therefore, there is
17982
+ * no risk of inadvertently coding in a dependency on a global value in such an
17983
+ * expression.
17821
17984
  *
17822
17985
  * @example
17823
17986
  <doc:example>
@@ -18137,6 +18300,7 @@ function $HttpProvider() {
18137
18300
  * return function(promise) {
18138
18301
  * return promise.then(function(response) {
18139
18302
  * // do something on success
18303
+ * return response;
18140
18304
  * }, function(response) {
18141
18305
  * // do something on error
18142
18306
  * if (canRecover(response)) {
@@ -18328,17 +18492,40 @@ function $HttpProvider() {
18328
18492
 
18329
18493
  var reqTransformFn = config.transformRequest || $config.transformRequest,
18330
18494
  respTransformFn = config.transformResponse || $config.transformResponse,
18331
- defHeaders = $config.headers,
18332
- reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},
18333
- defHeaders.common, defHeaders[lowercase(config.method)], config.headers),
18334
- reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn),
18495
+ reqHeaders = extend({}, config.headers),
18496
+ defHeaders = extend(
18497
+ {'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},
18498
+ $config.headers.common,
18499
+ $config.headers[lowercase(config.method)]
18500
+ ),
18501
+ reqData,
18502
+ defHeaderName, lowercaseDefHeaderName, headerName,
18335
18503
  promise;
18336
18504
 
18505
+ // using for-in instead of forEach to avoid unecessary iteration after header has been found
18506
+ defaultHeadersIteration:
18507
+ for(defHeaderName in defHeaders) {
18508
+ lowercaseDefHeaderName = lowercase(defHeaderName);
18509
+ for(headerName in config.headers) {
18510
+ if (lowercase(headerName) === lowercaseDefHeaderName) {
18511
+ continue defaultHeadersIteration;
18512
+ }
18513
+ }
18514
+ reqHeaders[defHeaderName] = defHeaders[defHeaderName];
18515
+ }
18516
+
18337
18517
  // strip content-type if data is undefined
18338
18518
  if (isUndefined(config.data)) {
18339
- delete reqHeaders['Content-Type'];
18519
+ for(var header in reqHeaders) {
18520
+ if (lowercase(header) === 'content-type') {
18521
+ delete reqHeaders[header];
18522
+ break;
18523
+ }
18524
+ }
18340
18525
  }
18341
18526
 
18527
+ reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn);
18528
+
18342
18529
  // send request
18343
18530
  promise = sendReq(config, reqData, reqHeaders);
18344
18531
 
@@ -18881,17 +19068,15 @@ function $TimeoutProvider() {
18881
19068
  deferred.reject(e);
18882
19069
  $exceptionHandler(e);
18883
19070
  }
19071
+ finally {
19072
+ delete deferreds[promise.$$timeoutId];
19073
+ }
18884
19074
 
18885
19075
  if (!skipApply) $rootScope.$apply();
18886
19076
  }, delay);
18887
19077
 
18888
- cleanup = function() {
18889
- delete deferreds[promise.$$timeoutId];
18890
- };
18891
-
18892
19078
  promise.$$timeoutId = timeoutId;
18893
19079
  deferreds[timeoutId] = deferred;
18894
- promise.then(cleanup, cleanup);
18895
19080
 
18896
19081
  return promise;
18897
19082
  }
@@ -18913,6 +19098,7 @@ function $TimeoutProvider() {
18913
19098
  timeout.cancel = function(promise) {
18914
19099
  if (promise && promise.$$timeoutId in deferreds) {
18915
19100
  deferreds[promise.$$timeoutId].reject('canceled');
19101
+ delete deferreds[promise.$$timeoutId];
18916
19102
  return $browser.defer.cancel(promise.$$timeoutId);
18917
19103
  }
18918
19104
  return false;
@@ -19249,7 +19435,9 @@ function currencyFilter($locale) {
19249
19435
  * If the input is not a number an empty string is returned.
19250
19436
  *
19251
19437
  * @param {number|string} number Number to format.
19252
- * @param {(number|string)=} [fractionSize=2] Number of decimal places to round the number to.
19438
+ * @param {(number|string)=} fractionSize Number of decimal places to round the number to.
19439
+ * If this is not provided then the fraction size is computed from the current locale's number
19440
+ * formatting pattern. In the case of the default locale, it will be 3.
19253
19441
  * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
19254
19442
  *
19255
19443
  * @example
@@ -19356,6 +19544,11 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
19356
19544
  }
19357
19545
 
19358
19546
  if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
19547
+ } else {
19548
+
19549
+ if (fractionSize > 0 && number > -1 && number < 1) {
19550
+ formatedText = number.toFixed(fractionSize);
19551
+ }
19359
19552
  }
19360
19553
 
19361
19554
  parts.push(isNegative ? pattern.negPre : pattern.posPre);
@@ -19479,7 +19672,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
19479
19672
  * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 pm)
19480
19673
  * * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US locale
19481
19674
  * (e.g. Friday, September 3, 2010)
19482
- * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010
19675
+ * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010)
19483
19676
  * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010)
19484
19677
  * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)
19485
19678
  * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)
@@ -19487,7 +19680,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
19487
19680
  *
19488
19681
  * `format` string can contain literal values. These need to be quoted with single quotes (e.g.
19489
19682
  * `"h 'in the morning'"`). In order to output single quote, use two single quotes in a sequence
19490
- * (e.g. `"h o''clock"`).
19683
+ * (e.g. `"h 'o''clock'"`).
19491
19684
  *
19492
19685
  * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
19493
19686
  * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its
@@ -19854,8 +20047,10 @@ function orderByFilter($parse){
19854
20047
  var t1 = typeof v1;
19855
20048
  var t2 = typeof v2;
19856
20049
  if (t1 == t2) {
19857
- if (t1 == "string") v1 = v1.toLowerCase();
19858
- if (t1 == "string") v2 = v2.toLowerCase();
20050
+ if (t1 == "string") {
20051
+ v1 = v1.toLowerCase();
20052
+ v2 = v2.toLowerCase();
20053
+ }
19859
20054
  if (v1 === v2) return 0;
19860
20055
  return v1 < v2 ? -1 : 1;
19861
20056
  } else {
@@ -20275,7 +20470,7 @@ function FormController(element, attrs) {
20275
20470
  errors = form.$error = {};
20276
20471
 
20277
20472
  // init state
20278
- form.$name = attrs.name;
20473
+ form.$name = attrs.name || attrs.ngForm;
20279
20474
  form.$dirty = false;
20280
20475
  form.$pristine = true;
20281
20476
  form.$valid = true;
@@ -20295,12 +20490,32 @@ function FormController(element, attrs) {
20295
20490
  addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
20296
20491
  }
20297
20492
 
20493
+ /**
20494
+ * @ngdoc function
20495
+ * @name ng.directive:form.FormController#$addControl
20496
+ * @methodOf ng.directive:form.FormController
20497
+ *
20498
+ * @description
20499
+ * Register a control with the form.
20500
+ *
20501
+ * Input elements using ngModelController do this automatically when they are linked.
20502
+ */
20298
20503
  form.$addControl = function(control) {
20299
20504
  if (control.$name && !form.hasOwnProperty(control.$name)) {
20300
20505
  form[control.$name] = control;
20301
20506
  }
20302
20507
  };
20303
20508
 
20509
+ /**
20510
+ * @ngdoc function
20511
+ * @name ng.directive:form.FormController#$removeControl
20512
+ * @methodOf ng.directive:form.FormController
20513
+ *
20514
+ * @description
20515
+ * Deregister a control from the form.
20516
+ *
20517
+ * Input elements using ngModelController do this automatically when they are destroyed.
20518
+ */
20304
20519
  form.$removeControl = function(control) {
20305
20520
  if (control.$name && form[control.$name] === control) {
20306
20521
  delete form[control.$name];
@@ -20310,6 +20525,16 @@ function FormController(element, attrs) {
20310
20525
  });
20311
20526
  };
20312
20527
 
20528
+ /**
20529
+ * @ngdoc function
20530
+ * @name ng.directive:form.FormController#$setValidity
20531
+ * @methodOf ng.directive:form.FormController
20532
+ *
20533
+ * @description
20534
+ * Sets the validity of a form control.
20535
+ *
20536
+ * This method will also propagate to parent forms.
20537
+ */
20313
20538
  form.$setValidity = function(validationToken, isValid, control) {
20314
20539
  var queue = errors[validationToken];
20315
20540
 
@@ -20348,6 +20573,17 @@ function FormController(element, attrs) {
20348
20573
  }
20349
20574
  };
20350
20575
 
20576
+ /**
20577
+ * @ngdoc function
20578
+ * @name ng.directive:form.FormController#$setDirty
20579
+ * @methodOf ng.directive:form.FormController
20580
+ *
20581
+ * @description
20582
+ * Sets the form to a dirty state.
20583
+ *
20584
+ * This method can be called to add the 'ng-dirty' class and set the form to a dirty
20585
+ * state (ng-dirty class). This method will also propagate to parent forms.
20586
+ */
20351
20587
  form.$setDirty = function() {
20352
20588
  element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);
20353
20589
  form.$dirty = true;
@@ -20524,7 +20760,7 @@ var formDirective = formDirectiveFactory();
20524
20760
  var ngFormDirective = formDirectiveFactory(true);
20525
20761
 
20526
20762
  var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
20527
- var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/;
20763
+ var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/;
20528
20764
  var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
20529
20765
 
20530
20766
  var inputType = {
@@ -20635,9 +20871,9 @@ var inputType = {
20635
20871
  <form name="myForm" ng-controller="Ctrl">
20636
20872
  Number: <input type="number" name="input" ng-model="value"
20637
20873
  min="0" max="99" required>
20638
- <span class="error" ng-show="myForm.list.$error.required">
20874
+ <span class="error" ng-show="myForm.input.$error.required">
20639
20875
  Required!</span>
20640
- <span class="error" ng-show="myForm.list.$error.number">
20876
+ <span class="error" ng-show="myForm.input.$error.number">
20641
20877
  Not valid number!</span>
20642
20878
  <tt>value = {{value}}</tt><br/>
20643
20879
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
@@ -20758,6 +20994,8 @@ var inputType = {
20758
20994
  * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
20759
20995
  * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
20760
20996
  * patterns defined as scope expressions.
20997
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
20998
+ * interaction with the input element.
20761
20999
  *
20762
21000
  * @example
20763
21001
  <doc:example>
@@ -21316,12 +21554,25 @@ var VALID_CLASS = 'ng-valid',
21316
21554
  *
21317
21555
  * @property {string} $viewValue Actual string value in the view.
21318
21556
  * @property {*} $modelValue The value in the model, that the control is bound to.
21319
- * @property {Array.<Function>} $parsers Whenever the control reads value from the DOM, it executes
21320
- * all of these functions to sanitize / convert the value as well as validate.
21321
- *
21322
- * @property {Array.<Function>} $formatters Whenever the model value changes, it executes all of
21323
- * these functions to convert the value as well as validate.
21324
- *
21557
+ * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
21558
+ the control reads value from the DOM. Each function is called, in turn, passing the value
21559
+ through to the next. Used to sanitize / convert the value as well as validation.
21560
+
21561
+ For validation, the parsers should update the validity state using
21562
+ {@link ng.directive:ngModel.NgModelController#$setValidity $setValidity()},
21563
+ and return `undefined` for invalid values.
21564
+ *
21565
+ * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
21566
+ * the model value changes. Each function is called, in turn, passing the value through to the
21567
+ * next. Used to format / convert values for display in the control and validation.
21568
+ * <pre>
21569
+ * function formatter(value) {
21570
+ * if (value) {
21571
+ * return value.toUpperCase();
21572
+ * }
21573
+ * }
21574
+ * ngModel.$formatters.push(formatter);
21575
+ * </pre>
21325
21576
  * @property {Object} $error An bject hash with all errors as keys.
21326
21577
  *
21327
21578
  * @property {boolean} $pristine True if user has not interacted with the control yet.
@@ -21336,6 +21587,10 @@ var VALID_CLASS = 'ng-valid',
21336
21587
  * specifically does not contain any logic which deals with DOM rendering or listening to
21337
21588
  * DOM events. The `NgModelController` is meant to be extended by other directives where, the
21338
21589
  * directive provides DOM manipulation and the `NgModelController` provides the data-binding.
21590
+ * Note that you cannot use `NgModelController` in a directive with an isolated scope,
21591
+ * as, in that case, the `ng-model` value gets put into the isolated scope and does not get
21592
+ * propogated to the parent scope.
21593
+ *
21339
21594
  *
21340
21595
  * This example shows how to use `NgModelController` with a custom control to achieve
21341
21596
  * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
@@ -21376,7 +21631,13 @@ var VALID_CLASS = 'ng-valid',
21376
21631
 
21377
21632
  // Write data to the model
21378
21633
  function read() {
21379
- ngModel.$setViewValue(element.html());
21634
+ var html = element.html();
21635
+ // When we clear the content editable the browser leaves a <br> behind
21636
+ // If strip-br attribute is provided then we strip this out
21637
+ if( attrs.stripBr && html == '<br>' ) {
21638
+ html = '';
21639
+ }
21640
+ ngModel.$setViewValue(html);
21380
21641
  }
21381
21642
  }
21382
21643
  };
@@ -21386,6 +21647,7 @@ var VALID_CLASS = 'ng-valid',
21386
21647
  <form name="myForm">
21387
21648
  <div contenteditable
21388
21649
  name="myWidget" ng-model="userContent"
21650
+ strip-br="true"
21389
21651
  required>Change me!</div>
21390
21652
  <span ng-show="myForm.myWidget.$error.required">Required!</span>
21391
21653
  <hr>
@@ -21508,8 +21770,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
21508
21770
  * For example {@link ng.directive:input input} or
21509
21771
  * {@link ng.directive:select select} directives call it.
21510
21772
  *
21511
- * It internally calls all `parsers` and if resulted value is valid, updates the model and
21512
- * calls all registered change listeners.
21773
+ * It internally calls all `$parsers` (including validators) and updates the `$modelValue` and the actual model path.
21774
+ * Lastly it calls all registered change listeners.
21513
21775
  *
21514
21776
  * @param {string} value Value from the view.
21515
21777
  */
@@ -21574,7 +21836,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
21574
21836
  * @element input
21575
21837
  *
21576
21838
  * @description
21577
- * Is directive that tells Angular to do two-way data binding. It works together with `input`,
21839
+ * Is a directive that tells Angular to do two-way data binding. It works together with `input`,
21578
21840
  * `select`, `textarea`. You can easily write your own directives to use `ngModel` as well.
21579
21841
  *
21580
21842
  * `ngModel` is responsible for:
@@ -21586,6 +21848,10 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
21586
21848
  * - setting related css class onto the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`),
21587
21849
  * - register the control with parent {@link ng.directive:form form}.
21588
21850
  *
21851
+ * Note: `ngModel` will try to bind to the property given by evaluating the expression on the
21852
+ * current scope. If the property doesn't already exist on this scope, it will be created
21853
+ * implicitly and added to the scope.
21854
+ *
21589
21855
  * For basic examples, how to use `ngModel`, see:
21590
21856
  *
21591
21857
  * - {@link ng.directive:input input}
@@ -21726,8 +21992,9 @@ var requiredDirective = function() {
21726
21992
  </script>
21727
21993
  <form name="myForm" ng-controller="Ctrl">
21728
21994
  List: <input name="namesInput" ng-model="names" ng-list required>
21729
- <span class="error" ng-show="myForm.list.$error.required">
21995
+ <span class="error" ng-show="myForm.namesInput.$error.required">
21730
21996
  Required!</span>
21997
+ <br>
21731
21998
  <tt>names = {{names}}</tt><br/>
21732
21999
  <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>
21733
22000
  <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>
@@ -21739,12 +22006,14 @@ var requiredDirective = function() {
21739
22006
  it('should initialize to model', function() {
21740
22007
  expect(binding('names')).toEqual('["igor","misko","vojta"]');
21741
22008
  expect(binding('myForm.namesInput.$valid')).toEqual('true');
22009
+ expect(element('span.error').css('display')).toBe('none');
21742
22010
  });
21743
22011
 
21744
22012
  it('should be invalid if empty', function() {
21745
22013
  input('names').enter('');
21746
22014
  expect(binding('names')).toEqual('[]');
21747
22015
  expect(binding('myForm.namesInput.$valid')).toEqual('false');
22016
+ expect(element('span.error').css('display')).not().toBe('none');
21748
22017
  });
21749
22018
  </doc:scenario>
21750
22019
  </doc:example>
@@ -21794,7 +22063,7 @@ var ngValueDirective = function() {
21794
22063
  } else {
21795
22064
  return function(scope, elm, attr) {
21796
22065
  scope.$watch(attr.ngValue, function valueWatchAction(value) {
21797
- attr.$set('value', value, false);
22066
+ attr.$set('value', value);
21798
22067
  });
21799
22068
  };
21800
22069
  }
@@ -21814,10 +22083,9 @@ var ngValueDirective = function() {
21814
22083
  * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
21815
22084
  * `{{ expression }}` which is similar but less verbose.
21816
22085
  *
21817
- * One scenario in which the use of `ngBind` is preferred over `{{ expression }}` binding is when
21818
- * it's desirable to put bindings into template that is momentarily displayed by the browser in its
21819
- * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes the
21820
- * bindings invisible to the user while the page is loading.
22086
+ * It is preferrable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
22087
+ * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
22088
+ * element attribute, it makes the bindings invisible to the user while the page is loading.
21821
22089
  *
21822
22090
  * An alternative solution to this problem would be using the
21823
22091
  * {@link ng.directive:ngCloak ngCloak} directive.
@@ -21863,10 +22131,11 @@ var ngBindDirective = ngDirective(function(scope, element, attr) {
21863
22131
  *
21864
22132
  * @description
21865
22133
  * The `ngBindTemplate` directive specifies that the element
21866
- * text should be replaced with the template in ngBindTemplate.
21867
- * Unlike ngBind the ngBindTemplate can contain multiple `{{` `}}`
21868
- * expressions. (This is required since some HTML elements
21869
- * can not have SPAN elements such as TITLE, or OPTION to name a few.)
22134
+ * text content should be replaced with the interpolation of the template
22135
+ * in the `ngBindTemplate` attribute.
22136
+ * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`
22137
+ * expressions. This directive is needed since some HTML elements
22138
+ * (such as TITLE and OPTION) cannot contain SPAN elements.
21870
22139
  *
21871
22140
  * @element ANY
21872
22141
  * @param {string} ngBindTemplate template of form
@@ -22002,8 +22271,8 @@ function classDirective(name, selector) {
22002
22271
  * @name ng.directive:ngClass
22003
22272
  *
22004
22273
  * @description
22005
- * The `ngClass` allows you to set CSS class on HTML element dynamically by databinding an
22006
- * expression that represents all classes to be added.
22274
+ * The `ngClass` allows you to set CSS classes on HTML an element, dynamically, by databinding
22275
+ * an expression that represents all classes to be added.
22007
22276
  *
22008
22277
  * The directive won't add duplicate classes if a particular class was already set.
22009
22278
  *
@@ -22013,7 +22282,9 @@ function classDirective(name, selector) {
22013
22282
  * @element ANY
22014
22283
  * @param {expression} ngClass {@link guide/expression Expression} to eval. The result
22015
22284
  * of the evaluation can be a string representing space delimited class
22016
- * names, an array, or a map of class names to boolean values.
22285
+ * names, an array, or a map of class names to boolean values. In the case of a map, the
22286
+ * names of the properties whose values are truthy will be added as css classes to the
22287
+ * element.
22017
22288
  *
22018
22289
  * @example
22019
22290
  <example>
@@ -22159,7 +22430,7 @@ var ngClassEvenDirective = classDirective('Even', 1);
22159
22430
  *
22160
22431
  * <pre>
22161
22432
  * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
22162
- * display: none;
22433
+ * display: none !important;
22163
22434
  * }
22164
22435
  * </pre>
22165
22436
  *
@@ -22227,11 +22498,9 @@ var ngCloakDirective = ngDirective({
22227
22498
  *
22228
22499
  * @example
22229
22500
  * Here is a simple form for editing user contact information. Adding, removing, clearing, and
22230
- * greeting are methods declared on the controller (see source tab). These methods can
22231
- * easily be called from the angular markup. Notice that the scope becomes the `this` for the
22232
- * controller's instance. This allows for easy access to the view data from the controller. Also
22233
- * notice that any changes to the data are automatically reflected in the View without the need
22234
- * for a manual update.
22501
+ * greeting are methods declared on the $scope by the controller (see source tab). These methods can
22502
+ * easily be called from the angular markup. Notice that any changes to the data are automatically
22503
+ * reflected in the View without the need for a manual update.
22235
22504
  <doc:example>
22236
22505
  <doc:source>
22237
22506
  <script>
@@ -22382,7 +22651,7 @@ var ngCspDirective = ['$sniffer', function($sniffer) {
22382
22651
  */
22383
22652
  var ngEventDirectives = {};
22384
22653
  forEach(
22385
- 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave'.split(' '),
22654
+ 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave submit'.split(' '),
22386
22655
  function(name) {
22387
22656
  var directiveName = directiveNormalize('ng-' + name);
22388
22657
  ngEventDirectives[directiveName] = ['$parse', function($parse) {
@@ -22509,6 +22778,54 @@ forEach(
22509
22778
  */
22510
22779
 
22511
22780
 
22781
+ /**
22782
+ * @ngdoc directive
22783
+ * @name ng.directive:ngKeydown
22784
+ *
22785
+ * @description
22786
+ * Specify custom behavior on keydown event.
22787
+ *
22788
+ * @element ANY
22789
+ * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon
22790
+ * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
22791
+ *
22792
+ * @example
22793
+ * See {@link ng.directive:ngClick ngClick}
22794
+ */
22795
+
22796
+
22797
+ /**
22798
+ * @ngdoc directive
22799
+ * @name ng.directive:ngKeyup
22800
+ *
22801
+ * @description
22802
+ * Specify custom behavior on keyup event.
22803
+ *
22804
+ * @element ANY
22805
+ * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon
22806
+ * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
22807
+ *
22808
+ * @example
22809
+ * See {@link ng.directive:ngClick ngClick}
22810
+ */
22811
+
22812
+
22813
+ /**
22814
+ * @ngdoc directive
22815
+ * @name ng.directive:ngKeypress
22816
+ *
22817
+ * @description
22818
+ * Specify custom behavior on keypress event.
22819
+ *
22820
+ * @element ANY
22821
+ * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon
22822
+ * keypress. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
22823
+ *
22824
+ * @example
22825
+ * See {@link ng.directive:ngClick ngClick}
22826
+ */
22827
+
22828
+
22512
22829
  /**
22513
22830
  * @ngdoc directive
22514
22831
  * @name ng.directive:ngSubmit
@@ -22517,10 +22834,11 @@ forEach(
22517
22834
  * Enables binding angular expressions to onsubmit events.
22518
22835
  *
22519
22836
  * Additionally it prevents the default action (which for form means sending the request to the
22520
- * server and reloading the current page).
22837
+ * server and reloading the current page) **but only if the form does not contain an `action`
22838
+ * attribute**.
22521
22839
  *
22522
22840
  * @element form
22523
- * @param {expression} ngSubmit {@link guide/expression Expression} to eval.
22841
+ * @param {expression} ngSubmit {@link guide/expression Expression} to eval. (Event object is available as `$event`)
22524
22842
  *
22525
22843
  * @example
22526
22844
  <doc:example>
@@ -22560,11 +22878,6 @@ forEach(
22560
22878
  </doc:scenario>
22561
22879
  </doc:example>
22562
22880
  */
22563
- var ngSubmitDirective = ngDirective(function(scope, element, attrs) {
22564
- element.bind('submit', function() {
22565
- scope.$apply(attrs.ngSubmit);
22566
- });
22567
- });
22568
22881
 
22569
22882
  /**
22570
22883
  * @ngdoc directive
@@ -22772,7 +23085,7 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
22772
23085
  * @description
22773
23086
  * # Overview
22774
23087
  * `ngPluralize` is a directive that displays messages according to en-US localization rules.
22775
- * These rules are bundled with angular.js and the rules can be overridden
23088
+ * These rules are bundled with angular.js, but can be overridden
22776
23089
  * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive
22777
23090
  * by specifying the mappings between
22778
23091
  * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
@@ -22785,8 +23098,8 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
22785
23098
  *
22786
23099
  * While a pural category may match many numbers (for example, in en-US locale, "other" can match
22787
23100
  * any number that is not 1), an explicit number rule can only match one number. For example, the
22788
- * explicit number rule for "3" matches the number 3. You will see the use of plural categories
22789
- * and explicit number rules throughout later parts of this documentation.
23101
+ * explicit number rule for "3" matches the number 3. There are examples of plural categories
23102
+ * and explicit number rules throughout the rest of this documentation.
22790
23103
  *
22791
23104
  * # Configuring ngPluralize
22792
23105
  * You configure ngPluralize by providing 2 attributes: `count` and `when`.
@@ -22796,8 +23109,7 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
22796
23109
  * Angular expression}; these are evaluated on the current scope for its bound value.
22797
23110
  *
22798
23111
  * The `when` attribute specifies the mappings between plural categories and the actual
22799
- * string to be displayed. The value of the attribute should be a JSON object so that Angular
22800
- * can interpret it correctly.
23112
+ * string to be displayed. The value of the attribute should be a JSON object.
22801
23113
  *
22802
23114
  * The following example shows how to configure ngPluralize:
22803
23115
  *
@@ -23421,8 +23733,7 @@ var ngSwitchDefaultDirective = ngDirective({
23421
23733
  return {
23422
23734
  restrict: 'E',
23423
23735
  transclude: true,
23424
- scope: 'isolate',
23425
- locals: { title:'bind' },
23736
+ scope: { title:'@' },
23426
23737
  template: '<div style="border: 1px solid black;">' +
23427
23738
  '<div style="background-color: gray">{{title}}</div>' +
23428
23739
  '<div ng-transclude></div>' +
@@ -23677,8 +23988,8 @@ var scriptDirective = ['$templateCache', function($templateCache) {
23677
23988
  * Optionally `ngOptions` attribute can be used to dynamically generate a list of `<option>`
23678
23989
  * elements for a `<select>` element using an array or an object obtained by evaluating the
23679
23990
  * `ngOptions` expression.
23680
- *˝˝
23681
- * When an item in the select menu is select, the value of array element or object property
23991
+ *
23992
+ * When an item in the `<select>` menu is selected, the value of array element or object property
23682
23993
  * represented by the selected option will be bound to the model identified by the `ngModel`
23683
23994
  * directive of the parent select element.
23684
23995
  *
@@ -26306,5 +26617,5 @@ if (config.autotest) {
26306
26617
  }
26307
26618
  })(window, document);
26308
26619
 
26309
- angular.element(document).find('head').append('<style type="text/css">@charset "UTF-8";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak {\n display: none;\n}\n\nng\\:form {\n display: block;\n}\n</style>');
26620
+ angular.element(document).find('head').append('<style type="text/css">@charset "UTF-8";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak {\n display: none !important;\n}\n\nng\\:form {\n display: block;\n}\n</style>');
26310
26621
  angular.element(document).find('head').append('<style type="text/css">@charset "UTF-8";\n/* CSS Document */\n\n/** Structure */\nbody {\n font-family: Arial, sans-serif;\n margin: 0;\n font-size: 14px;\n}\n\n#system-error {\n font-size: 1.5em;\n text-align: center;\n}\n\n#json, #xml {\n display: none;\n}\n\n#header {\n position: fixed;\n width: 100%;\n}\n\n#specs {\n padding-top: 50px;\n}\n\n#header .angular {\n font-family: Courier New, monospace;\n font-weight: bold;\n}\n\n#header h1 {\n font-weight: normal;\n float: left;\n font-size: 30px;\n line-height: 30px;\n margin: 0;\n padding: 10px 10px;\n height: 30px;\n}\n\n#application h2,\n#specs h2 {\n margin: 0;\n padding: 0.5em;\n font-size: 1.1em;\n}\n\n#status-legend {\n margin-top: 10px;\n margin-right: 10px;\n}\n\n#header,\n#application,\n.test-info,\n.test-actions li {\n overflow: hidden;\n}\n\n#application {\n margin: 10px;\n}\n\n#application iframe {\n width: 100%;\n height: 758px;\n}\n\n#application .popout {\n float: right;\n}\n\n#application iframe {\n border: none;\n}\n\n.tests li,\n.test-actions li,\n.test-it li,\n.test-it ol,\n.status-display {\n list-style-type: none;\n}\n\n.tests,\n.test-it ol,\n.status-display {\n margin: 0;\n padding: 0;\n}\n\n.test-info {\n margin-left: 1em;\n margin-top: 0.5em;\n border-radius: 8px 0 0 8px;\n -webkit-border-radius: 8px 0 0 8px;\n -moz-border-radius: 8px 0 0 8px;\n cursor: pointer;\n}\n\n.test-info:hover .test-name {\n text-decoration: underline;\n}\n\n.test-info .closed:before {\n content: \'\\25b8\\00A0\';\n}\n\n.test-info .open:before {\n content: \'\\25be\\00A0\';\n font-weight: bold;\n}\n\n.test-it ol {\n margin-left: 2.5em;\n}\n\n.status-display,\n.status-display li {\n float: right;\n}\n\n.status-display li {\n padding: 5px 10px;\n}\n\n.timer-result,\n.test-title {\n display: inline-block;\n margin: 0;\n padding: 4px;\n}\n\n.test-actions .test-title,\n.test-actions .test-result {\n display: table-cell;\n padding-left: 0.5em;\n padding-right: 0.5em;\n}\n\n.test-actions {\n display: table;\n}\n\n.test-actions li {\n display: table-row;\n}\n\n.timer-result {\n width: 4em;\n padding: 0 10px;\n text-align: right;\n font-family: monospace;\n}\n\n.test-it pre,\n.test-actions pre {\n clear: left;\n color: black;\n margin-left: 6em;\n}\n\n.test-describe {\n padding-bottom: 0.5em;\n}\n\n.test-describe .test-describe {\n margin: 5px 5px 10px 2em;\n}\n\n.test-actions .status-pending .test-title:before {\n content: \'\\00bb\\00A0\';\n}\n\n.scrollpane {\n max-height: 20em;\n overflow: auto;\n}\n\n/** Colors */\n\n#header {\n background-color: #F2C200;\n}\n\n#specs h2 {\n border-top: 2px solid #BABAD1;\n}\n\n#specs h2,\n#application h2 {\n background-color: #efefef;\n}\n\n#application {\n border: 1px solid #BABAD1;\n}\n\n.test-describe .test-describe {\n border-left: 1px solid #BABAD1;\n border-right: 1px solid #BABAD1;\n border-bottom: 1px solid #BABAD1;\n}\n\n.status-display {\n border: 1px solid #777;\n}\n\n.status-display .status-pending,\n.status-pending .test-info {\n background-color: #F9EEBC;\n}\n\n.status-display .status-success,\n.status-success .test-info {\n background-color: #B1D7A1;\n}\n\n.status-display .status-failure,\n.status-failure .test-info {\n background-color: #FF8286;\n}\n\n.status-display .status-error,\n.status-error .test-info {\n background-color: black;\n color: white;\n}\n\n.test-actions .status-success .test-title {\n color: #30B30A;\n}\n\n.test-actions .status-failure .test-title {\n color: #DF0000;\n}\n\n.test-actions .status-error .test-title {\n color: black;\n}\n\n.test-actions .timer-result {\n color: #888;\n}\n</style>');