omf_web 0.9.1 → 0.9.3

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 (243) hide show
  1. data/.gitignore +0 -1
  2. data/README.md +8 -2
  3. data/doc/screenshot.png +0 -0
  4. data/example/{basic → NOT_WORKING/basic}/hello-world-wired.rb +0 -0
  5. data/example/{basic → NOT_WORKING/basic}/visualisation.yml +0 -0
  6. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklynDemo.sq3 +0 -0
  7. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklyn_gps.dat +0 -0
  8. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklyn_server.rb +0 -0
  9. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklyn_wimax.dat +0 -0
  10. data/example/{brooklyn → NOT_WORKING/brooklyn}/sql_source.rb +0 -0
  11. data/example/{code → NOT_WORKING/code}/code_server.rb +0 -0
  12. data/example/{frisbee → NOT_WORKING/frisbee}/data_sources/parse_log.rb +0 -0
  13. data/example/{frisbee → NOT_WORKING/frisbee}/data_sources/pxe_slice-2012-06-02t02.25.00-04.00.log +0 -0
  14. data/example/{frisbee → NOT_WORKING/frisbee}/progress_chart.yaml +0 -0
  15. data/example/{frisbee → NOT_WORKING/frisbee}/progress_tab.yaml +0 -0
  16. data/example/{frisbee → NOT_WORKING/frisbee}/progress_table.yaml +0 -0
  17. data/example/{frisbee → NOT_WORKING/frisbee}/viz_server.rb +0 -0
  18. data/example/{gec12 → NOT_WORKING/gec12}/gec12-53.rb +0 -0
  19. data/example/{gec12 → NOT_WORKING/gec12}/gec12_demo.sq3 +0 -0
  20. data/example/{gec12 → NOT_WORKING/gec12}/gec12_demo_server.rb +0 -0
  21. data/example/{gec12 → NOT_WORKING/gec12}/visualization.rb +0 -0
  22. data/example/{incoming → NOT_WORKING/incoming}/ofpu_barchart_widget.yaml +0 -0
  23. data/example/{log → NOT_WORKING/log}/log_config.xml +0 -0
  24. data/example/{log → NOT_WORKING/log}/log_server.rb +0 -0
  25. data/example/{network → NOT_WORKING/network}/flow_tab.yaml +0 -0
  26. data/example/{network → NOT_WORKING/network}/network_server.rb +0 -0
  27. data/example/{text → NOT_WORKING/text}/test.md +0 -0
  28. data/example/{text → NOT_WORKING/text}/test.rb +0 -0
  29. data/example/{wimax → NOT_WORKING/wimax}/downlink.yaml +0 -0
  30. data/example/{wimax → NOT_WORKING/wimax}/power.yaml +0 -0
  31. data/example/{wimax → NOT_WORKING/wimax}/snapshot.db +0 -0
  32. data/example/{wimax → NOT_WORKING/wimax}/snapshot.sql +0 -0
  33. data/example/{wimax → NOT_WORKING/wimax}/test.rb +0 -0
  34. data/example/{wimax → NOT_WORKING/wimax}/uplink.yaml +0 -0
  35. data/example/{wimax → NOT_WORKING/wimax}/viz_server.rb +0 -0
  36. data/example/demo/data_sources/mobile_network.rb +3 -0
  37. data/example/demo/data_sources/static_network.rb +54 -0
  38. data/example/demo/widgets/charts_tab.yaml +21 -16
  39. data/example/demo/widgets/linked_graphs_tab.yaml +95 -0
  40. data/example/demo/widgets/mobile_network_widget.yaml +1 -1
  41. data/example/demo/widgets/pie_chart_widget.yaml +1 -1
  42. data/lib/omf-web/config.ru +2 -2
  43. data/lib/omf-web/data_source_proxy.rb +81 -19
  44. data/lib/omf-web/rack/websocket_handler.rb +77 -23
  45. data/lib/omf-web/theme/abstract_page.rb +43 -26
  46. data/lib/omf-web/theme/bright/code_renderer.rb +1 -1
  47. data/lib/omf-web/theme/bright/page.rb +1 -0
  48. data/lib/omf-web/theme/bright/tabbed_renderer.rb +7 -0
  49. data/lib/omf-web/version.rb +7 -0
  50. data/lib/omf-web/widget/data_widget.rb +38 -46
  51. data/lib/omf-web/widget/layout/stacked_layout.rb +2 -1
  52. data/lib/omf-web/widget/layout/tabbed_layout.rb +1 -2
  53. data/{MARUKU-LICENSE → lib/omf-web/widget/text/maruku/MARUKU-LICENSE} +0 -0
  54. data/lib/{maruku → omf-web/widget/text/maruku}/helpers.rb +0 -0
  55. data/lib/{maruku → omf-web/widget/text/maruku}/input/parse_block.rb +0 -0
  56. data/lib/{maruku → omf-web/widget/text/maruku}/output/to_html.rb +26 -21
  57. data/lib/omf-web/widget/text/maruku.rb +5 -0
  58. data/omf_web.gemspec +2 -1
  59. data/share/htdocs/{js → UNUSED}/log/table.js +0 -0
  60. data/share/htdocs/{css → graph/css}/graph.css +0 -0
  61. data/share/htdocs/{image/graph → graph/img}/bar_chart.png +0 -0
  62. data/share/htdocs/{image/graph → graph/img}/donut_chart.png +0 -0
  63. data/share/htdocs/{image/graph → graph/img}/funnel.png +0 -0
  64. data/share/htdocs/{image/graph → graph/img}/info.png +0 -0
  65. data/share/htdocs/{image/graph → graph/img}/line_chart.png +0 -0
  66. data/share/htdocs/{image/graph → graph/img}/line_chart_fill.png +0 -0
  67. data/share/htdocs/{image/graph → graph/img}/misc.png +0 -0
  68. data/share/htdocs/{image/graph → graph/img}/overview.png +0 -0
  69. data/share/htdocs/{image/graph → graph/img}/pie_chart.png +0 -0
  70. data/share/htdocs/{image/graph → graph/img}/scatter_plot.png +0 -0
  71. data/share/htdocs/{image/graph → graph/img}/stacked_bar_chart.png +0 -0
  72. data/share/htdocs/{image/graph → graph/img}/stacked_line_chart.png +0 -0
  73. data/share/htdocs/{image/graph → graph/img}/table.png +0 -0
  74. data/share/htdocs/{js/graph → graph/js}/abstract_chart.js +1 -1
  75. data/share/htdocs/{js/graph → graph/js}/abstract_nv_chart.js +8 -13
  76. data/share/htdocs/{js/graph → graph/js}/abstract_widget.js +9 -16
  77. data/share/htdocs/{js/graph → graph/js}/axis.js +1 -1
  78. data/share/htdocs/{js/graph → graph/js}/barchart.js +2 -2
  79. data/share/htdocs/{js/graph → graph/js}/code_mirror.js +1 -5
  80. data/share/htdocs/{js/graph → graph/js}/discrete_bar_chart.js +1 -1
  81. data/share/htdocs/{js/graph → graph/js}/histogram2.js +1 -1
  82. data/share/htdocs/{js/graph → graph/js}/holt_winters_chart.js +1 -1
  83. data/share/htdocs/{js/graph → graph/js}/line_chart3.js +1 -1
  84. data/share/htdocs/{js/graph → graph/js}/line_chart_with_focus.js +1 -1
  85. data/share/htdocs/{js/graph → graph/js}/map2.js +1 -1
  86. data/share/htdocs/{js/graph → graph/js}/multi_barchart.js +1 -1
  87. data/share/htdocs/graph/js/network2.js +412 -0
  88. data/share/htdocs/{js/graph → graph/js}/pie_chart2.js +1 -1
  89. data/share/htdocs/{js/graph → graph/js}/scatter_plot.js +1 -1
  90. data/share/htdocs/{js/graph → graph/js}/table2.js +17 -20
  91. data/share/htdocs/js/data_source2.js +187 -60
  92. data/share/htdocs/js/require3.js +38 -57
  93. data/share/htdocs/theme/bright/css/bright.css +4 -4
  94. data/share/htdocs/vendor/jquery/jquery.js +9404 -0
  95. data/share/htdocs/vendor/osa/LICENSE.txt +11 -0
  96. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_arrow_green_left.svg +0 -0
  97. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_arrow_yellow_right.svg +0 -0
  98. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_awareness.svg +0 -0
  99. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_camera-web.svg +0 -0
  100. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_cloud.svg +0 -0
  101. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_contract.svg +0 -0
  102. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_database.svg +0 -0
  103. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_desktop.svg +0 -0
  104. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_desktop_imac.svg +0 -0
  105. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-music.svg +0 -0
  106. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-scanner.svg +0 -0
  107. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-usb-wifi.svg +0 -0
  108. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-usb.svg +0 -0
  109. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-wireless-router.svg +0 -0
  110. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_disposal.svg +0 -0
  111. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_drive-harddisk.svg +0 -0
  112. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_drive-optical.svg +0 -0
  113. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_firewall.svg +0 -0
  114. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_home.svg +0 -0
  115. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_hub.svg +0 -0
  116. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_iPhone.svg +0 -0
  117. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_ics_drive.svg +0 -0
  118. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_ics_plc.svg +0 -0
  119. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_ics_thermometer.svg +0 -0
  120. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_id_card.svg +0 -0
  121. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_image-generic.svg +0 -0
  122. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_laptop.svg +0 -0
  123. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_lifecycle.svg +0 -0
  124. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_lightning.svg +0 -0
  125. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_media-flash.svg +0 -0
  126. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_media-optical.svg +0 -0
  127. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_media-tape.svg +0 -0
  128. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_mobile_pda.svg +0 -0
  129. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_padlock.svg +0 -0
  130. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_printer.svg +0 -0
  131. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server.svg +0 -0
  132. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_application.svg +0 -0
  133. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_database.svg +0 -0
  134. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_directory.svg +0 -0
  135. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_distribution.svg +0 -0
  136. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_file.svg +0 -0
  137. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_gateway.svg +0 -0
  138. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_identity.svg +0 -0
  139. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_mail.svg +0 -0
  140. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_media.svg +0 -0
  141. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_monitor.svg +0 -0
  142. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_proxy.svg +0 -0
  143. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_terminal.svg +0 -0
  144. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_web.svg +0 -0
  145. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-branch.svg +0 -0
  146. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-factory.svg +0 -0
  147. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-head-office.svg +0 -0
  148. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-neighbourhood.svg +0 -0
  149. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_audit.svg +0 -0
  150. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_black_hat.svg +0 -0
  151. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue.svg +0 -0
  152. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_security_specialist.svg +0 -0
  153. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_sysadmin.svg +0 -0
  154. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_tester.svg +0 -0
  155. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_tie.svg +0 -0
  156. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green.svg +0 -0
  157. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_architect.svg +0 -0
  158. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_business_manager.svg +0 -0
  159. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_developer.svg +0 -0
  160. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_operations.svg +0 -0
  161. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_project_manager.svg +0 -0
  162. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_service_manager.svg +0 -0
  163. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_warning.svg +0 -0
  164. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_large_group.svg +0 -0
  165. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_users_blue_green.svg +0 -0
  166. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_vpn.svg +0 -0
  167. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_warning.svg +0 -0
  168. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_wireless_network.svg +0 -0
  169. data/share/htdocs/{image → vendor/unknown/image}/.DS_Store +0 -0
  170. data/share/htdocs/{image → vendor/unknown/image}/add_icon.gif +0 -0
  171. data/share/htdocs/{image → vendor/unknown/image}/alertbad_icon.gif +0 -0
  172. data/share/htdocs/{image → vendor/unknown/image}/alertgood_icon.gif +0 -0
  173. data/share/htdocs/{image → vendor/unknown/image}/back_disabled.jpg +0 -0
  174. data/share/htdocs/{image → vendor/unknown/image}/back_disabled.png +0 -0
  175. data/share/htdocs/{image → vendor/unknown/image}/back_enabled.jpg +0 -0
  176. data/share/htdocs/{image → vendor/unknown/image}/back_enabled.png +0 -0
  177. data/share/htdocs/{image → vendor/unknown/image}/back_enabled_hover.jpg +0 -0
  178. data/share/htdocs/{image → vendor/unknown/image}/back_enabled_hover.png +0 -0
  179. data/share/htdocs/{image → vendor/unknown/image}/bottom-bg.gif +0 -0
  180. data/share/htdocs/{image → vendor/unknown/image}/forward_disabled.jpg +0 -0
  181. data/share/htdocs/{image → vendor/unknown/image}/forward_disabled.png +0 -0
  182. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled.jpg +0 -0
  183. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled.png +0 -0
  184. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled_hover.jpg +0 -0
  185. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled_hover.png +0 -0
  186. data/share/htdocs/{image → vendor/unknown/image}/icon-remove.gif +0 -0
  187. data/share/htdocs/{image → vendor/unknown/image}/indicator.gif +0 -0
  188. data/share/htdocs/{image → vendor/unknown/image}/laptop.png +0 -0
  189. data/share/htdocs/{image → vendor/unknown/image}/logo-bottom.gif +0 -0
  190. data/share/htdocs/{image → vendor/unknown/image}/nav-tab-arrow.gif +0 -0
  191. data/share/htdocs/{image → vendor/unknown/image}/norbit_big.gif +0 -0
  192. data/share/htdocs/{image → vendor/unknown/image}/norbit_clipart.png +0 -0
  193. data/share/htdocs/{image → vendor/unknown/image}/progress_bar.gif +0 -0
  194. data/share/htdocs/{image → vendor/unknown/image}/right-bg.gif +0 -0
  195. data/share/htdocs/{image → vendor/unknown/image}/sort_asc.png +0 -0
  196. data/share/htdocs/{image → vendor/unknown/image}/sort_asc_disabled.png +0 -0
  197. data/share/htdocs/{image → vendor/unknown/image}/sort_both.png +0 -0
  198. data/share/htdocs/{image → vendor/unknown/image}/sort_desc.png +0 -0
  199. data/share/htdocs/{image → vendor/unknown/image}/sort_desc_disabled.png +0 -0
  200. data/share/htdocs/{image → vendor/unknown/image}/spinner.gif +0 -0
  201. data/share/htdocs/{svg → vendor/unknown/svg}/ap.svg +0 -0
  202. data/share/htdocs/{svg → vendor/unknown/svg}/router.svg +0 -0
  203. metadata +198 -216
  204. data/example/demo/widgets/dashboard_tab.yaml +0 -28
  205. data/example/demo/widgets/download_tab.yaml +0 -42
  206. data/example/demo/widgets/edit_tab.yaml +0 -20
  207. data/example/demo/widgets/generator_tab.yaml +0 -12
  208. data/lib/omf-oml/endpoint.rb +0 -175
  209. data/lib/omf-oml/indexed_table.rb +0 -57
  210. data/lib/omf-oml/network.rb +0 -413
  211. data/lib/omf-oml/oml_tuple.rb +0 -62
  212. data/lib/omf-oml/schema.rb +0 -191
  213. data/lib/omf-oml/sequel/sequel_server.rb +0 -412
  214. data/lib/omf-oml/sql_row.rb +0 -302
  215. data/lib/omf-oml/sql_source.rb +0 -131
  216. data/lib/omf-oml/table.rb +0 -131
  217. data/lib/omf-oml/tuple.rb +0 -97
  218. data/lib/omf_oml.rb +0 -4
  219. data/share/htdocs/css/coderay.css +0 -127
  220. data/share/htdocs/css/ie.css +0 -40
  221. data/share/htdocs/css/lightbox.css +0 -62
  222. data/share/htdocs/css/scaffold.css +0 -74
  223. data/share/htdocs/css/screen.css +0 -1313
  224. data/share/htdocs/css/search.css +0 -102
  225. data/share/htdocs/css/table.css +0 -538
  226. data/share/htdocs/css/table2.css +0 -191
  227. data/share/htdocs/css/welcome.css +0 -103
  228. data/share/htdocs/css/wfob.css +0 -171
  229. data/share/htdocs/css/wshow.css +0 -69
  230. data/share/htdocs/gec9_demo.html +0 -39
  231. data/share/htdocs/images +0 -1
  232. data/share/htdocs/js/graph/histogram.js +0 -229
  233. data/share/htdocs/js/graph/line_chart.js +0 -342
  234. data/share/htdocs/js/graph/line_chart2.js +0 -232
  235. data/share/htdocs/js/graph/line_chart_fc.js +0 -94
  236. data/share/htdocs/js/graph/map.js +0 -85
  237. data/share/htdocs/js/graph/network.js +0 -591
  238. data/share/htdocs/js/graph/network2.js +0 -318
  239. data/share/htdocs/js/graph/pie_chart.js +0 -130
  240. data/share/htdocs/js/graph/table.js +0 -94
  241. data/share/htdocs/js/require2.js +0 -1998
  242. data/share/htdocs/js/timelines.js +0 -101
  243. data/share/htdocs/stylesheet/grid.css +0 -31
