sunspot_solr 2.2.2 → 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/bin/sunspot-solr +2 -6
  3. data/lib/sunspot/solr/server.rb +2 -3
  4. data/solr/README.txt +181 -181
  5. data/solr/bin/post +29 -19
  6. data/solr/bin/solr +247 -428
  7. data/solr/bin/solr.cmd +102 -256
  8. data/solr/bin/solr.in.cmd +15 -7
  9. data/solr/bin/solr.in.sh +26 -12
  10. data/solr/server/README.txt +110 -113
  11. data/solr/server/contexts/solr-jetty-context.xml +8 -8
  12. data/solr/server/etc/jetty-http.xml +47 -0
  13. data/solr/server/etc/jetty-https-ssl.xml +175 -159
  14. data/solr/server/etc/jetty-https.xml +53 -0
  15. data/solr/server/etc/jetty-ssl.xml +46 -0
  16. data/solr/server/etc/jetty.xml +189 -167
  17. data/solr/server/etc/webdefault.xml +527 -527
  18. data/solr/server/lib/javax.servlet-api-3.1.0.jar +0 -0
  19. data/solr/server/lib/jetty-continuation-9.2.11.v20150529.jar +0 -0
  20. data/solr/server/lib/jetty-deploy-9.2.11.v20150529.jar +0 -0
  21. data/solr/server/lib/jetty-http-9.2.11.v20150529.jar +0 -0
  22. data/solr/server/lib/jetty-io-9.2.11.v20150529.jar +0 -0
  23. data/solr/server/lib/jetty-jmx-9.2.11.v20150529.jar +0 -0
  24. data/solr/server/lib/jetty-rewrite-9.2.11.v20150529.jar +0 -0
  25. data/solr/server/lib/jetty-security-9.2.11.v20150529.jar +0 -0
  26. data/solr/server/lib/jetty-server-9.2.11.v20150529.jar +0 -0
  27. data/solr/server/lib/jetty-servlet-9.2.11.v20150529.jar +0 -0
  28. data/solr/server/lib/jetty-servlets-9.2.11.v20150529.jar +0 -0
  29. data/solr/server/lib/jetty-util-9.2.11.v20150529.jar +0 -0
  30. data/solr/server/lib/jetty-webapp-9.2.11.v20150529.jar +0 -0
  31. data/solr/server/lib/jetty-xml-9.2.11.v20150529.jar +0 -0
  32. data/solr/server/modules/http.mod +9 -0
  33. data/solr/server/modules/https.mod +9 -0
  34. data/solr/server/modules/server.mod +11 -0
  35. data/solr/server/modules/ssl.mod +9 -0
  36. data/solr/server/resources/jetty-logging.properties +1 -0
  37. data/solr/server/resources/log4j.properties +24 -24
  38. data/solr/server/solr-webapp/webapp/WEB-INF/lib/commons-exec-1.3.jar +0 -0
  39. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{hadoop-annotations-2.3.0.jar → hadoop-annotations-2.6.0.jar} +0 -0
  40. data/solr/server/solr-webapp/webapp/WEB-INF/lib/hadoop-auth-2.6.0.jar +0 -0
  41. data/solr/server/solr-webapp/webapp/WEB-INF/lib/hadoop-common-2.6.0.jar +0 -0
  42. data/solr/server/solr-webapp/webapp/WEB-INF/lib/hadoop-hdfs-2.6.0.jar +0 -0
  43. data/solr/server/solr-webapp/webapp/WEB-INF/lib/htrace-core-3.0.4.jar +0 -0
  44. data/solr/server/solr-webapp/webapp/WEB-INF/lib/httpclient-4.4.1.jar +0 -0
  45. data/solr/server/solr-webapp/webapp/WEB-INF/lib/httpcore-4.4.1.jar +0 -0
  46. data/solr/server/solr-webapp/webapp/WEB-INF/lib/httpmime-4.4.1.jar +0 -0
  47. data/solr/server/solr-webapp/webapp/WEB-INF/lib/jackson-core-2.5.4.jar +0 -0
  48. data/solr/server/solr-webapp/webapp/WEB-INF/lib/jackson-dataformat-smile-2.5.4.jar +0 -0
  49. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{lucene-analyzers-common-5.0.0.jar → lucene-analyzers-common-5.3.1.jar} +0 -0
  50. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{lucene-analyzers-kuromoji-5.0.0.jar → lucene-analyzers-kuromoji-5.3.1.jar} +0 -0
  51. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{lucene-analyzers-phonetic-5.0.0.jar → lucene-analyzers-phonetic-5.3.1.jar} +0 -0
  52. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-backward-codecs-5.3.1.jar +0 -0
  53. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-codecs-5.3.1.jar +0 -0
  54. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-core-5.3.1.jar +0 -0
  55. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{lucene-expressions-5.0.0.jar → lucene-expressions-5.3.1.jar} +0 -0
  56. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{lucene-grouping-5.0.0.jar → lucene-grouping-5.3.1.jar} +0 -0
  57. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-highlighter-5.3.1.jar +0 -0
  58. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-join-5.3.1.jar +0 -0
  59. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-memory-5.3.1.jar +0 -0
  60. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-misc-5.3.1.jar +0 -0
  61. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-queries-5.3.1.jar +0 -0
  62. data/solr/server/solr-webapp/webapp/WEB-INF/lib/{lucene-queryparser-5.0.0.jar → lucene-queryparser-5.3.1.jar} +0 -0
  63. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-sandbox-5.3.1.jar +0 -0
  64. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-spatial-5.3.1.jar +0 -0
  65. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-suggest-5.3.1.jar +0 -0
  66. data/solr/server/solr-webapp/webapp/WEB-INF/lib/org.restlet-2.3.0.jar +0 -0
  67. data/solr/server/solr-webapp/webapp/WEB-INF/lib/org.restlet.ext.servlet-2.3.0.jar +0 -0
  68. data/solr/server/solr-webapp/webapp/WEB-INF/lib/solr-core-5.3.1.jar +0 -0
  69. data/solr/server/solr-webapp/webapp/WEB-INF/lib/solr-solrj-5.3.1.jar +0 -0
  70. data/solr/server/solr-webapp/webapp/WEB-INF/lib/t-digest-3.1.jar +0 -0
  71. data/solr/server/solr-webapp/webapp/WEB-INF/web.xml +169 -181
  72. data/solr/server/solr-webapp/webapp/WEB-INF/weblogic.xml +28 -28
  73. data/solr/server/solr-webapp/webapp/admin.html +164 -163
  74. data/solr/server/solr-webapp/webapp/css/angular/analysis.css +304 -0
  75. data/solr/server/solr-webapp/webapp/css/angular/chosen.css +465 -0
  76. data/solr/server/solr-webapp/webapp/css/angular/cloud.css +398 -0
  77. data/solr/server/solr-webapp/webapp/css/angular/common.css +724 -0
  78. data/solr/server/solr-webapp/webapp/css/angular/cores.css +233 -0
  79. data/solr/server/solr-webapp/webapp/css/angular/dataimport.css +370 -0
  80. data/solr/server/solr-webapp/webapp/css/angular/documents.css +179 -0
  81. data/solr/server/solr-webapp/webapp/css/angular/files.css +53 -0
  82. data/solr/server/solr-webapp/webapp/css/angular/index.css +206 -0
  83. data/solr/server/solr-webapp/webapp/css/angular/logging.css +376 -0
  84. data/solr/server/solr-webapp/webapp/css/angular/menu.css +321 -0
  85. data/solr/server/solr-webapp/webapp/css/angular/plugins.css +212 -0
  86. data/solr/server/solr-webapp/webapp/css/angular/query.css +162 -0
  87. data/solr/server/solr-webapp/webapp/css/angular/replication.css +500 -0
  88. data/solr/server/solr-webapp/webapp/css/angular/schema-browser.css +567 -0
  89. data/solr/server/solr-webapp/webapp/css/angular/segments.css +173 -0
  90. data/solr/server/solr-webapp/webapp/css/angular/threads.css +161 -0
  91. data/solr/server/solr-webapp/webapp/css/chosen.css +421 -421
  92. data/solr/server/solr-webapp/webapp/css/styles/analysis.css +311 -311
  93. data/solr/server/solr-webapp/webapp/css/styles/cloud.css +410 -410
  94. data/solr/server/solr-webapp/webapp/css/styles/common.css +701 -701
  95. data/solr/server/solr-webapp/webapp/css/styles/cores.css +244 -244
  96. data/solr/server/solr-webapp/webapp/css/styles/dashboard.css +155 -155
  97. data/solr/server/solr-webapp/webapp/css/styles/dataimport.css +403 -403
  98. data/solr/server/solr-webapp/webapp/css/styles/documents.css +197 -197
  99. data/solr/server/solr-webapp/webapp/css/styles/files.css +54 -54
  100. data/solr/server/solr-webapp/webapp/css/styles/index.css +207 -207
  101. data/solr/server/solr-webapp/webapp/css/styles/java-properties.css +52 -52
  102. data/solr/server/solr-webapp/webapp/css/styles/logging.css +391 -391
  103. data/solr/server/solr-webapp/webapp/css/styles/menu.css +329 -328
  104. data/solr/server/solr-webapp/webapp/css/styles/plugins.css +195 -195
  105. data/solr/server/solr-webapp/webapp/css/styles/query.css +173 -173
  106. data/solr/server/solr-webapp/webapp/css/styles/replication.css +515 -515
  107. data/solr/server/solr-webapp/webapp/css/styles/schema-browser.css +578 -578
  108. data/solr/server/solr-webapp/webapp/css/styles/segments.css +145 -0
  109. data/solr/server/solr-webapp/webapp/css/styles/threads.css +172 -172
  110. data/solr/server/solr-webapp/webapp/img/chosen-sprite-2x.png +0 -0
  111. data/solr/server/solr-webapp/webapp/img/filetypes/README +27 -27
  112. data/solr/server/solr-webapp/webapp/img/solr.svg +39 -39
  113. data/solr/server/solr-webapp/webapp/index.html +208 -0
  114. data/solr/server/solr-webapp/webapp/js/angular/app.js +713 -0
  115. data/solr/server/solr-webapp/webapp/js/angular/controllers/analysis.js +199 -0
  116. data/solr/server/solr-webapp/webapp/js/angular/controllers/cloud.js +528 -0
  117. data/solr/server/solr-webapp/webapp/js/angular/controllers/core-overview.js +225 -0
  118. data/solr/server/solr-webapp/webapp/js/angular/controllers/cores.js +465 -0
  119. data/solr/server/solr-webapp/webapp/js/angular/controllers/dataimport.js +284 -0
  120. data/solr/server/solr-webapp/webapp/js/angular/controllers/documents.js +139 -0
  121. data/solr/server/solr-webapp/webapp/js/angular/controllers/files.js +92 -0
  122. data/solr/server/solr-webapp/webapp/js/angular/controllers/index.js +95 -0
  123. data/solr/server/solr-webapp/webapp/js/angular/controllers/java-properties.js +45 -0
  124. data/solr/server/solr-webapp/webapp/js/angular/controllers/logging.js +146 -0
  125. data/solr/server/solr-webapp/webapp/js/angular/controllers/plugins.js +166 -0
  126. data/solr/server/solr-webapp/webapp/js/angular/controllers/query.js +99 -0
  127. data/solr/server/solr-webapp/webapp/js/angular/controllers/replication.js +227 -0
  128. data/solr/server/solr-webapp/webapp/js/angular/controllers/schema-browser.js +432 -0
  129. data/solr/server/solr-webapp/webapp/js/angular/controllers/segments.js +94 -0
  130. data/solr/server/solr-webapp/webapp/js/angular/controllers/threads.js +51 -0
  131. data/solr/server/solr-webapp/webapp/js/angular/services.js +214 -0
  132. data/solr/server/solr-webapp/webapp/js/lib/ZeroClipboard.js +342 -342
  133. data/solr/server/solr-webapp/webapp/js/lib/chosen.js +982 -982
  134. data/solr/server/solr-webapp/webapp/js/lib/console.js +29 -29
  135. data/solr/server/solr-webapp/webapp/js/lib/d3.js +9373 -9373
  136. data/solr/server/solr-webapp/webapp/js/lib/highlight.js +31 -31
  137. data/solr/server/solr-webapp/webapp/js/lib/jquery-1.7.2.min.js +30 -30
  138. data/solr/server/solr-webapp/webapp/js/lib/jquery.ajaxfileupload.js +184 -184
  139. data/solr/server/solr-webapp/webapp/js/lib/jquery.blockUI.js +523 -523
  140. data/solr/server/solr-webapp/webapp/js/lib/jquery.cookie.js +71 -71
  141. data/solr/server/solr-webapp/webapp/js/lib/jquery.form.js +806 -806
  142. data/solr/server/solr-webapp/webapp/js/lib/jquery.jstree.js +3534 -3534
  143. data/solr/server/solr-webapp/webapp/js/lib/jquery.sammy.js +1863 -1863
  144. data/solr/server/solr-webapp/webapp/js/lib/jquery.timeago.js +189 -189
  145. data/solr/server/solr-webapp/webapp/js/lib/linker.js +48 -48
  146. data/solr/server/solr-webapp/webapp/js/lib/naturalSort.js +82 -0
  147. data/solr/server/solr-webapp/webapp/js/lib/order.js +216 -216
  148. data/solr/server/solr-webapp/webapp/js/main.js +60 -58
  149. data/solr/server/solr-webapp/webapp/js/require.js +11349 -11349
  150. data/solr/server/solr-webapp/webapp/js/scripts/analysis.js +545 -545
  151. data/solr/server/solr-webapp/webapp/js/scripts/app.js +680 -679
  152. data/solr/server/solr-webapp/webapp/js/scripts/cloud.js +877 -877
  153. data/solr/server/solr-webapp/webapp/js/scripts/cores.js +719 -719
  154. data/solr/server/solr-webapp/webapp/js/scripts/dashboard.js +562 -562
  155. data/solr/server/solr-webapp/webapp/js/scripts/dataimport.js +812 -812
  156. data/solr/server/solr-webapp/webapp/js/scripts/documents.js +370 -370
  157. data/solr/server/solr-webapp/webapp/js/scripts/files.js +265 -265
  158. data/solr/server/solr-webapp/webapp/js/scripts/index.js +340 -340
  159. data/solr/server/solr-webapp/webapp/js/scripts/java-properties.js +106 -106
  160. data/solr/server/solr-webapp/webapp/js/scripts/logging.js +578 -576
  161. data/solr/server/solr-webapp/webapp/js/scripts/ping.js +72 -72
  162. data/solr/server/solr-webapp/webapp/js/scripts/plugins.js +462 -462
  163. data/solr/server/solr-webapp/webapp/js/scripts/query.js +229 -229
  164. data/solr/server/solr-webapp/webapp/js/scripts/replication.js +527 -527
  165. data/solr/server/solr-webapp/webapp/js/scripts/schema-browser.js +1229 -1229
  166. data/solr/server/solr-webapp/webapp/js/scripts/segments.js +206 -0
  167. data/solr/server/solr-webapp/webapp/js/scripts/threads.js +158 -158
  168. data/solr/server/solr-webapp/webapp/libs/angular-chosen.js +139 -0
  169. data/solr/server/solr-webapp/webapp/libs/angular-cookies.js +229 -0
  170. data/solr/server/solr-webapp/webapp/libs/angular-cookies.min.js +31 -0
  171. data/solr/server/solr-webapp/webapp/libs/angular-resource.min.js +36 -0
  172. data/solr/server/solr-webapp/webapp/libs/angular-route.js +1018 -0
  173. data/solr/server/solr-webapp/webapp/libs/angular-route.min.js +38 -0
  174. data/solr/server/solr-webapp/webapp/libs/angular-sanitize.js +703 -0
  175. data/solr/server/solr-webapp/webapp/libs/angular-sanitize.min.js +39 -0
  176. data/solr/server/solr-webapp/webapp/libs/angular.js +26093 -0
  177. data/solr/server/solr-webapp/webapp/libs/angular.min.js +273 -0
  178. data/solr/server/solr-webapp/webapp/libs/chosen.jquery.js +1194 -0
  179. data/solr/server/solr-webapp/webapp/libs/chosen.jquery.min.js +30 -0
  180. data/solr/server/solr-webapp/webapp/libs/d3.js +9373 -0
  181. data/solr/server/solr-webapp/webapp/libs/highlight.js +31 -0
  182. data/solr/server/solr-webapp/webapp/libs/jquery-2.1.3.min.js +29 -0
  183. data/solr/server/solr-webapp/webapp/libs/jquery.jstree.js +3534 -0
  184. data/solr/server/solr-webapp/webapp/libs/ngtimeago.js +102 -0
  185. data/solr/server/solr-webapp/webapp/partials/analysis.html +128 -0
  186. data/solr/server/solr-webapp/webapp/partials/cloud.html +104 -0
  187. data/solr/server/solr-webapp/webapp/partials/core_overview.html +227 -0
  188. data/solr/server/solr-webapp/webapp/partials/cores.html +231 -0
  189. data/solr/server/solr-webapp/webapp/partials/dataimport.html +209 -0
  190. data/solr/server/solr-webapp/webapp/partials/documents.html +118 -0
  191. data/solr/server/solr-webapp/webapp/partials/files.html +47 -0
  192. data/solr/server/solr-webapp/webapp/partials/index.html +261 -0
  193. data/solr/server/solr-webapp/webapp/partials/java-properties.html +27 -0
  194. data/solr/server/solr-webapp/webapp/partials/logging-levels.html +56 -0
  195. data/solr/server/solr-webapp/webapp/partials/logging.html +56 -0
  196. data/solr/server/solr-webapp/webapp/partials/plugins.html +72 -0
  197. data/solr/server/solr-webapp/webapp/partials/query.html +356 -0
  198. data/solr/server/solr-webapp/webapp/partials/replication.html +239 -0
  199. data/solr/server/solr-webapp/webapp/partials/schema-browser.html +206 -0
  200. data/solr/server/solr-webapp/webapp/partials/segments.html +99 -0
  201. data/solr/server/solr-webapp/webapp/partials/threads.html +65 -0
  202. data/solr/server/solr-webapp/webapp/tpl/analysis.html +83 -83
  203. data/solr/server/solr-webapp/webapp/tpl/cloud.html +87 -87
  204. data/solr/server/solr-webapp/webapp/tpl/cores.html +226 -226
  205. data/solr/server/solr-webapp/webapp/tpl/dashboard.html +201 -201
  206. data/solr/server/solr-webapp/webapp/tpl/dataimport.html +183 -183
  207. data/solr/server/solr-webapp/webapp/tpl/documents.html +107 -107
  208. data/solr/server/solr-webapp/webapp/tpl/files.html +44 -44
  209. data/solr/server/solr-webapp/webapp/tpl/index.html +250 -250
  210. data/solr/server/solr-webapp/webapp/tpl/logging.html +23 -23
  211. data/solr/server/solr-webapp/webapp/tpl/plugins.html +39 -39
  212. data/solr/server/solr-webapp/webapp/tpl/query.html +361 -361
  213. data/solr/server/solr-webapp/webapp/tpl/replication.html +216 -216
  214. data/solr/server/solr-webapp/webapp/tpl/schema-browser.html +192 -192
  215. data/solr/server/solr-webapp/webapp/tpl/segments.html +49 -0
  216. data/solr/server/solr-webapp/webapp/tpl/threads.html +56 -56
  217. data/solr/server/solr/README.txt +77 -77
  218. data/solr/server/solr/solr.xml +51 -51
  219. data/solr/server/solr/zoo.cfg +17 -17
  220. data/solr/server/start.jar +0 -0
  221. data/spec/server_spec.rb +3 -8
  222. metadata +132 -43
  223. data/solr/server/lib/jetty-continuation-8.1.10.v20130312.jar +0 -0
  224. data/solr/server/lib/jetty-deploy-8.1.10.v20130312.jar +0 -0
  225. data/solr/server/lib/jetty-http-8.1.10.v20130312.jar +0 -0
  226. data/solr/server/lib/jetty-io-8.1.10.v20130312.jar +0 -0
  227. data/solr/server/lib/jetty-jmx-8.1.10.v20130312.jar +0 -0
  228. data/solr/server/lib/jetty-security-8.1.10.v20130312.jar +0 -0
  229. data/solr/server/lib/jetty-server-8.1.10.v20130312.jar +0 -0
  230. data/solr/server/lib/jetty-servlet-8.1.10.v20130312.jar +0 -0
  231. data/solr/server/lib/jetty-util-8.1.10.v20130312.jar +0 -0
  232. data/solr/server/lib/jetty-webapp-8.1.10.v20130312.jar +0 -0
  233. data/solr/server/lib/jetty-xml-8.1.10.v20130312.jar +0 -0
  234. data/solr/server/lib/servlet-api-3.0.jar +0 -0
  235. data/solr/server/solr-webapp/webapp/.gitignore +0 -1
  236. data/solr/server/solr-webapp/webapp/WEB-INF/lib/hadoop-auth-2.3.0.jar +0 -0
  237. data/solr/server/solr-webapp/webapp/WEB-INF/lib/hadoop-common-2.3.0.jar +0 -0
  238. data/solr/server/solr-webapp/webapp/WEB-INF/lib/hadoop-hdfs-2.3.0.jar +0 -0
  239. data/solr/server/solr-webapp/webapp/WEB-INF/lib/httpclient-4.3.1.jar +0 -0
  240. data/solr/server/solr-webapp/webapp/WEB-INF/lib/httpcore-4.3.jar +0 -0
  241. data/solr/server/solr-webapp/webapp/WEB-INF/lib/httpmime-4.3.1.jar +0 -0
  242. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-backward-codecs-5.0.0.jar +0 -0
  243. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-codecs-5.0.0.jar +0 -0
  244. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-core-5.0.0.jar +0 -0
  245. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-highlighter-5.0.0.jar +0 -0
  246. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-join-5.0.0.jar +0 -0
  247. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-memory-5.0.0.jar +0 -0
  248. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-misc-5.0.0.jar +0 -0
  249. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-queries-5.0.0.jar +0 -0
  250. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-spatial-5.0.0.jar +0 -0
  251. data/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-suggest-5.0.0.jar +0 -0
  252. data/solr/server/solr-webapp/webapp/WEB-INF/lib/org.restlet-2.1.1.jar +0 -0
  253. data/solr/server/solr-webapp/webapp/WEB-INF/lib/org.restlet.ext.servlet-2.1.1.jar +0 -0
  254. data/solr/server/solr-webapp/webapp/WEB-INF/lib/solr-core-5.0.0.jar +0 -0
  255. data/solr/server/solr-webapp/webapp/WEB-INF/lib/solr-solrj-5.0.0.jar +0 -0
  256. data/solr/server/webapps/solr.war +0 -0
