extjs-rails 4.1.0.alpha1

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 (517) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +36 -0
  4. data/README.md +29 -0
  5. data/Rakefile +2 -0
  6. data/app/assets/javascripts/extjs-rails/extjs-rails.js +1 -0
  7. data/app/assets/javascripts/extjs-rails/index.js.erb +9 -0
  8. data/app/assets/javascripts/extjs-rails/sdk.jsb3 +2017 -0
  9. data/app/assets/javascripts/extjs-rails/src/AbstractComponent.js +3290 -0
  10. data/app/assets/javascripts/extjs-rails/src/AbstractManager.js +144 -0
  11. data/app/assets/javascripts/extjs-rails/src/AbstractPlugin.js +72 -0
  12. data/app/assets/javascripts/extjs-rails/src/Action.js +276 -0
  13. data/app/assets/javascripts/extjs-rails/src/Ajax.js +99 -0
  14. data/app/assets/javascripts/extjs-rails/src/Component.js +1344 -0
  15. data/app/assets/javascripts/extjs-rails/src/ComponentLoader.js +202 -0
  16. data/app/assets/javascripts/extjs-rails/src/ComponentManager.js +47 -0
  17. data/app/assets/javascripts/extjs-rails/src/ComponentQuery.js +521 -0
  18. data/app/assets/javascripts/extjs-rails/src/Editor.js +494 -0
  19. data/app/assets/javascripts/extjs-rails/src/ElementLoader.js +404 -0
  20. data/app/assets/javascripts/extjs-rails/src/FocusManager.js +712 -0
  21. data/app/assets/javascripts/extjs-rails/src/Img.js +111 -0
  22. data/app/assets/javascripts/extjs-rails/src/Layer.js +543 -0
  23. data/app/assets/javascripts/extjs-rails/src/LoadMask.js +432 -0
  24. data/app/assets/javascripts/extjs-rails/src/ModelManager.js +186 -0
  25. data/app/assets/javascripts/extjs-rails/src/PluginManager.js +110 -0
  26. data/app/assets/javascripts/extjs-rails/src/ProgressBar.js +336 -0
  27. data/app/assets/javascripts/extjs-rails/src/Shadow.js +233 -0
  28. data/app/assets/javascripts/extjs-rails/src/ShadowPool.js +43 -0
  29. data/app/assets/javascripts/extjs-rails/src/Template.js +331 -0
  30. data/app/assets/javascripts/extjs-rails/src/XTemplate.js +365 -0
  31. data/app/assets/javascripts/extjs-rails/src/XTemplateCompiler.js +450 -0
  32. data/app/assets/javascripts/extjs-rails/src/XTemplateParser.js +249 -0
  33. data/app/assets/javascripts/extjs-rails/src/ZIndexManager.js +519 -0
  34. data/app/assets/javascripts/extjs-rails/src/app/Application.js +271 -0
  35. data/app/assets/javascripts/extjs-rails/src/app/Controller.js +458 -0
  36. data/app/assets/javascripts/extjs-rails/src/app/EventBus.js +112 -0
  37. data/app/assets/javascripts/extjs-rails/src/button/Button.js +1483 -0
  38. data/app/assets/javascripts/extjs-rails/src/button/Cycle.js +215 -0
  39. data/app/assets/javascripts/extjs-rails/src/button/Split.js +99 -0
  40. data/app/assets/javascripts/extjs-rails/src/chart/Callout.js +140 -0
  41. data/app/assets/javascripts/extjs-rails/src/chart/Chart.js +966 -0
  42. data/app/assets/javascripts/extjs-rails/src/chart/Highlight.js +172 -0
  43. data/app/assets/javascripts/extjs-rails/src/chart/Label.js +241 -0
  44. data/app/assets/javascripts/extjs-rails/src/chart/Legend.js +474 -0
  45. data/app/assets/javascripts/extjs-rails/src/chart/LegendItem.js +217 -0
  46. data/app/assets/javascripts/extjs-rails/src/chart/Mask.js +230 -0
  47. data/app/assets/javascripts/extjs-rails/src/chart/MaskLayer.js +48 -0
  48. data/app/assets/javascripts/extjs-rails/src/chart/Navigation.js +79 -0
  49. data/app/assets/javascripts/extjs-rails/src/chart/Shape.js +106 -0
  50. data/app/assets/javascripts/extjs-rails/src/chart/Tip.js +98 -0
  51. data/app/assets/javascripts/extjs-rails/src/chart/TipSurface.js +42 -0
  52. data/app/assets/javascripts/extjs-rails/src/chart/axis/Abstract.js +73 -0
  53. data/app/assets/javascripts/extjs-rails/src/chart/axis/Axis.js +961 -0
  54. data/app/assets/javascripts/extjs-rails/src/chart/axis/Category.js +130 -0
  55. data/app/assets/javascripts/extjs-rails/src/chart/axis/Gauge.js +203 -0
  56. data/app/assets/javascripts/extjs-rails/src/chart/axis/Numeric.js +235 -0
  57. data/app/assets/javascripts/extjs-rails/src/chart/axis/Radial.js +204 -0
  58. data/app/assets/javascripts/extjs-rails/src/chart/axis/Time.js +135 -0
  59. data/app/assets/javascripts/extjs-rails/src/chart/series/Area.js +803 -0
  60. data/app/assets/javascripts/extjs-rails/src/chart/series/Bar.js +853 -0
  61. data/app/assets/javascripts/extjs-rails/src/chart/series/Cartesian.js +328 -0
  62. data/app/assets/javascripts/extjs-rails/src/chart/series/Column.js +104 -0
  63. data/app/assets/javascripts/extjs-rails/src/chart/series/Gauge.js +490 -0
  64. data/app/assets/javascripts/extjs-rails/src/chart/series/Line.js +1104 -0
  65. data/app/assets/javascripts/extjs-rails/src/chart/series/Pie.js +1072 -0
  66. data/app/assets/javascripts/extjs-rails/src/chart/series/Radar.js +440 -0
  67. data/app/assets/javascripts/extjs-rails/src/chart/series/Scatter.js +668 -0
  68. data/app/assets/javascripts/extjs-rails/src/chart/series/Series.js +443 -0
  69. data/app/assets/javascripts/extjs-rails/src/chart/theme/Base.js +175 -0
  70. data/app/assets/javascripts/extjs-rails/src/chart/theme/Theme.js +253 -0
  71. data/app/assets/javascripts/extjs-rails/src/container/AbstractContainer.js +1062 -0
  72. data/app/assets/javascripts/extjs-rails/src/container/ButtonGroup.js +143 -0
  73. data/app/assets/javascripts/extjs-rails/src/container/Container.js +212 -0
  74. data/app/assets/javascripts/extjs-rails/src/container/DockingContainer.js +265 -0
  75. data/app/assets/javascripts/extjs-rails/src/container/Viewport.js +184 -0
  76. data/app/assets/javascripts/extjs-rails/src/core/dom/Element.form.js +50 -0
  77. data/app/assets/javascripts/extjs-rails/src/core/dom/Element.static-more.js +159 -0
  78. data/app/assets/javascripts/extjs-rails/src/core/examples/index.html +321 -0
  79. data/app/assets/javascripts/extjs-rails/src/core/examples/index.js +6 -0
  80. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CTO.js +25 -0
  81. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CoolGuy.js +20 -0
  82. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Developer.js +43 -0
  83. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Gun.js +3 -0
  84. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/HumanResource.js +23 -0
  85. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Musician.js +20 -0
  86. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Person.js +50 -0
  87. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanComposeSongs.js +9 -0
  88. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanPlayGuitar.js +9 -0
  89. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanSing.js +18 -0
  90. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/A.js +3 -0
  91. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/B.js +3 -0
  92. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/C.js +3 -0
  93. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/D.js +3 -0
  94. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/E.js +3 -0
  95. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/A.js +3 -0
  96. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/B.js +4 -0
  97. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/C.js +3 -0
  98. data/app/assets/javascripts/extjs-rails/src/core/src/EventManager.js +1167 -0
  99. data/app/assets/javascripts/extjs-rails/src/core/src/EventObject.js +883 -0
  100. data/app/assets/javascripts/extjs-rails/src/core/src/Ext-more.js +1283 -0
  101. data/app/assets/javascripts/extjs-rails/src/core/src/Ext.js +736 -0
  102. data/app/assets/javascripts/extjs-rails/src/core/src/Support.js +662 -0
  103. data/app/assets/javascripts/extjs-rails/src/core/src/class/Base.js +1085 -0
  104. data/app/assets/javascripts/extjs-rails/src/core/src/class/Class.js +676 -0
  105. data/app/assets/javascripts/extjs-rails/src/core/src/class/ClassManager.js +1591 -0
  106. data/app/assets/javascripts/extjs-rails/src/core/src/class/Loader.js +1423 -0
  107. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.alignment.js +173 -0
  108. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.insertion.js +193 -0
  109. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.js +681 -0
  110. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.position.js +356 -0
  111. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.static.js +474 -0
  112. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.style.js +851 -0
  113. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.traversal.js +180 -0
  114. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractHelper.js +291 -0
  115. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractQuery.js +72 -0
  116. data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElement.js +75 -0
  117. data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElementLite.js +436 -0
  118. data/app/assets/javascripts/extjs-rails/src/core/src/dom/DomQuery-aria.js +1049 -0
  119. data/app/assets/javascripts/extjs-rails/src/core/src/env/Browser.js +186 -0
  120. data/app/assets/javascripts/extjs-rails/src/core/src/env/FeatureDetector.js +274 -0
  121. data/app/assets/javascripts/extjs-rails/src/core/src/env/OS.js +141 -0
  122. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Array.js +1205 -0
  123. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Date.js +1463 -0
  124. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Error.js +326 -0
  125. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Function.js +485 -0
  126. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Number.js +175 -0
  127. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Object.js +606 -0
  128. data/app/assets/javascripts/extjs-rails/src/core/src/lang/String.js +333 -0
  129. data/app/assets/javascripts/extjs-rails/src/core/src/misc/JSON.js +236 -0
  130. data/app/assets/javascripts/extjs-rails/src/core/src/perf/Accumulator.js +244 -0
  131. data/app/assets/javascripts/extjs-rails/src/core/src/perf/Monitor.js +197 -0
  132. data/app/assets/javascripts/extjs-rails/src/core/src/util/DelayedTask.js +71 -0
  133. data/app/assets/javascripts/extjs-rails/src/core/src/util/Event.js +215 -0
  134. data/app/assets/javascripts/extjs-rails/src/core/src/util/Format.js +551 -0
  135. data/app/assets/javascripts/extjs-rails/src/core/src/util/TaskManager.js +417 -0
  136. data/app/assets/javascripts/extjs-rails/src/core/src/version/Version.js +364 -0
  137. data/app/assets/javascripts/extjs-rails/src/core/test/unit/README.MD +91 -0
  138. data/app/assets/javascripts/extjs-rails/src/core/test/unit/bootstrap.js +39 -0
  139. data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build-data.js +34 -0
  140. data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build.sh +2 -0
  141. data/app/assets/javascripts/extjs-rails/src/core/test/unit/data.js +27 -0
  142. data/app/assets/javascripts/extjs-rails/src/core/test/unit/index.html +15 -0
  143. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom.html +40 -0
  144. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/extjs-api.js +12 -0
  145. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/platform-api.js +134 -0
  146. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/sanity.js +4 -0
  147. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api-out.js +128 -0
  148. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api.js +89 -0
  149. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/env/Environment.js +357 -0
  150. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/APITest.js +37 -0
  151. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/jsb3.js +14 -0
  152. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/test-setup.js +137 -0
  153. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/EventManager.js +629 -0
  154. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-mess.backup +198 -0
  155. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-more.js +520 -0
  156. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext.js +1550 -0
  157. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Support.js +250 -0
  158. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Base.js +47 -0
  159. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Class.js +561 -0
  160. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/ClassManager.js +555 -0
  161. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/CompositeElementLite.js +409 -0
  162. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/DomHelper.js +444 -0
  163. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.insertion.js +342 -0
  164. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.js +731 -0
  165. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.static.js +201 -0
  166. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.style.js +118 -0
  167. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.traversal.js +336 -0
  168. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Array.js +1229 -0
  169. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Date.js +697 -0
  170. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Error.js +277 -0
  171. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Function.js +536 -0
  172. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Number.js +323 -0
  173. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Object.js +591 -0
  174. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/String.js +451 -0
  175. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/misc/JSON.js +252 -0
  176. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/util/Format.js +521 -0
  177. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/version/Version.js +148 -0
  178. data/app/assets/javascripts/extjs-rails/src/core/test/unit/specs.html +19 -0
  179. data/app/assets/javascripts/extjs-rails/src/data/AbstractStore.js +887 -0
  180. data/app/assets/javascripts/extjs-rails/src/data/ArrayStore.js +74 -0
  181. data/app/assets/javascripts/extjs-rails/src/data/Batch.js +236 -0
  182. data/app/assets/javascripts/extjs-rails/src/data/BufferStore.js +13 -0
  183. data/app/assets/javascripts/extjs-rails/src/data/Connection.js +969 -0
  184. data/app/assets/javascripts/extjs-rails/src/data/DirectStore.js +50 -0
  185. data/app/assets/javascripts/extjs-rails/src/data/Errors.js +52 -0
  186. data/app/assets/javascripts/extjs-rails/src/data/Field.js +341 -0
  187. data/app/assets/javascripts/extjs-rails/src/data/IdGenerator.js +198 -0
  188. data/app/assets/javascripts/extjs-rails/src/data/JsonP.js +253 -0
  189. data/app/assets/javascripts/extjs-rails/src/data/JsonPStore.js +51 -0
  190. data/app/assets/javascripts/extjs-rails/src/data/JsonStore.js +60 -0
  191. data/app/assets/javascripts/extjs-rails/src/data/Model.js +1673 -0
  192. data/app/assets/javascripts/extjs-rails/src/data/NodeInterface.js +1294 -0
  193. data/app/assets/javascripts/extjs-rails/src/data/NodeStore.js +254 -0
  194. data/app/assets/javascripts/extjs-rails/src/data/Operation.js +331 -0
  195. data/app/assets/javascripts/extjs-rails/src/data/Request.js +40 -0
  196. data/app/assets/javascripts/extjs-rails/src/data/ResultSet.js +56 -0
  197. data/app/assets/javascripts/extjs-rails/src/data/SequentialIdGenerator.js +61 -0
  198. data/app/assets/javascripts/extjs-rails/src/data/SortTypes.js +125 -0
  199. data/app/assets/javascripts/extjs-rails/src/data/Store.js +2609 -0
  200. data/app/assets/javascripts/extjs-rails/src/data/StoreManager.js +156 -0
  201. data/app/assets/javascripts/extjs-rails/src/data/Tree.js +290 -0
  202. data/app/assets/javascripts/extjs-rails/src/data/TreeStore.js +655 -0
  203. data/app/assets/javascripts/extjs-rails/src/data/Types.js +190 -0
  204. data/app/assets/javascripts/extjs-rails/src/data/UuidGenerator.js +215 -0
  205. data/app/assets/javascripts/extjs-rails/src/data/XmlStore.js +76 -0
  206. data/app/assets/javascripts/extjs-rails/src/data/association/Association.js +243 -0
  207. data/app/assets/javascripts/extjs-rails/src/data/association/BelongsTo.js +291 -0
  208. data/app/assets/javascripts/extjs-rails/src/data/association/HasMany.js +289 -0
  209. data/app/assets/javascripts/extjs-rails/src/data/association/HasOne.js +304 -0
  210. data/app/assets/javascripts/extjs-rails/src/data/proxy/Ajax.js +282 -0
  211. data/app/assets/javascripts/extjs-rails/src/data/proxy/Client.js +21 -0
  212. data/app/assets/javascripts/extjs-rails/src/data/proxy/Direct.js +181 -0
  213. data/app/assets/javascripts/extjs-rails/src/data/proxy/JsonP.js +313 -0
  214. data/app/assets/javascripts/extjs-rails/src/data/proxy/LocalStorage.js +69 -0
  215. data/app/assets/javascripts/extjs-rails/src/data/proxy/Memory.js +156 -0
  216. data/app/assets/javascripts/extjs-rails/src/data/proxy/Proxy.js +433 -0
  217. data/app/assets/javascripts/extjs-rails/src/data/proxy/Rest.js +173 -0
  218. data/app/assets/javascripts/extjs-rails/src/data/proxy/Server.js +460 -0
  219. data/app/assets/javascripts/extjs-rails/src/data/proxy/SessionStorage.js +39 -0
  220. data/app/assets/javascripts/extjs-rails/src/data/proxy/WebStorage.js +546 -0
  221. data/app/assets/javascripts/extjs-rails/src/data/reader/Array.js +68 -0
  222. data/app/assets/javascripts/extjs-rails/src/data/reader/Json.js +383 -0
  223. data/app/assets/javascripts/extjs-rails/src/data/reader/Reader.js +735 -0
  224. data/app/assets/javascripts/extjs-rails/src/data/reader/Xml.js +292 -0
  225. data/app/assets/javascripts/extjs-rails/src/data/validations.js +149 -0
  226. data/app/assets/javascripts/extjs-rails/src/data/writer/Json.js +81 -0
  227. data/app/assets/javascripts/extjs-rails/src/data/writer/Writer.js +147 -0
  228. data/app/assets/javascripts/extjs-rails/src/data/writer/Xml.js +88 -0
  229. data/app/assets/javascripts/extjs-rails/src/dd/DD.js +300 -0
  230. data/app/assets/javascripts/extjs-rails/src/dd/DDProxy.js +204 -0
  231. data/app/assets/javascripts/extjs-rails/src/dd/DDTarget.js +171 -0
  232. data/app/assets/javascripts/extjs-rails/src/dd/DragDrop.js +1101 -0
  233. data/app/assets/javascripts/extjs-rails/src/dd/DragDropManager.js +1264 -0
  234. data/app/assets/javascripts/extjs-rails/src/dd/DragSource.js +392 -0
  235. data/app/assets/javascripts/extjs-rails/src/dd/DragTracker.js +562 -0
  236. data/app/assets/javascripts/extjs-rails/src/dd/DragZone.js +137 -0
  237. data/app/assets/javascripts/extjs-rails/src/dd/DropTarget.js +118 -0
  238. data/app/assets/javascripts/extjs-rails/src/dd/DropZone.js +254 -0
  239. data/app/assets/javascripts/extjs-rails/src/dd/Registry.js +117 -0
  240. data/app/assets/javascripts/extjs-rails/src/dd/ScrollManager.js +218 -0
  241. data/app/assets/javascripts/extjs-rails/src/dd/StatusProxy.js +179 -0
  242. data/app/assets/javascripts/extjs-rails/src/diag/layout/Context.js +523 -0
  243. data/app/assets/javascripts/extjs-rails/src/diag/layout/ContextItem.js +179 -0
  244. data/app/assets/javascripts/extjs-rails/src/direct/Event.js +35 -0
  245. data/app/assets/javascripts/extjs-rails/src/direct/ExceptionEvent.js +16 -0
  246. data/app/assets/javascripts/extjs-rails/src/direct/JsonProvider.js +82 -0
  247. data/app/assets/javascripts/extjs-rails/src/direct/Manager.js +263 -0
  248. data/app/assets/javascripts/extjs-rails/src/direct/PollingProvider.js +156 -0
  249. data/app/assets/javascripts/extjs-rails/src/direct/Provider.js +96 -0
  250. data/app/assets/javascripts/extjs-rails/src/direct/RemotingEvent.js +24 -0
  251. data/app/assets/javascripts/extjs-rails/src/direct/RemotingMethod.js +100 -0
  252. data/app/assets/javascripts/extjs-rails/src/direct/RemotingProvider.js +510 -0
  253. data/app/assets/javascripts/extjs-rails/src/direct/Transaction.js +41 -0
  254. data/app/assets/javascripts/extjs-rails/src/dom/Element.alignment.js +378 -0
  255. data/app/assets/javascripts/extjs-rails/src/dom/Element.anim.js +962 -0
  256. data/app/assets/javascripts/extjs-rails/src/dom/Element.dd.js +40 -0
  257. data/app/assets/javascripts/extjs-rails/src/dom/Element.fx.js +194 -0
  258. data/app/assets/javascripts/extjs-rails/src/dom/Element.js +1407 -0
  259. data/app/assets/javascripts/extjs-rails/src/dom/Element.position.js +501 -0
  260. data/app/assets/javascripts/extjs-rails/src/dom/Element.scroll.js +214 -0
  261. data/app/assets/javascripts/extjs-rails/src/dom/Element.style.js +792 -0
  262. data/app/assets/javascripts/extjs-rails/src/dom/Element.traversal.js +8 -0
  263. data/app/assets/javascripts/extjs-rails/src/dom/Helper.js +466 -0
  264. data/app/assets/javascripts/extjs-rails/src/dom/Query.js +1067 -0
  265. data/app/assets/javascripts/extjs-rails/src/draw/Color.js +303 -0
  266. data/app/assets/javascripts/extjs-rails/src/draw/Component.js +245 -0
  267. data/app/assets/javascripts/extjs-rails/src/draw/CompositeSprite.js +299 -0
  268. data/app/assets/javascripts/extjs-rails/src/draw/Draw.js +1217 -0
  269. data/app/assets/javascripts/extjs-rails/src/draw/Matrix.js +183 -0
  270. data/app/assets/javascripts/extjs-rails/src/draw/Sprite.js +554 -0
  271. data/app/assets/javascripts/extjs-rails/src/draw/SpriteDD.js +87 -0
  272. data/app/assets/javascripts/extjs-rails/src/draw/Surface.js +1001 -0
  273. data/app/assets/javascripts/extjs-rails/src/draw/Text.js +175 -0
  274. data/app/assets/javascripts/extjs-rails/src/draw/engine/ImageExporter.js +106 -0
  275. data/app/assets/javascripts/extjs-rails/src/draw/engine/Svg.js +734 -0
  276. data/app/assets/javascripts/extjs-rails/src/draw/engine/SvgExporter.js +280 -0
  277. data/app/assets/javascripts/extjs-rails/src/draw/engine/Vml.js +916 -0
  278. data/app/assets/javascripts/extjs-rails/src/flash/Component.js +248 -0
  279. data/app/assets/javascripts/extjs-rails/src/form/Basic.js +1018 -0
  280. data/app/assets/javascripts/extjs-rails/src/form/CheckboxGroup.js +441 -0
  281. data/app/assets/javascripts/extjs-rails/src/form/CheckboxManager.js +26 -0
  282. data/app/assets/javascripts/extjs-rails/src/form/FieldAncestor.js +210 -0
  283. data/app/assets/javascripts/extjs-rails/src/form/FieldContainer.js +290 -0
  284. data/app/assets/javascripts/extjs-rails/src/form/FieldSet.js +506 -0
  285. data/app/assets/javascripts/extjs-rails/src/form/Label.js +110 -0
  286. data/app/assets/javascripts/extjs-rails/src/form/Labelable.js +764 -0
  287. data/app/assets/javascripts/extjs-rails/src/form/Panel.js +335 -0
  288. data/app/assets/javascripts/extjs-rails/src/form/RadioGroup.js +124 -0
  289. data/app/assets/javascripts/extjs-rails/src/form/RadioManager.js +26 -0
  290. data/app/assets/javascripts/extjs-rails/src/form/action/Action.js +307 -0
  291. data/app/assets/javascripts/extjs-rails/src/form/action/DirectLoad.js +107 -0
  292. data/app/assets/javascripts/extjs-rails/src/form/action/DirectSubmit.js +119 -0
  293. data/app/assets/javascripts/extjs-rails/src/form/action/Load.js +120 -0
  294. data/app/assets/javascripts/extjs-rails/src/form/action/StandardSubmit.js +34 -0
  295. data/app/assets/javascripts/extjs-rails/src/form/action/Submit.js +257 -0
  296. data/app/assets/javascripts/extjs-rails/src/form/field/Base.js +813 -0
  297. data/app/assets/javascripts/extjs-rails/src/form/field/Checkbox.js +505 -0
  298. data/app/assets/javascripts/extjs-rails/src/form/field/ComboBox.js +1427 -0
  299. data/app/assets/javascripts/extjs-rails/src/form/field/Date.js +578 -0
  300. data/app/assets/javascripts/extjs-rails/src/form/field/Display.js +155 -0
  301. data/app/assets/javascripts/extjs-rails/src/form/field/Field.js +430 -0
  302. data/app/assets/javascripts/extjs-rails/src/form/field/File.js +265 -0
  303. data/app/assets/javascripts/extjs-rails/src/form/field/Hidden.js +75 -0
  304. data/app/assets/javascripts/extjs-rails/src/form/field/HtmlEditor.js +1439 -0
  305. data/app/assets/javascripts/extjs-rails/src/form/field/Number.js +380 -0
  306. data/app/assets/javascripts/extjs-rails/src/form/field/Picker.js +321 -0
  307. data/app/assets/javascripts/extjs-rails/src/form/field/Radio.js +279 -0
  308. data/app/assets/javascripts/extjs-rails/src/form/field/Spinner.js +321 -0
  309. data/app/assets/javascripts/extjs-rails/src/form/field/Text.js +727 -0
  310. data/app/assets/javascripts/extjs-rails/src/form/field/TextArea.js +228 -0
  311. data/app/assets/javascripts/extjs-rails/src/form/field/Time.js +459 -0
  312. data/app/assets/javascripts/extjs-rails/src/form/field/Trigger.js +469 -0
  313. data/app/assets/javascripts/extjs-rails/src/form/field/VTypes.js +172 -0
  314. data/app/assets/javascripts/extjs-rails/src/fx/Anim.js +472 -0
  315. data/app/assets/javascripts/extjs-rails/src/fx/Animator.js +410 -0
  316. data/app/assets/javascripts/extjs-rails/src/fx/CubicBezier.js +77 -0
  317. data/app/assets/javascripts/extjs-rails/src/fx/Easing.js +136 -0
  318. data/app/assets/javascripts/extjs-rails/src/fx/Manager.js +353 -0
  319. data/app/assets/javascripts/extjs-rails/src/fx/PropertyHandler.js +381 -0
  320. data/app/assets/javascripts/extjs-rails/src/fx/Queue.js +123 -0
  321. data/app/assets/javascripts/extjs-rails/src/fx/target/Component.js +118 -0
  322. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElement.js +46 -0
  323. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElementCSS.js +22 -0
  324. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeSprite.js +34 -0
  325. data/app/assets/javascripts/extjs-rails/src/fx/target/Element.js +83 -0
  326. data/app/assets/javascripts/extjs-rails/src/fx/target/ElementCSS.js +77 -0
  327. data/app/assets/javascripts/extjs-rails/src/fx/target/Sprite.js +128 -0
  328. data/app/assets/javascripts/extjs-rails/src/fx/target/Target.js +36 -0
  329. data/app/assets/javascripts/extjs-rails/src/grid/CellEditor.js +172 -0
  330. data/app/assets/javascripts/extjs-rails/src/grid/ColumnComponentLayout.js +34 -0
  331. data/app/assets/javascripts/extjs-rails/src/grid/ColumnLayout.js +201 -0
  332. data/app/assets/javascripts/extjs-rails/src/grid/Lockable.js +863 -0
  333. data/app/assets/javascripts/extjs-rails/src/grid/LockingView.js +169 -0
  334. data/app/assets/javascripts/extjs-rails/src/grid/PagingScroller.js +539 -0
  335. data/app/assets/javascripts/extjs-rails/src/grid/Panel.js +393 -0
  336. data/app/assets/javascripts/extjs-rails/src/grid/RowEditor.js +731 -0
  337. data/app/assets/javascripts/extjs-rails/src/grid/RowNumberer.js +76 -0
  338. data/app/assets/javascripts/extjs-rails/src/grid/Scroller.js +5 -0
  339. data/app/assets/javascripts/extjs-rails/src/grid/View.js +44 -0
  340. data/app/assets/javascripts/extjs-rails/src/grid/ViewDropZone.js +41 -0
  341. data/app/assets/javascripts/extjs-rails/src/grid/column/Action.js +318 -0
  342. data/app/assets/javascripts/extjs-rails/src/grid/column/Boolean.js +82 -0
  343. data/app/assets/javascripts/extjs-rails/src/grid/column/Column.js +835 -0
  344. data/app/assets/javascripts/extjs-rails/src/grid/column/Date.js +63 -0
  345. data/app/assets/javascripts/extjs-rails/src/grid/column/Number.js +52 -0
  346. data/app/assets/javascripts/extjs-rails/src/grid/column/Template.js +58 -0
  347. data/app/assets/javascripts/extjs-rails/src/grid/feature/AbstractSummary.js +154 -0
  348. data/app/assets/javascripts/extjs-rails/src/grid/feature/Chunking.js +77 -0
  349. data/app/assets/javascripts/extjs-rails/src/grid/feature/Feature.js +158 -0
  350. data/app/assets/javascripts/extjs-rails/src/grid/feature/Grouping.js +822 -0
  351. data/app/assets/javascripts/extjs-rails/src/grid/feature/GroupingSummary.js +243 -0
  352. data/app/assets/javascripts/extjs-rails/src/grid/feature/RowBody.js +116 -0
  353. data/app/assets/javascripts/extjs-rails/src/grid/feature/RowWrap.js +120 -0
  354. data/app/assets/javascripts/extjs-rails/src/grid/feature/Summary.js +167 -0
  355. data/app/assets/javascripts/extjs-rails/src/grid/header/Container.js +965 -0
  356. data/app/assets/javascripts/extjs-rails/src/grid/header/DragZone.js +69 -0
  357. data/app/assets/javascripts/extjs-rails/src/grid/header/DropZone.js +265 -0
  358. data/app/assets/javascripts/extjs-rails/src/grid/plugin/CellEditing.js +453 -0
  359. data/app/assets/javascripts/extjs-rails/src/grid/plugin/DragDrop.js +254 -0
  360. data/app/assets/javascripts/extjs-rails/src/grid/plugin/Editing.js +561 -0
  361. data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderReorderer.js +49 -0
  362. data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderResizer.js +292 -0
  363. data/app/assets/javascripts/extjs-rails/src/grid/plugin/RowEditing.js +339 -0
  364. data/app/assets/javascripts/extjs-rails/src/grid/property/Grid.js +351 -0
  365. data/app/assets/javascripts/extjs-rails/src/grid/property/HeaderContainer.js +109 -0
  366. data/app/assets/javascripts/extjs-rails/src/grid/property/Property.js +36 -0
  367. data/app/assets/javascripts/extjs-rails/src/grid/property/Store.js +141 -0
  368. data/app/assets/javascripts/extjs-rails/src/layout/ClassList.js +90 -0
  369. data/app/assets/javascripts/extjs-rails/src/layout/Context.js +1232 -0
  370. data/app/assets/javascripts/extjs-rails/src/layout/ContextItem.js +1470 -0
  371. data/app/assets/javascripts/extjs-rails/src/layout/Layout.js +761 -0
  372. data/app/assets/javascripts/extjs-rails/src/layout/component/Auto.js +220 -0
  373. data/app/assets/javascripts/extjs-rails/src/layout/component/Body.js +80 -0
  374. data/app/assets/javascripts/extjs-rails/src/layout/component/BoundList.js +95 -0
  375. data/app/assets/javascripts/extjs-rails/src/layout/component/Button.js +261 -0
  376. data/app/assets/javascripts/extjs-rails/src/layout/component/Component.js +427 -0
  377. data/app/assets/javascripts/extjs-rails/src/layout/component/Dock.js +1132 -0
  378. data/app/assets/javascripts/extjs-rails/src/layout/component/Draw.js +79 -0
  379. data/app/assets/javascripts/extjs-rails/src/layout/component/FieldSet.js +62 -0
  380. data/app/assets/javascripts/extjs-rails/src/layout/component/ProgressBar.js +54 -0
  381. data/app/assets/javascripts/extjs-rails/src/layout/component/Tab.js +23 -0
  382. data/app/assets/javascripts/extjs-rails/src/layout/component/field/ComboBox.js +52 -0
  383. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Field.js +372 -0
  384. data/app/assets/javascripts/extjs-rails/src/layout/component/field/FieldContainer.js +48 -0
  385. data/app/assets/javascripts/extjs-rails/src/layout/component/field/HtmlEditor.js +54 -0
  386. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Slider.js +58 -0
  387. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Text.js +75 -0
  388. data/app/assets/javascripts/extjs-rails/src/layout/component/field/TextArea.js +51 -0
  389. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Trigger.js +132 -0
  390. data/app/assets/javascripts/extjs-rails/src/layout/container/Absolute.js +121 -0
  391. data/app/assets/javascripts/extjs-rails/src/layout/container/Accordion.js +308 -0
  392. data/app/assets/javascripts/extjs-rails/src/layout/container/Anchor.js +403 -0
  393. data/app/assets/javascripts/extjs-rails/src/layout/container/Auto.js +70 -0
  394. data/app/assets/javascripts/extjs-rails/src/layout/container/Border-old-js +1079 -0
  395. data/app/assets/javascripts/extjs-rails/src/layout/container/Border.js +816 -0
  396. data/app/assets/javascripts/extjs-rails/src/layout/container/Box.js +929 -0
  397. data/app/assets/javascripts/extjs-rails/src/layout/container/Card.js +361 -0
  398. data/app/assets/javascripts/extjs-rails/src/layout/container/CheckboxGroup.js +376 -0
  399. data/app/assets/javascripts/extjs-rails/src/layout/container/Column.js +234 -0
  400. data/app/assets/javascripts/extjs-rails/src/layout/container/Container.js +961 -0
  401. data/app/assets/javascripts/extjs-rails/src/layout/container/Editor.js +74 -0
  402. data/app/assets/javascripts/extjs-rails/src/layout/container/Fit.js +287 -0
  403. data/app/assets/javascripts/extjs-rails/src/layout/container/Form.js +157 -0
  404. data/app/assets/javascripts/extjs-rails/src/layout/container/HBox.js +134 -0
  405. data/app/assets/javascripts/extjs-rails/src/layout/container/Table.js +412 -0
  406. data/app/assets/javascripts/extjs-rails/src/layout/container/VBox.js +139 -0
  407. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Menu.js +365 -0
  408. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/None.js +83 -0
  409. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Scroller.js +475 -0
  410. data/app/assets/javascripts/extjs-rails/src/menu/CheckItem.js +169 -0
  411. data/app/assets/javascripts/extjs-rails/src/menu/ColorPicker.js +110 -0
  412. data/app/assets/javascripts/extjs-rails/src/menu/DatePicker.js +100 -0
  413. data/app/assets/javascripts/extjs-rails/src/menu/Item.js +553 -0
  414. data/app/assets/javascripts/extjs-rails/src/menu/KeyNav.js +134 -0
  415. data/app/assets/javascripts/extjs-rails/src/menu/Manager.js +219 -0
  416. data/app/assets/javascripts/extjs-rails/src/menu/Menu.js +579 -0
  417. data/app/assets/javascripts/extjs-rails/src/menu/Separator.js +126 -0
  418. data/app/assets/javascripts/extjs-rails/src/panel/AbstractPanel.js +323 -0
  419. data/app/assets/javascripts/extjs-rails/src/panel/DD.js +99 -0
  420. data/app/assets/javascripts/extjs-rails/src/panel/Header.js +518 -0
  421. data/app/assets/javascripts/extjs-rails/src/panel/Panel.js +2150 -0
  422. data/app/assets/javascripts/extjs-rails/src/panel/Proxy.js +131 -0
  423. data/app/assets/javascripts/extjs-rails/src/panel/Table.js +1018 -0
  424. data/app/assets/javascripts/extjs-rails/src/panel/Tool.js +304 -0
  425. data/app/assets/javascripts/extjs-rails/src/picker/Color.js +219 -0
  426. data/app/assets/javascripts/extjs-rails/src/picker/Date.js +1140 -0
  427. data/app/assets/javascripts/extjs-rails/src/picker/Month.js +490 -0
  428. data/app/assets/javascripts/extjs-rails/src/picker/Time.js +165 -0
  429. data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitter.js +22 -0
  430. data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitterTracker.js +210 -0
  431. data/app/assets/javascripts/extjs-rails/src/resizer/Handle.js +29 -0
  432. data/app/assets/javascripts/extjs-rails/src/resizer/ResizeTracker.js +346 -0
  433. data/app/assets/javascripts/extjs-rails/src/resizer/Resizer.js +477 -0
  434. data/app/assets/javascripts/extjs-rails/src/resizer/Splitter.js +242 -0
  435. data/app/assets/javascripts/extjs-rails/src/resizer/SplitterTracker.js +230 -0
  436. data/app/assets/javascripts/extjs-rails/src/selection/CellModel.js +395 -0
  437. data/app/assets/javascripts/extjs-rails/src/selection/CheckboxModel.js +234 -0
  438. data/app/assets/javascripts/extjs-rails/src/selection/DataViewModel.js +160 -0
  439. data/app/assets/javascripts/extjs-rails/src/selection/Model.js +646 -0
  440. data/app/assets/javascripts/extjs-rails/src/selection/RowModel.js +499 -0
  441. data/app/assets/javascripts/extjs-rails/src/selection/TreeModel.js +78 -0
  442. data/app/assets/javascripts/extjs-rails/src/slider/Multi.js +835 -0
  443. data/app/assets/javascripts/extjs-rails/src/slider/Single.js +56 -0
  444. data/app/assets/javascripts/extjs-rails/src/slider/Thumb.js +259 -0
  445. data/app/assets/javascripts/extjs-rails/src/slider/Tip.js +130 -0
  446. data/app/assets/javascripts/extjs-rails/src/state/CookieProvider.js +120 -0
  447. data/app/assets/javascripts/extjs-rails/src/state/LocalStorageProvider.js +72 -0
  448. data/app/assets/javascripts/extjs-rails/src/state/Manager.js +70 -0
  449. data/app/assets/javascripts/extjs-rails/src/state/Provider.js +182 -0
  450. data/app/assets/javascripts/extjs-rails/src/state/Stateful.js +364 -0
  451. data/app/assets/javascripts/extjs-rails/src/tab/Bar.js +258 -0
  452. data/app/assets/javascripts/extjs-rails/src/tab/Panel.js +654 -0
  453. data/app/assets/javascripts/extjs-rails/src/tab/Tab.js +358 -0
  454. data/app/assets/javascripts/extjs-rails/src/tail.js +10 -0
  455. data/app/assets/javascripts/extjs-rails/src/tip/QuickTip.js +335 -0
  456. data/app/assets/javascripts/extjs-rails/src/tip/QuickTipManager.js +239 -0
  457. data/app/assets/javascripts/extjs-rails/src/tip/Tip.js +160 -0
  458. data/app/assets/javascripts/extjs-rails/src/tip/ToolTip.js +691 -0
  459. data/app/assets/javascripts/extjs-rails/src/toolbar/Fill.js +28 -0
  460. data/app/assets/javascripts/extjs-rails/src/toolbar/Item.js +16 -0
  461. data/app/assets/javascripts/extjs-rails/src/toolbar/Paging.js +600 -0
  462. data/app/assets/javascripts/extjs-rails/src/toolbar/Separator.js +23 -0
  463. data/app/assets/javascripts/extjs-rails/src/toolbar/Spacer.js +33 -0
  464. data/app/assets/javascripts/extjs-rails/src/toolbar/TextItem.js +57 -0
  465. data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar-legacy.js +123 -0
  466. data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar.js +447 -0
  467. data/app/assets/javascripts/extjs-rails/src/tree/Column.js +90 -0
  468. data/app/assets/javascripts/extjs-rails/src/tree/Panel.js +505 -0
  469. data/app/assets/javascripts/extjs-rails/src/tree/View.js +658 -0
  470. data/app/assets/javascripts/extjs-rails/src/tree/ViewDragZone.js +49 -0
  471. data/app/assets/javascripts/extjs-rails/src/tree/ViewDropZone.js +287 -0
  472. data/app/assets/javascripts/extjs-rails/src/tree/plugin/TreeViewDragDrop.js +244 -0
  473. data/app/assets/javascripts/extjs-rails/src/util/AbstractMixedCollection.js +772 -0
  474. data/app/assets/javascripts/extjs-rails/src/util/Animate.js +426 -0
  475. data/app/assets/javascripts/extjs-rails/src/util/Bindable.js +102 -0
  476. data/app/assets/javascripts/extjs-rails/src/util/CSS.js +185 -0
  477. data/app/assets/javascripts/extjs-rails/src/util/ClickRepeater.js +238 -0
  478. data/app/assets/javascripts/extjs-rails/src/util/ComponentDragger.js +126 -0
  479. data/app/assets/javascripts/extjs-rails/src/util/Cookies.js +91 -0
  480. data/app/assets/javascripts/extjs-rails/src/util/ElementContainer.js +293 -0
  481. data/app/assets/javascripts/extjs-rails/src/util/Filter.js +159 -0
  482. data/app/assets/javascripts/extjs-rails/src/util/Floating.js +321 -0
  483. data/app/assets/javascripts/extjs-rails/src/util/Grouper.js +26 -0
  484. data/app/assets/javascripts/extjs-rails/src/util/HashMap.js +356 -0
  485. data/app/assets/javascripts/extjs-rails/src/util/History.js +285 -0
  486. data/app/assets/javascripts/extjs-rails/src/util/Inflector.js +297 -0
  487. data/app/assets/javascripts/extjs-rails/src/util/KeyMap.js +427 -0
  488. data/app/assets/javascripts/extjs-rails/src/util/KeyNav.js +239 -0
  489. data/app/assets/javascripts/extjs-rails/src/util/LruCache.js +257 -0
  490. data/app/assets/javascripts/extjs-rails/src/util/Memento.js +131 -0
  491. data/app/assets/javascripts/extjs-rails/src/util/MixedCollection.js +239 -0
  492. data/app/assets/javascripts/extjs-rails/src/util/Observable.js +1003 -0
  493. data/app/assets/javascripts/extjs-rails/src/util/Offset.js +60 -0
  494. data/app/assets/javascripts/extjs-rails/src/util/Point.js +93 -0
  495. data/app/assets/javascripts/extjs-rails/src/util/ProtoElement.js +205 -0
  496. data/app/assets/javascripts/extjs-rails/src/util/Queue.js +76 -0
  497. data/app/assets/javascripts/extjs-rails/src/util/Region.js +388 -0
  498. data/app/assets/javascripts/extjs-rails/src/util/Renderable.js +1079 -0
  499. data/app/assets/javascripts/extjs-rails/src/util/Sortable.js +248 -0
  500. data/app/assets/javascripts/extjs-rails/src/util/Sorter.js +179 -0
  501. data/app/assets/javascripts/extjs-rails/src/util/TextMetrics.js +148 -0
  502. data/app/assets/javascripts/extjs-rails/src/view/AbstractView.js +1103 -0
  503. data/app/assets/javascripts/extjs-rails/src/view/BoundList.js +207 -0
  504. data/app/assets/javascripts/extjs-rails/src/view/BoundListKeyNav.js +92 -0
  505. data/app/assets/javascripts/extjs-rails/src/view/DragZone.js +106 -0
  506. data/app/assets/javascripts/extjs-rails/src/view/DropZone.js +240 -0
  507. data/app/assets/javascripts/extjs-rails/src/view/Table.js +1229 -0
  508. data/app/assets/javascripts/extjs-rails/src/view/TableChunker.js +139 -0
  509. data/app/assets/javascripts/extjs-rails/src/view/View.js +636 -0
  510. data/app/assets/javascripts/extjs-rails/src/window/MessageBox.js +880 -0
  511. data/app/assets/javascripts/extjs-rails/src/window/Window-legacy.js +56 -0
  512. data/app/assets/javascripts/extjs-rails/src/window/Window.js +793 -0
  513. data/extjs-rails.gemspec +24 -0
  514. data/lib/extjs-rails.rb +7 -0
  515. data/lib/extjs-rails/engine.rb +7 -0
  516. data/lib/extjs-rails/version.rb +5 -0
  517. metadata +660 -0