@@ -1,1998 +0,0 @@
1
- /** vim: et:ts=4:sw=4:sts=4
2
- * @license RequireJS 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
3
- * Available via the MIT or new BSD license.
4
- * see: http://github.com/jrburke/requirejs for details
5
- */
6
- /*jslint strict: false, plusplus: false */
7
- /*global window: false, navigator: false, document: false, importScripts: false,
8
- jQuery: false, clearInterval: false, setInterval: false, self: false,
9
- setTimeout: false, opera: false */
10
-
11
- var requirejs, require, define;
12
- (function () {
13
- //Change this version number for each release.
14
- var version = "0.25.0",
15
- commentRegExp = /(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,
16
- cjsRequireRegExp = /require\(["']([^'"\s]+)["']\)/g,
17
- currDirRegExp = /^\.\//,
18
- jsSuffixRegExp = /\.js$/,
19
- ostring = Object.prototype.toString,
20
- ap = Array.prototype,
21
- aps = ap.slice,
22
- apsp = ap.splice,
23
- isBrowser = !!(typeof window !== "undefined" && navigator && document),
24
- isWebWorker = !isBrowser && typeof importScripts !== "undefined",
25
- //PS3 indicates loaded and complete, but need to wait for complete
26
- //specifically. Sequence is "loading", "loaded", execution,
27
- // then "complete". The UA check is unfortunate, but not sure how
28
- //to feature test w/o causing perf issues.
29
- readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
30
- /^complete$/ : /^(complete|loaded)$/,
31
- defContextName = "_",
32
- //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
33
- isOpera = typeof opera !== "undefined" && opera.toString() === "[object Opera]",
34
- reqWaitIdPrefix = "_r@@",
35
- empty = {},
36
- contexts = {},
37
- globalDefQueue = [],
38
- interactiveScript = null,
39
- isDone = false,
40
- checkLoadedDepth = 0,
41
- useInteractive = false,
42
- req, cfg = {}, currentlyAddingScript, s, head, baseElement, scripts, script,
43
- src, subPath, mainScript, dataMain, i, scrollIntervalId, setReadyState, ctx,
44
- jQueryCheck, checkLoadedTimeoutId;
45
-
46
- function isFunction(it) {
47
- return ostring.call(it) === "[object Function]";
48
- }
49
-
50
- function isArray(it) {
51
- return ostring.call(it) === "[object Array]";
52
- }
53
-
54
- /**
55
- * Simple function to mix in properties from source into target,
56
- * but only if target does not already have a property of the same name.
57
- * This is not robust in IE for transferring methods that match
58
- * Object.prototype names, but the uses of mixin here seem unlikely to
59
- * trigger a problem related to that.
60
- */
61
- function mixin(target, source, force) {
62
- for (var prop in source) {
63
- if (!(prop in empty) && (!(prop in target) || force)) {
64
- target[prop] = source[prop];
65
- }
66
- }
67
- return req;
68
- }
69
-
70
- /**
71
- * Constructs an error with a pointer to an URL with more information.
72
- * @param {String} id the error ID that maps to an ID on a web page.
73
- * @param {String} message human readable error.
74
- * @param {Error} [err] the original error, if there is one.
75
- *
76
- * @returns {Error}
77
- */
78
- function makeError(id, msg, err) {
79
- var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
80
- if (err) {
81
- e.originalError = err;
82
- }
83
- return e;
84
- }
85
-
86
- /**
87
- * Used to set up package paths from a packagePaths or packages config object.
88
- * @param {Object} pkgs the object to store the new package config
89
- * @param {Array} currentPackages an array of packages to configure
90
- * @param {String} [dir] a prefix dir to use.
91
- */
92
- function configurePackageDir(pkgs, currentPackages, dir) {
93
- var i, location, pkgObj;
94
-
95
- for (i = 0; (pkgObj = currentPackages[i]); i++) {
96
- pkgObj = typeof pkgObj === "string" ? { name: pkgObj } : pkgObj;
97
- location = pkgObj.location;
98
-
99
- //Add dir to the path, but avoid paths that start with a slash
100
- //or have a colon (indicates a protocol)
101
- if (dir && (!location || (location.indexOf("/") !== 0 && location.indexOf(":") === -1))) {
102
- location = dir + "/" + (location || pkgObj.name);
103
- }
104
-
105
- //Create a brand new object on pkgs, since currentPackages can
106
- //be passed in again, and config.pkgs is the internal transformed
107
- //state for all package configs.
108
- pkgs[pkgObj.name] = {
109
- name: pkgObj.name,
110
- location: location || pkgObj.name,
111
- //Remove leading dot in main, so main paths are normalized,
112
- //and remove any trailing .js, since different package
113
- //envs have different conventions: some use a module name,
114
- //some use a file name.
115
- main: (pkgObj.main || "main")
116
- .replace(currDirRegExp, '')
117
- .replace(jsSuffixRegExp, '')
118
- };
119
- }
120
- }
121
-
122
- /**
123
- * jQuery 1.4.3-1.5.x use a readyWait/ready() pairing to hold DOM
124
- * ready callbacks, but jQuery 1.6 supports a holdReady() API instead.
125
- * At some point remove the readyWait/ready() support and just stick
126
- * with using holdReady.
127
- */
128
- function jQueryHoldReady($, shouldHold) {
129
- if ($.holdReady) {
130
- $.holdReady(shouldHold);
131
- } else if (shouldHold) {
132
- $.readyWait += 1;
133
- } else {
134
- $.ready(true);
135
- }
136
- }
137
-
138
- if (typeof define !== "undefined") {
139
- //If a define is already in play via another AMD loader,
140
- //do not overwrite.
141
- return;
142
- }
143
-
144
- if (typeof requirejs !== "undefined") {
145
- if (isFunction(requirejs)) {
146
- //Do not overwrite and existing requirejs instance.
147
- return;
148
- } else {
149
- cfg = requirejs;
150
- requirejs = undefined;
151
- }
152
- }
153
-
154
- //Allow for a require config object
155
- if (typeof require !== "undefined" && !isFunction(require)) {
156
- //assume it is a config object.
157
- cfg = require;
158
- require = undefined;
159
- }
160
-
161
- /**
162
- * Creates a new context for use in require and define calls.
163
- * Handle most of the heavy lifting. Do not want to use an object
164
- * with prototype here to avoid using "this" in require, in case it
165
- * needs to be used in more super secure envs that do not want this.
166
- * Also there should not be that many contexts in the page. Usually just
167
- * one for the default context, but could be extra for multiversion cases
168
- * or if a package needs a special context for a dependency that conflicts
169
- * with the standard context.
170
- */
171
- function newContext(contextName) {
172
- var context, resume,
173
- config = {
174
- waitSeconds: 7,
175
- baseUrl: s.baseUrl || "./",
176
- paths: {},
177
- pkgs: {}
178
- },
179
- defQueue = [],
180
- specified = {
181
- "require": true,
182
- "exports": true,
183
- "module": true
184
- },
185
- urlMap = {},
186
- defined = {},
187
- loaded = {},
188
- waiting = {},
189
- waitAry = [],
190
- waitIdCounter = 0,
191
- managerCallbacks = {},
192
- plugins = {},
193
- pluginsQueue = {},
194
- resumeDepth = 0,
195
- normalizedWaiting = {};
196
-
197
- /**
198
- * Trims the . and .. from an array of path segments.
199
- * It will keep a leading path segment if a .. will become
200
- * the first path segment, to help with module name lookups,
201
- * which act like paths, but can be remapped. But the end result,
202
- * all paths that use this function should look normalized.
203
- * NOTE: this method MODIFIES the input array.
204
- * @param {Array} ary the array of path segments.
205
- */
206
- function trimDots(ary) {
207
- var i, part;
208
- for (i = 0; (part = ary[i]); i++) {
209
- if (part === ".") {
210
- ary.splice(i, 1);
211
- i -= 1;
212
- } else if (part === "..") {
213
- if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {
214
- //End of the line. Keep at least one non-dot
215
- //path segment at the front so it can be mapped
216
- //correctly to disk. Otherwise, there is likely
217
- //no path mapping for a path starting with '..'.
218
- //This can still fail, but catches the most reasonable
219
- //uses of ..
220
- break;
221
- } else if (i > 0) {
222
- ary.splice(i - 1, 2);
223
- i -= 2;
224
- }
225
- }
226
- }
227
- }
228
-
229
- /**
230
- * Given a relative module name, like ./something, normalize it to
231
- * a real name that can be mapped to a path.
232
- * @param {String} name the relative name
233
- * @param {String} baseName a real name that the name arg is relative
234
- * to.
235
- * @returns {String} normalized name
236
- */
237
- function normalize(name, baseName) {
238
- var pkgName, pkgConfig;
239
-
240
- //Adjust any relative paths.
241
- if (name.charAt(0) === ".") {
242
- //If have a base name, try to normalize against it,
243
- //otherwise, assume it is a top-level require that will
244
- //be relative to baseUrl in the end.
245
- if (baseName) {
246
- if (config.pkgs[baseName]) {
247
- //If the baseName is a package name, then just treat it as one
248
- //name to concat the name with.
249
- baseName = [baseName];
250
- } else {
251
- //Convert baseName to array, and lop off the last part,
252
- //so that . matches that "directory" and not name of the baseName's
253
- //module. For instance, baseName of "one/two/three", maps to
254
- //"one/two/three.js", but we want the directory, "one/two" for
255
- //this normalization.
256
- baseName = baseName.split("/");
257
- baseName = baseName.slice(0, baseName.length - 1);
258
- }
259
-
260
- name = baseName.concat(name.split("/"));
261
- trimDots(name);
262
-
263
- //Some use of packages may use a . path to reference the
264
- //"main" module name, so normalize for that.
265
- pkgConfig = config.pkgs[(pkgName = name[0])];
266
- name = name.join("/");
267
- if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {
268
- name = pkgName;
269
- }
270
- }
271
- }
272
- return name;
273
- }
274
-
275
- /**
276
- * Creates a module mapping that includes plugin prefix, module
277
- * name, and path. If parentModuleMap is provided it will
278
- * also normalize the name via require.normalize()
279
- *
280
- * @param {String} name the module name
281
- * @param {String} [parentModuleMap] parent module map
282
- * for the module name, used to resolve relative names.
283
- *
284
- * @returns {Object}
285
- */
286
- function makeModuleMap(name, parentModuleMap) {
287
- var index = name ? name.indexOf("!") : -1,
288
- prefix = null,
289
- parentName = parentModuleMap ? parentModuleMap.name : null,
290
- originalName = name,
291
- normalizedName, url, pluginModule;
292
-
293
- if (index !== -1) {
294
- prefix = name.substring(0, index);
295
- name = name.substring(index + 1, name.length);
296
- }
297
-
298
- if (prefix) {
299
- prefix = normalize(prefix, parentName);
300
- }
301
-
302
- //Account for relative paths if there is a base name.
303
- if (name) {
304
- if (prefix) {
305
- pluginModule = defined[prefix];
306
- if (pluginModule) {
307
- //Plugin is loaded, use its normalize method, otherwise,
308
- //normalize name as usual.
309
- if (pluginModule.normalize) {
310
- normalizedName = pluginModule.normalize(name, function (name) {
311
- return normalize(name, parentName);
312
- });
313
- } else {
314
- normalizedName = normalize(name, parentName);
315
- }
316
- } else {
317
- //Plugin is not loaded yet, so do not normalize
318
- //the name, wait for plugin to load to see if
319
- //it has a normalize method. To avoid possible
320
- //ambiguity with relative names loaded from another
321
- //plugin, use the parent's name as part of this name.
322
- normalizedName = '__$p' + parentName + '@' + name;
323
- }
324
- } else {
325
- normalizedName = normalize(name, parentName);
326
- }
327
-
328
- url = urlMap[normalizedName];
329
- if (!url) {
330
- //Calculate url for the module, if it has a name.
331
- if (req.toModuleUrl) {
332
- //Special logic required for a particular engine,
333
- //like Node.
334
- url = req.toModuleUrl(context, normalizedName, parentModuleMap);
335
- } else {
336
- url = context.nameToUrl(normalizedName, null, parentModuleMap);
337
- }
338
-
339
- //Store the URL mapping for later.
340
- urlMap[normalizedName] = url;
341
- }
342
- }
343
-
344
- return {
345
- prefix: prefix,
346
- name: normalizedName,
347
- parentMap: parentModuleMap,
348
- url: url,
349
- originalName: originalName,
350
- fullName: prefix ? prefix + "!" + normalizedName : normalizedName
351
- };
352
- }
353
-
354
- /**
355
- * Determine if priority loading is done. If so clear the priorityWait
356
- */
357
- function isPriorityDone() {
358
- var priorityDone = true,
359
- priorityWait = config.priorityWait,
360
- priorityName, i;
361
- if (priorityWait) {
362
- for (i = 0; (priorityName = priorityWait[i]); i++) {
363
- if (!loaded[priorityName]) {
364
- priorityDone = false;
365
- break;
366
- }
367
- }
368
- if (priorityDone) {
369
- delete config.priorityWait;
370
- }
371
- }
372
- return priorityDone;
373
- }
374
-
375
- /**
376
- * Helper function that creates a setExports function for a "module"
377
- * CommonJS dependency. Do this here to avoid creating a closure that
378
- * is part of a loop.
379
- */
380
- function makeSetExports(moduleObj) {
381
- return function (exports) {
382
- moduleObj.exports = exports;
383
- };
384
- }
385
-
386
- function makeContextModuleFunc(func, relModuleMap, enableBuildCallback) {
387
- return function () {
388
- //A version of a require function that passes a moduleName
389
- //value for items that may need to
390
- //look up paths relative to the moduleName
391
- var args = [].concat(aps.call(arguments, 0)), lastArg;
392
- if (enableBuildCallback &&
393
- isFunction((lastArg = args[args.length - 1]))) {
394
- lastArg.__requireJsBuild = true;
395
- }
396
- args.push(relModuleMap);
397
- return func.apply(null, args);
398
- };
399
- }
400
-
401
- /**
402
- * Helper function that creates a require function object to give to
403
- * modules that ask for it as a dependency. It needs to be specific
404
- * per module because of the implication of path mappings that may
405
- * need to be relative to the module name.
406
- */
407
- function makeRequire(relModuleMap, enableBuildCallback) {
408
- var modRequire = makeContextModuleFunc(context.require, relModuleMap, enableBuildCallback);
409
-
410
- mixin(modRequire, {
411
- nameToUrl: makeContextModuleFunc(context.nameToUrl, relModuleMap),
412
- toUrl: makeContextModuleFunc(context.toUrl, relModuleMap),
413
- defined: makeContextModuleFunc(context.requireDefined, relModuleMap),
414
- specified: makeContextModuleFunc(context.requireSpecified, relModuleMap),
415
- ready: req.ready,
416
- isBrowser: req.isBrowser
417
- });
418
- //Something used by node.
419
- if (req.paths) {
420
- modRequire.paths = req.paths;
421
- }
422
- return modRequire;
423
- }
424
-
425
- /**
426
- * Used to update the normalized name for plugin-based dependencies
427
- * after a plugin loads, since it can have its own normalization structure.
428
- * @param {String} pluginName the normalized plugin module name.
429
- */
430
- function updateNormalizedNames(pluginName) {
431
-
432
- var oldFullName, oldModuleMap, moduleMap, fullName, callbacks,
433
- i, j, k, depArray, existingCallbacks,
434
- maps = normalizedWaiting[pluginName];
435
-
436
- if (maps) {
437
- for (i = 0; (oldModuleMap = maps[i]); i++) {
438
- oldFullName = oldModuleMap.fullName;
439
- moduleMap = makeModuleMap(oldModuleMap.originalName, oldModuleMap.parentMap);
440
- fullName = moduleMap.fullName;
441
- //Callbacks could be undefined if the same plugin!name was
442
- //required twice in a row, so use empty array in that case.
443
- callbacks = managerCallbacks[oldFullName] || [];
444
- existingCallbacks = managerCallbacks[fullName];
445
-
446
- if (fullName !== oldFullName) {
447
- //Update the specified object, but only if it is already
448
- //in there. In sync environments, it may not be yet.
449
- if (oldFullName in specified) {
450
- delete specified[oldFullName];
451
- specified[fullName] = true;
452
- }
453
-
454
- //Update managerCallbacks to use the correct normalized name.
455
- //If there are already callbacks for the normalized name,
456
- //just add to them.
457
- if (existingCallbacks) {
458
- managerCallbacks[fullName] = existingCallbacks.concat(callbacks);
459
- } else {
460
- managerCallbacks[fullName] = callbacks;
461
- }
462
- delete managerCallbacks[oldFullName];
463
-
464
- //In each manager callback, update the normalized name in the depArray.
465
- for (j = 0; j < callbacks.length; j++) {
466
- depArray = callbacks[j].depArray;
467
- for (k = 0; k < depArray.length; k++) {
468
- if (depArray[k] === oldFullName) {
469
- depArray[k] = fullName;
470
- }
471
- }
472
- }
473
- }
474
- }
475
- }
476
-
477
- delete normalizedWaiting[pluginName];
478
- }
479
-
480
- /*
481
- * Queues a dependency for checking after the loader is out of a
482
- * "paused" state, for example while a script file is being loaded
483
- * in the browser, where it may have many modules defined in it.
484
- *
485
- * depName will be fully qualified, no relative . or .. path.
486
- */
487
- function queueDependency(dep) {
488
- //Make sure to load any plugin and associate the dependency
489
- //with that plugin.
490
- var prefix = dep.prefix,
491
- fullName = dep.fullName;
492
-
493
- //Do not bother if the depName is already in transit
494
- if (specified[fullName] || fullName in defined) {
495
- return;
496
- }
497
-
498
- if (prefix && !plugins[prefix]) {
499
- //Queue up loading of the dependency, track it
500
- //via context.plugins. Mark it as a plugin so
501
- //that the build system will know to treat it
502
- //special.
503
- plugins[prefix] = undefined;
504
-
505
- //Remember this dep that needs to have normaliztion done
506
- //after the plugin loads.
507
- (normalizedWaiting[prefix] || (normalizedWaiting[prefix] = []))
508
- .push(dep);
509
-
510
- //Register an action to do once the plugin loads, to update
511
- //all managerCallbacks to use a properly normalized module
512
- //name.
513
- (managerCallbacks[prefix] ||
514
- (managerCallbacks[prefix] = [])).push({
515
- onDep: function (name, value) {
516
- if (name === prefix) {
517
- updateNormalizedNames(prefix);
518
- }
519
- }
520
- });
521
-
522
- queueDependency(makeModuleMap(prefix));
523
- }
524
-
525
- context.paused.push(dep);
526
- }
527
-
528
- function execManager(manager) {
529
- var i, ret, waitingCallbacks, err,
530
- cb = manager.callback,
531
- fullName = manager.fullName,
532
- args = [],
533
- ary = manager.depArray;
534
-
535
- //Call the callback to define the module, if necessary.
536
- if (cb && isFunction(cb)) {
537
- //Pull out the defined dependencies and pass the ordered
538
- //values to the callback.
539
- if (ary) {
540
- for (i = 0; i < ary.length; i++) {
541
- args.push(manager.deps[ary[i]]);
542
- }
543
- }
544
-
545
- try {
546
- ret = req.execCb(fullName, manager.callback, args, defined[fullName]);
547
- } catch (e) {
548
- err = e;
549
- }
550
-
551
- if (fullName) {
552
- //If setting exports via "module" is in play,
553
- //favor that over return value and exports. After that,
554
- //favor a non-undefined return value over exports use.
555
- if (manager.cjsModule && manager.cjsModule.exports !== undefined) {
556
- ret = defined[fullName] = manager.cjsModule.exports;
557
- } else if (ret === undefined && manager.usingExports) {
558
- //exports already set the defined value.
559
- ret = defined[fullName];
560
- } else {
561
- //Use the return value from the function.
562
- defined[fullName] = ret;
563
- }
564
- }
565
- } else if (fullName) {
566
- //May just be an object definition for the module. Only
567
- //worry about defining if have a module name.
568
- ret = defined[fullName] = cb;
569
- }
570
-
571
- //Clean up waiting. Do this before error calls, and before
572
- //calling back waitingCallbacks, so that bookkeeping is correct
573
- //in the event of an error and error is reported in correct order,
574
- //since the waitingCallbacks will likely have errors if the
575
- //onError function does not throw.
576
- if (waiting[manager.waitId]) {
577
- delete waiting[manager.waitId];
578
- manager.isDone = true;
579
- context.waitCount -= 1;
580
- if (context.waitCount === 0) {
581
- //Clear the wait array used for cycles.
582
- waitAry = [];
583
- }
584
- }
585
-
586
- if (err) {
587
- err = makeError('defineerror', 'Error evaluating ' +
588
- 'module "' + fullName + '" at location "' +
589
- (fullName ? makeModuleMap(fullName).url : '') + '":\n' +
590
- err + '\nfileName:' + (err.fileName || err.sourceURL) +
591
- '\nlineNumber: ' + (err.lineNumber || err.line), err);
592
- err.moduleName = fullName;
593
- return req.onError(err);
594
- }
595
-
596
- if (fullName) {
597
- //If anything was waiting for this module to be defined,
598
- //notify them now.
599
- waitingCallbacks = managerCallbacks[fullName];
600
- if (waitingCallbacks) {
601
- for (i = 0; i < waitingCallbacks.length; i++) {
602
- waitingCallbacks[i].onDep(fullName, ret);
603
- }
604
- delete managerCallbacks[fullName];
605
- }
606
- }
607
-
608
- return undefined;
609
- }
610
-
611
- function main(inName, depArray, callback, relModuleMap) {
612
- var moduleMap = makeModuleMap(inName, relModuleMap),
613
- name = moduleMap.name,
614
- fullName = moduleMap.fullName,
615
- uniques = {},
616
- manager = {
617
- //Use a wait ID because some entries are anon
618
- //async require calls.
619
- waitId: name || reqWaitIdPrefix + (waitIdCounter++),
620
- depCount: 0,
621
- depMax: 0,
622
- prefix: moduleMap.prefix,
623
- name: name,
624
- fullName: fullName,
625
- deps: {},
626
- depArray: depArray,
627
- callback: callback,
628
- onDep: function (depName, value) {
629
- if (!(depName in manager.deps)) {
630
- manager.deps[depName] = value;
631
- manager.depCount += 1;
632
- if (manager.depCount === manager.depMax) {
633
- //All done, execute!
634
- execManager(manager);
635
- }
636
- }
637
- }
638
- },
639
- i, depArg, depName, cjsMod;
640
-
641
- if (fullName) {
642
- //If module already defined for context, or already loaded,
643
- //then leave. Also leave if jQuery is registering but it does
644
- //not match the desired version number in the config.
645
- if (fullName in defined || loaded[fullName] === true ||
646
- (fullName === "jquery" && config.jQuery &&
647
- config.jQuery !== callback().fn.jquery)) {
648
- return;
649
- }
650
-
651
- //Set specified/loaded here for modules that are also loaded
652
- //as part of a layer, where onScriptLoad is not fired
653
- //for those cases. Do this after the inline define and
654
- //dependency tracing is done.
655
- specified[fullName] = true;
656
- loaded[fullName] = true;
657
-
658
- //If module is jQuery set up delaying its dom ready listeners.
659
- if (fullName === "jquery" && callback) {
660
- jQueryCheck(callback());
661
- }
662
- }
663
-
664
- //Add the dependencies to the deps field, and register for callbacks
665
- //on the dependencies.
666
- for (i = 0; i < depArray.length; i++) {
667
- depArg = depArray[i];
668
- //There could be cases like in IE, where a trailing comma will
669
- //introduce a null dependency, so only treat a real dependency
670
- //value as a dependency.
671
- if (depArg) {
672
- //Split the dependency name into plugin and name parts
673
- depArg = makeModuleMap(depArg, (name ? moduleMap : relModuleMap));
674
- depName = depArg.fullName;
675
-
676
- //Fix the name in depArray to be just the name, since
677
- //that is how it will be called back later.
678
- depArray[i] = depName;
679
-
680
- //Fast path CommonJS standard dependencies.
681
- if (depName === "require") {
682
- manager.deps[depName] = makeRequire(moduleMap);
683
- } else if (depName === "exports") {
684
- //CommonJS module spec 1.1
685
- manager.deps[depName] = defined[fullName] = {};
686
- manager.usingExports = true;
687
- } else if (depName === "module") {
688
- //CommonJS module spec 1.1
689
- manager.cjsModule = cjsMod = manager.deps[depName] = {
690
- id: name,
691
- uri: name ? context.nameToUrl(name, null, relModuleMap) : undefined,
692
- exports: defined[fullName]
693
- };
694
- cjsMod.setExports = makeSetExports(cjsMod);
695
- } else if (depName in defined && !(depName in waiting)) {
696
- //Module already defined, no need to wait for it.
697
- manager.deps[depName] = defined[depName];
698
- } else if (!uniques[depName]) {
699
-
700
- //A dynamic dependency.
701
- manager.depMax += 1;
702
-
703
- queueDependency(depArg);
704
-
705
- //Register to get notification when dependency loads.
706
- (managerCallbacks[depName] ||
707
- (managerCallbacks[depName] = [])).push(manager);
708
-
709
- uniques[depName] = true;
710
- }
711
- }
712
- }
713
-
714
- //Do not bother tracking the manager if it is all done.
715
- if (manager.depCount === manager.depMax) {
716
- //All done, execute!
717
- execManager(manager);
718
- } else {
719
- waiting[manager.waitId] = manager;
720
- waitAry.push(manager);
721
- context.waitCount += 1;
722
- }
723
- }
724
-
725
- /**
726
- * Convenience method to call main for a define call that was put on
727
- * hold in the defQueue.
728
- */
729
- function callDefMain(args) {
730
- main.apply(null, args);
731
- //Mark the module loaded. Must do it here in addition
732
- //to doing it in define in case a script does
733
- //not call define
734
- loaded[args[0]] = true;
735
- }
736
-
737
- /**
738
- * jQuery 1.4.3+ supports ways to hold off calling
739
- * calling jQuery ready callbacks until all scripts are loaded. Be sure
740
- * to track it if the capability exists.. Also, since jQuery 1.4.3 does
741
- * not register as a module, need to do some global inference checking.
742
- * Even if it does register as a module, not guaranteed to be the precise
743
- * name of the global. If a jQuery is tracked for this context, then go
744
- * ahead and register it as a module too, if not already in process.
745
- */
746
- jQueryCheck = function (jqCandidate) {
747
- if (!context.jQuery) {
748
- var $ = jqCandidate || (typeof jQuery !== "undefined" ? jQuery : null);
749
-
750
- if ($) {
751
- //If a specific version of jQuery is wanted, make sure to only
752
- //use this jQuery if it matches.
753
- if (config.jQuery && $.fn.jquery !== config.jQuery) {
754
- return;
755
- }
756
-
757
- if ("holdReady" in $ || "readyWait" in $) {
758
- context.jQuery = $;
759
-
760
- //Manually create a "jquery" module entry if not one already
761
- //or in process. Note this could trigger an attempt at
762
- //a second jQuery registration, but does no harm since
763
- //the first one wins, and it is the same value anyway.
764
- callDefMain(["jquery", [], function () {
765
- return jQuery;
766
- }]);
767
-
768
- //Ask jQuery to hold DOM ready callbacks.
769
- if (context.scriptCount) {
770
- jQueryHoldReady($, true);
771
- context.jQueryIncremented = true;
772
- }
773
- }
774
- }
775
- }
776
- };
777
-
778
- function forceExec(manager, traced) {
779
- if (manager.isDone) {
780
- return undefined;
781
- }
782
-
783
- var fullName = manager.fullName,
784
- depArray = manager.depArray,
785
- depName, i;
786
- if (fullName) {
787
- if (traced[fullName]) {
788
- return defined[fullName];
789
- }
790
-
791
- traced[fullName] = true;
792
- }
793
-
794
- //forceExec all of its dependencies.
795
- for (i = 0; i < depArray.length; i++) {
796
- //Some array members may be null, like if a trailing comma
797
- //IE, so do the explicit [i] access and check if it has a value.
798
- depName = depArray[i];
799
- if (depName) {
800
- if (!manager.deps[depName] && waiting[depName]) {
801
- manager.onDep(depName, forceExec(waiting[depName], traced));
802
- }
803
- }
804
- }
805
-
806
- return fullName ? defined[fullName] : undefined;
807
- }
808
-
809
- /**
810
- * Checks if all modules for a context are loaded, and if so, evaluates the
811
- * new ones in right dependency order.
812
- *
813
- * @private
814
- */
815
- function checkLoaded() {
816
- var waitInterval = config.waitSeconds * 1000,
817
- //It is possible to disable the wait interval by using waitSeconds of 0.
818
- expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
819
- noLoads = "", hasLoadedProp = false, stillLoading = false, prop,
820
- err, manager;
821
-
822
- //If there are items still in the paused queue processing wait.
823
- //This is particularly important in the sync case where each paused
824
- //item is processed right away but there may be more waiting.
825
- if (context.pausedCount > 0) {
826
- return undefined;
827
- }
828
-
829
- //Determine if priority loading is done. If so clear the priority. If
830
- //not, then do not check
831
- if (config.priorityWait) {
832
- if (isPriorityDone()) {
833
- //Call resume, since it could have
834
- //some waiting dependencies to trace.
835
- resume();
836
- } else {
837
- return undefined;
838
- }
839
- }
840
-
841
- //See if anything is still in flight.
842
- for (prop in loaded) {
843
- if (!(prop in empty)) {
844
- hasLoadedProp = true;
845
- if (!loaded[prop]) {
846
- if (expired) {
847
- noLoads += prop + " ";
848
- } else {
849
- stillLoading = true;
850
- break;
851
- }
852
- }
853
- }
854
- }
855
-
856
- //Check for exit conditions.
857
- if (!hasLoadedProp && !context.waitCount) {
858
- //If the loaded object had no items, then the rest of
859
- //the work below does not need to be done.
860
- return undefined;
861
- }
862
- if (expired && noLoads) {
863
- //If wait time expired, throw error of unloaded modules.
864
- err = makeError("timeout", "Load timeout for modules: " + noLoads);
865
- err.requireType = "timeout";
866
- err.requireModules = noLoads;
867
- return req.onError(err);
868
- }
869
- if (stillLoading || context.scriptCount) {
870
- //Something is still waiting to load. Wait for it, but only
871
- //if a timeout is not already in effect.
872
- if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
873
- checkLoadedTimeoutId = setTimeout(function () {
874
- checkLoadedTimeoutId = 0;
875
- checkLoaded();
876
- }, 50);
877
- }
878
- return undefined;
879
- }
880
-
881
- //If still have items in the waiting cue, but all modules have
882
- //been loaded, then it means there are some circular dependencies
883
- //that need to be broken.
884
- //However, as a waiting thing is fired, then it can add items to
885
- //the waiting cue, and those items should not be fired yet, so
886
- //make sure to redo the checkLoaded call after breaking a single
887
- //cycle, if nothing else loaded then this logic will pick it up
888
- //again.
889
- if (context.waitCount) {
890
- //Cycle through the waitAry, and call items in sequence.
891
- for (i = 0; (manager = waitAry[i]); i++) {
892
- forceExec(manager, {});
893
- }
894
-
895
- //Only allow this recursion to a certain depth. Only
896
- //triggered by errors in calling a module in which its
897
- //modules waiting on it cannot finish loading, or some circular
898
- //dependencies that then may add more dependencies.
899
- //The value of 5 is a bit arbitrary. Hopefully just one extra
900
- //pass, or two for the case of circular dependencies generating
901
- //more work that gets resolved in the sync node case.
902
- if (checkLoadedDepth < 5) {
903
- checkLoadedDepth += 1;
904
- checkLoaded();
905
- }
906
- }
907
-
908
- checkLoadedDepth = 0;
909
-
910
- //Check for DOM ready, and nothing is waiting across contexts.
911
- req.checkReadyState();
912
-
913
- return undefined;
914
- }
915
-
916
- function callPlugin(pluginName, dep) {
917
- var name = dep.name,
918
- fullName = dep.fullName,
919
- load;
920
-
921
- //Do not bother if plugin is already defined or being loaded.
922
- if (fullName in defined || fullName in loaded) {
923
- return;
924
- }
925
-
926
- if (!plugins[pluginName]) {
927
- plugins[pluginName] = defined[pluginName];
928
- }
929
-
930
- //Only set loaded to false for tracking if it has not already been set.
931
- if (!loaded[fullName]) {
932
- loaded[fullName] = false;
933
- }
934
-
935
- load = function (ret) {
936
- //Allow the build process to register plugin-loaded dependencies.
937
- if (req.onPluginLoad) {
938
- req.onPluginLoad(context, pluginName, name, ret);
939
- }
940
-
941
- execManager({
942
- prefix: dep.prefix,
943
- name: dep.name,
944
- fullName: dep.fullName,
945
- callback: function () {
946
- return ret;
947
- }
948
- });
949
- loaded[fullName] = true;
950
- };
951
-
952
- //Allow plugins to load other code without having to know the
953
- //context or how to "complete" the load.
954
- load.fromText = function (moduleName, text) {
955
- /*jslint evil: true */
956
- var hasInteractive = useInteractive;
957
-
958
- //Indicate a the module is in process of loading.
959
- context.loaded[moduleName] = false;
960
- context.scriptCount += 1;
961
-
962
- //Turn off interactive script matching for IE for any define
963
- //calls in the text, then turn it back on at the end.
964
- if (hasInteractive) {
965
- useInteractive = false;
966
- }
967
-
968
- req.exec(text);
969
-
970
- if (hasInteractive) {
971
- useInteractive = true;
972
- }
973
-
974
- //Support anonymous modules.
975
- context.completeLoad(moduleName);
976
- };
977
-
978
- //Use parentName here since the plugin's name is not reliable,
979
- //could be some weird string with no path that actually wants to
980
- //reference the parentName's path.
981
- plugins[pluginName].load(name, makeRequire(dep.parentMap, true), load, config);
982
- }
983
-
984
- function loadPaused(dep) {
985
- //Renormalize dependency if its name was waiting on a plugin
986
- //to load, which as since loaded.
987
- if (dep.prefix && dep.name.indexOf('__$p') === 0 && defined[dep.prefix]) {
988
- dep = makeModuleMap(dep.originalName, dep.parentMap);
989
- }
990
-
991
- var pluginName = dep.prefix,
992
- fullName = dep.fullName,
993
- urlFetched = context.urlFetched;
994
-
995
- //Do not bother if the dependency has already been specified.
996
- if (specified[fullName] || loaded[fullName]) {
997
- return;
998
- } else {
999
- specified[fullName] = true;
1000
- }
1001
-
1002
- if (pluginName) {
1003
- //If plugin not loaded, wait for it.
1004
- //set up callback list. if no list, then register
1005
- //managerCallback for that plugin.
1006
- if (defined[pluginName]) {
1007
- callPlugin(pluginName, dep);
1008
- } else {
1009
- if (!pluginsQueue[pluginName]) {
1010
- pluginsQueue[pluginName] = [];
1011
- (managerCallbacks[pluginName] ||
1012
- (managerCallbacks[pluginName] = [])).push({
1013
- onDep: function (name, value) {
1014
- if (name === pluginName) {
1015
- var i, oldModuleMap, ary = pluginsQueue[pluginName];
1016
-
1017
- //Now update all queued plugin actions.
1018
- for (i = 0; i < ary.length; i++) {
1019
- oldModuleMap = ary[i];
1020
- //Update the moduleMap since the
1021
- //module name may be normalized
1022
- //differently now.
1023
- callPlugin(pluginName,
1024
- makeModuleMap(oldModuleMap.originalName, oldModuleMap.parentMap));
1025
- }
1026
- delete pluginsQueue[pluginName];
1027
- }
1028
- }
1029
- });
1030
- }
1031
- pluginsQueue[pluginName].push(dep);
1032
- }
1033
- } else {
1034
- if (!urlFetched[dep.url]) {
1035
- req.load(context, fullName, dep.url);
1036
- urlFetched[dep.url] = true;
1037
- }
1038
- }
1039
- }
1040
-
1041
- /**
1042
- * Resumes tracing of dependencies and then checks if everything is loaded.
1043
- */
1044
- resume = function () {
1045
- var args, i, p;
1046
-
1047
- resumeDepth += 1;
1048
-
1049
- if (context.scriptCount <= 0) {
1050
- //Synchronous envs will push the number below zero with the
1051
- //decrement above, be sure to set it back to zero for good measure.
1052
- //require() calls that also do not end up loading scripts could
1053
- //push the number negative too.
1054
- context.scriptCount = 0;
1055
- }
1056
-
1057
- //Make sure any remaining defQueue items get properly processed.
1058
- while (defQueue.length) {
1059
- args = defQueue.shift();
1060
- if (args[0] === null) {
1061
- return req.onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
1062
- } else {
1063
- callDefMain(args);
1064
- }
1065
- }
1066
-
1067
- //Skip the resume of paused dependencies
1068
- //if current context is in priority wait.
1069
- if (!config.priorityWait || isPriorityDone()) {
1070
- while (context.paused.length) {
1071
- p = context.paused;
1072
- context.pausedCount += p.length;
1073
- //Reset paused list
1074
- context.paused = [];
1075
-
1076
- for (i = 0; (args = p[i]); i++) {
1077
- loadPaused(args);
1078
- }
1079
- //Move the start time for timeout forward.
1080
- context.startTime = (new Date()).getTime();
1081
- context.pausedCount -= p.length;
1082
- }
1083
- }
1084
-
1085
- //Only check if loaded when resume depth is 1. It is likely that
1086
- //it is only greater than 1 in sync environments where a factory
1087
- //function also then calls the callback-style require. In those
1088
- //cases, the checkLoaded should not occur until the resume
1089
- //depth is back at the top level.
1090
- if (resumeDepth === 1) {
1091
- checkLoaded();
1092
- }
1093
-
1094
- resumeDepth -= 1;
1095
-
1096
- return undefined;
1097
- };
1098
-
1099
- //Define the context object. Many of these fields are on here
1100
- //just to make debugging easier.
1101
- context = {
1102
- contextName: contextName,
1103
- config: config,
1104
- defQueue: defQueue,
1105
- waiting: waiting,
1106
- waitCount: 0,
1107
- specified: specified,
1108
- loaded: loaded,
1109
- urlMap: urlMap,
1110
- scriptCount: 0,
1111
- urlFetched: {},
1112
- defined: defined,
1113
- paused: [],
1114
- pausedCount: 0,
1115
- plugins: plugins,
1116
- managerCallbacks: managerCallbacks,
1117
- makeModuleMap: makeModuleMap,
1118
- normalize: normalize,
1119
- /**
1120
- * Set a configuration for the context.
1121
- * @param {Object} cfg config object to integrate.
1122
- */
1123
- configure: function (cfg) {
1124
- var paths, prop, packages, pkgs, packagePaths, requireWait;
1125
-
1126
- //Make sure the baseUrl ends in a slash.
1127
- if (cfg.baseUrl) {
1128
- if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== "/") {
1129
- cfg.baseUrl += "/";
1130
- }
1131
- }
1132
-
1133
- //Save off the paths and packages since they require special processing,
1134
- //they are additive.
1135
- paths = config.paths;
1136
- packages = config.packages;
1137
- pkgs = config.pkgs;
1138
-
1139
- //Mix in the config values, favoring the new values over
1140
- //existing ones in context.config.
1141
- mixin(config, cfg, true);
1142
-
1143
- //Adjust paths if necessary.
1144
- if (cfg.paths) {
1145
- for (prop in cfg.paths) {
1146
- if (!(prop in empty)) {
1147
- paths[prop] = cfg.paths[prop];
1148
- }
1149
- }
1150
- config.paths = paths;
1151
- }
1152
-
1153
- packagePaths = cfg.packagePaths;
1154
- if (packagePaths || cfg.packages) {
1155
- //Convert packagePaths into a packages config.
1156
- if (packagePaths) {
1157
- for (prop in packagePaths) {
1158
- if (!(prop in empty)) {
1159
- configurePackageDir(pkgs, packagePaths[prop], prop);
1160
- }
1161
- }
1162
- }
1163
-
1164
- //Adjust packages if necessary.
1165
- if (cfg.packages) {
1166
- configurePackageDir(pkgs, cfg.packages);
1167
- }
1168
-
1169
- //Done with modifications, assing packages back to context config
1170
- config.pkgs = pkgs;
1171
- }
1172
-
1173
- //If priority loading is in effect, trigger the loads now
1174
- if (cfg.priority) {
1175
- //Hold on to requireWait value, and reset it after done
1176
- requireWait = context.requireWait;
1177
-
1178
- //Allow tracing some require calls to allow the fetching
1179
- //of the priority config.
1180
- context.requireWait = false;
1181
-
1182
- //But first, call resume to register any defined modules that may
1183
- //be in a data-main built file before the priority config
1184
- //call. Also grab any waiting define calls for this context.
1185
- context.takeGlobalQueue();
1186
- resume();
1187
-
1188
- context.require(cfg.priority);
1189
-
1190
- //Trigger a resume right away, for the case when
1191
- //the script with the priority load is done as part
1192
- //of a data-main call. In that case the normal resume
1193
- //call will not happen because the scriptCount will be
1194
- //at 1, since the script for data-main is being processed.
1195
- resume();
1196
-
1197
- //Restore previous state.
1198
- context.requireWait = requireWait;
1199
- config.priorityWait = cfg.priority;
1200
- }
1201
-
1202
- //If a deps array or a config callback is specified, then call
1203
- //require with those args. This is useful when require is defined as a
1204
- //config object before require.js is loaded.
1205
- if (cfg.deps || cfg.callback) {
1206
- context.require(cfg.deps || [], cfg.callback);
1207
- }
1208
-
1209
- //Set up ready callback, if asked. Useful when require is defined as a
1210
- //config object before require.js is loaded.
1211
- if (cfg.ready) {
1212
- req.ready(cfg.ready);
1213
- }
1214
- },
1215
-
1216
- requireDefined: function (moduleName, relModuleMap) {
1217
- return makeModuleMap(moduleName, relModuleMap).fullName in defined;
1218
- },
1219
-
1220
- requireSpecified: function (moduleName, relModuleMap) {
1221
- return makeModuleMap(moduleName, relModuleMap).fullName in specified;
1222
- },
1223
-
1224
- require: function (deps, callback, relModuleMap) {
1225
- var moduleName, fullName, moduleMap;
1226
- if (typeof deps === "string") {
1227
- //Synchronous access to one module. If require.get is
1228
- //available (as in the Node adapter), prefer that.
1229
- //In this case deps is the moduleName and callback is
1230
- //the relModuleMap
1231
- if (req.get) {
1232
- return req.get(context, deps, callback);
1233
- }
1234
-
1235
- //Just return the module wanted. In this scenario, the
1236
- //second arg (if passed) is just the relModuleMap.
1237
- moduleName = deps;
1238
- relModuleMap = callback;
1239
-
1240
- //Normalize module name, if it contains . or ..
1241
- moduleMap = makeModuleMap(moduleName, relModuleMap);
1242
- fullName = moduleMap.fullName;
1243
-
1244
- if (!(fullName in defined)) {
1245
- return req.onError(makeError("notloaded", "Module name '" +
1246
- moduleMap.fullName +
1247
- "' has not been loaded yet for context: " +
1248
- contextName));
1249
- }
1250
- return defined[fullName];
1251
- }
1252
-
1253
- main(null, deps, callback, relModuleMap);
1254
-
1255
- //If the require call does not trigger anything new to load,
1256
- //then resume the dependency processing.
1257
- if (!context.requireWait) {
1258
- while (!context.scriptCount && context.paused.length) {
1259
- //For built layers, there can be some defined
1260
- //modules waiting for intake into the context,
1261
- //in particular module plugins. Take them.
1262
- context.takeGlobalQueue();
1263
- resume();
1264
- }
1265
- }
1266
- return undefined;
1267
- },
1268
-
1269
- /**
1270
- * Internal method to transfer globalQueue items to this context's
1271
- * defQueue.
1272
- */
1273
- takeGlobalQueue: function () {
1274
- //Push all the globalDefQueue items into the context's defQueue
1275
- if (globalDefQueue.length) {
1276
- //Array splice in the values since the context code has a
1277
- //local var ref to defQueue, so cannot just reassign the one
1278
- //on context.
1279
- apsp.apply(context.defQueue,
1280
- [context.defQueue.length - 1, 0].concat(globalDefQueue));
1281
- globalDefQueue = [];
1282
- }
1283
- },
1284
-
1285
- /**
1286
- * Internal method used by environment adapters to complete a load event.
1287
- * A load event could be a script load or just a load pass from a synchronous
1288
- * load call.
1289
- * @param {String} moduleName the name of the module to potentially complete.
1290
- */
1291
- completeLoad: function (moduleName) {
1292
- var args;
1293
-
1294
- context.takeGlobalQueue();
1295
-
1296
- while (defQueue.length) {
1297
- args = defQueue.shift();
1298
-
1299
- if (args[0] === null) {
1300
- args[0] = moduleName;
1301
- break;
1302
- } else if (args[0] === moduleName) {
1303
- //Found matching define call for this script!
1304
- break;
1305
- } else {
1306
- //Some other named define call, most likely the result
1307
- //of a build layer that included many define calls.
1308
- callDefMain(args);
1309
- args = null;
1310
- }
1311
- }
1312
- if (args) {
1313
- callDefMain(args);
1314
- } else {
1315
- //A script that does not call define(), so just simulate
1316
- //the call for it. Special exception for jQuery dynamic load.
1317
- callDefMain([moduleName, [],
1318
- moduleName === "jquery" && typeof jQuery !== "undefined" ?
1319
- function () {
1320
- return jQuery;
1321
- } : null]);
1322
- }
1323
-
1324
- //Mark the script as loaded. Note that this can be different from a
1325
- //moduleName that maps to a define call. This line is important
1326
- //for traditional browser scripts.
1327
- loaded[moduleName] = true;
1328
-
1329
- //If a global jQuery is defined, check for it. Need to do it here
1330
- //instead of main() since stock jQuery does not register as
1331
- //a module via define.
1332
- jQueryCheck();
1333
-
1334
- //Doing this scriptCount decrement branching because sync envs
1335
- //need to decrement after resume, otherwise it looks like
1336
- //loading is complete after the first dependency is fetched.
1337
- //For browsers, it works fine to decrement after, but it means
1338
- //the checkLoaded setTimeout 50 ms cost is taken. To avoid
1339
- //that cost, decrement beforehand.
1340
- if (req.isAsync) {
1341
- context.scriptCount -= 1;
1342
- }
1343
- resume();
1344
- if (!req.isAsync) {
1345
- context.scriptCount -= 1;
1346
- }
1347
- },
1348
-
1349
- /**
1350
- * Converts a module name + .extension into an URL path.
1351
- * *Requires* the use of a module name. It does not support using
1352
- * plain URLs like nameToUrl.
1353
- */
1354
- toUrl: function (moduleNamePlusExt, relModuleMap) {
1355
- var index = moduleNamePlusExt.lastIndexOf("."),
1356
- ext = null;
1357
-
1358
- if (index !== -1) {
1359
- ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
1360
- moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
1361
- }
1362
-
1363
- return context.nameToUrl(moduleNamePlusExt, ext, relModuleMap);
1364
- },
1365
-
1366
- /**
1367
- * Converts a module name to a file path. Supports cases where
1368
- * moduleName may actually be just an URL.
1369
- */
1370
- nameToUrl: function (moduleName, ext, relModuleMap) {
1371
- var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,
1372
- config = context.config;
1373
-
1374
- //Normalize module name if have a base relative module name to work from.
1375
- moduleName = normalize(moduleName, relModuleMap && relModuleMap.fullName);
1376
-
1377
- //If a colon is in the URL, it indicates a protocol is used and it is just
1378
- //an URL to a file, or if it starts with a slash or ends with .js, it is just a plain file.
1379
- //The slash is important for protocol-less URLs as well as full paths.
1380
- if (req.jsExtRegExp.test(moduleName)) {
1381
- //Just a plain path, not module name lookup, so just return it.
1382
- //Add extension if it is included. This is a bit wonky, only non-.js things pass
1383
- //an extension, this method probably needs to be reworked.
1384
- url = moduleName + (ext ? ext : "");
1385
- } else {
1386
- //A module that needs to be converted to a path.
1387
- paths = config.paths;
1388
- pkgs = config.pkgs;
1389
-
1390
- syms = moduleName.split("/");
1391
- //For each module name segment, see if there is a path
1392
- //registered for it. Start with most specific name
1393
- //and work up from it.
1394
- for (i = syms.length; i > 0; i--) {
1395
- parentModule = syms.slice(0, i).join("/");
1396
- if (paths[parentModule]) {
1397
- syms.splice(0, i, paths[parentModule]);
1398
- break;
1399
- } else if ((pkg = pkgs[parentModule])) {
1400
- //If module name is just the package name, then looking
1401
- //for the main module.
1402
- if (moduleName === pkg.name) {
1403
- pkgPath = pkg.location + '/' + pkg.main;
1404
- } else {
1405
- pkgPath = pkg.location;
1406
- }
1407
- syms.splice(0, i, pkgPath);
1408
- break;
1409
- }
1410
- }
1411
-
1412
- //Join the path parts together, then figure out if baseUrl is needed.
1413
- url = syms.join("/") + (ext || ".js");
1414
- url = (url.charAt(0) === '/' || url.match(/^\w+:/) ? "" : config.baseUrl) + url;
1415
- }
1416
-
1417
- return config.urlArgs ? url +
1418
- ((url.indexOf('?') === -1 ? '?' : '&') +
1419
- config.urlArgs) : url;
1420
- }
1421
- };
1422
-
1423
- //Make these visible on the context so can be called at the very
1424
- //end of the file to bootstrap
1425
- context.jQueryCheck = jQueryCheck;
1426
- context.resume = resume;
1427
-
1428
- return context;
1429
- }
1430
-
1431
- /**
1432
- * Main entry point.
1433
- *
1434
- * If the only argument to require is a string, then the module that
1435
- * is represented by that string is fetched for the appropriate context.
1436
- *
1437
- * If the first argument is an array, then it will be treated as an array
1438
- * of dependency string names to fetch. An optional function callback can
1439
- * be specified to execute when all of those dependencies are available.
1440
- *
1441
- * Make a local req variable to help Caja compliance (it assumes things
1442
- * on a require that are not standardized), and to give a short
1443
- * name for minification/local scope use.
1444
- */
1445
- req = requirejs = function (deps, callback) {
1446
-
1447
- //Find the right context, use default
1448
- var contextName = defContextName,
1449
- context, config;
1450
-
1451
- // Determine if have config object in the call.
1452
- if (!isArray(deps) && typeof deps !== "string") {
1453
- // deps is a config object
1454
- config = deps;
1455
- if (isArray(callback)) {
1456
- // Adjust args if there are dependencies
1457
- deps = callback;
1458
- callback = arguments[2];
1459
- } else {
1460
- deps = [];
1461
- }
1462
- }
1463
-
1464
- if (config && config.context) {
1465
- contextName = config.context;
1466
- }
1467
-
1468
- context = contexts[contextName] ||
1469
- (contexts[contextName] = newContext(contextName));
1470
-
1471
- if (config) {
1472
- context.configure(config);
1473
- }
1474
-
1475
- return context.require(deps, callback);
1476
- };
1477
-
1478
- /**
1479
- * Export require as a global, but only if it does not already exist.
1480
- */
1481
- if (typeof require === "undefined") {
1482
- require = req;
1483
- }
1484
-
1485
- /**
1486
- * Global require.toUrl(), to match global require, mostly useful
1487
- * for debugging/work in the global space.
1488
- */
1489
- req.toUrl = function (moduleNamePlusExt) {
1490
- return contexts[defContextName].toUrl(moduleNamePlusExt);
1491
- };
1492
-
1493
- req.version = version;
1494
- req.isArray = isArray;
1495
- req.isFunction = isFunction;
1496
- req.mixin = mixin;
1497
- //Used to filter out dependencies that are already paths.
1498
- req.jsExtRegExp = /^\/|:|\?|\.js$/;
1499
- s = req.s = {
1500
- contexts: contexts,
1501
- //Stores a list of URLs that should not get async script tag treatment.
1502
- skipAsync: {},
1503
- isPageLoaded: !isBrowser,
1504
- readyCalls: []
1505
- };
1506
-
1507
- req.isAsync = req.isBrowser = isBrowser;
1508
- if (isBrowser) {
1509
- head = s.head = document.getElementsByTagName("head")[0];
1510
- //If BASE tag is in play, using appendChild is a problem for IE6.
1511
- //When that browser dies, this can be removed. Details in this jQuery bug:
1512
- //http://dev.jquery.com/ticket/2709
1513
- baseElement = document.getElementsByTagName("base")[0];
1514
- if (baseElement) {
1515
- head = s.head = baseElement.parentNode;
1516
- }
1517
- }
1518
-
1519
- /**
1520
- * Any errors that require explicitly generates will be passed to this
1521
- * function. Intercept/override it if you want custom error handling.
1522
- * @param {Error} err the error object.
1523
- */
1524
- req.onError = function (err) {
1525
- throw err;
1526
- };
1527
-
1528
- /**
1529
- * Does the request to load a module for the browser case.
1530
- * Make this a separate function to allow other environments
1531
- * to override it.
1532
- *
1533
- * @param {Object} context the require context to find state.
1534
- * @param {String} moduleName the name of the module.
1535
- * @param {Object} url the URL to the module.
1536
- */
1537
- req.load = function (context, moduleName, url) {
1538
- var loaded = context.loaded;
1539
-
1540
- isDone = false;
1541
-
1542
- //Only set loaded to false for tracking if it has not already been set.
1543
- if (!loaded[moduleName]) {
1544
- loaded[moduleName] = false;
1545
- }
1546
-
1547
- context.scriptCount += 1;
1548
- req.attach(url, context, moduleName);
1549
-
1550
- //If tracking a jQuery, then make sure its ready callbacks
1551
- //are put on hold to prevent its ready callbacks from
1552
- //triggering too soon.
1553
- if (context.jQuery && !context.jQueryIncremented) {
1554
- jQueryHoldReady(context.jQuery, true);
1555
- context.jQueryIncremented = true;
1556
- }
1557
- };
1558
-
1559
- function getInteractiveScript() {
1560
- var scripts, i, script;
1561
- if (interactiveScript && interactiveScript.readyState === 'interactive') {
1562
- return interactiveScript;
1563
- }
1564
-
1565
- scripts = document.getElementsByTagName('script');
1566
- for (i = scripts.length - 1; i > -1 && (script = scripts[i]); i--) {
1567
- if (script.readyState === 'interactive') {
1568
- return (interactiveScript = script);
1569
- }
1570
- }
1571
-
1572
- return null;
1573
- }
1574
-
1575
- /**
1576
- * The function that handles definitions of modules. Differs from
1577
- * require() in that a string for the module should be the first argument,
1578
- * and the function to execute after dependencies are loaded should
1579
- * return a value to define the module corresponding to the first argument's
1580
- * name.
1581
- */
1582
- define = req.def = function (name, deps, callback) {
1583
- var node, context;
1584
-
1585
- //Allow for anonymous functions
1586
- if (typeof name !== 'string') {
1587
- //Adjust args appropriately
1588
- callback = deps;
1589
- deps = name;
1590
- name = null;
1591
- }
1592
-
1593
- //This module may not have dependencies
1594
- if (!req.isArray(deps)) {
1595
- callback = deps;
1596
- deps = [];
1597
- }
1598
-
1599
- //If no name, and callback is a function, then figure out if it a
1600
- //CommonJS thing with dependencies.
1601
- if (!name && !deps.length && req.isFunction(callback)) {
1602
- //Remove comments from the callback string,
1603
- //look for require calls, and pull them into the dependencies,
1604
- //but only if there are function args.
1605
- if (callback.length) {
1606
- callback
1607
- .toString()
1608
- .replace(commentRegExp, "")
1609
- .replace(cjsRequireRegExp, function (match, dep) {
1610
- deps.push(dep);
1611
- });
1612
-
1613
- //May be a CommonJS thing even without require calls, but still
1614
- //could use exports, and module. Avoid doing exports and module
1615
- //work though if it just needs require.
1616
- //REQUIRES the function to expect the CommonJS variables in the
1617
- //order listed below.
1618
- deps = (callback.length === 1 ? ["require"] : ["require", "exports", "module"]).concat(deps);
1619
- }
1620
- }
1621
-
1622
- //If in IE 6-8 and hit an anonymous define() call, do the interactive
1623
- //work.
1624
- if (useInteractive) {
1625
- node = currentlyAddingScript || getInteractiveScript();
1626
- if (!node) {
1627
- return req.onError(makeError("interactive", "No matching script interactive for " + callback));
1628
- }
1629
- if (!name) {
1630
- name = node.getAttribute("data-requiremodule");
1631
- }
1632
- context = contexts[node.getAttribute("data-requirecontext")];
1633
- }
1634
-
1635
- //Always save off evaluating the def call until the script onload handler.
1636
- //This allows multiple modules to be in a file without prematurely
1637
- //tracing dependencies, and allows for anonymous module support,
1638
- //where the module name is not known until the script onload event
1639
- //occurs. If no context, use the global queue, and get it processed
1640
- //in the onscript load callback.
1641
- (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
1642
-
1643
- return undefined;
1644
- };
1645
-
1646
- define.amd = {
1647
- multiversion: true,
1648
- plugins: true,
1649
- jQuery: true
1650
- };
1651
-
1652
- /**
1653
- * Executes the text. Normally just uses eval, but can be modified
1654
- * to use a more environment specific call.
1655
- * @param {String} text the text to execute/evaluate.
1656
- */
1657
- req.exec = function (text) {
1658
- return eval(text);
1659
- };
1660
-
1661
- /**
1662
- * Executes a module callack function. Broken out as a separate function
1663
- * solely to allow the build system to sequence the files in the built
1664
- * layer in the right sequence.
1665
- *
1666
- * @private
1667
- */
1668
- req.execCb = function (name, callback, args, exports) {
1669
- return callback.apply(exports, args);
1670
- };
1671
-
1672
- /**
1673
- * callback for script loads, used to check status of loading.
1674
- *
1675
- * @param {Event} evt the event from the browser for the script
1676
- * that was loaded.
1677
- *
1678
- * @private
1679
- */
1680
- req.onScriptLoad = function (evt) {
1681
- //Using currentTarget instead of target for Firefox 2.0's sake. Not
1682
- //all old browsers will be supported, but this one was easy enough
1683
- //to support and still makes sense.
1684
- var node = evt.currentTarget || evt.srcElement, contextName, moduleName,
1685
- context;
1686
-
1687
- if (evt.type === "load" || readyRegExp.test(node.readyState)) {
1688
- //Reset interactive script so a script node is not held onto for
1689
- //to long.
1690
- interactiveScript = null;
1691
-
1692
- //Pull out the name of the module and the context.
1693
- contextName = node.getAttribute("data-requirecontext");
1694
- moduleName = node.getAttribute("data-requiremodule");
1695
- context = contexts[contextName];
1696
-
1697
- contexts[contextName].completeLoad(moduleName);
1698
-
1699
- //Clean up script binding. Favor detachEvent because of IE9
1700
- //issue, see attachEvent/addEventListener comment elsewhere
1701
- //in this file.
1702
- if (node.detachEvent && !isOpera) {
1703
- //Probably IE. If not it will throw an error, which will be
1704
- //useful to know.
1705
- node.detachEvent("onreadystatechange", req.onScriptLoad);
1706
- } else {
1707
- node.removeEventListener("load", req.onScriptLoad, false);
1708
- }
1709
- }
1710
- };
1711
-
1712
- /**
1713
- * Attaches the script represented by the URL to the current
1714
- * environment. Right now only supports browser loading,
1715
- * but can be redefined in other environments to do the right thing.
1716
- * @param {String} url the url of the script to attach.
1717
- * @param {Object} context the context that wants the script.
1718
- * @param {moduleName} the name of the module that is associated with the script.
1719
- * @param {Function} [callback] optional callback, defaults to require.onScriptLoad
1720
- * @param {String} [type] optional type, defaults to text/javascript
1721
- */
1722
- req.attach = function (url, context, moduleName, callback, type) {
1723
- var node, loaded;
1724
- if (isBrowser) {
1725
- //In the browser so use a script tag
1726
- callback = callback || req.onScriptLoad;
1727
- node = context && context.config && context.config.xhtml ?
1728
- document.createElementNS("http://www.w3.org/1999/xhtml", "html:script") :
1729
- document.createElement("script");
1730
- node.type = type || "text/javascript";
1731
- node.charset = "utf-8";
1732
- //Use async so Gecko does not block on executing the script if something
1733
- //like a long-polling comet tag is being run first. Gecko likes
1734
- //to evaluate scripts in DOM order, even for dynamic scripts.
1735
- //It will fetch them async, but only evaluate the contents in DOM
1736
- //order, so a long-polling script tag can delay execution of scripts
1737
- //after it. But telling Gecko we expect async gets us the behavior
1738
- //we want -- execute it whenever it is finished downloading. Only
1739
- //Helps Firefox 3.6+
1740
- //Allow some URLs to not be fetched async. Mostly helps the order!
1741
- //plugin
1742
- node.async = !s.skipAsync[url];
1743
-
1744
- if (context) {
1745
- node.setAttribute("data-requirecontext", context.contextName);
1746
- }
1747
- node.setAttribute("data-requiremodule", moduleName);
1748
-
1749
- //Set up load listener. Test attachEvent first because IE9 has
1750
- //a subtle issue in its addEventListener and script onload firings
1751
- //that do not match the behavior of all other browsers with
1752
- //addEventListener support, which fire the onload event for a
1753
- //script right after the script execution. See:
1754
- //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
1755
- //UNFORTUNATELY Opera implements attachEvent but does not follow the script
1756
- //script execution mode.
1757
- if (node.attachEvent && !isOpera) {
1758
- //Probably IE. IE (at least 6-8) do not fire
1759
- //script onload right after executing the script, so
1760
- //we cannot tie the anonymous define call to a name.
1761
- //However, IE reports the script as being in "interactive"
1762
- //readyState at the time of the define call.
1763
- useInteractive = true;
1764
- node.attachEvent("onreadystatechange", callback);
1765
- } else {
1766
- node.addEventListener("load", callback, false);
1767
- }
1768
- node.src = url;
1769
-
1770
- //For some cache cases in IE 6-8, the script executes before the end
1771
- //of the appendChild execution, so to tie an anonymous define
1772
- //call to the module name (which is stored on the node), hold on
1773
- //to a reference to this node, but clear after the DOM insertion.
1774
- currentlyAddingScript = node;
1775
- if (baseElement) {
1776
- head.insertBefore(node, baseElement);
1777
- } else {
1778
- head.appendChild(node);
1779
- }
1780
- currentlyAddingScript = null;
1781
- return node;
1782
- } else if (isWebWorker) {
1783
- //In a web worker, use importScripts. This is not a very
1784
- //efficient use of importScripts, importScripts will block until
1785
- //its script is downloaded and evaluated. However, if web workers
1786
- //are in play, the expectation that a build has been done so that
1787
- //only one script needs to be loaded anyway. This may need to be
1788
- //reevaluated if other use cases become common.
1789
- loaded = context.loaded;
1790
- loaded[moduleName] = false;
1791
-
1792
- importScripts(url);
1793
-
1794
- //Account for anonymous modules
1795
- context.completeLoad(moduleName);
1796
- }
1797
- return null;
1798
- };
1799
-
1800
- //Look for a data-main script attribute, which could also adjust the baseUrl.
1801
- if (isBrowser) {
1802
- //Figure out baseUrl. Get it from the script tag with require.js in it.
1803
- scripts = document.getElementsByTagName("script");
1804
-
1805
- for (i = scripts.length - 1; i > -1 && (script = scripts[i]); i--) {
1806
- //Set the "head" where we can append children by
1807
- //using the script's parent.
1808
- if (!head) {
1809
- head = script.parentNode;
1810
- }
1811
-
1812
- //Look for a data-main attribute to set main script for the page
1813
- //to load. If it is there, the path to data main becomes the
1814
- //baseUrl, if it is not already set.
1815
- if ((dataMain = script.getAttribute('data-main'))) {
1816
- if (!cfg.baseUrl) {
1817
- //Pull off the directory of data-main for use as the
1818
- //baseUrl.
1819
- src = dataMain.split('/');
1820
- mainScript = src.pop();
1821
- subPath = src.length ? src.join('/') + '/' : './';
1822
-
1823
- //Set final config.
1824
- cfg.baseUrl = subPath;
1825
- //Strip off any trailing .js since dataMain is now
1826
- //like a module name.
1827
- dataMain = mainScript.replace(jsSuffixRegExp, '');
1828
- }
1829
-
1830
- //Put the data-main script in the files to load.
1831
- cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];
1832
-
1833
- break;
1834
- }
1835
- }
1836
- }
1837
-
1838
- //Set baseUrl based on config.
1839
- s.baseUrl = cfg.baseUrl;
1840
-
1841
- //****** START page load functionality ****************
1842
- /**
1843
- * Sets the page as loaded and triggers check for all modules loaded.
1844
- */
1845
- req.pageLoaded = function () {
1846
- if (!s.isPageLoaded) {
1847
- s.isPageLoaded = true;
1848
- if (scrollIntervalId) {
1849
- clearInterval(scrollIntervalId);
1850
- }
1851
-
1852
- //Part of a fix for FF < 3.6 where readyState was not set to
1853
- //complete so libraries like jQuery that check for readyState
1854
- //after page load where not getting initialized correctly.
1855
- //Original approach suggested by Andrea Giammarchi:
1856
- //http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
1857
- //see other setReadyState reference for the rest of the fix.
1858
- if (setReadyState) {
1859
- document.readyState = "complete";
1860
- }
1861
-
1862
- req.callReady();
1863
- }
1864
- };
1865
-
1866
- //See if there is nothing waiting across contexts, and if not, trigger
1867
- //callReady.
1868
- req.checkReadyState = function () {
1869
- var contexts = s.contexts, prop;
1870
- for (prop in contexts) {
1871
- if (!(prop in empty)) {
1872
- if (contexts[prop].waitCount) {
1873
- return;
1874
- }
1875
- }
1876
- }
1877
- s.isDone = true;
1878
- req.callReady();
1879
- };
1880
-
1881
- /**
1882
- * Internal function that calls back any ready functions. If you are
1883
- * integrating RequireJS with another library without require.ready support,
1884
- * you can define this method to call your page ready code instead.
1885
- */
1886
- req.callReady = function () {
1887
- var callbacks = s.readyCalls, i, callback, contexts, context, prop;
1888
-
1889
- if (s.isPageLoaded && s.isDone) {
1890
- if (callbacks.length) {
1891
- s.readyCalls = [];
1892
- for (i = 0; (callback = callbacks[i]); i++) {
1893
- callback();
1894
- }
1895
- }
1896
-
1897
- //If jQuery with DOM ready delayed, release it now.
1898
- contexts = s.contexts;
1899
- for (prop in contexts) {
1900
- if (!(prop in empty)) {
1901
- context = contexts[prop];
1902
- if (context.jQueryIncremented) {
1903
- jQueryHoldReady(context.jQuery, false);
1904
- context.jQueryIncremented = false;
1905
- }
1906
- }
1907
- }
1908
- }
1909
- };
1910
-
1911
- /**
1912
- * Registers functions to call when the page is loaded
1913
- */
1914
- req.ready = function (callback) {
1915
- if (s.isPageLoaded && s.isDone) {
1916
- callback();
1917
- } else {
1918
- s.readyCalls.push(callback);
1919
- }
1920
- return req;
1921
- };
1922
-
1923
- if (isBrowser) {
1924
- if (document.addEventListener) {
1925
- //Standards. Hooray! Assumption here that if standards based,
1926
- //it knows about DOMContentLoaded.
1927
- document.addEventListener("DOMContentLoaded", req.pageLoaded, false);
1928
- window.addEventListener("load", req.pageLoaded, false);
1929
- //Part of FF < 3.6 readystate fix (see setReadyState refs for more info)
1930
- if (!document.readyState) {
1931
- setReadyState = true;
1932
- document.readyState = "loading";
1933
- }
1934
- } else if (window.attachEvent) {
1935
- window.attachEvent("onload", req.pageLoaded);
1936
-
1937
- //DOMContentLoaded approximation, as found by Diego Perini:
1938
- //http://javascript.nwbox.com/IEContentLoaded/
1939
- if (self === self.top) {
1940
- scrollIntervalId = setInterval(function () {
1941
- try {
1942
- //From this ticket:
1943
- //http://bugs.dojotoolkit.org/ticket/11106,
1944
- //In IE HTML Application (HTA), such as in a selenium test,
1945
- //javascript in the iframe can't see anything outside
1946
- //of it, so self===self.top is true, but the iframe is
1947
- //not the top window and doScroll will be available
1948
- //before document.body is set. Test document.body
1949
- //before trying the doScroll trick.
1950
- if (document.body) {
1951
- document.documentElement.doScroll("left");
1952
- req.pageLoaded();
1953
- }
1954
- } catch (e) {}
1955
- }, 30);
1956
- }
1957
- }
1958
-
1959
- //Check if document already complete, and if so, just trigger page load
1960
- //listeners. NOTE: does not work with Firefox before 3.6. To support
1961
- //those browsers, manually call require.pageLoaded().
1962
- if (document.readyState === "complete") {
1963
- req.pageLoaded();
1964
- }
1965
- }
1966
- //****** END page load functionality ****************
1967
-
1968
- //Set up default context. If require was a configuration object, use that as base config.
1969
- req(cfg);
1970
-
1971
- //If modules are built into require.js, then need to make sure dependencies are
1972
- //traced. Use a setTimeout in the browser world, to allow all the modules to register
1973
- //themselves. In a non-browser env, assume that modules are not built into require.js,
1974
- //which seems odd to do on the server.
1975
- if (req.isAsync && typeof setTimeout !== "undefined") {
1976
- ctx = s.contexts[(cfg.context || defContextName)];
1977
- //Indicate that the script that includes require() is still loading,
1978
- //so that require()'d dependencies are not traced until the end of the
1979
- //file is parsed (approximated via the setTimeout call).
1980
- ctx.requireWait = true;
1981
- setTimeout(function () {
1982
- ctx.requireWait = false;
1983
-
1984
- //Any modules included with the require.js file will be in the
1985
- //global queue, assign them to this context.
1986
- ctx.takeGlobalQueue();
1987
-
1988
- //Allow for jQuery to be loaded/already in the page, and if jQuery 1.4.3,
1989
- //make sure to hold onto it for readyWait triggering.
1990
- ctx.jQueryCheck();
1991
-
1992
- if (!ctx.scriptCount) {
1993
- ctx.resume();
1994
- }
1995
- req.checkReadyState();
1996
- }, 0);
1997
- }
1998
- }());