@@ -0,0 +1,139 @@
1
+ /*
2
+ The MIT License
3
+
4
+ Copyright (c) 2013 Localytics http://www.localytics.com
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+ */
24
+ // Generated by CoffeeScript 1.8.0
25
+ (function() {
26
+ var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
27
+
28
+ angular.module('localytics.directives', []);
29
+
30
+ angular.module('localytics.directives').directive('chosen', [
31
+ '$timeout', function($timeout) {
32
+ var CHOSEN_OPTION_WHITELIST, NG_OPTIONS_REGEXP, isEmpty, snakeCase;
33
+ NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;
34
+ CHOSEN_OPTION_WHITELIST = ['noResultsText', 'allowSingleDeselect', 'disableSearchThreshold', 'disableSearch', 'enableSplitWordSearch', 'inheritSelectClasses', 'maxSelectedOptions', 'placeholderTextMultiple', 'placeholderTextSingle', 'searchContains', 'singleBackstrokeDelete', 'displayDisabledOptions', 'displaySelectedOptions', 'width'];
35
+ snakeCase = function(input) {
36
+ return input.replace(/[A-Z]/g, function($1) {
37
+ return "_" + ($1.toLowerCase());
38
+ });
39
+ };
40
+ isEmpty = function(value) {
41
+ var key;
42
+ if (angular.isArray(value)) {
43
+ return value.length === 0;
44
+ } else if (angular.isObject(value)) {
45
+ for (key in value) {
46
+ if (value.hasOwnProperty(key)) {
47
+ return false;
48
+ }
49
+ }
50
+ }
51
+ return true;
52
+ };
53
+ return {
54
+ restrict: 'A',
55
+ require: '?ngModel',
56
+ terminal: true,
57
+ link: function(scope, element, attr, ngModel) {
58
+ var chosen, defaultText, disableWithMessage, empty, initOrUpdate, match, options, origRender, removeEmptyMessage, startLoading, stopLoading, valuesExpr, viewWatch;
59
+ element.addClass('localytics-chosen');
60
+ options = scope.$eval(attr.chosen) || {};
61
+ angular.forEach(attr, function(value, key) {
62
+ if (__indexOf.call(CHOSEN_OPTION_WHITELIST, key) >= 0) {
63
+ return options[snakeCase(key)] = scope.$eval(value);
64
+ }
65
+ });
66
+ startLoading = function() {
67
+ return element.addClass('loading').attr('disabled', true).trigger('chosen:updated');
68
+ };
69
+ stopLoading = function() {
70
+ return element.removeClass('loading').attr('disabled', false).trigger('chosen:updated');
71
+ };
72
+ chosen = null;
73
+ defaultText = null;
74
+ empty = false;
75
+ initOrUpdate = function() {
76
+ if (chosen) {
77
+ return element.trigger('chosen:updated');
78
+ } else {
79
+ chosen = element.chosen(options).data('chosen');
80
+ return defaultText = chosen.default_text;
81
+ }
82
+ };
83
+ removeEmptyMessage = function() {
84
+ empty = false;
85
+ return element.attr('data-placeholder', defaultText);
86
+ };
87
+ disableWithMessage = function() {
88
+ empty = true;
89
+ return element.attr('data-placeholder', chosen.results_none_found).attr('disabled', true).trigger('chosen:updated');
90
+ };
91
+ if (ngModel) {
92
+ origRender = ngModel.$render;
93
+ ngModel.$render = function() {
94
+ origRender();
95
+ return initOrUpdate();
96
+ };
97
+ if (attr.multiple) {
98
+ viewWatch = function() {
99
+ return ngModel.$viewValue;
100
+ };
101
+ scope.$watch(viewWatch, ngModel.$render, true);
102
+ }
103
+ } else {
104
+ initOrUpdate();
105
+ }
106
+ attr.$observe('disabled', function() {
107
+ return element.trigger('chosen:updated');
108
+ });
109
+ if (attr.ngOptions && ngModel) {
110
+ match = attr.ngOptions.match(NG_OPTIONS_REGEXP);
111
+ valuesExpr = match[7];
112
+ scope.$watchCollection(valuesExpr, function(newVal, oldVal) {
113
+ var timer;
114
+ return timer = $timeout(function() {
115
+ if (angular.isUndefined(newVal)) {
116
+ return startLoading();
117
+ } else {
118
+ if (empty) {
119
+ removeEmptyMessage();
120
+ }
121
+ stopLoading();
122
+ if (isEmpty(newVal)) {
123
+ return disableWithMessage();
124
+ }
125
+ }
126
+ });
127
+ });
128
+ return scope.$on('$destroy', function(event) {
129
+ if (typeof timer !== "undefined" && timer !== null) {
130
+ return $timeout.cancel(timer);
131
+ }
132
+ });
133
+ }
134
+ }
135
+ };
136
+ }
137
+ ]);
138
+
139
+ }).call(this);
@@ -0,0 +1,229 @@
1
+ /**
2
+ The MIT License
3
+
4
+ Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+ */
24
+ /**
25
+ * @license AngularJS v1.3.8
26
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
27
+ * License: MIT
28
+ */
29
+ (function(window, angular, undefined) {'use strict';
30
+
31
+ /**
32
+ * @ngdoc module
33
+ * @name ngCookies
34
+ * @description
35
+ *
36
+ * # ngCookies
37
+ *
38
+ * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.
39
+ *
40
+ *
41
+ * <div doc-module-components="ngCookies"></div>
42
+ *
43
+ * See {@link ngCookies.$cookies `$cookies`} and
44
+ * {@link ngCookies.$cookieStore `$cookieStore`} for usage.
45
+ */
46
+
47
+
48
+ angular.module('ngCookies', ['ng']).
49
+ /**
50
+ * @ngdoc service
51
+ * @name $cookies
52
+ *
53
+ * @description
54
+ * Provides read/write access to browser's cookies.
55
+ *
56
+ * Only a simple Object is exposed and by adding or removing properties to/from this object, new
57
+ * cookies are created/deleted at the end of current $eval.
58
+ * The object's properties can only be strings.
59
+ *
60
+ * Requires the {@link ngCookies `ngCookies`} module to be installed.
61
+ *
62
+ * @example
63
+ *
64
+ * ```js
65
+ * angular.module('cookiesExample', ['ngCookies'])
66
+ * .controller('ExampleController', ['$cookies', function($cookies) {
67
+ * // Retrieving a cookie
68
+ * var favoriteCookie = $cookies.myFavorite;
69
+ * // Setting a cookie
70
+ * $cookies.myFavorite = 'oatmeal';
71
+ * }]);
72
+ * ```
73
+ */
74
+ factory('$cookies', ['$rootScope', '$browser', function($rootScope, $browser) {
75
+ var cookies = {},
76
+ lastCookies = {},
77
+ lastBrowserCookies,
78
+ runEval = false,
79
+ copy = angular.copy,
80
+ isUndefined = angular.isUndefined;
81
+
82
+ //creates a poller fn that copies all cookies from the $browser to service & inits the service
83
+ $browser.addPollFn(function() {
84
+ var currentCookies = $browser.cookies();
85
+ if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
86
+ lastBrowserCookies = currentCookies;
87
+ copy(currentCookies, lastCookies);
88
+ copy(currentCookies, cookies);
89
+ if (runEval) $rootScope.$apply();
90
+ }
91
+ })();
92
+
93
+ runEval = true;
94
+
95
+ //at the end of each eval, push cookies
96
+ //TODO: this should happen before the "delayed" watches fire, because if some cookies are not
97
+ // strings or browser refuses to store some cookies, we update the model in the push fn.
98
+ $rootScope.$watch(push);
99
+
100
+ return cookies;
101
+
102
+
103
+ /**
104
+ * Pushes all the cookies from the service to the browser and verifies if all cookies were
105
+ * stored.
106
+ */
107
+ function push() {
108
+ var name,
109
+ value,
110
+ browserCookies,
111
+ updated;
112
+
113
+ //delete any cookies deleted in $cookies
114
+ for (name in lastCookies) {
115
+ if (isUndefined(cookies[name])) {
116
+ $browser.cookies(name, undefined);
117
+ }
118
+ }
119
+
120
+ //update all cookies updated in $cookies
121
+ for (name in cookies) {
122
+ value = cookies[name];
123
+ if (!angular.isString(value)) {
124
+ value = '' + value;
125
+ cookies[name] = value;
126
+ }
127
+ if (value !== lastCookies[name]) {
128
+ $browser.cookies(name, value);
129
+ updated = true;
130
+ }
131
+ }
132
+
133
+ //verify what was actually stored
134
+ if (updated) {
135
+ updated = false;
136
+ browserCookies = $browser.cookies();
137
+
138
+ for (name in cookies) {
139
+ if (cookies[name] !== browserCookies[name]) {
140
+ //delete or reset all cookies that the browser dropped from $cookies
141
+ if (isUndefined(browserCookies[name])) {
142
+ delete cookies[name];
143
+ } else {
144
+ cookies[name] = browserCookies[name];
145
+ }
146
+ updated = true;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }]).
152
+
153
+
154
+ /**
155
+ * @ngdoc service
156
+ * @name $cookieStore
157
+ * @requires $cookies
158
+ *
159
+ * @description
160
+ * Provides a key-value (string-object) storage, that is backed by session cookies.
161
+ * Objects put or retrieved from this storage are automatically serialized or
162
+ * deserialized by angular's toJson/fromJson.
163
+ *
164
+ * Requires the {@link ngCookies `ngCookies`} module to be installed.
165
+ *
166
+ * @example
167
+ *
168
+ * ```js
169
+ * angular.module('cookieStoreExample', ['ngCookies'])
170
+ * .controller('ExampleController', ['$cookieStore', function($cookieStore) {
171
+ * // Put cookie
172
+ * $cookieStore.put('myFavorite','oatmeal');
173
+ * // Get cookie
174
+ * var favoriteCookie = $cookieStore.get('myFavorite');
175
+ * // Removing a cookie
176
+ * $cookieStore.remove('myFavorite');
177
+ * }]);
178
+ * ```
179
+ */
180
+ factory('$cookieStore', ['$cookies', function($cookies) {
181
+
182
+ return {
183
+ /**
184
+ * @ngdoc method
185
+ * @name $cookieStore#get
186
+ *
187
+ * @description
188
+ * Returns the value of given cookie key
189
+ *
190
+ * @param {string} key Id to use for lookup.
191
+ * @returns {Object} Deserialized cookie value.
192
+ */
193
+ get: function(key) {
194
+ var value = $cookies[key];
195
+ return value ? angular.fromJson(value) : value;
196
+ },
197
+
198
+ /**
199
+ * @ngdoc method
200
+ * @name $cookieStore#put
201
+ *
202
+ * @description
203
+ * Sets a value for given cookie key
204
+ *
205
+ * @param {string} key Id for the `value`.
206
+ * @param {Object} value Value to be stored.
207
+ */
208
+ put: function(key, value) {
209
+ $cookies[key] = angular.toJson(value);
210
+ },
211
+
212
+ /**
213
+ * @ngdoc method
214
+ * @name $cookieStore#remove
215
+ *
216
+ * @description
217
+ * Remove given cookie
218
+ *
219
+ * @param {string} key Id of the key-value pair to delete.
220
+ */
221
+ remove: function(key) {
222
+ delete $cookies[key];
223
+ }
224
+ };
225
+
226
+ }]);
227
+
228
+
229
+ })(window, window.angular);
@@ -0,0 +1,31 @@
1
+ /**
2
+ The MIT License
3
+
4
+ Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+ */
24
+ /*
25
+ AngularJS v1.3.8
26
+ (c) 2010-2014 Google, Inc. http://angularjs.org
27
+ License: MIT
28
+ */
29
+ (function(p,f,n){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(e,b){var c={},g={},h,k=!1,l=f.copy,m=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,l(a,g),l(a,c),k&&e.$apply())})();k=!0;e.$watch(function(){var a,d,e;for(a in g)m(c[a])&&b.cookies(a,n);for(a in c)d=c[a],f.isString(d)||(d=""+d,c[a]=d),d!==g[a]&&(b.cookies(a,d),e=!0);if(e)for(a in d=b.cookies(),c)c[a]!==d[a]&&(m(d[a])?delete c[a]:c[a]=d[a])});return c}]).factory("$cookieStore",
30
+ ["$cookies",function(e){return{get:function(b){return(b=e[b])?f.fromJson(b):b},put:function(b,c){e[b]=f.toJson(c)},remove:function(b){delete e[b]}}}])})(window,window.angular);
31
+ //# sourceMappingURL=angular-cookies.min.js.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ The MIT License
3
+
4
+ Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+ */
24
+ /*
25
+ AngularJS v1.3.8
26
+ (c) 2010-2014 Google, Inc. http://angularjs.org
27
+ License: MIT
28
+ */
29
+ (function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var w=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}};
30
+ this.$get=["$http","$q",function(q,h){function t(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function v(x,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){u(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw w("badmember",e);for(var e=e.split("."),n=0,g=e.length;n<g&&d!==B;n++){var h=e[n];d=null!==d?d[h]:B}}else d=a;c[k]=d});return c}function F(b){return b.resource}function e(b){D(b||
31
+ {},this)}var G=new t(x,m);l=s({},f.defaults.actions,l);e.prototype.toJSON=function(){var b=s({},this);delete b.$promise;delete b.$resolved;return b};r(l,function(b,k){var g=/^(POST|PUT|PATCH)$/i.test(b.method);e[k]=function(a,y,m,x){var n={},f,l,z;switch(arguments.length){case 4:z=x,l=m;case 3:case 2:if(u(y)){if(u(a)){l=a;z=y;break}l=y;z=m}else{n=a;f=y;l=m;break}case 1:u(a)?l=a:g?f=a:n=a;break;case 0:break;default:throw w("badargs",arguments.length);}var t=this instanceof e,p=t?f:b.isArray?[]:new e(f),
32
+ A={},v=b.interceptor&&b.interceptor.response||F,C=b.interceptor&&b.interceptor.responseError||B;r(b,function(b,a){"params"!=a&&"isArray"!=a&&"interceptor"!=a&&(A[a]=H(b))});g&&(A.data=f);G.setUrlParams(A,s({},c(f,b.params||{}),n),b.url);n=q(A).then(function(a){var c=a.data,g=p.$promise;if(c){if(d.isArray(c)!==!!b.isArray)throw w("badcfg",k,b.isArray?"array":"object",d.isArray(c)?"array":"object");b.isArray?(p.length=0,r(c,function(a){"object"===typeof a?p.push(new e(a)):p.push(a)})):(D(c,p),p.$promise=
33
+ g)}p.$resolved=!0;a.resource=p;return a},function(a){p.$resolved=!0;(z||E)(a);return h.reject(a)});n=n.then(function(a){var b=v(a);(l||E)(b,a.headers);return b},C);return t?n:(p.$promise=n,p.$resolved=!1,p)};e.prototype["$"+k]=function(a,b,c){u(a)&&(c=b,b=a,a={});a=e[k].call(this,a,this,b,c);return a.$promise||a}});e.bind=function(b){return v(x,s({},g,b),l)};return e}var E=d.noop,r=d.forEach,s=d.extend,H=d.copy,u=d.isFunction;t.prototype={setUrlParams:function(f,g,l){var m=this,c=l||m.template,h,
34
+ e,q=m.urlParams={};r(c.split(/\W/),function(b){if("hasOwnProperty"===b)throw w("badname");!/^\d+$/.test(b)&&b&&(new RegExp("(^|[^\\\\]):"+b+"(\\W|$)")).test(c)&&(q[b]=!0)});c=c.replace(/\\:/g,":");g=g||{};r(m.urlParams,function(b,k){h=g.hasOwnProperty(k)?g[k]:m.defaults[k];d.isDefined(h)&&null!==h?(e=encodeURIComponent(h).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(new RegExp(":"+
35
+ k+"(\\W|$)","g"),function(b,a){return e+a})):c=c.replace(new RegExp("(/?):"+k+"(\\W|$)","g"),function(b,a,c){return"/"==c.charAt(0)?c:a+c})});m.defaults.stripTrailingSlashes&&(c=c.replace(/\/+$/,"")||"/");c=c.replace(/\/\.(?=\w+($|\?))/,".");f.url=c.replace(/\/\\\./,"/.");r(g,function(b,c){m.urlParams[c]||(f.params=f.params||{},f.params[c]=b)})}};return v}]})})(window,window.angular);
36
+ //# sourceMappingURL=angular-resource.min.js.map
@@ -0,0 +1,1018 @@
1
+ /**
2
+ The MIT License
3
+
4
+ Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+ */
24
+ /**
25
+ * @license AngularJS v1.3.8
26
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
27
+ * License: MIT
28
+ */
29
+ (function(window, angular, undefined) {'use strict';
30
+
31
+ /**
32
+ * @ngdoc module
33
+ * @name ngRoute
34
+ * @description
35
+ *
36
+ * # ngRoute
37
+ *
38
+ * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
39
+ *
40
+ * ## Example
41
+ * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
42
+ *
43
+ *
44
+ * <div doc-module-components="ngRoute"></div>
45
+ */
46
+ /* global -ngRouteModule */
47
+ var ngRouteModule = angular.module('ngRoute', ['ng']).
48
+ provider('$route', $RouteProvider),
49
+ $routeMinErr = angular.$$minErr('ngRoute');
50
+
51
+ /**
52
+ * @ngdoc provider
53
+ * @name $routeProvider
54
+ *
55
+ * @description
56
+ *
57
+ * Used for configuring routes.
58
+ *
59
+ * ## Example
60
+ * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
61
+ *
62
+ * ## Dependencies
63
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
64
+ */
65
+ function $RouteProvider() {
66
+ function inherit(parent, extra) {
67
+ return angular.extend(Object.create(parent), extra);
68
+ }
69
+
70
+ var routes = {};
71
+
72
+ /**
73
+ * @ngdoc method
74
+ * @name $routeProvider#when
75
+ *
76
+ * @param {string} path Route path (matched against `$location.path`). If `$location.path`
77
+ * contains redundant trailing slash or is missing one, the route will still match and the
78
+ * `$location.path` will be updated to add or drop the trailing slash to exactly match the
79
+ * route definition.
80
+ *
81
+ * * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up
82
+ * to the next slash are matched and stored in `$routeParams` under the given `name`
83
+ * when the route matches.
84
+ * * `path` can contain named groups starting with a colon and ending with a star:
85
+ * e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`
86
+ * when the route matches.
87
+ * * `path` can contain optional named groups with a question mark: e.g.`:name?`.
88
+ *
89
+ * For example, routes like `/color/:color/largecode/:largecode*\/edit` will match
90
+ * `/color/brown/largecode/code/with/slashes/edit` and extract:
91
+ *
92
+ * * `color: brown`
93
+ * * `largecode: code/with/slashes`.
94
+ *
95
+ *
96
+ * @param {Object} route Mapping information to be assigned to `$route.current` on route
97
+ * match.
98
+ *
99
+ * Object properties:
100
+ *
101
+ * - `controller` – `{(string|function()=}` – Controller fn that should be associated with
102
+ * newly created scope or the name of a {@link angular.Module#controller registered
103
+ * controller} if passed as a string.
104
+ * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be
105
+ * published to scope under the `controllerAs` name.
106
+ * - `template` – `{string=|function()=}` – html template as a string or a function that
107
+ * returns an html template as a string which should be used by {@link
108
+ * ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.
109
+ * This property takes precedence over `templateUrl`.
110
+ *
111
+ * If `template` is a function, it will be called with the following parameters:
112
+ *
113
+ * - `{Array.<Object>}` - route parameters extracted from the current
114
+ * `$location.path()` by applying the current route
115
+ *
116
+ * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
117
+ * template that should be used by {@link ngRoute.directive:ngView ngView}.
118
+ *
119
+ * If `templateUrl` is a function, it will be called with the following parameters:
120
+ *
121
+ * - `{Array.<Object>}` - route parameters extracted from the current
122
+ * `$location.path()` by applying the current route
123
+ *
124
+ * - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
125
+ * be injected into the controller. If any of these dependencies are promises, the router
126
+ * will wait for them all to be resolved or one to be rejected before the controller is
127
+ * instantiated.
128
+ * If all the promises are resolved successfully, the values of the resolved promises are
129
+ * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is
130
+ * fired. If any of the promises are rejected the
131
+ * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object
132
+ * is:
133
+ *
134
+ * - `key` – `{string}`: a name of a dependency to be injected into the controller.
135
+ * - `factory` - `{string|function}`: If `string` then it is an alias for a service.
136
+ * Otherwise if function, then it is {@link auto.$injector#invoke injected}
137
+ * and the return value is treated as the dependency. If the result is a promise, it is
138
+ * resolved before its value is injected into the controller. Be aware that
139
+ * `ngRoute.$routeParams` will still refer to the previous route within these resolve
140
+ * functions. Use `$route.current.params` to access the new route parameters, instead.
141
+ *
142
+ * - `redirectTo` – {(string|function())=} – value to update
143
+ * {@link ng.$location $location} path with and trigger route redirection.
144
+ *
145
+ * If `redirectTo` is a function, it will be called with the following parameters:
146
+ *
147
+ * - `{Object.<string>}` - route parameters extracted from the current
148
+ * `$location.path()` by applying the current route templateUrl.
149
+ * - `{string}` - current `$location.path()`
150
+ * - `{Object}` - current `$location.search()`
151
+ *
152
+ * The custom `redirectTo` function is expected to return a string which will be used
153
+ * to update `$location.path()` and `$location.search()`.
154
+ *
155
+ * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`
156
+ * or `$location.hash()` changes.
157
+ *
158
+ * If the option is set to `false` and url in the browser changes, then
159
+ * `$routeUpdate` event is broadcasted on the root scope.
160
+ *
161
+ * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive
162
+ *
163
+ * If the option is set to `true`, then the particular route can be matched without being
164
+ * case sensitive
165
+ *
166
+ * @returns {Object} self
167
+ *
168
+ * @description
169
+ * Adds a new route definition to the `$route` service.
170
+ */
171
+ this.when = function(path, route) {
172
+ //copy original route object to preserve params inherited from proto chain
173
+ var routeCopy = angular.copy(route);
174
+ if (angular.isUndefined(routeCopy.reloadOnSearch)) {
175
+ routeCopy.reloadOnSearch = true;
176
+ }
177
+ if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {
178
+ routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;
179
+ }
180
+ routes[path] = angular.extend(
181
+ routeCopy,
182
+ path && pathRegExp(path, routeCopy)
183
+ );
184
+
185
+ // create redirection for trailing slashes
186
+ if (path) {
187
+ var redirectPath = (path[path.length - 1] == '/')
188
+ ? path.substr(0, path.length - 1)
189
+ : path + '/';
190
+
191
+ routes[redirectPath] = angular.extend(
192
+ {redirectTo: path},
193
+ pathRegExp(redirectPath, routeCopy)
194
+ );
195
+ }
196
+
197
+ return this;
198
+ };
199
+
200
+ /**
201
+ * @ngdoc property
202
+ * @name $routeProvider#caseInsensitiveMatch
203
+ * @description
204
+ *
205
+ * A boolean property indicating if routes defined
206
+ * using this provider should be matched using a case insensitive
207
+ * algorithm. Defaults to `false`.
208
+ */
209
+ this.caseInsensitiveMatch = false;
210
+
211
+ /**
212
+ * @param path {string} path
213
+ * @param opts {Object} options
214
+ * @return {?Object}
215
+ *
216
+ * @description
217
+ * Normalizes the given path, returning a regular expression
218
+ * and the original path.
219
+ *
220
+ * Inspired by pathRexp in visionmedia/express/lib/utils.js.
221
+ */
222
+ function pathRegExp(path, opts) {
223
+ var insensitive = opts.caseInsensitiveMatch,
224
+ ret = {
225
+ originalPath: path,
226
+ regexp: path
227
+ },
228
+ keys = ret.keys = [];
229
+
230
+ path = path
231
+ .replace(/([().])/g, '\\$1')
232
+ .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option) {
233
+ var optional = option === '?' ? option : null;
234
+ var star = option === '*' ? option : null;
235
+ keys.push({ name: key, optional: !!optional });
236
+ slash = slash || '';
237
+ return ''
238
+ + (optional ? '' : slash)
239
+ + '(?:'
240
+ + (optional ? slash : '')
241
+ + (star && '(.+?)' || '([^/]+)')
242
+ + (optional || '')
243
+ + ')'
244
+ + (optional || '');
245
+ })
246
+ .replace(/([\/$\*])/g, '\\$1');
247
+
248
+ ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');
249
+ return ret;
250
+ }
251
+
252
+ /**
253
+ * @ngdoc method
254
+ * @name $routeProvider#otherwise
255
+ *
256
+ * @description
257
+ * Sets route definition that will be used on route change when no other route definition
258
+ * is matched.
259
+ *
260
+ * @param {Object|string} params Mapping information to be assigned to `$route.current`.
261
+ * If called with a string, the value maps to `redirectTo`.
262
+ * @returns {Object} self
263
+ */
264
+ this.otherwise = function(params) {
265
+ if (typeof params === 'string') {
266
+ params = {redirectTo: params};
267
+ }
268
+ this.when(null, params);
269
+ return this;
270
+ };
271
+
272
+
273
+ this.$get = ['$rootScope',
274
+ '$location',
275
+ '$routeParams',
276
+ '$q',
277
+ '$injector',
278
+ '$templateRequest',
279
+ '$sce',
280
+ function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce) {
281
+
282
+ /**
283
+ * @ngdoc service
284
+ * @name $route
285
+ * @requires $location
286
+ * @requires $routeParams
287
+ *
288
+ * @property {Object} current Reference to the current route definition.
289
+ * The route definition contains:
290
+ *
291
+ * - `controller`: The controller constructor as define in route definition.
292
+ * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for
293
+ * controller instantiation. The `locals` contain
294
+ * the resolved values of the `resolve` map. Additionally the `locals` also contain:
295
+ *
296
+ * - `$scope` - The current route scope.
297
+ * - `$template` - The current route template HTML.
298
+ *
299
+ * @property {Object} routes Object with all route configuration Objects as its properties.
300
+ *
301
+ * @description
302
+ * `$route` is used for deep-linking URLs to controllers and views (HTML partials).
303
+ * It watches `$location.url()` and tries to map the path to an existing route definition.
304
+ *
305
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
306
+ *
307
+ * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.
308
+ *
309
+ * The `$route` service is typically used in conjunction with the
310
+ * {@link ngRoute.directive:ngView `ngView`} directive and the
311
+ * {@link ngRoute.$routeParams `$routeParams`} service.
312
+ *
313
+ * @example
314
+ * This example shows how changing the URL hash causes the `$route` to match a route against the
315
+ * URL, and the `ngView` pulls in the partial.
316
+ *
317
+ * <example name="$route-service" module="ngRouteExample"
318
+ * deps="angular-route.js" fixBase="true">
319
+ * <file name="index.html">
320
+ * <div ng-controller="MainController">
321
+ * Choose:
322
+ * <a href="Book/Moby">Moby</a> |
323
+ * <a href="Book/Moby/ch/1">Moby: Ch1</a> |
324
+ * <a href="Book/Gatsby">Gatsby</a> |
325
+ * <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
326
+ * <a href="Book/Scarlet">Scarlet Letter</a><br/>
327
+ *
328
+ * <div ng-view></div>
329
+ *
330
+ * <hr />
331
+ *
332
+ * <pre>$location.path() = {{$location.path()}}</pre>
333
+ * <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
334
+ * <pre>$route.current.params = {{$route.current.params}}</pre>
335
+ * <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
336
+ * <pre>$routeParams = {{$routeParams}}</pre>
337
+ * </div>
338
+ * </file>
339
+ *
340
+ * <file name="book.html">
341
+ * controller: {{name}}<br />
342
+ * Book Id: {{params.bookId}}<br />
343
+ * </file>
344
+ *
345
+ * <file name="chapter.html">
346
+ * controller: {{name}}<br />
347
+ * Book Id: {{params.bookId}}<br />
348
+ * Chapter Id: {{params.chapterId}}
349
+ * </file>
350
+ *
351
+ * <file name="script.js">
352
+ * angular.module('ngRouteExample', ['ngRoute'])
353
+ *
354
+ * .controller('MainController', function($scope, $route, $routeParams, $location) {
355
+ * $scope.$route = $route;
356
+ * $scope.$location = $location;
357
+ * $scope.$routeParams = $routeParams;
358
+ * })
359
+ *
360
+ * .controller('BookController', function($scope, $routeParams) {
361
+ * $scope.name = "BookController";
362
+ * $scope.params = $routeParams;
363
+ * })
364
+ *
365
+ * .controller('ChapterController', function($scope, $routeParams) {
366
+ * $scope.name = "ChapterController";
367
+ * $scope.params = $routeParams;
368
+ * })
369
+ *
370
+ * .config(function($routeProvider, $locationProvider) {
371
+ * $routeProvider
372
+ * .when('/Book/:bookId', {
373
+ * templateUrl: 'book.html',
374
+ * controller: 'BookController',
375
+ * resolve: {
376
+ * // I will cause a 1 second delay
377
+ * delay: function($q, $timeout) {
378
+ * var delay = $q.defer();
379
+ * $timeout(delay.resolve, 1000);
380
+ * return delay.promise;
381
+ * }
382
+ * }
383
+ * })
384
+ * .when('/Book/:bookId/ch/:chapterId', {
385
+ * templateUrl: 'chapter.html',
386
+ * controller: 'ChapterController'
387
+ * });
388
+ *
389
+ * // configure html5 to get links working on jsfiddle
390
+ * $locationProvider.html5Mode(true);
391
+ * });
392
+ *
393
+ * </file>
394
+ *
395
+ * <file name="protractor.js" type="protractor">
396
+ * it('should load and compile correct template', function() {
397
+ * element(by.linkText('Moby: Ch1')).click();
398
+ * var content = element(by.css('[ng-view]')).getText();
399
+ * expect(content).toMatch(/controller\: ChapterController/);
400
+ * expect(content).toMatch(/Book Id\: Moby/);
401
+ * expect(content).toMatch(/Chapter Id\: 1/);
402
+ *
403
+ * element(by.partialLinkText('Scarlet')).click();
404
+ *
405
+ * content = element(by.css('[ng-view]')).getText();
406
+ * expect(content).toMatch(/controller\: BookController/);
407
+ * expect(content).toMatch(/Book Id\: Scarlet/);
408
+ * });
409
+ * </file>
410
+ * </example>
411
+ */
412
+
413
+ /**
414
+ * @ngdoc event
415
+ * @name $route#$routeChangeStart
416
+ * @eventType broadcast on root scope
417
+ * @description
418
+ * Broadcasted before a route change. At this point the route services starts
419
+ * resolving all of the dependencies needed for the route change to occur.
420
+ * Typically this involves fetching the view template as well as any dependencies
421
+ * defined in `resolve` route property. Once all of the dependencies are resolved
422
+ * `$routeChangeSuccess` is fired.
423
+ *
424
+ * The route change (and the `$location` change that triggered it) can be prevented
425
+ * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on}
426
+ * for more details about event object.
427
+ *
428
+ * @param {Object} angularEvent Synthetic event object.
429
+ * @param {Route} next Future route information.
430
+ * @param {Route} current Current route information.
431
+ */
432
+
433
+ /**
434
+ * @ngdoc event
435
+ * @name $route#$routeChangeSuccess
436
+ * @eventType broadcast on root scope
437
+ * @description
438
+ * Broadcasted after a route dependencies are resolved.
439
+ * {@link ngRoute.directive:ngView ngView} listens for the directive
440
+ * to instantiate the controller and render the view.
441
+ *
442
+ * @param {Object} angularEvent Synthetic event object.
443
+ * @param {Route} current Current route information.
444
+ * @param {Route|Undefined} previous Previous route information, or undefined if current is
445
+ * first route entered.
446
+ */
447
+
448
+ /**
449
+ * @ngdoc event
450
+ * @name $route#$routeChangeError
451
+ * @eventType broadcast on root scope
452
+ * @description
453
+ * Broadcasted if any of the resolve promises are rejected.
454
+ *
455
+ * @param {Object} angularEvent Synthetic event object
456
+ * @param {Route} current Current route information.
457
+ * @param {Route} previous Previous route information.
458
+ * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
459
+ */
460
+
461
+ /**
462
+ * @ngdoc event
463
+ * @name $route#$routeUpdate
464
+ * @eventType broadcast on root scope
465
+ * @description
466
+ *
467
+ * The `reloadOnSearch` property has been set to false, and we are reusing the same
468
+ * instance of the Controller.
469
+ */
470
+
471
+ var forceReload = false,
472
+ preparedRoute,
473
+ preparedRouteIsUpdateOnly,
474
+ $route = {
475
+ routes: routes,
476
+
477
+ /**
478
+ * @ngdoc method
479
+ * @name $route#reload
480
+ *
481
+ * @description
482
+ * Causes `$route` service to reload the current route even if
483
+ * {@link ng.$location $location} hasn't changed.
484
+ *
485
+ * As a result of that, {@link ngRoute.directive:ngView ngView}
486
+ * creates new scope and reinstantiates the controller.
487
+ */
488
+ reload: function() {
489
+ forceReload = true;
490
+ $rootScope.$evalAsync(function() {
491
+ // Don't support cancellation of a reload for now...
492
+ prepareRoute();
493
+ commitRoute();
494
+ });
495
+ },
496
+
497
+ /**
498
+ * @ngdoc method
499
+ * @name $route#updateParams
500
+ *
501
+ * @description
502
+ * Causes `$route` service to update the current URL, replacing
503
+ * current route parameters with those specified in `newParams`.
504
+ * Provided property names that match the route's path segment
505
+ * definitions will be interpolated into the location's path, while
506
+ * remaining properties will be treated as query params.
507
+ *
508
+ * @param {Object} newParams mapping of URL parameter names to values
509
+ */
510
+ updateParams: function(newParams) {
511
+ if (this.current && this.current.$$route) {
512
+ var searchParams = {}, self=this;
513
+
514
+ angular.forEach(Object.keys(newParams), function(key) {
515
+ if (!self.current.pathParams[key]) searchParams[key] = newParams[key];
516
+ });
517
+
518
+ newParams = angular.extend({}, this.current.params, newParams);
519
+ $location.path(interpolate(this.current.$$route.originalPath, newParams));
520
+ $location.search(angular.extend({}, $location.search(), searchParams));
521
+ }
522
+ else {
523
+ throw $routeMinErr('norout', 'Tried updating route when with no current route');
524
+ }
525
+ }
526
+ };
527
+
528
+ $rootScope.$on('$locationChangeStart', prepareRoute);
529
+ $rootScope.$on('$locationChangeSuccess', commitRoute);
530
+
531
+ return $route;
532
+
533
+ /////////////////////////////////////////////////////
534
+
535
+ /**
536
+ * @param on {string} current url
537
+ * @param route {Object} route regexp to match the url against
538
+ * @return {?Object}
539
+ *
540
+ * @description
541
+ * Check if the route matches the current url.
542
+ *
543
+ * Inspired by match in
544
+ * visionmedia/express/lib/router/router.js.
545
+ */
546
+ function switchRouteMatcher(on, route) {
547
+ var keys = route.keys,
548
+ params = {};
549
+
550
+ if (!route.regexp) return null;
551
+
552
+ var m = route.regexp.exec(on);
553
+ if (!m) return null;
554
+
555
+ for (var i = 1, len = m.length; i < len; ++i) {
556
+ var key = keys[i - 1];
557
+
558
+ var val = m[i];
559
+
560
+ if (key && val) {
561
+ params[key.name] = val;
562
+ }
563
+ }
564
+ return params;
565
+ }
566
+
567
+ function prepareRoute($locationEvent) {
568
+ var lastRoute = $route.current;
569
+
570
+ preparedRoute = parseRoute();
571
+ preparedRouteIsUpdateOnly = preparedRoute && lastRoute && preparedRoute.$$route === lastRoute.$$route
572
+ && angular.equals(preparedRoute.pathParams, lastRoute.pathParams)
573
+ && !preparedRoute.reloadOnSearch && !forceReload;
574
+
575
+ if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {
576
+ if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {
577
+ if ($locationEvent) {
578
+ $locationEvent.preventDefault();
579
+ }
580
+ }
581
+ }
582
+ }
583
+
584
+ function commitRoute() {
585
+ var lastRoute = $route.current;
586
+ var nextRoute = preparedRoute;
587
+
588
+ if (preparedRouteIsUpdateOnly) {
589
+ lastRoute.params = nextRoute.params;
590
+ angular.copy(lastRoute.params, $routeParams);
591
+ $rootScope.$broadcast('$routeUpdate', lastRoute);
592
+ } else if (nextRoute || lastRoute) {
593
+ forceReload = false;
594
+ $route.current = nextRoute;
595
+ if (nextRoute) {
596
+ if (nextRoute.redirectTo) {
597
+ if (angular.isString(nextRoute.redirectTo)) {
598
+ $location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search(nextRoute.params)
599
+ .replace();
600
+ } else {
601
+ $location.url(nextRoute.redirectTo(nextRoute.pathParams, $location.path(), $location.search()))
602
+ .replace();
603
+ }
604
+ }
605
+ }
606
+
607
+ $q.when(nextRoute).
608
+ then(function() {
609
+ if (nextRoute) {
610
+ var locals = angular.extend({}, nextRoute.resolve),
611
+ template, templateUrl;
612
+
613
+ angular.forEach(locals, function(value, key) {
614
+ locals[key] = angular.isString(value) ?
615
+ $injector.get(value) : $injector.invoke(value, null, null, key);
616
+ });
617
+
618
+ if (angular.isDefined(template = nextRoute.template)) {
619
+ if (angular.isFunction(template)) {
620
+ template = template(nextRoute.params);
621
+ }
622
+ } else if (angular.isDefined(templateUrl = nextRoute.templateUrl)) {
623
+ if (angular.isFunction(templateUrl)) {
624
+ templateUrl = templateUrl(nextRoute.params);
625
+ }
626
+ templateUrl = $sce.getTrustedResourceUrl(templateUrl);
627
+ if (angular.isDefined(templateUrl)) {
628
+ nextRoute.loadedTemplateUrl = templateUrl;
629
+ template = $templateRequest(templateUrl);
630
+ }
631
+ }
632
+ if (angular.isDefined(template)) {
633
+ locals['$template'] = template;
634
+ }
635
+ return $q.all(locals);
636
+ }
637
+ }).
638
+ // after route change
639
+ then(function(locals) {
640
+ if (nextRoute == $route.current) {
641
+ if (nextRoute) {
642
+ nextRoute.locals = locals;
643
+ angular.copy(nextRoute.params, $routeParams);
644
+ }
645
+ $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);
646
+ }
647
+ }, function(error) {
648
+ if (nextRoute == $route.current) {
649
+ $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);
650
+ }
651
+ });
652
+ }
653
+ }
654
+
655
+
656
+ /**
657
+ * @returns {Object} the current active route, by matching it against the URL
658
+ */
659
+ function parseRoute() {
660
+ // Match a route
661
+ var params, match;
662
+ angular.forEach(routes, function(route, path) {
663
+ if (!match && (params = switchRouteMatcher($location.path(), route))) {
664
+ match = inherit(route, {
665
+ params: angular.extend({}, $location.search(), params),
666
+ pathParams: params});
667
+ match.$$route = route;
668
+ }
669
+ });
670
+ // No route matched; fallback to "otherwise" route
671
+ return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
672
+ }
673
+
674
+ /**
675
+ * @returns {string} interpolation of the redirect path with the parameters
676
+ */
677
+ function interpolate(string, params) {
678
+ var result = [];
679
+ angular.forEach((string || '').split(':'), function(segment, i) {
680
+ if (i === 0) {
681
+ result.push(segment);
682
+ } else {
683
+ var segmentMatch = segment.match(/(\w+)(?:[?*])?(.*)/);
684
+ var key = segmentMatch[1];
685
+ result.push(params[key]);
686
+ result.push(segmentMatch[2] || '');
687
+ delete params[key];
688
+ }
689
+ });
690
+ return result.join('');
691
+ }
692
+ }];
693
+ }
694
+
695
+ ngRouteModule.provider('$routeParams', $RouteParamsProvider);
696
+
697
+
698
+ /**
699
+ * @ngdoc service
700
+ * @name $routeParams
701
+ * @requires $route
702
+ *
703
+ * @description
704
+ * The `$routeParams` service allows you to retrieve the current set of route parameters.
705
+ *
706
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
707
+ *
708
+ * The route parameters are a combination of {@link ng.$location `$location`}'s
709
+ * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.
710
+ * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.
711
+ *
712
+ * In case of parameter name collision, `path` params take precedence over `search` params.
713
+ *
714
+ * The service guarantees that the identity of the `$routeParams` object will remain unchanged
715
+ * (but its properties will likely change) even when a route change occurs.
716
+ *
717
+ * Note that the `$routeParams` are only updated *after* a route change completes successfully.
718
+ * This means that you cannot rely on `$routeParams` being correct in route resolve functions.
719
+ * Instead you can use `$route.current.params` to access the new route's parameters.
720
+ *
721
+ * @example
722
+ * ```js
723
+ * // Given:
724
+ * // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
725
+ * // Route: /Chapter/:chapterId/Section/:sectionId
726
+ * //
727
+ * // Then
728
+ * $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}
729
+ * ```
730
+ */
731
+ function $RouteParamsProvider() {
732
+ this.$get = function() { return {}; };
733
+ }
734
+
735
+ ngRouteModule.directive('ngView', ngViewFactory);
736
+ ngRouteModule.directive('ngView', ngViewFillContentFactory);
737
+
738
+
739
+ /**
740
+ * @ngdoc directive
741
+ * @name ngView
742
+ * @restrict ECA
743
+ *
744
+ * @description
745
+ * # Overview
746
+ * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by
747
+ * including the rendered template of the current route into the main layout (`index.html`) file.
748
+ * Every time the current route changes, the included view changes with it according to the
749
+ * configuration of the `$route` service.
750
+ *
751
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
752
+ *
753
+ * @animations
754
+ * enter - animation is used to bring new content into the browser.
755
+ * leave - animation is used to animate existing content away.
756
+ *
757
+ * The enter and leave animation occur concurrently.
758
+ *
759
+ * @scope
760
+ * @priority 400
761
+ * @param {string=} onload Expression to evaluate whenever the view updates.
762
+ *
763
+ * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll
764
+ * $anchorScroll} to scroll the viewport after the view is updated.
765
+ *
766
+ * - If the attribute is not set, disable scrolling.
767
+ * - If the attribute is set without value, enable scrolling.
768
+ * - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated
769
+ * as an expression yields a truthy value.
770
+ * @example
771
+ <example name="ngView-directive" module="ngViewExample"
772
+ deps="angular-route.js;angular-animate.js"
773
+ animations="true" fixBase="true">
774
+ <file name="index.html">
775
+ <div ng-controller="MainCtrl as main">
776
+ Choose:
777
+ <a href="Book/Moby">Moby</a> |
778
+ <a href="Book/Moby/ch/1">Moby: Ch1</a> |
779
+ <a href="Book/Gatsby">Gatsby</a> |
780
+ <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
781
+ <a href="Book/Scarlet">Scarlet Letter</a><br/>
782
+
783
+ <div class="view-animate-container">
784
+ <div ng-view class="view-animate"></div>
785
+ </div>
786
+ <hr />
787
+
788
+ <pre>$location.path() = {{main.$location.path()}}</pre>
789
+ <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>
790
+ <pre>$route.current.params = {{main.$route.current.params}}</pre>
791
+ <pre>$routeParams = {{main.$routeParams}}</pre>
792
+ </div>
793
+ </file>
794
+
795
+ <file name="book.html">
796
+ <div>
797
+ controller: {{book.name}}<br />
798
+ Book Id: {{book.params.bookId}}<br />
799
+ </div>
800
+ </file>
801
+
802
+ <file name="chapter.html">
803
+ <div>
804
+ controller: {{chapter.name}}<br />
805
+ Book Id: {{chapter.params.bookId}}<br />
806
+ Chapter Id: {{chapter.params.chapterId}}
807
+ </div>
808
+ </file>
809
+
810
+ <file name="animations.css">
811
+ .view-animate-container {
812
+ position:relative;
813
+ height:100px!important;
814
+ background:white;
815
+ border:1px solid black;
816
+ height:40px;
817
+ overflow:hidden;
818
+ }
819
+
820
+ .view-animate {
821
+ padding:10px;
822
+ }
823
+
824
+ .view-animate.ng-enter, .view-animate.ng-leave {
825
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
826
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
827
+
828
+ display:block;
829
+ width:100%;
830
+ border-left:1px solid black;
831
+
832
+ position:absolute;
833
+ top:0;
834
+ left:0;
835
+ right:0;
836
+ bottom:0;
837
+ padding:10px;
838
+ }
839
+
840
+ .view-animate.ng-enter {
841
+ left:100%;
842
+ }
843
+ .view-animate.ng-enter.ng-enter-active {
844
+ left:0;
845
+ }
846
+ .view-animate.ng-leave.ng-leave-active {
847
+ left:-100%;
848
+ }
849
+ </file>
850
+
851
+ <file name="script.js">
852
+ angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])
853
+ .config(['$routeProvider', '$locationProvider',
854
+ function($routeProvider, $locationProvider) {
855
+ $routeProvider
856
+ .when('/Book/:bookId', {
857
+ templateUrl: 'book.html',
858
+ controller: 'BookCtrl',
859
+ controllerAs: 'book'
860
+ })
861
+ .when('/Book/:bookId/ch/:chapterId', {
862
+ templateUrl: 'chapter.html',
863
+ controller: 'ChapterCtrl',
864
+ controllerAs: 'chapter'
865
+ });
866
+
867
+ $locationProvider.html5Mode(true);
868
+ }])
869
+ .controller('MainCtrl', ['$route', '$routeParams', '$location',
870
+ function($route, $routeParams, $location) {
871
+ this.$route = $route;
872
+ this.$location = $location;
873
+ this.$routeParams = $routeParams;
874
+ }])
875
+ .controller('BookCtrl', ['$routeParams', function($routeParams) {
876
+ this.name = "BookCtrl";
877
+ this.params = $routeParams;
878
+ }])
879
+ .controller('ChapterCtrl', ['$routeParams', function($routeParams) {
880
+ this.name = "ChapterCtrl";
881
+ this.params = $routeParams;
882
+ }]);
883
+
884
+ </file>
885
+
886
+ <file name="protractor.js" type="protractor">
887
+ it('should load and compile correct template', function() {
888
+ element(by.linkText('Moby: Ch1')).click();
889
+ var content = element(by.css('[ng-view]')).getText();
890
+ expect(content).toMatch(/controller\: ChapterCtrl/);
891
+ expect(content).toMatch(/Book Id\: Moby/);
892
+ expect(content).toMatch(/Chapter Id\: 1/);
893
+
894
+ element(by.partialLinkText('Scarlet')).click();
895
+
896
+ content = element(by.css('[ng-view]')).getText();
897
+ expect(content).toMatch(/controller\: BookCtrl/);
898
+ expect(content).toMatch(/Book Id\: Scarlet/);
899
+ });
900
+ </file>
901
+ </example>
902
+ */
903
+
904
+
905
+ /**
906
+ * @ngdoc event
907
+ * @name ngView#$viewContentLoaded
908
+ * @eventType emit on the current ngView scope
909
+ * @description
910
+ * Emitted every time the ngView content is reloaded.
911
+ */
912
+ ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];
913
+ function ngViewFactory($route, $anchorScroll, $animate) {
914
+ return {
915
+ restrict: 'ECA',
916
+ terminal: true,
917
+ priority: 400,
918
+ transclude: 'element',
919
+ link: function(scope, $element, attr, ctrl, $transclude) {
920
+ var currentScope,
921
+ currentElement,
922
+ previousLeaveAnimation,
923
+ autoScrollExp = attr.autoscroll,
924
+ onloadExp = attr.onload || '';
925
+
926
+ scope.$on('$routeChangeSuccess', update);
927
+ update();
928
+
929
+ function cleanupLastView() {
930
+ if (previousLeaveAnimation) {
931
+ $animate.cancel(previousLeaveAnimation);
932
+ previousLeaveAnimation = null;
933
+ }
934
+
935
+ if (currentScope) {
936
+ currentScope.$destroy();
937
+ currentScope = null;
938
+ }
939
+ if (currentElement) {
940
+ previousLeaveAnimation = $animate.leave(currentElement);
941
+ previousLeaveAnimation.then(function() {
942
+ previousLeaveAnimation = null;
943
+ });
944
+ currentElement = null;
945
+ }
946
+ }
947
+
948
+ function update() {
949
+ var locals = $route.current && $route.current.locals,
950
+ template = locals && locals.$template;
951
+
952
+ if (angular.isDefined(template)) {
953
+ var newScope = scope.$new();
954
+ var current = $route.current;
955
+
956
+ // Note: This will also link all children of ng-view that were contained in the original
957
+ // html. If that content contains controllers, ... they could pollute/change the scope.
958
+ // However, using ng-view on an element with additional content does not make sense...
959
+ // Note: We can't remove them in the cloneAttchFn of $transclude as that
960
+ // function is called before linking the content, which would apply child
961
+ // directives to non existing elements.
962
+ var clone = $transclude(newScope, function(clone) {
963
+ $animate.enter(clone, null, currentElement || $element).then(function onNgViewEnter() {
964
+ if (angular.isDefined(autoScrollExp)
965
+ && (!autoScrollExp || scope.$eval(autoScrollExp))) {
966
+ $anchorScroll();
967
+ }
968
+ });
969
+ cleanupLastView();
970
+ });
971
+
972
+ currentElement = clone;
973
+ currentScope = current.scope = newScope;
974
+ currentScope.$emit('$viewContentLoaded');
975
+ currentScope.$eval(onloadExp);
976
+ } else {
977
+ cleanupLastView();
978
+ }
979
+ }
980
+ }
981
+ };
982
+ }
983
+
984
+ // This directive is called during the $transclude call of the first `ngView` directive.
985
+ // It will replace and compile the content of the element with the loaded template.
986
+ // We need this directive so that the element content is already filled when
987
+ // the link function of another directive on the same element as ngView
988
+ // is called.
989
+ ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];
990
+ function ngViewFillContentFactory($compile, $controller, $route) {
991
+ return {
992
+ restrict: 'ECA',
993
+ priority: -400,
994
+ link: function(scope, $element) {
995
+ var current = $route.current,
996
+ locals = current.locals;
997
+
998
+ $element.html(locals.$template);
999
+
1000
+ var link = $compile($element.contents());
1001
+
1002
+ if (current.controller) {
1003
+ locals.$scope = scope;
1004
+ var controller = $controller(current.controller, locals);
1005
+ if (current.controllerAs) {
1006
+ scope[current.controllerAs] = controller;
1007
+ }
1008
+ $element.data('$ngControllerController', controller);
1009
+ $element.children().data('$ngControllerController', controller);
1010
+ }
1011
+
1012
+ link(scope);
1013
+ }
1014
+ };
1015
+ }
1016
+
1017
+
1018
+ })(window, window.angular);