@@ -0,0 +1,1423 @@
1
+ /**
2
+ * @author Jacky Nguyen <jacky@sencha.com>
3
+ * @docauthor Jacky Nguyen <jacky@sencha.com>
4
+ * @class Ext.Loader
5
+ *
6
+ * Ext.Loader is the heart of the new dynamic dependency loading capability in Ext JS 4+. It is most commonly used
7
+ * via the {@link Ext#require} shorthand. Ext.Loader supports both asynchronous and synchronous loading
8
+ * approaches, and leverage their advantages for the best development flow. We'll discuss about the pros and cons of each approach:
9
+ *
10
+ * # Asynchronous Loading #
11
+ *
12
+ * - Advantages:
13
+ * + Cross-domain
14
+ * + No web server needed: you can run the application via the file system protocol (i.e: `file://path/to/your/index
15
+ * .html`)
16
+ * + Best possible debugging experience: error messages come with the exact file name and line number
17
+ *
18
+ * - Disadvantages:
19
+ * + Dependencies need to be specified before-hand
20
+ *
21
+ * ### Method 1: Explicitly include what you need: ###
22
+ *
23
+ * // Syntax
24
+ * Ext.require({String/Array} expressions);
25
+ *
26
+ * // Example: Single alias
27
+ * Ext.require('widget.window');
28
+ *
29
+ * // Example: Single class name
30
+ * Ext.require('Ext.window.Window');
31
+ *
32
+ * // Example: Multiple aliases / class names mix
33
+ * Ext.require(['widget.window', 'layout.border', 'Ext.data.Connection']);
34
+ *
35
+ * // Wildcards
36
+ * Ext.require(['widget.*', 'layout.*', 'Ext.data.*']);
37
+ *
38
+ * ### Method 2: Explicitly exclude what you don't need: ###
39
+ *
40
+ * // Syntax: Note that it must be in this chaining format.
41
+ * Ext.exclude({String/Array} expressions)
42
+ * .require({String/Array} expressions);
43
+ *
44
+ * // Include everything except Ext.data.*
45
+ * Ext.exclude('Ext.data.*').require('*');
46
+ *
47
+ * // Include all widgets except widget.checkbox*,
48
+ * // which will match widget.checkbox, widget.checkboxfield, widget.checkboxgroup, etc.
49
+ * Ext.exclude('widget.checkbox*').require('widget.*');
50
+ *
51
+ * # Synchronous Loading on Demand #
52
+ *
53
+ * - Advantages:
54
+ * + There's no need to specify dependencies before-hand, which is always the convenience of including ext-all.js
55
+ * before
56
+ *
57
+ * - Disadvantages:
58
+ * + Not as good debugging experience since file name won't be shown (except in Firebug at the moment)
59
+ * + Must be from the same domain due to XHR restriction
60
+ * + Need a web server, same reason as above
61
+ *
62
+ * There's one simple rule to follow: Instantiate everything with Ext.create instead of the `new` keyword
63
+ *
64
+ * Ext.create('widget.window', { ... }); // Instead of new Ext.window.Window({...});
65
+ *
66
+ * Ext.create('Ext.window.Window', {}); // Same as above, using full class name instead of alias
67
+ *
68
+ * Ext.widget('window', {}); // Same as above, all you need is the traditional `xtype`
69
+ *
70
+ * Behind the scene, {@link Ext.ClassManager} will automatically check whether the given class name / alias has already
71
+ * existed on the page. If it's not, Ext.Loader will immediately switch itself to synchronous mode and automatic load the given
72
+ * class and all its dependencies.
73
+ *
74
+ * # Hybrid Loading - The Best of Both Worlds #
75
+ *
76
+ * It has all the advantages combined from asynchronous and synchronous loading. The development flow is simple:
77
+ *
78
+ * ### Step 1: Start writing your application using synchronous approach.
79
+ *
80
+ * Ext.Loader will automatically fetch all dependencies on demand as they're needed during run-time. For example:
81
+ *
82
+ * Ext.onReady(function(){
83
+ * var window = Ext.createWidget('window', {
84
+ * width: 500,
85
+ * height: 300,
86
+ * layout: {
87
+ * type: 'border',
88
+ * padding: 5
89
+ * },
90
+ * title: 'Hello Dialog',
91
+ * items: [{
92
+ * title: 'Navigation',
93
+ * collapsible: true,
94
+ * region: 'west',
95
+ * width: 200,
96
+ * html: 'Hello',
97
+ * split: true
98
+ * }, {
99
+ * title: 'TabPanel',
100
+ * region: 'center'
101
+ * }]
102
+ * });
103
+ *
104
+ * window.show();
105
+ * })
106
+ *
107
+ * ### Step 2: Along the way, when you need better debugging ability, watch the console for warnings like these: ###
108
+ *
109
+ * [Ext.Loader] Synchronously loading 'Ext.window.Window'; consider adding Ext.require('Ext.window.Window') before your application's code
110
+ * ClassManager.js:432
111
+ * [Ext.Loader] Synchronously loading 'Ext.layout.container.Border'; consider adding Ext.require('Ext.layout.container.Border') before your application's code
112
+ *
113
+ * Simply copy and paste the suggested code above `Ext.onReady`, i.e:
114
+ *
115
+ * Ext.require('Ext.window.Window');
116
+ * Ext.require('Ext.layout.container.Border');
117
+ *
118
+ * Ext.onReady(...);
119
+ *
120
+ * Everything should now load via asynchronous mode.
121
+ *
122
+ * # Deployment #
123
+ *
124
+ * It's important to note that dynamic loading should only be used during development on your local machines.
125
+ * During production, all dependencies should be combined into one single JavaScript file. Ext.Loader makes
126
+ * the whole process of transitioning from / to between development / maintenance and production as easy as
127
+ * possible. Internally {@link Ext.Loader#history Ext.Loader.history} maintains the list of all dependencies your application
128
+ * needs in the exact loading sequence. It's as simple as concatenating all files in this array into one,
129
+ * then include it on top of your application.
130
+ *
131
+ * This process will be automated with Sencha Command, to be released and documented towards Ext JS 4 Final.
132
+ *
133
+ * @singleton
134
+ */
135
+
136
+ Ext.Loader = new function() {
137
+ var Loader = this,
138
+ Manager = Ext.ClassManager,
139
+ Class = Ext.Class,
140
+ flexSetter = Ext.Function.flexSetter,
141
+ alias = Ext.Function.alias,
142
+ pass = Ext.Function.pass,
143
+ defer = Ext.Function.defer,
144
+ arrayErase = Ext.Array.erase,
145
+ //<if nonBrowser>
146
+ isNonBrowser = typeof window == 'undefined',
147
+ isNodeJS = isNonBrowser && (typeof require == 'function'),
148
+ isJsdb = isNonBrowser && typeof system != 'undefined' && system.program.search(/jsdb/) !== -1,
149
+ isPhantomJS = (typeof phantom != 'undefined' && phantom.fs),
150
+ //</if>
151
+ dependencyProperties = ['extend', 'mixins', 'requires'],
152
+ isInHistory = {},
153
+ history = [],
154
+ slashDotSlashRe = /\/\.\//g,
155
+ dotRe = /\./g;
156
+
157
+ Ext.apply(Loader, {
158
+
159
+ /**
160
+ * @private
161
+ */
162
+ isInHistory: isInHistory,
163
+
164
+ /**
165
+ * An array of class names to keep track of the dependency loading order.
166
+ * This is not guaranteed to be the same everytime due to the asynchronous
167
+ * nature of the Loader.
168
+ *
169
+ * @property {Array} history
170
+ */
171
+ history: history,
172
+
173
+ /**
174
+ * Configuration
175
+ * @private
176
+ */
177
+ config: {
178
+ /**
179
+ * @cfg {Boolean} enabled
180
+ * Whether or not to enable the dynamic dependency loading feature.
181
+ */
182
+ enabled: false,
183
+
184
+ /**
185
+ * @cfg {Boolean} scriptChainDelay
186
+ * millisecond delay between asynchronous script injection (prevents stack overflow on some user agents)
187
+ * 'false' disables delay but potentially increases stack load.
188
+ */
189
+ scriptChainDelay : false,
190
+
191
+ /**
192
+ * @cfg {Boolean} disableCaching
193
+ * Appends current timestamp to script files to prevent caching.
194
+ */
195
+ disableCaching: true,
196
+
197
+ /**
198
+ * @cfg {String} disableCachingParam
199
+ * The get parameter name for the cache buster's timestamp.
200
+ */
201
+ disableCachingParam: '_dc',
202
+
203
+ /**
204
+ * @cfg {Boolean} garbageCollect
205
+ * True to prepare an asynchronous script tag for garbage collection (effective only
206
+ * if {@link #preserveScripts preserveScripts} is false)
207
+ */
208
+ garbageCollect : false,
209
+
210
+ /**
211
+ * @cfg {Object} paths
212
+ * The mapping from namespaces to file paths
213
+ *
214
+ * {
215
+ * 'Ext': '.', // This is set by default, Ext.layout.container.Container will be
216
+ * // loaded from ./layout/Container.js
217
+ *
218
+ * 'My': './src/my_own_folder' // My.layout.Container will be loaded from
219
+ * // ./src/my_own_folder/layout/Container.js
220
+ * }
221
+ *
222
+ * Note that all relative paths are relative to the current HTML document.
223
+ * If not being specified, for example, <code>Other.awesome.Class</code>
224
+ * will simply be loaded from <code>./Other/awesome/Class.js</code>
225
+ */
226
+ paths: {
227
+ 'Ext': '.'
228
+ },
229
+
230
+ /**
231
+ * @cfg {Boolean} preserveScripts
232
+ * False to remove and optionally {@link #garbageCollect garbage-collect} asynchronously loaded scripts,
233
+ * True to retain script element for browser debugger compatibility and improved load performance.
234
+ */
235
+ preserveScripts : true,
236
+
237
+ /**
238
+ * @cfg {String} scriptCharset
239
+ * Optional charset to specify encoding of dynamic script content.
240
+ */
241
+ scriptCharset : undefined
242
+ },
243
+
244
+ /**
245
+ * Set the configuration for the loader. This should be called right after ext-(debug).js
246
+ * is included in the page, and before Ext.onReady. i.e:
247
+ *
248
+ * <script type="text/javascript" src="ext-core-debug.js"></script>
249
+ * <script type="text/javascript">
250
+ * Ext.Loader.setConfig({
251
+ * enabled: true,
252
+ * paths: {
253
+ * 'My': 'my_own_path'
254
+ * }
255
+ * });
256
+ * </script>
257
+ * <script type="text/javascript">
258
+ * Ext.require(...);
259
+ *
260
+ * Ext.onReady(function() {
261
+ * // application code here
262
+ * });
263
+ * </script>
264
+ *
265
+ * Refer to config options of {@link Ext.Loader} for the list of possible properties
266
+ *
267
+ * @param {Object} config The config object to override the default values
268
+ * @return {Ext.Loader} this
269
+ */
270
+ setConfig: function(name, value) {
271
+ if (Ext.isObject(name) && arguments.length === 1) {
272
+ Ext.merge(Loader.config, name);
273
+ }
274
+ else {
275
+ Loader.config[name] = (Ext.isObject(value)) ? Ext.merge(Loader.config[name], value) : value;
276
+ }
277
+
278
+ return Loader;
279
+ },
280
+
281
+ /**
282
+ * Get the config value corresponding to the specified name. If no name is given, will return the config object
283
+ * @param {String} name The config property name
284
+ * @return {Object}
285
+ */
286
+ getConfig: function(name) {
287
+ if (name) {
288
+ return Loader.config[name];
289
+ }
290
+
291
+ return Loader.config;
292
+ },
293
+
294
+ /**
295
+ * Sets the path of a namespace.
296
+ * For Example:
297
+ *
298
+ * Ext.Loader.setPath('Ext', '.');
299
+ *
300
+ * @param {String/Object} name See {@link Ext.Function#flexSetter flexSetter}
301
+ * @param {String} path See {@link Ext.Function#flexSetter flexSetter}
302
+ * @return {Ext.Loader} this
303
+ * @method
304
+ */
305
+ setPath: flexSetter(function(name, path) {
306
+ Loader.config.paths[name] = path;
307
+
308
+ return Loader;
309
+ }),
310
+
311
+ /**
312
+ * Translates a className to a file path by adding the
313
+ * the proper prefix and converting the .'s to /'s. For example:
314
+ *
315
+ * Ext.Loader.setPath('My', '/path/to/My');
316
+ *
317
+ * alert(Ext.Loader.getPath('My.awesome.Class')); // alerts '/path/to/My/awesome/Class.js'
318
+ *
319
+ * Note that the deeper namespace levels, if explicitly set, are always resolved first. For example:
320
+ *
321
+ * Ext.Loader.setPath({
322
+ * 'My': '/path/to/lib',
323
+ * 'My.awesome': '/other/path/for/awesome/stuff',
324
+ * 'My.awesome.more': '/more/awesome/path'
325
+ * });
326
+ *
327
+ * alert(Ext.Loader.getPath('My.awesome.Class')); // alerts '/other/path/for/awesome/stuff/Class.js'
328
+ *
329
+ * alert(Ext.Loader.getPath('My.awesome.more.Class')); // alerts '/more/awesome/path/Class.js'
330
+ *
331
+ * alert(Ext.Loader.getPath('My.cool.Class')); // alerts '/path/to/lib/cool/Class.js'
332
+ *
333
+ * alert(Ext.Loader.getPath('Unknown.strange.Stuff')); // alerts 'Unknown/strange/Stuff.js'
334
+ *
335
+ * @param {String} className
336
+ * @return {String} path
337
+ */
338
+ getPath: function(className) {
339
+ var path = '',
340
+ paths = Loader.config.paths,
341
+ prefix = Loader.getPrefix(className);
342
+
343
+ if (prefix.length > 0) {
344
+ if (prefix === className) {
345
+ return paths[prefix];
346
+ }
347
+
348
+ path = paths[prefix];
349
+ className = className.substring(prefix.length + 1);
350
+ }
351
+
352
+ if (path.length > 0) {
353
+ path += '/';
354
+ }
355
+
356
+ return path.replace(slashDotSlashRe, '/') + className.replace(dotRe, "/") + '.js';
357
+ },
358
+
359
+ /**
360
+ * @private
361
+ * @param {String} className
362
+ */
363
+ getPrefix: function(className) {
364
+ var paths = Loader.config.paths,
365
+ prefix, deepestPrefix = '';
366
+
367
+ if (paths.hasOwnProperty(className)) {
368
+ return className;
369
+ }
370
+
371
+ for (prefix in paths) {
372
+ if (paths.hasOwnProperty(prefix) && prefix + '.' === className.substring(0, prefix.length + 1)) {
373
+ if (prefix.length > deepestPrefix.length) {
374
+ deepestPrefix = prefix;
375
+ }
376
+ }
377
+ }
378
+
379
+ return deepestPrefix;
380
+ },
381
+
382
+ /**
383
+ * @private
384
+ * @param {String} className
385
+ */
386
+ isAClassNameWithAKnownPrefix: function(className) {
387
+ var prefix = Loader.getPrefix(className);
388
+
389
+ // we can only say it's really a class if className is not equal to any known namespace
390
+ return prefix !== '' && prefix !== className;
391
+ },
392
+
393
+ /**
394
+ * Loads all classes by the given names and all their direct dependencies; optionally executes the given callback function when
395
+ * finishes, within the optional scope. This method is aliased by {@link Ext#require Ext.require} for convenience
396
+ * @param {String/Array} expressions Can either be a string or an array of string
397
+ * @param {Function} fn (Optional) The callback function
398
+ * @param {Object} scope (Optional) The execution scope (`this`) of the callback function
399
+ * @param {String/Array} excludes (Optional) Classes to be excluded, useful when being used with expressions
400
+ */
401
+ require: function(expressions, fn, scope, excludes) {
402
+ if (fn) {
403
+ fn.call(scope);
404
+ }
405
+ },
406
+
407
+ /**
408
+ * Synchronously loads all classes by the given names and all their direct dependencies; optionally executes the given callback function when finishes, within the optional scope. This method is aliased by {@link Ext#syncRequire} for convenience
409
+ * @param {String/Array} expressions Can either be a string or an array of string
410
+ * @param {Function} fn (Optional) The callback function
411
+ * @param {Object} scope (Optional) The execution scope (`this`) of the callback function
412
+ * @param {String/Array} excludes (Optional) Classes to be excluded, useful when being used with expressions
413
+ */
414
+ syncRequire: function() {},
415
+
416
+ /**
417
+ * Explicitly exclude files from being loaded. Useful when used in conjunction with a broad include expression.
418
+ * Can be chained with more `require` and `exclude` methods, eg:
419
+ *
420
+ * Ext.exclude('Ext.data.*').require('*');
421
+ *
422
+ * Ext.exclude('widget.button*').require('widget.*');
423
+ *
424
+ * @param {Array} excludes
425
+ * @return {Object} object contains `require` method for chaining
426
+ */
427
+ exclude: function(excludes) {
428
+ return {
429
+ require: function(expressions, fn, scope) {
430
+ return Loader.require(expressions, fn, scope, excludes);
431
+ },
432
+
433
+ syncRequire: function(expressions, fn, scope) {
434
+ return Loader.syncRequire(expressions, fn, scope, excludes);
435
+ }
436
+ };
437
+ },
438
+
439
+ /**
440
+ * Add a new listener to be executed when all required scripts are fully loaded
441
+ *
442
+ * @param {Function} fn The function callback to be executed
443
+ * @param {Object} scope The execution scope (<code>this</code>) of the callback function
444
+ * @param {Boolean} withDomReady Whether or not to wait for document dom ready as well
445
+ */
446
+ onReady: function(fn, scope, withDomReady, options) {
447
+ var oldFn;
448
+
449
+ if (withDomReady !== false && Ext.onDocumentReady) {
450
+ oldFn = fn;
451
+
452
+ fn = function() {
453
+ Ext.onDocumentReady(oldFn, scope, options);
454
+ };
455
+ }
456
+
457
+ fn.call(scope);
458
+ }
459
+ });
460
+
461
+ //<feature classSystem.loader>
462
+ var queue = [],
463
+ isClassFileLoaded = {},
464
+ isFileLoaded = {},
465
+ classNameToFilePathMap = {},
466
+ scriptElements = {},
467
+ readyListeners = [],
468
+ usedClasses = [],
469
+ requiresMap = {};
470
+
471
+ Ext.apply(Loader, {
472
+ /**
473
+ * @private
474
+ */
475
+ documentHead: typeof document != 'undefined' && (document.head || document.getElementsByTagName('head')[0]),
476
+
477
+ /**
478
+ * Flag indicating whether there are still files being loaded
479
+ * @private
480
+ */
481
+ isLoading: false,
482
+
483
+ /**
484
+ * Maintain the queue for all dependencies. Each item in the array is an object of the format:
485
+ *
486
+ * {
487
+ * requires: [...], // The required classes for this queue item
488
+ * callback: function() { ... } // The function to execute when all classes specified in requires exist
489
+ * }
490
+ *
491
+ * @private
492
+ */
493
+ queue: queue,
494
+
495
+ /**
496
+ * Maintain the list of files that have already been handled so that they never get double-loaded
497
+ * @private
498
+ */
499
+ isClassFileLoaded: isClassFileLoaded,
500
+
501
+ /**
502
+ * @private
503
+ */
504
+ isFileLoaded: isFileLoaded,
505
+
506
+ /**
507
+ * Maintain the list of listeners to execute when all required scripts are fully loaded
508
+ * @private
509
+ */
510
+ readyListeners: readyListeners,
511
+
512
+ /**
513
+ * Contains classes referenced in `uses` properties.
514
+ * @private
515
+ */
516
+ optionalRequires: usedClasses,
517
+
518
+ /**
519
+ * Map of fully qualified class names to an array of dependent classes.
520
+ * @private
521
+ */
522
+ requiresMap: requiresMap,
523
+
524
+ /**
525
+ * @private
526
+ */
527
+ numPendingFiles: 0,
528
+
529
+ /**
530
+ * @private
531
+ */
532
+ numLoadedFiles: 0,
533
+
534
+ /** @private */
535
+ hasFileLoadError: false,
536
+
537
+ /**
538
+ * @private
539
+ */
540
+ classNameToFilePathMap: classNameToFilePathMap,
541
+
542
+ /**
543
+ * The number of scripts loading via loadScript.
544
+ * @private
545
+ */
546
+ scriptsLoading: 0,
547
+
548
+ /**
549
+ * @private
550
+ */
551
+ syncModeEnabled: false,
552
+
553
+ scriptElements: scriptElements,
554
+
555
+ /**
556
+ * Refresh all items in the queue. If all dependencies for an item exist during looping,
557
+ * it will execute the callback and call refreshQueue again. Triggers onReady when the queue is
558
+ * empty
559
+ * @private
560
+ */
561
+ refreshQueue: function() {
562
+ var ln = queue.length,
563
+ i, item, j, requires;
564
+
565
+ // When the queue of loading classes reaches zero, trigger readiness
566
+
567
+ if (!ln && !Loader.scriptsLoading) {
568
+ return Loader.triggerReady();
569
+ }
570
+
571
+ for (i = 0; i < ln; i++) {
572
+ item = queue[i];
573
+
574
+ if (item) {
575
+ requires = item.requires;
576
+
577
+ // Don't bother checking when the number of files loaded
578
+ // is still less than the array length
579
+ if (requires.length > Loader.numLoadedFiles) {
580
+ continue;
581
+ }
582
+
583
+ // Remove any required classes that are loaded
584
+ for (j = 0; j < requires.length; ) {
585
+ if (Manager.isCreated(requires[j])) {
586
+ // Take out from the queue
587
+ arrayErase(requires, j, 1);
588
+ }
589
+ else {
590
+ j++;
591
+ }
592
+ }
593
+
594
+ // If we've ended up with no required classes, call the callback
595
+ if (item.requires.length === 0) {
596
+ arrayErase(queue, i, 1);
597
+ item.callback.call(item.scope);
598
+ Loader.refreshQueue();
599
+ break;
600
+ }
601
+ }
602
+ }
603
+
604
+ return Loader;
605
+ },
606
+
607
+ /**
608
+ * Inject a script element to document's head, call onLoad and onError accordingly
609
+ * @private
610
+ */
611
+ injectScriptElement: function(url, onLoad, onError, scope, charset) {
612
+ var script = document.createElement('script'),
613
+ dispatched = false,
614
+ config = Loader.config,
615
+ onLoadFn = function() {
616
+
617
+ if(!dispatched) {
618
+ dispatched = true;
619
+ script.onload = script.onreadystatechange = script.onerror = null;
620
+ if (typeof config.scriptChainDelay == 'number') {
621
+ //free the stack (and defer the next script)
622
+ defer(onLoad, config.scriptChainDelay, scope);
623
+ } else {
624
+ onLoad.call(scope);
625
+ }
626
+ Loader.cleanupScriptElement(script, config.preserveScripts === false, config.garbageCollect);
627
+ }
628
+
629
+ },
630
+ onErrorFn = function(arg) {
631
+ defer(onError, 1, scope); //free the stack
632
+ Loader.cleanupScriptElement(script, config.preserveScripts === false, config.garbageCollect);
633
+ };
634
+
635
+ script.type = 'text/javascript';
636
+ script.onerror = onErrorFn;
637
+ charset = charset || config.scriptCharset;
638
+ if (charset) {
639
+ script.charset = charset;
640
+ }
641
+
642
+ /*
643
+ * IE9 Standards mode (and others) SHOULD follow the load event only
644
+ * (Note: IE9 supports both onload AND readystatechange events)
645
+ */
646
+ if ('addEventListener' in script ) {
647
+ script.onload = onLoadFn;
648
+ } else if ('readyState' in script) { // for <IE9 Compatability
649
+ script.onreadystatechange = function() {
650
+ if ( this.readyState == 'loaded' || this.readyState == 'complete' ) {
651
+ onLoadFn();
652
+ }
653
+ };
654
+ } else {
655
+ script.onload = onLoadFn;
656
+ }
657
+
658
+ script.src = url;
659
+ (Loader.documentHead || document.getElementsByTagName('head')[0]).appendChild(script);
660
+
661
+ return script;
662
+ },
663
+
664
+ /**
665
+ * @private
666
+ */
667
+ removeScriptElement: function(url) {
668
+ if (scriptElements[url]) {
669
+ Loader.cleanupScriptElement(scriptElements[url], true, !!Loader.getConfig('garbageCollect'));
670
+ delete scriptElements[url];
671
+ }
672
+
673
+ return Loader;
674
+ },
675
+
676
+ /**
677
+ * @private
678
+ */
679
+ cleanupScriptElement: function(script, remove, collect) {
680
+ var prop;
681
+ script.onload = script.onreadystatechange = script.onerror = null;
682
+ if (remove) {
683
+ Ext.removeNode(script); // Remove, since its useless now
684
+ if (collect) {
685
+ for (prop in script) {
686
+ try {
687
+ script[prop] = null;
688
+ delete script[prop]; // and prepare for GC
689
+ } catch (cleanEx) {
690
+ //ignore
691
+ }
692
+ }
693
+ }
694
+ }
695
+
696
+ return Loader;
697
+ },
698
+
699
+ /**
700
+ * Loads the specified script URL and calls the supplied callbacks. If this method
701
+ * is called before {@link Ext#isReady}, the script's load will delay the transition
702
+ * to ready. This can be used to load arbitrary scripts that may contain further
703
+ * {@link Ext#require Ext.require} calls.
704
+ *
705
+ * @param {Object/String} options The options object or simply the URL to load.
706
+ * @param {String} options.url The URL from which to load the script.
707
+ * @param {Function} [options.onLoad] The callback to call on successful load.
708
+ * @param {Function} [options.onError] The callback to call on failure to load.
709
+ * @param {Object} [options.scope] The scope (`this`) for the supplied callbacks.
710
+ */
711
+ loadScript: function (options) {
712
+ var config = Loader.getConfig(),
713
+ isString = typeof options == 'string',
714
+ url = isString ? options : options.url,
715
+ onError = !isString && options.onError,
716
+ onLoad = !isString && options.onLoad,
717
+ scope = !isString && options.scope,
718
+ onScriptError = function() {
719
+ Loader.numPendingFiles--;
720
+ Loader.scriptsLoading--;
721
+
722
+ if (onError) {
723
+ onError.call(scope, "Failed loading '" + url + "', please verify that the file exists");
724
+ }
725
+
726
+ if (Loader.numPendingFiles + Loader.scriptsLoading === 0) {
727
+ Loader.refreshQueue();
728
+ }
729
+ },
730
+ onScriptLoad = function () {
731
+ Loader.numPendingFiles--;
732
+ Loader.scriptsLoading--;
733
+
734
+ if (onLoad) {
735
+ onLoad.call(scope);
736
+ }
737
+
738
+ if (Loader.numPendingFiles + Loader.scriptsLoading === 0) {
739
+ Loader.refreshQueue();
740
+ }
741
+ },
742
+ src;
743
+
744
+ Loader.isLoading = true;
745
+ Loader.numPendingFiles++;
746
+ Loader.scriptsLoading++;
747
+
748
+ src = config.disableCaching ?
749
+ (url + '?' + config.disableCachingParam + '=' + Ext.Date.now()) : url;
750
+
751
+ scriptElements[url] = Loader.injectScriptElement(src, onScriptLoad, onScriptError);
752
+ },
753
+
754
+ /**
755
+ * Load a script file, supports both asynchronous and synchronous approaches
756
+ * @private
757
+ */
758
+ loadScriptFile: function(url, onLoad, onError, scope, synchronous) {
759
+ if (isFileLoaded[url]) {
760
+ return Loader;
761
+ }
762
+
763
+ var config = Loader.getConfig(),
764
+ noCacheUrl = url + (config.disableCaching ? ('?' + config.disableCachingParam + '=' + Ext.Date.now()) : ''),
765
+ isCrossOriginRestricted = false,
766
+ xhr, status, onScriptError;
767
+
768
+ scope = scope || Loader;
769
+
770
+ Loader.isLoading = true;
771
+
772
+ if (!synchronous) {
773
+ onScriptError = function() {
774
+ //<debug error>
775
+ onError.call(scope, "Failed loading '" + url + "', please verify that the file exists", synchronous);
776
+ //</debug>
777
+ };
778
+
779
+ scriptElements[url] = Loader.injectScriptElement(noCacheUrl, onLoad, onScriptError, scope);
780
+ } else {
781
+ if (typeof XMLHttpRequest != 'undefined') {
782
+ xhr = new XMLHttpRequest();
783
+ } else {
784
+ xhr = new ActiveXObject('Microsoft.XMLHTTP');
785
+ }
786
+
787
+ try {
788
+ xhr.open('GET', noCacheUrl, false);
789
+ xhr.send(null);
790
+ } catch (e) {
791
+ isCrossOriginRestricted = true;
792
+ }
793
+
794
+ status = (xhr.status === 1223) ? 204 :
795
+ (xhr.status === 0 && (self.location || {}).protocol == 'file:') ? 200 : xhr.status;
796
+
797
+ isCrossOriginRestricted = isCrossOriginRestricted || (status === 0);
798
+
799
+ if (isCrossOriginRestricted
800
+ //<if isNonBrowser>
801
+ && !isPhantomJS
802
+ //</if>
803
+ ) {
804
+ //<debug error>
805
+ onError.call(Loader, "Failed loading synchronously via XHR: '" + url + "'; It's likely that the file is either " +
806
+ "being loaded from a different domain or from the local file system whereby cross origin " +
807
+ "requests are not allowed due to security reasons. Use asynchronous loading with " +
808
+ "Ext.require instead.", synchronous);
809
+ //</debug>
810
+ }
811
+ else if ((status >= 200 && status < 300) || (status === 304)
812
+ //<if isNonBrowser>
813
+ || isPhantomJS
814
+ //</if>
815
+ ) {
816
+ // Debugger friendly, file names are still shown even though they're eval'ed code
817
+ // Breakpoints work on both Firebug and Chrome's Web Inspector
818
+ Ext.globalEval(xhr.responseText + "\n//@ sourceURL=" + url);
819
+
820
+ onLoad.call(scope);
821
+ }
822
+ else {
823
+ //<debug>
824
+ onError.call(Loader, "Failed loading synchronously via XHR: '" + url + "'; please " +
825
+ "verify that the file exists. " +
826
+ "XHR status code: " + status, synchronous);
827
+ //</debug>
828
+ }
829
+
830
+ // Prevent potential IE memory leak
831
+ xhr = null;
832
+ }
833
+ },
834
+
835
+ // documented above
836
+ syncRequire: function() {
837
+ var syncModeEnabled = Loader.syncModeEnabled;
838
+
839
+ if (!syncModeEnabled) {
840
+ Loader.syncModeEnabled = true;
841
+ }
842
+
843
+ Loader.require.apply(Loader, arguments);
844
+
845
+ if (!syncModeEnabled) {
846
+ Loader.syncModeEnabled = false;
847
+ }
848
+
849
+ Loader.refreshQueue();
850
+ },
851
+
852
+ // documented above
853
+ require: function(expressions, fn, scope, excludes) {
854
+ var excluded = {},
855
+ included = {},
856
+ excludedClassNames = [],
857
+ possibleClassNames = [],
858
+ classNames = [],
859
+ references = [],
860
+ callback,
861
+ syncModeEnabled,
862
+ filePath, expression, exclude, className,
863
+ possibleClassName, i, j, ln, subLn;
864
+
865
+ if (excludes) {
866
+ // Convert possible single string to an array.
867
+ excludes = (typeof excludes === 'string') ? [ excludes ] : excludes;
868
+
869
+ for (i = 0,ln = excludes.length; i < ln; i++) {
870
+ exclude = excludes[i];
871
+
872
+ if (typeof exclude == 'string' && exclude.length > 0) {
873
+ excludedClassNames = Manager.getNamesByExpression(exclude);
874
+
875
+ for (j = 0,subLn = excludedClassNames.length; j < subLn; j++) {
876
+ excluded[excludedClassNames[j]] = true;
877
+ }
878
+ }
879
+ }
880
+ }
881
+
882
+ // Convert possible single string to an array.
883
+ expressions = (typeof expressions === 'string') ? [ expressions ] : (expressions ? expressions : []);
884
+
885
+ if (fn) {
886
+ if (fn.length > 0) {
887
+ callback = function() {
888
+ var classes = [],
889
+ i, ln;
890
+
891
+ for (i = 0,ln = references.length; i < ln; i++) {
892
+ classes.push(Manager.get(references[i]));
893
+ }
894
+
895
+ return fn.apply(this, classes);
896
+ };
897
+ }
898
+ else {
899
+ callback = fn;
900
+ }
901
+ }
902
+ else {
903
+ callback = Ext.emptyFn;
904
+ }
905
+
906
+ scope = scope || Ext.global;
907
+
908
+ for (i = 0,ln = expressions.length; i < ln; i++) {
909
+ expression = expressions[i];
910
+
911
+ if (typeof expression == 'string' && expression.length > 0) {
912
+ possibleClassNames = Manager.getNamesByExpression(expression);
913
+ subLn = possibleClassNames.length;
914
+
915
+ for (j = 0; j < subLn; j++) {
916
+ possibleClassName = possibleClassNames[j];
917
+
918
+ if (excluded[possibleClassName] !== true) {
919
+ references.push(possibleClassName);
920
+
921
+ if (!Manager.isCreated(possibleClassName) && !included[possibleClassName]) {
922
+ included[possibleClassName] = true;
923
+ classNames.push(possibleClassName);
924
+ }
925
+ }
926
+ }
927
+ }
928
+ }
929
+
930
+ // If the dynamic dependency feature is not being used, throw an error
931
+ // if the dependencies are not defined
932
+ if (classNames.length > 0) {
933
+ if (!Loader.config.enabled) {
934
+ throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. " +
935
+ "Missing required class" + ((classNames.length > 1) ? "es" : "") + ": " + classNames.join(', '));
936
+ }
937
+ }
938
+ else {
939
+ callback.call(scope);
940
+ return Loader;
941
+ }
942
+
943
+ syncModeEnabled = Loader.syncModeEnabled;
944
+
945
+ if (!syncModeEnabled) {
946
+ queue.push({
947
+ requires: classNames.slice(), // this array will be modified as the queue is processed,
948
+ // so we need a copy of it
949
+ callback: callback,
950
+ scope: scope
951
+ });
952
+ }
953
+
954
+ ln = classNames.length;
955
+
956
+ for (i = 0; i < ln; i++) {
957
+ className = classNames[i];
958
+
959
+ filePath = Loader.getPath(className);
960
+
961
+ // If we are synchronously loading a file that has already been asychronously loaded before
962
+ // we need to destroy the script tag and revert the count
963
+ // This file will then be forced loaded in synchronous
964
+ if (syncModeEnabled && isClassFileLoaded.hasOwnProperty(className)) {
965
+ Loader.numPendingFiles--;
966
+ Loader.removeScriptElement(filePath);
967
+ delete isClassFileLoaded[className];
968
+ }
969
+
970
+ if (!isClassFileLoaded.hasOwnProperty(className)) {
971
+ isClassFileLoaded[className] = false;
972
+
973
+ classNameToFilePathMap[className] = filePath;
974
+
975
+ Loader.numPendingFiles++;
976
+ Loader.loadScriptFile(
977
+ filePath,
978
+ pass(Loader.onFileLoaded, [className, filePath], Loader),
979
+ pass(Loader.onFileLoadError, [className, filePath], Loader),
980
+ Loader,
981
+ syncModeEnabled
982
+ );
983
+ }
984
+ }
985
+
986
+ if (syncModeEnabled) {
987
+ callback.call(scope);
988
+
989
+ if (ln === 1) {
990
+ return Manager.get(className);
991
+ }
992
+ }
993
+
994
+ return Loader;
995
+ },
996
+
997
+ /**
998
+ * @private
999
+ * @param {String} className
1000
+ * @param {String} filePath
1001
+ */
1002
+ onFileLoaded: function(className, filePath) {
1003
+ Loader.numLoadedFiles++;
1004
+
1005
+ isClassFileLoaded[className] = true;
1006
+ isFileLoaded[filePath] = true;
1007
+
1008
+ Loader.numPendingFiles--;
1009
+
1010
+ if (Loader.numPendingFiles === 0) {
1011
+ Loader.refreshQueue();
1012
+ }
1013
+
1014
+ //<debug>
1015
+ if (!Loader.syncModeEnabled && Loader.numPendingFiles === 0 && Loader.isLoading && !Loader.hasFileLoadError) {
1016
+ var missingClasses = [],
1017
+ missingPaths = [],
1018
+ requires,
1019
+ i, ln, j, subLn;
1020
+
1021
+ for (i = 0,ln = queue.length; i < ln; i++) {
1022
+ requires = queue[i].requires;
1023
+
1024
+ for (j = 0,subLn = requires.length; j < subLn; j++) {
1025
+ if (isClassFileLoaded[requires[j]]) {
1026
+ missingClasses.push(requires[j]);
1027
+ }
1028
+ }
1029
+ }
1030
+
1031
+ if (missingClasses.length < 1) {
1032
+ return;
1033
+ }
1034
+
1035
+ missingClasses = Ext.Array.filter(Ext.Array.unique(missingClasses), function(item) {
1036
+ return !requiresMap.hasOwnProperty(item);
1037
+ }, Loader);
1038
+
1039
+ for (i = 0,ln = missingClasses.length; i < ln; i++) {
1040
+ missingPaths.push(classNameToFilePathMap[missingClasses[i]]);
1041
+ }
1042
+
1043
+ throw new Error("The following classes are not declared even if their files have been " +
1044
+ "loaded: '" + missingClasses.join("', '") + "'. Please check the source code of their " +
1045
+ "corresponding files for possible typos: '" + missingPaths.join("', '"));
1046
+ }
1047
+ //</debug>
1048
+ },
1049
+
1050
+ /**
1051
+ * @private
1052
+ */
1053
+ onFileLoadError: function(className, filePath, errorMessage, isSynchronous) {
1054
+ Loader.numPendingFiles--;
1055
+ Loader.hasFileLoadError = true;
1056
+
1057
+ //<debug error>
1058
+ throw new Error("[Ext.Loader] " + errorMessage);
1059
+ //</debug>
1060
+ },
1061
+
1062
+ /**
1063
+ * @private
1064
+ * Ensure that any classes referenced in the `uses` property are loaded.
1065
+ */
1066
+ addUsedClasses: function (classes) {
1067
+ var cls, i, ln;
1068
+
1069
+ if (classes) {
1070
+ classes = (typeof classes == 'string') ? [classes] : classes;
1071
+ for (i = 0, ln = classes.length; i < ln; i++) {
1072
+ cls = classes[i];
1073
+ if (typeof cls == 'string' && !Ext.Array.contains(usedClasses, cls)) {
1074
+ usedClasses.push(cls);
1075
+ }
1076
+ }
1077
+ }
1078
+
1079
+ return Loader;
1080
+ },
1081
+
1082
+ /**
1083
+ * @private
1084
+ */
1085
+ triggerReady: function() {
1086
+ var listener,
1087
+ i, refClasses = usedClasses;
1088
+
1089
+ if (Loader.isLoading) {
1090
+ Loader.isLoading = false;
1091
+
1092
+ if (refClasses.length !== 0) {
1093
+ // Clone then empty the array to eliminate potential recursive loop issue
1094
+ refClasses = refClasses.slice();
1095
+ usedClasses.length = 0;
1096
+ // this may immediately call us back if all 'uses' classes
1097
+ // have been loaded
1098
+ Loader.require(refClasses, Loader.triggerReady, Loader);
1099
+ return Loader;
1100
+ }
1101
+ }
1102
+
1103
+ // this method can be called with Loader.isLoading either true or false
1104
+ // (can be called with false when all 'uses' classes are already loaded)
1105
+ // this may bypass the above if condition
1106
+ while (readyListeners.length && !Loader.isLoading) {
1107
+ // calls to refreshQueue may re-enter triggerReady
1108
+ // so we cannot necessarily iterate the readyListeners array
1109
+ listener = readyListeners.shift();
1110
+ listener.fn.call(listener.scope);
1111
+ }
1112
+
1113
+ return Loader;
1114
+ },
1115
+
1116
+ // Documented above already
1117
+ onReady: function(fn, scope, withDomReady, options) {
1118
+ var oldFn;
1119
+
1120
+ if (withDomReady !== false && Ext.onDocumentReady) {
1121
+ oldFn = fn;
1122
+
1123
+ fn = function() {
1124
+ Ext.onDocumentReady(oldFn, scope, options);
1125
+ };
1126
+ }
1127
+
1128
+ if (!Loader.isLoading) {
1129
+ fn.call(scope);
1130
+ }
1131
+ else {
1132
+ readyListeners.push({
1133
+ fn: fn,
1134
+ scope: scope
1135
+ });
1136
+ }
1137
+ },
1138
+
1139
+ /**
1140
+ * @private
1141
+ * @param {String} className
1142
+ */
1143
+ historyPush: function(className) {
1144
+ if (className && isClassFileLoaded.hasOwnProperty(className) && !isInHistory[className]) {
1145
+ isInHistory[className] = true;
1146
+ history.push(className);
1147
+ }
1148
+ return Loader;
1149
+ }
1150
+ });
1151
+
1152
+ /**
1153
+ * Turns on or off the "cache buster" applied to dynamically loaded scripts. Normally
1154
+ * dynamically loaded scripts have an extra query parameter appended to avoid stale
1155
+ * cached scripts. This method can be used to disable this mechanism, and is primarily
1156
+ * useful for testing. This is done using a cookie.
1157
+ * @param {Boolean} disable True to disable the cache buster.
1158
+ * @param {String} [path="/"] An optional path to scope the cookie.
1159
+ * @private
1160
+ */
1161
+ Ext.disableCacheBuster = function (disable, path) {
1162
+ var date = new Date();
1163
+ date.setTime(date.getTime() + (disable ? 10*365 : -1) * 24*60*60*1000);
1164
+ date = date.toGMTString();
1165
+ document.cookie = 'ext-cache=1; expires=' + date + '; path='+(path || '/');
1166
+ };
1167
+
1168
+ //<if nonBrowser>
1169
+ if (isNonBrowser) {
1170
+ if (isNodeJS) {
1171
+ Ext.apply(Loader, {
1172
+ syncModeEnabled: true,
1173
+ setPath: flexSetter(function(name, path) {
1174
+ path = require('fs').realpathSync(path);
1175
+ Loader.config.paths[name] = path;
1176
+
1177
+ return Loader;
1178
+ }),
1179
+
1180
+ loadScriptFile: function(filePath, onLoad, onError, scope, synchronous) {
1181
+ require(filePath);
1182
+ onLoad.call(scope);
1183
+ }
1184
+ });
1185
+ }
1186
+ else if (isJsdb) {
1187
+ Ext.apply(Loader, {
1188
+ syncModeEnabled: true,
1189
+ loadScriptFile: function(filePath, onLoad, onError, scope, synchronous) {
1190
+ load(filePath);
1191
+ onLoad.call(scope);
1192
+ }
1193
+ });
1194
+ }
1195
+ }
1196
+ //</if>
1197
+ //</feature>
1198
+
1199
+ /**
1200
+ * Convenient alias of {@link Ext.Loader#require}. Please see the introduction documentation of
1201
+ * {@link Ext.Loader} for examples.
1202
+ * @member Ext
1203
+ * @method require
1204
+ */
1205
+ Ext.require = alias(Loader, 'require');
1206
+
1207
+ /**
1208
+ * Synchronous version of {@link Ext#require}, convenient alias of {@link Ext.Loader#syncRequire}.
1209
+ *
1210
+ * @member Ext
1211
+ * @method syncRequire
1212
+ */
1213
+ Ext.syncRequire = alias(Loader, 'syncRequire');
1214
+
1215
+ /**
1216
+ * Convenient shortcut to {@link Ext.Loader#exclude}
1217
+ * @member Ext
1218
+ * @method exclude
1219
+ */
1220
+ Ext.exclude = alias(Loader, 'exclude');
1221
+
1222
+ /**
1223
+ * @member Ext
1224
+ * @method onReady
1225
+ */
1226
+ Ext.onReady = function(fn, scope, options) {
1227
+ Loader.onReady(fn, scope, true, options);
1228
+ };
1229
+
1230
+ /**
1231
+ * @cfg {String[]} requires
1232
+ * @member Ext.Class
1233
+ * List of classes that have to be loaded before instantiating this class.
1234
+ * For example:
1235
+ *
1236
+ * Ext.define('Mother', {
1237
+ * requires: ['Child'],
1238
+ * giveBirth: function() {
1239
+ * // we can be sure that child class is available.
1240
+ * return new Child();
1241
+ * }
1242
+ * });
1243
+ */
1244
+ Class.registerPreprocessor('loader', function(cls, data, hooks, continueFn) {
1245
+ var me = this,
1246
+ dependencies = [],
1247
+ dependency,
1248
+ className = Manager.getName(cls),
1249
+ i, j, ln, subLn, value, propertyName, propertyValue,
1250
+ requiredMap, requiredDep;
1251
+
1252
+ /*
1253
+ Loop through the dependencyProperties, look for string class names and push
1254
+ them into a stack, regardless of whether the property's value is a string, array or object. For example:
1255
+ {
1256
+ extend: 'Ext.MyClass',
1257
+ requires: ['Ext.some.OtherClass'],
1258
+ mixins: {
1259
+ observable: 'Ext.util.Observable';
1260
+ }
1261
+ }
1262
+ which will later be transformed into:
1263
+ {
1264
+ extend: Ext.MyClass,
1265
+ requires: [Ext.some.OtherClass],
1266
+ mixins: {
1267
+ observable: Ext.util.Observable;
1268
+ }
1269
+ }
1270
+ */
1271
+
1272
+ for (i = 0,ln = dependencyProperties.length; i < ln; i++) {
1273
+ propertyName = dependencyProperties[i];
1274
+
1275
+ if (data.hasOwnProperty(propertyName)) {
1276
+ propertyValue = data[propertyName];
1277
+
1278
+ if (typeof propertyValue == 'string') {
1279
+ dependencies.push(propertyValue);
1280
+ }
1281
+ else if (propertyValue instanceof Array) {
1282
+ for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
1283
+ value = propertyValue[j];
1284
+
1285
+ if (typeof value == 'string') {
1286
+ dependencies.push(value);
1287
+ }
1288
+ }
1289
+ }
1290
+ else if (typeof propertyValue != 'function') {
1291
+ for (j in propertyValue) {
1292
+ if (propertyValue.hasOwnProperty(j)) {
1293
+ value = propertyValue[j];
1294
+
1295
+ if (typeof value == 'string') {
1296
+ dependencies.push(value);
1297
+ }
1298
+ }
1299
+ }
1300
+ }
1301
+ }
1302
+ }
1303
+
1304
+ if (dependencies.length === 0) {
1305
+ return;
1306
+ }
1307
+
1308
+ //<feature classSystem.loader>
1309
+ //<debug error>
1310
+ var deadlockPath = [],
1311
+ detectDeadlock;
1312
+
1313
+ /*
1314
+ Automatically detect deadlocks before-hand,
1315
+ will throw an error with detailed path for ease of debugging. Examples of deadlock cases:
1316
+
1317
+ - A extends B, then B extends A
1318
+ - A requires B, B requires C, then C requires A
1319
+
1320
+ The detectDeadlock function will recursively transverse till the leaf, hence it can detect deadlocks
1321
+ no matter how deep the path is.
1322
+ */
1323
+
1324
+ if (className) {
1325
+ requiresMap[className] = dependencies;
1326
+ //<debug>
1327
+ requiredMap = Loader.requiredByMap || (Loader.requiredByMap = {});
1328
+
1329
+ for (i = 0,ln = dependencies.length; i < ln; i++) {
1330
+ dependency = dependencies[i];
1331
+ (requiredMap[dependency] || (requiredMap[dependency] = [])).push(className);
1332
+ }
1333
+ //</debug>
1334
+ detectDeadlock = function(cls) {
1335
+ deadlockPath.push(cls);
1336
+
1337
+ if (requiresMap[cls]) {
1338
+ if (Ext.Array.contains(requiresMap[cls], className)) {
1339
+ throw new Error("Deadlock detected while loading dependencies! '" + className + "' and '" +
1340
+ deadlockPath[1] + "' " + "mutually require each other. Path: " +
1341
+ deadlockPath.join(' -> ') + " -> " + deadlockPath[0]);
1342
+ }
1343
+
1344
+ for (i = 0,ln = requiresMap[cls].length; i < ln; i++) {
1345
+ detectDeadlock(requiresMap[cls][i]);
1346
+ }
1347
+ }
1348
+ };
1349
+
1350
+ detectDeadlock(className);
1351
+ }
1352
+
1353
+ //</debug>
1354
+ //</feature>
1355
+
1356
+ Loader.require(dependencies, function() {
1357
+ for (i = 0,ln = dependencyProperties.length; i < ln; i++) {
1358
+ propertyName = dependencyProperties[i];
1359
+
1360
+ if (data.hasOwnProperty(propertyName)) {
1361
+ propertyValue = data[propertyName];
1362
+
1363
+ if (typeof propertyValue == 'string') {
1364
+ data[propertyName] = Manager.get(propertyValue);
1365
+ }
1366
+ else if (propertyValue instanceof Array) {
1367
+ for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
1368
+ value = propertyValue[j];
1369
+
1370
+ if (typeof value == 'string') {
1371
+ data[propertyName][j] = Manager.get(value);
1372
+ }
1373
+ }
1374
+ }
1375
+ else if (typeof propertyValue != 'function') {
1376
+ for (var k in propertyValue) {
1377
+ if (propertyValue.hasOwnProperty(k)) {
1378
+ value = propertyValue[k];
1379
+
1380
+ if (typeof value == 'string') {
1381
+ data[propertyName][k] = Manager.get(value);
1382
+ }
1383
+ }
1384
+ }
1385
+ }
1386
+ }
1387
+ }
1388
+
1389
+ continueFn.call(me, cls, data, hooks);
1390
+ });
1391
+
1392
+ return false;
1393
+ }, true, 'after', 'className');
1394
+
1395
+ //<feature classSystem.loader>
1396
+ /**
1397
+ * @cfg {String[]} uses
1398
+ * @member Ext.Class
1399
+ * List of optional classes to load together with this class. These aren't neccessarily loaded before
1400
+ * this class is created, but are guaranteed to be available before Ext.onReady listeners are
1401
+ * invoked. For example:
1402
+ *
1403
+ * Ext.define('Mother', {
1404
+ * uses: ['Child'],
1405
+ * giveBirth: function() {
1406
+ * // This code might, or might not work:
1407
+ * // return new Child();
1408
+ *
1409
+ * // Instead use Ext.create() to load the class at the spot if not loaded already:
1410
+ * return Ext.create('Child');
1411
+ * }
1412
+ * });
1413
+ */
1414
+ Manager.registerPostprocessor('uses', function(name, cls, data) {
1415
+ var uses = data.uses;
1416
+ if (uses) {
1417
+ Loader.addUsedClasses(uses);
1418
+ }
1419
+ });
1420
+
1421
+ Manager.onCreated(Loader.historyPush);
1422
+ //</feature>
1423
+ };