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,404 @@
1
+ /**
2
+ * A class used to load remote content to an Element. Sample usage:
3
+ *
4
+ * Ext.get('el').load({
5
+ * url: 'myPage.php',
6
+ * scripts: true,
7
+ * params: {
8
+ * id: 1
9
+ * }
10
+ * });
11
+ *
12
+ * In general this class will not be instanced directly, rather the {@link Ext.Element#method-load} method
13
+ * will be used.
14
+ */
15
+ Ext.define('Ext.ElementLoader', {
16
+
17
+ /* Begin Definitions */
18
+
19
+ mixins: {
20
+ observable: 'Ext.util.Observable'
21
+ },
22
+
23
+ uses: [
24
+ 'Ext.data.Connection',
25
+ 'Ext.Ajax'
26
+ ],
27
+
28
+ statics: {
29
+ Renderer: {
30
+ Html: function(loader, response, active){
31
+ loader.getTarget().update(response.responseText, active.scripts === true);
32
+ return true;
33
+ }
34
+ }
35
+ },
36
+
37
+ /* End Definitions */
38
+
39
+ /**
40
+ * @cfg {String} url
41
+ * The url to retrieve the content from.
42
+ */
43
+ url: null,
44
+
45
+ /**
46
+ * @cfg {Object} params
47
+ * Any params to be attached to the Ajax request. These parameters will
48
+ * be overridden by any params in the load options.
49
+ */
50
+ params: null,
51
+
52
+ /**
53
+ * @cfg {Object} baseParams Params that will be attached to every request. These parameters
54
+ * will not be overridden by any params in the load options.
55
+ */
56
+ baseParams: null,
57
+
58
+ /**
59
+ * @cfg {Boolean/Object} autoLoad
60
+ * True to have the loader make a request as soon as it is created.
61
+ * This argument can also be a set of options that will be passed to {@link #method-load} is called.
62
+ */
63
+ autoLoad: false,
64
+
65
+ /**
66
+ * @cfg {HTMLElement/Ext.Element/String} target
67
+ * The target element for the loader. It can be the DOM element, the id or an {@link Ext.Element}.
68
+ */
69
+ target: null,
70
+
71
+ /**
72
+ * @cfg {Boolean/String} loadMask
73
+ * True or a string to show when the element is loading.
74
+ */
75
+ loadMask: false,
76
+
77
+ /**
78
+ * @cfg {Object} ajaxOptions
79
+ * Any additional options to be passed to the request, for example timeout or headers.
80
+ */
81
+ ajaxOptions: null,
82
+
83
+ /**
84
+ * @cfg {Boolean} scripts
85
+ * True to parse any inline script tags in the response.
86
+ */
87
+ scripts: false,
88
+
89
+ /**
90
+ * @cfg {Function} success
91
+ * A function to be called when a load request is successful.
92
+ * Will be called with the following config parameters:
93
+ *
94
+ * - this - The ElementLoader instance.
95
+ * - response - The response object.
96
+ * - options - Ajax options.
97
+ */
98
+
99
+ /**
100
+ * @cfg {Function} failure A function to be called when a load request fails.
101
+ * Will be called with the following config parameters:
102
+ *
103
+ * - this - The ElementLoader instance.
104
+ * - response - The response object.
105
+ * - options - Ajax options.
106
+ */
107
+
108
+ /**
109
+ * @cfg {Function} callback A function to be called when a load request finishes.
110
+ * Will be called with the following config parameters:
111
+ *
112
+ * - this - The ElementLoader instance.
113
+ * - success - True if successful request.
114
+ * - response - The response object.
115
+ * - options - Ajax options.
116
+ */
117
+
118
+ /**
119
+ * @cfg {Object} scope
120
+ * The scope to execute the {@link #success} and {@link #failure} functions in.
121
+ */
122
+
123
+ /**
124
+ * @cfg {Function} renderer
125
+ * A custom function to render the content to the element. The function should
126
+ * return false if the renderer could not be applied. The passed parameters are:
127
+ *
128
+ * - The loader
129
+ * - The response
130
+ * - The active request
131
+ */
132
+
133
+ /**
134
+ * @property {Boolean} isLoader
135
+ * `true` in this class to identify an object as an instantiated ElementLoader, or subclass thereof.
136
+ */
137
+ isLoader: true,
138
+
139
+ constructor: function(config) {
140
+ var me = this,
141
+ autoLoad;
142
+
143
+ config = config || {};
144
+ Ext.apply(me, config);
145
+ me.setTarget(me.target);
146
+ me.addEvents(
147
+ /**
148
+ * @event beforeload
149
+ * Fires before a load request is made to the server.
150
+ * Returning false from an event listener can prevent the load
151
+ * from occurring.
152
+ * @param {Ext.ElementLoader} this
153
+ * @param {Object} options The options passed to the request
154
+ */
155
+ 'beforeload',
156
+
157
+ /**
158
+ * @event exception
159
+ * Fires after an unsuccessful load.
160
+ * @param {Ext.ElementLoader} this
161
+ * @param {Object} response The response from the server
162
+ * @param {Object} options The options passed to the request
163
+ */
164
+ 'exception',
165
+
166
+ /**
167
+ * @event load
168
+ * Fires after a successful load.
169
+ * @param {Ext.ElementLoader} this
170
+ * @param {Object} response The response from the server
171
+ * @param {Object} options The options passed to the request
172
+ */
173
+ 'load'
174
+ );
175
+
176
+ // don't pass config because we have already applied it.
177
+ me.mixins.observable.constructor.call(me);
178
+
179
+ if (me.autoLoad) {
180
+ autoLoad = me.autoLoad;
181
+ if (autoLoad === true) {
182
+ autoLoad = {};
183
+ }
184
+ me.load(autoLoad);
185
+ }
186
+ },
187
+
188
+ /**
189
+ * Sets an {@link Ext.Element} as the target of this loader.
190
+ * Note that if the target is changed, any active requests will be aborted.
191
+ * @param {String/HTMLElement/Ext.Element} target The element or its ID.
192
+ */
193
+ setTarget: function(target){
194
+ var me = this;
195
+ target = Ext.get(target);
196
+ if (me.target && me.target != target) {
197
+ me.abort();
198
+ }
199
+ me.target = target;
200
+ },
201
+
202
+ /**
203
+ * Returns the target of this loader.
204
+ * @return {Ext.Component} The target or null if none exists.
205
+ */
206
+ getTarget: function(){
207
+ return this.target || null;
208
+ },
209
+
210
+ /**
211
+ * Aborts the active load request
212
+ */
213
+ abort: function(){
214
+ var active = this.active;
215
+ if (active !== undefined) {
216
+ Ext.Ajax.abort(active.request);
217
+ if (active.mask) {
218
+ this.removeMask();
219
+ }
220
+ delete this.active;
221
+ }
222
+ },
223
+
224
+ /**
225
+ * Removes the mask on the target
226
+ * @private
227
+ */
228
+ removeMask: function(){
229
+ this.target.unmask();
230
+ },
231
+
232
+ /**
233
+ * Adds the mask on the target
234
+ * @private
235
+ * @param {Boolean/Object} mask The mask configuration
236
+ */
237
+ addMask: function(mask){
238
+ this.target.mask(mask === true ? null : mask);
239
+ },
240
+
241
+ /**
242
+ * Loads new data from the server.
243
+ * @param {Object} options The options for the request. They can be any configuration option that can be specified for
244
+ * the class, with the exception of the target option. Note that any options passed to the method will override any
245
+ * class defaults.
246
+ */
247
+ load: function(options) {
248
+ //<debug>
249
+ if (!this.target) {
250
+ Ext.Error.raise('A valid target is required when loading content');
251
+ }
252
+ //</debug>
253
+
254
+ options = Ext.apply({}, options);
255
+
256
+ var me = this,
257
+ target = me.target,
258
+ mask = Ext.isDefined(options.loadMask) ? options.loadMask : me.loadMask,
259
+ params = Ext.apply({}, options.params),
260
+ ajaxOptions = Ext.apply({}, options.ajaxOptions),
261
+ callback = options.callback || me.callback,
262
+ scope = options.scope || me.scope || me,
263
+ request;
264
+
265
+ Ext.applyIf(ajaxOptions, me.ajaxOptions);
266
+ Ext.applyIf(options, ajaxOptions);
267
+
268
+ Ext.applyIf(params, me.params);
269
+ Ext.apply(params, me.baseParams);
270
+
271
+ Ext.applyIf(options, {
272
+ url: me.url
273
+ });
274
+
275
+ //<debug>
276
+ if (!options.url) {
277
+ Ext.Error.raise('You must specify the URL from which content should be loaded');
278
+ }
279
+ //</debug>
280
+
281
+ Ext.apply(options, {
282
+ scope: me,
283
+ params: params,
284
+ callback: me.onComplete
285
+ });
286
+
287
+ if (me.fireEvent('beforeload', me, options) === false) {
288
+ return;
289
+ }
290
+
291
+ if (mask) {
292
+ me.addMask(mask);
293
+ }
294
+
295
+ request = Ext.Ajax.request(options);
296
+ me.active = {
297
+ request: request,
298
+ options: options,
299
+ mask: mask,
300
+ scope: scope,
301
+ callback: callback,
302
+ success: options.success || me.success,
303
+ failure: options.failure || me.failure,
304
+ renderer: options.renderer || me.renderer,
305
+ scripts: Ext.isDefined(options.scripts) ? options.scripts : me.scripts
306
+ };
307
+ me.setOptions(me.active, options);
308
+ },
309
+
310
+ /**
311
+ * Sets any additional options on the active request
312
+ * @private
313
+ * @param {Object} active The active request
314
+ * @param {Object} options The initial options
315
+ */
316
+ setOptions: Ext.emptyFn,
317
+
318
+ /**
319
+ * Parses the response after the request completes
320
+ * @private
321
+ * @param {Object} options Ajax options
322
+ * @param {Boolean} success Success status of the request
323
+ * @param {Object} response The response object
324
+ */
325
+ onComplete: function(options, success, response) {
326
+ var me = this,
327
+ active = me.active,
328
+ scope = active.scope,
329
+ renderer = me.getRenderer(active.renderer);
330
+
331
+
332
+ if (success) {
333
+ success = renderer.call(me, me, response, active) !== false;
334
+ }
335
+
336
+ if (success) {
337
+ Ext.callback(active.success, scope, [me, response, options]);
338
+ me.fireEvent('load', me, response, options);
339
+ } else {
340
+ Ext.callback(active.failure, scope, [me, response, options]);
341
+ me.fireEvent('exception', me, response, options);
342
+ }
343
+ Ext.callback(active.callback, scope, [me, success, response, options]);
344
+
345
+ if (active.mask) {
346
+ me.removeMask();
347
+ }
348
+
349
+ delete me.active;
350
+ },
351
+
352
+ /**
353
+ * Gets the renderer to use
354
+ * @private
355
+ * @param {String/Function} renderer The renderer to use
356
+ * @return {Function} A rendering function to use.
357
+ */
358
+ getRenderer: function(renderer){
359
+ if (Ext.isFunction(renderer)) {
360
+ return renderer;
361
+ }
362
+ return this.statics().Renderer.Html;
363
+ },
364
+
365
+ /**
366
+ * Automatically refreshes the content over a specified period.
367
+ * @param {Number} interval The interval to refresh in ms.
368
+ * @param {Object} options (optional) The options to pass to the load method. See {@link #method-load}
369
+ */
370
+ startAutoRefresh: function(interval, options){
371
+ var me = this;
372
+ me.stopAutoRefresh();
373
+ me.autoRefresh = setInterval(function(){
374
+ me.load(options);
375
+ }, interval);
376
+ },
377
+
378
+ /**
379
+ * Clears any auto refresh. See {@link #startAutoRefresh}.
380
+ */
381
+ stopAutoRefresh: function(){
382
+ clearInterval(this.autoRefresh);
383
+ delete this.autoRefresh;
384
+ },
385
+
386
+ /**
387
+ * Checks whether the loader is automatically refreshing. See {@link #startAutoRefresh}.
388
+ * @return {Boolean} True if the loader is automatically refreshing
389
+ */
390
+ isAutoRefreshing: function(){
391
+ return Ext.isDefined(this.autoRefresh);
392
+ },
393
+
394
+ /**
395
+ * Destroys the loader. Any active requests will be aborted.
396
+ */
397
+ destroy: function(){
398
+ var me = this;
399
+ me.stopAutoRefresh();
400
+ delete me.target;
401
+ me.abort();
402
+ me.clearListeners();
403
+ }
404
+ });
@@ -0,0 +1,712 @@
1
+ /**
2
+ * The FocusManager is responsible for globally:
3
+ *
4
+ * 1. Managing component focus
5
+ * 2. Providing basic keyboard navigation
6
+ * 3. (optional) Provide a visual cue for focused components, in the form of a focus ring/frame.
7
+ *
8
+ * To activate the FocusManager, simply call `Ext.FocusManager.enable();`. In turn, you may
9
+ * deactivate the FocusManager by subsequently calling `Ext.FocusManager.disable();`. The
10
+ * FocusManager is disabled by default.
11
+ *
12
+ * To enable the optional focus frame, pass `true` or `{focusFrame: true}` to {@link #method-enable}.
13
+ *
14
+ * Another feature of the FocusManager is to provide basic keyboard focus navigation scoped to any {@link Ext.container.Container}
15
+ * that would like to have navigation between its child {@link Ext.Component}'s.
16
+ *
17
+ * @author Jarred Nicholls <jarred@sencha.com>
18
+ * @docauthor Jarred Nicholls <jarred@sencha.com>
19
+ */
20
+ Ext.define('Ext.FocusManager', {
21
+ singleton: true,
22
+ alternateClassName: ['Ext.FocusMgr' ],
23
+
24
+ mixins: {
25
+ observable: 'Ext.util.Observable'
26
+ },
27
+
28
+ requires: [
29
+ 'Ext.AbstractComponent',
30
+ 'Ext.Component',
31
+ 'Ext.ComponentManager',
32
+ 'Ext.ComponentQuery',
33
+ 'Ext.util.HashMap',
34
+ 'Ext.util.KeyNav'
35
+ ],
36
+
37
+ /**
38
+ * @property {Boolean} enabled
39
+ * Whether or not the FocusManager is currently enabled
40
+ */
41
+ enabled: false,
42
+
43
+ /**
44
+ * @property {Ext.Component} focusedCmp
45
+ * The currently focused component.
46
+ */
47
+
48
+ focusElementCls: Ext.baseCSSPrefix + 'focus-element',
49
+
50
+ focusFrameCls: Ext.baseCSSPrefix + 'focus-frame',
51
+
52
+ /**
53
+ * @property {String[]} whitelist
54
+ * A list of xtypes that should ignore certain navigation input keys and
55
+ * allow for the default browser event/behavior. These input keys include:
56
+ *
57
+ * 1. Backspace
58
+ * 2. Delete
59
+ * 3. Left
60
+ * 4. Right
61
+ * 5. Up
62
+ * 6. Down
63
+ *
64
+ * The FocusManager will not attempt to navigate when a component is an xtype (or descendents thereof)
65
+ * that belongs to this whitelist. E.g., an {@link Ext.form.field.Text} should allow
66
+ * the user to move the input cursor left and right, and to delete characters, etc.
67
+ */
68
+ whitelist: [
69
+ 'textfield'
70
+ ],
71
+
72
+ constructor: function(config) {
73
+ var me = this,
74
+ CQ = Ext.ComponentQuery;
75
+
76
+ me.mixins.observable.constructor.call(me, config);
77
+
78
+ me.addEvents(
79
+ /**
80
+ * @event beforecomponentfocus
81
+ * Fires before a component becomes focused. Return `false` to prevent
82
+ * the component from gaining focus.
83
+ * @param {Ext.FocusManager} fm A reference to the FocusManager singleton
84
+ * @param {Ext.Component} cmp The component that is being focused
85
+ * @param {Ext.Component} previousCmp The component that was previously focused,
86
+ * or `undefined` if there was no previously focused component.
87
+ */
88
+ 'beforecomponentfocus',
89
+
90
+ /**
91
+ * @event componentfocus
92
+ * Fires after a component becomes focused.
93
+ * @param {Ext.FocusManager} fm A reference to the FocusManager singleton
94
+ * @param {Ext.Component} cmp The component that has been focused
95
+ * @param {Ext.Component} previousCmp The component that was previously focused,
96
+ * or `undefined` if there was no previously focused component.
97
+ */
98
+ 'componentfocus',
99
+
100
+ /**
101
+ * @event disable
102
+ * Fires when the FocusManager is disabled
103
+ * @param {Ext.FocusManager} fm A reference to the FocusManager singleton
104
+ */
105
+ 'disable',
106
+
107
+ /**
108
+ * @event enable
109
+ * Fires when the FocusManager is enabled
110
+ * @param {Ext.FocusManager} fm A reference to the FocusManager singleton
111
+ */
112
+ 'enable'
113
+ );
114
+
115
+ me.focusTask = new Ext.util.DelayedTask(me.handleComponentFocus, me);
116
+
117
+ // Gain control on Component focus, blur, hide and destroy
118
+ Ext.override(Ext.AbstractComponent, {
119
+ onFocus: function() {
120
+ this.callParent(arguments);
121
+ if (me.enabled && this.hasFocus) {
122
+ Array.prototype.unshift.call(arguments, this);
123
+ me.onComponentFocus.apply(me, arguments);
124
+ }
125
+ },
126
+ onBlur: function() {
127
+ this.callParent(arguments);
128
+ if (me.enabled && !this.hasFocus) {
129
+ Array.prototype.unshift.call(arguments, this);
130
+ me.onComponentBlur.apply(me, arguments);
131
+ }
132
+ },
133
+ onDestroy: function() {
134
+ this.callParent(arguments);
135
+ if (me.enabled) {
136
+ Array.prototype.unshift.call(arguments, this);
137
+ me.onComponentDestroy.apply(me, arguments);
138
+ }
139
+ }
140
+ });
141
+ Ext.override(Ext.Component, {
142
+ afterHide: function() {
143
+ this.callParent(arguments);
144
+ if (me.enabled) {
145
+ Array.prototype.unshift.call(arguments, this);
146
+ me.onComponentHide.apply(me, arguments);
147
+ }
148
+ }
149
+ });
150
+ // Setup KeyNav that's bound to document to catch all
151
+ // unhandled/bubbled key events for navigation
152
+ me.keyNav = new Ext.util.KeyNav(Ext.getDoc(), {
153
+ disabled: true,
154
+ scope: me,
155
+
156
+ backspace: me.focusLast,
157
+ enter: me.navigateIn,
158
+ esc: me.navigateOut,
159
+ tab: me.navigateSiblings,
160
+ space: me.navigateIn,
161
+ del: me.focusLast,
162
+ left: me.navigateSiblings,
163
+ right: me.navigateSiblings,
164
+ down: me.navigateSiblings,
165
+ up: me.navigateSiblings
166
+ });
167
+
168
+ me.focusData = {};
169
+ me.subscribers = new Ext.util.HashMap();
170
+ me.focusChain = {};
171
+
172
+ // Setup some ComponentQuery pseudos
173
+ Ext.apply(CQ.pseudos, {
174
+ focusable: function(cmps) {
175
+ var len = cmps.length,
176
+ results = [],
177
+ i = 0,
178
+ c;
179
+
180
+ for (; i < len; i++) {
181
+ c = cmps[i];
182
+ if (c.isFocusable()) {
183
+ results.push(c);
184
+ }
185
+ }
186
+
187
+ return results;
188
+ },
189
+
190
+ // Return the single next focusable sibling from the current idx in either direction (step -1 or 1)
191
+ nextFocus: function(cmps, idx, step) {
192
+ step = step || 1;
193
+ idx = parseInt(idx, 10);
194
+
195
+ var len = cmps.length,
196
+ i = idx, c;
197
+
198
+ for (;;) {
199
+ // Increment index, and loop round if off either end
200
+ if ((i += step) >= len) {
201
+ i = 0;
202
+ } else if (i < 0) {
203
+ i = len - 1;
204
+ }
205
+
206
+ // As soon as we loop back to the starting index, give up, there are no focusable siblings.
207
+ if (i === idx) {
208
+ return [];
209
+ }
210
+
211
+ // If we have found a focusable sibling, return it
212
+ if ((c = cmps[i]).isFocusable()) {
213
+ return [c];
214
+ }
215
+ }
216
+
217
+ return [];
218
+ },
219
+
220
+ prevFocus: function(cmps, idx) {
221
+ return this.nextFocus(cmps, idx, -1);
222
+ },
223
+
224
+ root: function(cmps) {
225
+ var len = cmps.length,
226
+ results = [],
227
+ i = 0,
228
+ c;
229
+
230
+ for (; i < len; i++) {
231
+ c = cmps[i];
232
+ if (!c.ownerCt) {
233
+ results.push(c);
234
+ }
235
+ }
236
+
237
+ return results;
238
+ }
239
+ });
240
+ },
241
+
242
+ /**
243
+ * Adds the specified xtype to the {@link #whitelist}.
244
+ * @param {String/String[]} xtype Adds the xtype(s) to the {@link #whitelist}.
245
+ */
246
+ addXTypeToWhitelist: function(xtype) {
247
+ var me = this;
248
+
249
+ if (Ext.isArray(xtype)) {
250
+ Ext.Array.forEach(xtype, me.addXTypeToWhitelist, me);
251
+ return;
252
+ }
253
+
254
+ if (!Ext.Array.contains(me.whitelist, xtype)) {
255
+ me.whitelist.push(xtype);
256
+ }
257
+ },
258
+
259
+ clearComponent: function(cmp) {
260
+ clearTimeout(this.cmpFocusDelay);
261
+ if (!cmp.isDestroyed) {
262
+ cmp.blur();
263
+ }
264
+ },
265
+
266
+ /**
267
+ * Disables the FocusManager by turning of all automatic focus management and keyboard navigation
268
+ */
269
+ disable: function() {
270
+ var me = this;
271
+
272
+ if (!me.enabled) {
273
+ return;
274
+ }
275
+
276
+ delete me.options;
277
+ me.enabled = false;
278
+
279
+ me.removeDOM();
280
+
281
+ // Stop handling key navigation
282
+ me.keyNav.disable();
283
+
284
+ me.fireEvent('disable', me);
285
+ },
286
+
287
+ /**
288
+ * Enables the FocusManager by turning on all automatic focus management and keyboard navigation
289
+ * @param {Boolean/Object} options Either `true`/`false` to turn on the focus frame, or an object
290
+ * with the following options:
291
+ * @param {Boolean} [focusFrame=false] `true` to show the focus frame around a component when it is focused.
292
+ */
293
+ enable: function(options) {
294
+ var me = this;
295
+
296
+ if (options === true) {
297
+ options = { focusFrame: true };
298
+ }
299
+ me.options = options = options || {};
300
+
301
+ if (me.enabled) {
302
+ return;
303
+ }
304
+
305
+ // When calling addFocusListener on Containers, the FocusManager must be enabled, otherwise it won't do it.
306
+ me.enabled = true;
307
+ me.initDOM(options);
308
+
309
+ // Start handling key navigation
310
+ me.keyNav.enable();
311
+
312
+ // Finally, let's focus our global focus el so we start fresh
313
+ me.focusEl.focus();
314
+ delete me.focusedCmp;
315
+
316
+ me.fireEvent('enable', me);
317
+ },
318
+
319
+ focusLast: function(e) {
320
+ var me = this;
321
+
322
+ if (me.isWhitelisted(me.focusedCmp)) {
323
+ return true;
324
+ }
325
+
326
+ // Go back to last focused item
327
+ if (me.previousFocusedCmp) {
328
+ me.previousFocusedCmp.focus();
329
+ }
330
+ },
331
+
332
+ getRootComponents: function() {
333
+ var me = this,
334
+ CQ = Ext.ComponentQuery,
335
+ inline = CQ.query(':focusable:root:not([floating])'),
336
+ floating = CQ.query(':focusable:root[floating]');
337
+
338
+ // Floating items should go to the top of our root stack, and be ordered
339
+ // by their z-index (highest first)
340
+ floating.sort(function(a, b) {
341
+ return a.el.getZIndex() > b.el.getZIndex();
342
+ });
343
+
344
+ return floating.concat(inline);
345
+ },
346
+
347
+ initDOM: function(options) {
348
+ var me = this,
349
+ cls = me.focusFrameCls,
350
+ needListeners = Ext.ComponentQuery.query('{getFocusEl()}:not([focusListenerAdded])'),
351
+ i = 0, len = needListeners.length;
352
+
353
+ if (!Ext.isReady) {
354
+ return Ext.onReady(me.initDOM, me);
355
+ }
356
+
357
+ // When we are enabled, we must ensure that all Components which return a focusEl that is *not naturally focusable*
358
+ // have focus/blur listeners enabled to then trigger onFocus/onBlur handling so that we get to know about their focus action.
359
+ // These listeners are not added at initialization unless the FocusManager is enabled at that time.
360
+ for (; i < len; i++) {
361
+ needListeners[i].addFocusListener();
362
+ }
363
+
364
+ // Make the document body the global focus element
365
+ if (!me.focusEl) {
366
+ me.focusEl = Ext.getBody();
367
+ me.focusEl.dom.tabIndex = -1;
368
+ }
369
+
370
+ // Create global focus frame
371
+ if (!me.focusFrame && options.focusFrame) {
372
+ me.focusFrame = Ext.getBody().createChild({
373
+ cls: cls,
374
+ children: [
375
+ { cls: cls + '-top' },
376
+ { cls: cls + '-bottom' },
377
+ { cls: cls + '-left' },
378
+ { cls: cls + '-right' }
379
+ ],
380
+ style: 'top: -100px; left: -100px;'
381
+ });
382
+ me.focusFrame.setVisibilityMode(Ext.Element.DISPLAY);
383
+ me.focusFrame.hide().setLeftTop(0, 0);
384
+ }
385
+ },
386
+
387
+ isWhitelisted: function(cmp) {
388
+ return cmp && Ext.Array.some(this.whitelist, function(x) {
389
+ return cmp.isXType(x);
390
+ });
391
+ },
392
+
393
+ navigateIn: function(e) {
394
+ var me = this,
395
+ focusedCmp = me.focusedCmp,
396
+ defaultRoot,
397
+ firstChild;
398
+
399
+ if (me.isWhitelisted(focusedCmp)) {
400
+ return true;
401
+ }
402
+
403
+ if (!focusedCmp) {
404
+ // No focus yet, so focus the first root cmp on the page
405
+ defaultRoot = me.getRootComponents()[0];
406
+ if (defaultRoot) {
407
+ // If the default root is based upon the body, then it will already be focused, and will not fire a focus event to
408
+ // trigger its own onFocus processing, so we have to programatically blur it first.
409
+ if (defaultRoot.getFocusEl() === me.focusEl) {
410
+ me.focusEl.blur();
411
+ }
412
+ defaultRoot.focus();
413
+ }
414
+ } else {
415
+ // Drill into child ref items of the focused cmp, if applicable.
416
+ // This works for any Component with a getRefItems implementation.
417
+ firstChild = focusedCmp.hasFocus ? Ext.ComponentQuery.query('>:focusable', focusedCmp)[0] : focusedCmp;
418
+ if (firstChild) {
419
+ firstChild.focus();
420
+ } else {
421
+ // Let's try to fire a click event, as if it came from the mouse
422
+ if (Ext.isFunction(focusedCmp.onClick)) {
423
+ e.button = 0;
424
+ focusedCmp.onClick(e);
425
+ if (focusedCmp.isVisible(true)) {
426
+ focusedCmp.focus();
427
+ } else {
428
+ me.navigateOut();
429
+ }
430
+ }
431
+ }
432
+ }
433
+ },
434
+
435
+ navigateOut: function(e) {
436
+ var me = this,
437
+ parent;
438
+
439
+ if (!me.focusedCmp || !(parent = me.focusedCmp.up(':focusable'))) {
440
+ me.focusEl.focus();
441
+ } else {
442
+ parent.focus();
443
+ }
444
+
445
+ // In some browsers (Chrome) FocusManager can handle this before other
446
+ // handlers. Ext Windows have their own Esc key handling, so we need to
447
+ // return true here to allow the event to bubble.
448
+ return true;
449
+ },
450
+
451
+ navigateSiblings: function(e, source, parent) {
452
+ var me = this,
453
+ src = source || me,
454
+ key = e.getKey(),
455
+ EO = Ext.EventObject,
456
+ goBack = e.shiftKey || key == EO.LEFT || key == EO.UP,
457
+ checkWhitelist = key == EO.LEFT || key == EO.RIGHT || key == EO.UP || key == EO.DOWN,
458
+ nextSelector = goBack ? 'prev' : 'next',
459
+ idx, next, focusedCmp, siblings;
460
+
461
+ focusedCmp = (src.focusedCmp && src.focusedCmp.comp) || src.focusedCmp;
462
+ if (!focusedCmp && !parent) {
463
+ return true;
464
+ }
465
+
466
+ if (checkWhitelist && me.isWhitelisted(focusedCmp)) {
467
+ return true;
468
+ }
469
+
470
+ // If no focused Component, or a root level one was focused, then siblings are root components.
471
+ if (!focusedCmp || focusedCmp.is(':root')) {
472
+ siblings = me.getRootComponents();
473
+ } else {
474
+ // Else if the focused component has a parent, get siblings from there
475
+ parent = parent || focusedCmp.up();
476
+ if (parent) {
477
+ siblings = parent.getRefItems();
478
+ }
479
+ }
480
+
481
+
482
+ // Navigate if we have found siblings.
483
+ if (siblings) {
484
+ idx = focusedCmp ? Ext.Array.indexOf(siblings, focusedCmp) : -1;
485
+ next = Ext.ComponentQuery.query(':' + nextSelector + 'Focus(' + idx + ')', siblings)[0];
486
+ if (next && focusedCmp !== next) {
487
+ next.focus();
488
+ return next;
489
+ }
490
+ }
491
+ },
492
+
493
+ onComponentBlur: function(cmp, e) {
494
+ var me = this;
495
+
496
+ if (me.focusedCmp === cmp) {
497
+ me.previousFocusedCmp = cmp;
498
+ delete me.focusedCmp;
499
+ }
500
+
501
+ if (me.focusFrame) {
502
+ me.focusFrame.hide();
503
+ }
504
+ },
505
+
506
+ onComponentFocus: function(cmp, e) {
507
+ var me = this,
508
+ chain = me.focusChain,
509
+ parent;
510
+
511
+ if (!cmp.isFocusable()) {
512
+ me.clearComponent(cmp);
513
+
514
+ // Check our focus chain, so we don't run into a never ending recursion
515
+ // If we've attempted (unsuccessfully) to focus this component before,
516
+ // then we're caught in a loop of child->parent->...->child and we
517
+ // need to cut the loop off rather than feed into it.
518
+ if (chain[cmp.id]) {
519
+ return;
520
+ }
521
+
522
+ // Try to focus the parent instead
523
+ parent = cmp.up();
524
+ if (parent) {
525
+ // Add component to our focus chain to detect infinite focus loop
526
+ // before we fire off an attempt to focus our parent.
527
+ // See the comments above.
528
+ chain[cmp.id] = true;
529
+ parent.focus();
530
+ }
531
+
532
+ return;
533
+ }
534
+ // Clear our focus chain when we have a focusable component
535
+ me.focusChain = {};
536
+
537
+ // Capture the focusEl to frame now.
538
+ // Button returns its encapsulating element during the focus phase
539
+ // So that element gets styled and framed.
540
+ me.focusTask.delay(10, null, null, [cmp, cmp.getFocusEl()]);
541
+ },
542
+
543
+ handleComponentFocus: function(cmp, focusEl) {
544
+ var me = this,
545
+ cls,
546
+ ff,
547
+ fw,
548
+ box,
549
+ bt,
550
+ bl,
551
+ bw,
552
+ bh,
553
+ ft,
554
+ fb,
555
+ fl,
556
+ fr;
557
+
558
+ if (me.fireEvent('beforecomponentfocus', me, cmp, me.previousFocusedCmp) === false) {
559
+ me.clearComponent(cmp);
560
+ return;
561
+ }
562
+
563
+ me.focusedCmp = cmp;
564
+
565
+ // If we have a focus frame, show it around the focused component
566
+ if (me.shouldShowFocusFrame(cmp)) {
567
+ cls = '.' + me.focusFrameCls + '-';
568
+ ff = me.focusFrame;
569
+ box = focusEl.getPageBox();
570
+
571
+ // Size the focus frame's t/b/l/r according to the box
572
+ // This leaves a hole in the middle of the frame so user
573
+ // interaction w/ the mouse can continue
574
+ bt = box.top;
575
+ bl = box.left;
576
+ bw = box.width;
577
+ bh = box.height;
578
+ ft = ff.child(cls + 'top');
579
+ fb = ff.child(cls + 'bottom');
580
+ fl = ff.child(cls + 'left');
581
+ fr = ff.child(cls + 'right');
582
+
583
+ ft.setWidth(bw).setLeftTop(bl, bt);
584
+ fb.setWidth(bw).setLeftTop(bl, bt + bh - 2);
585
+ fl.setHeight(bh - 2).setLeftTop(bl, bt + 2);
586
+ fr.setHeight(bh - 2).setLeftTop(bl + bw - 2, bt + 2);
587
+
588
+ ff.show();
589
+ }
590
+
591
+ me.fireEvent('componentfocus', me, cmp, me.previousFocusedCmp);
592
+ },
593
+
594
+ onComponentHide: function(cmp) {
595
+ var me = this,
596
+ cmpHadFocus = false,
597
+ focusedCmp = me.focusedCmp,
598
+ parent;
599
+
600
+ if (focusedCmp) {
601
+ // See if the Component being hidden was the focused Component, or owns the focused Component
602
+ // In these cases, focus needs to be removed from the focused Component to the nearest focusable ancestor
603
+ cmpHadFocus = cmp.hasFocus || (cmp.isContainer && cmp.isAncestor(me.focusedCmp));
604
+ }
605
+
606
+ me.clearComponent(cmp);
607
+
608
+ // Move focus onto the nearest focusable ancestor, or this is there is none
609
+ if (cmpHadFocus && (parent = cmp.up(':focusable'))) {
610
+ parent.focus();
611
+ } else {
612
+ me.focusEl.focus();
613
+ }
614
+ },
615
+
616
+ onComponentDestroy: function() {
617
+
618
+ },
619
+
620
+ removeDOM: function() {
621
+ var me = this;
622
+
623
+ // If we are still enabled globally, or there are still subscribers
624
+ // then we will halt here, since our DOM stuff is still being used
625
+ if (me.enabled || me.subscribers.length) {
626
+ return;
627
+ }
628
+
629
+ Ext.destroy(
630
+ me.focusFrame
631
+ );
632
+ delete me.focusEl;
633
+ delete me.focusFrame;
634
+ },
635
+
636
+ /**
637
+ * Removes the specified xtype from the {@link #whitelist}.
638
+ * @param {String/String[]} xtype Removes the xtype(s) from the {@link #whitelist}.
639
+ */
640
+ removeXTypeFromWhitelist: function(xtype) {
641
+ var me = this;
642
+
643
+ if (Ext.isArray(xtype)) {
644
+ Ext.Array.forEach(xtype, me.removeXTypeFromWhitelist, me);
645
+ return;
646
+ }
647
+
648
+ Ext.Array.remove(me.whitelist, xtype);
649
+ },
650
+
651
+ setupSubscriberKeys: function(container, keys) {
652
+ var me = this,
653
+ el = container.getFocusEl(),
654
+ scope = keys.scope,
655
+ handlers = {
656
+ backspace: me.focusLast,
657
+ enter: me.navigateIn,
658
+ esc: me.navigateOut,
659
+ scope: me
660
+ },
661
+
662
+ navSiblings = function(e) {
663
+ if (me.focusedCmp === container) {
664
+ // Root the sibling navigation to this container, so that we
665
+ // can automatically dive into the container, rather than forcing
666
+ // the user to hit the enter key to dive in.
667
+ return me.navigateSiblings(e, me, container);
668
+ } else {
669
+ return me.navigateSiblings(e);
670
+ }
671
+ };
672
+
673
+ Ext.iterate(keys, function(key, cb) {
674
+ handlers[key] = function(e) {
675
+ var ret = navSiblings(e);
676
+
677
+ if (Ext.isFunction(cb) && cb.call(scope || container, e, ret) === true) {
678
+ return true;
679
+ }
680
+
681
+ return ret;
682
+ };
683
+ }, me);
684
+
685
+ return new Ext.util.KeyNav(el, handlers);
686
+ },
687
+
688
+ shouldShowFocusFrame: function(cmp) {
689
+ var me = this,
690
+ opts = me.options || {},
691
+ cmpFocusEl = cmp.getFocusEl(),
692
+ cmpFocusElTag = Ext.getDom(cmpFocusEl).tagName;
693
+
694
+ // Do not show a focus frame if
695
+ // 1. We are configured not to.
696
+ // 2. No Component was passed
697
+ if (!me.focusFrame || !cmp) {
698
+ return false;
699
+ }
700
+
701
+ // Global trumps
702
+ if (opts.focusFrame) {
703
+ return true;
704
+ }
705
+
706
+ if (me.focusData[cmp.id].focusFrame) {
707
+ return true;
708
+ }
709
+
710
+ return false;
711
+ }
712
+ });