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,265 @@
1
+ /**
2
+ * @docauthor Jason Johnston <jason@sencha.com>
3
+ *
4
+ * A file upload field which has custom styling and allows control over the button text and other
5
+ * features of {@link Ext.form.field.Text text fields} like {@link Ext.form.field.Text#emptyText empty text}.
6
+ * It uses a hidden file input element behind the scenes to allow user selection of a file and to
7
+ * perform the actual upload during {@link Ext.form.Basic#submit form submit}.
8
+ *
9
+ * Because there is no secure cross-browser way to programmatically set the value of a file input,
10
+ * the standard Field `setValue` method is not implemented. The `{@link #getValue}` method will return
11
+ * a value that is browser-dependent; some have just the file name, some have a full path, some use
12
+ * a fake path.
13
+ *
14
+ * **IMPORTANT:** File uploads are not performed using normal 'Ajax' techniques; see the description for
15
+ * {@link Ext.form.Basic#hasUpload} for details.
16
+ *
17
+ * # Example Usage
18
+ *
19
+ * @example
20
+ * Ext.create('Ext.form.Panel', {
21
+ * title: 'Upload a Photo',
22
+ * width: 400,
23
+ * bodyPadding: 10,
24
+ * frame: true,
25
+ * renderTo: Ext.getBody(),
26
+ * items: [{
27
+ * xtype: 'filefield',
28
+ * name: 'photo',
29
+ * fieldLabel: 'Photo',
30
+ * labelWidth: 50,
31
+ * msgTarget: 'side',
32
+ * allowBlank: false,
33
+ * anchor: '100%',
34
+ * buttonText: 'Select Photo...'
35
+ * }],
36
+ *
37
+ * buttons: [{
38
+ * text: 'Upload',
39
+ * handler: function() {
40
+ * var form = this.up('form').getForm();
41
+ * if(form.isValid()){
42
+ * form.submit({
43
+ * url: 'photo-upload.php',
44
+ * waitMsg: 'Uploading your photo...',
45
+ * success: function(fp, o) {
46
+ * Ext.Msg.alert('Success', 'Your photo "' + o.result.file + '" has been uploaded.');
47
+ * }
48
+ * });
49
+ * }
50
+ * }
51
+ * }]
52
+ * });
53
+ */
54
+ Ext.define("Ext.form.field.File", {
55
+ extend: 'Ext.form.field.Trigger',
56
+ alias: ['widget.filefield', 'widget.fileuploadfield'],
57
+ alternateClassName: ['Ext.form.FileUploadField', 'Ext.ux.form.FileUploadField', 'Ext.form.File'],
58
+ uses: ['Ext.button.Button', 'Ext.layout.component.field.Field'],
59
+
60
+ /**
61
+ * @cfg {String} buttonText
62
+ * The button text to display on the upload button. Note that if you supply a value for
63
+ * {@link #buttonConfig}, the buttonConfig.text value will be used instead if available.
64
+ */
65
+ //<locale>
66
+ buttonText: 'Browse...',
67
+ //</locale>
68
+
69
+ /**
70
+ * @cfg {Boolean} buttonOnly
71
+ * True to display the file upload field as a button with no visible text field. If true, all
72
+ * inherited Text members will still be available.
73
+ */
74
+ buttonOnly: false,
75
+
76
+ /**
77
+ * @cfg {Number} buttonMargin
78
+ * The number of pixels of space reserved between the button and the text field. Note that this only
79
+ * applies if {@link #buttonOnly} = false.
80
+ */
81
+ buttonMargin: 3,
82
+
83
+ /**
84
+ * @cfg {Object} buttonConfig
85
+ * A standard {@link Ext.button.Button} config object.
86
+ */
87
+
88
+ /**
89
+ * @event change
90
+ * Fires when the underlying file input field's value has changed from the user selecting a new file from the system
91
+ * file selection dialog.
92
+ * @param {Ext.ux.form.FileUploadField} this
93
+ * @param {String} value The file value returned by the underlying file input field
94
+ */
95
+
96
+ /**
97
+ * @property {Ext.Element} fileInputEl
98
+ * A reference to the invisible file input element created for this upload field. Only populated after this
99
+ * component is rendered.
100
+ */
101
+
102
+ /**
103
+ * @property {Ext.button.Button} button
104
+ * A reference to the trigger Button component created for this upload field. Only populated after this component is
105
+ * rendered.
106
+ */
107
+
108
+ /**
109
+ * @cfg {String} [fieldBodyCls='x-form-file-wrap']
110
+ * An extra CSS class to be applied to the body content element in addition to {@link #fieldBodyCls}.
111
+ */
112
+ fieldBodyCls: Ext.baseCSSPrefix + 'form-file-wrap',
113
+
114
+ /**
115
+ * @cfg {Boolean} readOnly
116
+ * Unlike with other form fields, the readOnly config defaults to true in File field.
117
+ */
118
+ readOnly: true,
119
+
120
+ // private
121
+ componentLayout: 'triggerfield',
122
+
123
+ // private. Extract the file element, button outer element, and button active element.
124
+ childEls: ['fileInputEl', 'buttonEl', 'buttonEl-btnEl', 'browseButtonWrap'],
125
+
126
+ // private
127
+ onRender: function() {
128
+ var me = this,
129
+ inputEl;
130
+
131
+ me.callParent(arguments);
132
+
133
+ inputEl = me.inputEl;
134
+ inputEl.dom.name = ''; //name goes on the fileInput, not the text input
135
+
136
+ me.fileInputEl.dom.name = me.getName();
137
+ me.fileInputEl.on({
138
+ scope: me,
139
+ change: me.onFileChange
140
+ });
141
+
142
+ if (me.buttonOnly) {
143
+ me.inputCell.setDisplayed(false);
144
+ }
145
+
146
+ // Ensure the trigger cell is sized correctly upon render
147
+ me.browseButtonWrap.dom.style.width = (me.browseButtonWrap.dom.lastChild.offsetWidth + me.buttonEl.getMargin('lr')) + 'px';
148
+ if (Ext.isIE) {
149
+ me.buttonEl.repaint();
150
+ }
151
+ },
152
+
153
+ /**
154
+ * Gets the markup to be inserted into the subTplMarkup.
155
+ */
156
+ getTriggerMarkup: function() {
157
+ var me = this,
158
+ result,
159
+ btn = Ext.widget('button', Ext.apply({
160
+ id: me.id + '-buttonEl',
161
+ ui: me.ui,
162
+ disabled: me.disabled,
163
+ text: me.buttonText,
164
+ cls: Ext.baseCSSPrefix + 'form-file-btn',
165
+ preventDefault: false,
166
+ style: me.buttonOnly ? '' : 'margin-left:' + me.buttonMargin + 'px'
167
+ }, me.buttonConfig)),
168
+ btnCfg = btn.getRenderTree(),
169
+ inputElCfg = {
170
+ id: me.id + '-fileInputEl',
171
+ cls: Ext.baseCSSPrefix + 'form-file-input',
172
+ tag: 'input',
173
+ type: 'file',
174
+ size: 1
175
+ };
176
+ if (me.disabled) {
177
+ inputElCfg.disabled = true;
178
+ }
179
+ btnCfg.cn = inputElCfg;
180
+ result = '<td id="' + me.id + '-browseButtonWrap">' + Ext.DomHelper.markup(btnCfg) + '</td>';
181
+ btn.destroy();
182
+ return result;
183
+ },
184
+
185
+ /**
186
+ * @private
187
+ * Creates the file input element. It is inserted into the trigger button component, made
188
+ * invisible, and floated on top of the button's other content so that it will receive the
189
+ * button's clicks.
190
+ */
191
+ createFileInput : function() {
192
+ var me = this;
193
+ me.fileInputEl = me.buttonEl.createChild({
194
+ name: me.getName(),
195
+ id: me.id + '-fileInputEl',
196
+ cls: Ext.baseCSSPrefix + 'form-file-input',
197
+ tag: 'input',
198
+ type: 'file',
199
+ size: 1
200
+ });
201
+ me.fileInputEl.on({
202
+ scope: me,
203
+ change: me.onFileChange
204
+ });
205
+ },
206
+
207
+ /**
208
+ * @private Event handler fired when the user selects a file.
209
+ */
210
+ onFileChange: function() {
211
+ this.lastValue = null; // force change event to get fired even if the user selects a file with the same name
212
+ Ext.form.field.File.superclass.setValue.call(this, this.fileInputEl.dom.value);
213
+ },
214
+
215
+ /**
216
+ * Overridden to do nothing
217
+ * @method
218
+ */
219
+ setValue: Ext.emptyFn,
220
+
221
+ reset : function(){
222
+ var me = this;
223
+ if (me.rendered) {
224
+ me.fileInputEl.remove();
225
+ me.createFileInput();
226
+ me.inputEl.dom.value = '';
227
+ }
228
+ me.callParent();
229
+ },
230
+
231
+ onDisable: function(){
232
+ this.callParent();
233
+ this.disableItems();
234
+ },
235
+
236
+ disableItems: function(){
237
+ var file = this.fileInputEl;
238
+ if (file) {
239
+ file.dom.disabled = true;
240
+ }
241
+ this['buttonEl-btnEl'].dom.disabled = true;
242
+ },
243
+
244
+ onEnable: function(){
245
+ var me = this;
246
+ me.callParent();
247
+ me.fileInputEl.dom.disabled = false;
248
+ this['buttonEl-btnEl'].dom.disabled = true;
249
+ },
250
+
251
+ isFileUpload: function() {
252
+ return true;
253
+ },
254
+
255
+ extractFileInput: function() {
256
+ var fileInput = this.fileInputEl.dom;
257
+ this.reset();
258
+ return fileInput;
259
+ },
260
+
261
+ onDestroy: function(){
262
+ Ext.destroyMembers(this, 'fileInputEl', 'buttonEl');
263
+ this.callParent();
264
+ }
265
+ });
@@ -0,0 +1,75 @@
1
+ /**
2
+ * A basic hidden field for storing hidden values in forms that need to be passed in the form submit.
3
+ *
4
+ * This creates an actual input element with type="submit" in the DOM. While its label is
5
+ * {@link #hideLabel not rendered} by default, it is still a real component and may be sized according
6
+ * to its owner container's layout.
7
+ *
8
+ * Because of this, in most cases it is more convenient and less problematic to simply
9
+ * {@link Ext.form.action.Action#params pass hidden parameters} directly when
10
+ * {@link Ext.form.Basic#submit submitting the form}.
11
+ *
12
+ * Example:
13
+ *
14
+ * new Ext.form.Panel({
15
+ * title: 'My Form',
16
+ * items: [{
17
+ * xtype: 'textfield',
18
+ * fieldLabel: 'Text Field',
19
+ * name: 'text_field',
20
+ * value: 'value from text field'
21
+ * }, {
22
+ * xtype: 'hiddenfield',
23
+ * name: 'hidden_field_1',
24
+ * value: 'value from hidden field'
25
+ * }],
26
+ *
27
+ * buttons: [{
28
+ * text: 'Submit',
29
+ * handler: function() {
30
+ * this.up('form').getForm().submit({
31
+ * params: {
32
+ * hidden_field_2: 'value from submit call'
33
+ * }
34
+ * });
35
+ * }
36
+ * }]
37
+ * });
38
+ *
39
+ * Submitting the above form will result in three values sent to the server:
40
+ *
41
+ * text_field=value+from+text+field&hidden;_field_1=value+from+hidden+field&hidden_field_2=value+from+submit+call
42
+ *
43
+ */
44
+ Ext.define('Ext.form.field.Hidden', {
45
+ extend:'Ext.form.field.Base',
46
+ alias: ['widget.hiddenfield', 'widget.hidden'],
47
+ alternateClassName: 'Ext.form.Hidden',
48
+
49
+ // private
50
+ inputType : 'hidden',
51
+ hideLabel: true,
52
+
53
+ initComponent: function(){
54
+ this.formItemCls += '-hidden';
55
+ this.callParent();
56
+ },
57
+
58
+ /**
59
+ * @private
60
+ * Override. Treat undefined and null values as equal to an empty string value.
61
+ */
62
+ isEqual: function(value1, value2) {
63
+ return this.isEqualAsString(value1, value2);
64
+ },
65
+
66
+ // These are all private overrides
67
+ initEvents: Ext.emptyFn,
68
+ setSize : Ext.emptyFn,
69
+ setWidth : Ext.emptyFn,
70
+ setHeight : Ext.emptyFn,
71
+ setPosition : Ext.emptyFn,
72
+ setPagePosition : Ext.emptyFn,
73
+ markInvalid : Ext.emptyFn,
74
+ clearInvalid : Ext.emptyFn
75
+ });
@@ -0,0 +1,1439 @@
1
+ /**
2
+ * Provides a lightweight HTML Editor component. Some toolbar features are not supported by Safari and will be
3
+ * automatically hidden when needed. These are noted in the config options where appropriate.
4
+ *
5
+ * The editor's toolbar buttons have tooltips defined in the {@link #buttonTips} property, but they are not
6
+ * enabled by default unless the global {@link Ext.tip.QuickTipManager} singleton is
7
+ * {@link Ext.tip.QuickTipManager#init initialized}.
8
+ *
9
+ * An Editor is a sensitive component that can't be used in all spots standard fields can be used. Putting an
10
+ * Editor within any element that has display set to 'none' can cause problems in Safari and Firefox due to their
11
+ * default iframe reloading bugs.
12
+ *
13
+ * # Example usage
14
+ *
15
+ * Simple example rendered with default options:
16
+ *
17
+ * @example
18
+ * Ext.tip.QuickTipManager.init(); // enable tooltips
19
+ * Ext.create('Ext.form.HtmlEditor', {
20
+ * width: 580,
21
+ * height: 250,
22
+ * renderTo: Ext.getBody()
23
+ * });
24
+ *
25
+ * Passed via xtype into a container and with custom options:
26
+ *
27
+ * @example
28
+ * Ext.tip.QuickTipManager.init(); // enable tooltips
29
+ * new Ext.panel.Panel({
30
+ * title: 'HTML Editor',
31
+ * renderTo: Ext.getBody(),
32
+ * width: 550,
33
+ * height: 250,
34
+ * frame: true,
35
+ * layout: 'fit',
36
+ * items: {
37
+ * xtype: 'htmleditor',
38
+ * enableColors: false,
39
+ * enableAlignments: false
40
+ * }
41
+ * });
42
+ *
43
+ * # Reflow issues
44
+ *
45
+ * In some browsers, a layout reflow will cause the underlying editor iframe to be reset. This
46
+ * is most commonly seen when using the editor in collapsed panels with animation. In these cases
47
+ * it is best to avoid animation. More information can be found here: https://bugzilla.mozilla.org/show_bug.cgi?id=90268
48
+ */
49
+ Ext.define('Ext.form.field.HtmlEditor', {
50
+ extend:'Ext.Component',
51
+ mixins: {
52
+ labelable: 'Ext.form.Labelable',
53
+ field: 'Ext.form.field.Field'
54
+ },
55
+ alias: 'widget.htmleditor',
56
+ alternateClassName: 'Ext.form.HtmlEditor',
57
+ requires: [
58
+ 'Ext.tip.QuickTipManager',
59
+ 'Ext.picker.Color',
60
+ 'Ext.toolbar.Item',
61
+ 'Ext.toolbar.Toolbar',
62
+ 'Ext.util.Format',
63
+ 'Ext.layout.component.field.HtmlEditor'
64
+ ],
65
+
66
+ childEls: [
67
+ 'iframeEl', 'textareaEl'
68
+ ],
69
+
70
+ fieldSubTpl: [
71
+ '{%Ext.DomHelper.generateMarkup(values.$comp.toolbar.getRenderTree(), out)%}',
72
+ '{beforeTextAreaTpl}',
73
+ '<textarea id="{cmpId}-textareaEl" name="{name}" tabIndex="-1" {inputAttrTpl}',
74
+ ' class="{textareaCls}" style="{size}" autocomplete="off">',
75
+ '{[Ext.util.Format.htmlEncode(values.value)]}',
76
+ '</textarea>',
77
+ '{afterTextAreaTpl}',
78
+ '{beforeIFrameTpl}',
79
+ '<iframe id="{cmpId}-iframeEl" name="{iframeName}" frameBorder="0" {iframeAttrTpl}',
80
+ ' style="overflow:auto;{size}" src="{iframeSrc}"></iframe>',
81
+ '{afterIFrameTpl}',
82
+ {
83
+ disableFormats: true
84
+ }
85
+ ],
86
+
87
+ subTplInsertions: [
88
+ /**
89
+ * @cfg {String/Array/Ext.XTemplate} beforeTextAreaTpl
90
+ * An optional string or `XTemplate` configuration to insert in the field markup
91
+ * before the textarea element. If an `XTemplate` is used, the component's
92
+ * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.
93
+ */
94
+ 'beforeTextAreaTpl',
95
+
96
+ /**
97
+ * @cfg {String/Array/Ext.XTemplate} afterTextAreaTpl
98
+ * An optional string or `XTemplate` configuration to insert in the field markup
99
+ * after the textarea element. If an `XTemplate` is used, the component's
100
+ * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.
101
+ */
102
+ 'afterTextAreaTpl',
103
+
104
+ /**
105
+ * @cfg {String/Array/Ext.XTemplate} beforeIFrameTpl
106
+ * An optional string or `XTemplate` configuration to insert in the field markup
107
+ * before the iframe element. If an `XTemplate` is used, the component's
108
+ * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.
109
+ */
110
+ 'beforeIFrameTpl',
111
+
112
+ /**
113
+ * @cfg {String/Array/Ext.XTemplate} afterIFrameTpl
114
+ * An optional string or `XTemplate` configuration to insert in the field markup
115
+ * after the iframe element. If an `XTemplate` is used, the component's
116
+ * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.
117
+ */
118
+ 'afterIFrameTpl',
119
+
120
+ /**
121
+ * @cfg {String/Array/Ext.XTemplate} iframeAttrTpl
122
+ * An optional string or `XTemplate` configuration to insert in the field markup
123
+ * inside the iframe element (as attributes). If an `XTemplate` is used, the component's
124
+ * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.
125
+ */
126
+ 'iframeAttrTpl',
127
+
128
+ // inherited
129
+ 'inputAttrTpl'
130
+ ],
131
+
132
+ /**
133
+ * @cfg {Boolean} enableFormat
134
+ * Enable the bold, italic and underline buttons
135
+ */
136
+ enableFormat : true,
137
+ /**
138
+ * @cfg {Boolean} enableFontSize
139
+ * Enable the increase/decrease font size buttons
140
+ */
141
+ enableFontSize : true,
142
+ /**
143
+ * @cfg {Boolean} enableColors
144
+ * Enable the fore/highlight color buttons
145
+ */
146
+ enableColors : true,
147
+ /**
148
+ * @cfg {Boolean} enableAlignments
149
+ * Enable the left, center, right alignment buttons
150
+ */
151
+ enableAlignments : true,
152
+ /**
153
+ * @cfg {Boolean} enableLists
154
+ * Enable the bullet and numbered list buttons. Not available in Safari.
155
+ */
156
+ enableLists : true,
157
+ /**
158
+ * @cfg {Boolean} enableSourceEdit
159
+ * Enable the switch to source edit button. Not available in Safari.
160
+ */
161
+ enableSourceEdit : true,
162
+ /**
163
+ * @cfg {Boolean} enableLinks
164
+ * Enable the create link button. Not available in Safari.
165
+ */
166
+ enableLinks : true,
167
+ /**
168
+ * @cfg {Boolean} enableFont
169
+ * Enable font selection. Not available in Safari.
170
+ */
171
+ enableFont : true,
172
+ /**
173
+ * @cfg {String} createLinkText
174
+ * The default text for the create link prompt
175
+ */
176
+ //<locale>
177
+ createLinkText : 'Please enter the URL for the link:',
178
+ //</locale>
179
+ /**
180
+ * @cfg {String} [defaultLinkValue='http://']
181
+ * The default value for the create link prompt
182
+ */
183
+ defaultLinkValue : 'http:/'+'/',
184
+ /**
185
+ * @cfg {String[]} fontFamilies
186
+ * An array of available font families
187
+ */
188
+ fontFamilies : [
189
+ 'Arial',
190
+ 'Courier New',
191
+ 'Tahoma',
192
+ 'Times New Roman',
193
+ 'Verdana'
194
+ ],
195
+ defaultFont: 'tahoma',
196
+ /**
197
+ * @cfg {String} defaultValue
198
+ * A default value to be put into the editor to resolve focus issues.
199
+ *
200
+ * Defaults to (Non-breaking space) in Opera and IE6,
201
+ * (Zero-width space) in all other browsers.
202
+ */
203
+ defaultValue: (Ext.isOpera || Ext.isIE6) ? '&#160;' : '&#8203;',
204
+
205
+ fieldBodyCls: Ext.baseCSSPrefix + 'html-editor-wrap',
206
+
207
+ componentLayout: 'htmleditor',
208
+
209
+ // private properties
210
+ initialized : false,
211
+ activated : false,
212
+ sourceEditMode : false,
213
+ iframePad:3,
214
+ hideMode:'offsets',
215
+
216
+ maskOnDisable: true,
217
+
218
+ // private
219
+ initComponent : function(){
220
+ var me = this;
221
+
222
+ me.addEvents(
223
+ /**
224
+ * @event initialize
225
+ * Fires when the editor is fully initialized (including the iframe)
226
+ * @param {Ext.form.field.HtmlEditor} this
227
+ */
228
+ 'initialize',
229
+ /**
230
+ * @event activate
231
+ * Fires when the editor is first receives the focus. Any insertion must wait until after this event.
232
+ * @param {Ext.form.field.HtmlEditor} this
233
+ */
234
+ 'activate',
235
+ /**
236
+ * @event beforesync
237
+ * Fires before the textarea is updated with content from the editor iframe. Return false to cancel the
238
+ * sync.
239
+ * @param {Ext.form.field.HtmlEditor} this
240
+ * @param {String} html
241
+ */
242
+ 'beforesync',
243
+ /**
244
+ * @event beforepush
245
+ * Fires before the iframe editor is updated with content from the textarea. Return false to cancel the
246
+ * push.
247
+ * @param {Ext.form.field.HtmlEditor} this
248
+ * @param {String} html
249
+ */
250
+ 'beforepush',
251
+ /**
252
+ * @event sync
253
+ * Fires when the textarea is updated with content from the editor iframe.
254
+ * @param {Ext.form.field.HtmlEditor} this
255
+ * @param {String} html
256
+ */
257
+ 'sync',
258
+ /**
259
+ * @event push
260
+ * Fires when the iframe editor is updated with content from the textarea.
261
+ * @param {Ext.form.field.HtmlEditor} this
262
+ * @param {String} html
263
+ */
264
+ 'push',
265
+ /**
266
+ * @event editmodechange
267
+ * Fires when the editor switches edit modes
268
+ * @param {Ext.form.field.HtmlEditor} this
269
+ * @param {Boolean} sourceEdit True if source edit, false if standard editing.
270
+ */
271
+ 'editmodechange'
272
+ );
273
+
274
+ me.callParent(arguments);
275
+ me.createToolbar(me);
276
+
277
+ // Init mixins
278
+ me.initLabelable();
279
+ me.initField();
280
+ },
281
+
282
+ /**
283
+ * @private
284
+ * Must define this function to allow the Layout base class to collect all descendant layouts to be run.
285
+ */
286
+ getRefItems: function() {
287
+ return [ this.toolbar ];
288
+ },
289
+
290
+ /*
291
+ * Called when the editor creates its toolbar. Override this method if you need to
292
+ * add custom toolbar buttons.
293
+ * @param {Ext.form.field.HtmlEditor} editor
294
+ * @protected
295
+ */
296
+ createToolbar : function(editor){
297
+ var me = this,
298
+ items = [], i,
299
+ tipsEnabled = Ext.tip.QuickTipManager && Ext.tip.QuickTipManager.isEnabled(),
300
+ baseCSSPrefix = Ext.baseCSSPrefix,
301
+ fontSelectItem, toolbar, undef;
302
+
303
+ function btn(id, toggle, handler){
304
+ return {
305
+ itemId : id,
306
+ cls : baseCSSPrefix + 'btn-icon',
307
+ iconCls: baseCSSPrefix + 'edit-'+id,
308
+ enableToggle:toggle !== false,
309
+ scope: editor,
310
+ handler:handler||editor.relayBtnCmd,
311
+ clickEvent: 'mousedown',
312
+ tooltip: tipsEnabled ? editor.buttonTips[id] || undef : undef,
313
+ overflowText: editor.buttonTips[id].title || undef,
314
+ tabIndex: -1
315
+ };
316
+ }
317
+
318
+
319
+ if (me.enableFont && !Ext.isSafari2) {
320
+ fontSelectItem = Ext.widget('component', {
321
+ renderTpl: [
322
+ '<select id="{id}-selectEl" class="{cls}">',
323
+ '<tpl for="fonts">',
324
+ '<option value="{[values.toLowerCase()]}" style="font-family:{.}"<tpl if="values.toLowerCase()==parent.defaultFont"> selected</tpl>>{.}</option>',
325
+ '</tpl>',
326
+ '</select>'
327
+ ],
328
+ renderData: {
329
+ cls: baseCSSPrefix + 'font-select',
330
+ fonts: me.fontFamilies,
331
+ defaultFont: me.defaultFont
332
+ },
333
+ childEls: ['selectEl'],
334
+ afterRender: function() {
335
+ me.fontSelect = this.selectEl;
336
+ Ext.Component.prototype.afterRender.apply(this, arguments);
337
+ },
338
+ onDisable: function() {
339
+ var selectEl = this.selectEl;
340
+ if (selectEl) {
341
+ selectEl.dom.disabled = true;
342
+ }
343
+ Ext.Component.prototype.onDisable.apply(this, arguments);
344
+ },
345
+ onEnable: function() {
346
+ var selectEl = this.selectEl;
347
+ if (selectEl) {
348
+ selectEl.dom.disabled = false;
349
+ }
350
+ Ext.Component.prototype.onEnable.apply(this, arguments);
351
+ },
352
+ listeners: {
353
+ change: function() {
354
+ me.relayCmd('fontname', me.fontSelect.dom.value);
355
+ me.deferFocus();
356
+ },
357
+ element: 'selectEl'
358
+ }
359
+ });
360
+
361
+ items.push(
362
+ fontSelectItem,
363
+ '-'
364
+ );
365
+ }
366
+
367
+ if (me.enableFormat) {
368
+ items.push(
369
+ btn('bold'),
370
+ btn('italic'),
371
+ btn('underline')
372
+ );
373
+ }
374
+
375
+ if (me.enableFontSize) {
376
+ items.push(
377
+ '-',
378
+ btn('increasefontsize', false, me.adjustFont),
379
+ btn('decreasefontsize', false, me.adjustFont)
380
+ );
381
+ }
382
+
383
+ if (me.enableColors) {
384
+ items.push(
385
+ '-', {
386
+ itemId: 'forecolor',
387
+ cls: baseCSSPrefix + 'btn-icon',
388
+ iconCls: baseCSSPrefix + 'edit-forecolor',
389
+ overflowText: editor.buttonTips.forecolor.title,
390
+ tooltip: tipsEnabled ? editor.buttonTips.forecolor || undef : undef,
391
+ tabIndex:-1,
392
+ menu : Ext.widget('menu', {
393
+ plain: true,
394
+ items: [{
395
+ xtype: 'colorpicker',
396
+ allowReselect: true,
397
+ focus: Ext.emptyFn,
398
+ value: '000000',
399
+ plain: true,
400
+ clickEvent: 'mousedown',
401
+ handler: function(cp, color) {
402
+ me.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
403
+ me.deferFocus();
404
+ this.up('menu').hide();
405
+ }
406
+ }]
407
+ })
408
+ }, {
409
+ itemId: 'backcolor',
410
+ cls: baseCSSPrefix + 'btn-icon',
411
+ iconCls: baseCSSPrefix + 'edit-backcolor',
412
+ overflowText: editor.buttonTips.backcolor.title,
413
+ tooltip: tipsEnabled ? editor.buttonTips.backcolor || undef : undef,
414
+ tabIndex:-1,
415
+ menu : Ext.widget('menu', {
416
+ plain: true,
417
+ items: [{
418
+ xtype: 'colorpicker',
419
+ focus: Ext.emptyFn,
420
+ value: 'FFFFFF',
421
+ plain: true,
422
+ allowReselect: true,
423
+ clickEvent: 'mousedown',
424
+ handler: function(cp, color) {
425
+ if (Ext.isGecko) {
426
+ me.execCmd('useCSS', false);
427
+ me.execCmd('hilitecolor', color);
428
+ me.execCmd('useCSS', true);
429
+ me.deferFocus();
430
+ } else {
431
+ me.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
432
+ me.deferFocus();
433
+ }
434
+ this.up('menu').hide();
435
+ }
436
+ }]
437
+ })
438
+ }
439
+ );
440
+ }
441
+
442
+ if (me.enableAlignments) {
443
+ items.push(
444
+ '-',
445
+ btn('justifyleft'),
446
+ btn('justifycenter'),
447
+ btn('justifyright')
448
+ );
449
+ }
450
+
451
+ if (!Ext.isSafari2) {
452
+ if (me.enableLinks) {
453
+ items.push(
454
+ '-',
455
+ btn('createlink', false, me.createLink)
456
+ );
457
+ }
458
+
459
+ if (me.enableLists) {
460
+ items.push(
461
+ '-',
462
+ btn('insertorderedlist'),
463
+ btn('insertunorderedlist')
464
+ );
465
+ }
466
+ if (me.enableSourceEdit) {
467
+ items.push(
468
+ '-',
469
+ btn('sourceedit', true, function(btn){
470
+ me.toggleSourceEdit(!me.sourceEditMode);
471
+ })
472
+ );
473
+ }
474
+ }
475
+
476
+ // Everything starts disabled.
477
+ for (i = 0; i < items.length; i++) {
478
+ if (items[i].itemId !== 'sourceedit') {
479
+ items[i].disabled = true;
480
+ }
481
+ }
482
+
483
+ // build the toolbar
484
+ // Automatically rendered in AbstractComponent.afterRender's renderChildren call
485
+ toolbar = Ext.widget('toolbar', {
486
+ id: me.id + '-toolbar',
487
+ ownerCt: me,
488
+ cls: Ext.baseCSSPrefix + 'html-editor-tb',
489
+ enableOverflow: true,
490
+ items: items,
491
+ ownerLayout: me.getComponentLayout(),
492
+
493
+ // stop form submits
494
+ listeners: {
495
+ click: function(e){
496
+ e.preventDefault();
497
+ },
498
+ element: 'el'
499
+ }
500
+ });
501
+
502
+ me.toolbar = toolbar;
503
+ },
504
+
505
+ getMaskTarget: function(){
506
+ return this.bodyEl;
507
+ },
508
+
509
+ /**
510
+ * Sets the read only state of this field.
511
+ * @param {Boolean} readOnly Whether the field should be read only.
512
+ */
513
+ setReadOnly: function(readOnly) {
514
+ var me = this,
515
+ textareaEl = me.textareaEl,
516
+ iframeEl = me.iframeEl,
517
+ body;
518
+
519
+ me.readOnly = readOnly;
520
+
521
+ if (textareaEl) {
522
+ textareaEl.dom.readOnly = readOnly;
523
+ }
524
+
525
+ if (me.initialized) {
526
+ body = me.getEditorBody();
527
+ if (Ext.isIE) {
528
+ // Hide the iframe while setting contentEditable so it doesn't grab focus
529
+ iframeEl.setDisplayed(false);
530
+ body.contentEditable = !readOnly;
531
+ iframeEl.setDisplayed(true);
532
+ } else {
533
+ me.setDesignMode(!readOnly);
534
+ }
535
+ if (body) {
536
+ body.style.cursor = readOnly ? 'default' : 'text';
537
+ }
538
+ me.disableItems(readOnly);
539
+ }
540
+ },
541
+
542
+ /**
543
+ * Called when the editor initializes the iframe with HTML contents. Override this method if you
544
+ * want to change the initialization markup of the iframe (e.g. to add stylesheets).
545
+ *
546
+ * **Note:** IE8-Standards has unwanted scroller behavior, so the default meta tag forces IE7 compatibility.
547
+ * Also note that forcing IE7 mode works when the page is loaded normally, but if you are using IE's Web
548
+ * Developer Tools to manually set the document mode, that will take precedence and override what this
549
+ * code sets by default. This can be confusing when developing, but is not a user-facing issue.
550
+ * @protected
551
+ */
552
+ getDocMarkup: function() {
553
+ var me = this,
554
+ h = me.iframeEl.getHeight() - me.iframePad * 2;
555
+ return Ext.String.format('<html><head><style type="text/css">body{border:0;margin:0;padding:{0}px;height:{1}px;box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;cursor:text}</style></head><body></body></html>', me.iframePad, h);
556
+ },
557
+
558
+ // private
559
+ getEditorBody: function() {
560
+ var doc = this.getDoc();
561
+ return doc.body || doc.documentElement;
562
+ },
563
+
564
+ // private
565
+ getDoc: function() {
566
+ return (!Ext.isIE && this.iframeEl.dom.contentDocument) || this.getWin().document;
567
+ },
568
+
569
+ // private
570
+ getWin: function() {
571
+ return Ext.isIE ? this.iframeEl.dom.contentWindow : window.frames[this.iframeEl.dom.name];
572
+ },
573
+
574
+ // Do the job of a container layout at this point even though we are not a Container.
575
+ // TODO: Refactor as a Container.
576
+ finishRenderChildren: function () {
577
+ this.callParent();
578
+ this.toolbar.finishRender();
579
+ },
580
+
581
+ // private
582
+ onRender: function() {
583
+ var me = this;
584
+
585
+ me.callParent(arguments);
586
+
587
+ // The input element is interrogated by the layout to extract height when labelAlign is 'top'
588
+ // It must be set, and then switched between the iframe and the textarea
589
+ me.inputEl = me.iframeEl;
590
+
591
+ // Start polling for when the iframe document is ready to be manipulated
592
+ me.monitorTask = Ext.TaskManager.start({
593
+ run: me.checkDesignMode,
594
+ scope: me,
595
+ interval: 100
596
+ });
597
+ },
598
+
599
+ initRenderTpl: function() {
600
+ var me = this;
601
+ if (!me.hasOwnProperty('renderTpl')) {
602
+ me.renderTpl = me.getTpl('labelableRenderTpl');
603
+ }
604
+ return me.callParent();
605
+ },
606
+
607
+ initRenderData: function() {
608
+ return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
609
+ },
610
+
611
+ getSubTplData: function() {
612
+ return {
613
+ $comp : this,
614
+ cmpId : this.id,
615
+ id : this.getInputId(),
616
+ textareaCls : Ext.baseCSSPrefix + 'hidden',
617
+ value : this.value,
618
+ iframeName : Ext.id(),
619
+ iframeSrc : Ext.SSL_SECURE_URL,
620
+ size : 'height:100px;width:100%'
621
+ };
622
+ },
623
+
624
+ getSubTplMarkup: function() {
625
+ return this.getTpl('fieldSubTpl').apply(this.getSubTplData());
626
+ },
627
+
628
+ initFrameDoc: function() {
629
+ var me = this,
630
+ doc, task;
631
+
632
+ Ext.TaskManager.stop(me.monitorTask);
633
+
634
+ doc = me.getDoc();
635
+ me.win = me.getWin();
636
+
637
+ doc.open();
638
+ doc.write(me.getDocMarkup());
639
+ doc.close();
640
+
641
+ task = { // must defer to wait for browser to be ready
642
+ run: function() {
643
+ var doc = me.getDoc();
644
+ if (doc.body || doc.readyState === 'complete') {
645
+ Ext.TaskManager.stop(task);
646
+ me.setDesignMode(true);
647
+ Ext.defer(me.initEditor, 10, me);
648
+ }
649
+ },
650
+ interval : 10,
651
+ duration:10000,
652
+ scope: me
653
+ };
654
+ Ext.TaskManager.start(task);
655
+ },
656
+
657
+ checkDesignMode: function() {
658
+ var me = this,
659
+ doc = me.getDoc();
660
+ if (doc && (!doc.editorInitialized || me.getDesignMode() !== 'on')) {
661
+ me.initFrameDoc();
662
+ }
663
+ },
664
+
665
+ /**
666
+ * @private
667
+ * Sets current design mode. To enable, mode can be true or 'on', off otherwise
668
+ */
669
+ setDesignMode: function(mode) {
670
+ var me = this,
671
+ doc = me.getDoc();
672
+ if (doc) {
673
+ if (me.readOnly) {
674
+ mode = false;
675
+ }
676
+ doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off';
677
+ }
678
+ },
679
+
680
+ // private
681
+ getDesignMode: function() {
682
+ var doc = this.getDoc();
683
+ return !doc ? '' : String(doc.designMode).toLowerCase();
684
+ },
685
+
686
+ disableItems: function(disabled) {
687
+ var items = this.getToolbar().items.items,
688
+ i,
689
+ iLen = items.length,
690
+ item;
691
+
692
+ for (i = 0; i < iLen; i++) {
693
+ item = items[i];
694
+
695
+ if (item.getItemId() !== 'sourceedit') {
696
+ item.setDisabled(disabled);
697
+ }
698
+ }
699
+ },
700
+
701
+ /**
702
+ * Toggles the editor between standard and source edit mode.
703
+ * @param {Boolean} [sourceEditMode] True for source edit, false for standard
704
+ */
705
+ toggleSourceEdit: function(sourceEditMode) {
706
+ var me = this,
707
+ iframe = me.iframeEl,
708
+ textarea = me.textareaEl,
709
+ hiddenCls = Ext.baseCSSPrefix + 'hidden',
710
+ btn = me.getToolbar().getComponent('sourceedit');
711
+
712
+ if (!Ext.isBoolean(sourceEditMode)) {
713
+ sourceEditMode = !me.sourceEditMode;
714
+ }
715
+ me.sourceEditMode = sourceEditMode;
716
+
717
+ if (btn.pressed !== sourceEditMode) {
718
+ btn.toggle(sourceEditMode);
719
+ }
720
+ if (sourceEditMode) {
721
+ me.disableItems(true);
722
+ me.syncValue();
723
+ iframe.addCls(hiddenCls);
724
+ textarea.removeCls(hiddenCls);
725
+ textarea.dom.removeAttribute('tabIndex');
726
+ textarea.focus();
727
+ me.inputEl = textarea;
728
+ }
729
+ else {
730
+ if (me.initialized) {
731
+ me.disableItems(me.readOnly);
732
+ }
733
+ me.pushValue();
734
+ iframe.removeCls(hiddenCls);
735
+ textarea.addCls(hiddenCls);
736
+ textarea.dom.setAttribute('tabIndex', -1);
737
+ me.deferFocus();
738
+ me.inputEl = iframe;
739
+ }
740
+ me.fireEvent('editmodechange', me, sourceEditMode);
741
+ me.updateLayout();
742
+ },
743
+
744
+ // private used internally
745
+ createLink : function() {
746
+ var url = prompt(this.createLinkText, this.defaultLinkValue);
747
+ if (url && url !== 'http:/'+'/') {
748
+ this.relayCmd('createlink', url);
749
+ }
750
+ },
751
+
752
+ clearInvalid: Ext.emptyFn,
753
+
754
+ // docs inherit from Field
755
+ setValue: function(value) {
756
+ var me = this,
757
+ textarea = me.textareaEl;
758
+ me.mixins.field.setValue.call(me, value);
759
+ if (value === null || value === undefined) {
760
+ value = '';
761
+ }
762
+ if (textarea) {
763
+ textarea.dom.value = value;
764
+ }
765
+ me.pushValue();
766
+ return this;
767
+ },
768
+
769
+ /**
770
+ * If you need/want custom HTML cleanup, this is the method you should override.
771
+ * @param {String} html The HTML to be cleaned
772
+ * @return {String} The cleaned HTML
773
+ * @protected
774
+ */
775
+ cleanHtml: function(html) {
776
+ html = String(html);
777
+ if (Ext.isWebKit) { // strip safari nonsense
778
+ html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
779
+ }
780
+
781
+ /*
782
+ * Neat little hack. Strips out all the non-digit characters from the default
783
+ * value and compares it to the character code of the first character in the string
784
+ * because it can cause encoding issues when posted to the server. We need the
785
+ * parseInt here because charCodeAt will return a number.
786
+ */
787
+ if (html.charCodeAt(0) === parseInt(this.defaultValue.replace(/\D/g, ''), 10)) {
788
+ html = html.substring(1);
789
+ }
790
+ return html;
791
+ },
792
+
793
+ /**
794
+ * Syncs the contents of the editor iframe with the textarea.
795
+ * @protected
796
+ */
797
+ syncValue : function(){
798
+ var me = this,
799
+ body, changed, html, bodyStyle, match, oldValue;
800
+
801
+ if (me.initialized) {
802
+ body = me.getEditorBody();
803
+ html = body.innerHTML;
804
+ if (Ext.isWebKit) {
805
+ bodyStyle = body.getAttribute('style'); // Safari puts text-align styles on the body element!
806
+ match = bodyStyle.match(/text-align:(.*?);/i);
807
+ if (match && match[1]) {
808
+ html = '<div style="' + match[0] + '">' + html + '</div>';
809
+ }
810
+ }
811
+ html = me.cleanHtml(html);
812
+ if (me.fireEvent('beforesync', me, html) !== false) {
813
+ if (me.textareaEl.dom.value != html) {
814
+ me.textareaEl.dom.value = html;
815
+ changed = true;
816
+ }
817
+
818
+ me.fireEvent('sync', me, html);
819
+
820
+ if (changed) {
821
+ // we have to guard this to avoid infinite recursion because getValue
822
+ // calls this method...
823
+ me.checkChange();
824
+ }
825
+ }
826
+ }
827
+ },
828
+
829
+ //docs inherit from Field
830
+ getValue : function() {
831
+ var me = this,
832
+ value;
833
+ if (!me.sourceEditMode) {
834
+ me.syncValue();
835
+ }
836
+ value = me.rendered ? me.textareaEl.dom.value : me.value;
837
+ me.value = value;
838
+ return value;
839
+ },
840
+
841
+ /**
842
+ * Pushes the value of the textarea into the iframe editor.
843
+ * @protected
844
+ */
845
+ pushValue: function() {
846
+ var me = this,
847
+ v;
848
+ if(me.initialized){
849
+ v = me.textareaEl.dom.value || '';
850
+ if (!me.activated && v.length < 1) {
851
+ v = me.defaultValue;
852
+ }
853
+ if (me.fireEvent('beforepush', me, v) !== false) {
854
+ me.getEditorBody().innerHTML = v;
855
+ if (Ext.isGecko) {
856
+ // Gecko hack, see: https://bugzilla.mozilla.org/show_bug.cgi?id=232791#c8
857
+ me.setDesignMode(false); //toggle off first
858
+ me.setDesignMode(true);
859
+ }
860
+ me.fireEvent('push', me, v);
861
+ }
862
+ }
863
+ },
864
+
865
+ // private
866
+ deferFocus : function(){
867
+ this.focus(false, true);
868
+ },
869
+
870
+ getFocusEl: function() {
871
+ var me = this,
872
+ win = me.win;
873
+ return win && !me.sourceEditMode ? win : me.textareaEl;
874
+ },
875
+
876
+ // private
877
+ initEditor : function(){
878
+ //Destroying the component during/before initEditor can cause issues.
879
+ try {
880
+ var me = this,
881
+ dbody = me.getEditorBody(),
882
+ ss = me.textareaEl.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'),
883
+ doc,
884
+ fn;
885
+
886
+ ss['background-attachment'] = 'fixed'; // w3c
887
+ dbody.bgProperties = 'fixed'; // ie
888
+
889
+ Ext.DomHelper.applyStyles(dbody, ss);
890
+
891
+ doc = me.getDoc();
892
+
893
+ if (doc) {
894
+ try {
895
+ Ext.EventManager.removeAll(doc);
896
+ } catch(e) {}
897
+ }
898
+
899
+ /*
900
+ * We need to use createDelegate here, because when using buffer, the delayed task is added
901
+ * as a property to the function. When the listener is removed, the task is deleted from the function.
902
+ * Since onEditorEvent is shared on the prototype, if we have multiple html editors, the first time one of the editors
903
+ * is destroyed, it causes the fn to be deleted from the prototype, which causes errors. Essentially, we're just anonymizing the function.
904
+ */
905
+ fn = Ext.Function.bind(me.onEditorEvent, me);
906
+ Ext.EventManager.on(doc, {
907
+ mousedown: fn,
908
+ dblclick: fn,
909
+ click: fn,
910
+ keyup: fn,
911
+ buffer:100
912
+ });
913
+
914
+ // These events need to be relayed from the inner document (where they stop
915
+ // bubbling) up to the outer document. This has to be done at the DOM level so
916
+ // the event reaches listeners on elements like the document body. The effected
917
+ // mechanisms that depend on this bubbling behavior are listed to the right
918
+ // of the event.
919
+ fn = me.onRelayedEvent;
920
+ Ext.EventManager.on(doc, {
921
+ mousedown: fn, // menu dismisal (MenuManager) and Window onMouseDown (toFront)
922
+ mousemove: fn, // window resize drag detection
923
+ mouseup: fn, // window resize termination
924
+ click: fn, // not sure, but just to be safe
925
+ dblclick: fn, // not sure again
926
+ scope: me
927
+ });
928
+
929
+ if (Ext.isGecko) {
930
+ Ext.EventManager.on(doc, 'keypress', me.applyCommand, me);
931
+ }
932
+ if (me.fixKeys) {
933
+ Ext.EventManager.on(doc, 'keydown', me.fixKeys, me);
934
+ }
935
+
936
+ // We need to be sure we remove all our events from the iframe on unload or we're going to LEAK!
937
+ Ext.EventManager.on(window, 'unload', me.beforeDestroy, me);
938
+ doc.editorInitialized = true;
939
+
940
+ me.initialized = true;
941
+ me.pushValue();
942
+ me.setReadOnly(me.readOnly);
943
+ me.fireEvent('initialize', me);
944
+ } catch(ex) {
945
+ // ignore (why?)
946
+ }
947
+ },
948
+
949
+ // private
950
+ beforeDestroy : function(){
951
+ var me = this,
952
+ monitorTask = me.monitorTask,
953
+ doc, prop;
954
+
955
+ if (monitorTask) {
956
+ Ext.TaskManager.stop(monitorTask);
957
+ }
958
+ if (me.rendered) {
959
+ try {
960
+ doc = me.getDoc();
961
+ if (doc) {
962
+ Ext.EventManager.removeAll(doc);
963
+ for (prop in doc) {
964
+ if (doc.hasOwnProperty && doc.hasOwnProperty(prop)) {
965
+ delete doc[prop];
966
+ }
967
+ }
968
+ }
969
+ } catch(e) {
970
+ // ignore (why?)
971
+ }
972
+ Ext.destroyMembers(me, 'toolbar', 'iframeEl', 'textareaEl');
973
+ }
974
+ me.callParent();
975
+ },
976
+
977
+ // private
978
+ onRelayedEvent: function (event) {
979
+ // relay event from the iframe's document to the document that owns the iframe...
980
+
981
+ var iframeEl = this.iframeEl,
982
+ iframeXY = iframeEl.getXY(),
983
+ eventXY = event.getXY();
984
+
985
+ // the event from the inner document has XY relative to that document's origin,
986
+ // so adjust it to use the origin of the iframe in the outer document:
987
+ event.xy = [iframeXY[0] + eventXY[0], iframeXY[1] + eventXY[1]];
988
+
989
+ event.injectEvent(iframeEl); // blame the iframe for the event...
990
+
991
+ event.xy = eventXY; // restore the original XY (just for safety)
992
+ },
993
+
994
+ // private
995
+ onFirstFocus : function(){
996
+ var me = this,
997
+ selection, range;
998
+ me.activated = true;
999
+ me.disableItems(me.readOnly);
1000
+ if (Ext.isGecko) { // prevent silly gecko errors
1001
+ me.win.focus();
1002
+ selection = me.win.getSelection();
1003
+ if (!selection.focusNode || selection.focusNode.nodeType !== 3) {
1004
+ range = selection.getRangeAt(0);
1005
+ range.selectNodeContents(me.getEditorBody());
1006
+ range.collapse(true);
1007
+ me.deferFocus();
1008
+ }
1009
+ try {
1010
+ me.execCmd('useCSS', true);
1011
+ me.execCmd('styleWithCSS', false);
1012
+ } catch(e) {
1013
+ // ignore (why?)
1014
+ }
1015
+ }
1016
+ me.fireEvent('activate', me);
1017
+ },
1018
+
1019
+ // private
1020
+ adjustFont: function(btn) {
1021
+ var adjust = btn.getItemId() === 'increasefontsize' ? 1 : -1,
1022
+ size = this.getDoc().queryCommandValue('FontSize') || '2',
1023
+ isPxSize = Ext.isString(size) && size.indexOf('px') !== -1,
1024
+ isSafari;
1025
+ size = parseInt(size, 10);
1026
+ if (isPxSize) {
1027
+ // Safari 3 values
1028
+ // 1 = 10px, 2 = 13px, 3 = 16px, 4 = 18px, 5 = 24px, 6 = 32px
1029
+ if (size <= 10) {
1030
+ size = 1 + adjust;
1031
+ }
1032
+ else if (size <= 13) {
1033
+ size = 2 + adjust;
1034
+ }
1035
+ else if (size <= 16) {
1036
+ size = 3 + adjust;
1037
+ }
1038
+ else if (size <= 18) {
1039
+ size = 4 + adjust;
1040
+ }
1041
+ else if (size <= 24) {
1042
+ size = 5 + adjust;
1043
+ }
1044
+ else {
1045
+ size = 6 + adjust;
1046
+ }
1047
+ size = Ext.Number.constrain(size, 1, 6);
1048
+ } else {
1049
+ isSafari = Ext.isSafari;
1050
+ if (isSafari) { // safari
1051
+ adjust *= 2;
1052
+ }
1053
+ size = Math.max(1, size + adjust) + (isSafari ? 'px' : 0);
1054
+ }
1055
+ this.execCmd('FontSize', size);
1056
+ },
1057
+
1058
+ // private
1059
+ onEditorEvent: function(e) {
1060
+ this.updateToolbar();
1061
+ },
1062
+
1063
+ /**
1064
+ * Triggers a toolbar update by reading the markup state of the current selection in the editor.
1065
+ * @protected
1066
+ */
1067
+ updateToolbar: function() {
1068
+ var me = this,
1069
+ btns, doc, name, fontSelect;
1070
+
1071
+ if (me.readOnly) {
1072
+ return;
1073
+ }
1074
+
1075
+ if (!me.activated) {
1076
+ me.onFirstFocus();
1077
+ return;
1078
+ }
1079
+
1080
+ btns = me.getToolbar().items.map;
1081
+ doc = me.getDoc();
1082
+
1083
+ if (me.enableFont && !Ext.isSafari2) {
1084
+ name = (doc.queryCommandValue('FontName') || me.defaultFont).toLowerCase();
1085
+ fontSelect = me.fontSelect.dom;
1086
+ if (name !== fontSelect.value) {
1087
+ fontSelect.value = name;
1088
+ }
1089
+ }
1090
+
1091
+ function updateButtons() {
1092
+ for (var i = 0, l = arguments.length, name; i < l; i++) {
1093
+ name = arguments[i];
1094
+ btns[name].toggle(doc.queryCommandState(name));
1095
+ }
1096
+ }
1097
+ if(me.enableFormat){
1098
+ updateButtons('bold', 'italic', 'underline');
1099
+ }
1100
+ if(me.enableAlignments){
1101
+ updateButtons('justifyleft', 'justifycenter', 'justifyright');
1102
+ }
1103
+ if(!Ext.isSafari2 && me.enableLists){
1104
+ updateButtons('insertorderedlist', 'insertunorderedlist');
1105
+ }
1106
+
1107
+ Ext.menu.Manager.hideAll();
1108
+
1109
+ me.syncValue();
1110
+ },
1111
+
1112
+ // private
1113
+ relayBtnCmd: function(btn) {
1114
+ this.relayCmd(btn.getItemId());
1115
+ },
1116
+
1117
+ /**
1118
+ * Executes a Midas editor command on the editor document and performs necessary focus and toolbar updates.
1119
+ * **This should only be called after the editor is initialized.**
1120
+ * @param {String} cmd The Midas command
1121
+ * @param {String/Boolean} [value=null] The value to pass to the command
1122
+ */
1123
+ relayCmd: function(cmd, value) {
1124
+ Ext.defer(function() {
1125
+ var me = this;
1126
+ me.focus();
1127
+ me.execCmd(cmd, value);
1128
+ me.updateToolbar();
1129
+ }, 10, this);
1130
+ },
1131
+
1132
+ /**
1133
+ * Executes a Midas editor command directly on the editor document. For visual commands, you should use
1134
+ * {@link #relayCmd} instead. **This should only be called after the editor is initialized.**
1135
+ * @param {String} cmd The Midas command
1136
+ * @param {String/Boolean} [value=null] The value to pass to the command
1137
+ */
1138
+ execCmd : function(cmd, value){
1139
+ var me = this,
1140
+ doc = me.getDoc(),
1141
+ undef;
1142
+ doc.execCommand(cmd, false, value === undef ? null : value);
1143
+ me.syncValue();
1144
+ },
1145
+
1146
+ // private
1147
+ applyCommand : function(e){
1148
+ if (e.ctrlKey) {
1149
+ var me = this,
1150
+ c = e.getCharCode(), cmd;
1151
+ if (c > 0) {
1152
+ c = String.fromCharCode(c);
1153
+ switch (c) {
1154
+ case 'b':
1155
+ cmd = 'bold';
1156
+ break;
1157
+ case 'i':
1158
+ cmd = 'italic';
1159
+ break;
1160
+ case 'u':
1161
+ cmd = 'underline';
1162
+ break;
1163
+ }
1164
+ if (cmd) {
1165
+ me.win.focus();
1166
+ me.execCmd(cmd);
1167
+ me.deferFocus();
1168
+ e.preventDefault();
1169
+ }
1170
+ }
1171
+ }
1172
+ },
1173
+
1174
+ /**
1175
+ * Inserts the passed text at the current cursor position.
1176
+ * Note: the editor must be initialized and activated to insert text.
1177
+ * @param {String} text
1178
+ */
1179
+ insertAtCursor : function(text){
1180
+ var me = this,
1181
+ range;
1182
+
1183
+ if (me.activated) {
1184
+ me.win.focus();
1185
+ if (Ext.isIE) {
1186
+ range = me.getDoc().selection.createRange();
1187
+ if (range) {
1188
+ range.pasteHTML(text);
1189
+ me.syncValue();
1190
+ me.deferFocus();
1191
+ }
1192
+ }else{
1193
+ me.execCmd('InsertHTML', text);
1194
+ me.deferFocus();
1195
+ }
1196
+ }
1197
+ },
1198
+
1199
+ // private
1200
+ fixKeys: (function() { // load time branching for fastest keydown performance
1201
+ if (Ext.isIE) {
1202
+ return function(e){
1203
+ var me = this,
1204
+ k = e.getKey(),
1205
+ doc = me.getDoc(),
1206
+ readOnly = me.readOnly,
1207
+ range, target;
1208
+
1209
+ if (k === e.TAB) {
1210
+ e.stopEvent();
1211
+ if (!readOnly) {
1212
+ range = doc.selection.createRange();
1213
+ if(range){
1214
+ range.collapse(true);
1215
+ range.pasteHTML('&#160;&#160;&#160;&#160;');
1216
+ me.deferFocus();
1217
+ }
1218
+ }
1219
+ }
1220
+ else if (k === e.ENTER) {
1221
+ if (!readOnly) {
1222
+ range = doc.selection.createRange();
1223
+ if (range) {
1224
+ target = range.parentElement();
1225
+ if(!target || target.tagName.toLowerCase() !== 'li'){
1226
+ e.stopEvent();
1227
+ range.pasteHTML('<br />');
1228
+ range.collapse(false);
1229
+ range.select();
1230
+ }
1231
+ }
1232
+ }
1233
+ }
1234
+ };
1235
+ }
1236
+
1237
+ if (Ext.isOpera) {
1238
+ return function(e){
1239
+ var me = this;
1240
+ if (e.getKey() === e.TAB) {
1241
+ e.stopEvent();
1242
+ if (!me.readOnly) {
1243
+ me.win.focus();
1244
+ me.execCmd('InsertHTML','&#160;&#160;&#160;&#160;');
1245
+ me.deferFocus();
1246
+ }
1247
+ }
1248
+ };
1249
+ }
1250
+
1251
+ if (Ext.isWebKit) {
1252
+ return function(e){
1253
+ var me = this,
1254
+ k = e.getKey(),
1255
+ readOnly = me.readOnly;
1256
+
1257
+ if (k === e.TAB) {
1258
+ e.stopEvent();
1259
+ if (!readOnly) {
1260
+ me.execCmd('InsertText','\t');
1261
+ me.deferFocus();
1262
+ }
1263
+ }
1264
+ else if (k === e.ENTER) {
1265
+ e.stopEvent();
1266
+ if (!readOnly) {
1267
+ me.execCmd('InsertHtml','<br /><br />');
1268
+ me.deferFocus();
1269
+ }
1270
+ }
1271
+ };
1272
+ }
1273
+
1274
+ return null; // not needed, so null
1275
+ }()),
1276
+
1277
+ /**
1278
+ * Returns the editor's toolbar. **This is only available after the editor has been rendered.**
1279
+ * @return {Ext.toolbar.Toolbar}
1280
+ */
1281
+ getToolbar : function(){
1282
+ return this.toolbar;
1283
+ },
1284
+
1285
+ /**
1286
+ * @property {Object} buttonTips
1287
+ * Object collection of toolbar tooltips for the buttons in the editor. The key is the command id associated with
1288
+ * that button and the value is a valid QuickTips object. For example:
1289
+ *
1290
+ * {
1291
+ * bold : {
1292
+ * title: 'Bold (Ctrl+B)',
1293
+ * text: 'Make the selected text bold.',
1294
+ * cls: 'x-html-editor-tip'
1295
+ * },
1296
+ * italic : {
1297
+ * title: 'Italic (Ctrl+I)',
1298
+ * text: 'Make the selected text italic.',
1299
+ * cls: 'x-html-editor-tip'
1300
+ * },
1301
+ * ...
1302
+ */
1303
+ //<locale>
1304
+ buttonTips : {
1305
+ bold : {
1306
+ title: 'Bold (Ctrl+B)',
1307
+ text: 'Make the selected text bold.',
1308
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1309
+ },
1310
+ italic : {
1311
+ title: 'Italic (Ctrl+I)',
1312
+ text: 'Make the selected text italic.',
1313
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1314
+ },
1315
+ underline : {
1316
+ title: 'Underline (Ctrl+U)',
1317
+ text: 'Underline the selected text.',
1318
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1319
+ },
1320
+ increasefontsize : {
1321
+ title: 'Grow Text',
1322
+ text: 'Increase the font size.',
1323
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1324
+ },
1325
+ decreasefontsize : {
1326
+ title: 'Shrink Text',
1327
+ text: 'Decrease the font size.',
1328
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1329
+ },
1330
+ backcolor : {
1331
+ title: 'Text Highlight Color',
1332
+ text: 'Change the background color of the selected text.',
1333
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1334
+ },
1335
+ forecolor : {
1336
+ title: 'Font Color',
1337
+ text: 'Change the color of the selected text.',
1338
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1339
+ },
1340
+ justifyleft : {
1341
+ title: 'Align Text Left',
1342
+ text: 'Align text to the left.',
1343
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1344
+ },
1345
+ justifycenter : {
1346
+ title: 'Center Text',
1347
+ text: 'Center text in the editor.',
1348
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1349
+ },
1350
+ justifyright : {
1351
+ title: 'Align Text Right',
1352
+ text: 'Align text to the right.',
1353
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1354
+ },
1355
+ insertunorderedlist : {
1356
+ title: 'Bullet List',
1357
+ text: 'Start a bulleted list.',
1358
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1359
+ },
1360
+ insertorderedlist : {
1361
+ title: 'Numbered List',
1362
+ text: 'Start a numbered list.',
1363
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1364
+ },
1365
+ createlink : {
1366
+ title: 'Hyperlink',
1367
+ text: 'Make the selected text a hyperlink.',
1368
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1369
+ },
1370
+ sourceedit : {
1371
+ title: 'Source Edit',
1372
+ text: 'Switch to source editing mode.',
1373
+ cls: Ext.baseCSSPrefix + 'html-editor-tip'
1374
+ }
1375
+ }
1376
+ //</locale>
1377
+
1378
+ // hide stuff that is not compatible
1379
+ /**
1380
+ * @event blur
1381
+ * @private
1382
+ */
1383
+ /**
1384
+ * @event focus
1385
+ * @private
1386
+ */
1387
+ /**
1388
+ * @event specialkey
1389
+ * @private
1390
+ */
1391
+ /**
1392
+ * @cfg {String} fieldCls
1393
+ * @private
1394
+ */
1395
+ /**
1396
+ * @cfg {String} focusCls
1397
+ * @private
1398
+ */
1399
+ /**
1400
+ * @cfg {String} autoCreate
1401
+ * @private
1402
+ */
1403
+ /**
1404
+ * @cfg {String} inputType
1405
+ * @private
1406
+ */
1407
+ /**
1408
+ * @cfg {String} invalidCls
1409
+ * @private
1410
+ */
1411
+ /**
1412
+ * @cfg {String} invalidText
1413
+ * @private
1414
+ */
1415
+ /**
1416
+ * @cfg {String} msgFx
1417
+ * @private
1418
+ */
1419
+ /**
1420
+ * @cfg {Boolean} allowDomMove
1421
+ * @private
1422
+ */
1423
+ /**
1424
+ * @cfg {String} applyTo
1425
+ * @private
1426
+ */
1427
+ /**
1428
+ * @cfg {String} readOnly
1429
+ * @private
1430
+ */
1431
+ /**
1432
+ * @cfg {String} tabIndex
1433
+ * @private
1434
+ */
1435
+ /**
1436
+ * @method validate
1437
+ * @private
1438
+ */
1439
+ });