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,74 @@
1
+ /**
2
+ * @author Ed Spencer
3
+ *
4
+ * Small helper class to make creating {@link Ext.data.Store}s from Array data easier. An ArrayStore will be
5
+ * automatically configured with a {@link Ext.data.reader.Array}.
6
+ *
7
+ * A store configuration would be something like:
8
+ *
9
+ * var store = Ext.create('Ext.data.ArrayStore', {
10
+ * // store configs
11
+ * autoDestroy: true,
12
+ * storeId: 'myStore',
13
+ * // reader configs
14
+ * idIndex: 0,
15
+ * fields: [
16
+ * 'company',
17
+ * {name: 'price', type: 'float'},
18
+ * {name: 'change', type: 'float'},
19
+ * {name: 'pctChange', type: 'float'},
20
+ * {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
21
+ * ]
22
+ * });
23
+ *
24
+ * This store is configured to consume a returned object of the form:
25
+ *
26
+ * var myData = [
27
+ * ['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
28
+ * ['Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'],
29
+ * ['Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'],
30
+ * ['Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'],
31
+ * ['Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am']
32
+ * ];
33
+ *
34
+ * An object literal of this form could also be used as the {@link #cfg-data} config option.
35
+ *
36
+ */
37
+ Ext.define('Ext.data.ArrayStore', {
38
+ extend: 'Ext.data.Store',
39
+ alias: 'store.array',
40
+ requires: [
41
+ 'Ext.data.proxy.Memory',
42
+ 'Ext.data.reader.Array'
43
+ ],
44
+
45
+ constructor: function(config) {
46
+ config = Ext.apply({
47
+ proxy: {
48
+ type: 'memory',
49
+ reader: 'array'
50
+ }
51
+ }, config);
52
+ this.callParent([config]);
53
+ },
54
+
55
+ loadData: function(data, append) {
56
+ if (this.expandData === true) {
57
+ var r = [],
58
+ i = 0,
59
+ ln = data.length;
60
+
61
+ for (; i < ln; i++) {
62
+ r[r.length] = [data[i]];
63
+ }
64
+
65
+ data = r;
66
+ }
67
+
68
+ this.callParent([data, append]);
69
+ }
70
+ }, function() {
71
+ // backwards compat
72
+ Ext.data.SimpleStore = Ext.data.ArrayStore;
73
+ // Ext.reg('simplestore', Ext.data.SimpleStore);
74
+ });
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @author Ed Spencer
3
+ * @class Ext.data.Batch
4
+ *
5
+ * <p>Provides a mechanism to run one or more {@link Ext.data.Operation operations} in a given order. Fires the 'operationcomplete' event
6
+ * after the completion of each Operation, and the 'complete' event when all Operations have been successfully executed. Fires an 'exception'
7
+ * event if any of the Operations encounter an exception.</p>
8
+ *
9
+ * <p>Usually these are only used internally by {@link Ext.data.proxy.Proxy} classes</p>
10
+ *
11
+ */
12
+ Ext.define('Ext.data.Batch', {
13
+ mixins: {
14
+ observable: 'Ext.util.Observable'
15
+ },
16
+
17
+ /**
18
+ * @cfg {Boolean} autoStart
19
+ * True to immediately start processing the batch as soon as it is constructed (defaults to false)
20
+ */
21
+ autoStart: false,
22
+
23
+ /**
24
+ * @cfg {Boolean} pauseOnException
25
+ * True to pause the execution of the batch if any operation encounters an exception
26
+ * (defaults to false). If you set this to true you are responsible for implementing the appropriate
27
+ * handling logic and restarting or discarding the batch as needed. There are different ways you could
28
+ * do this, e.g. by handling the batch's {@link #exception} event directly, or perhaps by overriding
29
+ * {@link Ext.data.AbstractStore#onBatchException onBatchException} at the store level. If you do pause
30
+ * and attempt to handle the exception you can call {@link #retry} to process the same operation again.
31
+ *
32
+ * Note that {@link Ext.data.Operation operations} are atomic, so any operations that may have succeeded
33
+ * prior to an exception (and up until pausing the batch) will be finalized at the server level and will
34
+ * not be automatically reversible. Any transactional / rollback behavior that might be desired would have
35
+ * to be implemented at the application level. Pausing on exception will likely be most beneficial when
36
+ * used in coordination with such a scheme, where an exception might actually affect subsequent operations
37
+ * in the same batch and so should be handled before continuing with the next operation.
38
+ *
39
+ * If you have not implemented transactional operation handling then this option should typically be left
40
+ * to the default of false (e.g. process as many operations as possible, and handle any exceptions
41
+ * asynchronously without holding up the rest of the batch).
42
+ */
43
+ pauseOnException: false,
44
+
45
+ /**
46
+ * @property {Number} current
47
+ * The index of the current operation being executed. Read only
48
+ */
49
+ current: -1,
50
+
51
+ /**
52
+ * @property {Number} total
53
+ * The total number of operations in this batch. Read only
54
+ */
55
+ total: 0,
56
+
57
+ /**
58
+ * @property {Boolean} isRunning
59
+ * True if the batch is currently running. Read only
60
+ */
61
+ isRunning: false,
62
+
63
+ /**
64
+ * @property {Boolean} isComplete
65
+ * True if this batch has been executed completely. Read only
66
+ */
67
+ isComplete: false,
68
+
69
+ /**
70
+ * @property {Boolean} hasException
71
+ * True if this batch has encountered an exception. This is cleared at the start of each operation. Read only
72
+ */
73
+ hasException: false,
74
+
75
+ /**
76
+ * Creates new Batch object.
77
+ * @param {Object} [config] Config object
78
+ */
79
+ constructor: function(config) {
80
+ var me = this;
81
+
82
+ /**
83
+ * @event complete
84
+ * Fired when all operations of this batch have been completed
85
+ * @param {Ext.data.Batch} batch The batch object
86
+ * @param {Object} operation The last operation that was executed
87
+ */
88
+
89
+ /**
90
+ * @event exception
91
+ * Fired when a operation encountered an exception
92
+ * @param {Ext.data.Batch} batch The batch object
93
+ * @param {Object} operation The operation that encountered the exception
94
+ */
95
+
96
+ /**
97
+ * @event operationcomplete
98
+ * Fired when each operation of the batch completes
99
+ * @param {Ext.data.Batch} batch The batch object
100
+ * @param {Object} operation The operation that just completed
101
+ */
102
+
103
+ me.mixins.observable.constructor.call(me, config);
104
+
105
+ /**
106
+ * Ordered array of operations that will be executed by this batch
107
+ * @property {Ext.data.Operation[]} operations
108
+ */
109
+ me.operations = [];
110
+
111
+ /**
112
+ * Ordered array of operations that raised an exception during the most recent
113
+ * batch execution and did not successfully complete
114
+ * @property {Ext.data.Operation[]} exceptions
115
+ */
116
+ me.exceptions = [];
117
+ },
118
+
119
+ /**
120
+ * Adds a new operation to this batch at the end of the {@link #operations} array
121
+ * @param {Object} operation The {@link Ext.data.Operation Operation} object
122
+ * @return {Ext.data.Batch} this
123
+ */
124
+ add: function(operation) {
125
+ this.total++;
126
+
127
+ operation.setBatch(this);
128
+
129
+ this.operations.push(operation);
130
+
131
+ return this;
132
+ },
133
+
134
+ /**
135
+ * Kicks off execution of the batch, continuing from the next operation if the previous
136
+ * operation encountered an exception, or if execution was paused. Use this method to start
137
+ * the batch for the first time or to restart a paused batch by skipping the current
138
+ * unsuccessful operation.
139
+ *
140
+ * To retry processing the current operation before continuing to the rest of the batch (e.g.
141
+ * because you explicitly handled the operation's exception), call {@link #retry} instead.
142
+ *
143
+ * Note that if the batch is already running any call to start will be ignored.
144
+ *
145
+ * @return {Ext.data.Batch} this
146
+ */
147
+ start: function(/* private */ index) {
148
+ var me = this;
149
+
150
+ if (me.isRunning) {
151
+ return me;
152
+ }
153
+
154
+ me.exceptions.length = 0;
155
+ me.hasException = false;
156
+ me.isRunning = true;
157
+
158
+ return me.runOperation(Ext.isDefined(index) ? index : me.current + 1);
159
+ },
160
+
161
+ /**
162
+ * Kicks off execution of the batch, continuing from the current operation. This is intended
163
+ * for restarting a {@link #pause paused} batch after an exception, and the operation that raised
164
+ * the exception will now be retried. The batch will then continue with its normal processing until
165
+ * all operations are complete or another exception is encountered.
166
+ *
167
+ * Note that if the batch is already running any call to retry will be ignored.
168
+ *
169
+ * @return {Ext.data.Batch} this
170
+ */
171
+ retry: function() {
172
+ return this.start(this.current);
173
+ },
174
+
175
+ /**
176
+ * @private
177
+ * Runs the next operation, relative to this.current.
178
+ * @return {Ext.data.Batch} this
179
+ */
180
+ runNextOperation: function() {
181
+ return this.runOperation(this.current + 1);
182
+ },
183
+
184
+ /**
185
+ * Pauses execution of the batch, but does not cancel the current operation
186
+ * @return {Ext.data.Batch} this
187
+ */
188
+ pause: function() {
189
+ this.isRunning = false;
190
+ return this;
191
+ },
192
+
193
+ /**
194
+ * Executes an operation by its numeric index in the {@link #operations} array
195
+ * @param {Number} index The operation index to run
196
+ * @return {Ext.data.Batch} this
197
+ */
198
+ runOperation: function(index) {
199
+ var me = this,
200
+ operations = me.operations,
201
+ operation = operations[index],
202
+ onProxyReturn;
203
+
204
+ if (operation === undefined) {
205
+ me.isRunning = false;
206
+ me.isComplete = true;
207
+ me.fireEvent('complete', me, operations[operations.length - 1]);
208
+ } else {
209
+ me.current = index;
210
+
211
+ onProxyReturn = function(operation) {
212
+ var hasException = operation.hasException();
213
+
214
+ if (hasException) {
215
+ me.hasException = true;
216
+ me.exceptions.push(operation);
217
+ me.fireEvent('exception', me, operation);
218
+ }
219
+
220
+ if (hasException && me.pauseOnException) {
221
+ me.pause();
222
+ } else {
223
+ operation.setCompleted();
224
+ me.fireEvent('operationcomplete', me, operation);
225
+ me.runNextOperation();
226
+ }
227
+ };
228
+
229
+ operation.setStarted();
230
+
231
+ me.proxy[operation.action](operation, onProxyReturn, me);
232
+ }
233
+
234
+ return me;
235
+ }
236
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @private
3
+ */
4
+ Ext.define('Ext.data.BufferStore', {
5
+ extend: 'Ext.data.Store',
6
+ alias: 'store.buffer',
7
+ sortOnLoad: false,
8
+ filterOnLoad: false,
9
+
10
+ constructor: function() {
11
+ Ext.Error.raise('The BufferStore class has been deprecated. Instead, specify the buffered config option on Ext.data.Store');
12
+ }
13
+ });
@@ -0,0 +1,969 @@
1
+ /**
2
+ * The Connection class encapsulates a connection to the page's originating domain, allowing requests to be made either
3
+ * to a configured URL, or to a URL specified at request time.
4
+ *
5
+ * Requests made by this class are asynchronous, and will return immediately. No data from the server will be available
6
+ * to the statement immediately following the {@link #request} call. To process returned data, use a success callback
7
+ * in the request options object, or an {@link #requestcomplete event listener}.
8
+ *
9
+ * # File Uploads
10
+ *
11
+ * File uploads are not performed using normal "Ajax" techniques, that is they are not performed using XMLHttpRequests.
12
+ * Instead the form is submitted in the standard manner with the DOM &lt;form&gt; element temporarily modified to have its
13
+ * target set to refer to a dynamically generated, hidden &lt;iframe&gt; which is inserted into the document but removed
14
+ * after the return data has been gathered.
15
+ *
16
+ * The server response is parsed by the browser to create the document for the IFRAME. If the server is using JSON to
17
+ * send the return object, then the Content-Type header must be set to "text/html" in order to tell the browser to
18
+ * insert the text unchanged into the document body.
19
+ *
20
+ * Characters which are significant to an HTML parser must be sent as HTML entities, so encode `<` as `&lt;`, `&` as
21
+ * `&amp;` etc.
22
+ *
23
+ * The response text is retrieved from the document, and a fake XMLHttpRequest object is created containing a
24
+ * responseText property in order to conform to the requirements of event handlers and callbacks.
25
+ *
26
+ * Be aware that file upload packets are sent with the content type multipart/form and some server technologies
27
+ * (notably JEE) may require some custom processing in order to retrieve parameter names and parameter values from the
28
+ * packet content.
29
+ *
30
+ * Also note that it's not possible to check the response code of the hidden iframe, so the success handler will ALWAYS fire.
31
+ */
32
+ Ext.define('Ext.data.Connection', {
33
+ mixins: {
34
+ observable: 'Ext.util.Observable'
35
+ },
36
+
37
+ statics: {
38
+ requestId: 0
39
+ },
40
+
41
+ url: null,
42
+ async: true,
43
+ method: null,
44
+ username: '',
45
+ password: '',
46
+
47
+ /**
48
+ * @cfg {Boolean} disableCaching
49
+ * True to add a unique cache-buster param to GET requests.
50
+ */
51
+ disableCaching: true,
52
+
53
+ /**
54
+ * @cfg {Boolean} withCredentials
55
+ * True to set `withCredentials = true` on the XHR object
56
+ */
57
+ withCredentials: false,
58
+
59
+ /**
60
+ * @cfg {Boolean} cors
61
+ * True to enable CORS support on the XHR object. Currently the only effect of this option
62
+ * is to use the XDomainRequest object instead of XMLHttpRequest if the browser is IE8 or above.
63
+ */
64
+ cors: false,
65
+
66
+ /**
67
+ * @cfg {String} disableCachingParam
68
+ * Change the parameter which is sent went disabling caching through a cache buster.
69
+ */
70
+ disableCachingParam: '_dc',
71
+
72
+ /**
73
+ * @cfg {Number} timeout
74
+ * The timeout in milliseconds to be used for requests.
75
+ */
76
+ timeout : 30000,
77
+
78
+ /**
79
+ * @cfg {Object} extraParams
80
+ * Any parameters to be appended to the request.
81
+ */
82
+
83
+ /**
84
+ * @cfg {Boolean} [autoAbort=false]
85
+ * Whether this request should abort any pending requests.
86
+ */
87
+
88
+ /**
89
+ * @cfg {String} method
90
+ * The default HTTP method to be used for requests.
91
+ *
92
+ * If not set, but {@link #request} params are present, POST will be used;
93
+ * otherwise, GET will be used.
94
+ */
95
+
96
+ /**
97
+ * @cfg {Object} defaultHeaders
98
+ * An object containing request headers which are added to each request made by this object.
99
+ */
100
+
101
+ useDefaultHeader : true,
102
+ defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',
103
+ useDefaultXhrHeader : true,
104
+ defaultXhrHeader : 'XMLHttpRequest',
105
+
106
+ constructor : function(config) {
107
+ config = config || {};
108
+ Ext.apply(this, config);
109
+
110
+ /**
111
+ * @event beforerequest
112
+ * Fires before a network request is made to retrieve a data object.
113
+ * @param {Ext.data.Connection} conn This Connection object.
114
+ * @param {Object} options The options config object passed to the {@link #request} method.
115
+ */
116
+ /**
117
+ * @event requestcomplete
118
+ * Fires if the request was successfully completed.
119
+ * @param {Ext.data.Connection} conn This Connection object.
120
+ * @param {Object} response The XHR object containing the response data.
121
+ * See [The XMLHttpRequest Object](http://www.w3.org/TR/XMLHttpRequest/) for details.
122
+ * @param {Object} options The options config object passed to the {@link #request} method.
123
+ */
124
+ /**
125
+ * @event requestexception
126
+ * Fires if an error HTTP status was returned from the server.
127
+ * See [HTTP Status Code Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
128
+ * for details of HTTP status codes.
129
+ * @param {Ext.data.Connection} conn This Connection object.
130
+ * @param {Object} response The XHR object containing the response data.
131
+ * See [The XMLHttpRequest Object](http://www.w3.org/TR/XMLHttpRequest/) for details.
132
+ * @param {Object} options The options config object passed to the {@link #request} method.
133
+ */
134
+ this.requests = {};
135
+ this.mixins.observable.constructor.call(this);
136
+ },
137
+
138
+ /**
139
+ * Sends an HTTP request to a remote server.
140
+ *
141
+ * **Important:** Ajax server requests are asynchronous, and this call will
142
+ * return before the response has been received. Process any returned data
143
+ * in a callback function.
144
+ *
145
+ * Ext.Ajax.request({
146
+ * url: 'ajax_demo/sample.json',
147
+ * success: function(response, opts) {
148
+ * var obj = Ext.decode(response.responseText);
149
+ * console.dir(obj);
150
+ * },
151
+ * failure: function(response, opts) {
152
+ * console.log('server-side failure with status code ' + response.status);
153
+ * }
154
+ * });
155
+ *
156
+ * To execute a callback function in the correct scope, use the `scope` option.
157
+ *
158
+ * @param {Object} options An object which may contain the following properties:
159
+ *
160
+ * (The options object may also contain any other property which might be needed to perform
161
+ * postprocessing in a callback because it is passed to callback functions.)
162
+ *
163
+ * @param {String/Function} options.url The URL to which to send the request, or a function
164
+ * to call which returns a URL string. The scope of the function is specified by the `scope` option.
165
+ * Defaults to the configured `url`.
166
+ *
167
+ * @param {Object/String/Function} options.params An object containing properties which are
168
+ * used as parameters to the request, a url encoded string or a function to call to get either. The scope
169
+ * of the function is specified by the `scope` option.
170
+ *
171
+ * @param {String} options.method The HTTP method to use
172
+ * for the request. Defaults to the configured method, or if no method was configured,
173
+ * "GET" if no parameters are being sent, and "POST" if parameters are being sent. Note that
174
+ * the method name is case-sensitive and should be all caps.
175
+ *
176
+ * @param {Function} options.callback The function to be called upon receipt of the HTTP response.
177
+ * The callback is called regardless of success or failure and is passed the following parameters:
178
+ * @param {Object} options.callback.options The parameter to the request call.
179
+ * @param {Boolean} options.callback.success True if the request succeeded.
180
+ * @param {Object} options.callback.response The XMLHttpRequest object containing the response data.
181
+ * See [www.w3.org/TR/XMLHttpRequest/](http://www.w3.org/TR/XMLHttpRequest/) for details about
182
+ * accessing elements of the response.
183
+ *
184
+ * @param {Function} options.success The function to be called upon success of the request.
185
+ * The callback is passed the following parameters:
186
+ * @param {Object} options.success.response The XMLHttpRequest object containing the response data.
187
+ * @param {Object} options.success.options The parameter to the request call.
188
+ *
189
+ * @param {Function} options.failure The function to be called upon success of the request.
190
+ * The callback is passed the following parameters:
191
+ * @param {Object} options.failure.response The XMLHttpRequest object containing the response data.
192
+ * @param {Object} options.failure.options The parameter to the request call.
193
+ *
194
+ * @param {Object} options.scope The scope in which to execute the callbacks: The "this" object for
195
+ * the callback function. If the `url`, or `params` options were specified as functions from which to
196
+ * draw values, then this also serves as the scope for those function calls. Defaults to the browser
197
+ * window.
198
+ *
199
+ * @param {Number} options.timeout The timeout in milliseconds to be used for this request.
200
+ * Defaults to 30 seconds.
201
+ *
202
+ * @param {Ext.Element/HTMLElement/String} options.form The `<form>` Element or the id of the `<form>`
203
+ * to pull parameters from.
204
+ *
205
+ * @param {Boolean} options.isUpload **Only meaningful when used with the `form` option.**
206
+ *
207
+ * True if the form object is a file upload (will be set automatically if the form was configured
208
+ * with **`enctype`** `"multipart/form-data"`).
209
+ *
210
+ * File uploads are not performed using normal "Ajax" techniques, that is they are **not**
211
+ * performed using XMLHttpRequests. Instead the form is submitted in the standard manner with the
212
+ * DOM `<form>` element temporarily modified to have its [target][] set to refer to a dynamically
213
+ * generated, hidden `<iframe>` which is inserted into the document but removed after the return data
214
+ * has been gathered.
215
+ *
216
+ * The server response is parsed by the browser to create the document for the IFRAME. If the
217
+ * server is using JSON to send the return object, then the [Content-Type][] header must be set to
218
+ * "text/html" in order to tell the browser to insert the text unchanged into the document body.
219
+ *
220
+ * The response text is retrieved from the document, and a fake XMLHttpRequest object is created
221
+ * containing a `responseText` property in order to conform to the requirements of event handlers
222
+ * and callbacks.
223
+ *
224
+ * Be aware that file upload packets are sent with the content type [multipart/form][] and some server
225
+ * technologies (notably JEE) may require some custom processing in order to retrieve parameter names
226
+ * and parameter values from the packet content.
227
+ *
228
+ * [target]: http://www.w3.org/TR/REC-html40/present/frames.html#adef-target
229
+ * [Content-Type]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17
230
+ * [multipart/form]: http://www.faqs.org/rfcs/rfc2388.html
231
+ *
232
+ * @param {Object} options.headers Request headers to set for the request.
233
+ *
234
+ * @param {Object} options.xmlData XML document to use for the post. Note: This will be used instead
235
+ * of params for the post data. Any params will be appended to the URL.
236
+ *
237
+ * @param {Object/String} options.jsonData JSON data to use as the post. Note: This will be used
238
+ * instead of params for the post data. Any params will be appended to the URL.
239
+ *
240
+ * @param {Boolean} options.disableCaching True to add a unique cache-buster param to GET requests.
241
+ *
242
+ * @param {Boolean} options.withCredentials True to add the withCredentials property to the XHR object
243
+ *
244
+ * @return {Object} The request object. This may be used to cancel the request.
245
+ */
246
+ request : function(options) {
247
+ options = options || {};
248
+ var me = this,
249
+ scope = options.scope || window,
250
+ username = options.username || me.username,
251
+ password = options.password || me.password || '',
252
+ async,
253
+ requestOptions,
254
+ request,
255
+ headers,
256
+ xhr;
257
+
258
+ if (me.fireEvent('beforerequest', me, options) !== false) {
259
+
260
+ requestOptions = me.setOptions(options, scope);
261
+
262
+ if (me.isFormUpload(options)) {
263
+ me.upload(options.form, requestOptions.url, requestOptions.data, options);
264
+ return null;
265
+ }
266
+
267
+ // if autoabort is set, cancel the current transactions
268
+ if (options.autoAbort || me.autoAbort) {
269
+ me.abort();
270
+ }
271
+
272
+ // create a connection object
273
+ async = options.async !== false ? (options.async || me.async) : false;
274
+ xhr = me.openRequest(options, requestOptions, async, username, password);
275
+
276
+ headers = me.setupHeaders(xhr, options, requestOptions.data, requestOptions.params);
277
+
278
+ // create the transaction object
279
+ request = {
280
+ id: ++Ext.data.Connection.requestId,
281
+ xhr: xhr,
282
+ headers: headers,
283
+ options: options,
284
+ async: async,
285
+ timeout: setTimeout(function() {
286
+ request.timedout = true;
287
+ me.abort(request);
288
+ }, options.timeout || me.timeout)
289
+ };
290
+ me.requests[request.id] = request;
291
+ me.latestId = request.id;
292
+ // bind our statechange listener
293
+ if (async) {
294
+ xhr.onreadystatechange = Ext.Function.bind(me.onStateChange, me, [request]);
295
+ }
296
+
297
+ // start the request!
298
+ xhr.send(requestOptions.data);
299
+ if (!async) {
300
+ return me.onComplete(request);
301
+ }
302
+ return request;
303
+ } else {
304
+ Ext.callback(options.callback, options.scope, [options, undefined, undefined]);
305
+ return null;
306
+ }
307
+ },
308
+
309
+ /**
310
+ * Uploads a form using a hidden iframe.
311
+ * @param {String/HTMLElement/Ext.Element} form The form to upload
312
+ * @param {String} url The url to post to
313
+ * @param {String} params Any extra parameters to pass
314
+ * @param {Object} options The initial options
315
+ */
316
+ upload: function(form, url, params, options) {
317
+ form = Ext.getDom(form);
318
+ options = options || {};
319
+
320
+ var id = Ext.id(),
321
+ frame = document.createElement('iframe'),
322
+ hiddens = [],
323
+ encoding = 'multipart/form-data',
324
+ buf = {
325
+ target: form.target,
326
+ method: form.method,
327
+ encoding: form.encoding,
328
+ enctype: form.enctype,
329
+ action: form.action
330
+ },
331
+ addField = function(name, value) {
332
+ hiddenItem = document.createElement('input');
333
+ Ext.fly(hiddenItem).set({
334
+ type: 'hidden',
335
+ value: value,
336
+ name: name
337
+ });
338
+ form.appendChild(hiddenItem);
339
+ hiddens.push(hiddenItem);
340
+ },
341
+ hiddenItem, obj, value, name, vLen, v, hLen, h;
342
+
343
+ /*
344
+ * Originally this behaviour was modified for Opera 10 to apply the secure URL after
345
+ * the frame had been added to the document. It seems this has since been corrected in
346
+ * Opera so the behaviour has been reverted, the URL will be set before being added.
347
+ */
348
+ Ext.fly(frame).set({
349
+ id: id,
350
+ name: id,
351
+ cls: Ext.baseCSSPrefix + 'hide-display',
352
+ src: Ext.SSL_SECURE_URL
353
+ });
354
+
355
+ document.body.appendChild(frame);
356
+
357
+ // This is required so that IE doesn't pop the response up in a new window.
358
+ if (document.frames) {
359
+ document.frames[id].name = id;
360
+ }
361
+
362
+ Ext.fly(form).set({
363
+ target: id,
364
+ method: 'POST',
365
+ enctype: encoding,
366
+ encoding: encoding,
367
+ action: url || buf.action
368
+ });
369
+
370
+ // add dynamic params
371
+ if (params) {
372
+ obj = Ext.Object.fromQueryString(params) || {};
373
+
374
+ for (name in obj) {
375
+ if (obj.hasOwnProperty(name)) {
376
+ value = obj[name];
377
+ if (Ext.isArray(value)) {
378
+ vLen = value.length;
379
+ for (v = 0; v < vLen; v++) {
380
+ addField(name, value[v]);
381
+ }
382
+ } else {
383
+ addField(name, value);
384
+ }
385
+ }
386
+ }
387
+ }
388
+
389
+ Ext.fly(frame).on('load', Ext.Function.bind(this.onUploadComplete, this, [frame, options]), null, {single: true});
390
+ form.submit();
391
+
392
+ Ext.fly(form).set(buf);
393
+
394
+ hLen = hiddens.length;
395
+
396
+ for (h = 0; h < hLen; h++) {
397
+ Ext.removeNode(hiddens[h]);
398
+ }
399
+ },
400
+
401
+ /**
402
+ * @private
403
+ * Callback handler for the upload function. After we've submitted the form via the iframe this creates a bogus
404
+ * response object to simulate an XHR and populates its responseText from the now-loaded iframe's document body
405
+ * (or a textarea inside the body). We then clean up by removing the iframe
406
+ */
407
+ onUploadComplete: function(frame, options) {
408
+ var me = this,
409
+ // bogus response object
410
+ response = {
411
+ responseText: '',
412
+ responseXML: null
413
+ }, doc, firstChild;
414
+
415
+ try {
416
+ doc = frame.contentWindow.document || frame.contentDocument || window.frames[frame.id].document;
417
+ if (doc) {
418
+ if (doc.body) {
419
+ if (/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)) { // json response wrapped in textarea
420
+ response.responseText = firstChild.value;
421
+ } else {
422
+ response.responseText = doc.body.innerHTML;
423
+ }
424
+ }
425
+ //in IE the document may still have a body even if returns XML.
426
+ response.responseXML = doc.XMLDocument || doc;
427
+ }
428
+ } catch (e) {
429
+ }
430
+
431
+ me.fireEvent('requestcomplete', me, response, options);
432
+
433
+ Ext.callback(options.success, options.scope, [response, options]);
434
+ Ext.callback(options.callback, options.scope, [options, true, response]);
435
+
436
+ setTimeout(function() {
437
+ Ext.removeNode(frame);
438
+ }, 100);
439
+ },
440
+
441
+ /**
442
+ * Detects whether the form is intended to be used for an upload.
443
+ * @private
444
+ */
445
+ isFormUpload: function(options) {
446
+ var form = this.getForm(options);
447
+ if (form) {
448
+ return (options.isUpload || (/multipart\/form-data/i).test(form.getAttribute('enctype')));
449
+ }
450
+ return false;
451
+ },
452
+
453
+ /**
454
+ * Gets the form object from options.
455
+ * @private
456
+ * @param {Object} options The request options
457
+ * @return {HTMLElement} The form, null if not passed
458
+ */
459
+ getForm: function(options) {
460
+ return Ext.getDom(options.form) || null;
461
+ },
462
+
463
+ /**
464
+ * Sets various options such as the url, params for the request
465
+ * @param {Object} options The initial options
466
+ * @param {Object} scope The scope to execute in
467
+ * @return {Object} The params for the request
468
+ */
469
+ setOptions: function(options, scope) {
470
+ var me = this,
471
+ params = options.params || {},
472
+ extraParams = me.extraParams,
473
+ urlParams = options.urlParams,
474
+ url = options.url || me.url,
475
+ jsonData = options.jsonData,
476
+ method,
477
+ disableCache,
478
+ data;
479
+
480
+
481
+ // allow params to be a method that returns the params object
482
+ if (Ext.isFunction(params)) {
483
+ params = params.call(scope, options);
484
+ }
485
+
486
+ // allow url to be a method that returns the actual url
487
+ if (Ext.isFunction(url)) {
488
+ url = url.call(scope, options);
489
+ }
490
+
491
+ url = this.setupUrl(options, url);
492
+
493
+ //<debug>
494
+ if (!url) {
495
+ Ext.Error.raise({
496
+ options: options,
497
+ msg: 'No URL specified'
498
+ });
499
+ }
500
+ //</debug>
501
+
502
+ // check for xml or json data, and make sure json data is encoded
503
+ data = options.rawData || options.xmlData || jsonData || null;
504
+ if (jsonData && !Ext.isPrimitive(jsonData)) {
505
+ data = Ext.encode(data);
506
+ }
507
+
508
+ // make sure params are a url encoded string and include any extraParams if specified
509
+ if (Ext.isObject(params)) {
510
+ params = Ext.Object.toQueryString(params);
511
+ }
512
+
513
+ if (Ext.isObject(extraParams)) {
514
+ extraParams = Ext.Object.toQueryString(extraParams);
515
+ }
516
+
517
+ params = params + ((extraParams) ? ((params) ? '&' : '') + extraParams : '');
518
+
519
+ urlParams = Ext.isObject(urlParams) ? Ext.Object.toQueryString(urlParams) : urlParams;
520
+
521
+ params = this.setupParams(options, params);
522
+
523
+ // decide the proper method for this request
524
+ method = (options.method || me.method || ((params || data) ? 'POST' : 'GET')).toUpperCase();
525
+ this.setupMethod(options, method);
526
+
527
+
528
+ disableCache = options.disableCaching !== false ? (options.disableCaching || me.disableCaching) : false;
529
+ // if the method is get append date to prevent caching
530
+ if (method === 'GET' && disableCache) {
531
+ url = Ext.urlAppend(url, (options.disableCachingParam || me.disableCachingParam) + '=' + (new Date().getTime()));
532
+ }
533
+
534
+ // if the method is get or there is json/xml data append the params to the url
535
+ if ((method == 'GET' || data) && params) {
536
+ url = Ext.urlAppend(url, params);
537
+ params = null;
538
+ }
539
+
540
+ // allow params to be forced into the url
541
+ if (urlParams) {
542
+ url = Ext.urlAppend(url, urlParams);
543
+ }
544
+
545
+ return {
546
+ url: url,
547
+ method: method,
548
+ data: data || params || null
549
+ };
550
+ },
551
+
552
+ /**
553
+ * Template method for overriding url
554
+ * @template
555
+ * @private
556
+ * @param {Object} options
557
+ * @param {String} url
558
+ * @return {String} The modified url
559
+ */
560
+ setupUrl: function(options, url) {
561
+ var form = this.getForm(options);
562
+ if (form) {
563
+ url = url || form.action;
564
+ }
565
+ return url;
566
+ },
567
+
568
+
569
+ /**
570
+ * Template method for overriding params
571
+ * @template
572
+ * @private
573
+ * @param {Object} options
574
+ * @param {String} params
575
+ * @return {String} The modified params
576
+ */
577
+ setupParams: function(options, params) {
578
+ var form = this.getForm(options),
579
+ serializedForm;
580
+ if (form && !this.isFormUpload(options)) {
581
+ serializedForm = Ext.Element.serializeForm(form);
582
+ params = params ? (params + '&' + serializedForm) : serializedForm;
583
+ }
584
+ return params;
585
+ },
586
+
587
+ /**
588
+ * Template method for overriding method
589
+ * @template
590
+ * @private
591
+ * @param {Object} options
592
+ * @param {String} method
593
+ * @return {String} The modified method
594
+ */
595
+ setupMethod: function(options, method) {
596
+ if (this.isFormUpload(options)) {
597
+ return 'POST';
598
+ }
599
+ return method;
600
+ },
601
+
602
+ /**
603
+ * Setup all the headers for the request
604
+ * @private
605
+ * @param {Object} xhr The xhr object
606
+ * @param {Object} options The options for the request
607
+ * @param {Object} data The data for the request
608
+ * @param {Object} params The params for the request
609
+ */
610
+ setupHeaders: function(xhr, options, data, params) {
611
+ var me = this,
612
+ headers = Ext.apply({}, options.headers || {}, me.defaultHeaders || {}),
613
+ contentType = me.defaultPostHeader,
614
+ jsonData = options.jsonData,
615
+ xmlData = options.xmlData,
616
+ key,
617
+ header;
618
+
619
+ if (!headers['Content-Type'] && (data || params)) {
620
+ if (data) {
621
+ if (options.rawData) {
622
+ contentType = 'text/plain';
623
+ } else {
624
+ if (xmlData && Ext.isDefined(xmlData)) {
625
+ contentType = 'text/xml';
626
+ } else if (jsonData && Ext.isDefined(jsonData)) {
627
+ contentType = 'application/json';
628
+ }
629
+ }
630
+ }
631
+ headers['Content-Type'] = contentType;
632
+ }
633
+
634
+ if (me.useDefaultXhrHeader && !headers['X-Requested-With']) {
635
+ headers['X-Requested-With'] = me.defaultXhrHeader;
636
+ }
637
+ // set up all the request headers on the xhr object
638
+ try {
639
+ for (key in headers) {
640
+ if (headers.hasOwnProperty(key)) {
641
+ header = headers[key];
642
+ xhr.setRequestHeader(key, header);
643
+ }
644
+
645
+ }
646
+ } catch(e) {
647
+ me.fireEvent('exception', key, header);
648
+ }
649
+ return headers;
650
+ },
651
+
652
+ /**
653
+ * Creates the appropriate XHR transport for a given request on this browser. On IE
654
+ * this may be an `XDomainRequest` rather than an `XMLHttpRequest`.
655
+ * @private
656
+ */
657
+ newRequest: function (options) {
658
+ var xhr;
659
+
660
+ if ((options.cors || this.cors) && Ext.isIE && Ext.ieVersion >= 8) {
661
+ xhr = new XDomainRequest();
662
+ } else {
663
+ xhr = this.getXhrInstance();
664
+ }
665
+
666
+ return xhr;
667
+ },
668
+
669
+ /**
670
+ * Creates and opens an appropriate XHR transport for a given request on this browser.
671
+ * This logic is contained in an individual method to allow for overrides to process all
672
+ * of the parameters and options and return a suitable, open connection.
673
+ * @private
674
+ */
675
+ openRequest: function (options, requestOptions, async, username, password) {
676
+ var xhr = this.newRequest(options);
677
+
678
+ if (username) {
679
+ xhr.open(requestOptions.method, requestOptions.url, async, username, password);
680
+ } else {
681
+ xhr.open(requestOptions.method, requestOptions.url, async);
682
+ }
683
+
684
+ if (options.withCredentials || this.withCredentials) {
685
+ xhr.withCredentials = true;
686
+ }
687
+
688
+ return xhr;
689
+ },
690
+
691
+ /**
692
+ * Creates the appropriate XHR transport for this browser.
693
+ * @private
694
+ */
695
+ getXhrInstance: (function() {
696
+ var options = [function() {
697
+ return new XMLHttpRequest();
698
+ }, function() {
699
+ return new ActiveXObject('MSXML2.XMLHTTP.3.0');
700
+ }, function() {
701
+ return new ActiveXObject('MSXML2.XMLHTTP');
702
+ }, function() {
703
+ return new ActiveXObject('Microsoft.XMLHTTP');
704
+ }], i = 0,
705
+ len = options.length,
706
+ xhr;
707
+
708
+ for (; i < len; ++i) {
709
+ try {
710
+ xhr = options[i];
711
+ xhr();
712
+ break;
713
+ } catch(e) {
714
+ }
715
+ }
716
+ return xhr;
717
+ }()),
718
+
719
+ /**
720
+ * Determines whether this object has a request outstanding.
721
+ * @param {Object} [request] Defaults to the last transaction
722
+ * @return {Boolean} True if there is an outstanding request.
723
+ */
724
+ isLoading : function(request) {
725
+ if (!request) {
726
+ request = this.getLatest();
727
+ }
728
+ if (!(request && request.xhr)) {
729
+ return false;
730
+ }
731
+ // if there is a connection and readyState is not 0 or 4
732
+ var state = request.xhr.readyState;
733
+ return !(state === 0 || state == 4);
734
+ },
735
+
736
+ /**
737
+ * Aborts an active request.
738
+ * @param {Object} [request] Defaults to the last request
739
+ */
740
+ abort : function(request) {
741
+ var me = this,
742
+ xhr;
743
+
744
+ if (!request) {
745
+ request = me.getLatest();
746
+ }
747
+
748
+ if (request && me.isLoading(request)) {
749
+ /*
750
+ * Clear out the onreadystatechange here, this allows us
751
+ * greater control, the browser may/may not fire the function
752
+ * depending on a series of conditions.
753
+ */
754
+ xhr = request.xhr;
755
+ try {
756
+ xhr.onreadystatechange = null;
757
+ } catch (e) {
758
+ // Setting onreadystatechange to null can cause problems in IE, see
759
+ // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html
760
+ xhr = Ext.emptyFn;
761
+ }
762
+ xhr.abort();
763
+ me.clearTimeout(request);
764
+ if (!request.timedout) {
765
+ request.aborted = true;
766
+ }
767
+ me.onComplete(request);
768
+ me.cleanup(request);
769
+ }
770
+ },
771
+
772
+ /**
773
+ * Aborts all active requests
774
+ */
775
+ abortAll: function(){
776
+ var requests = this.requests,
777
+ id;
778
+
779
+ for (id in requests) {
780
+ if (requests.hasOwnProperty(id)) {
781
+ this.abort(requests[id]);
782
+ }
783
+ }
784
+ },
785
+
786
+ /**
787
+ * Gets the most recent request
788
+ * @private
789
+ * @return {Object} The request. Null if there is no recent request
790
+ */
791
+ getLatest: function(){
792
+ var id = this.latestId,
793
+ request;
794
+
795
+ if (id) {
796
+ request = this.requests[id];
797
+ }
798
+ return request || null;
799
+ },
800
+
801
+ /**
802
+ * Fires when the state of the xhr changes
803
+ * @private
804
+ * @param {Object} request The request
805
+ */
806
+ onStateChange : function(request) {
807
+ if (request.xhr.readyState == 4) {
808
+ this.clearTimeout(request);
809
+ this.onComplete(request);
810
+ this.cleanup(request);
811
+ }
812
+ },
813
+
814
+ /**
815
+ * Clears the timeout on the request
816
+ * @private
817
+ * @param {Object} The request
818
+ */
819
+ clearTimeout: function(request) {
820
+ clearTimeout(request.timeout);
821
+ delete request.timeout;
822
+ },
823
+
824
+ /**
825
+ * Cleans up any left over information from the request
826
+ * @private
827
+ * @param {Object} The request
828
+ */
829
+ cleanup: function(request) {
830
+ request.xhr = null;
831
+ delete request.xhr;
832
+ },
833
+
834
+ /**
835
+ * To be called when the request has come back from the server
836
+ * @private
837
+ * @param {Object} request
838
+ * @return {Object} The response
839
+ */
840
+ onComplete : function(request) {
841
+ var me = this,
842
+ options = request.options,
843
+ result,
844
+ success,
845
+ response;
846
+
847
+ try {
848
+ result = me.parseStatus(request.xhr.status);
849
+ } catch (e) {
850
+ // in some browsers we can't access the status if the readyState is not 4, so the request has failed
851
+ result = {
852
+ success : false,
853
+ isException : false
854
+ };
855
+ }
856
+ success = result.success;
857
+
858
+ if (success) {
859
+ response = me.createResponse(request);
860
+ me.fireEvent('requestcomplete', me, response, options);
861
+ Ext.callback(options.success, options.scope, [response, options]);
862
+ } else {
863
+ if (result.isException || request.aborted || request.timedout) {
864
+ response = me.createException(request);
865
+ } else {
866
+ response = me.createResponse(request);
867
+ }
868
+ me.fireEvent('requestexception', me, response, options);
869
+ Ext.callback(options.failure, options.scope, [response, options]);
870
+ }
871
+ Ext.callback(options.callback, options.scope, [options, success, response]);
872
+ delete me.requests[request.id];
873
+ return response;
874
+ },
875
+
876
+ /**
877
+ * Checks if the response status was successful
878
+ * @param {Number} status The status code
879
+ * @return {Object} An object containing success/status state
880
+ */
881
+ parseStatus: function(status) {
882
+ // see: https://prototype.lighthouseapp.com/projects/8886/tickets/129-ie-mangles-http-response-status-code-204-to-1223
883
+ status = status == 1223 ? 204 : status;
884
+
885
+ var success = (status >= 200 && status < 300) || status == 304,
886
+ isException = false;
887
+
888
+ if (!success) {
889
+ switch (status) {
890
+ case 12002:
891
+ case 12029:
892
+ case 12030:
893
+ case 12031:
894
+ case 12152:
895
+ case 13030:
896
+ isException = true;
897
+ break;
898
+ }
899
+ }
900
+ return {
901
+ success: success,
902
+ isException: isException
903
+ };
904
+ },
905
+
906
+ /**
907
+ * Creates the response object
908
+ * @private
909
+ * @param {Object} request
910
+ */
911
+ createResponse : function(request) {
912
+ var xhr = request.xhr,
913
+ headers = {},
914
+ lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
915
+ count = lines.length,
916
+ line, index, key, value, response;
917
+
918
+ while (count--) {
919
+ line = lines[count];
920
+ index = line.indexOf(':');
921
+ if (index >= 0) {
922
+ key = line.substr(0, index).toLowerCase();
923
+ if (line.charAt(index + 1) == ' ') {
924
+ ++index;
925
+ }
926
+ headers[key] = line.substr(index + 1);
927
+ }
928
+ }
929
+
930
+ request.xhr = null;
931
+ delete request.xhr;
932
+
933
+ response = {
934
+ request: request,
935
+ requestId : request.id,
936
+ status : xhr.status,
937
+ statusText : xhr.statusText,
938
+ getResponseHeader : function(header) {
939
+ return headers[header.toLowerCase()];
940
+ },
941
+ getAllResponseHeaders : function() {
942
+ return headers;
943
+ },
944
+ responseText : xhr.responseText,
945
+ responseXML : xhr.responseXML
946
+ };
947
+
948
+ // If we don't explicitly tear down the xhr reference, IE6/IE7 will hold this in the closure of the
949
+ // functions created with getResponseHeader/getAllResponseHeaders
950
+ xhr = null;
951
+ return response;
952
+ },
953
+
954
+ /**
955
+ * Creates the exception object
956
+ * @private
957
+ * @param {Object} request
958
+ */
959
+ createException : function(request) {
960
+ return {
961
+ request : request,
962
+ requestId : request.id,
963
+ status : request.aborted ? -1 : 0,
964
+ statusText : request.aborted ? 'transaction aborted' : 'communication failure',
965
+ aborted: request.aborted,
966
+ timedout: request.timedout
967
+ };
968
+ }
969
+ });