lpmp 1.0.0

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 (636) hide show
  1. data/LICENSE +3 -0
  2. data/README +3 -0
  3. data/Rakefile +45 -0
  4. data/bin/lpmp +107 -0
  5. data/config/help.yaml +1 -0
  6. data/config/hosts.yaml +2 -0
  7. data/config/log.yaml +1 -0
  8. data/config/memcache.yaml +5 -0
  9. data/erb/index.erb +62 -0
  10. data/lib/bg_pull/caichen.rb +199 -0
  11. data/lib/bg_pull/lpmp.rb +45 -0
  12. data/lib/exception.rb +8 -0
  13. data/lib/lpmp.rb +53 -0
  14. data/lib/pull/lpmp.rb +355 -0
  15. data/lib/remote_lmp.rb +129 -0
  16. data/lib/utils.rb +14 -0
  17. data/lib/xq_push/caichen.rb +174 -0
  18. data/lib/xq_push/lpmp.rb +96 -0
  19. data/log/lpmp1st.log +1 -0
  20. data/public/css/ext-portal.css +40 -0
  21. data/public/css/lpmp.css +6 -0
  22. data/public/designer/caichen.epj +1 -0
  23. data/public/designer/hostmonitor.epj +1 -0
  24. data/public/ext-3.0.0/INCLUDE_ORDER.txt +35 -0
  25. data/public/ext-3.0.0/adapter/ext/ext-base-debug.js +3589 -0
  26. data/public/ext-3.0.0/adapter/ext/ext-base.js +7 -0
  27. data/public/ext-3.0.0/adapter/jquery/ext-jquery-adapter-debug.js +2292 -0
  28. data/public/ext-3.0.0/adapter/jquery/ext-jquery-adapter.js +7 -0
  29. data/public/ext-3.0.0/adapter/prototype/ext-prototype-adapter-debug.js +2346 -0
  30. data/public/ext-3.0.0/adapter/prototype/ext-prototype-adapter.js +7 -0
  31. data/public/ext-3.0.0/adapter/yui/ext-yui-adapter-debug.js +2136 -0
  32. data/public/ext-3.0.0/adapter/yui/ext-yui-adapter.js +7 -0
  33. data/public/ext-3.0.0/ext-all-debug.js +65610 -0
  34. data/public/ext-3.0.0/ext-all.js +11 -0
  35. data/public/ext-3.0.0/license.txt +42 -0
  36. data/public/ext-3.0.0/pkgs/cmp-foundation-debug.js +11287 -0
  37. data/public/ext-3.0.0/pkgs/cmp-foundation.js +7 -0
  38. data/public/ext-3.0.0/pkgs/data-foundation-debug.js +3853 -0
  39. data/public/ext-3.0.0/pkgs/data-foundation.js +7 -0
  40. data/public/ext-3.0.0/pkgs/data-grouping-debug.js +139 -0
  41. data/public/ext-3.0.0/pkgs/data-grouping.js +7 -0
  42. data/public/ext-3.0.0/pkgs/data-json-debug.js +582 -0
  43. data/public/ext-3.0.0/pkgs/data-json.js +7 -0
  44. data/public/ext-3.0.0/pkgs/data-list-views-debug.js +1278 -0
  45. data/public/ext-3.0.0/pkgs/data-list-views.js +7 -0
  46. data/public/ext-3.0.0/pkgs/data-xml-debug.js +234 -0
  47. data/public/ext-3.0.0/pkgs/data-xml.js +7 -0
  48. data/public/ext-3.0.0/pkgs/direct-debug.js +1121 -0
  49. data/public/ext-3.0.0/pkgs/direct.js +7 -0
  50. data/public/ext-3.0.0/pkgs/ext-dd-debug.js +4567 -0
  51. data/public/ext-3.0.0/pkgs/ext-dd.js +7 -0
  52. data/public/ext-3.0.0/pkgs/ext-foundation-debug.js +13417 -0
  53. data/public/ext-3.0.0/pkgs/ext-foundation.js +7 -0
  54. data/public/ext-3.0.0/pkgs/pkg-buttons-debug.js +1060 -0
  55. data/public/ext-3.0.0/pkgs/pkg-buttons.js +7 -0
  56. data/public/ext-3.0.0/pkgs/pkg-charts-debug.js +1621 -0
  57. data/public/ext-3.0.0/pkgs/pkg-charts.js +10 -0
  58. data/public/ext-3.0.0/pkgs/pkg-forms-debug.js +7661 -0
  59. data/public/ext-3.0.0/pkgs/pkg-forms.js +7 -0
  60. data/public/ext-3.0.0/pkgs/pkg-grid-editor-debug.js +560 -0
  61. data/public/ext-3.0.0/pkgs/pkg-grid-editor.js +7 -0
  62. data/public/ext-3.0.0/pkgs/pkg-grid-foundation-debug.js +4765 -0
  63. data/public/ext-3.0.0/pkgs/pkg-grid-foundation.js +7 -0
  64. data/public/ext-3.0.0/pkgs/pkg-grid-grouping-debug.js +517 -0
  65. data/public/ext-3.0.0/pkgs/pkg-grid-grouping.js +7 -0
  66. data/public/ext-3.0.0/pkgs/pkg-grid-property-debug.js +370 -0
  67. data/public/ext-3.0.0/pkgs/pkg-grid-property.js +7 -0
  68. data/public/ext-3.0.0/pkgs/pkg-history-debug.js +203 -0
  69. data/public/ext-3.0.0/pkgs/pkg-history.js +7 -0
  70. data/public/ext-3.0.0/pkgs/pkg-menu-debug.js +1628 -0
  71. data/public/ext-3.0.0/pkgs/pkg-menu.js +7 -0
  72. data/public/ext-3.0.0/pkgs/pkg-tabs-debug.js +1100 -0
  73. data/public/ext-3.0.0/pkgs/pkg-tabs.js +7 -0
  74. data/public/ext-3.0.0/pkgs/pkg-tips-debug.js +994 -0
  75. data/public/ext-3.0.0/pkgs/pkg-tips.js +7 -0
  76. data/public/ext-3.0.0/pkgs/pkg-toolbars-debug.js +1374 -0
  77. data/public/ext-3.0.0/pkgs/pkg-toolbars.js +7 -0
  78. data/public/ext-3.0.0/pkgs/pkg-tree-debug.js +4522 -0
  79. data/public/ext-3.0.0/pkgs/pkg-tree.js +7 -0
  80. data/public/ext-3.0.0/pkgs/resizable-debug.js +760 -0
  81. data/public/ext-3.0.0/pkgs/resizable.js +7 -0
  82. data/public/ext-3.0.0/pkgs/state-debug.js +274 -0
  83. data/public/ext-3.0.0/pkgs/state.js +7 -0
  84. data/public/ext-3.0.0/pkgs/window-debug.js +1888 -0
  85. data/public/ext-3.0.0/pkgs/window.js +7 -0
  86. data/public/ext-3.0.0/resources/charts.swf +0 -0
  87. data/public/ext-3.0.0/resources/css/README.txt +3 -0
  88. data/public/ext-3.0.0/resources/css/ext-all-notheme.css +5345 -0
  89. data/public/ext-3.0.0/resources/css/ext-all.css +6990 -0
  90. data/public/ext-3.0.0/resources/css/reset-min.css +7 -0
  91. data/public/ext-3.0.0/resources/css/structure/borders.css +54 -0
  92. data/public/ext-3.0.0/resources/css/structure/box.css +80 -0
  93. data/public/ext-3.0.0/resources/css/structure/button.css +440 -0
  94. data/public/ext-3.0.0/resources/css/structure/combo.css +45 -0
  95. data/public/ext-3.0.0/resources/css/structure/core.css +326 -0
  96. data/public/ext-3.0.0/resources/css/structure/date-picker.css +265 -0
  97. data/public/ext-3.0.0/resources/css/structure/dd.css +61 -0
  98. data/public/ext-3.0.0/resources/css/structure/debug.css +26 -0
  99. data/public/ext-3.0.0/resources/css/structure/dialog.css +62 -0
  100. data/public/ext-3.0.0/resources/css/structure/editor.css +92 -0
  101. data/public/ext-3.0.0/resources/css/structure/form.css +562 -0
  102. data/public/ext-3.0.0/resources/css/structure/grid.css +552 -0
  103. data/public/ext-3.0.0/resources/css/structure/layout.css +296 -0
  104. data/public/ext-3.0.0/resources/css/structure/list-view.css +85 -0
  105. data/public/ext-3.0.0/resources/css/structure/menu.css +205 -0
  106. data/public/ext-3.0.0/resources/css/structure/panel-reset.css +130 -0
  107. data/public/ext-3.0.0/resources/css/structure/panel.css +468 -0
  108. data/public/ext-3.0.0/resources/css/structure/progress.css +42 -0
  109. data/public/ext-3.0.0/resources/css/structure/qtips.css +153 -0
  110. data/public/ext-3.0.0/resources/css/structure/reset.css +7 -0
  111. data/public/ext-3.0.0/resources/css/structure/resizable.css +149 -0
  112. data/public/ext-3.0.0/resources/css/structure/slider.css +103 -0
  113. data/public/ext-3.0.0/resources/css/structure/tabs.css +372 -0
  114. data/public/ext-3.0.0/resources/css/structure/toolbar.css +259 -0
  115. data/public/ext-3.0.0/resources/css/structure/tree.css +203 -0
  116. data/public/ext-3.0.0/resources/css/structure/window.css +222 -0
  117. data/public/ext-3.0.0/resources/css/visual/borders.css +25 -0
  118. data/public/ext-3.0.0/resources/css/visual/box.css +74 -0
  119. data/public/ext-3.0.0/resources/css/visual/button.css +94 -0
  120. data/public/ext-3.0.0/resources/css/visual/combo.css +43 -0
  121. data/public/ext-3.0.0/resources/css/visual/core.css +76 -0
  122. data/public/ext-3.0.0/resources/css/visual/date-picker.css +143 -0
  123. data/public/ext-3.0.0/resources/css/visual/dd.css +29 -0
  124. data/public/ext-3.0.0/resources/css/visual/debug.css +24 -0
  125. data/public/ext-3.0.0/resources/css/visual/dialog.css +34 -0
  126. data/public/ext-3.0.0/resources/css/visual/editor.css +13 -0
  127. data/public/ext-3.0.0/resources/css/visual/form.css +117 -0
  128. data/public/ext-3.0.0/resources/css/visual/grid.css +272 -0
  129. data/public/ext-3.0.0/resources/css/visual/layout.css +53 -0
  130. data/public/ext-3.0.0/resources/css/visual/list-view.css +37 -0
  131. data/public/ext-3.0.0/resources/css/visual/menu.css +82 -0
  132. data/public/ext-3.0.0/resources/css/visual/panel.css +87 -0
  133. data/public/ext-3.0.0/resources/css/visual/progress.css +32 -0
  134. data/public/ext-3.0.0/resources/css/visual/qtips.css +44 -0
  135. data/public/ext-3.0.0/resources/css/visual/resizable.css +43 -0
  136. data/public/ext-3.0.0/resources/css/visual/slider.css +21 -0
  137. data/public/ext-3.0.0/resources/css/visual/tabs.css +119 -0
  138. data/public/ext-3.0.0/resources/css/visual/toolbar.css +103 -0
  139. data/public/ext-3.0.0/resources/css/visual/tree.css +157 -0
  140. data/public/ext-3.0.0/resources/css/visual/window.css +86 -0
  141. data/public/ext-3.0.0/resources/css/xtheme-blue.css +1652 -0
  142. data/public/ext-3.0.0/resources/expressinstall.swf +0 -0
  143. data/public/ext-3.0.0/resources/images/default/box/corners-blue.gif +0 -0
  144. data/public/ext-3.0.0/resources/images/default/box/corners.gif +0 -0
  145. data/public/ext-3.0.0/resources/images/default/box/l-blue.gif +0 -0
  146. data/public/ext-3.0.0/resources/images/default/box/l.gif +0 -0
  147. data/public/ext-3.0.0/resources/images/default/box/r-blue.gif +0 -0
  148. data/public/ext-3.0.0/resources/images/default/box/r.gif +0 -0
  149. data/public/ext-3.0.0/resources/images/default/box/tb-blue.gif +0 -0
  150. data/public/ext-3.0.0/resources/images/default/box/tb.gif +0 -0
  151. data/public/ext-3.0.0/resources/images/default/button/arrow.gif +0 -0
  152. data/public/ext-3.0.0/resources/images/default/button/btn.gif +0 -0
  153. data/public/ext-3.0.0/resources/images/default/button/group-cs.gif +0 -0
  154. data/public/ext-3.0.0/resources/images/default/button/group-lr.gif +0 -0
  155. data/public/ext-3.0.0/resources/images/default/button/group-tb.gif +0 -0
  156. data/public/ext-3.0.0/resources/images/default/button/s-arrow-b-noline.gif +0 -0
  157. data/public/ext-3.0.0/resources/images/default/button/s-arrow-b.gif +0 -0
  158. data/public/ext-3.0.0/resources/images/default/button/s-arrow-bo.gif +0 -0
  159. data/public/ext-3.0.0/resources/images/default/button/s-arrow-noline.gif +0 -0
  160. data/public/ext-3.0.0/resources/images/default/button/s-arrow-o.gif +0 -0
  161. data/public/ext-3.0.0/resources/images/default/button/s-arrow.gif +0 -0
  162. data/public/ext-3.0.0/resources/images/default/dd/drop-add.gif +0 -0
  163. data/public/ext-3.0.0/resources/images/default/dd/drop-no.gif +0 -0
  164. data/public/ext-3.0.0/resources/images/default/dd/drop-yes.gif +0 -0
  165. data/public/ext-3.0.0/resources/images/default/editor/tb-sprite.gif +0 -0
  166. data/public/ext-3.0.0/resources/images/default/form/checkbox.gif +0 -0
  167. data/public/ext-3.0.0/resources/images/default/form/clear-trigger.gif +0 -0
  168. data/public/ext-3.0.0/resources/images/default/form/clear-trigger.psd +0 -0
  169. data/public/ext-3.0.0/resources/images/default/form/date-trigger.gif +0 -0
  170. data/public/ext-3.0.0/resources/images/default/form/date-trigger.psd +0 -0
  171. data/public/ext-3.0.0/resources/images/default/form/error-tip-corners.gif +0 -0
  172. data/public/ext-3.0.0/resources/images/default/form/exclamation.gif +0 -0
  173. data/public/ext-3.0.0/resources/images/default/form/radio.gif +0 -0
  174. data/public/ext-3.0.0/resources/images/default/form/search-trigger.gif +0 -0
  175. data/public/ext-3.0.0/resources/images/default/form/search-trigger.psd +0 -0
  176. data/public/ext-3.0.0/resources/images/default/form/text-bg.gif +0 -0
  177. data/public/ext-3.0.0/resources/images/default/form/trigger-tpl.gif +0 -0
  178. data/public/ext-3.0.0/resources/images/default/form/trigger.gif +0 -0
  179. data/public/ext-3.0.0/resources/images/default/form/trigger.psd +0 -0
  180. data/public/ext-3.0.0/resources/images/default/gradient-bg.gif +0 -0
  181. data/public/ext-3.0.0/resources/images/default/grid/arrow-left-white.gif +0 -0
  182. data/public/ext-3.0.0/resources/images/default/grid/arrow-right-white.gif +0 -0
  183. data/public/ext-3.0.0/resources/images/default/grid/col-move-bottom.gif +0 -0
  184. data/public/ext-3.0.0/resources/images/default/grid/col-move-top.gif +0 -0
  185. data/public/ext-3.0.0/resources/images/default/grid/columns.gif +0 -0
  186. data/public/ext-3.0.0/resources/images/default/grid/dirty.gif +0 -0
  187. data/public/ext-3.0.0/resources/images/default/grid/done.gif +0 -0
  188. data/public/ext-3.0.0/resources/images/default/grid/drop-no.gif +0 -0
  189. data/public/ext-3.0.0/resources/images/default/grid/drop-yes.gif +0 -0
  190. data/public/ext-3.0.0/resources/images/default/grid/footer-bg.gif +0 -0
  191. data/public/ext-3.0.0/resources/images/default/grid/grid-blue-hd.gif +0 -0
  192. data/public/ext-3.0.0/resources/images/default/grid/grid-blue-split.gif +0 -0
  193. data/public/ext-3.0.0/resources/images/default/grid/grid-hrow.gif +0 -0
  194. data/public/ext-3.0.0/resources/images/default/grid/grid-loading.gif +0 -0
  195. data/public/ext-3.0.0/resources/images/default/grid/grid-split.gif +0 -0
  196. data/public/ext-3.0.0/resources/images/default/grid/grid-vista-hd.gif +0 -0
  197. data/public/ext-3.0.0/resources/images/default/grid/grid3-hd-btn.gif +0 -0
  198. data/public/ext-3.0.0/resources/images/default/grid/grid3-hrow-over.gif +0 -0
  199. data/public/ext-3.0.0/resources/images/default/grid/grid3-hrow.gif +0 -0
  200. data/public/ext-3.0.0/resources/images/default/grid/grid3-special-col-bg.gif +0 -0
  201. data/public/ext-3.0.0/resources/images/default/grid/grid3-special-col-sel-bg.gif +0 -0
  202. data/public/ext-3.0.0/resources/images/default/grid/group-by.gif +0 -0
  203. data/public/ext-3.0.0/resources/images/default/grid/group-collapse.gif +0 -0
  204. data/public/ext-3.0.0/resources/images/default/grid/group-expand-sprite.gif +0 -0
  205. data/public/ext-3.0.0/resources/images/default/grid/group-expand.gif +0 -0
  206. data/public/ext-3.0.0/resources/images/default/grid/hd-pop.gif +0 -0
  207. data/public/ext-3.0.0/resources/images/default/grid/hmenu-asc.gif +0 -0
  208. data/public/ext-3.0.0/resources/images/default/grid/hmenu-desc.gif +0 -0
  209. data/public/ext-3.0.0/resources/images/default/grid/hmenu-lock.gif +0 -0
  210. data/public/ext-3.0.0/resources/images/default/grid/hmenu-lock.png +0 -0
  211. data/public/ext-3.0.0/resources/images/default/grid/hmenu-unlock.gif +0 -0
  212. data/public/ext-3.0.0/resources/images/default/grid/hmenu-unlock.png +0 -0
  213. data/public/ext-3.0.0/resources/images/default/grid/invalid_line.gif +0 -0
  214. data/public/ext-3.0.0/resources/images/default/grid/loading.gif +0 -0
  215. data/public/ext-3.0.0/resources/images/default/grid/mso-hd.gif +0 -0
  216. data/public/ext-3.0.0/resources/images/default/grid/nowait.gif +0 -0
  217. data/public/ext-3.0.0/resources/images/default/grid/page-first-disabled.gif +0 -0
  218. data/public/ext-3.0.0/resources/images/default/grid/page-first.gif +0 -0
  219. data/public/ext-3.0.0/resources/images/default/grid/page-last-disabled.gif +0 -0
  220. data/public/ext-3.0.0/resources/images/default/grid/page-last.gif +0 -0
  221. data/public/ext-3.0.0/resources/images/default/grid/page-next-disabled.gif +0 -0
  222. data/public/ext-3.0.0/resources/images/default/grid/page-next.gif +0 -0
  223. data/public/ext-3.0.0/resources/images/default/grid/page-prev-disabled.gif +0 -0
  224. data/public/ext-3.0.0/resources/images/default/grid/page-prev.gif +0 -0
  225. data/public/ext-3.0.0/resources/images/default/grid/pick-button.gif +0 -0
  226. data/public/ext-3.0.0/resources/images/default/grid/refresh.gif +0 -0
  227. data/public/ext-3.0.0/resources/images/default/grid/row-check-sprite.gif +0 -0
  228. data/public/ext-3.0.0/resources/images/default/grid/row-expand-sprite.gif +0 -0
  229. data/public/ext-3.0.0/resources/images/default/grid/row-over.gif +0 -0
  230. data/public/ext-3.0.0/resources/images/default/grid/row-sel.gif +0 -0
  231. data/public/ext-3.0.0/resources/images/default/grid/sort-hd.gif +0 -0
  232. data/public/ext-3.0.0/resources/images/default/grid/sort_asc.gif +0 -0
  233. data/public/ext-3.0.0/resources/images/default/grid/sort_desc.gif +0 -0
  234. data/public/ext-3.0.0/resources/images/default/grid/wait.gif +0 -0
  235. data/public/ext-3.0.0/resources/images/default/layout/collapse.gif +0 -0
  236. data/public/ext-3.0.0/resources/images/default/layout/expand.gif +0 -0
  237. data/public/ext-3.0.0/resources/images/default/layout/gradient-bg.gif +0 -0
  238. data/public/ext-3.0.0/resources/images/default/layout/mini-bottom.gif +0 -0
  239. data/public/ext-3.0.0/resources/images/default/layout/mini-left.gif +0 -0
  240. data/public/ext-3.0.0/resources/images/default/layout/mini-right.gif +0 -0
  241. data/public/ext-3.0.0/resources/images/default/layout/mini-top.gif +0 -0
  242. data/public/ext-3.0.0/resources/images/default/layout/ns-collapse.gif +0 -0
  243. data/public/ext-3.0.0/resources/images/default/layout/ns-expand.gif +0 -0
  244. data/public/ext-3.0.0/resources/images/default/layout/panel-close.gif +0 -0
  245. data/public/ext-3.0.0/resources/images/default/layout/panel-title-bg.gif +0 -0
  246. data/public/ext-3.0.0/resources/images/default/layout/panel-title-light-bg.gif +0 -0
  247. data/public/ext-3.0.0/resources/images/default/layout/stick.gif +0 -0
  248. data/public/ext-3.0.0/resources/images/default/layout/stuck.gif +0 -0
  249. data/public/ext-3.0.0/resources/images/default/layout/tab-close-on.gif +0 -0
  250. data/public/ext-3.0.0/resources/images/default/layout/tab-close.gif +0 -0
  251. data/public/ext-3.0.0/resources/images/default/menu/checked.gif +0 -0
  252. data/public/ext-3.0.0/resources/images/default/menu/group-checked.gif +0 -0
  253. data/public/ext-3.0.0/resources/images/default/menu/item-over.gif +0 -0
  254. data/public/ext-3.0.0/resources/images/default/menu/menu-parent.gif +0 -0
  255. data/public/ext-3.0.0/resources/images/default/menu/menu.gif +0 -0
  256. data/public/ext-3.0.0/resources/images/default/menu/unchecked.gif +0 -0
  257. data/public/ext-3.0.0/resources/images/default/panel/corners-sprite.gif +0 -0
  258. data/public/ext-3.0.0/resources/images/default/panel/left-right.gif +0 -0
  259. data/public/ext-3.0.0/resources/images/default/panel/light-hd.gif +0 -0
  260. data/public/ext-3.0.0/resources/images/default/panel/tool-sprite-tpl.gif +0 -0
  261. data/public/ext-3.0.0/resources/images/default/panel/tool-sprites.gif +0 -0
  262. data/public/ext-3.0.0/resources/images/default/panel/tools-sprites-trans.gif +0 -0
  263. data/public/ext-3.0.0/resources/images/default/panel/top-bottom.gif +0 -0
  264. data/public/ext-3.0.0/resources/images/default/panel/top-bottom.png +0 -0
  265. data/public/ext-3.0.0/resources/images/default/panel/white-corners-sprite.gif +0 -0
  266. data/public/ext-3.0.0/resources/images/default/panel/white-left-right.gif +0 -0
  267. data/public/ext-3.0.0/resources/images/default/panel/white-top-bottom.gif +0 -0
  268. data/public/ext-3.0.0/resources/images/default/progress/progress-bg.gif +0 -0
  269. data/public/ext-3.0.0/resources/images/default/qtip/bg.gif +0 -0
  270. data/public/ext-3.0.0/resources/images/default/qtip/close.gif +0 -0
  271. data/public/ext-3.0.0/resources/images/default/qtip/tip-anchor-sprite.gif +0 -0
  272. data/public/ext-3.0.0/resources/images/default/qtip/tip-sprite.gif +0 -0
  273. data/public/ext-3.0.0/resources/images/default/s.gif +0 -0
  274. data/public/ext-3.0.0/resources/images/default/shadow-c.png +0 -0
  275. data/public/ext-3.0.0/resources/images/default/shadow-lr.png +0 -0
  276. data/public/ext-3.0.0/resources/images/default/shadow.png +0 -0
  277. data/public/ext-3.0.0/resources/images/default/shared/blue-loading.gif +0 -0
  278. data/public/ext-3.0.0/resources/images/default/shared/calendar.gif +0 -0
  279. data/public/ext-3.0.0/resources/images/default/shared/glass-bg.gif +0 -0
  280. data/public/ext-3.0.0/resources/images/default/shared/hd-sprite.gif +0 -0
  281. data/public/ext-3.0.0/resources/images/default/shared/large-loading.gif +0 -0
  282. data/public/ext-3.0.0/resources/images/default/shared/left-btn.gif +0 -0
  283. data/public/ext-3.0.0/resources/images/default/shared/loading-balls.gif +0 -0
  284. data/public/ext-3.0.0/resources/images/default/shared/right-btn.gif +0 -0
  285. data/public/ext-3.0.0/resources/images/default/shared/warning.gif +0 -0
  286. data/public/ext-3.0.0/resources/images/default/sizer/e-handle-dark.gif +0 -0
  287. data/public/ext-3.0.0/resources/images/default/sizer/e-handle.gif +0 -0
  288. data/public/ext-3.0.0/resources/images/default/sizer/ne-handle-dark.gif +0 -0
  289. data/public/ext-3.0.0/resources/images/default/sizer/ne-handle.gif +0 -0
  290. data/public/ext-3.0.0/resources/images/default/sizer/nw-handle-dark.gif +0 -0
  291. data/public/ext-3.0.0/resources/images/default/sizer/nw-handle.gif +0 -0
  292. data/public/ext-3.0.0/resources/images/default/sizer/s-handle-dark.gif +0 -0
  293. data/public/ext-3.0.0/resources/images/default/sizer/s-handle.gif +0 -0
  294. data/public/ext-3.0.0/resources/images/default/sizer/se-handle-dark.gif +0 -0
  295. data/public/ext-3.0.0/resources/images/default/sizer/se-handle.gif +0 -0
  296. data/public/ext-3.0.0/resources/images/default/sizer/square.gif +0 -0
  297. data/public/ext-3.0.0/resources/images/default/sizer/sw-handle-dark.gif +0 -0
  298. data/public/ext-3.0.0/resources/images/default/sizer/sw-handle.gif +0 -0
  299. data/public/ext-3.0.0/resources/images/default/slider/slider-bg.png +0 -0
  300. data/public/ext-3.0.0/resources/images/default/slider/slider-thumb.png +0 -0
  301. data/public/ext-3.0.0/resources/images/default/slider/slider-v-bg.png +0 -0
  302. data/public/ext-3.0.0/resources/images/default/slider/slider-v-thumb.png +0 -0
  303. data/public/ext-3.0.0/resources/images/default/tabs/scroll-left.gif +0 -0
  304. data/public/ext-3.0.0/resources/images/default/tabs/scroll-right.gif +0 -0
  305. data/public/ext-3.0.0/resources/images/default/tabs/scroller-bg.gif +0 -0
  306. data/public/ext-3.0.0/resources/images/default/tabs/tab-btm-inactive-left-bg.gif +0 -0
  307. data/public/ext-3.0.0/resources/images/default/tabs/tab-btm-inactive-right-bg.gif +0 -0
  308. data/public/ext-3.0.0/resources/images/default/tabs/tab-btm-left-bg.gif +0 -0
  309. data/public/ext-3.0.0/resources/images/default/tabs/tab-btm-right-bg.gif +0 -0
  310. data/public/ext-3.0.0/resources/images/default/tabs/tab-close.gif +0 -0
  311. data/public/ext-3.0.0/resources/images/default/tabs/tab-strip-bg.gif +0 -0
  312. data/public/ext-3.0.0/resources/images/default/tabs/tab-strip-bg.png +0 -0
  313. data/public/ext-3.0.0/resources/images/default/tabs/tab-strip-btm-bg.gif +0 -0
  314. data/public/ext-3.0.0/resources/images/default/tabs/tabs-sprite.gif +0 -0
  315. data/public/ext-3.0.0/resources/images/default/toolbar/bg.gif +0 -0
  316. data/public/ext-3.0.0/resources/images/default/toolbar/btn-arrow-light.gif +0 -0
  317. data/public/ext-3.0.0/resources/images/default/toolbar/btn-arrow.gif +0 -0
  318. data/public/ext-3.0.0/resources/images/default/toolbar/btn-over-bg.gif +0 -0
  319. data/public/ext-3.0.0/resources/images/default/toolbar/gray-bg.gif +0 -0
  320. data/public/ext-3.0.0/resources/images/default/toolbar/more.gif +0 -0
  321. data/public/ext-3.0.0/resources/images/default/toolbar/tb-bg.gif +0 -0
  322. data/public/ext-3.0.0/resources/images/default/toolbar/tb-btn-sprite.gif +0 -0
  323. data/public/ext-3.0.0/resources/images/default/toolbar/tb-xl-btn-sprite.gif +0 -0
  324. data/public/ext-3.0.0/resources/images/default/toolbar/tb-xl-sep.gif +0 -0
  325. data/public/ext-3.0.0/resources/images/default/tree/arrows.gif +0 -0
  326. data/public/ext-3.0.0/resources/images/default/tree/drop-add.gif +0 -0
  327. data/public/ext-3.0.0/resources/images/default/tree/drop-between.gif +0 -0
  328. data/public/ext-3.0.0/resources/images/default/tree/drop-no.gif +0 -0
  329. data/public/ext-3.0.0/resources/images/default/tree/drop-over.gif +0 -0
  330. data/public/ext-3.0.0/resources/images/default/tree/drop-under.gif +0 -0
  331. data/public/ext-3.0.0/resources/images/default/tree/drop-yes.gif +0 -0
  332. data/public/ext-3.0.0/resources/images/default/tree/elbow-end-minus-nl.gif +0 -0
  333. data/public/ext-3.0.0/resources/images/default/tree/elbow-end-minus.gif +0 -0
  334. data/public/ext-3.0.0/resources/images/default/tree/elbow-end-plus-nl.gif +0 -0
  335. data/public/ext-3.0.0/resources/images/default/tree/elbow-end-plus.gif +0 -0
  336. data/public/ext-3.0.0/resources/images/default/tree/elbow-end.gif +0 -0
  337. data/public/ext-3.0.0/resources/images/default/tree/elbow-line.gif +0 -0
  338. data/public/ext-3.0.0/resources/images/default/tree/elbow-minus-nl.gif +0 -0
  339. data/public/ext-3.0.0/resources/images/default/tree/elbow-minus.gif +0 -0
  340. data/public/ext-3.0.0/resources/images/default/tree/elbow-plus-nl.gif +0 -0
  341. data/public/ext-3.0.0/resources/images/default/tree/elbow-plus.gif +0 -0
  342. data/public/ext-3.0.0/resources/images/default/tree/elbow.gif +0 -0
  343. data/public/ext-3.0.0/resources/images/default/tree/folder-open.gif +0 -0
  344. data/public/ext-3.0.0/resources/images/default/tree/folder.gif +0 -0
  345. data/public/ext-3.0.0/resources/images/default/tree/leaf.gif +0 -0
  346. data/public/ext-3.0.0/resources/images/default/tree/loading.gif +0 -0
  347. data/public/ext-3.0.0/resources/images/default/tree/s.gif +0 -0
  348. data/public/ext-3.0.0/resources/images/default/window/icon-error.gif +0 -0
  349. data/public/ext-3.0.0/resources/images/default/window/icon-info.gif +0 -0
  350. data/public/ext-3.0.0/resources/images/default/window/icon-question.gif +0 -0
  351. data/public/ext-3.0.0/resources/images/default/window/icon-warning.gif +0 -0
  352. data/public/ext-3.0.0/resources/images/default/window/left-corners.png +0 -0
  353. data/public/ext-3.0.0/resources/images/default/window/left-corners.psd +0 -0
  354. data/public/ext-3.0.0/resources/images/default/window/left-right.png +0 -0
  355. data/public/ext-3.0.0/resources/images/default/window/left-right.psd +0 -0
  356. data/public/ext-3.0.0/resources/images/default/window/right-corners.png +0 -0
  357. data/public/ext-3.0.0/resources/images/default/window/right-corners.psd +0 -0
  358. data/public/ext-3.0.0/resources/images/default/window/top-bottom.png +0 -0
  359. data/public/ext-3.0.0/resources/images/default/window/top-bottom.psd +0 -0
  360. data/public/ext-3.0.0/resources/images/icon/chart.gif +0 -0
  361. data/public/ext-3.0.0/src/adapter/core/ext-base-ajax.js +371 -0
  362. data/public/ext-3.0.0/src/adapter/core/ext-base-anim-extra.js +301 -0
  363. data/public/ext-3.0.0/src/adapter/core/ext-base-anim.js +477 -0
  364. data/public/ext-3.0.0/src/adapter/core/ext-base-begin.js +18 -0
  365. data/public/ext-3.0.0/src/adapter/core/ext-base-dom.js +157 -0
  366. data/public/ext-3.0.0/src/adapter/core/ext-base-end.js +21 -0
  367. data/public/ext-3.0.0/src/adapter/core/ext-base-event.js +453 -0
  368. data/public/ext-3.0.0/src/adapter/core/ext-base-point.js +17 -0
  369. data/public/ext-3.0.0/src/adapter/core/ext-base-region.js +81 -0
  370. data/public/ext-3.0.0/src/adapter/ext-base-dom-more.js +9 -0
  371. data/public/ext-3.0.0/src/adapter/jquery-bridge.js +546 -0
  372. data/public/ext-3.0.0/src/adapter/prototype-bridge.js +600 -0
  373. data/public/ext-3.0.0/src/adapter/yui-bridge.js +390 -0
  374. data/public/ext-3.0.0/src/core/CompositeElement.js +136 -0
  375. data/public/ext-3.0.0/src/core/CompositeElementLite-more.js +102 -0
  376. data/public/ext-3.0.0/src/core/DomHelper-more.js +179 -0
  377. data/public/ext-3.0.0/src/core/Element-more.js +192 -0
  378. data/public/ext-3.0.0/src/core/Element.alignment.js +370 -0
  379. data/public/ext-3.0.0/src/core/Element.dd.js +46 -0
  380. data/public/ext-3.0.0/src/core/Element.fx-more.js +152 -0
  381. data/public/ext-3.0.0/src/core/Element.insertion-more.js +52 -0
  382. data/public/ext-3.0.0/src/core/Element.keys.js +48 -0
  383. data/public/ext-3.0.0/src/core/Element.legacy.js +42 -0
  384. data/public/ext-3.0.0/src/core/Element.position-more.js +165 -0
  385. data/public/ext-3.0.0/src/core/Element.scroll-more.js +110 -0
  386. data/public/ext-3.0.0/src/core/Element.style-more.js +318 -0
  387. data/public/ext-3.0.0/src/core/Error.js +81 -0
  388. data/public/ext-3.0.0/src/core/EventManager-more.js +334 -0
  389. data/public/ext-3.0.0/src/core/Ext-more.js +669 -0
  390. data/public/ext-3.0.0/src/core/Template-more.js +115 -0
  391. data/public/ext-3.0.0/src/core/core/CompositeElementLite.js +197 -0
  392. data/public/ext-3.0.0/src/core/core/DomHelper.js +378 -0
  393. data/public/ext-3.0.0/src/core/core/DomQuery.js +826 -0
  394. data/public/ext-3.0.0/src/core/core/Element.fx.js +324 -0
  395. data/public/ext-3.0.0/src/core/core/Element.insertion.js +147 -0
  396. data/public/ext-3.0.0/src/core/core/Element.js +945 -0
  397. data/public/ext-3.0.0/src/core/core/Element.position.js +303 -0
  398. data/public/ext-3.0.0/src/core/core/Element.scroll.js +58 -0
  399. data/public/ext-3.0.0/src/core/core/Element.style.js +439 -0
  400. data/public/ext-3.0.0/src/core/core/Element.traversal.js +176 -0
  401. data/public/ext-3.0.0/src/core/core/EventManager.js +623 -0
  402. data/public/ext-3.0.0/src/core/core/Ext.js +922 -0
  403. data/public/ext-3.0.0/src/core/core/Fx.js +1115 -0
  404. data/public/ext-3.0.0/src/core/core/Template.js +185 -0
  405. data/public/ext-3.0.0/src/data/Api.js +210 -0
  406. data/public/ext-3.0.0/src/data/ArrayReader.js +102 -0
  407. data/public/ext-3.0.0/src/data/ArrayStore.js +70 -0
  408. data/public/ext-3.0.0/src/data/DataField.js +249 -0
  409. data/public/ext-3.0.0/src/data/DataProxy.js +427 -0
  410. data/public/ext-3.0.0/src/data/DataReader.js +160 -0
  411. data/public/ext-3.0.0/src/data/DataWriter.js +201 -0
  412. data/public/ext-3.0.0/src/data/DirectProxy.js +141 -0
  413. data/public/ext-3.0.0/src/data/DirectStore.js +52 -0
  414. data/public/ext-3.0.0/src/data/GroupingStore.js +139 -0
  415. data/public/ext-3.0.0/src/data/HttpProxy.js +276 -0
  416. data/public/ext-3.0.0/src/data/JsonReader.js +311 -0
  417. data/public/ext-3.0.0/src/data/JsonStore.js +49 -0
  418. data/public/ext-3.0.0/src/data/JsonWriter.js +77 -0
  419. data/public/ext-3.0.0/src/data/MemoryProxy.js +69 -0
  420. data/public/ext-3.0.0/src/data/Record.js +400 -0
  421. data/public/ext-3.0.0/src/data/ScriptTagProxy.js +279 -0
  422. data/public/ext-3.0.0/src/data/SortTypes.js +91 -0
  423. data/public/ext-3.0.0/src/data/Store.js +1492 -0
  424. data/public/ext-3.0.0/src/data/StoreMgr.js +72 -0
  425. data/public/ext-3.0.0/src/data/Tree.js +785 -0
  426. data/public/ext-3.0.0/src/data/XmlReader.js +128 -0
  427. data/public/ext-3.0.0/src/data/XmlStore.js +75 -0
  428. data/public/ext-3.0.0/src/data/XmlWriter.js +45 -0
  429. data/public/ext-3.0.0/src/data/core/Connection.js +575 -0
  430. data/public/ext-3.0.0/src/dd/DDCore.js +2992 -0
  431. data/public/ext-3.0.0/src/dd/DragSource.js +365 -0
  432. data/public/ext-3.0.0/src/dd/DragTracker.js +217 -0
  433. data/public/ext-3.0.0/src/dd/DragZone.js +133 -0
  434. data/public/ext-3.0.0/src/dd/DropTarget.js +115 -0
  435. data/public/ext-3.0.0/src/dd/DropZone.js +262 -0
  436. data/public/ext-3.0.0/src/dd/Registry.js +127 -0
  437. data/public/ext-3.0.0/src/dd/ScrollManager.js +201 -0
  438. data/public/ext-3.0.0/src/dd/StatusProxy.js +171 -0
  439. data/public/ext-3.0.0/src/debug.js +906 -0
  440. data/public/ext-3.0.0/src/direct/Direct.js +235 -0
  441. data/public/ext-3.0.0/src/direct/Event.js +34 -0
  442. data/public/ext-3.0.0/src/direct/JsonProvider.js +45 -0
  443. data/public/ext-3.0.0/src/direct/PollingProvider.js +151 -0
  444. data/public/ext-3.0.0/src/direct/Provider.js +110 -0
  445. data/public/ext-3.0.0/src/direct/RemotingProvider.js +373 -0
  446. data/public/ext-3.0.0/src/direct/Transaction.js +32 -0
  447. data/public/ext-3.0.0/src/locale/ext-lang-af.js +184 -0
  448. data/public/ext-3.0.0/src/locale/ext-lang-bg.js +278 -0
  449. data/public/ext-3.0.0/src/locale/ext-lang-ca.js +315 -0
  450. data/public/ext-3.0.0/src/locale/ext-lang-cs.js +293 -0
  451. data/public/ext-3.0.0/src/locale/ext-lang-da.js +296 -0
  452. data/public/ext-3.0.0/src/locale/ext-lang-de.js +326 -0
  453. data/public/ext-3.0.0/src/locale/ext-lang-el_GR.js +309 -0
  454. data/public/ext-3.0.0/src/locale/ext-lang-en.js +335 -0
  455. data/public/ext-3.0.0/src/locale/ext-lang-en_GB.js +315 -0
  456. data/public/ext-3.0.0/src/locale/ext-lang-es.js +318 -0
  457. data/public/ext-3.0.0/src/locale/ext-lang-fa.js +272 -0
  458. data/public/ext-3.0.0/src/locale/ext-lang-fi.js +302 -0
  459. data/public/ext-3.0.0/src/locale/ext-lang-fr.js +335 -0
  460. data/public/ext-3.0.0/src/locale/ext-lang-fr_CA.js +218 -0
  461. data/public/ext-3.0.0/src/locale/ext-lang-gr.js +175 -0
  462. data/public/ext-3.0.0/src/locale/ext-lang-he.js +292 -0
  463. data/public/ext-3.0.0/src/locale/ext-lang-hr.js +295 -0
  464. data/public/ext-3.0.0/src/locale/ext-lang-hu.js +296 -0
  465. data/public/ext-3.0.0/src/locale/ext-lang-id.js +302 -0
  466. data/public/ext-3.0.0/src/locale/ext-lang-it.js +295 -0
  467. data/public/ext-3.0.0/src/locale/ext-lang-ja.js +318 -0
  468. data/public/ext-3.0.0/src/locale/ext-lang-ko.js +267 -0
  469. data/public/ext-3.0.0/src/locale/ext-lang-lt.js +333 -0
  470. data/public/ext-3.0.0/src/locale/ext-lang-lv.js +176 -0
  471. data/public/ext-3.0.0/src/locale/ext-lang-mk.js +176 -0
  472. data/public/ext-3.0.0/src/locale/ext-lang-nl.js +323 -0
  473. data/public/ext-3.0.0/src/locale/ext-lang-no_NB.js +294 -0
  474. data/public/ext-3.0.0/src/locale/ext-lang-no_NN.js +294 -0
  475. data/public/ext-3.0.0/src/locale/ext-lang-pl.js +304 -0
  476. data/public/ext-3.0.0/src/locale/ext-lang-pt.js +260 -0
  477. data/public/ext-3.0.0/src/locale/ext-lang-pt_BR.js +302 -0
  478. data/public/ext-3.0.0/src/locale/ext-lang-pt_PT.js +298 -0
  479. data/public/ext-3.0.0/src/locale/ext-lang-ro.js +295 -0
  480. data/public/ext-3.0.0/src/locale/ext-lang-ru.js +319 -0
  481. data/public/ext-3.0.0/src/locale/ext-lang-sk.js +182 -0
  482. data/public/ext-3.0.0/src/locale/ext-lang-sl.js +176 -0
  483. data/public/ext-3.0.0/src/locale/ext-lang-sr.js +179 -0
  484. data/public/ext-3.0.0/src/locale/ext-lang-sr_RS.js +178 -0
  485. data/public/ext-3.0.0/src/locale/ext-lang-sv_SE.js +178 -0
  486. data/public/ext-3.0.0/src/locale/ext-lang-th.js +294 -0
  487. data/public/ext-3.0.0/src/locale/ext-lang-tr.js +306 -0
  488. data/public/ext-3.0.0/src/locale/ext-lang-ukr.js +258 -0
  489. data/public/ext-3.0.0/src/locale/ext-lang-vn.js +181 -0
  490. data/public/ext-3.0.0/src/locale/ext-lang-zh_CN.js +174 -0
  491. data/public/ext-3.0.0/src/locale/ext-lang-zh_TW.js +178 -0
  492. data/public/ext-3.0.0/src/state/CookieProvider.js +91 -0
  493. data/public/ext-3.0.0/src/state/Provider.js +127 -0
  494. data/public/ext-3.0.0/src/state/StateManager.js +69 -0
  495. data/public/ext-3.0.0/src/util/CSS.js +161 -0
  496. data/public/ext-3.0.0/src/util/ClickRepeater.js +200 -0
  497. data/public/ext-3.0.0/src/util/Cookies.js +96 -0
  498. data/public/ext-3.0.0/src/util/Date.js +1317 -0
  499. data/public/ext-3.0.0/src/util/Format.js +356 -0
  500. data/public/ext-3.0.0/src/util/History.js +203 -0
  501. data/public/ext-3.0.0/src/util/KeyMap.js +242 -0
  502. data/public/ext-3.0.0/src/util/KeyNav.js +161 -0
  503. data/public/ext-3.0.0/src/util/MixedCollection.js +576 -0
  504. data/public/ext-3.0.0/src/util/Observable-more.js +178 -0
  505. data/public/ext-3.0.0/src/util/TextMetrics.js +131 -0
  506. data/public/ext-3.0.0/src/util/UpdateManager.js +536 -0
  507. data/public/ext-3.0.0/src/util/XTemplate.js +379 -0
  508. data/public/ext-3.0.0/src/util/core/DelayedTask.js +68 -0
  509. data/public/ext-3.0.0/src/util/core/JSON.js +174 -0
  510. data/public/ext-3.0.0/src/util/core/Observable.js +483 -0
  511. data/public/ext-3.0.0/src/util/core/TaskMgr.js +174 -0
  512. data/public/ext-3.0.0/src/widgets/Action.js +252 -0
  513. data/public/ext-3.0.0/src/widgets/BoxComponent.js +519 -0
  514. data/public/ext-3.0.0/src/widgets/Button.js +762 -0
  515. data/public/ext-3.0.0/src/widgets/ButtonGroup.js +103 -0
  516. data/public/ext-3.0.0/src/widgets/ColorPalette.js +148 -0
  517. data/public/ext-3.0.0/src/widgets/Component.js +1540 -0
  518. data/public/ext-3.0.0/src/widgets/ComponentMgr.js +159 -0
  519. data/public/ext-3.0.0/src/widgets/Container.js +894 -0
  520. data/public/ext-3.0.0/src/widgets/CycleButton.js +188 -0
  521. data/public/ext-3.0.0/src/widgets/DataView.js +749 -0
  522. data/public/ext-3.0.0/src/widgets/DatePicker.js +771 -0
  523. data/public/ext-3.0.0/src/widgets/Editor.js +385 -0
  524. data/public/ext-3.0.0/src/widgets/Layer.js +466 -0
  525. data/public/ext-3.0.0/src/widgets/LoadMask.js +123 -0
  526. data/public/ext-3.0.0/src/widgets/MessageBox.js +626 -0
  527. data/public/ext-3.0.0/src/widgets/PagingToolbar.js +502 -0
  528. data/public/ext-3.0.0/src/widgets/Panel.js +1772 -0
  529. data/public/ext-3.0.0/src/widgets/PanelDD.js +154 -0
  530. data/public/ext-3.0.0/src/widgets/ProgressBar.js +289 -0
  531. data/public/ext-3.0.0/src/widgets/Resizable.js +760 -0
  532. data/public/ext-3.0.0/src/widgets/Shadow.js +192 -0
  533. data/public/ext-3.0.0/src/widgets/Slider.js +426 -0
  534. data/public/ext-3.0.0/src/widgets/SplitBar.js +436 -0
  535. data/public/ext-3.0.0/src/widgets/SplitButton.js +124 -0
  536. data/public/ext-3.0.0/src/widgets/TabPanel.js +1100 -0
  537. data/public/ext-3.0.0/src/widgets/Toolbar.js +781 -0
  538. data/public/ext-3.0.0/src/widgets/Viewport.js +124 -0
  539. data/public/ext-3.0.0/src/widgets/Window.js +941 -0
  540. data/public/ext-3.0.0/src/widgets/WindowManager.js +187 -0
  541. data/public/ext-3.0.0/src/widgets/chart/Chart.js +721 -0
  542. data/public/ext-3.0.0/src/widgets/chart/EventProxy.js +20 -0
  543. data/public/ext-3.0.0/src/widgets/chart/FlashComponent.js +117 -0
  544. data/public/ext-3.0.0/src/widgets/chart/swfobject.js +783 -0
  545. data/public/ext-3.0.0/src/widgets/form/Action.js +626 -0
  546. data/public/ext-3.0.0/src/widgets/form/BasicForm.js +735 -0
  547. data/public/ext-3.0.0/src/widgets/form/Checkbox.js +177 -0
  548. data/public/ext-3.0.0/src/widgets/form/CheckboxGroup.js +419 -0
  549. data/public/ext-3.0.0/src/widgets/form/Combo.js +1232 -0
  550. data/public/ext-3.0.0/src/widgets/form/DateField.js +389 -0
  551. data/public/ext-3.0.0/src/widgets/form/DisplayField.js +98 -0
  552. data/public/ext-3.0.0/src/widgets/form/Field.js +640 -0
  553. data/public/ext-3.0.0/src/widgets/form/FieldSet.js +305 -0
  554. data/public/ext-3.0.0/src/widgets/form/Form.js +335 -0
  555. data/public/ext-3.0.0/src/widgets/form/Hidden.js +39 -0
  556. data/public/ext-3.0.0/src/widgets/form/HtmlEditor.js +1179 -0
  557. data/public/ext-3.0.0/src/widgets/form/Label.js +64 -0
  558. data/public/ext-3.0.0/src/widgets/form/NumberField.js +139 -0
  559. data/public/ext-3.0.0/src/widgets/form/Radio.js +81 -0
  560. data/public/ext-3.0.0/src/widgets/form/RadioGroup.js +116 -0
  561. data/public/ext-3.0.0/src/widgets/form/TextArea.js +117 -0
  562. data/public/ext-3.0.0/src/widgets/form/TextField.js +491 -0
  563. data/public/ext-3.0.0/src/widgets/form/TimeField.js +146 -0
  564. data/public/ext-3.0.0/src/widgets/form/TriggerField.js +328 -0
  565. data/public/ext-3.0.0/src/widgets/form/VTypes.js +135 -0
  566. data/public/ext-3.0.0/src/widgets/grid/AbstractSelectionModel.js +57 -0
  567. data/public/ext-3.0.0/src/widgets/grid/CellSelectionModel.js +262 -0
  568. data/public/ext-3.0.0/src/widgets/grid/CheckboxSelectionModel.js +103 -0
  569. data/public/ext-3.0.0/src/widgets/grid/Column.js +406 -0
  570. data/public/ext-3.0.0/src/widgets/grid/ColumnDD.js +199 -0
  571. data/public/ext-3.0.0/src/widgets/grid/ColumnModel.js +592 -0
  572. data/public/ext-3.0.0/src/widgets/grid/ColumnSplitDD.js +62 -0
  573. data/public/ext-3.0.0/src/widgets/grid/EditorGrid.js +291 -0
  574. data/public/ext-3.0.0/src/widgets/grid/GridDD.js +95 -0
  575. data/public/ext-3.0.0/src/widgets/grid/GridEditor.js +21 -0
  576. data/public/ext-3.0.0/src/widgets/grid/GridPanel.js +952 -0
  577. data/public/ext-3.0.0/src/widgets/grid/GridView.js +1776 -0
  578. data/public/ext-3.0.0/src/widgets/grid/GroupingView.js +517 -0
  579. data/public/ext-3.0.0/src/widgets/grid/PropertyGrid.js +370 -0
  580. data/public/ext-3.0.0/src/widgets/grid/RowNumberer.js +61 -0
  581. data/public/ext-3.0.0/src/widgets/grid/RowSelectionModel.js +530 -0
  582. data/public/ext-3.0.0/src/widgets/layout/AbsoluteLayout.js +82 -0
  583. data/public/ext-3.0.0/src/widgets/layout/AccordionLayout.js +177 -0
  584. data/public/ext-3.0.0/src/widgets/layout/AnchorLayout.js +200 -0
  585. data/public/ext-3.0.0/src/widgets/layout/BorderLayout.js +1108 -0
  586. data/public/ext-3.0.0/src/widgets/layout/BoxLayout.js +417 -0
  587. data/public/ext-3.0.0/src/widgets/layout/CardLayout.js +127 -0
  588. data/public/ext-3.0.0/src/widgets/layout/ColumnLayout.js +130 -0
  589. data/public/ext-3.0.0/src/widgets/layout/ContainerLayout.js +215 -0
  590. data/public/ext-3.0.0/src/widgets/layout/FitLayout.js +48 -0
  591. data/public/ext-3.0.0/src/widgets/layout/FormLayout.js +266 -0
  592. data/public/ext-3.0.0/src/widgets/layout/TableLayout.js +194 -0
  593. data/public/ext-3.0.0/src/widgets/list/ColumnResizer.js +123 -0
  594. data/public/ext-3.0.0/src/widgets/list/ListView.js +357 -0
  595. data/public/ext-3.0.0/src/widgets/list/Sorter.js +70 -0
  596. data/public/ext-3.0.0/src/widgets/menu/BaseItem.js +160 -0
  597. data/public/ext-3.0.0/src/widgets/menu/CheckItem.js +114 -0
  598. data/public/ext-3.0.0/src/widgets/menu/ColorMenu.js +72 -0
  599. data/public/ext-3.0.0/src/widgets/menu/DateMenu.js +90 -0
  600. data/public/ext-3.0.0/src/widgets/menu/Item.js +211 -0
  601. data/public/ext-3.0.0/src/widgets/menu/Menu.js +733 -0
  602. data/public/ext-3.0.0/src/widgets/menu/MenuMgr.js +211 -0
  603. data/public/ext-3.0.0/src/widgets/menu/Separator.js +46 -0
  604. data/public/ext-3.0.0/src/widgets/menu/TextItem.js +46 -0
  605. data/public/ext-3.0.0/src/widgets/tips/QuickTip.js +207 -0
  606. data/public/ext-3.0.0/src/widgets/tips/QuickTips.js +159 -0
  607. data/public/ext-3.0.0/src/widgets/tips/Tip.js +157 -0
  608. data/public/ext-3.0.0/src/widgets/tips/ToolTip.js +492 -0
  609. data/public/ext-3.0.0/src/widgets/tree/AsyncTreeNode.js +114 -0
  610. data/public/ext-3.0.0/src/widgets/tree/TreeDragZone.js +82 -0
  611. data/public/ext-3.0.0/src/widgets/tree/TreeDropZone.js +321 -0
  612. data/public/ext-3.0.0/src/widgets/tree/TreeEditor.js +160 -0
  613. data/public/ext-3.0.0/src/widgets/tree/TreeEventModel.js +169 -0
  614. data/public/ext-3.0.0/src/widgets/tree/TreeFilter.js +114 -0
  615. data/public/ext-3.0.0/src/widgets/tree/TreeLoader.js +342 -0
  616. data/public/ext-3.0.0/src/widgets/tree/TreeNode.js +546 -0
  617. data/public/ext-3.0.0/src/widgets/tree/TreeNodeUI.js +633 -0
  618. data/public/ext-3.0.0/src/widgets/tree/TreePanel.js +918 -0
  619. data/public/ext-3.0.0/src/widgets/tree/TreeSelectionModel.js +315 -0
  620. data/public/ext-3.0.0/src/widgets/tree/TreeSorter.js +106 -0
  621. data/public/js/ext-portal.js +235 -0
  622. data/public/js/global.js +7 -0
  623. data/public/js/outerframe.js +47 -0
  624. data/public/js/portal.js +713 -0
  625. data/public/js/test_chart.js +152 -0
  626. data/test/config.rb +62 -0
  627. data/test/config/hosts.yaml +5 -0
  628. data/test/config/log.yaml +1 -0
  629. data/test/config/memcache.yaml +5 -0
  630. data/test/exception.rb +39 -0
  631. data/test/method_missing.rb +14 -0
  632. data/test/module.rb +39 -0
  633. data/test/remote_lmp.rb +126 -0
  634. data/test/sinatra.rb +29 -0
  635. data/test/sinatra_base.rb +16 -0
  636. metadata +690 -0
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Ext JS Library 3.0.0
3
+ * Copyright(c) 2006-2009 Ext JS, LLC
4
+ * licensing@extjs.com
5
+ * http://www.extjs.com/license
6
+ */
7
+ Ext.layout.MenuLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,setContainer:function(a){this.monitorResize=!a.floating;Ext.layout.MenuLayout.superclass.setContainer.call(this,a)},renderItem:function(f,b,e){if(!this.itemTpl){this.itemTpl=Ext.layout.MenuLayout.prototype.itemTpl=new Ext.XTemplate('<li id="{itemId}" class="{itemCls}">','<tpl if="needsIcon">','<img src="{icon}" class="{iconCls}"/>',"</tpl>","</li>")}if(f&&!f.rendered){if(Ext.isNumber(b)){b=e.dom.childNodes[b]}var d=this.getItemArgs(f);f.render(f.positionEl=b?this.itemTpl.insertBefore(b,d,true):this.itemTpl.append(e,d,true));f.positionEl.menuItemId=f.itemId||f.id;if(!d.isMenuItem&&d.needsIcon){f.positionEl.addClass("x-menu-list-item-indent")}}else{if(f&&!this.isValidParent(f,e)){if(Ext.isNumber(b)){b=e.dom.childNodes[b]}e.dom.insertBefore(f.getActionEl().dom,b||null)}}},getItemArgs:function(b){var a=b instanceof Ext.menu.Item;return{isMenuItem:a,needsIcon:!a&&(b.icon||b.iconCls),icon:b.icon||Ext.BLANK_IMAGE_URL,iconCls:"x-menu-item-icon "+(b.iconCls||""),itemId:"x-menu-el-"+b.id,itemCls:"x-menu-list-item "+(this.extraCls||"")}},isValidParent:function(b,a){return b.el.up("li.x-menu-list-item",5).dom.parentNode===(a.dom||a)},onLayout:function(a,b){this.renderAll(a,b);this.doAutoSize()},doAutoSize:function(){var c=this.container,a=c.width;if(c.floating){if(a){c.setWidth(a)}else{if(Ext.isIE){c.setWidth(Ext.isStrict&&(Ext.isIE7||Ext.isIE8)?"auto":c.minWidth);var d=c.getEl(),b=d.dom.offsetWidth;c.setWidth(c.getLayoutTarget().getWidth()+d.getFrameWidth("lr"))}}}}});Ext.Container.LAYOUTS.menu=Ext.layout.MenuLayout;Ext.menu.Menu=Ext.extend(Ext.Container,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,ignoreParentClicks:false,enableScrolling:true,maxHeight:null,scrollIncrement:24,showSeparator:true,defaultOffsets:[0,0],floating:true,hidden:true,layout:"menu",hideMode:"offsets",scrollerHeight:8,autoLayout:true,defaultType:"menuitem",initComponent:function(){if(Ext.isArray(this.initialConfig)){Ext.apply(this,{items:this.initialConfig})}this.addEvents("click","mouseover","mouseout","itemclick");Ext.menu.MenuMgr.register(this);if(this.floating){Ext.EventManager.onWindowResize(this.hide,this)}else{if(this.initialConfig.hidden!==false){this.hidden=false}this.internalDefaults={hideOnClick:false}}Ext.menu.Menu.superclass.initComponent.call(this);if(this.autoLayout){this.on({add:this.doLayout,remove:this.doLayout,scope:this})}},getLayoutTarget:function(){return this.ul},onRender:function(b,a){if(!b){b=Ext.getBody()}var c={id:this.getId(),cls:"x-menu "+((this.floating)?"x-menu-floating x-layer ":"")+(this.cls||"")+(this.plain?" x-menu-plain":"")+(this.showSeparator?"":" x-menu-nosep"),style:this.style,cn:[{tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"},{tag:"ul",cls:"x-menu-list"}]};if(this.floating){this.el=new Ext.Layer({shadow:this.shadow,dh:c,constrain:false,parentEl:b,zindex:15000})}else{this.el=b.createChild(c)}Ext.menu.Menu.superclass.onRender.call(this,b,a);if(!this.keyNav){this.keyNav=new Ext.menu.MenuNav(this)}this.focusEl=this.el.child("a.x-menu-focus");this.ul=this.el.child("ul.x-menu-list");this.mon(this.ul,{scope:this,click:this.onClick,mouseover:this.onMouseOver,mouseout:this.onMouseOut});if(this.enableScrolling){this.mon(this.el,{scope:this,delegate:".x-menu-scroller",click:this.onScroll,mouseover:this.deactivateActive})}},findTargetItem:function(b){var a=b.getTarget(".x-menu-list-item",this.ul,true);if(a&&a.menuItemId){return this.items.get(a.menuItemId)}},onClick:function(b){var a=this.findTargetItem(b);if(a){if(a.isFormField){this.setActiveItem(a)}else{if(a.menu&&this.ignoreParentClicks){a.expandMenu();b.preventDefault()}else{if(a.onClick){a.onClick(b);this.fireEvent("click",this,a,b)}}}}},setActiveItem:function(a,b){if(a!=this.activeItem){this.deactivateActive();if((this.activeItem=a).isFormField){a.focus()}else{a.activate(b)}}else{if(b){a.expandMenu()}}},deactivateActive:function(){var b=this.activeItem;if(b){if(b.isFormField){if(b.collapse){b.collapse()}}else{b.deactivate()}delete this.activeItem}},tryActivate:function(f,e){var b=this.items;for(var c=f,a=b.length;c>=0&&c<a;c+=e){var d=b.get(c);if(!d.disabled&&(d.canActivate||d.isFormField)){this.setActiveItem(d,false);return d}}return false},onMouseOver:function(b){var a=this.findTargetItem(b);if(a){if(a.canActivate&&!a.disabled){this.setActiveItem(a,true)}}this.over=true;this.fireEvent("mouseover",this,b,a)},onMouseOut:function(b){var a=this.findTargetItem(b);if(a){if(a==this.activeItem&&a.shouldDeactivate&&a.shouldDeactivate(b)){this.activeItem.deactivate();delete this.activeItem}}this.over=false;this.fireEvent("mouseout",this,b,a)},onScroll:function(d,b){if(d){d.stopEvent()}var a=this.ul.dom,c=Ext.fly(b).is(".x-menu-scroller-top");a.scrollTop+=this.scrollIncrement*(c?-1:1);if(c?a.scrollTop<=0:a.scrollTop+this.activeMax>=a.scrollHeight){this.onScrollerOut(null,b)}},onScrollerIn:function(d,b){var a=this.ul.dom,c=Ext.fly(b).is(".x-menu-scroller-top");if(c?a.scrollTop>0:a.scrollTop+this.activeMax<a.scrollHeight){Ext.fly(b).addClass(["x-menu-item-active","x-menu-scroller-active"])}},onScrollerOut:function(b,a){Ext.fly(a).removeClass(["x-menu-item-active","x-menu-scroller-active"])},show:function(b,c,a){if(this.floating){this.parentMenu=a;if(!this.el){this.render();this.doLayout(false,true)}if(this.fireEvent("beforeshow",this)!==false){this.showAt(this.el.getAlignToXY(b,c||this.defaultAlign,this.defaultOffsets),a,false)}}else{Ext.menu.Menu.superclass.show.call(this)}},showAt:function(c,b,a){this.parentMenu=b;if(!this.el){this.render()}this.el.setXY(c);if(this.enableScrolling){this.constrainScroll(c[1])}this.el.show();Ext.menu.Menu.superclass.onShow.call(this);if(Ext.isIE){this.layout.doAutoSize();if(!Ext.isIE8){this.el.repaint()}}this.hidden=false;this.focus();this.fireEvent("show",this)},constrainScroll:function(c){var a,b=this.ul.setHeight("auto").getHeight();if(this.floating){a=this.maxHeight?this.maxHeight:Ext.fly(this.el.dom.parentNode).getViewSize().height-c}else{a=this.getHeight()}if(b>a&&a>0){this.activeMax=a-this.scrollerHeight*2-this.el.getFrameWidth("tb")-Ext.num(this.el.shadowOffset,0);this.ul.setHeight(this.activeMax);this.createScrollers();this.el.select(".x-menu-scroller").setDisplayed("")}else{this.ul.setHeight(b);this.el.select(".x-menu-scroller").setDisplayed("none")}this.ul.dom.scrollTop=0},createScrollers:function(){if(!this.scroller){this.scroller={pos:0,top:this.el.insertFirst({tag:"div",cls:"x-menu-scroller x-menu-scroller-top",html:"&#160;"}),bottom:this.el.createChild({tag:"div",cls:"x-menu-scroller x-menu-scroller-bottom",html:"&#160;"})};this.scroller.top.hover(this.onScrollerIn,this.onScrollerOut,this);this.scroller.topRepeater=new Ext.util.ClickRepeater(this.scroller.top,{listeners:{click:this.onScroll.createDelegate(this,[null,this.scroller.top],false)}});this.scroller.bottom.hover(this.onScrollerIn,this.onScrollerOut,this);this.scroller.bottomRepeater=new Ext.util.ClickRepeater(this.scroller.bottom,{listeners:{click:this.onScroll.createDelegate(this,[null,this.scroller.bottom],false)}})}},onLayout:function(){if(this.isVisible()){if(this.enableScrolling){this.constrainScroll(this.el.getTop())}if(this.floating){this.el.sync()}}},focus:function(){if(!this.hidden){this.doFocus.defer(50,this)}},doFocus:function(){if(!this.hidden){this.focusEl.focus()}},hide:function(a){this.deepHide=a;Ext.menu.Menu.superclass.hide.call(this);delete this.deepHide},onHide:function(){Ext.menu.Menu.superclass.onHide.call(this);this.deactivateActive();if(this.el&&this.floating){this.el.hide()}if(this.deepHide===true&&this.parentMenu){this.parentMenu.hide(true)}},lookupComponent:function(a){if(Ext.isString(a)){a=(a=="separator"||a=="-")?new Ext.menu.Separator():new Ext.menu.TextItem(a);this.applyDefaults(a)}else{if(Ext.isObject(a)){a=this.getMenuItem(a)}else{if(a.tagName||a.el){a=new Ext.BoxComponent({el:a})}}}return a},applyDefaults:function(b){if(!Ext.isString(b)){b=Ext.menu.Menu.superclass.applyDefaults.call(this,b);var a=this.internalDefaults;if(a){if(b.events){Ext.applyIf(b.initialConfig,a);Ext.apply(b,a)}else{Ext.applyIf(b,a)}}}return b},getMenuItem:function(a){if(!a.isXType){if(!a.xtype&&Ext.isBoolean(a.checked)){return new Ext.menu.CheckItem(a)}return Ext.create(a,this.defaultType)}return a},addSeparator:function(){return this.add(new Ext.menu.Separator())},addElement:function(a){return this.add(new Ext.menu.BaseItem(a))},addItem:function(a){return this.add(a)},addMenuItem:function(a){return this.add(this.getMenuItem(a))},addText:function(a){return this.add(new Ext.menu.TextItem(a))},onDestroy:function(){Ext.menu.Menu.superclass.onDestroy.call(this);Ext.menu.MenuMgr.unregister(this);Ext.EventManager.removeResizeListener(this.hide,this);if(this.keyNav){this.keyNav.disable()}var a=this.scroller;if(a){Ext.destroy(a.topRepeater,a.bottomRepeater,a.top,a.bottom)}}});Ext.reg("menu",Ext.menu.Menu);Ext.menu.MenuNav=Ext.extend(Ext.KeyNav,function(){function a(d,c){if(!c.tryActivate(c.items.indexOf(c.activeItem)-1,-1)){c.tryActivate(c.items.length-1,-1)}}function b(d,c){if(!c.tryActivate(c.items.indexOf(c.activeItem)+1,1)){c.tryActivate(0,1)}}return{constructor:function(c){Ext.menu.MenuNav.superclass.constructor.call(this,c.el);this.scope=this.menu=c},doRelay:function(f,d){var c=f.getKey();if(this.menu.activeItem&&this.menu.activeItem.isFormField&&c!=f.TAB){return false}if(!this.menu.activeItem&&f.isNavKeyPress()&&c!=f.SPACE&&c!=f.RETURN){this.menu.tryActivate(0,1);return false}return d.call(this.scope||this,f,this.menu)},tab:function(d,c){d.stopEvent();if(d.shiftKey){a(d,c)}else{b(d,c)}},up:a,down:b,right:function(d,c){if(c.activeItem){c.activeItem.expandMenu(true)}},left:function(d,c){c.hide();if(c.parentMenu&&c.parentMenu.activeItem){c.parentMenu.activeItem.activate()}},enter:function(d,c){if(c.activeItem){d.stopPropagation();c.activeItem.onClick(d);c.fireEvent("click",this,c.activeItem);return true}}}}());Ext.menu.MenuMgr=function(){var f,d,c={},a=false,k=new Date();function m(){f={};d=new Ext.util.MixedCollection();Ext.getDoc().addKeyListener(27,function(){if(d.length>0){h()}})}function h(){if(d&&d.length>0){var n=d.clone();n.each(function(o){o.hide()})}}function e(n){d.remove(n);if(d.length<1){Ext.getDoc().un("mousedown",l);a=false}}function j(n){var o=d.last();k=new Date();d.add(n);if(!a){Ext.getDoc().on("mousedown",l);a=true}if(n.parentMenu){n.getEl().setZIndex(parseInt(n.parentMenu.getEl().getStyle("z-index"),10)+3);n.parentMenu.activeChild=n}else{if(o&&o.isVisible()){n.getEl().setZIndex(parseInt(o.getEl().getStyle("z-index"),10)+3)}}}function b(n){if(n.activeChild){n.activeChild.hide()}if(n.autoHideTimer){clearTimeout(n.autoHideTimer);delete n.autoHideTimer}}function g(n){var o=n.parentMenu;if(!o&&!n.allowOtherMenus){h()}else{if(o&&o.activeChild){o.activeChild.hide()}}}function l(n){if(k.getElapsed()>50&&d.length>0&&!n.getTarget(".x-menu")){h()}}function i(o,r){if(r){var q=c[o.group];for(var p=0,n=q.length;p<n;p++){if(q[p]!=o){q[p].setChecked(false)}}}}return{hideAll:function(){h()},register:function(o){if(!f){m()}f[o.id]=o;o.on("beforehide",b);o.on("hide",e);o.on("beforeshow",g);o.on("show",j);var n=o.group;if(n&&o.events.checkchange){if(!c[n]){c[n]=[]}c[n].push(o);o.on("checkchange",onCheck)}},get:function(n){if(typeof n=="string"){if(!f){return null}return f[n]}else{if(n.events){return n}else{if(typeof n.length=="number"){return new Ext.menu.Menu({items:n})}else{return Ext.create(n,"menu")}}}},unregister:function(o){delete f[o.id];o.un("beforehide",b);o.un("hide",e);o.un("beforeshow",g);o.un("show",j);var n=o.group;if(n&&o.events.checkchange){c[n].remove(o);o.un("checkchange",onCheck)}},registerCheckable:function(n){var o=n.group;if(o){if(!c[o]){c[o]=[]}c[o].push(n);n.on("beforecheckchange",i)}},unregisterCheckable:function(n){var o=n.group;if(o){c[o].remove(n);n.un("beforecheckchange",i)}},getCheckedItem:function(p){var q=c[p];if(q){for(var o=0,n=q.length;o<n;o++){if(q[o].checked){return q[o]}}}return null},setCheckedItem:function(p,r){var q=c[p];if(q){for(var o=0,n=q.length;o<n;o++){if(q[o].id==r){q[o].setChecked(true)}}}return null}}}();Ext.menu.BaseItem=function(a){Ext.menu.BaseItem.superclass.constructor.call(this,a);this.addEvents("click","activate","deactivate");if(this.handler){this.on("click",this.handler,this.scope)}};Ext.extend(Ext.menu.BaseItem,Ext.Component,{canActivate:false,activeClass:"x-menu-item-active",hideOnClick:true,clickHideDelay:1,ctype:"Ext.menu.BaseItem",actionMode:"container",onRender:function(b,a){Ext.menu.BaseItem.superclass.onRender.apply(this,arguments);if(this.ownerCt&&this.ownerCt instanceof Ext.menu.Menu){this.parentMenu=this.ownerCt}else{this.container.addClass("x-menu-list-item");this.mon(this.el,"click",this.onClick,this);this.mon(this.el,"mouseenter",this.activate,this);this.mon(this.el,"mouseleave",this.deactivate,this)}},setHandler:function(b,a){if(this.handler){this.un("click",this.handler,this.scope)}this.on("click",this.handler=b,this.scope=a)},onClick:function(a){if(!this.disabled&&this.fireEvent("click",this,a)!==false&&(this.parentMenu&&this.parentMenu.fireEvent("itemclick",this,a)!==false)){this.handleClick(a)}else{a.stopEvent()}},activate:function(){if(this.disabled){return false}var a=this.container;a.addClass(this.activeClass);this.region=a.getRegion().adjust(2,2,-2,-2);this.fireEvent("activate",this);return true},deactivate:function(){this.container.removeClass(this.activeClass);this.fireEvent("deactivate",this)},shouldDeactivate:function(a){return !this.region||!this.region.contains(a.getPoint())},handleClick:function(a){if(this.hideOnClick){this.parentMenu.hide.defer(this.clickHideDelay,this.parentMenu,[true])}},expandMenu:Ext.emptyFn,hideMenu:Ext.emptyFn});Ext.reg("menubaseitem",Ext.menu.BaseItem);Ext.menu.TextItem=function(a){if(typeof a=="string"){a={text:a}}Ext.menu.TextItem.superclass.constructor.call(this,a)};Ext.extend(Ext.menu.TextItem,Ext.menu.BaseItem,{hideOnClick:false,itemCls:"x-menu-text",onRender:function(){var a=document.createElement("span");a.className=this.itemCls;a.innerHTML=this.text;this.el=a;Ext.menu.TextItem.superclass.onRender.apply(this,arguments)}});Ext.reg("menutextitem",Ext.menu.TextItem);Ext.menu.Separator=function(a){Ext.menu.Separator.superclass.constructor.call(this,a)};Ext.extend(Ext.menu.Separator,Ext.menu.BaseItem,{itemCls:"x-menu-sep",hideOnClick:false,activeClass:"",onRender:function(a){var b=document.createElement("span");b.className=this.itemCls;b.innerHTML="&#160;";this.el=b;a.addClass("x-menu-sep-li");Ext.menu.Separator.superclass.onRender.apply(this,arguments)}});Ext.reg("menuseparator",Ext.menu.Separator);Ext.menu.Item=function(a){Ext.menu.Item.superclass.constructor.call(this,a);if(this.menu){this.menu=Ext.menu.MenuMgr.get(this.menu)}};Ext.extend(Ext.menu.Item,Ext.menu.BaseItem,{itemCls:"x-menu-item",canActivate:true,showDelay:200,hideDelay:200,ctype:"Ext.menu.Item",onRender:function(d,b){if(!this.itemTpl){this.itemTpl=Ext.menu.Item.prototype.itemTpl=new Ext.XTemplate('<a id="{id}" class="{cls}" hidefocus="true" unselectable="on" href="{href}"','<tpl if="hrefTarget">',' target="{hrefTarget}"',"</tpl>",">",'<img src="{icon}" class="x-menu-item-icon {iconCls}"/>','<span class="x-menu-item-text">{text}</span>',"</a>")}var c=this.getTemplateArgs();this.el=b?this.itemTpl.insertBefore(b,c,true):this.itemTpl.append(d,c,true);this.iconEl=this.el.child("img.x-menu-item-icon");this.textEl=this.el.child(".x-menu-item-text");Ext.menu.Item.superclass.onRender.call(this,d,b)},getTemplateArgs:function(){return{id:this.id,cls:this.itemCls+(this.menu?" x-menu-item-arrow":"")+(this.cls?" "+this.cls:""),href:this.href||"#",hrefTarget:this.hrefTarget,icon:this.icon||Ext.BLANK_IMAGE_URL,iconCls:this.iconCls||"",text:this.itemText||this.text||"&#160;"}},setText:function(a){this.text=a||"&#160;";if(this.rendered){this.textEl.update(this.text);this.parentMenu.layout.doAutoSize()}},setIconClass:function(a){var b=this.iconCls;this.iconCls=a;if(this.rendered){this.iconEl.replaceClass(b,this.iconCls)}},beforeDestroy:function(){if(this.menu){this.menu.destroy()}Ext.menu.Item.superclass.beforeDestroy.call(this)},handleClick:function(a){if(!this.href){a.stopEvent()}Ext.menu.Item.superclass.handleClick.apply(this,arguments)},activate:function(a){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(a){this.expandMenu()}}return true},shouldDeactivate:function(a){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,a)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(a.getPoint())}return true}return false},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu()},expandMenu:function(a){if(!this.disabled&&this.menu){clearTimeout(this.hideTimer);delete this.hideTimer;if(!this.menu.isVisible()&&!this.showTimer){this.showTimer=this.deferExpand.defer(this.showDelay,this,[a])}else{if(this.menu.isVisible()&&a){this.menu.tryActivate(0,1)}}}},deferExpand:function(a){delete this.showTimer;this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);if(a){this.menu.tryActivate(0,1)}},hideMenu:function(){clearTimeout(this.showTimer);delete this.showTimer;if(!this.hideTimer&&this.menu&&this.menu.isVisible()){this.hideTimer=this.deferHide.defer(this.hideDelay,this)}},deferHide:function(){delete this.hideTimer;if(this.menu.over){this.parentMenu.setActiveItem(this,false)}else{this.menu.hide()}}});Ext.reg("menuitem",Ext.menu.Item);Ext.menu.CheckItem=function(a){Ext.menu.CheckItem.superclass.constructor.call(this,a);this.addEvents("beforecheckchange","checkchange");if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope)}Ext.menu.MenuMgr.registerCheckable(this)};Ext.extend(Ext.menu.CheckItem,Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",onRender:function(a){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass)}if(this.checked){this.checked=false;this.setChecked(true,true)}},destroy:function(){Ext.menu.MenuMgr.unregisterCheckable(this);Ext.menu.CheckItem.superclass.destroy.apply(this,arguments)},setChecked:function(b,a){if(this.checked!=b&&this.fireEvent("beforecheckchange",this,b)!==false){if(this.container){this.container[b?"addClass":"removeClass"]("x-menu-item-checked")}this.checked=b;if(a!==true){this.fireEvent("checkchange",this,b)}}},handleClick:function(a){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked)}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments)}});Ext.reg("menucheckitem",Ext.menu.CheckItem);Ext.menu.DateMenu=Ext.extend(Ext.menu.Menu,{enableScrolling:false,hideOnClick:true,cls:"x-date-menu",initComponent:function(){this.on("beforeshow",this.onBeforeShow,this);if(this.strict=(Ext.isIE7&&Ext.isStrict)){this.on("show",this.onShow,this,{single:true,delay:20})}Ext.apply(this,{plain:true,showSeparator:false,items:this.picker=new Ext.DatePicker(Ext.apply({internalRender:this.strict||!Ext.isIE,ctCls:"x-menu-date-item"},this.initialConfig))});this.picker.purgeListeners();Ext.menu.DateMenu.superclass.initComponent.call(this);this.relayEvents(this.picker,["select"]);this.on("select",this.menuHide,this);if(this.handler){this.on("select",this.handler,this.scope||this)}},menuHide:function(){if(this.hideOnClick){this.hide(true)}},onBeforeShow:function(){if(this.picker){this.picker.hideMonthPicker(true)}},onShow:function(){var a=this.picker.getEl();a.setWidth(a.getWidth())}});Ext.reg("datemenu",Ext.menu.DateMenu);Ext.menu.ColorMenu=Ext.extend(Ext.menu.Menu,{enableScrolling:false,hideOnClick:true,initComponent:function(){Ext.apply(this,{plain:true,showSeparator:false,items:this.palette=new Ext.ColorPalette(this.initialConfig)});this.palette.purgeListeners();Ext.menu.ColorMenu.superclass.initComponent.call(this);this.relayEvents(this.palette,["select"]);this.on("select",this.menuHide,this);if(this.handler){this.on("select",this.handler,this.scope||this)}},menuHide:function(){if(this.hideOnClick){this.hide(true)}}});Ext.reg("colormenu",Ext.menu.ColorMenu);
@@ -0,0 +1,1100 @@
1
+ /*!
2
+ * Ext JS Library 3.0.0
3
+ * Copyright(c) 2006-2009 Ext JS, LLC
4
+ * licensing@extjs.com
5
+ * http://www.extjs.com/license
6
+ */
7
+ /**
8
+ * @class Ext.TabPanel
9
+ * <p>A basic tab container. TabPanels can be used exactly like a standard {@link Ext.Panel}
10
+ * for layout purposes, but also have special support for containing child Components
11
+ * (<tt>{@link Ext.Container#items items}</tt>) that are managed using a
12
+ * {@link Ext.layout.CardLayout CardLayout layout manager}, and displayed as separate tabs.</p>
13
+ *
14
+ * <b>Note:</b> By default, a tab's close tool <i>destroys</i> the child tab Component
15
+ * and all its descendants. This makes the child tab Component, and all its descendants <b>unusable</b>. To enable
16
+ * re-use of a tab, configure the TabPanel with <b><code>{@link #autoDestroy autoDestroy: false}</code></b>.
17
+ *
18
+ * <p><b><u>TabPanel header/footer elements</u></b></p>
19
+ * <p>TabPanels use their {@link Ext.Panel#header header} or {@link Ext.Panel#footer footer} element
20
+ * (depending on the {@link #tabPosition} configuration) to accommodate the tab selector buttons.
21
+ * This means that a TabPanel will not display any configured title, and will not display any
22
+ * configured header {@link Ext.Panel#tools tools}.</p>
23
+ * <p>To display a header, embed the TabPanel in a {@link Ext.Panel Panel} which uses
24
+ * <b><tt>{@link Ext.Container#layout layout:'fit'}</tt></b>.</p>
25
+ *
26
+ * <p><b><u>Tab Events</u></b></p>
27
+ * <p>There is no actual tab class &mdash; each tab is simply a {@link Ext.BoxComponent Component}
28
+ * such as a {@link Ext.Panel Panel}. However, when rendered in a TabPanel, each child Component
29
+ * can fire additional events that only exist for tabs and are not available from other Components.
30
+ * These events are:</p>
31
+ * <div><ul class="mdetail-params">
32
+ * <li><tt><b>{@link Ext.Panel#activate activate}</b></tt> : Fires when this Component becomes
33
+ * the active tab.</li>
34
+ * <li><tt><b>{@link Ext.Panel#deactivate deactivate}</b></tt> : Fires when the Component that
35
+ * was the active tab becomes deactivated.</li>
36
+ * </ul></div>
37
+ * <p><b><u>Creating TabPanels from Code</u></b></p>
38
+ * <p>TabPanels can be created and rendered completely in code, as in this example:</p>
39
+ * <pre><code>
40
+ var tabs = new Ext.TabPanel({
41
+ renderTo: Ext.getBody(),
42
+ activeTab: 0,
43
+ items: [{
44
+ title: 'Tab 1',
45
+ html: 'A simple tab'
46
+ },{
47
+ title: 'Tab 2',
48
+ html: 'Another one'
49
+ }]
50
+ });
51
+ </code></pre>
52
+ * <p><b><u>Creating TabPanels from Existing Markup</u></b></p>
53
+ * <p>TabPanels can also be rendered from pre-existing markup in a couple of ways.</p>
54
+ * <div><ul class="mdetail-params">
55
+ *
56
+ * <li>Pre-Structured Markup</li>
57
+ * <div class="sub-desc">
58
+ * <p>A container div with one or more nested tab divs with class <tt>'x-tab'</tt> can be rendered entirely
59
+ * from existing markup (See the {@link #autoTabs} example).</p>
60
+ * </div>
61
+ *
62
+ * <li>Un-Structured Markup</li>
63
+ * <div class="sub-desc">
64
+ * <p>A TabPanel can also be rendered from markup that is not strictly structured by simply specifying by id
65
+ * which elements should be the container and the tabs. Using this method tab content can be pulled from different
66
+ * elements within the page by id regardless of page structure. For example:</p>
67
+ * <pre><code>
68
+ var tabs = new Ext.TabPanel({
69
+ renderTo: 'my-tabs',
70
+ activeTab: 0,
71
+ items:[
72
+ {contentEl:'tab1', title:'Tab 1'},
73
+ {contentEl:'tab2', title:'Tab 2'}
74
+ ]
75
+ });
76
+
77
+ // Note that the tabs do not have to be nested within the container (although they can be)
78
+ &lt;div id="my-tabs">&lt;/div>
79
+ &lt;div id="tab1" class="x-hide-display">A simple tab&lt;/div>
80
+ &lt;div id="tab2" class="x-hide-display">Another one&lt;/div>
81
+ </code></pre>
82
+ * Note that the tab divs in this example contain the class <tt>'x-hide-display'</tt> so that they can be rendered
83
+ * deferred without displaying outside the tabs. You could alternately set <tt>{@link #deferredRender} = false </tt>
84
+ * to render all content tabs on page load.
85
+ * </div>
86
+ *
87
+ * </ul></div>
88
+ *
89
+ * @extends Ext.Panel
90
+ * @constructor
91
+ * @param {Object} config The configuration options
92
+ * @xtype tabpanel
93
+ */
94
+ Ext.TabPanel = Ext.extend(Ext.Panel, {
95
+ /**
96
+ * @cfg {Boolean} layoutOnTabChange
97
+ * Set to true to force a layout of the active tab when the tab is changed. Defaults to false.
98
+ * See {@link Ext.layout.CardLayout}.<code>{@link Ext.layout.CardLayout#layoutOnCardChange layoutOnCardChange}</code>.
99
+ */
100
+ /**
101
+ * @cfg {String} tabCls <b>This config option is used on <u>child Components</u> of ths TabPanel.</b> A CSS
102
+ * class name applied to the tab strip item representing the child Component, allowing special
103
+ * styling to be applied.
104
+ */
105
+ /**
106
+ * @cfg {Boolean} monitorResize True to automatically monitor window resize events and rerender the layout on
107
+ * browser resize (defaults to true).
108
+ */
109
+ monitorResize : true,
110
+ /**
111
+ * @cfg {Boolean} deferredRender
112
+ * <p><tt>true</tt> by default to defer the rendering of child <tt>{@link Ext.Container#items items}</tt>
113
+ * to the browsers DOM until a tab is activated. <tt>false</tt> will render all contained
114
+ * <tt>{@link Ext.Container#items items}</tt> as soon as the {@link Ext.layout.CardLayout layout}
115
+ * is rendered. If there is a significant amount of content or a lot of heavy controls being
116
+ * rendered into panels that are not displayed by default, setting this to <tt>true</tt> might
117
+ * improve performance.</p>
118
+ * <br><p>The <tt>deferredRender</tt> property is internally passed to the layout manager for
119
+ * TabPanels ({@link Ext.layout.CardLayout}) as its {@link Ext.layout.CardLayout#deferredRender}
120
+ * configuration value.</p>
121
+ * <br><p><b>Note</b>: leaving <tt>deferredRender</tt> as <tt>true</tt> means that the content
122
+ * within an unactivated tab will not be available. For example, this means that if the TabPanel
123
+ * is within a {@link Ext.form.FormPanel form}, then until a tab is activated, any Fields within
124
+ * unactivated tabs will not be rendered, and will therefore not be submitted and will not be
125
+ * available to either {@link Ext.form.BasicForm#getValues getValues} or
126
+ * {@link Ext.form.BasicForm#setValues setValues}.</p>
127
+ */
128
+ deferredRender : true,
129
+ /**
130
+ * @cfg {Number} tabWidth The initial width in pixels of each new tab (defaults to 120).
131
+ */
132
+ tabWidth : 120,
133
+ /**
134
+ * @cfg {Number} minTabWidth The minimum width in pixels for each tab when {@link #resizeTabs} = true (defaults to 30).
135
+ */
136
+ minTabWidth : 30,
137
+ /**
138
+ * @cfg {Boolean} resizeTabs True to automatically resize each tab so that the tabs will completely fill the
139
+ * tab strip (defaults to false). Setting this to true may cause specific widths that might be set per tab to
140
+ * be overridden in order to fit them all into view (although {@link #minTabWidth} will always be honored).
141
+ */
142
+ resizeTabs : false,
143
+ /**
144
+ * @cfg {Boolean} enableTabScroll True to enable scrolling to tabs that may be invisible due to overflowing the
145
+ * overall TabPanel width. Only available with tabPosition:'top' (defaults to false).
146
+ */
147
+ enableTabScroll : false,
148
+ /**
149
+ * @cfg {Number} scrollIncrement The number of pixels to scroll each time a tab scroll button is pressed
150
+ * (defaults to <tt>100</tt>, or if <tt>{@link #resizeTabs} = true</tt>, the calculated tab width). Only
151
+ * applies when <tt>{@link #enableTabScroll} = true</tt>.
152
+ */
153
+ scrollIncrement : 0,
154
+ /**
155
+ * @cfg {Number} scrollRepeatInterval Number of milliseconds between each scroll while a tab scroll button is
156
+ * continuously pressed (defaults to <tt>400</tt>).
157
+ */
158
+ scrollRepeatInterval : 400,
159
+ /**
160
+ * @cfg {Float} scrollDuration The number of milliseconds that each scroll animation should last (defaults
161
+ * to <tt>.35</tt>). Only applies when <tt>{@link #animScroll} = true</tt>.
162
+ */
163
+ scrollDuration : 0.35,
164
+ /**
165
+ * @cfg {Boolean} animScroll True to animate tab scrolling so that hidden tabs slide smoothly into view (defaults
166
+ * to <tt>true</tt>). Only applies when <tt>{@link #enableTabScroll} = true</tt>.
167
+ */
168
+ animScroll : true,
169
+ /**
170
+ * @cfg {String} tabPosition The position where the tab strip should be rendered (defaults to <tt>'top'</tt>).
171
+ * The only other supported value is <tt>'bottom'</tt>. <b>Note</b>: tab scrolling is only supported for
172
+ * <tt>tabPosition: 'top'</tt>.
173
+ */
174
+ tabPosition : 'top',
175
+ /**
176
+ * @cfg {String} baseCls The base CSS class applied to the panel (defaults to <tt>'x-tab-panel'</tt>).
177
+ */
178
+ baseCls : 'x-tab-panel',
179
+ /**
180
+ * @cfg {Boolean} autoTabs
181
+ * <p><tt>true</tt> to query the DOM for any divs with a class of 'x-tab' to be automatically converted
182
+ * to tabs and added to this panel (defaults to <tt>false</tt>). Note that the query will be executed within
183
+ * the scope of the container element only (so that multiple tab panels from markup can be supported via this
184
+ * method).</p>
185
+ * <p>This method is only possible when the markup is structured correctly as a container with nested divs
186
+ * containing the class <tt>'x-tab'</tt>. To create TabPanels without these limitations, or to pull tab content
187
+ * from other elements on the page, see the example at the top of the class for generating tabs from markup.</p>
188
+ * <p>There are a couple of things to note when using this method:<ul>
189
+ * <li>When using the <tt>autoTabs</tt> config (as opposed to passing individual tab configs in the TabPanel's
190
+ * {@link #items} collection), you must use <tt>{@link #applyTo}</tt> to correctly use the specified <tt>id</tt>
191
+ * as the tab container. The <tt>autoTabs</tt> method <em>replaces</em> existing content with the TabPanel
192
+ * components.</li>
193
+ * <li>Make sure that you set <tt>{@link #deferredRender}: false</tt> so that the content elements for each
194
+ * tab will be rendered into the TabPanel immediately upon page load, otherwise they will not be transformed
195
+ * until each tab is activated and will be visible outside the TabPanel.</li>
196
+ * </ul>Example usage:</p>
197
+ * <pre><code>
198
+ var tabs = new Ext.TabPanel({
199
+ applyTo: 'my-tabs',
200
+ activeTab: 0,
201
+ deferredRender: false,
202
+ autoTabs: true
203
+ });
204
+
205
+ // This markup will be converted to a TabPanel from the code above
206
+ &lt;div id="my-tabs">
207
+ &lt;div class="x-tab" title="Tab 1">A simple tab&lt;/div>
208
+ &lt;div class="x-tab" title="Tab 2">Another one&lt;/div>
209
+ &lt;/div>
210
+ </code></pre>
211
+ */
212
+ autoTabs : false,
213
+ /**
214
+ * @cfg {String} autoTabSelector The CSS selector used to search for tabs in existing markup when
215
+ * <tt>{@link #autoTabs} = true</tt> (defaults to <tt>'div.x-tab'</tt>). This can be any valid selector
216
+ * supported by {@link Ext.DomQuery#select}. Note that the query will be executed within the scope of this
217
+ * tab panel only (so that multiple tab panels from markup can be supported on a page).
218
+ */
219
+ autoTabSelector : 'div.x-tab',
220
+ /**
221
+ * @cfg {String/Number} activeTab A string id or the numeric index of the tab that should be initially
222
+ * activated on render (defaults to none).
223
+ */
224
+ activeTab : null,
225
+ /**
226
+ * @cfg {Number} tabMargin The number of pixels of space to calculate into the sizing and scrolling of
227
+ * tabs. If you change the margin in CSS, you will need to update this value so calculations are correct
228
+ * with either <tt>{@link #resizeTabs}</tt> or scrolling tabs. (defaults to <tt>2</tt>)
229
+ */
230
+ tabMargin : 2,
231
+ /**
232
+ * @cfg {Boolean} plain </tt>true</tt> to render the tab strip without a background container image
233
+ * (defaults to <tt>false</tt>).
234
+ */
235
+ plain : false,
236
+ /**
237
+ * @cfg {Number} wheelIncrement For scrolling tabs, the number of pixels to increment on mouse wheel
238
+ * scrolling (defaults to <tt>20</tt>).
239
+ */
240
+ wheelIncrement : 20,
241
+
242
+ /*
243
+ * This is a protected property used when concatenating tab ids to the TabPanel id for internal uniqueness.
244
+ * It does not generally need to be changed, but can be if external code also uses an id scheme that can
245
+ * potentially clash with this one.
246
+ */
247
+ idDelimiter : '__',
248
+
249
+ // private
250
+ itemCls : 'x-tab-item',
251
+
252
+ // private config overrides
253
+ elements : 'body',
254
+ headerAsText : false,
255
+ frame : false,
256
+ hideBorders :true,
257
+
258
+ // private
259
+ initComponent : function(){
260
+ this.frame = false;
261
+ Ext.TabPanel.superclass.initComponent.call(this);
262
+ this.addEvents(
263
+ /**
264
+ * @event beforetabchange
265
+ * Fires before the active tab changes. Handlers can <tt>return false</tt> to cancel the tab change.
266
+ * @param {TabPanel} this
267
+ * @param {Panel} newTab The tab being activated
268
+ * @param {Panel} currentTab The current active tab
269
+ */
270
+ 'beforetabchange',
271
+ /**
272
+ * @event tabchange
273
+ * Fires after the active tab has changed.
274
+ * @param {TabPanel} this
275
+ * @param {Panel} tab The new active tab
276
+ */
277
+ 'tabchange',
278
+ /**
279
+ * @event contextmenu
280
+ * Relays the contextmenu event from a tab selector element in the tab strip.
281
+ * @param {TabPanel} this
282
+ * @param {Panel} tab The target tab
283
+ * @param {EventObject} e
284
+ */
285
+ 'contextmenu'
286
+ );
287
+ /**
288
+ * @cfg {Object} layoutConfig
289
+ * TabPanel implicitly uses {@link Ext.layout.CardLayout} as its layout manager.
290
+ * <code>layoutConfig</code> may be used to configure this layout manager.
291
+ * <code>{@link #deferredRender}</code> and <code>{@link #layoutOnTabChange}</code>
292
+ * configured on the TabPanel will be applied as configs to the layout manager.
293
+ */
294
+ this.setLayout(new Ext.layout.CardLayout(Ext.apply({
295
+ layoutOnCardChange: this.layoutOnTabChange,
296
+ deferredRender: this.deferredRender
297
+ }, this.layoutConfig)));
298
+
299
+ if(this.tabPosition == 'top'){
300
+ this.elements += ',header';
301
+ this.stripTarget = 'header';
302
+ }else {
303
+ this.elements += ',footer';
304
+ this.stripTarget = 'footer';
305
+ }
306
+ if(!this.stack){
307
+ this.stack = Ext.TabPanel.AccessStack();
308
+ }
309
+ this.initItems();
310
+ },
311
+
312
+ // private
313
+ onRender : function(ct, position){
314
+ Ext.TabPanel.superclass.onRender.call(this, ct, position);
315
+
316
+ if(this.plain){
317
+ var pos = this.tabPosition == 'top' ? 'header' : 'footer';
318
+ this[pos].addClass('x-tab-panel-'+pos+'-plain');
319
+ }
320
+
321
+ var st = this[this.stripTarget];
322
+
323
+ this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{
324
+ tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});
325
+
326
+ var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);
327
+ this.stripSpacer = st.createChild({cls:'x-tab-strip-spacer'}, beforeEl);
328
+ this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
329
+
330
+ this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge'});
331
+ this.strip.createChild({cls:'x-clear'});
332
+
333
+ this.body.addClass('x-tab-panel-body-'+this.tabPosition);
334
+
335
+ /**
336
+ * @cfg {Template/XTemplate} itemTpl <p>(Optional) A {@link Ext.Template Template} or
337
+ * {@link Ext.XTemplate XTemplate} which may be provided to process the data object returned from
338
+ * <tt>{@link #getTemplateArgs}</tt> to produce a clickable selector element in the tab strip.</p>
339
+ * <p>The main element created should be a <tt>&lt;li></tt> element. In order for a click event on
340
+ * a selector element to be connected to its item, it must take its <i>id</i> from the TabPanel's
341
+ * native <tt>{@link #getTemplateArgs}</tt>.</p>
342
+ * <p>The child element which contains the title text must be marked by the CSS class
343
+ * <tt>x-tab-strip-inner</tt>.</p>
344
+ * <p>To enable closability, the created element should contain an element marked by the CSS class
345
+ * <tt>x-tab-strip-close</tt>.</p>
346
+ * <p>If a custom <tt>itemTpl</tt> is supplied, it is the developer's responsibility to create CSS
347
+ * style rules to create the desired appearance.</p>
348
+ * Below is an example of how to create customized tab selector items:<pre><code>
349
+ new Ext.TabPanel({
350
+ renderTo: document.body,
351
+ minTabWidth: 115,
352
+ tabWidth: 135,
353
+ enableTabScroll: true,
354
+ width: 600,
355
+ height: 250,
356
+ defaults: {autoScroll:true},
357
+ itemTpl: new Ext.XTemplate(
358
+ '&lt;li class="{cls}" id="{id}" style="overflow:hidden">',
359
+ '&lt;tpl if="closable">',
360
+ '&lt;a class="x-tab-strip-close" onclick="return false;">&lt;/a>',
361
+ '&lt;/tpl>',
362
+ '&lt;a class="x-tab-right" href="#" onclick="return false;" style="padding-left:6px">',
363
+ '&lt;em class="x-tab-left">',
364
+ '&lt;span class="x-tab-strip-inner">',
365
+ '&lt;img src="{src}" style="float:left;margin:3px 3px 0 0">',
366
+ '&lt;span style="margin-left:20px" class="x-tab-strip-text {iconCls}">{text} {extra}&lt;/span>',
367
+ '&lt;/span>',
368
+ '&lt;/em>',
369
+ '&lt;/a>',
370
+ '&lt;/li>'
371
+ ),
372
+ getTemplateArgs: function(item) {
373
+ // Call the native method to collect the base data. Like the ID!
374
+ var result = Ext.TabPanel.prototype.getTemplateArgs.call(this, item);
375
+
376
+ // Add stuff used in our template
377
+ return Ext.apply(result, {
378
+ closable: item.closable,
379
+ src: item.iconSrc,
380
+ extra: item.extraText || ''
381
+ });
382
+ },
383
+ items: [{
384
+ title: 'New Tab 1',
385
+ iconSrc: '../shared/icons/fam/grid.png',
386
+ html: 'Tab Body 1',
387
+ closable: true
388
+ }, {
389
+ title: 'New Tab 2',
390
+ iconSrc: '../shared/icons/fam/grid.png',
391
+ html: 'Tab Body 2',
392
+ extraText: 'Extra stuff in the tab button'
393
+ }]
394
+ });
395
+ </code></pre>
396
+ */
397
+ if(!this.itemTpl){
398
+ var tt = new Ext.Template(
399
+ '<li class="{cls}" id="{id}"><a class="x-tab-strip-close" onclick="return false;"></a>',
400
+ '<a class="x-tab-right" href="#" onclick="return false;"><em class="x-tab-left">',
401
+ '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',
402
+ '</em></a></li>'
403
+ );
404
+ tt.disableFormats = true;
405
+ tt.compile();
406
+ Ext.TabPanel.prototype.itemTpl = tt;
407
+ }
408
+
409
+ this.items.each(this.initTab, this);
410
+ },
411
+
412
+ // private
413
+ afterRender : function(){
414
+ Ext.TabPanel.superclass.afterRender.call(this);
415
+ if(this.autoTabs){
416
+ this.readTabs(false);
417
+ }
418
+ if(this.activeTab !== undefined){
419
+ var item = Ext.isObject(this.activeTab) ? this.activeTab : this.items.get(this.activeTab);
420
+ delete this.activeTab;
421
+ this.setActiveTab(item);
422
+ }
423
+ },
424
+
425
+ // private
426
+ initEvents : function(){
427
+ Ext.TabPanel.superclass.initEvents.call(this);
428
+ this.on('add', this.onAdd, this, {target: this});
429
+ this.on('remove', this.onRemove, this, {target: this});
430
+
431
+ this.mon(this.strip, 'mousedown', this.onStripMouseDown, this);
432
+ this.mon(this.strip, 'contextmenu', this.onStripContextMenu, this);
433
+ if(this.enableTabScroll){
434
+ this.mon(this.strip, 'mousewheel', this.onWheel, this);
435
+ }
436
+ },
437
+
438
+ // private
439
+ findTargets : function(e){
440
+ var item = null;
441
+ var itemEl = e.getTarget('li', this.strip);
442
+ if(itemEl){
443
+ item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);
444
+ if(item.disabled){
445
+ return {
446
+ close : null,
447
+ item : null,
448
+ el : null
449
+ };
450
+ }
451
+ }
452
+ return {
453
+ close : e.getTarget('.x-tab-strip-close', this.strip),
454
+ item : item,
455
+ el : itemEl
456
+ };
457
+ },
458
+
459
+ // private
460
+ onStripMouseDown : function(e){
461
+ if(e.button !== 0){
462
+ return;
463
+ }
464
+ e.preventDefault();
465
+ var t = this.findTargets(e);
466
+ if(t.close){
467
+ if (t.item.fireEvent('beforeclose', t.item) !== false) {
468
+ t.item.fireEvent('close', t.item);
469
+ this.remove(t.item);
470
+ }
471
+ return;
472
+ }
473
+ if(t.item && t.item != this.activeTab){
474
+ this.setActiveTab(t.item);
475
+ }
476
+ },
477
+
478
+ // private
479
+ onStripContextMenu : function(e){
480
+ e.preventDefault();
481
+ var t = this.findTargets(e);
482
+ if(t.item){
483
+ this.fireEvent('contextmenu', this, t.item, e);
484
+ }
485
+ },
486
+
487
+ /**
488
+ * True to scan the markup in this tab panel for <tt>{@link #autoTabs}</tt> using the
489
+ * <tt>{@link #autoTabSelector}</tt>
490
+ * @param {Boolean} removeExisting True to remove existing tabs
491
+ */
492
+ readTabs : function(removeExisting){
493
+ if(removeExisting === true){
494
+ this.items.each(function(item){
495
+ this.remove(item);
496
+ }, this);
497
+ }
498
+ var tabs = this.el.query(this.autoTabSelector);
499
+ for(var i = 0, len = tabs.length; i < len; i++){
500
+ var tab = tabs[i];
501
+ var title = tab.getAttribute('title');
502
+ tab.removeAttribute('title');
503
+ this.add({
504
+ title: title,
505
+ contentEl: tab
506
+ });
507
+ }
508
+ },
509
+
510
+ // private
511
+ initTab : function(item, index){
512
+ var before = this.strip.dom.childNodes[index];
513
+ var p = this.getTemplateArgs(item);
514
+ var el = before ?
515
+ this.itemTpl.insertBefore(before, p) :
516
+ this.itemTpl.append(this.strip, p);
517
+
518
+ Ext.fly(el).addClassOnOver('x-tab-strip-over');
519
+
520
+ if(item.tabTip){
521
+ Ext.fly(el).child('span.x-tab-strip-text', true).qtip = item.tabTip;
522
+ }
523
+ item.tabEl = el;
524
+
525
+ item.on('disable', this.onItemDisabled, this);
526
+ item.on('enable', this.onItemEnabled, this);
527
+ item.on('titlechange', this.onItemTitleChanged, this);
528
+ item.on('iconchange', this.onItemIconChanged, this);
529
+ item.on('beforeshow', this.onBeforeShowItem, this);
530
+ },
531
+
532
+ /**
533
+ * <p>Provides template arguments for rendering a tab selector item in the tab strip.</p>
534
+ * <p>This method returns an object hash containing properties used by the TabPanel's <tt>{@link #itemTpl}</tt>
535
+ * to create a formatted, clickable tab selector element. The properties which must be returned
536
+ * are:</p><div class="mdetail-params"><ul>
537
+ * <li><b>id</b> : String<div class="sub-desc">A unique identifier which links to the item</div></li>
538
+ * <li><b>text</b> : String<div class="sub-desc">The text to display</div></li>
539
+ * <li><b>cls</b> : String<div class="sub-desc">The CSS class name</div></li>
540
+ * <li><b>iconCls</b> : String<div class="sub-desc">A CSS class to provide appearance for an icon.</div></li>
541
+ * </ul></div>
542
+ * @param {BoxComponent} item The {@link Ext.BoxComponent BoxComponent} for which to create a selector element in the tab strip.
543
+ * @return {Object} An object hash containing the properties required to render the selector element.
544
+ */
545
+ getTemplateArgs : function(item) {
546
+ var cls = item.closable ? 'x-tab-strip-closable' : '';
547
+ if(item.disabled){
548
+ cls += ' x-item-disabled';
549
+ }
550
+ if(item.iconCls){
551
+ cls += ' x-tab-with-icon';
552
+ }
553
+ if(item.tabCls){
554
+ cls += ' ' + item.tabCls;
555
+ }
556
+
557
+ return {
558
+ id: this.id + this.idDelimiter + item.getItemId(),
559
+ text: item.title,
560
+ cls: cls,
561
+ iconCls: item.iconCls || ''
562
+ };
563
+ },
564
+
565
+ // private
566
+ onAdd : function(tp, item, index){
567
+ this.initTab(item, index);
568
+ if(this.items.getCount() == 1){
569
+ this.syncSize();
570
+ }
571
+ this.delegateUpdates();
572
+ },
573
+
574
+ // private
575
+ onBeforeAdd : function(item){
576
+ var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);
577
+ if(existing){
578
+ this.setActiveTab(item);
579
+ return false;
580
+ }
581
+ Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
582
+ var es = item.elements;
583
+ item.elements = es ? es.replace(',header', '') : es;
584
+ item.border = (item.border === true);
585
+ },
586
+
587
+ // private
588
+ onRemove : function(tp, item){
589
+ Ext.destroy(Ext.get(this.getTabEl(item)));
590
+ this.stack.remove(item);
591
+ item.un('disable', this.onItemDisabled, this);
592
+ item.un('enable', this.onItemEnabled, this);
593
+ item.un('titlechange', this.onItemTitleChanged, this);
594
+ item.un('iconchange', this.onItemIconChanged, this);
595
+ item.un('beforeshow', this.onBeforeShowItem, this);
596
+ if(item == this.activeTab){
597
+ var next = this.stack.next();
598
+ if(next){
599
+ this.setActiveTab(next);
600
+ }else if(this.items.getCount() > 0){
601
+ this.setActiveTab(0);
602
+ }else{
603
+ this.activeTab = null;
604
+ }
605
+ }
606
+ this.delegateUpdates();
607
+ },
608
+
609
+ // private
610
+ onBeforeShowItem : function(item){
611
+ if(item != this.activeTab){
612
+ this.setActiveTab(item);
613
+ return false;
614
+ }
615
+ },
616
+
617
+ // private
618
+ onItemDisabled : function(item){
619
+ var el = this.getTabEl(item);
620
+ if(el){
621
+ Ext.fly(el).addClass('x-item-disabled');
622
+ }
623
+ this.stack.remove(item);
624
+ },
625
+
626
+ // private
627
+ onItemEnabled : function(item){
628
+ var el = this.getTabEl(item);
629
+ if(el){
630
+ Ext.fly(el).removeClass('x-item-disabled');
631
+ }
632
+ },
633
+
634
+ // private
635
+ onItemTitleChanged : function(item){
636
+ var el = this.getTabEl(item);
637
+ if(el){
638
+ Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;
639
+ }
640
+ },
641
+
642
+ //private
643
+ onItemIconChanged : function(item, iconCls, oldCls){
644
+ var el = this.getTabEl(item);
645
+ if(el){
646
+ Ext.fly(el).child('span.x-tab-strip-text').replaceClass(oldCls, iconCls);
647
+ }
648
+ },
649
+
650
+ /**
651
+ * Gets the DOM element for the tab strip item which activates the child panel with the specified
652
+ * ID. Access this to change the visual treatment of the item, for example by changing the CSS class name.
653
+ * @param {Panel/Number/String} tab The tab component, or the tab's index, or the tabs id or itemId.
654
+ * @return {HTMLElement} The DOM node
655
+ */
656
+ getTabEl : function(item){
657
+ return document.getElementById(this.id + this.idDelimiter + this.getComponent(item).getItemId());
658
+ },
659
+
660
+ // private
661
+ onResize : function(){
662
+ Ext.TabPanel.superclass.onResize.apply(this, arguments);
663
+ this.delegateUpdates();
664
+ },
665
+
666
+ /**
667
+ * Suspends any internal calculations or scrolling while doing a bulk operation. See {@link #endUpdate}
668
+ */
669
+ beginUpdate : function(){
670
+ this.suspendUpdates = true;
671
+ },
672
+
673
+ /**
674
+ * Resumes calculations and scrolling at the end of a bulk operation. See {@link #beginUpdate}
675
+ */
676
+ endUpdate : function(){
677
+ this.suspendUpdates = false;
678
+ this.delegateUpdates();
679
+ },
680
+
681
+ /**
682
+ * Hides the tab strip item for the passed tab
683
+ * @param {Number/String/Panel} item The tab index, id or item
684
+ */
685
+ hideTabStripItem : function(item){
686
+ item = this.getComponent(item);
687
+ var el = this.getTabEl(item);
688
+ if(el){
689
+ el.style.display = 'none';
690
+ this.delegateUpdates();
691
+ }
692
+ this.stack.remove(item);
693
+ },
694
+
695
+ /**
696
+ * Unhides the tab strip item for the passed tab
697
+ * @param {Number/String/Panel} item The tab index, id or item
698
+ */
699
+ unhideTabStripItem : function(item){
700
+ item = this.getComponent(item);
701
+ var el = this.getTabEl(item);
702
+ if(el){
703
+ el.style.display = '';
704
+ this.delegateUpdates();
705
+ }
706
+ },
707
+
708
+ // private
709
+ delegateUpdates : function(){
710
+ if(this.suspendUpdates){
711
+ return;
712
+ }
713
+ if(this.resizeTabs && this.rendered){
714
+ this.autoSizeTabs();
715
+ }
716
+ if(this.enableTabScroll && this.rendered){
717
+ this.autoScrollTabs();
718
+ }
719
+ },
720
+
721
+ // private
722
+ autoSizeTabs : function(){
723
+ var count = this.items.length;
724
+ var ce = this.tabPosition != 'bottom' ? 'header' : 'footer';
725
+ var ow = this[ce].dom.offsetWidth;
726
+ var aw = this[ce].dom.clientWidth;
727
+
728
+ if(!this.resizeTabs || count < 1 || !aw){ // !aw for display:none
729
+ return;
730
+ }
731
+
732
+ var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); // -4 for float errors in IE
733
+ this.lastTabWidth = each;
734
+ var lis = this.strip.query("li:not([className^=x-tab-edge])");
735
+ for(var i = 0, len = lis.length; i < len; i++) {
736
+ var li = lis[i];
737
+ var inner = Ext.fly(li).child('.x-tab-strip-inner', true);
738
+ var tw = li.offsetWidth;
739
+ var iw = inner.offsetWidth;
740
+ inner.style.width = (each - (tw-iw)) + 'px';
741
+ }
742
+ },
743
+
744
+ // private
745
+ adjustBodyWidth : function(w){
746
+ if(this.header){
747
+ this.header.setWidth(w);
748
+ }
749
+ if(this.footer){
750
+ this.footer.setWidth(w);
751
+ }
752
+ return w;
753
+ },
754
+
755
+ /**
756
+ * Sets the specified tab as the active tab. This method fires the {@link #beforetabchange} event which
757
+ * can <tt>return false</tt> to cancel the tab change.
758
+ * @param {String/Number} item
759
+ * The id or tab Panel to activate. This parameter may be any of the following:
760
+ * <div><ul class="mdetail-params">
761
+ * <li>a <b><tt>String</tt></b> : representing the <code>{@link Ext.Component#itemId itemId}</code>
762
+ * or <code>{@link Ext.Component#id id}</code> of the child component </li>
763
+ * <li>a <b><tt>Number</tt></b> : representing the position of the child component
764
+ * within the <code>{@link Ext.Container#items items}</code> <b>property</b></li>
765
+ * </ul></div>
766
+ * <p>For additional information see {@link Ext.util.MixedCollection#get}.
767
+ */
768
+ setActiveTab : function(item){
769
+ item = this.getComponent(item);
770
+ if(!item || this.fireEvent('beforetabchange', this, item, this.activeTab) === false){
771
+ return;
772
+ }
773
+ if(!this.rendered){
774
+ this.activeTab = item;
775
+ return;
776
+ }
777
+ if(this.activeTab != item){
778
+ if(this.activeTab){
779
+ var oldEl = this.getTabEl(this.activeTab);
780
+ if(oldEl){
781
+ Ext.fly(oldEl).removeClass('x-tab-strip-active');
782
+ }
783
+ this.activeTab.fireEvent('deactivate', this.activeTab);
784
+ }
785
+ var el = this.getTabEl(item);
786
+ Ext.fly(el).addClass('x-tab-strip-active');
787
+ this.activeTab = item;
788
+ this.stack.add(item);
789
+
790
+ this.layout.setActiveItem(item);
791
+ if(this.scrolling){
792
+ this.scrollToTab(item, this.animScroll);
793
+ }
794
+
795
+ item.fireEvent('activate', item);
796
+ this.fireEvent('tabchange', this, item);
797
+ }
798
+ },
799
+
800
+ /**
801
+ * Gets the currently active tab.
802
+ * @return {Panel} The active tab
803
+ */
804
+ getActiveTab : function(){
805
+ return this.activeTab || null;
806
+ },
807
+
808
+ /**
809
+ * Gets the specified tab by id.
810
+ * @param {String} id The tab id
811
+ * @return {Panel} The tab
812
+ */
813
+ getItem : function(item){
814
+ return this.getComponent(item);
815
+ },
816
+
817
+ // private
818
+ autoScrollTabs : function(){
819
+ this.pos = this.tabPosition=='bottom' ? this.footer : this.header;
820
+ var count = this.items.length;
821
+ var ow = this.pos.dom.offsetWidth;
822
+ var tw = this.pos.dom.clientWidth;
823
+
824
+ var wrap = this.stripWrap;
825
+ var wd = wrap.dom;
826
+ var cw = wd.offsetWidth;
827
+ var pos = this.getScrollPos();
828
+ var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
829
+
830
+ if(!this.enableTabScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues
831
+ return;
832
+ }
833
+ if(l <= tw){
834
+ wd.scrollLeft = 0;
835
+ wrap.setWidth(tw);
836
+ if(this.scrolling){
837
+ this.scrolling = false;
838
+ this.pos.removeClass('x-tab-scrolling');
839
+ this.scrollLeft.hide();
840
+ this.scrollRight.hide();
841
+ // See here: http://extjs.com/forum/showthread.php?t=49308&highlight=isSafari
842
+ if(Ext.isAir || Ext.isWebKit){
843
+ wd.style.marginLeft = '';
844
+ wd.style.marginRight = '';
845
+ }
846
+ }
847
+ }else{
848
+ if(!this.scrolling){
849
+ this.pos.addClass('x-tab-scrolling');
850
+ // See here: http://extjs.com/forum/showthread.php?t=49308&highlight=isSafari
851
+ if(Ext.isAir || Ext.isWebKit){
852
+ wd.style.marginLeft = '18px';
853
+ wd.style.marginRight = '18px';
854
+ }
855
+ }
856
+ tw -= wrap.getMargins('lr');
857
+ wrap.setWidth(tw > 20 ? tw : 20);
858
+ if(!this.scrolling){
859
+ if(!this.scrollLeft){
860
+ this.createScrollers();
861
+ }else{
862
+ this.scrollLeft.show();
863
+ this.scrollRight.show();
864
+ }
865
+ }
866
+ this.scrolling = true;
867
+ if(pos > (l-tw)){ // ensure it stays within bounds
868
+ wd.scrollLeft = l-tw;
869
+ }else{ // otherwise, make sure the active tab is still visible
870
+ this.scrollToTab(this.activeTab, false);
871
+ }
872
+ this.updateScrollButtons();
873
+ }
874
+ },
875
+
876
+ // private
877
+ createScrollers : function(){
878
+ this.pos.addClass('x-tab-scrolling-' + this.tabPosition);
879
+ var h = this.stripWrap.dom.offsetHeight;
880
+
881
+ // left
882
+ var sl = this.pos.insertFirst({
883
+ cls:'x-tab-scroller-left'
884
+ });
885
+ sl.setHeight(h);
886
+ sl.addClassOnOver('x-tab-scroller-left-over');
887
+ this.leftRepeater = new Ext.util.ClickRepeater(sl, {
888
+ interval : this.scrollRepeatInterval,
889
+ handler: this.onScrollLeft,
890
+ scope: this
891
+ });
892
+ this.scrollLeft = sl;
893
+
894
+ // right
895
+ var sr = this.pos.insertFirst({
896
+ cls:'x-tab-scroller-right'
897
+ });
898
+ sr.setHeight(h);
899
+ sr.addClassOnOver('x-tab-scroller-right-over');
900
+ this.rightRepeater = new Ext.util.ClickRepeater(sr, {
901
+ interval : this.scrollRepeatInterval,
902
+ handler: this.onScrollRight,
903
+ scope: this
904
+ });
905
+ this.scrollRight = sr;
906
+ },
907
+
908
+ // private
909
+ getScrollWidth : function(){
910
+ return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
911
+ },
912
+
913
+ // private
914
+ getScrollPos : function(){
915
+ return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
916
+ },
917
+
918
+ // private
919
+ getScrollArea : function(){
920
+ return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
921
+ },
922
+
923
+ // private
924
+ getScrollAnim : function(){
925
+ return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};
926
+ },
927
+
928
+ // private
929
+ getScrollIncrement : function(){
930
+ return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);
931
+ },
932
+
933
+ /**
934
+ * Scrolls to a particular tab if tab scrolling is enabled
935
+ * @param {Panel} item The item to scroll to
936
+ * @param {Boolean} animate True to enable animations
937
+ */
938
+
939
+ scrollToTab : function(item, animate){
940
+ if(!item){ return; }
941
+ var el = this.getTabEl(item);
942
+ var pos = this.getScrollPos(), area = this.getScrollArea();
943
+ var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
944
+ var right = left + el.offsetWidth;
945
+ if(left < pos){
946
+ this.scrollTo(left, animate);
947
+ }else if(right > (pos + area)){
948
+ this.scrollTo(right - area, animate);
949
+ }
950
+ },
951
+
952
+ // private
953
+ scrollTo : function(pos, animate){
954
+ this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
955
+ if(!animate){
956
+ this.updateScrollButtons();
957
+ }
958
+ },
959
+
960
+ onWheel : function(e){
961
+ var d = e.getWheelDelta()*this.wheelIncrement*-1;
962
+ e.stopEvent();
963
+
964
+ var pos = this.getScrollPos();
965
+ var newpos = pos + d;
966
+ var sw = this.getScrollWidth()-this.getScrollArea();
967
+
968
+ var s = Math.max(0, Math.min(sw, newpos));
969
+ if(s != pos){
970
+ this.scrollTo(s, false);
971
+ }
972
+ },
973
+
974
+ // private
975
+ onScrollRight : function(){
976
+ var sw = this.getScrollWidth()-this.getScrollArea();
977
+ var pos = this.getScrollPos();
978
+ var s = Math.min(sw, pos + this.getScrollIncrement());
979
+ if(s != pos){
980
+ this.scrollTo(s, this.animScroll);
981
+ }
982
+ },
983
+
984
+ // private
985
+ onScrollLeft : function(){
986
+ var pos = this.getScrollPos();
987
+ var s = Math.max(0, pos - this.getScrollIncrement());
988
+ if(s != pos){
989
+ this.scrollTo(s, this.animScroll);
990
+ }
991
+ },
992
+
993
+ // private
994
+ updateScrollButtons : function(){
995
+ var pos = this.getScrollPos();
996
+ this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');
997
+ this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');
998
+ },
999
+
1000
+ // private
1001
+ beforeDestroy : function() {
1002
+ if(this.items){
1003
+ this.items.each(function(item){
1004
+ if(item && item.tabEl){
1005
+ Ext.get(item.tabEl).removeAllListeners();
1006
+ item.tabEl = null;
1007
+ }
1008
+ }, this);
1009
+ }
1010
+ if(this.strip){
1011
+ this.strip.removeAllListeners();
1012
+ }
1013
+ Ext.TabPanel.superclass.beforeDestroy.apply(this);
1014
+ }
1015
+
1016
+ /**
1017
+ * @cfg {Boolean} collapsible
1018
+ * @hide
1019
+ */
1020
+ /**
1021
+ * @cfg {String} header
1022
+ * @hide
1023
+ */
1024
+ /**
1025
+ * @cfg {Boolean} headerAsText
1026
+ * @hide
1027
+ */
1028
+ /**
1029
+ * @property header
1030
+ * @hide
1031
+ */
1032
+ /**
1033
+ * @property title
1034
+ * @hide
1035
+ */
1036
+ /**
1037
+ * @cfg {Array} tools
1038
+ * @hide
1039
+ */
1040
+ /**
1041
+ * @cfg {Array} toolTemplate
1042
+ * @hide
1043
+ */
1044
+ /**
1045
+ * @cfg {Boolean} hideCollapseTool
1046
+ * @hide
1047
+ */
1048
+ /**
1049
+ * @cfg {Boolean} titleCollapse
1050
+ * @hide
1051
+ */
1052
+ /**
1053
+ * @cfg {Boolean} collapsed
1054
+ * @hide
1055
+ */
1056
+ /**
1057
+ * @cfg {String} layout
1058
+ * @hide
1059
+ */
1060
+ /**
1061
+ * @cfg {Boolean} preventBodyReset
1062
+ * @hide
1063
+ */
1064
+ });
1065
+ Ext.reg('tabpanel', Ext.TabPanel);
1066
+
1067
+ /**
1068
+ * See {@link #setActiveTab}. Sets the specified tab as the active tab. This method fires
1069
+ * the {@link #beforetabchange} event which can <tt>return false</tt> to cancel the tab change.
1070
+ * @param {String/Panel} tab The id or tab Panel to activate
1071
+ * @method activate
1072
+ */
1073
+ Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
1074
+
1075
+ // private utility class used by TabPanel
1076
+ Ext.TabPanel.AccessStack = function(){
1077
+ var items = [];
1078
+ return {
1079
+ add : function(item){
1080
+ items.push(item);
1081
+ if(items.length > 10){
1082
+ items.shift();
1083
+ }
1084
+ },
1085
+
1086
+ remove : function(item){
1087
+ var s = [];
1088
+ for(var i = 0, len = items.length; i < len; i++) {
1089
+ if(items[i] != item){
1090
+ s.push(items[i]);
1091
+ }
1092
+ }
1093
+ items = s;
1094
+ },
1095
+
1096
+ next : function(){
1097
+ return items.pop();
1098
+ }
1099
+ };
1100
+ };