Component.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:69k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.Component
  9.  * @extends Ext.util.Observable
  10.  * <p>Base class for all Ext components.  All subclasses of Component may participate in the automated
  11.  * Ext component lifecycle of creation, rendering and destruction which is provided by the {@link Ext.Container Container} class.
  12.  * Components may be added to a Container through the {@link Ext.Container#items items} config option at the time the Container is created,
  13.  * or they may be added dynamically via the {@link Ext.Container#add add} method.</p>
  14.  * <p>The Component base class has built-in support for basic hide/show and enable/disable behavior.</p>
  15.  * <p>All Components are registered with the {@link Ext.ComponentMgr} on construction so that they can be referenced at any time via
  16.  * {@link Ext#getCmp}, passing the {@link #id}.</p>
  17.  * <p>All user-developed visual widgets that are required to participate in automated lifecycle and size management should subclass Component (or
  18.  * {@link Ext.BoxComponent} if managed box model handling is required, ie height and width management).</p>
  19.  * <p>See the <a href="http://extjs.com/learn/Tutorial:Creating_new_UI_controls">Creating new UI controls</a> tutorial for details on how
  20.  * and to either extend or augment ExtJs base classes to create custom Components.</p>
  21.  * <p>Every component has a specific xtype, which is its Ext-specific type name, along with methods for checking the
  22.  * xtype like {@link #getXType} and {@link #isXType}. This is the list of all valid xtypes:</p>
  23.  * <pre>
  24. xtype            Class
  25. -------------    ------------------
  26. box              {@link Ext.BoxComponent}
  27. button           {@link Ext.Button}
  28. buttongroup      {@link Ext.ButtonGroup}
  29. colorpalette     {@link Ext.ColorPalette}
  30. component        {@link Ext.Component}
  31. container        {@link Ext.Container}
  32. cycle            {@link Ext.CycleButton}
  33. dataview         {@link Ext.DataView}
  34. datepicker       {@link Ext.DatePicker}
  35. editor           {@link Ext.Editor}
  36. editorgrid       {@link Ext.grid.EditorGridPanel}
  37. flash            {@link Ext.FlashComponent}
  38. grid             {@link Ext.grid.GridPanel}
  39. listview         {@link Ext.ListView}
  40. panel            {@link Ext.Panel}
  41. progress         {@link Ext.ProgressBar}
  42. propertygrid     {@link Ext.grid.PropertyGrid}
  43. slider           {@link Ext.Slider}
  44. spacer           {@link Ext.Spacer}
  45. splitbutton      {@link Ext.SplitButton}
  46. tabpanel         {@link Ext.TabPanel}
  47. treepanel        {@link Ext.tree.TreePanel}
  48. viewport         {@link Ext.ViewPort}
  49. window           {@link Ext.Window}
  50. Toolbar components
  51. ---------------------------------------
  52. paging           {@link Ext.PagingToolbar}
  53. toolbar          {@link Ext.Toolbar}
  54. tbbutton         {@link Ext.Toolbar.Button}        (deprecated; use button)
  55. tbfill           {@link Ext.Toolbar.Fill}
  56. tbitem           {@link Ext.Toolbar.Item}
  57. tbseparator      {@link Ext.Toolbar.Separator}
  58. tbspacer         {@link Ext.Toolbar.Spacer}
  59. tbsplit          {@link Ext.Toolbar.SplitButton}   (deprecated; use splitbutton)
  60. tbtext           {@link Ext.Toolbar.TextItem}
  61. Menu components
  62. ---------------------------------------
  63. menu             {@link Ext.menu.Menu}
  64. colormenu        {@link Ext.menu.ColorMenu}
  65. datemenu         {@link Ext.menu.DateMenu}
  66. menubaseitem     {@link Ext.menu.BaseItem}
  67. menucheckitem    {@link Ext.menu.CheckItem}
  68. menuitem         {@link Ext.menu.Item}
  69. menuseparator    {@link Ext.menu.Separator}
  70. menutextitem     {@link Ext.menu.TextItem}
  71. Form components
  72. ---------------------------------------
  73. form             {@link Ext.form.FormPanel}
  74. checkbox         {@link Ext.form.Checkbox}
  75. checkboxgroup    {@link Ext.form.CheckboxGroup}
  76. combo            {@link Ext.form.ComboBox}
  77. datefield        {@link Ext.form.DateField}
  78. displayfield     {@link Ext.form.DisplayField}
  79. field            {@link Ext.form.Field}
  80. fieldset         {@link Ext.form.FieldSet}
  81. hidden           {@link Ext.form.Hidden}
  82. htmleditor       {@link Ext.form.HtmlEditor}
  83. label            {@link Ext.form.Label}
  84. numberfield      {@link Ext.form.NumberField}
  85. radio            {@link Ext.form.Radio}
  86. radiogroup       {@link Ext.form.RadioGroup}
  87. textarea         {@link Ext.form.TextArea}
  88. textfield        {@link Ext.form.TextField}
  89. timefield        {@link Ext.form.TimeField}
  90. trigger          {@link Ext.form.TriggerField}
  91. Chart components
  92. ---------------------------------------
  93. chart            {@link Ext.chart.Chart}
  94. barchart         {@link Ext.chart.BarChart}
  95. cartesianchart   {@link Ext.chart.CartesianChart}
  96. columnchart      {@link Ext.chart.ColumnChart}
  97. linechart        {@link Ext.chart.LineChart}
  98. piechart         {@link Ext.chart.PieChart}
  99. Store xtypes
  100. ---------------------------------------
  101. arraystore       {@link Ext.data.ArrayStore}
  102. directstore      {@link Ext.data.DirectStore}
  103. groupingstore    {@link Ext.data.GroupingStore}
  104. jsonstore        {@link Ext.data.JsonStore}
  105. simplestore      {@link Ext.data.SimpleStore}      (deprecated; use arraystore)
  106. store            {@link Ext.data.Store}
  107. xmlstore         {@link Ext.data.XmlStore}
  108. </pre>
  109.  * @constructor
  110.  * @param {Ext.Element/String/Object} config The configuration options may be specified as either:
  111.  * <div class="mdetail-params"><ul>
  112.  * <li><b>an element</b> :
  113.  * <p class="sub-desc">it is set as the internal element and its id used as the component id</p></li>
  114.  * <li><b>a string</b> :
  115.  * <p class="sub-desc">it is assumed to be the id of an existing element and is used as the component id</p></li>
  116.  * <li><b>anything else</b> :
  117.  * <p class="sub-desc">it is assumed to be a standard config object and is applied to the component</p></li>
  118.  * </ul></div>
  119.  */
  120. Ext.Component = function(config){
  121.     config = config || {};
  122.     if(config.initialConfig){
  123.         if(config.isAction){           // actions
  124.             this.baseAction = config;
  125.         }
  126.         config = config.initialConfig; // component cloning / action set up
  127.     }else if(config.tagName || config.dom || Ext.isString(config)){ // element object
  128.         config = {applyTo: config, id: config.id || config};
  129.     }
  130.     /**
  131.      * This Component's initial configuration specification. Read-only.
  132.      * @type Object
  133.      * @property initialConfig
  134.      */
  135.     this.initialConfig = config;
  136.     Ext.apply(this, config);
  137.     this.addEvents(
  138.         /**
  139.          * @event added
  140.          * Fires when a component is added to an Ext.Container
  141.          * @param {Ext.Component} this
  142.          * @param {Ext.Container} ownerCt Container which holds the component
  143.          * @param {number} index Position at which the component was added
  144.          */
  145.         'added',
  146.         /**
  147.          * @event disable
  148.          * Fires after the component is disabled.
  149.          * @param {Ext.Component} this
  150.          */
  151.         'disable',
  152.         /**
  153.          * @event enable
  154.          * Fires after the component is enabled.
  155.          * @param {Ext.Component} this
  156.          */
  157.         'enable',
  158.         /**
  159.          * @event beforeshow
  160.          * Fires before the component is shown by calling the {@link #show} method.
  161.          * Return false from an event handler to stop the show.
  162.          * @param {Ext.Component} this
  163.          */
  164.         'beforeshow',
  165.         /**
  166.          * @event show
  167.          * Fires after the component is shown when calling the {@link #show} method.
  168.          * @param {Ext.Component} this
  169.          */
  170.         'show',
  171.         /**
  172.          * @event beforehide
  173.          * Fires before the component is hidden by calling the {@link #hide} method.
  174.          * Return false from an event handler to stop the hide.
  175.          * @param {Ext.Component} this
  176.          */
  177.         'beforehide',
  178.         /**
  179.          * @event hide
  180.          * Fires after the component is hidden.
  181.          * Fires after the component is hidden when calling the {@link #hide} method.
  182.          * @param {Ext.Component} this
  183.          */
  184.         'hide',
  185.         /**
  186.          * @event removed
  187.          * Fires when a component is removed from an Ext.Container
  188.          * @param {Ext.Component} this
  189.          * @param {Ext.Container} ownerCt Container which holds the component
  190.          */
  191.         'removed',
  192.         /**
  193.          * @event beforerender
  194.          * Fires before the component is {@link #rendered}. Return false from an
  195.          * event handler to stop the {@link #render}.
  196.          * @param {Ext.Component} this
  197.          */
  198.         'beforerender',
  199.         /**
  200.          * @event render
  201.          * Fires after the component markup is {@link #rendered}.
  202.          * @param {Ext.Component} this
  203.          */
  204.         'render',
  205.         /**
  206.          * @event afterrender
  207.          * <p>Fires after the component rendering is finished.</p>
  208.          * <p>The afterrender event is fired after this Component has been {@link #rendered}, been postprocesed
  209.          * by any afterRender method defined for the Component, and, if {@link #stateful}, after state
  210.          * has been restored.</p>
  211.          * @param {Ext.Component} this
  212.          */
  213.         'afterrender',
  214.         /**
  215.          * @event beforedestroy
  216.          * Fires before the component is {@link #destroy}ed. Return false from an event handler to stop the {@link #destroy}.
  217.          * @param {Ext.Component} this
  218.          */
  219.         'beforedestroy',
  220.         /**
  221.          * @event destroy
  222.          * Fires after the component is {@link #destroy}ed.
  223.          * @param {Ext.Component} this
  224.          */
  225.         'destroy',
  226.         /**
  227.          * @event beforestaterestore
  228.          * Fires before the state of the component is restored. Return false from an event handler to stop the restore.
  229.          * @param {Ext.Component} this
  230.          * @param {Object} state The hash of state values returned from the StateProvider. If this
  231.          * event is not vetoed, then the state object is passed to <b><tt>applyState</tt></b>. By default,
  232.          * that simply copies property values into this Component. The method maybe overriden to
  233.          * provide custom state restoration.
  234.          */
  235.         'beforestaterestore',
  236.         /**
  237.          * @event staterestore
  238.          * Fires after the state of the component is restored.
  239.          * @param {Ext.Component} this
  240.          * @param {Object} state The hash of state values returned from the StateProvider. This is passed
  241.          * to <b><tt>applyState</tt></b>. By default, that simply copies property values into this
  242.          * Component. The method maybe overriden to provide custom state restoration.
  243.          */
  244.         'staterestore',
  245.         /**
  246.          * @event beforestatesave
  247.          * Fires before the state of the component is saved to the configured state provider. Return false to stop the save.
  248.          * @param {Ext.Component} this
  249.          * @param {Object} state The hash of state values. This is determined by calling
  250.          * <b><tt>getState()</tt></b> on the Component. This method must be provided by the
  251.          * developer to return whetever representation of state is required, by default, Ext.Component
  252.          * has a null implementation.
  253.          */
  254.         'beforestatesave',
  255.         /**
  256.          * @event statesave
  257.          * Fires after the state of the component is saved to the configured state provider.
  258.          * @param {Ext.Component} this
  259.          * @param {Object} state The hash of state values. This is determined by calling
  260.          * <b><tt>getState()</tt></b> on the Component. This method must be provided by the
  261.          * developer to return whetever representation of state is required, by default, Ext.Component
  262.          * has a null implementation.
  263.          */
  264.         'statesave'
  265.     );
  266.     this.getId();
  267.     Ext.ComponentMgr.register(this);
  268.     Ext.Component.superclass.constructor.call(this);
  269.     if(this.baseAction){
  270.         this.baseAction.addComponent(this);
  271.     }
  272.     this.initComponent();
  273.     if(this.plugins){
  274.         if(Ext.isArray(this.plugins)){
  275.             for(var i = 0, len = this.plugins.length; i < len; i++){
  276.                 this.plugins[i] = this.initPlugin(this.plugins[i]);
  277.             }
  278.         }else{
  279.             this.plugins = this.initPlugin(this.plugins);
  280.         }
  281.     }
  282.     if(this.stateful !== false){
  283.         this.initState();
  284.     }
  285.     if(this.applyTo){
  286.         this.applyToMarkup(this.applyTo);
  287.         delete this.applyTo;
  288.     }else if(this.renderTo){
  289.         this.render(this.renderTo);
  290.         delete this.renderTo;
  291.     }
  292. };
  293. // private
  294. Ext.Component.AUTO_ID = 1000;
  295. Ext.extend(Ext.Component, Ext.util.Observable, {
  296.     // Configs below are used for all Components when rendered by FormLayout.
  297.     /**
  298.      * @cfg {String} fieldLabel <p>The label text to display next to this Component (defaults to '').</p>
  299.      * <br><p><b>Note</b>: this config is only used when this Component is rendered by a Container which
  300.      * has been configured to use the <b>{@link Ext.layout.FormLayout FormLayout}</b> layout manager (e.g.
  301.      * {@link Ext.form.FormPanel} or specifying <tt>layout:'form'</tt>).</p><br>
  302.      * <p>Also see <tt>{@link #hideLabel}</tt> and
  303.      * {@link Ext.layout.FormLayout}.{@link Ext.layout.FormLayout#fieldTpl fieldTpl}.</p>
  304.      * Example use:<pre><code>
  305. new Ext.FormPanel({
  306.     height: 100,
  307.     renderTo: Ext.getBody(),
  308.     items: [{
  309.         xtype: 'textfield',
  310.         fieldLabel: 'Name'
  311.     }]
  312. });
  313. </code></pre>
  314.      */
  315.     /**
  316.      * @cfg {String} labelStyle <p>A CSS style specification string to apply directly to this field's
  317.      * label.  Defaults to the container's labelStyle value if set (e.g.,
  318.      * <tt>{@link Ext.layout.FormLayout#labelStyle}</tt> , or '').</p>
  319.      * <br><p><b>Note</b>: see the note for <code>{@link #clearCls}</code>.</p><br>
  320.      * <p>Also see <code>{@link #hideLabel}</code> and
  321.      * <code>{@link Ext.layout.FormLayout}.{@link Ext.layout.FormLayout#fieldTpl fieldTpl}.</code></p>
  322.      * Example use:<pre><code>
  323. new Ext.FormPanel({
  324.     height: 100,
  325.     renderTo: Ext.getBody(),
  326.     items: [{
  327.         xtype: 'textfield',
  328.         fieldLabel: 'Name',
  329.         labelStyle: 'font-weight:bold;'
  330.     }]
  331. });
  332. </code></pre>
  333.      */
  334.     /**
  335.      * @cfg {String} labelSeparator <p>The separator to display after the text of each
  336.      * <tt>{@link #fieldLabel}</tt>.  This property may be configured at various levels.
  337.      * The order of precedence is:
  338.      * <div class="mdetail-params"><ul>
  339.      * <li>field / component level</li>
  340.      * <li>container level</li>
  341.      * <li>{@link Ext.layout.FormLayout#labelSeparator layout level} (defaults to colon <tt>':'</tt>)</li>
  342.      * </ul></div>
  343.      * To display no separator for this field's label specify empty string ''.</p>
  344.      * <br><p><b>Note</b>: see the note for <tt>{@link #clearCls}</tt>.</p><br>
  345.      * <p>Also see <tt>{@link #hideLabel}</tt> and
  346.      * {@link Ext.layout.FormLayout}.{@link Ext.layout.FormLayout#fieldTpl fieldTpl}.</p>
  347.      * Example use:<pre><code>
  348. new Ext.FormPanel({
  349.     height: 100,
  350.     renderTo: Ext.getBody(),
  351.     layoutConfig: {
  352.         labelSeparator: '~'   // layout config has lowest priority (defaults to ':')
  353.     },
  354.     {@link Ext.layout.FormLayout#labelSeparator labelSeparator}: '>>',     // config at container level
  355.     items: [{
  356.         xtype: 'textfield',
  357.         fieldLabel: 'Field 1',
  358.         labelSeparator: '...' // field/component level config supersedes others
  359.     },{
  360.         xtype: 'textfield',
  361.         fieldLabel: 'Field 2' // labelSeparator will be '='
  362.     }]
  363. });
  364. </code></pre>
  365.      */
  366.     /**
  367.      * @cfg {Boolean} hideLabel <p><tt>true</tt> to completely hide the label element
  368.      * ({@link #fieldLabel label} and {@link #labelSeparator separator}). Defaults to <tt>false</tt>.
  369.      * By default, even if you do not specify a <tt>{@link #fieldLabel}</tt> the space will still be
  370.      * reserved so that the field will line up with other fields that do have labels.
  371.      * Setting this to <tt>true</tt> will cause the field to not reserve that space.</p>
  372.      * <br><p><b>Note</b>: see the note for <tt>{@link #clearCls}</tt>.</p><br>
  373.      * Example use:<pre><code>
  374. new Ext.FormPanel({
  375.     height: 100,
  376.     renderTo: Ext.getBody(),
  377.     items: [{
  378.         xtype: 'textfield'
  379.         hideLabel: true
  380.     }]
  381. });
  382. </code></pre>
  383.      */
  384.     /**
  385.      * @cfg {String} clearCls <p>The CSS class used to to apply to the special clearing div rendered
  386.      * directly after each form field wrapper to provide field clearing (defaults to
  387.      * <tt>'x-form-clear-left'</tt>).</p>
  388.      * <br><p><b>Note</b>: this config is only used when this Component is rendered by a Container
  389.      * which has been configured to use the <b>{@link Ext.layout.FormLayout FormLayout}</b> layout
  390.      * manager (e.g. {@link Ext.form.FormPanel} or specifying <tt>layout:'form'</tt>) and either a
  391.      * <tt>{@link #fieldLabel}</tt> is specified or <tt>isFormField=true</tt> is specified.</p><br>
  392.      * <p>See {@link Ext.layout.FormLayout}.{@link Ext.layout.FormLayout#fieldTpl fieldTpl} also.</p>
  393.      */
  394.     /**
  395.      * @cfg {String} itemCls
  396.      * <p><b>Note</b>: this config is only used when this Component is rendered by a Container which
  397.      * has been configured to use the <b>{@link Ext.layout.FormLayout FormLayout}</b> layout manager (e.g.
  398.      * {@link Ext.form.FormPanel} or specifying <tt>layout:'form'</tt>).</p><br>
  399.      * <p>An additional CSS class to apply to the div wrapping the form item
  400.      * element of this field.  If supplied, <tt>itemCls</tt> at the <b>field</b> level will override
  401.      * the default <tt>itemCls</tt> supplied at the <b>container</b> level. The value specified for
  402.      * <tt>itemCls</tt> will be added to the default class (<tt>'x-form-item'</tt>).</p>
  403.      * <p>Since it is applied to the item wrapper (see
  404.      * {@link Ext.layout.FormLayout}.{@link Ext.layout.FormLayout#fieldTpl fieldTpl}), it allows
  405.      * you to write standard CSS rules that can apply to the field, the label (if specified), or
  406.      * any other element within the markup for the field.</p>
  407.      * <br><p><b>Note</b>: see the note for <tt>{@link #fieldLabel}</tt>.</p><br>
  408.      * Example use:<pre><code>
  409. // Apply a style to the field&#39;s label:
  410. &lt;style>
  411.     .required .x-form-item-label {font-weight:bold;color:red;}
  412. &lt;/style>
  413. new Ext.FormPanel({
  414.     height: 100,
  415.     renderTo: Ext.getBody(),
  416.     items: [{
  417.         xtype: 'textfield',
  418.         fieldLabel: 'Name',
  419.         itemCls: 'required' //this label will be styled
  420.     },{
  421.         xtype: 'textfield',
  422.         fieldLabel: 'Favorite Color'
  423.     }]
  424. });
  425. </code></pre>
  426.      */
  427.     // Configs below are used for all Components when rendered by AnchorLayout.
  428.     /**
  429.      * @cfg {String} anchor <p><b>Note</b>: this config is only used when this Component is rendered
  430.      * by a Container which has been configured to use an <b>{@link Ext.layout.AnchorLayout AnchorLayout}</b>
  431.      * based layout manager, for example:<div class="mdetail-params"><ul>
  432.      * <li>{@link Ext.form.FormPanel}</li>
  433.      * <li>specifying <code>layout: 'anchor' // or 'form', or 'absolute'</code></li>
  434.      * </ul></div></p>
  435.      * <p>See {@link Ext.layout.AnchorLayout}.{@link Ext.layout.AnchorLayout#anchor anchor} also.</p>
  436.      */
  437.     /**
  438.      * @cfg {String} id
  439.      * <p>The <b>unique</b> id of this component (defaults to an {@link #getId auto-assigned id}).
  440.      * You should assign an id if you need to be able to access the component later and you do
  441.      * not have an object reference available (e.g., using {@link Ext}.{@link Ext#getCmp getCmp}).</p>
  442.      * <p>Note that this id will also be used as the element id for the containing HTML element
  443.      * that is rendered to the page for this component. This allows you to write id-based CSS
  444.      * rules to style the specific instance of this component uniquely, and also to select
  445.      * sub-elements using this component's id as the parent.</p>
  446.      * <p><b>Note</b>: to avoid complications imposed by a unique <tt>id</tt> also see
  447.      * <code>{@link #itemId}</code> and <code>{@link #ref}</code>.</p>
  448.      * <p><b>Note</b>: to access the container of an item see <code>{@link #ownerCt}</code>.</p>
  449.      */
  450.     /**
  451.      * @cfg {String} itemId
  452.      * <p>An <tt>itemId</tt> can be used as an alternative way to get a reference to a component
  453.      * when no object reference is available.  Instead of using an <code>{@link #id}</code> with
  454.      * {@link Ext}.{@link Ext#getCmp getCmp}, use <code>itemId</code> with
  455.      * {@link Ext.Container}.{@link Ext.Container#getComponent getComponent} which will retrieve
  456.      * <code>itemId</code>'s or <tt>{@link #id}</tt>'s. Since <code>itemId</code>'s are an index to the
  457.      * container's internal MixedCollection, the <code>itemId</code> is scoped locally to the container --
  458.      * avoiding potential conflicts with {@link Ext.ComponentMgr} which requires a <b>unique</b>
  459.      * <code>{@link #id}</code>.</p>
  460.      * <pre><code>
  461. var c = new Ext.Panel({ //
  462.     {@link Ext.BoxComponent#height height}: 300,
  463.     {@link #renderTo}: document.body,
  464.     {@link Ext.Container#layout layout}: 'auto',
  465.     {@link Ext.Container#items items}: [
  466.         {
  467.             itemId: 'p1',
  468.             {@link Ext.Panel#title title}: 'Panel 1',
  469.             {@link Ext.BoxComponent#height height}: 150
  470.         },
  471.         {
  472.             itemId: 'p2',
  473.             {@link Ext.Panel#title title}: 'Panel 2',
  474.             {@link Ext.BoxComponent#height height}: 150
  475.         }
  476.     ]
  477. })
  478. p1 = c.{@link Ext.Container#getComponent getComponent}('p1'); // not the same as {@link Ext#getCmp Ext.getCmp()}
  479. p2 = p1.{@link #ownerCt}.{@link Ext.Container#getComponent getComponent}('p2'); // reference via a sibling
  480.      * </code></pre>
  481.      * <p>Also see <tt>{@link #id}</tt> and <code>{@link #ref}</code>.</p>
  482.      * <p><b>Note</b>: to access the container of an item see <tt>{@link #ownerCt}</tt>.</p>
  483.      */
  484.     /**
  485.      * @cfg {String} xtype
  486.      * The registered <tt>xtype</tt> to create. This config option is not used when passing
  487.      * a config object into a constructor. This config option is used only when
  488.      * lazy instantiation is being used, and a child item of a Container is being
  489.      * specified not as a fully instantiated Component, but as a <i>Component config
  490.      * object</i>. The <tt>xtype</tt> will be looked up at render time up to determine what
  491.      * type of child Component to create.<br><br>
  492.      * The predefined xtypes are listed {@link Ext.Component here}.
  493.      * <br><br>
  494.      * If you subclass Components to create your own Components, you may register
  495.      * them using {@link Ext.ComponentMgr#registerType} in order to be able to
  496.      * take advantage of lazy instantiation and rendering.
  497.      */
  498.     /**
  499.      * @cfg {String} ptype
  500.      * The registered <tt>ptype</tt> to create. This config option is not used when passing
  501.      * a config object into a constructor. This config option is used only when
  502.      * lazy instantiation is being used, and a Plugin is being
  503.      * specified not as a fully instantiated Component, but as a <i>Component config
  504.      * object</i>. The <tt>ptype</tt> will be looked up at render time up to determine what
  505.      * type of Plugin to create.<br><br>
  506.      * If you create your own Plugins, you may register them using
  507.      * {@link Ext.ComponentMgr#registerPlugin} in order to be able to
  508.      * take advantage of lazy instantiation and rendering.
  509.      */
  510.     /**
  511.      * @cfg {String} cls
  512.      * An optional extra CSS class that will be added to this component's Element (defaults to '').  This can be
  513.      * useful for adding customized styles to the component or any of its children using standard CSS rules.
  514.      */
  515.     /**
  516.      * @cfg {String} overCls
  517.      * An optional extra CSS class that will be added to this component's Element when the mouse moves
  518.      * over the Element, and removed when the mouse moves out. (defaults to '').  This can be
  519.      * useful for adding customized 'active' or 'hover' styles to the component or any of its children using standard CSS rules.
  520.      */
  521.     /**
  522.      * @cfg {String} style
  523.      * A custom style specification to be applied to this component's Element.  Should be a valid argument to
  524.      * {@link Ext.Element#applyStyles}.
  525.      * <pre><code>
  526. new Ext.Panel({
  527.     title: 'Some Title',
  528.     renderTo: Ext.getBody(),
  529.     width: 400, height: 300,
  530.     layout: 'form',
  531.     items: [{
  532.         xtype: 'textarea',
  533.         style: {
  534.             width: '95%',
  535.             marginBottom: '10px'
  536.         }
  537.     },
  538.         new Ext.Button({
  539.             text: 'Send',
  540.             minWidth: '100',
  541.             style: {
  542.                 marginBottom: '10px'
  543.             }
  544.         })
  545.     ]
  546. });
  547.      * </code></pre>
  548.      */
  549.     /**
  550.      * @cfg {String} ctCls
  551.      * <p>An optional extra CSS class that will be added to this component's container. This can be useful for
  552.      * adding customized styles to the container or any of its children using standard CSS rules.  See
  553.      * {@link Ext.layout.ContainerLayout}.{@link Ext.layout.ContainerLayout#extraCls extraCls} also.</p>
  554.      * <p><b>Note</b>: <tt>ctCls</tt> defaults to <tt>''</tt> except for the following class
  555.      * which assigns a value by default:
  556.      * <div class="mdetail-params"><ul>
  557.      * <li>{@link Ext.layout.Box Box Layout} : <tt>'x-box-layout-ct'</tt></li>
  558.      * </ul></div>
  559.      * To configure the above Class with an extra CSS class append to the default.  For example,
  560.      * for BoxLayout (Hbox and Vbox):<pre><code>
  561.      * ctCls: 'x-box-layout-ct custom-class'
  562.      * </code></pre>
  563.      * </p>
  564.      */
  565.     /**
  566.      * @cfg {Boolean} disabled
  567.      * Render this component disabled (default is false).
  568.      */
  569.     disabled : false,
  570.     /**
  571.      * @cfg {Boolean} hidden
  572.      * Render this component hidden (default is false). If <tt>true</tt>, the
  573.      * {@link #hide} method will be called internally.
  574.      */
  575.     hidden : false,
  576.     /**
  577.      * @cfg {Object/Array} plugins
  578.      * An object or array of objects that will provide custom functionality for this component.  The only
  579.      * requirement for a valid plugin is that it contain an init method that accepts a reference of type Ext.Component.
  580.      * When a component is created, if any plugins are available, the component will call the init method on each
  581.      * plugin, passing a reference to itself.  Each plugin can then call methods or respond to events on the
  582.      * component as needed to provide its functionality.
  583.      */
  584.     /**
  585.      * @cfg {Mixed} applyTo
  586.      * <p>Specify the id of the element, a DOM element or an existing Element corresponding to a DIV
  587.      * that is already present in the document that specifies some structural markup for this
  588.      * component.</p><div><ul>
  589.      * <li><b>Description</b> : <ul>
  590.      * <div class="sub-desc">When <tt>applyTo</tt> is used, constituent parts of the component can also be specified
  591.      * by id or CSS class name within the main element, and the component being created may attempt
  592.      * to create its subcomponents from that markup if applicable.</div>
  593.      * </ul></li>
  594.      * <li><b>Notes</b> : <ul>
  595.      * <div class="sub-desc">When using this config, a call to render() is not required.</div>
  596.      * <div class="sub-desc">If applyTo is specified, any value passed for {@link #renderTo} will be ignored and the target
  597.      * element's parent node will automatically be used as the component's container.</div>
  598.      * </ul></li>
  599.      * </ul></div>
  600.      */
  601.     /**
  602.      * @cfg {Mixed} renderTo
  603.      * <p>Specify the id of the element, a DOM element or an existing Element that this component
  604.      * will be rendered into.</p><div><ul>
  605.      * <li><b>Notes</b> : <ul>
  606.      * <div class="sub-desc">Do <u>not</u> use this option if the Component is to be a child item of
  607.      * a {@link Ext.Container Container}. It is the responsibility of the
  608.      * {@link Ext.Container Container}'s {@link Ext.Container#layout layout manager}
  609.      * to render and manage its child items.</div>
  610.      * <div class="sub-desc">When using this config, a call to render() is not required.</div>
  611.      * </ul></li>
  612.      * </ul></div>
  613.      * <p>See <tt>{@link #render}</tt> also.</p>
  614.      */
  615.     /**
  616.      * @cfg {Boolean} stateful
  617.      * <p>A flag which causes the Component to attempt to restore the state of
  618.      * internal properties from a saved state on startup. The component must have
  619.      * either a <code>{@link #stateId}</code> or <code>{@link #id}</code> assigned
  620.      * for state to be managed. Auto-generated ids are not guaranteed to be stable
  621.      * across page loads and cannot be relied upon to save and restore the same
  622.      * state for a component.<p>
  623.      * <p>For state saving to work, the state manager's provider must have been
  624.      * set to an implementation of {@link Ext.state.Provider} which overrides the
  625.      * {@link Ext.state.Provider#set set} and {@link Ext.state.Provider#get get}
  626.      * methods to save and recall name/value pairs. A built-in implementation,
  627.      * {@link Ext.state.CookieProvider} is available.</p>
  628.      * <p>To set the state provider for the current page:</p>
  629.      * <pre><code>
  630. Ext.state.Manager.setProvider(new Ext.state.CookieProvider({
  631.     expires: new Date(new Date().getTime()+(1000*60*60*24*7)), //7 days from now
  632. }));
  633.      * </code></pre>
  634.      * <p>A stateful Component attempts to save state when one of the events
  635.      * listed in the <code>{@link #stateEvents}</code> configuration fires.</p>
  636.      * <p>To save state, a stateful Component first serializes its state by
  637.      * calling <b><code>getState</code></b>. By default, this function does
  638.      * nothing. The developer must provide an implementation which returns an
  639.      * object hash which represents the Component's restorable state.</p>
  640.      * <p>The value yielded by getState is passed to {@link Ext.state.Manager#set}
  641.      * which uses the configured {@link Ext.state.Provider} to save the object
  642.      * keyed by the Component's <code>{@link stateId}</code>, or, if that is not
  643.      * specified, its <code>{@link #id}</code>.</p>
  644.      * <p>During construction, a stateful Component attempts to <i>restore</i>
  645.      * its state by calling {@link Ext.state.Manager#get} passing the
  646.      * <code>{@link #stateId}</code>, or, if that is not specified, the
  647.      * <code>{@link #id}</code>.</p>
  648.      * <p>The resulting object is passed to <b><code>applyState</code></b>.
  649.      * The default implementation of <code>applyState</code> simply copies
  650.      * properties into the object, but a developer may override this to support
  651.      * more behaviour.</p>
  652.      * <p>You can perform extra processing on state save and restore by attaching
  653.      * handlers to the {@link #beforestaterestore}, {@link #staterestore},
  654.      * {@link #beforestatesave} and {@link #statesave} events.</p>
  655.      */
  656.     /**
  657.      * @cfg {String} stateId
  658.      * The unique id for this component to use for state management purposes
  659.      * (defaults to the component id if one was set, otherwise null if the
  660.      * component is using a generated id).
  661.      * <p>See <code>{@link #stateful}</code> for an explanation of saving and
  662.      * restoring Component state.</p>
  663.      */
  664.     /**
  665.      * @cfg {Array} stateEvents
  666.      * <p>An array of events that, when fired, should trigger this component to
  667.      * save its state (defaults to none). <code>stateEvents</code> may be any type
  668.      * of event supported by this component, including browser or custom events
  669.      * (e.g., <tt>['click', 'customerchange']</tt>).</p>
  670.      * <p>See <code>{@link #stateful}</code> for an explanation of saving and
  671.      * restoring Component state.</p>
  672.      */
  673.     /**
  674.      * @cfg {Mixed} autoEl
  675.      * <p>A tag name or {@link Ext.DomHelper DomHelper} spec used to create the {@link #getEl Element} which will
  676.      * encapsulate this Component.</p>
  677.      * <p>You do not normally need to specify this. For the base classes {@link Ext.Component}, {@link Ext.BoxComponent},
  678.      * and {@link Ext.Container}, this defaults to <b><tt>'div'</tt></b>. The more complex Ext classes use a more complex
  679.      * DOM structure created by their own onRender methods.</p>
  680.      * <p>This is intended to allow the developer to create application-specific utility Components encapsulated by
  681.      * different DOM elements. Example usage:</p><pre><code>
  682. {
  683.     xtype: 'box',
  684.     autoEl: {
  685.         tag: 'img',
  686.         src: 'http://www.example.com/example.jpg'
  687.     }
  688. }, {
  689.     xtype: 'box',
  690.     autoEl: {
  691.         tag: 'blockquote',
  692.         html: 'autoEl is cool!'
  693.     }
  694. }, {
  695.     xtype: 'container',
  696.     autoEl: 'ul',
  697.     cls: 'ux-unordered-list',
  698.     items: {
  699.         xtype: 'box',
  700.         autoEl: 'li',
  701.         html: 'First list item'
  702.     }
  703. }
  704. </code></pre>
  705.      */
  706.     autoEl : 'div',
  707.     /**
  708.      * @cfg {String} disabledClass
  709.      * CSS class added to the component when it is disabled (defaults to 'x-item-disabled').
  710.      */
  711.     disabledClass : 'x-item-disabled',
  712.     /**
  713.      * @cfg {Boolean} allowDomMove
  714.      * Whether the component can move the Dom node when rendering (defaults to true).
  715.      */
  716.     allowDomMove : true,
  717.     /**
  718.      * @cfg {Boolean} autoShow
  719.      * True if the component should check for hidden classes (e.g. 'x-hidden' or 'x-hide-display') and remove
  720.      * them on render (defaults to false).
  721.      */
  722.     autoShow : false,
  723.     /**
  724.      * @cfg {String} hideMode
  725.      * <p>How this component should be hidden. Supported values are <tt>'visibility'</tt>
  726.      * (css visibility), <tt>'offsets'</tt> (negative offset position) and <tt>'display'</tt>
  727.      * (css display).</p>
  728.      * <br><p><b>Note</b>: the default of <tt>'display'</tt> is generally preferred
  729.      * since items are automatically laid out when they are first shown (no sizing
  730.      * is done while hidden).</p>
  731.      */
  732.     hideMode : 'display',
  733.     /**
  734.      * @cfg {Boolean} hideParent
  735.      * True to hide and show the component's container when hide/show is called on the component, false to hide
  736.      * and show the component itself (defaults to false).  For example, this can be used as a shortcut for a hide
  737.      * button on a window by setting hide:true on the button when adding it to its parent container.
  738.      */
  739.     hideParent : false,
  740.     /**
  741.      * <p>The {@link Ext.Element} which encapsulates this Component. Read-only.</p>
  742.      * <p>This will <i>usually</i> be a &lt;DIV> element created by the class's onRender method, but
  743.      * that may be overridden using the <code>{@link #autoEl}</code> config.</p>
  744.      * <br><p><b>Note</b>: this element will not be available until this Component has been rendered.</p><br>
  745.      * <p>To add listeners for <b>DOM events</b> to this Component (as opposed to listeners
  746.      * for this Component's own Observable events), see the {@link Ext.util.Observable#listeners listeners}
  747.      * config for a suggestion, or use a render listener directly:</p><pre><code>
  748. new Ext.Panel({
  749.     title: 'The Clickable Panel',
  750.     listeners: {
  751.         render: function(p) {
  752.             // Append the Panel to the click handler&#39;s argument list.
  753.             p.getEl().on('click', handlePanelClick.createDelegate(null, [p], true));
  754.         },
  755.         single: true  // Remove the listener after first invocation
  756.     }
  757. });
  758. </code></pre>
  759.      * <p>See also <tt>{@link #getEl getEl}</p>
  760.      * @type Ext.Element
  761.      * @property el
  762.      */
  763.     /**
  764.      * This Component's owner {@link Ext.Container Container} (defaults to undefined, and is set automatically when
  765.      * this Component is added to a Container).  Read-only.
  766.      * <p><b>Note</b>: to access items within the Container see <tt>{@link #itemId}</tt>.</p>
  767.      * @type Ext.Container
  768.      * @property ownerCt
  769.      */
  770.     /**
  771.      * True if this component is hidden. Read-only.
  772.      * @type Boolean
  773.      * @property hidden
  774.      */
  775.     /**
  776.      * True if this component is disabled. Read-only.
  777.      * @type Boolean
  778.      * @property disabled
  779.      */
  780.     /**
  781.      * True if this component has been rendered. Read-only.
  782.      * @type Boolean
  783.      * @property rendered
  784.      */
  785.     rendered : false,
  786.     /**
  787.      * @cfg {String} contentEl
  788.      * <p>Optional. Specify an existing HTML element, or the <code>id</code> of an existing HTML element to use as the content
  789.      * for this component.</p>
  790.      * <ul>
  791.      * <li><b>Description</b> :
  792.      * <div class="sub-desc">This config option is used to take an existing HTML element and place it in the layout element
  793.      * of a new component (it simply moves the specified DOM element <i>after the Component is rendered</i> to use as the content.</div></li>
  794.      * <li><b>Notes</b> :
  795.      * <div class="sub-desc">The specified HTML element is appended to the layout element of the component <i>after any configured
  796.      * {@link #html HTML} has been inserted</i>, and so the document will not contain this element at the time the {@link #render} event is fired.</div>
  797.      * <div class="sub-desc">The specified HTML element used will not participate in any <code><b>{@link Ext.Container#layout layout}</b></code>
  798.      * scheme that the Component may use. It is just HTML. Layouts operate on child <code><b>{@link Ext.Container#items items}</b></code>.</div>
  799.      * <div class="sub-desc">Add either the <code>x-hidden</code> or the <code>x-hide-display</code> CSS class to
  800.      * prevent a brief flicker of the content before it is rendered to the panel.</div></li>
  801.      * </ul>
  802.      */
  803.     /**
  804.      * @cfg {String/Object} html
  805.      * An HTML fragment, or a {@link Ext.DomHelper DomHelper} specification to use as the layout element
  806.      * content (defaults to ''). The HTML content is added after the component is rendered,
  807.      * so the document will not contain this HTML at the time the {@link #render} event is fired.
  808.      * This content is inserted into the body <i>before</i> any configured {@link #contentEl} is appended.
  809.      */
  810.     /**
  811.      * @cfg {Mixed} tpl
  812.      * An <bold>{@link Ext.Template}</bold>, <bold>{@link Ext.XTemplate}</bold>
  813.      * or an array of strings to form an Ext.XTemplate.
  814.      * Used in conjunction with the <code>{@link #data}</code> and 
  815.      * <code>{@link #tplWriteMode}</code> configurations.
  816.      */
  817.     /**
  818.      * @cfg {String} tplWriteMode The Ext.(X)Template method to use when
  819.      * updating the content area of the Component. Defaults to <tt>'overwrite'</tt>
  820.      * (see <code>{@link Ext.XTemplate#overwrite}</code>).
  821.      */
  822.     tplWriteMode : 'overwrite',
  823.     /**
  824.      * @cfg {Mixed} data
  825.      * The initial set of data to apply to the <code>{@link #tpl}</code> to
  826.      * update the content area of the Component.
  827.      */
  828.     // private
  829.     ctype : 'Ext.Component',
  830.     // private
  831.     actionMode : 'el',
  832.     // private
  833.     getActionEl : function(){
  834.         return this[this.actionMode];
  835.     },
  836.     initPlugin : function(p){
  837.         if(p.ptype && !Ext.isFunction(p.init)){
  838.             p = Ext.ComponentMgr.createPlugin(p);
  839.         }else if(Ext.isString(p)){
  840.             p = Ext.ComponentMgr.createPlugin({
  841.                 ptype: p
  842.             });
  843.         }
  844.         p.init(this);
  845.         return p;
  846.     },
  847.     /* // protected
  848.      * Function to be implemented by Component subclasses to be part of standard component initialization flow (it is empty by default).
  849.      * <pre><code>
  850. // Traditional constructor:
  851. Ext.Foo = function(config){
  852.     // call superclass constructor:
  853.     Ext.Foo.superclass.constructor.call(this, config);
  854.     this.addEvents({
  855.         // add events
  856.     });
  857. };
  858. Ext.extend(Ext.Foo, Ext.Bar, {
  859.    // class body
  860. }
  861. // initComponent replaces the constructor:
  862. Ext.Foo = Ext.extend(Ext.Bar, {
  863.     initComponent : function(){
  864.         // call superclass initComponent
  865.         Ext.Container.superclass.initComponent.call(this);
  866.         this.addEvents({
  867.             // add events
  868.         });
  869.     }
  870. }
  871. </code></pre>
  872.      */
  873.     initComponent : Ext.emptyFn,
  874.     /**
  875.      * <p>Render this Component into the passed HTML element.</p>
  876.      * <p><b>If you are using a {@link Ext.Container Container} object to house this Component, then
  877.      * do not use the render method.</b></p>
  878.      * <p>A Container's child Components are rendered by that Container's
  879.      * {@link Ext.Container#layout layout} manager when the Container is first rendered.</p>
  880.      * <p>Certain layout managers allow dynamic addition of child components. Those that do
  881.      * include {@link Ext.layout.CardLayout}, {@link Ext.layout.AnchorLayout},
  882.      * {@link Ext.layout.FormLayout}, {@link Ext.layout.TableLayout}.</p>
  883.      * <p>If the Container is already rendered when a new child Component is added, you may need to call
  884.      * the Container's {@link Ext.Container#doLayout doLayout} to refresh the view which causes any
  885.      * unrendered child Components to be rendered. This is required so that you can add multiple
  886.      * child components if needed while only refreshing the layout once.</p>
  887.      * <p>When creating complex UIs, it is important to remember that sizing and positioning
  888.      * of child items is the responsibility of the Container's {@link Ext.Container#layout layout} manager.
  889.      * If you expect child items to be sized in response to user interactions, you must
  890.      * configure the Container with a layout manager which creates and manages the type of layout you
  891.      * have in mind.</p>
  892.      * <p><b>Omitting the Container's {@link Ext.Container#layout layout} config means that a basic
  893.      * layout manager is used which does nothing but render child components sequentially into the
  894.      * Container. No sizing or positioning will be performed in this situation.</b></p>
  895.      * @param {Element/HTMLElement/String} container (optional) The element this Component should be
  896.      * rendered into. If it is being created from existing markup, this should be omitted.
  897.      * @param {String/Number} position (optional) The element ID or DOM node index within the container <b>before</b>
  898.      * which this component will be inserted (defaults to appending to the end of the container)
  899.      */
  900.     render : function(container, position){
  901.         if(!this.rendered && this.fireEvent('beforerender', this) !== false){
  902.             if(!container && this.el){
  903.                 this.el = Ext.get(this.el);
  904.                 container = this.el.dom.parentNode;
  905.                 this.allowDomMove = false;
  906.             }
  907.             this.container = Ext.get(container);
  908.             if(this.ctCls){
  909.                 this.container.addClass(this.ctCls);
  910.             }
  911.             this.rendered = true;
  912.             if(position !== undefined){
  913.                 if(Ext.isNumber(position)){
  914.                     position = this.container.dom.childNodes[position];
  915.                 }else{
  916.                     position = Ext.getDom(position);
  917.                 }
  918.             }
  919.             this.onRender(this.container, position || null);
  920.             if(this.autoShow){
  921.                 this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
  922.             }
  923.             if(this.cls){
  924.                 this.el.addClass(this.cls);
  925.                 delete this.cls;
  926.             }
  927.             if(this.style){
  928.                 this.el.applyStyles(this.style);
  929.                 delete this.style;
  930.             }
  931.             if(this.overCls){
  932.                 this.el.addClassOnOver(this.overCls);
  933.             }
  934.             this.fireEvent('render', this);
  935.             // Populate content of the component with html, contentEl or
  936.             // a tpl.
  937.             var contentTarget = this.getContentTarget();
  938.             if (this.html){
  939.                 contentTarget.update(Ext.DomHelper.markup(this.html));
  940.                 delete this.html;
  941.             }
  942.             if (this.contentEl){
  943.                 var ce = Ext.getDom(this.contentEl);
  944.                 Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);
  945.                 contentTarget.appendChild(ce);
  946.             }
  947.             if (this.tpl) {
  948.                 if (!this.tpl.compile) {
  949.                     this.tpl = new Ext.XTemplate(this.tpl);
  950.                 }
  951.                 if (this.data) {
  952.                     this.tpl[this.tplWriteMode](contentTarget, this.data);
  953.                     delete this.data;
  954.                 }
  955.             }
  956.             this.afterRender(this.container);
  957.             if(this.hidden){
  958.                 // call this so we don't fire initial hide events.
  959.                 this.doHide();
  960.             }
  961.             if(this.disabled){
  962.                 // pass silent so the event doesn't fire the first time.
  963.                 this.disable(true);
  964.             }
  965.             if(this.stateful !== false){
  966.                 this.initStateEvents();
  967.             }
  968.             this.fireEvent('afterrender', this);
  969.         }
  970.         return this;
  971.     },
  972.     /**
  973.      * Update the content area of a component.
  974.      * @param {Mixed} htmlOrData
  975.      * If this component has been configured with a template via the tpl config
  976.      * then it will use this argument as data to populate the template.
  977.      * If this component was not configured with a template, the components
  978.      * content area will be updated via Ext.Element update
  979.      * @param {Boolean} loadScripts
  980.      * (optional) Only legitimate when using the html configuration. Defaults to false
  981.      * @param {Function} callback
  982.      * (optional) Only legitimate when using the html configuration. Callback to execute when scripts have finished loading
  983.      */
  984.     update: function(htmlOrData, loadScripts, cb) {
  985.         var contentTarget = this.getContentTarget();
  986.         if (this.tpl && typeof htmlOrData !== "string") {
  987.             this.tpl[this.tplWriteMode](contentTarget, htmlOrData || {});
  988.         } else {
  989.             var html = Ext.isObject(htmlOrData) ? Ext.DomHelper.markup(htmlOrData) : htmlOrData;
  990.             contentTarget.update(html, loadScripts, cb);
  991.         }
  992.     },
  993.     /**
  994.      * @private
  995.      * Method to manage awareness of when components are added to their
  996.      * respective Container, firing an added event.
  997.      * References are established at add time rather than at render time.
  998.      * @param {Ext.Container} container Container which holds the component
  999.      * @param {number} pos Position at which the component was added
  1000.      */
  1001.     onAdded : function(container, pos) {
  1002.         this.ownerCt = container;
  1003.         this.initRef();
  1004.         this.fireEvent('added', this, container, pos);
  1005.     },
  1006.     /**
  1007.      * @private
  1008.      * Method to manage awareness of when components are removed from their
  1009.      * respective Container, firing an removed event. References are properly
  1010.      * cleaned up after removing a component from its owning container.
  1011.      */
  1012.     onRemoved : function() {
  1013.         this.removeRef();
  1014.         this.fireEvent('removed', this, this.ownerCt);
  1015.         delete this.ownerCt;
  1016.     },
  1017.     /**
  1018.      * @private
  1019.      * Method to establish a reference to a component.
  1020.      */
  1021.     initRef : function() {
  1022.         /**
  1023.          * @cfg {String} ref
  1024.          * <p>A path specification, relative to the Component's <code>{@link #ownerCt}</code>
  1025.          * specifying into which ancestor Container to place a named reference to this Component.</p>
  1026.          * <p>The ancestor axis can be traversed by using '/' characters in the path.
  1027.          * For example, to put a reference to a Toolbar Button into <i>the Panel which owns the Toolbar</i>:</p><pre><code>
  1028. var myGrid = new Ext.grid.EditorGridPanel({
  1029.     title: 'My EditorGridPanel',
  1030.     store: myStore,
  1031.     colModel: myColModel,
  1032.     tbar: [{
  1033.         text: 'Save',
  1034.         handler: saveChanges,
  1035.         disabled: true,
  1036.         ref: '../saveButton'
  1037.     }],
  1038.     listeners: {
  1039.         afteredit: function() {
  1040. //          The button reference is in the GridPanel
  1041.             myGrid.saveButton.enable();
  1042.         }
  1043.     }
  1044. });
  1045. </code></pre>
  1046.          * <p>In the code above, if the <code>ref</code> had been <code>'saveButton'</code>
  1047.          * the reference would have been placed into the Toolbar. Each '/' in the <code>ref</code>
  1048.          * moves up one level from the Component's <code>{@link #ownerCt}</code>.</p>
  1049.          * <p>Also see the <code>{@link #added}</code> and <code>{@link #removed}</code> events.</p>
  1050.          */
  1051.         if(this.ref && !this.refOwner){
  1052.             var levels = this.ref.split('/'),
  1053.                 last = levels.length, 
  1054.                 i = 0,
  1055.                 t = this;
  1056.                 
  1057.             while(t && i < last){
  1058.                 t = t.ownerCt;
  1059.                 ++i;
  1060.             }
  1061.             if(t){
  1062.                 t[this.refName = levels[--i]] = this;
  1063.                 /**
  1064.                  * @type Ext.Container
  1065.                  * @property refOwner
  1066.                  * The ancestor Container into which the {@link #ref} reference was inserted if this Component
  1067.                  * is a child of a Container, and has been configured with a <code>ref</code>.
  1068.                  */
  1069.                 this.refOwner = t;
  1070.             }
  1071.         }
  1072.     },
  1073.     removeRef : function() {
  1074.         if (this.refOwner && this.refName) {
  1075.             delete this.refOwner[this.refName];
  1076.             delete this.refOwner;
  1077.         }
  1078.     },
  1079.     // private
  1080.     initState : function(){
  1081.         if(Ext.state.Manager){
  1082.             var id = this.getStateId();
  1083.             if(id){
  1084.                 var state = Ext.state.Manager.get(id);
  1085.                 if(state){
  1086.                     if(this.fireEvent('beforestaterestore', this, state) !== false){
  1087.                         this.applyState(Ext.apply({}, state));
  1088.                         this.fireEvent('staterestore', this, state);
  1089.                     }
  1090.                 }
  1091.             }
  1092.         }
  1093.     },
  1094.     // private
  1095.     getStateId : function(){
  1096.         return this.stateId || ((this.id.indexOf('ext-comp-') == 0 || this.id.indexOf('ext-gen') == 0) ? null : this.id);
  1097.     },
  1098.     // private
  1099.     initStateEvents : function(){
  1100.         if(this.stateEvents){
  1101.             for(var i = 0, e; e = this.stateEvents[i]; i++){
  1102.                 this.on(e, this.saveState, this, {delay:100});
  1103.             }
  1104.         }
  1105.     },
  1106.     // private
  1107.     applyState : function(state){
  1108.         if(state){
  1109.             Ext.apply(this, state);
  1110.         }
  1111.     },
  1112.     // private
  1113.     getState : function(){
  1114.         return null;
  1115.     },
  1116.     // private
  1117.     saveState : function(){
  1118.         if(Ext.state.Manager && this.stateful !== false){
  1119.             var id = this.getStateId();
  1120.             if(id){
  1121.                 var state = this.getState();
  1122.                 if(this.fireEvent('beforestatesave', this, state) !== false){
  1123.                     Ext.state.Manager.set(id, state);
  1124.                     this.fireEvent('statesave', this, state);
  1125.                 }
  1126.             }
  1127.         }
  1128.     },
  1129.     /**
  1130.      * Apply this component to existing markup that is valid. With this function, no call to render() is required.
  1131.      * @param {String/HTMLElement} el
  1132.      */
  1133.     applyToMarkup : function(el){
  1134.         this.allowDomMove = false;
  1135.         this.el = Ext.get(el);
  1136.         this.render(this.el.dom.parentNode);
  1137.     },
  1138.     /**
  1139.      * Adds a CSS class to the component's underlying element.
  1140.      * @param {string} cls The CSS class name to add
  1141.      * @return {Ext.Component} this
  1142.      */
  1143.     addClass : function(cls){
  1144.         if(this.el){
  1145.             this.el.addClass(cls);
  1146.         }else{
  1147.             this.cls = this.cls ? this.cls + ' ' + cls : cls;
  1148.         }
  1149.         return this;
  1150.     },
  1151.     /**
  1152.      * Removes a CSS class from the component's underlying element.
  1153.      * @param {string} cls The CSS class name to remove
  1154.      * @return {Ext.Component} this
  1155.      */
  1156.     removeClass : function(cls){
  1157.         if(this.el){
  1158.             this.el.removeClass(cls);
  1159.         }else if(this.cls){
  1160.             this.cls = this.cls.split(' ').remove(cls).join(' ');
  1161.         }
  1162.         return this;
  1163.     },
  1164.     // private
  1165.     // default function is not really useful
  1166.     onRender : function(ct, position){
  1167.         if(!this.el && this.autoEl){
  1168.             if(Ext.isString(this.autoEl)){
  1169.                 this.el = document.createElement(this.autoEl);
  1170.             }else{
  1171.                 var div = document.createElement('div');
  1172.                 Ext.DomHelper.overwrite(div, this.autoEl);
  1173.                 this.el = div.firstChild;
  1174.             }
  1175.             if (!this.el.id) {
  1176.                 this.el.id = this.getId();
  1177.             }
  1178.         }
  1179.         if(this.el){
  1180.             this.el = Ext.get(this.el);
  1181.             if(this.allowDomMove !== false){
  1182.                 ct.dom.insertBefore(this.el.dom, position);
  1183.                 if (div) {
  1184.                     Ext.removeNode(div);
  1185.                     div = null;
  1186.                 }
  1187.             }
  1188.         }
  1189.     },
  1190.     // private
  1191.     getAutoCreate : function(){
  1192.         var cfg = Ext.isObject(this.autoCreate) ?
  1193.                       this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
  1194.         if(this.id && !cfg.id){
  1195.             cfg.id = this.id;
  1196.         }
  1197.         return cfg;
  1198.     },
  1199.     // private
  1200.     afterRender : Ext.emptyFn,
  1201.     /**
  1202.      * Destroys this component by purging any event listeners, removing the component's element from the DOM,
  1203.      * removing the component from its {@link Ext.Container} (if applicable) and unregistering it from
  1204.      * {@link Ext.ComponentMgr}.  Destruction is generally handled automatically by the framework and this method
  1205.      * should usually not need to be called directly.
  1206.      *
  1207.      */
  1208.     destroy : function(){
  1209.         if(!this.isDestroyed){
  1210.             if(this.fireEvent('beforedestroy', this) !== false){
  1211.                 this.destroying = true;
  1212.                 this.beforeDestroy();
  1213.                 if(this.ownerCt && this.ownerCt.remove){
  1214.                     this.ownerCt.remove(this, false);
  1215.                 }
  1216.                 if(this.rendered){
  1217.                     this.el.remove();
  1218.                     if(this.actionMode == 'container' || this.removeMode == 'container'){
  1219.                         this.container.remove();
  1220.                     }
  1221.                 }
  1222.                 this.onDestroy();
  1223.                 Ext.ComponentMgr.unregister(this);
  1224.                 this.fireEvent('destroy', this);
  1225.                 this.purgeListeners();
  1226.                 this.destroying = false;
  1227.                 this.isDestroyed = true;
  1228.             }
  1229.         }
  1230.     },
  1231.     deleteMembers : function(){
  1232.         var args = arguments;
  1233.         for(var i = 0, len = args.length; i < len; ++i){
  1234.             delete this[args[i]];
  1235.         }
  1236.     },
  1237.     // private
  1238.     beforeDestroy : Ext.emptyFn,
  1239.     // private
  1240.     onDestroy  : Ext.emptyFn,
  1241.     /**
  1242.      * <p>Returns the {@link Ext.Element} which encapsulates this Component.</p>
  1243.      * <p>This will <i>usually</i> be a &lt;DIV> element created by the class's onRender method, but
  1244.      * that may be overridden using the {@link #autoEl} config.</p>
  1245.      * <br><p><b>Note</b>: this element will not be available until this Component has been rendered.</p><br>
  1246.      * <p>To add listeners for <b>DOM events</b> to this Component (as opposed to listeners
  1247.      * for this Component's own Observable events), see the {@link #listeners} config for a suggestion,
  1248.      * or use a render listener directly:</p><pre><code>
  1249. new Ext.Panel({
  1250.     title: 'The Clickable Panel',
  1251.     listeners: {
  1252.         render: function(p) {
  1253.             // Append the Panel to the click handler&#39;s argument list.
  1254.             p.getEl().on('click', handlePanelClick.createDelegate(null, [p], true));
  1255.         },
  1256.         single: true  // Remove the listener after first invocation
  1257.     }
  1258. });
  1259. </code></pre>
  1260.      * @return {Ext.Element} The Element which encapsulates this Component.
  1261.      */
  1262.     getEl : function(){
  1263.         return this.el;
  1264.     },
  1265.     // private
  1266.     getContentTarget : function(){
  1267.         return this.el;
  1268.     },
  1269.     /**
  1270.      * Returns the <code>id</code> of this component or automatically generates and
  1271.      * returns an <code>id</code> if an <code>id</code> is not defined yet:<pre><code>
  1272.      * 'ext-comp-' + (++Ext.Component.AUTO_ID)
  1273.      * </code></pre>
  1274.      * @return {String} id
  1275.      */
  1276.     getId : function(){
  1277.         return this.id || (this.id = 'ext-comp-' + (++Ext.Component.AUTO_ID));
  1278.     },
  1279.     /**
  1280.      * Returns the <code>{@link #itemId}</code> of this component.  If an
  1281.      * <code>{@link #itemId}</code> was not assigned through configuration the
  1282.      * <code>id</code> is returned using <code>{@link #getId}</code>.
  1283.      * @return {String}
  1284.      */
  1285.     getItemId : function(){
  1286.         return this.itemId || this.getId();
  1287.     },
  1288.     /**
  1289.      * Try to focus this component.
  1290.      * @param {Boolean} selectText (optional) If applicable, true to also select the text in this component
  1291.      * @param {Boolean/Number} delay (optional) Delay the focus this number of milliseconds (true for 10 milliseconds)
  1292.      * @return {Ext.Component} this
  1293.      */
  1294.     focus : function(selectText, delay){
  1295.         if(delay){
  1296.             this.focus.defer(Ext.isNumber(delay) ? delay : 10, this, [selectText, false]);
  1297.             return;
  1298.         }
  1299.         if(this.rendered){
  1300.             this.el.focus();
  1301.             if(selectText === true){
  1302.                 this.el.dom.select();
  1303.             }
  1304.         }
  1305.         return this;
  1306.     },
  1307.     // private
  1308.     blur : function(){
  1309.         if(this.rendered){
  1310.             this.el.blur();
  1311.         }
  1312.         return this;
  1313.     },
  1314.     /**
  1315.      * Disable this component and fire the 'disable' event.
  1316.      * @return {Ext.Component} this
  1317.      */
  1318.     disable : function(/* private */ silent){
  1319.         if(this.rendered){
  1320.             this.onDisable();
  1321.         }
  1322.         this.disabled = true;
  1323.         if(silent !== true){
  1324.             this.fireEvent('disable', this);
  1325.         }
  1326.         return this;
  1327.     },
  1328.     // private
  1329.     onDisable : function(){
  1330.         this.getActionEl().addClass(this.disabledClass);
  1331.         this.el.dom.disabled = true;
  1332.     },
  1333.     /**
  1334.      * Enable this component and fire the 'enable' event.
  1335.      * @return {Ext.Component} this
  1336.      */
  1337.     enable : function(){
  1338.         if(this.rendered){
  1339.             this.onEnable();
  1340.         }
  1341.         this.disabled = false;
  1342.         this.fireEvent('enable', this);
  1343.         return this;
  1344.     },
  1345.     // private
  1346.     onEnable : function(){
  1347.         this.getActionEl().removeClass(this.disabledClass);
  1348.         this.el.dom.disabled = false;
  1349.     },
  1350.     /**
  1351.      * Convenience function for setting disabled/enabled by boolean.
  1352.      * @param {Boolean} disabled
  1353.      * @return {Ext.Component} this
  1354.      */
  1355.     setDisabled : function(disabled){
  1356.         return this[disabled ? 'disable' : 'enable']();
  1357.     },
  1358.     /**
  1359.      * Show this component.  Listen to the '{@link #beforeshow}' event and return
  1360.      * <tt>false</tt> to cancel showing the component.  Fires the '{@link #show}'
  1361.      * event after showing the component.
  1362.      * @return {Ext.Component} this
  1363.      */
  1364.     show : function(){
  1365.         if(this.fireEvent('beforeshow', this) !== false){
  1366.             this.hidden = false;
  1367.             if(this.autoRender){
  1368.                 this.render(Ext.isBoolean(this.autoRender) ? Ext.getBody() : this.autoRender);
  1369.             }
  1370.             if(this.rendered){
  1371.                 this.onShow();
  1372.             }
  1373.             this.fireEvent('show', this);
  1374.         }
  1375.         return this;
  1376.     },
  1377.     // private
  1378.     onShow : function(){
  1379.         this.getVisibilityEl().removeClass('x-hide-' + this.hideMode);
  1380.     },
  1381.     /**
  1382.      * Hide this component.  Listen to the '{@link #beforehide}' event and return
  1383.      * <tt>false</tt> to cancel hiding the component.  Fires the '{@link #hide}'
  1384.      * event after hiding the component. Note this method is called internally if
  1385.      * the component is configured to be <code>{@link #hidden}</code>.
  1386.      * @return {Ext.Component} this
  1387.      */
  1388.     hide : function(){
  1389.         if(this.fireEvent('beforehide', this) !== false){
  1390.             this.doHide();
  1391.             this.fireEvent('hide', this);
  1392.         }
  1393.         return this;
  1394.     },
  1395.     // private
  1396.     doHide: function(){
  1397.         this.hidden = true;
  1398.         if(this.rendered){
  1399.             this.onHide();
  1400.         }
  1401.     },
  1402.     // private
  1403.     onHide : function(){
  1404.         this.getVisibilityEl().addClass('x-hide-' + this.hideMode);
  1405.     },
  1406.     // private
  1407.     getVisibilityEl : function(){
  1408.         return this.hideParent ? this.container : this.getActionEl();
  1409.     },
  1410.     /**
  1411.      * Convenience function to hide or show this component by boolean.
  1412.      * @param {Boolean} visible True to show, false to hide
  1413.      * @return {Ext.Component} this
  1414.      */
  1415.     setVisible : function(visible){
  1416.         return this[visible ? 'show' : 'hide']();
  1417.     },
  1418.     /**
  1419.      * Returns true if this component is visible.
  1420.      * @return {Boolean} True if this component is visible, false otherwise.
  1421.      */
  1422.     isVisible : function(){
  1423.         return this.rendered && this.getVisibilityEl().isVisible();
  1424.     },
  1425.     /**
  1426.      * Clone the current component using the original config values passed into this instance by default.
  1427.      * @param {Object} overrides A new config containing any properties to override in the cloned version.
  1428.      * An id property can be passed on this object, otherwise one will be generated to avoid duplicates.
  1429.      * @return {Ext.Component} clone The cloned copy of this component
  1430.      */
  1431.     cloneConfig : function(overrides){
  1432.         overrides = overrides || {};
  1433.         var id = overrides.id || Ext.id();
  1434.         var cfg = Ext.applyIf(overrides, this.initialConfig);
  1435.         cfg.id = id; // prevent dup id
  1436.         return new this.constructor(cfg);
  1437.     },
  1438.     /**
  1439.      * Gets the xtype for this component as registered with {@link Ext.ComponentMgr}. For a list of all
  1440.      * available xtypes, see the {@link Ext.Component} header. Example usage:
  1441.      * <pre><code>
  1442. var t = new Ext.form.TextField();
  1443. alert(t.getXType());  // alerts 'textfield'
  1444. </code></pre>
  1445.      * @return {String} The xtype
  1446.      */
  1447.     getXType : function(){
  1448.         return this.constructor.xtype;
  1449.     },
  1450.     /**
  1451.      * <p>Tests whether or not this Component is of a specific xtype. This can test whether this Component is descended
  1452.      * from the xtype (default) or whether it is directly of the xtype specified (shallow = true).</p>
  1453.      * <p><b>If using your own subclasses, be aware that a Component must register its own xtype
  1454.      * to participate in determination of inherited xtypes.</b></p>
  1455.      * <p>For a list of all available xtypes, see the {@link Ext.Component} header.</p>
  1456.      * <p>Example usage:</p>
  1457.      * <pre><code>
  1458. var t = new Ext.form.TextField();
  1459. var isText = t.isXType('textfield');        // true
  1460. var isBoxSubclass = t.isXType('box');       // true, descended from BoxComponent
  1461. var isBoxInstance = t.isXType('box', true); // false, not a direct BoxComponent instance
  1462. </code></pre>
  1463.      * @param {String} xtype The xtype to check for this Component
  1464.      * @param {Boolean} shallow (optional) False to check whether this Component is descended from the xtype (this is
  1465.      * the default), or true to check whether this Component is directly of the specified xtype.
  1466.      * @return {Boolean} True if this component descends from the specified xtype, false otherwise.
  1467.      */
  1468.     isXType : function(xtype, shallow){
  1469.         //assume a string by default
  1470.         if (Ext.isFunction(xtype)){
  1471.             xtype = xtype.xtype; //handle being passed the class, e.g. Ext.Component
  1472.         }else if (Ext.isObject(xtype)){
  1473.             xtype = xtype.constructor.xtype; //handle being passed an instance
  1474.         }
  1475.         return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : this.constructor.xtype == xtype;
  1476.     },
  1477.     /**
  1478.      * <p>Returns this Component's xtype hierarchy as a slash-delimited string. For a list of all
  1479.      * available xtypes, see the {@link Ext.Component} header.</p>
  1480.      * <p><b>If using your own subclasses, be aware that a Component must register its own xtype
  1481.      * to participate in determination of inherited xtypes.</b></p>
  1482.      * <p>Example usage:</p>
  1483.      * <pre><code>
  1484. var t = new Ext.form.TextField();
  1485. alert(t.getXTypes());  // alerts 'component/box/field/textfield'
  1486. </code></pre>
  1487.      * @return {String} The xtype hierarchy string
  1488.      */
  1489.     getXTypes : function(){
  1490.         var tc = this.constructor;
  1491.         if(!tc.xtypes){
  1492.             var c = [], sc = this;
  1493.             while(sc && sc.constructor.xtype){
  1494.                 c.unshift(sc.constructor.xtype);
  1495.                 sc = sc.constructor.superclass;
  1496.             }
  1497.             tc.xtypeChain = c;
  1498.             tc.xtypes = c.join('/');
  1499.         }
  1500.         return tc.xtypes;
  1501.     },
  1502.     /**
  1503.      * Find a container above this component at any level by a custom function. If the passed function returns
  1504.      * true, the container will be returned.
  1505.      * @param {Function} fn The custom function to call with the arguments (container, this component).
  1506.      * @return {Ext.Container} The first Container for which the custom function returns true
  1507.      */
  1508.     findParentBy : function(fn) {
  1509.         for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);
  1510.         return p || null;
  1511.     },
  1512.     /**
  1513.      * Find a container above this component at any level by xtype or class
  1514.      * @param {String/Class} xtype The xtype string for a component, or the class of the component directly
  1515.      * @return {Ext.Container} The first Container which matches the given xtype or class
  1516.      */
  1517.     findParentByType : function(xtype) {
  1518.         return Ext.isFunction(xtype) ?
  1519.             this.findParentBy(function(p){
  1520.                 return p.constructor === xtype;
  1521.             }) :
  1522.             this.findParentBy(function(p){
  1523.                 return p.constructor.xtype === xtype;
  1524.             });
  1525.     },
  1526.     // protected
  1527.     getPositionEl : function(){
  1528.         return this.positionEl || this.el;
  1529.     },
  1530.     // private
  1531.     purgeListeners : function(){
  1532.         Ext.Component.superclass.purgeListeners.call(this);
  1533.         if(this.mons){
  1534.             this.on('beforedestroy', this.clearMons, this, {single: true});
  1535.         }
  1536.     },
  1537.     // private
  1538.     clearMons : function(){
  1539.         Ext.each(this.mons, function(m){
  1540.             m.item.un(m.ename, m.fn, m.scope);
  1541.         }, this);
  1542.         this.mons = [];
  1543.     },
  1544.     // private
  1545.     createMons: function(){
  1546.         if(!this.mons){
  1547.             this.mons = [];
  1548.             this.on('beforedestroy', this.clearMons, this, {single: true});
  1549.         }
  1550.     },
  1551.     /**
  1552.      * <p>Adds listeners to any Observable object (or Elements) which are automatically removed when this Component
  1553.      * is destroyed. Usage:</p><code><pre>
  1554. myGridPanel.mon(myGridPanel.getSelectionModel(), 'selectionchange', handleSelectionChange, null, {buffer: 50});
  1555. </pre></code>
  1556.      * <p>or:</p><code><pre>
  1557. myGridPanel.mon(myGridPanel.getSelectionModel(), {
  1558.     selectionchange: handleSelectionChange,
  1559.     buffer: 50
  1560. });
  1561. </pre></code>
  1562.      * @param {Observable|Element} item The item to which to add a listener/listeners.
  1563.      * @param {Object|String} ename The event name, or an object containing event name properties.
  1564.      * @param {Function} fn Optional. If the <code>ename</code> parameter was an event name, this
  1565.      * is the handler function.
  1566.      * @param {Object} scope Optional. If the <code>ename</code> parameter was an event name, this
  1567.      * is the scope (<code>this</code> reference) in which the handler function is executed.
  1568.      * @param {Object} opt Optional. If the <code>ename</code> parameter was an event name, this
  1569.      * is the {@link Ext.util.Observable#addListener addListener} options.
  1570.      */
  1571.     mon : function(item, ename, fn, scope, opt){
  1572.         this.createMons();
  1573.         if(Ext.isObject(ename)){
  1574.             var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
  1575.             var o = ename;
  1576.             for(var e in o){
  1577.                 if(propRe.test(e)){
  1578.                     continue;
  1579.                 }
  1580.                 if(Ext.isFunction(o[e])){
  1581.                     // shared options
  1582.                     this.mons.push({
  1583.                         item: item, ename: e, fn: o[e], scope: o.scope
  1584.                     });
  1585.                     item.on(e, o[e], o.scope, o);
  1586.                 }else{
  1587.                     // individual options
  1588.                     this.mons.push({
  1589.                         item: item, ename: e, fn: o[e], scope: o.scope
  1590.                     });
  1591.                     item.on(e, o[e]);
  1592.                 }
  1593.             }
  1594.             return;
  1595.         }
  1596.         this.mons.push({
  1597.             item: item, ename: ename, fn: fn, scope: scope
  1598.         });
  1599.         item.on(ename, fn, scope, opt);
  1600.     },
  1601.     /**
  1602.      * Removes listeners that were added by the {@link #mon} method.
  1603.      * @param {Observable|Element} item The item from which to remove a listener/listeners.
  1604.      * @param {Object|String} ename The event name, or an object containing event name properties.
  1605.      * @param {Function} fn Optional. If the <code>ename</code> parameter was an event name, this
  1606.      * is the handler function.
  1607.      * @param {Object} scope Optional. If the <code>ename</code> parameter was an event name, this
  1608.      * is the scope (<code>this</code> reference) in which the handler function is executed.
  1609.      */
  1610.     mun : function(item, ename, fn, scope){
  1611.         var found, mon;
  1612.         this.createMons();
  1613.         for(var i = 0, len = this.mons.length; i < len; ++i){
  1614.             mon = this.mons[i];
  1615.             if(item === mon.item && ename == mon.ename && fn === mon.fn && scope === mon.scope){
  1616.                 this.mons.splice(i, 1);
  1617.                 item.un(ename, fn, scope);
  1618.                 found = true;
  1619.                 break;
  1620.             }
  1621.         }
  1622.         return found;
  1623.     },
  1624.     /**
  1625.      * Returns the next component in the owning container
  1626.      * @return Ext.Component
  1627.      */
  1628.     nextSibling : function(){
  1629.         if(this.ownerCt){
  1630.             var index = this.ownerCt.items.indexOf(this);
  1631.             if(index != -1 && index+1 < this.ownerCt.items.getCount()){
  1632.                 return this.ownerCt.items.itemAt(index+1);
  1633.             }
  1634.         }
  1635.         return null;
  1636.     },
  1637.     /**
  1638.      * Returns the previous component in the owning container
  1639.      * @return Ext.Component
  1640.      */
  1641.     previousSibling : function(){
  1642.         if(this.ownerCt){
  1643.             var index = this.ownerCt.items.indexOf(this);
  1644.             if(index > 0){
  1645.                 return this.ownerCt.items.itemAt(index-1);
  1646.             }
  1647.         }
  1648.         return null;
  1649.     },
  1650.     /**
  1651.      * Provides the link for Observable's fireEvent method to bubble up the ownership hierarchy.
  1652.      * @return {Ext.Container} the Container which owns this Component.
  1653.      */
  1654.     getBubbleTarget : function(){
  1655.         return this.ownerCt;
  1656.     }
  1657. });
  1658. Ext.reg('component', Ext.Component);