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

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.Panel
  9.  * @extends Ext.Container
  10.  * <p>Panel is a container that has specific functionality and structural components that make
  11.  * it the perfect building block for application-oriented user interfaces.</p>
  12.  * <p>Panels are, by virtue of their inheritance from {@link Ext.Container}, capable
  13.  * of being configured with a {@link Ext.Container#layout layout}, and containing child Components.</p>
  14.  * <p>When either specifying child {@link Ext.Component#items items} of a Panel, or dynamically {@link Ext.Container#add adding} Components
  15.  * to a Panel, remember to consider how you wish the Panel to arrange those child elements, and whether
  16.  * those child elements need to be sized using one of Ext's built-in <code><b>{@link Ext.Container#layout layout}</b></code> schemes. By
  17.  * default, Panels use the {@link Ext.layout.ContainerLayout ContainerLayout} scheme. This simply renders
  18.  * child components, appending them one after the other inside the Container, and <b>does not apply any sizing</b>
  19.  * at all.</p>
  20.  * <p>A Panel may also contain {@link #bbar bottom} and {@link #tbar top} toolbars, along with separate
  21.  * {@link #header}, {@link #footer} and {@link #body} sections (see {@link #frame} for additional
  22.  * information).</p>
  23.  * <p>Panel also provides built-in {@link #collapsible expandable and collapsible behavior}, along with
  24.  * a variety of {@link #tools prebuilt tool buttons} that can be wired up to provide other customized
  25.  * behavior.  Panels can be easily dropped into any {@link Ext.Container Container} or layout, and the
  26.  * layout and rendering pipeline is {@link Ext.Container#add completely managed by the framework}.</p>
  27.  * @constructor
  28.  * @param {Object} config The config object
  29.  * @xtype panel
  30.  */
  31. Ext.Panel = Ext.extend(Ext.Container, {
  32.     /**
  33.      * The Panel's header {@link Ext.Element Element}. Read-only.
  34.      * <p>This Element is used to house the {@link #title} and {@link #tools}</p>
  35.      * <br><p><b>Note</b>: see the Note for <code>{@link Ext.Component#el el}</code> also.</p>
  36.      * @type Ext.Element
  37.      * @property header
  38.      */
  39.     /**
  40.      * The Panel's body {@link Ext.Element Element} which may be used to contain HTML content.
  41.      * The content may be specified in the {@link #html} config, or it may be loaded using the
  42.      * {@link autoLoad} config, or through the Panel's {@link #getUpdater Updater}. Read-only.
  43.      * <p>If this is used to load visible HTML elements in either way, then
  44.      * the Panel may not be used as a Layout for hosting nested Panels.</p>
  45.      * <p>If this Panel is intended to be used as the host of a Layout (See {@link #layout}
  46.      * then the body Element must not be loaded or changed - it is under the control
  47.      * of the Panel's Layout.
  48.      * <br><p><b>Note</b>: see the Note for <code>{@link Ext.Component#el el}</code> also.</p>
  49.      * @type Ext.Element
  50.      * @property body
  51.      */
  52.     /**
  53.      * The Panel's bwrap {@link Ext.Element Element} used to contain other Panel elements
  54.      * (tbar, body, bbar, footer). See {@link #bodyCfg}. Read-only.
  55.      * @type Ext.Element
  56.      * @property bwrap
  57.      */
  58.     /**
  59.      * True if this panel is collapsed. Read-only.
  60.      * @type Boolean
  61.      * @property collapsed
  62.      */
  63.     /**
  64.      * @cfg {Object} bodyCfg
  65.      * <p>A {@link Ext.DomHelper DomHelper} element specification object may be specified for any
  66.      * Panel Element.</p>
  67.      * <p>By default, the Default element in the table below will be used for the html markup to
  68.      * create a child element with the commensurate Default class name (<code>baseCls</code> will be
  69.      * replaced by <code>{@link #baseCls}</code>):</p>
  70.      * <pre>
  71.      * Panel      Default  Default             Custom      Additional       Additional
  72.      * Element    element  class               element     class            style
  73.      * ========   ==========================   =========   ==============   ===========
  74.      * {@link #header}     div      {@link #baseCls}+'-header'   {@link #headerCfg}   headerCssClass   headerStyle
  75.      * {@link #bwrap}      div      {@link #baseCls}+'-bwrap'     {@link #bwrapCfg}    bwrapCssClass    bwrapStyle
  76.      * + tbar     div      {@link #baseCls}+'-tbar'       {@link #tbarCfg}     tbarCssClass     tbarStyle
  77.      * + {@link #body}     div      {@link #baseCls}+'-body'       {@link #bodyCfg}     {@link #bodyCssClass}     {@link #bodyStyle}
  78.      * + bbar     div      {@link #baseCls}+'-bbar'       {@link #bbarCfg}     bbarCssClass     bbarStyle
  79.      * + {@link #footer}   div      {@link #baseCls}+'-footer'   {@link #footerCfg}   footerCssClass   footerStyle
  80.      * </pre>
  81.      * <p>Configuring a Custom element may be used, for example, to force the {@link #body} Element
  82.      * to use a different form of markup than is created by default. An example of this might be
  83.      * to {@link Ext.Element#createChild create a child} Panel containing a custom content, such as
  84.      * a header, or forcing centering of all Panel content by having the body be a &lt;center&gt;
  85.      * element:</p>
  86.      * <pre><code>
  87. new Ext.Panel({
  88.     title: 'Message Title',
  89.     renderTo: Ext.getBody(),
  90.     width: 200, height: 130,
  91.     <b>bodyCfg</b>: {
  92.         tag: 'center',
  93.         cls: 'x-panel-body',  // Default class not applied if Custom element specified
  94.         html: 'Message'
  95.     },
  96.     footerCfg: {
  97.         tag: 'h2',
  98.         cls: 'x-panel-footer'        // same as the Default class
  99.         html: 'footer html'
  100.     },
  101.     footerCssClass: 'custom-footer', // additional css class, see {@link Ext.element#addClass addClass}
  102.     footerStyle:    'background-color:red' // see {@link #bodyStyle}
  103. });
  104.      * </code></pre>
  105.      * <p>The example above also explicitly creates a <code>{@link #footer}</code> with custom markup and
  106.      * styling applied.</p>
  107.      */
  108.     /**
  109.      * @cfg {Object} headerCfg
  110.      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure
  111.      * of this Panel's {@link #header} Element.  See <code>{@link #bodyCfg}</code> also.</p>
  112.      */
  113.     /**
  114.      * @cfg {Object} bwrapCfg
  115.      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure
  116.      * of this Panel's {@link #bwrap} Element.  See <code>{@link #bodyCfg}</code> also.</p>
  117.      */
  118.     /**
  119.      * @cfg {Object} tbarCfg
  120.      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure
  121.      * of this Panel's {@link #tbar} Element.  See <code>{@link #bodyCfg}</code> also.</p>
  122.      */
  123.     /**
  124.      * @cfg {Object} bbarCfg
  125.      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure
  126.      * of this Panel's {@link #bbar} Element.  See <code>{@link #bodyCfg}</code> also.</p>
  127.      */
  128.     /**
  129.      * @cfg {Object} footerCfg
  130.      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure
  131.      * of this Panel's {@link #footer} Element.  See <code>{@link #bodyCfg}</code> also.</p>
  132.      */
  133.     /**
  134.      * @cfg {Boolean} closable
  135.      * Panels themselves do not directly support being closed, but some Panel subclasses do (like
  136.      * {@link Ext.Window}) or a Panel Class within an {@link Ext.TabPanel}.  Specify <code>true</code>
  137.      * to enable closing in such situations. Defaults to <code>false</code>.
  138.      */
  139.     /**
  140.      * The Panel's footer {@link Ext.Element Element}. Read-only.
  141.      * <p>This Element is used to house the Panel's <code>{@link #buttons}</code> or <code>{@link #fbar}</code>.</p>
  142.      * <br><p><b>Note</b>: see the Note for <code>{@link Ext.Component#el el}</code> also.</p>
  143.      * @type Ext.Element
  144.      * @property footer
  145.      */
  146.     /**
  147.      * @cfg {Mixed} applyTo
  148.      * <p>The id of the node, a DOM node or an existing Element corresponding to a DIV that is already present in
  149.      * the document that specifies some panel-specific structural markup.  When <code>applyTo</code> is used,
  150.      * constituent parts of the panel can be specified by CSS class name within the main element, and the panel
  151.      * will automatically create those components from that markup. Any required components not specified in the
  152.      * markup will be autogenerated if necessary.</p>
  153.      * <p>The following class names are supported (baseCls will be replaced by {@link #baseCls}):</p>
  154.      * <ul><li>baseCls + '-header'</li>
  155.      * <li>baseCls + '-header-text'</li>
  156.      * <li>baseCls + '-bwrap'</li>
  157.      * <li>baseCls + '-tbar'</li>
  158.      * <li>baseCls + '-body'</li>
  159.      * <li>baseCls + '-bbar'</li>
  160.      * <li>baseCls + '-footer'</li></ul>
  161.      * <p>Using this config, a call to render() is not required.  If applyTo is specified, any value passed for
  162.      * {@link #renderTo} will be ignored and the target element's parent node will automatically be used as the
  163.      * panel's container.</p>
  164.      */
  165.     /**
  166.      * @cfg {Object/Array} tbar
  167.      * <p>The top toolbar of the panel. This can be a {@link Ext.Toolbar} object, a toolbar config, or an array of
  168.      * buttons/button configs to be added to the toolbar.  Note that this is not available as a property after render.
  169.      * To access the top toolbar after render, use {@link #getTopToolbar}.</p>
  170.      * <p><b>Note:</b> Although a Toolbar may contain Field components, these will <b>not</b> be updated by a load
  171.      * of an ancestor FormPanel. A Panel's toolbars are not part of the standard Container->Component hierarchy, and
  172.      * so are not scanned to collect form items. However, the values <b>will</b> be submitted because form
  173.      * submission parameters are collected from the DOM tree.</p>
  174.      */
  175.     /**
  176.      * @cfg {Object/Array} bbar
  177.      * <p>The bottom toolbar of the panel. This can be a {@link Ext.Toolbar} object, a toolbar config, or an array of
  178.      * buttons/button configs to be added to the toolbar.  Note that this is not available as a property after render.
  179.      * To access the bottom toolbar after render, use {@link #getBottomToolbar}.</p>
  180.      * <p><b>Note:</b> Although a Toolbar may contain Field components, these will <b>not</b> be updated by a load
  181.      * of an ancestor FormPanel. A Panel's toolbars are not part of the standard Container->Component hierarchy, and
  182.      * so are not scanned to collect form items. However, the values <b>will</b> be submitted because form
  183.      * submission parameters are collected from the DOM tree.</p>
  184.      */
  185.     /** @cfg {Object/Array} fbar
  186.      * <p>A {@link Ext.Toolbar Toolbar} object, a Toolbar config, or an array of
  187.      * {@link Ext.Button Button}s/{@link Ext.Button Button} configs, describing a {@link Ext.Toolbar Toolbar} to be rendered into this Panel's footer element.</p>
  188.      * <p>After render, the <code>fbar</code> property will be an {@link Ext.Toolbar Toolbar} instance.</p>
  189.      * <p>If <code>{@link #buttons}</code> are specified, they will supersede the <code>fbar</code> configuration property.</p>
  190.      * The Panel's <code>{@link #buttonAlign}</code> configuration affects the layout of these items, for example:
  191.      * <pre><code>
  192. var w = new Ext.Window({
  193.     height: 250,
  194.     width: 500,
  195.     bbar: new Ext.Toolbar({
  196.         items: [{
  197.             text: 'bbar Left'
  198.         },'->',{
  199.             text: 'bbar Right'
  200.         }]
  201.     }),
  202.     {@link #buttonAlign}: 'left', // anything but 'center' or 'right' and you can use '-', and '->'
  203.                                   // to control the alignment of fbar items
  204.     fbar: [{
  205.         text: 'fbar Left'
  206.     },'->',{
  207.         text: 'fbar Right'
  208.     }]
  209. }).show();
  210.      * </code></pre>
  211.      * <p><b>Note:</b> Although a Toolbar may contain Field components, these will <b>not</b> be updated by a load
  212.      * of an ancestor FormPanel. A Panel's toolbars are not part of the standard Container->Component hierarchy, and
  213.      * so are not scanned to collect form items. However, the values <b>will</b> be submitted because form
  214.      * submission parameters are collected from the DOM tree.</p>
  215.      */
  216.     /**
  217.      * @cfg {Boolean} header
  218.      * <code>true</code> to create the Panel's header element explicitly, <code>false</code> to skip creating
  219.      * it.  If a <code>{@link #title}</code> is set the header will be created automatically, otherwise it will not.
  220.      * If a <code>{@link #title}</code> is set but <code>header</code> is explicitly set to <code>false</code>, the header
  221.      * will not be rendered.
  222.      */
  223.     /**
  224.      * @cfg {Boolean} footer
  225.      * <code>true</code> to create the footer element explicitly, false to skip creating it. The footer
  226.      * will be created automatically if <code>{@link #buttons}</code> or a <code>{@link #fbar}</code> have
  227.      * been configured.  See <code>{@link #bodyCfg}</code> for an example.
  228.      */
  229.     /**
  230.      * @cfg {String} title
  231.      * The title text to be used as innerHTML (html tags are accepted) to display in the panel
  232.      * <code>{@link #header}</code> (defaults to ''). When a <code>title</code> is specified the
  233.      * <code>{@link #header}</code> element will automatically be created and displayed unless
  234.      * {@link #header} is explicitly set to <code>false</code>.  If you do not want to specify a
  235.      * <code>title</code> at config time, but you may want one later, you must either specify a non-empty
  236.      * <code>title</code> (a blank space ' ' will do) or <code>header:true</code> so that the container
  237.      * element will get created.
  238.      */
  239.     /**
  240.      * @cfg {Array} buttons
  241.      * <code>buttons</code> will be used as <code>{@link Ext.Container#items items}</code> for the toolbar in
  242.      * the footer (<code>{@link #fbar}</code>). Typically the value of this configuration property will be
  243.      * an array of {@link Ext.Button}s or {@link Ext.Button} configuration objects.
  244.      * If an item is configured with <code>minWidth</code> or the Panel is configured with <code>minButtonWidth</code>,
  245.      * that width will be applied to the item.
  246.      */
  247.     /**
  248.      * @cfg {Object/String/Function} autoLoad
  249.      * A valid url spec according to the Updater {@link Ext.Updater#update} method.
  250.      * If autoLoad is not null, the panel will attempt to load its contents
  251.      * immediately upon render.<p>
  252.      * The URL will become the default URL for this panel's {@link #body} element,
  253.      * so it may be {@link Ext.Element#refresh refresh}ed at any time.</p>
  254.      */
  255.     /**
  256.      * @cfg {Boolean} frame
  257.      * <code>false</code> by default to render with plain 1px square borders. <code>true</code> to render with
  258.      * 9 elements, complete with custom rounded corners (also see {@link Ext.Element#boxWrap}).
  259.      * <p>The template generated for each condition is depicted below:</p><pre><code>
  260.      *
  261. // frame = false
  262. &lt;div id="developer-specified-id-goes-here" class="x-panel">
  263.     &lt;div class="x-panel-header">&lt;span class="x-panel-header-text">Title: (frame:false)&lt;/span>&lt;/div>
  264.     &lt;div class="x-panel-bwrap">
  265.         &lt;div class="x-panel-body">&lt;p>html value goes here&lt;/p>&lt;/div>
  266.     &lt;/div>
  267. &lt;/div>
  268. // frame = true (create 9 elements)
  269. &lt;div id="developer-specified-id-goes-here" class="x-panel">
  270.     &lt;div class="x-panel-tl">&lt;div class="x-panel-tr">&lt;div class="x-panel-tc">
  271.         &lt;div class="x-panel-header">&lt;span class="x-panel-header-text">Title: (frame:true)&lt;/span>&lt;/div>
  272.     &lt;/div>&lt;/div>&lt;/div>
  273.     &lt;div class="x-panel-bwrap">
  274.         &lt;div class="x-panel-ml">&lt;div class="x-panel-mr">&lt;div class="x-panel-mc">
  275.             &lt;div class="x-panel-body">&lt;p>html value goes here&lt;/p>&lt;/div>
  276.         &lt;/div>&lt;/div>&lt;/div>
  277.         &lt;div class="x-panel-bl">&lt;div class="x-panel-br">&lt;div class="x-panel-bc"/>
  278.         &lt;/div>&lt;/div>&lt;/div>
  279. &lt;/div>
  280.      * </code></pre>
  281.      */
  282.     /**
  283.      * @cfg {Boolean} border
  284.      * True to display the borders of the panel's body element, false to hide them (defaults to true).  By default,
  285.      * the border is a 2px wide inset border, but this can be further altered by setting {@link #bodyBorder} to false.
  286.      */
  287.     /**
  288.      * @cfg {Boolean} bodyBorder
  289.      * True to display an interior border on the body element of the panel, false to hide it (defaults to true).
  290.      * This only applies when {@link #border} == true.  If border == true and bodyBorder == false, the border will display
  291.      * as a 1px wide inset border, giving the entire body element an inset appearance.
  292.      */
  293.     /**
  294.      * @cfg {String/Object/Function} bodyCssClass
  295.      * Additional css class selector to be applied to the {@link #body} element in the format expected by
  296.      * {@link Ext.Element#addClass} (defaults to null). See {@link #bodyCfg}.
  297.      */
  298.     /**
  299.      * @cfg {String/Object/Function} bodyStyle
  300.      * Custom CSS styles to be applied to the {@link #body} element in the format expected by
  301.      * {@link Ext.Element#applyStyles} (defaults to null). See {@link #bodyCfg}.
  302.      */
  303.     /**
  304.      * @cfg {String} iconCls
  305.      * The CSS class selector that specifies a background image to be used as the header icon (defaults to '').
  306.      * <p>An example of specifying a custom icon class would be something like:
  307.      * </p><pre><code>
  308. // specify the property in the config for the class:
  309.      ...
  310.      iconCls: 'my-icon'
  311. // css class that specifies background image to be used as the icon image:
  312. .my-icon { background-image: url(../images/my-icon.gif) 0 6px no-repeat !important; }
  313. </code></pre>
  314.      */
  315.     /**
  316.      * @cfg {Boolean} collapsible
  317.      * True to make the panel collapsible and have the expand/collapse toggle button automatically rendered into
  318.      * the header tool button area, false to keep the panel statically sized with no button (defaults to false).
  319.      */
  320.     /**
  321.      * @cfg {Array} tools
  322.      * An array of tool button configs to be added to the header tool area. When rendered, each tool is
  323.      * stored as an {@link Ext.Element Element} referenced by a public property called <code><b></b>tools.<i>&lt;tool-type&gt;</i></code>
  324.      * <p>Each tool config may contain the following properties:
  325.      * <div class="mdetail-params"><ul>
  326.      * <li><b>id</b> : String<div class="sub-desc"><b>Required.</b> The type
  327.      * of tool to create. By default, this assigns a CSS class of the form <code>x-tool-<i>&lt;tool-type&gt;</i></code> to the
  328.      * resulting tool Element. Ext provides CSS rules, and an icon sprite containing images for the tool types listed below.
  329.      * The developer may implement custom tools by supplying alternate CSS rules and background images:
  330.      * <ul>
  331.      * <div class="x-tool x-tool-toggle" style="float:left; margin-right:5;"> </div><div><code> toggle</code> (Created by default when {@link #collapsible} is <code>true</code>)</div>
  332.      * <div class="x-tool x-tool-close" style="float:left; margin-right:5;"> </div><div><code> close</code></div>
  333.      * <div class="x-tool x-tool-minimize" style="float:left; margin-right:5;"> </div><div><code> minimize</code></div>
  334.      * <div class="x-tool x-tool-maximize" style="float:left; margin-right:5;"> </div><div><code> maximize</code></div>
  335.      * <div class="x-tool x-tool-restore" style="float:left; margin-right:5;"> </div><div><code> restore</code></div>
  336.      * <div class="x-tool x-tool-gear" style="float:left; margin-right:5;"> </div><div><code> gear</code></div>
  337.      * <div class="x-tool x-tool-pin" style="float:left; margin-right:5;"> </div><div><code> pin</code></div>
  338.      * <div class="x-tool x-tool-unpin" style="float:left; margin-right:5;"> </div><div><code> unpin</code></div>
  339.      * <div class="x-tool x-tool-right" style="float:left; margin-right:5;"> </div><div><code> right</code></div>
  340.      * <div class="x-tool x-tool-left" style="float:left; margin-right:5;"> </div><div><code> left</code></div>
  341.      * <div class="x-tool x-tool-up" style="float:left; margin-right:5;"> </div><div><code> up</code></div>
  342.      * <div class="x-tool x-tool-down" style="float:left; margin-right:5;"> </div><div><code> down</code></div>
  343.      * <div class="x-tool x-tool-refresh" style="float:left; margin-right:5;"> </div><div><code> refresh</code></div>
  344.      * <div class="x-tool x-tool-minus" style="float:left; margin-right:5;"> </div><div><code> minus</code></div>
  345.      * <div class="x-tool x-tool-plus" style="float:left; margin-right:5;"> </div><div><code> plus</code></div>
  346.      * <div class="x-tool x-tool-help" style="float:left; margin-right:5;"> </div><div><code> help</code></div>
  347.      * <div class="x-tool x-tool-search" style="float:left; margin-right:5;"> </div><div><code> search</code></div>
  348.      * <div class="x-tool x-tool-save" style="float:left; margin-right:5;"> </div><div><code> save</code></div>
  349.      * <div class="x-tool x-tool-print" style="float:left; margin-right:5;"> </div><div><code> print</code></div>
  350.      * </ul></div></li>
  351.      * <li><b>handler</b> : Function<div class="sub-desc"><b>Required.</b> The function to
  352.      * call when clicked. Arguments passed are:<ul>
  353.      * <li><b>event</b> : Ext.EventObject<div class="sub-desc">The click event.</div></li>
  354.      * <li><b>toolEl</b> : Ext.Element<div class="sub-desc">The tool Element.</div></li>
  355.      * <li><b>panel</b> : Ext.Panel<div class="sub-desc">The host Panel</div></li>
  356.      * <li><b>tc</b> : Object<div class="sub-desc">The tool configuration object</div></li>
  357.      * </ul></div></li>
  358.      * <li><b>stopEvent</b> : Boolean<div class="sub-desc">Defaults to true. Specify as false to allow click event to propagate.</div></li>
  359.      * <li><b>scope</b> : Object<div class="sub-desc">The scope in which to call the handler.</div></li>
  360.      * <li><b>qtip</b> : String/Object<div class="sub-desc">A tip string, or
  361.      * a config argument to {@link Ext.QuickTip#register}</div></li>
  362.      * <li><b>hidden</b> : Boolean<div class="sub-desc">True to initially render hidden.</div></li>
  363.      * <li><b>on</b> : Object<div class="sub-desc">A listener config object specifiying
  364.      * event listeners in the format of an argument to {@link #addListener}</div></li>
  365.      * </ul></div>
  366.      * <p>Note that, apart from the toggle tool which is provided when a panel is collapsible, these
  367.      * tools only provide the visual button. Any required functionality must be provided by adding
  368.      * handlers that implement the necessary behavior.</p>
  369.      * <p>Example usage:</p>
  370.      * <pre><code>
  371. tools:[{
  372.     id:'refresh',
  373.     qtip: 'Refresh form Data',
  374.     // hidden:true,
  375.     handler: function(event, toolEl, panel){
  376.         // refresh logic
  377.     }
  378. },
  379. {
  380.     id:'help',
  381.     qtip: 'Get Help',
  382.     handler: function(event, toolEl, panel){
  383.         // whatever
  384.     }
  385. }]
  386. </code></pre>
  387.      * <p>For the custom id of <code>'help'</code> define two relevant css classes with a link to
  388.      * a 15x15 image:</p>
  389.      * <pre><code>
  390. .x-tool-help {background-image: url(images/help.png);}
  391. .x-tool-help-over {background-image: url(images/help_over.png);}
  392. // if using an image sprite:
  393. .x-tool-help {background-image: url(images/help.png) no-repeat 0 0;}
  394. .x-tool-help-over {background-position:-15px 0;}
  395. </code></pre>
  396.      */
  397.     /**
  398.      * @cfg {Ext.Template/Ext.XTemplate} toolTemplate
  399.      * <p>A Template used to create {@link #tools} in the {@link #header} Element. Defaults to:</p><pre><code>
  400. new Ext.Template('&lt;div class="x-tool x-tool-{id}">&amp;#160;&lt;/div>')</code></pre>
  401.      * <p>This may may be overridden to provide a custom DOM structure for tools based upon a more
  402.      * complex XTemplate. The template's data is a single tool configuration object (Not the entire Array)
  403.      * as specified in {@link #tools}.  In the following example an &lt;a> tag is used to provide a
  404.      * visual indication when hovering over the tool:</p><pre><code>
  405. var win = new Ext.Window({
  406.     tools: [{
  407.         id: 'download',
  408.         href: '/MyPdfDoc.pdf'
  409.     }],
  410.     toolTemplate: new Ext.XTemplate(
  411.         '&lt;tpl if="id=='download'">',
  412.             '&lt;a class="x-tool x-tool-pdf" href="{href}">&lt;/a>',
  413.         '&lt;/tpl>',
  414.         '&lt;tpl if="id!='download'">',
  415.             '&lt;div class="x-tool x-tool-{id}">&amp;#160;&lt;/div>',
  416.         '&lt;/tpl>'
  417.     ),
  418.     width:500,
  419.     height:300,
  420.     closeAction:'hide'
  421. });</code></pre>
  422.      * <p>Note that the CSS class 'x-tool-pdf' should have an associated style rule which provides an
  423.      * appropriate background image, something like:</p>
  424.     <pre><code>
  425.     a.x-tool-pdf {background-image: url(../shared/extjs/images/pdf.gif)!important;}
  426.     </code></pre>
  427.      */
  428.     /**
  429.      * @cfg {Boolean} hideCollapseTool
  430.      * <code>true</code> to hide the expand/collapse toggle button when <code>{@link #collapsible} == true</code>,
  431.      * <code>false</code> to display it (defaults to <code>false</code>).
  432.      */
  433.     /**
  434.      * @cfg {Boolean} titleCollapse
  435.      * <code>true</code> to allow expanding and collapsing the panel (when <code>{@link #collapsible} = true</code>)
  436.      * by clicking anywhere in the header bar, <code>false</code>) to allow it only by clicking to tool button
  437.      * (defaults to <code>false</code>)). If this panel is a child item of a border layout also see the
  438.      * {@link Ext.layout.BorderLayout.Region BorderLayout.Region}
  439.      * <code>{@link Ext.layout.BorderLayout.Region#floatable floatable}</code> config option.
  440.      */
  441.     /**
  442.      * @cfg {Mixed} floating
  443.      * <p>This property is used to configure the underlying {@link Ext.Layer}. Acceptable values for this
  444.      * configuration property are:</p><div class="mdetail-params"><ul>
  445.      * <li><b><code>false</code></b> : <b>Default.</b><div class="sub-desc">Display the panel inline where it is
  446.      * rendered.</div></li>
  447.      * <li><b><code>true</code></b> : <div class="sub-desc">Float the panel (absolute position it with automatic
  448.      * shimming and shadow).<ul>
  449.      * <div class="sub-desc">Setting floating to true will create an Ext.Layer for this panel and display the
  450.      * panel at negative offsets so that it is hidden.</div>
  451.      * <div class="sub-desc">Since the panel will be absolute positioned, the position must be set explicitly
  452.      * <i>after</i> render (e.g., <code>myPanel.setPosition(100,100);</code>).</div>
  453.      * <div class="sub-desc"><b>Note</b>: when floating a panel you should always assign a fixed width,
  454.      * otherwise it will be auto width and will expand to fill to the right edge of the viewport.</div>
  455.      * </ul></div></li>
  456.      * <li><b><code>{@link Ext.Layer object}</code></b> : <div class="sub-desc">The specified object will be used
  457.      * as the configuration object for the {@link Ext.Layer} that will be created.</div></li>
  458.      * </ul></div>
  459.      */
  460.     /**
  461.      * @cfg {Boolean/String} shadow
  462.      * <code>true</code> (or a valid Ext.Shadow {@link Ext.Shadow#mode} value) to display a shadow behind the
  463.      * panel, <code>false</code> to display no shadow (defaults to <code>'sides'</code>).  Note that this option
  464.      * only applies when <code>{@link #floating} = true</code>.
  465.      */
  466.     /**
  467.      * @cfg {Number} shadowOffset
  468.      * The number of pixels to offset the shadow if displayed (defaults to <code>4</code>). Note that this
  469.      * option only applies when <code>{@link #floating} = true</code>.
  470.      */
  471.     /**
  472.      * @cfg {Boolean} shim
  473.      * <code>false</code> to disable the iframe shim in browsers which need one (defaults to <code>true</code>).
  474.      * Note that this option only applies when <code>{@link #floating} = true</code>.
  475.      */
  476.     /**
  477.      * @cfg {Object/Array} keys
  478.      * A {@link Ext.KeyMap} config object (in the format expected by {@link Ext.KeyMap#addBinding}
  479.      * used to assign custom key handling to this panel (defaults to <code>null</code>).
  480.      */
  481.     /**
  482.      * @cfg {Boolean/Object} draggable
  483.      * <p><code>true</code> to enable dragging of this Panel (defaults to <code>false</code>).</p>
  484.      * <p>For custom drag/drop implementations, an <b>Ext.Panel.DD</b> config could also be passed
  485.      * in this config instead of <code>true</code>. Ext.Panel.DD is an internal, undocumented class which
  486.      * moves a proxy Element around in place of the Panel's element, but provides no other behaviour
  487.      * during dragging or on drop. It is a subclass of {@link Ext.dd.DragSource}, so behaviour may be
  488.      * added by implementing the interface methods of {@link Ext.dd.DragDrop} e.g.:
  489.      * <pre><code>
  490. new Ext.Panel({
  491.     title: 'Drag me',
  492.     x: 100,
  493.     y: 100,
  494.     renderTo: Ext.getBody(),
  495.     floating: true,
  496.     frame: true,
  497.     width: 400,
  498.     height: 200,
  499.     draggable: {
  500. //      Config option of Ext.Panel.DD class.
  501. //      It&#39;s a floating Panel, so do not show a placeholder proxy in the original position.
  502.         insertProxy: false,
  503. //      Called for each mousemove event while dragging the DD object.
  504.         onDrag : function(e){
  505. //          Record the x,y position of the drag proxy so that we can
  506. //          position the Panel at end of drag.
  507.             var pel = this.proxy.getEl();
  508.             this.x = pel.getLeft(true);
  509.             this.y = pel.getTop(true);
  510. //          Keep the Shadow aligned if there is one.
  511.             var s = this.panel.getEl().shadow;
  512.             if (s) {
  513.                 s.realign(this.x, this.y, pel.getWidth(), pel.getHeight());
  514.             }
  515.         },
  516. //      Called on the mouseup event.
  517.         endDrag : function(e){
  518.             this.panel.setPosition(this.x, this.y);
  519.         }
  520.     }
  521. }).show();
  522. </code></pre>
  523.      */
  524.     /**
  525.      * @cfg {Boolean} disabled
  526.      * Render this panel disabled (default is <code>false</code>). An important note when using the disabled
  527.      * config on panels is that IE will often fail to initialize the disabled mask element correectly if
  528.      * the panel's layout has not yet completed by the time the Panel is disabled during the render process.
  529.      * If you experience this issue, you may need to instead use the {@link #afterlayout} event to initialize
  530.      * the disabled state:
  531.      * <pre><code>
  532. new Ext.Panel({
  533.     ...
  534.     listeners: {
  535.         'afterlayout': {
  536.             fn: function(p){
  537.                 p.disable();
  538.             },
  539.             single: true // important, as many layouts can occur
  540.         }
  541.     }
  542. });
  543. </code></pre>
  544.      */
  545.     /**
  546.      * @cfg {Boolean} autoHeight
  547.      * <code>true</code> to use height:'auto', <code>false</code> to use fixed height (defaults to <code>false</code>).
  548.      * <b>Note</b>: Setting <code>autoHeight: true</code> means that the browser will manage the panel's height
  549.      * based on its contents, and that Ext will not manage it at all. If the panel is within a layout that
  550.      * manages dimensions (<code>fit</code>, <code>border</code>, etc.) then setting <code>autoHeight: true</code>
  551.      * can cause issues with scrolling and will not generally work as expected since the panel will take
  552.      * on the height of its contents rather than the height required by the Ext layout.
  553.      */
  554.     /**
  555.      * @cfg {String} baseCls
  556.      * The base CSS class to apply to this panel's element (defaults to <code>'x-panel'</code>).
  557.      * <p>Another option available by default is to specify <code>'x-plain'</code> which strips all styling
  558.      * except for required attributes for Ext layouts to function (e.g. overflow:hidden).
  559.      * See <code>{@link #unstyled}</code> also.</p>
  560.      */
  561.     baseCls : 'x-panel',
  562.     /**
  563.      * @cfg {String} collapsedCls
  564.      * A CSS class to add to the panel's element after it has been collapsed (defaults to
  565.      * <code>'x-panel-collapsed'</code>).
  566.      */
  567.     collapsedCls : 'x-panel-collapsed',
  568.     /**
  569.      * @cfg {Boolean} maskDisabled
  570.      * <code>true</code> to mask the panel when it is {@link #disabled}, <code>false</code> to not mask it (defaults
  571.      * to <code>true</code>).  Either way, the panel will always tell its contained elements to disable themselves
  572.      * when it is disabled, but masking the panel can provide an additional visual cue that the panel is
  573.      * disabled.
  574.      */
  575.     maskDisabled : true,
  576.     /**
  577.      * @cfg {Boolean} animCollapse
  578.      * <code>true</code> to animate the transition when the panel is collapsed, <code>false</code> to skip the
  579.      * animation (defaults to <code>true</code> if the {@link Ext.Fx} class is available, otherwise <code>false</code>).
  580.      */
  581.     animCollapse : Ext.enableFx,
  582.     /**
  583.      * @cfg {Boolean} headerAsText
  584.      * <code>true</code> to display the panel <code>{@link #title}</code> in the <code>{@link #header}</code>,
  585.      * <code>false</code> to hide it (defaults to <code>true</code>).
  586.      */
  587.     headerAsText : true,
  588.     /**
  589.      * @cfg {String} buttonAlign
  590.      * The alignment of any {@link #buttons} added to this panel.  Valid values are <code>'right'</code>,
  591.      * <code>'left'</code> and <code>'center'</code> (defaults to <code>'right'</code>).
  592.      */
  593.     buttonAlign : 'right',
  594.     /**
  595.      * @cfg {Boolean} collapsed
  596.      * <code>true</code> to render the panel collapsed, <code>false</code> to render it expanded (defaults to
  597.      * <code>false</code>).
  598.      */
  599.     collapsed : false,
  600.     /**
  601.      * @cfg {Boolean} collapseFirst
  602.      * <code>true</code> to make sure the collapse/expand toggle button always renders first (to the left of)
  603.      * any other tools in the panel's title bar, <code>false</code> to render it last (defaults to <code>true</code>).
  604.      */
  605.     collapseFirst : true,
  606.     /**
  607.      * @cfg {Number} minButtonWidth
  608.      * Minimum width in pixels of all {@link #buttons} in this panel (defaults to <code>75</code>)
  609.      */
  610.     minButtonWidth : 75,
  611.     /**
  612.      * @cfg {Boolean} unstyled
  613.      * Overrides the <code>{@link #baseCls}</code> setting to <code>{@link #baseCls} = 'x-plain'</code> which renders
  614.      * the panel unstyled except for required attributes for Ext layouts to function (e.g. overflow:hidden).
  615.      */
  616.     /**
  617.      * @cfg {String} elements
  618.      * A comma-delimited list of panel elements to initialize when the panel is rendered.  Normally, this list will be
  619.      * generated automatically based on the items added to the panel at config time, but sometimes it might be useful to
  620.      * make sure a structural element is rendered even if not specified at config time (for example, you may want
  621.      * to add a button or toolbar dynamically after the panel has been rendered).  Adding those elements to this
  622.      * list will allocate the required placeholders in the panel when it is rendered.  Valid values are<div class="mdetail-params"><ul>
  623.      * <li><code>header</code></li>
  624.      * <li><code>tbar</code> (top bar)</li>
  625.      * <li><code>body</code></li>
  626.      * <li><code>bbar</code> (bottom bar)</li>
  627.      * <li><code>footer</code></li>
  628.      * </ul></div>
  629.      * Defaults to '<code>body</code>'.
  630.      */
  631.     elements : 'body',
  632.     /**
  633.      * @cfg {Boolean} preventBodyReset
  634.      * Defaults to <code>false</code>.  When set to <code>true</code>, an extra css class <code>'x-panel-normal'</code>
  635.      * will be added to the panel's element, effectively applying css styles suggested by the W3C
  636.      * (see http://www.w3.org/TR/CSS21/sample.html) to the Panel's <b>body</b> element (not the header,
  637.      * footer, etc.).
  638.      */
  639.     preventBodyReset : false,
  640.     /**
  641.      * @cfg {Number/String} padding
  642.      * A shortcut for setting a padding style on the body element. The value can either be
  643.      * a number to be applied to all sides, or a normal css string describing padding.
  644.      * Defaults to <tt>undefined</tt>.
  645.      *
  646.      */
  647.     padding: undefined,
  648.     /** @cfg {String} resizeEvent
  649.      * The event to listen to for resizing in layouts. Defaults to <tt>'bodyresize'</tt>.
  650.      */
  651.     resizeEvent: 'bodyresize',
  652.     // protected - these could be used to customize the behavior of the window,
  653.     // but changing them would not be useful without further mofifications and
  654.     // could lead to unexpected or undesirable results.
  655.     toolTarget : 'header',
  656.     collapseEl : 'bwrap',
  657.     slideAnchor : 't',
  658.     disabledClass : '',
  659.     // private, notify box this class will handle heights
  660.     deferHeight : true,
  661.     // private
  662.     expandDefaults: {
  663.         duration : 0.25
  664.     },
  665.     // private
  666.     collapseDefaults : {
  667.         duration : 0.25
  668.     },
  669.     // private
  670.     initComponent : function(){
  671.         Ext.Panel.superclass.initComponent.call(this);
  672.         this.addEvents(
  673.             /**
  674.              * @event bodyresize
  675.              * Fires after the Panel has been resized.
  676.              * @param {Ext.Panel} p the Panel which has been resized.
  677.              * @param {Number} width The Panel's new width.
  678.              * @param {Number} height The Panel's new height.
  679.              */
  680.             'bodyresize',
  681.             /**
  682.              * @event titlechange
  683.              * Fires after the Panel title has been {@link #title set} or {@link #setTitle changed}.
  684.              * @param {Ext.Panel} p the Panel which has had its title changed.
  685.              * @param {String} The new title.
  686.              */
  687.             'titlechange',
  688.             /**
  689.              * @event iconchange
  690.              * Fires after the Panel icon class has been {@link #iconCls set} or {@link #setIconClass changed}.
  691.              * @param {Ext.Panel} p the Panel which has had its {@link #iconCls icon class} changed.
  692.              * @param {String} The new icon class.
  693.              * @param {String} The old icon class.
  694.              */
  695.             'iconchange',
  696.             /**
  697.              * @event collapse
  698.              * Fires after the Panel has been collapsed.
  699.              * @param {Ext.Panel} p the Panel that has been collapsed.
  700.              */
  701.             'collapse',
  702.             /**
  703.              * @event expand
  704.              * Fires after the Panel has been expanded.
  705.              * @param {Ext.Panel} p The Panel that has been expanded.
  706.              */
  707.             'expand',
  708.             /**
  709.              * @event beforecollapse
  710.              * Fires before the Panel is collapsed.  A handler can return false to cancel the collapse.
  711.              * @param {Ext.Panel} p the Panel being collapsed.
  712.              * @param {Boolean} animate True if the collapse is animated, else false.
  713.              */
  714.             'beforecollapse',
  715.             /**
  716.              * @event beforeexpand
  717.              * Fires before the Panel is expanded.  A handler can return false to cancel the expand.
  718.              * @param {Ext.Panel} p The Panel being expanded.
  719.              * @param {Boolean} animate True if the expand is animated, else false.
  720.              */
  721.             'beforeexpand',
  722.             /**
  723.              * @event beforeclose
  724.              * Fires before the Panel is closed.  Note that Panels do not directly support being closed, but some
  725.              * Panel subclasses do (like {@link Ext.Window}) or a Panel within a Ext.TabPanel.  This event only
  726.              * applies to such subclasses.
  727.              * A handler can return false to cancel the close.
  728.              * @param {Ext.Panel} p The Panel being closed.
  729.              */
  730.             'beforeclose',
  731.             /**
  732.              * @event close
  733.              * Fires after the Panel is closed.  Note that Panels do not directly support being closed, but some
  734.              * Panel subclasses do (like {@link Ext.Window}) or a Panel within a Ext.TabPanel.
  735.              * @param {Ext.Panel} p The Panel that has been closed.
  736.              */
  737.             'close',
  738.             /**
  739.              * @event activate
  740.              * Fires after the Panel has been visually activated.
  741.              * Note that Panels do not directly support being activated, but some Panel subclasses
  742.              * do (like {@link Ext.Window}). Panels which are child Components of a TabPanel fire the
  743.              * activate and deactivate events under the control of the TabPanel.
  744.              * @param {Ext.Panel} p The Panel that has been activated.
  745.              */
  746.             'activate',
  747.             /**
  748.              * @event deactivate
  749.              * Fires after the Panel has been visually deactivated.
  750.              * Note that Panels do not directly support being deactivated, but some Panel subclasses
  751.              * do (like {@link Ext.Window}). Panels which are child Components of a TabPanel fire the
  752.              * activate and deactivate events under the control of the TabPanel.
  753.              * @param {Ext.Panel} p The Panel that has been deactivated.
  754.              */
  755.             'deactivate'
  756.         );
  757.         if(this.unstyled){
  758.             this.baseCls = 'x-plain';
  759.         }
  760.         this.toolbars = [];
  761.         // shortcuts
  762.         if(this.tbar){
  763.             this.elements += ',tbar';
  764.             this.topToolbar = this.createToolbar(this.tbar);
  765.             delete this.tbar;
  766.         }
  767.         if(this.bbar){
  768.             this.elements += ',bbar';
  769.             this.bottomToolbar = this.createToolbar(this.bbar);
  770.             delete this.bbar;
  771.         }
  772.         if(this.header === true){
  773.             this.elements += ',header';
  774.             delete this.header;
  775.         }else if(this.headerCfg || (this.title && this.header !== false)){
  776.             this.elements += ',header';
  777.         }
  778.         if(this.footerCfg || this.footer === true){
  779.             this.elements += ',footer';
  780.             delete this.footer;
  781.         }
  782.         if(this.buttons){
  783.             this.fbar = this.buttons;
  784.             delete this.buttons;
  785.         }
  786.         if(this.fbar){
  787.             this.createFbar(this.fbar);
  788.         }
  789.         if(this.autoLoad){
  790.             this.on('render', this.doAutoLoad, this, {delay:10});
  791.         }
  792.     },
  793.     // private
  794.     createFbar : function(fbar){
  795.         var min = this.minButtonWidth;
  796.         this.elements += ',footer';
  797.         this.fbar = this.createToolbar(fbar, {
  798.             buttonAlign: this.buttonAlign,
  799.             toolbarCls: 'x-panel-fbar',
  800.             enableOverflow: false,
  801.             defaults: function(c){
  802.                 return {
  803.                     minWidth: c.minWidth || min
  804.                 };
  805.             }
  806.         });
  807.         //@compat addButton and buttons could possibly be removed
  808.         //@target 4.0
  809.         /**
  810.          * This Panel's Array of buttons as created from the <code>{@link #buttons}</code>
  811.          * config property. Read only.
  812.          * @type Array
  813.          * @property buttons
  814.          */
  815.         this.fbar.items.each(function(c){
  816.             c.minWidth = c.minWidth || this.minButtonWidth;
  817.         }, this);
  818.         this.buttons = this.fbar.items.items;
  819.     },
  820.     // private
  821.     createToolbar: function(tb, options){
  822.         var result;
  823.         // Convert array to proper toolbar config
  824.         if(Ext.isArray(tb)){
  825.             tb = {
  826.                 items: tb
  827.             };
  828.         }
  829.         result = tb.events ? Ext.apply(tb, options) : this.createComponent(Ext.apply({}, tb, options), 'toolbar');
  830.         result.ownerCt = this;
  831.         result.bufferResize = false;
  832.         this.toolbars.push(result);
  833.         return result;
  834.     },
  835.     // private
  836.     createElement : function(name, pnode){
  837.         if(this[name]){
  838.             pnode.appendChild(this[name].dom);
  839.             return;
  840.         }
  841.         if(name === 'bwrap' || this.elements.indexOf(name) != -1){
  842.             if(this[name+'Cfg']){
  843.                 this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
  844.             }else{
  845.                 var el = document.createElement('div');
  846.                 el.className = this[name+'Cls'];
  847.                 this[name] = Ext.get(pnode.appendChild(el));
  848.             }
  849.             if(this[name+'CssClass']){
  850.                 this[name].addClass(this[name+'CssClass']);
  851.             }
  852.             if(this[name+'Style']){
  853.                 this[name].applyStyles(this[name+'Style']);
  854.             }
  855.         }
  856.     },
  857.     // private
  858.     onRender : function(ct, position){
  859.         Ext.Panel.superclass.onRender.call(this, ct, position);
  860.         this.createClasses();
  861.         var el = this.el,
  862.             d = el.dom,
  863.             bw,
  864.             ts;
  865.         if(this.collapsible && !this.hideCollapseTool){
  866.             this.tools = this.tools ? this.tools.slice(0) : [];
  867.             this.tools[this.collapseFirst?'unshift':'push']({
  868.                 id: 'toggle',
  869.                 handler : this.toggleCollapse,
  870.                 scope: this
  871.             });
  872.         }
  873.         if(this.tools){
  874.             ts = this.tools;
  875.             this.elements += (this.header !== false) ? ',header' : '';
  876.         }
  877.         this.tools = {};
  878.         el.addClass(this.baseCls);
  879.         if(d.firstChild){ // existing markup
  880.             this.header = el.down('.'+this.headerCls);
  881.             this.bwrap = el.down('.'+this.bwrapCls);
  882.             var cp = this.bwrap ? this.bwrap : el;
  883.             this.tbar = cp.down('.'+this.tbarCls);
  884.             this.body = cp.down('.'+this.bodyCls);
  885.             this.bbar = cp.down('.'+this.bbarCls);
  886.             this.footer = cp.down('.'+this.footerCls);
  887.             this.fromMarkup = true;
  888.         }
  889.         if (this.preventBodyReset === true) {
  890.             el.addClass('x-panel-reset');
  891.         }
  892.         if(this.cls){
  893.             el.addClass(this.cls);
  894.         }
  895.         if(this.buttons){
  896.             this.elements += ',footer';
  897.         }
  898.         // This block allows for maximum flexibility and performance when using existing markup
  899.         // framing requires special markup
  900.         if(this.frame){
  901.             el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
  902.             this.createElement('header', d.firstChild.firstChild.firstChild);
  903.             this.createElement('bwrap', d);
  904.             // append the mid and bottom frame to the bwrap
  905.             bw = this.bwrap.dom;
  906.             var ml = d.childNodes[1], bl = d.childNodes[2];
  907.             bw.appendChild(ml);
  908.             bw.appendChild(bl);
  909.             var mc = bw.firstChild.firstChild.firstChild;
  910.             this.createElement('tbar', mc);
  911.             this.createElement('body', mc);
  912.             this.createElement('bbar', mc);
  913.             this.createElement('footer', bw.lastChild.firstChild.firstChild);
  914.             if(!this.footer){
  915.                 this.bwrap.dom.lastChild.className += ' x-panel-nofooter';
  916.             }
  917.             /*
  918.              * Store a reference to this element so:
  919.              * a) We aren't looking it up all the time
  920.              * b) The last element is reported incorrectly when using a loadmask
  921.              */
  922.             this.ft = Ext.get(this.bwrap.dom.lastChild);
  923.             this.mc = Ext.get(mc);
  924.         }else{
  925.             this.createElement('header', d);
  926.             this.createElement('bwrap', d);
  927.             // append the mid and bottom frame to the bwrap
  928.             bw = this.bwrap.dom;
  929.             this.createElement('tbar', bw);
  930.             this.createElement('body', bw);
  931.             this.createElement('bbar', bw);
  932.             this.createElement('footer', bw);
  933.             if(!this.header){
  934.                 this.body.addClass(this.bodyCls + '-noheader');
  935.                 if(this.tbar){
  936.                     this.tbar.addClass(this.tbarCls + '-noheader');
  937.                 }
  938.             }
  939.         }
  940.         if(Ext.isDefined(this.padding)){
  941.             this.body.setStyle('padding', this.body.addUnits(this.padding));
  942.         }
  943.         if(this.border === false){
  944.             this.el.addClass(this.baseCls + '-noborder');
  945.             this.body.addClass(this.bodyCls + '-noborder');
  946.             if(this.header){
  947.                 this.header.addClass(this.headerCls + '-noborder');
  948.             }
  949.             if(this.footer){
  950.                 this.footer.addClass(this.footerCls + '-noborder');
  951.             }
  952.             if(this.tbar){
  953.                 this.tbar.addClass(this.tbarCls + '-noborder');
  954.             }
  955.             if(this.bbar){
  956.                 this.bbar.addClass(this.bbarCls + '-noborder');
  957.             }
  958.         }
  959.         if(this.bodyBorder === false){
  960.            this.body.addClass(this.bodyCls + '-noborder');
  961.         }
  962.         this.bwrap.enableDisplayMode('block');
  963.         if(this.header){
  964.             this.header.unselectable();
  965.             // for tools, we need to wrap any existing header markup
  966.             if(this.headerAsText){
  967.                 this.header.dom.innerHTML =
  968.                     '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
  969.                 if(this.iconCls){
  970.                     this.setIconClass(this.iconCls);
  971.                 }
  972.             }
  973.         }
  974.         if(this.floating){
  975.             this.makeFloating(this.floating);
  976.         }
  977.         if(this.collapsible && this.titleCollapse && this.header){
  978.             this.mon(this.header, 'click', this.toggleCollapse, this);
  979.             this.header.setStyle('cursor', 'pointer');
  980.         }
  981.         if(ts){
  982.             this.addTool.apply(this, ts);
  983.         }
  984.         if(this.fbar){
  985.             this.footer.addClass('x-panel-btns');
  986.             this.fbar.render(this.footer);
  987.             this.footer.createChild({cls:'x-clear'});
  988.         }
  989.         if(this.tbar && this.topToolbar){
  990.             this.topToolbar.render(this.tbar);
  991.         }
  992.         if(this.bbar && this.bottomToolbar){
  993.             this.bottomToolbar.render(this.bbar);
  994.         }
  995.     },
  996.     /**
  997.      * Sets the CSS class that provides the icon image for this panel.  This method will replace any existing
  998.      * icon class if one has already been set and fire the {@link #iconchange} event after completion.
  999.      * @param {String} cls The new CSS class name
  1000.      */
  1001.     setIconClass : function(cls){
  1002.         var old = this.iconCls;
  1003.         this.iconCls = cls;
  1004.         if(this.rendered && this.header){
  1005.             if(this.frame){
  1006.                 this.header.addClass('x-panel-icon');
  1007.                 this.header.replaceClass(old, this.iconCls);
  1008.             }else{
  1009.                 var hd = this.header,
  1010.                     img = hd.child('img.x-panel-inline-icon');
  1011.                 if(img){
  1012.                     Ext.fly(img).replaceClass(old, this.iconCls);
  1013.                 }else{
  1014.                     Ext.DomHelper.insertBefore(hd.dom.firstChild, {
  1015.                         tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls
  1016.                     });
  1017.                  }
  1018.             }
  1019.         }
  1020.         this.fireEvent('iconchange', this, cls, old);
  1021.     },
  1022.     // private
  1023.     makeFloating : function(cfg){
  1024.         this.floating = true;
  1025.         this.el = new Ext.Layer(Ext.apply({}, cfg, {
  1026.             shadow: Ext.isDefined(this.shadow) ? this.shadow : 'sides',
  1027.             shadowOffset: this.shadowOffset,
  1028.             constrain:false,
  1029.             shim: this.shim === false ? false : undefined
  1030.         }), this.el);
  1031.     },
  1032.     /**
  1033.      * Returns the {@link Ext.Toolbar toolbar} from the top (<code>{@link #tbar}</code>) section of the panel.
  1034.      * @return {Ext.Toolbar} The toolbar
  1035.      */
  1036.     getTopToolbar : function(){
  1037.         return this.topToolbar;
  1038.     },
  1039.     /**
  1040.      * Returns the {@link Ext.Toolbar toolbar} from the bottom (<code>{@link #bbar}</code>) section of the panel.
  1041.      * @return {Ext.Toolbar} The toolbar
  1042.      */
  1043.     getBottomToolbar : function(){
  1044.         return this.bottomToolbar;
  1045.     },
  1046.     /**
  1047.      * Adds a button to this panel.  Note that this method must be called prior to rendering.  The preferred
  1048.      * approach is to add buttons via the {@link #buttons} config.
  1049.      * @param {String/Object} config A valid {@link Ext.Button} config.  A string will become the text for a default
  1050.      * button config, an object will be treated as a button config object.
  1051.      * @param {Function} handler The function to be called on button {@link Ext.Button#click}
  1052.      * @param {Object} scope The scope (<code>this</code> reference) in which the button handler function is executed. Defaults to the Button.
  1053.      * @return {Ext.Button} The button that was added
  1054.      */
  1055.     addButton : function(config, handler, scope){
  1056.         if(!this.fbar){
  1057.             this.createFbar([]);
  1058.         }
  1059.         if(handler){
  1060.             if(Ext.isString(config)){
  1061.                 config = {text: config};
  1062.             }
  1063.             config = Ext.apply({
  1064.                 handler: handler,
  1065.                 scope: scope
  1066.             }, config)
  1067.         }
  1068.         return this.fbar.add(config);
  1069.     },
  1070.     // private
  1071.     addTool : function(){
  1072.         if(!this.rendered){
  1073.             if(!this.tools){
  1074.                 this.tools = [];
  1075.             }
  1076.             Ext.each(arguments, function(arg){
  1077.                 this.tools.push(arg)
  1078.             }, this);
  1079.             return;
  1080.         }
  1081.          // nowhere to render tools!
  1082.         if(!this[this.toolTarget]){
  1083.             return;
  1084.         }
  1085.         if(!this.toolTemplate){
  1086.             // initialize the global tool template on first use
  1087.             var tt = new Ext.Template(
  1088.                  '<div class="x-tool x-tool-{id}">&#160;</div>'
  1089.             );
  1090.             tt.disableFormats = true;
  1091.             tt.compile();
  1092.             Ext.Panel.prototype.toolTemplate = tt;
  1093.         }
  1094.         for(var i = 0, a = arguments, len = a.length; i < len; i++) {
  1095.             var tc = a[i];
  1096.             if(!this.tools[tc.id]){
  1097.                 var overCls = 'x-tool-'+tc.id+'-over';
  1098.                 var t = this.toolTemplate.insertFirst((tc.align !== 'left') ? this[this.toolTarget] : this[this.toolTarget].child('span'), tc, true);
  1099.                 this.tools[tc.id] = t;
  1100.                 t.enableDisplayMode('block');
  1101.                 this.mon(t, 'click',  this.createToolHandler(t, tc, overCls, this));
  1102.                 if(tc.on){
  1103.                     this.mon(t, tc.on);
  1104.                 }
  1105.                 if(tc.hidden){
  1106.                     t.hide();
  1107.                 }
  1108.                 if(tc.qtip){
  1109.                     if(Ext.isObject(tc.qtip)){
  1110.                         Ext.QuickTips.register(Ext.apply({
  1111.                               target: t.id
  1112.                         }, tc.qtip));
  1113.                     } else {
  1114.                         t.dom.qtip = tc.qtip;
  1115.                     }
  1116.                 }
  1117.                 t.addClassOnOver(overCls);
  1118.             }
  1119.         }
  1120.     },
  1121.     onLayout : function(shallow, force){
  1122.         if(this.hasLayout && this.toolbars.length > 0){
  1123.             Ext.each(this.toolbars, function(tb){
  1124.                 tb.doLayout(undefined, force);
  1125.             });
  1126.             this.syncHeight();
  1127.         }
  1128.     },
  1129.     syncHeight : function(){
  1130.         var h = this.toolbarHeight,
  1131.                 bd = this.body,
  1132.                 lsh = this.lastSize.height,
  1133.                 sz;
  1134.         if(this.autoHeight || !Ext.isDefined(lsh) || lsh == 'auto'){
  1135.             return;
  1136.         }
  1137.         if(h != this.getToolbarHeight()){
  1138.             h = Math.max(0, this.adjustBodyHeight(lsh - this.getFrameHeight()));
  1139.             bd.setHeight(h);
  1140.             sz = bd.getSize();
  1141.             this.toolbarHeight = this.getToolbarHeight();
  1142.             this.onBodyResize(sz.width, sz.height);
  1143.         }
  1144.     },
  1145.     // private
  1146.     onShow : function(){
  1147.         if(this.floating){
  1148.             return this.el.show();
  1149.         }
  1150.         Ext.Panel.superclass.onShow.call(this);
  1151.     },
  1152.     // private
  1153.     onHide : function(){
  1154.         if(this.floating){
  1155.             return this.el.hide();
  1156.         }
  1157.         Ext.Panel.superclass.onHide.call(this);
  1158.     },
  1159.     // private
  1160.     createToolHandler : function(t, tc, overCls, panel){
  1161.         return function(e){
  1162.             t.removeClass(overCls);
  1163.             if(tc.stopEvent !== false){
  1164.                 e.stopEvent();
  1165.             }
  1166.             if(tc.handler){
  1167.                 tc.handler.call(tc.scope || t, e, t, panel, tc);
  1168.             }
  1169.         };
  1170.     },
  1171.     // private    
  1172.     afterRender : function(){
  1173.         if(this.floating && !this.hidden){
  1174.             this.el.show();
  1175.         }
  1176.         if(this.title){
  1177.             this.setTitle(this.title);
  1178.         }
  1179.         if(this.collapsed){
  1180.             this.collapsed = false;
  1181.             this.collapse(false);
  1182.         }
  1183.         Ext.Panel.superclass.afterRender.call(this); // do sizing calcs last
  1184.         this.initEvents();
  1185.     },    
  1186.     // private
  1187.     getKeyMap : function(){
  1188.         if(!this.keyMap){
  1189.             this.keyMap = new Ext.KeyMap(this.el, this.keys);
  1190.         }
  1191.         return this.keyMap;
  1192.     },
  1193.     // private
  1194.     initEvents : function(){
  1195.         if(this.keys){
  1196.             this.getKeyMap();
  1197.         }
  1198.         if(this.draggable){
  1199.             this.initDraggable();
  1200.         }
  1201.         if(this.toolbars.length > 0){
  1202.             Ext.each(this.toolbars, function(tb){
  1203.                 tb.doLayout();
  1204.                 tb.on({
  1205.                     scope: this,
  1206.                     afterlayout: this.syncHeight,
  1207.                     remove: this.syncHeight
  1208.                 });
  1209.             }, this);
  1210.             if(!this.ownerCt){
  1211.                 this.syncHeight();
  1212.             }
  1213.         }
  1214.     },
  1215.     // private
  1216.     initDraggable : function(){
  1217.         /**
  1218.          * <p>If this Panel is configured {@link #draggable}, this property will contain
  1219.          * an instance of {@link Ext.dd.DragSource} which handles dragging the Panel.</p>
  1220.          * The developer must provide implementations of the abstract methods of {@link Ext.dd.DragSource}
  1221.          * in order to supply behaviour for each stage of the drag/drop process. See {@link #draggable}.
  1222.          * @type Ext.dd.DragSource.
  1223.          * @property dd
  1224.          */
  1225.         this.dd = new Ext.Panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable);
  1226.     },
  1227.     // private
  1228.     beforeEffect : function(anim){
  1229.         if(this.floating){
  1230.             this.el.beforeAction();
  1231.         }
  1232.         if(anim !== false){
  1233.             this.el.addClass('x-panel-animated');
  1234.         }
  1235.     },
  1236.     // private
  1237.     afterEffect : function(anim){
  1238.         this.syncShadow();
  1239.         if(anim !== false){
  1240.             this.el.removeClass('x-panel-animated');
  1241.         }
  1242.     },
  1243.     // private - wraps up an animation param with internal callbacks
  1244.     createEffect : function(a, cb, scope){
  1245.         var o = {
  1246.             scope:scope,
  1247.             block:true
  1248.         };
  1249.         if(a === true){
  1250.             o.callback = cb;
  1251.             return o;
  1252.         }else if(!a.callback){
  1253.             o.callback = cb;
  1254.         }else { // wrap it up
  1255.             o.callback = function(){
  1256.                 cb.call(scope);
  1257.                 Ext.callback(a.callback, a.scope);
  1258.             };
  1259.         }
  1260.         return Ext.applyIf(o, a);
  1261.     },
  1262.     /**
  1263.      * Collapses the panel body so that it becomes hidden.  Fires the {@link #beforecollapse} event which will
  1264.      * cancel the collapse action if it returns false.
  1265.      * @param {Boolean} animate True to animate the transition, else false (defaults to the value of the
  1266.      * {@link #animCollapse} panel config)
  1267.      * @return {Ext.Panel} this
  1268.      */
  1269.     collapse : function(animate){
  1270.         if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
  1271.             return;
  1272.         }
  1273.         var doAnim = animate === true || (animate !== false && this.animCollapse);
  1274.         this.beforeEffect(doAnim);
  1275.         this.onCollapse(doAnim, animate);
  1276.         return this;
  1277.     },
  1278.     // private
  1279.     onCollapse : function(doAnim, animArg){
  1280.         if(doAnim){
  1281.             this[this.collapseEl].slideOut(this.slideAnchor,
  1282.                     Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),
  1283.                         this.collapseDefaults));
  1284.         }else{
  1285.             this[this.collapseEl].hide();
  1286.             this.afterCollapse(false);
  1287.         }
  1288.     },
  1289.     // private
  1290.     afterCollapse : function(anim){
  1291.         this.collapsed = true;
  1292.         this.el.addClass(this.collapsedCls);
  1293.         this.afterEffect(anim);
  1294.         this.fireEvent('collapse', this);
  1295.     },
  1296.     /**
  1297.      * Expands the panel body so that it becomes visible.  Fires the {@link #beforeexpand} event which will
  1298.      * cancel the expand action if it returns false.
  1299.      * @param {Boolean} animate True to animate the transition, else false (defaults to the value of the
  1300.      * {@link #animCollapse} panel config)
  1301.      * @return {Ext.Panel} this
  1302.      */
  1303.     expand : function(animate){
  1304.         if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
  1305.             return;
  1306.         }
  1307.         var doAnim = animate === true || (animate !== false && this.animCollapse);
  1308.         this.el.removeClass(this.collapsedCls);
  1309.         this.beforeEffect(doAnim);
  1310.         this.onExpand(doAnim, animate);
  1311.         return this;
  1312.     },
  1313.     // private
  1314.     onExpand : function(doAnim, animArg){
  1315.         if(doAnim){
  1316.             this[this.collapseEl].slideIn(this.slideAnchor,
  1317.                     Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),
  1318.                         this.expandDefaults));
  1319.         }else{
  1320.             this[this.collapseEl].show();
  1321.             this.afterExpand(false);
  1322.         }
  1323.     },
  1324.     // private
  1325.     afterExpand : function(anim){
  1326.         this.collapsed = false;
  1327.         this.afterEffect(anim);
  1328.         if(Ext.isDefined(this.deferLayout)){
  1329.             this.doLayout(true);
  1330.         }
  1331.         this.fireEvent('expand', this);
  1332.     },
  1333.     /**
  1334.      * Shortcut for performing an {@link #expand} or {@link #collapse} based on the current state of the panel.
  1335.      * @param {Boolean} animate True to animate the transition, else false (defaults to the value of the
  1336.      * {@link #animCollapse} panel config)
  1337.      * @return {Ext.Panel} this
  1338.      */
  1339.     toggleCollapse : function(animate){
  1340.         this[this.collapsed ? 'expand' : 'collapse'](animate);
  1341.         return this;
  1342.     },
  1343.     // private
  1344.     onDisable : function(){
  1345.         if(this.rendered && this.maskDisabled){
  1346.             this.el.mask();
  1347.         }
  1348.         Ext.Panel.superclass.onDisable.call(this);
  1349.     },
  1350.     // private
  1351.     onEnable : function(){
  1352.         if(this.rendered && this.maskDisabled){
  1353.             this.el.unmask();
  1354.         }
  1355.         Ext.Panel.superclass.onEnable.call(this);
  1356.     },
  1357.     // private
  1358.     onResize : function(w, h){
  1359.         if(Ext.isDefined(w) || Ext.isDefined(h)){
  1360.             if(!this.collapsed){
  1361.                 // First, set the the Panel's body width.
  1362.                 // If we have auto-widthed it, get the resulting full offset width so we can size the Toolbars to match
  1363.                 // The Toolbars must not buffer this resize operation because we need to know their heights.
  1364.                 if(Ext.isNumber(w)){
  1365.                     this.body.setWidth(w = this.adjustBodyWidth(w - this.getFrameWidth()));
  1366.                 } else if (w == 'auto') {
  1367.                     w = this.body.setWidth('auto').dom.offsetWidth;
  1368.                 } else {
  1369.                     w = this.body.dom.offsetWidth;
  1370.                 }
  1371.                 if(this.tbar){
  1372.                     this.tbar.setWidth(w);
  1373.                     if(this.topToolbar){
  1374.                         this.topToolbar.setSize(w);
  1375.                     }
  1376.                 }
  1377.                 if(this.bbar){
  1378.                     this.bbar.setWidth(w);
  1379.                     if(this.bottomToolbar){
  1380.                         this.bottomToolbar.setSize(w);
  1381.                         // The bbar does not move on resize without this.
  1382.                         if (Ext.isIE) {
  1383.                             this.bbar.setStyle('position', 'static');
  1384.                             this.bbar.setStyle('position', '');
  1385.                         }
  1386.                     }
  1387.                 }
  1388.                 if(this.footer){
  1389.                     this.footer.setWidth(w);
  1390.                     if(this.fbar){
  1391.                         this.fbar.setSize(Ext.isIE ? (w - this.footer.getFrameWidth('lr')) : 'auto');
  1392.                     }
  1393.                 }
  1394.                 // At this point, the Toolbars must be layed out for getFrameHeight to find a result.
  1395.                 if(Ext.isNumber(h)){
  1396.                     h = Math.max(0, this.adjustBodyHeight(h - this.getFrameHeight()));
  1397.                     this.body.setHeight(h);
  1398.                 }else if(h == 'auto'){
  1399.                     this.body.setHeight(h);
  1400.                 }
  1401.                 if(this.disabled && this.el._mask){
  1402.                     this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());
  1403.                 }
  1404.             }else{
  1405.                 this.queuedBodySize = {width: w, height: h};
  1406.                 if(!this.queuedExpand && this.allowQueuedExpand !== false){
  1407.                     this.queuedExpand = true;
  1408.                     this.on('expand', function(){
  1409.                         delete this.queuedExpand;
  1410.                         this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
  1411.                     }, this, {single:true});
  1412.                 }
  1413.             }
  1414.             this.onBodyResize(w, h);
  1415.         }
  1416.         this.syncShadow();
  1417.         Ext.Panel.superclass.onResize.call(this);
  1418.     },
  1419.     // private
  1420.     onBodyResize: function(w, h){
  1421.         this.fireEvent('bodyresize', this, w, h);
  1422.     },
  1423.     // private
  1424.     getToolbarHeight: function(){
  1425.         var h = 0;
  1426.         if(this.rendered){
  1427.             Ext.each(this.toolbars, function(tb){
  1428.                 h += tb.getHeight();
  1429.             }, this);
  1430.         }
  1431.         return h;
  1432.     },
  1433.     // private
  1434.     adjustBodyHeight : function(h){
  1435.         return h;
  1436.     },
  1437.     // private
  1438.     adjustBodyWidth : function(w){
  1439.         return w;
  1440.     },
  1441.     // private
  1442.     onPosition : function(){
  1443.         this.syncShadow();
  1444.     },
  1445.     /**
  1446.      * Returns the width in pixels of the framing elements of this panel (not including the body width).  To
  1447.      * retrieve the body width see {@link #getInnerWidth}.
  1448.      * @return {Number} The frame width
  1449.      */
  1450.     getFrameWidth : function(){
  1451.         var w = this.el.getFrameWidth('lr') + this.bwrap.getFrameWidth('lr');
  1452.         if(this.frame){
  1453.             var l = this.bwrap.dom.firstChild;
  1454.             w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
  1455.             w += this.mc.getFrameWidth('lr');
  1456.         }
  1457.         return w;
  1458.     },
  1459.     /**
  1460.      * Returns the height in pixels of the framing elements of this panel (including any top and bottom bars and
  1461.      * header and footer elements, but not including the body height).  To retrieve the body height see {@link #getInnerHeight}.
  1462.      * @return {Number} The frame height
  1463.      */
  1464.     getFrameHeight : function(){
  1465.         var h  = this.el.getFrameWidth('tb') + this.bwrap.getFrameWidth('tb');
  1466.         h += (this.tbar ? this.tbar.getHeight() : 0) +
  1467.              (this.bbar ? this.bbar.getHeight() : 0);
  1468.         if(this.frame){
  1469.             h += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight + this.mc.getFrameWidth('tb');
  1470.         }else{
  1471.             h += (this.header ? this.header.getHeight() : 0) +
  1472.                 (this.footer ? this.footer.getHeight() : 0);
  1473.         }
  1474.         return h;
  1475.     },
  1476.     /**
  1477.      * Returns the width in pixels of the body element (not including the width of any framing elements).
  1478.      * For the frame width see {@link #getFrameWidth}.
  1479.      * @return {Number} The body width
  1480.      */
  1481.     getInnerWidth : function(){
  1482.         return this.getSize().width - this.getFrameWidth();
  1483.     },
  1484.     /**
  1485.      * Returns the height in pixels of the body element (not including the height of any framing elements).
  1486.      * For the frame height see {@link #getFrameHeight}.
  1487.      * @return {Number} The body height
  1488.      */
  1489.     getInnerHeight : function(){
  1490.         return this.getSize().height - this.getFrameHeight();
  1491.     },
  1492.     // private
  1493.     syncShadow : function(){
  1494.         if(this.floating){
  1495.             this.el.sync(true);
  1496.         }
  1497.     },
  1498.     // private
  1499.     getLayoutTarget : function(){
  1500.         return this.body;
  1501.     },
  1502.     // private
  1503.     getContentTarget : function(){
  1504.         return this.body;
  1505.     },
  1506.     /**
  1507.      * <p>Sets the title text for the panel and optionally the {@link #iconCls icon class}.</p>
  1508.      * <p>In order to be able to set the title, a header element must have been created
  1509.      * for the Panel. This is triggered either by configuring the Panel with a non-blank <code>{@link #title}</code>,
  1510.      * or configuring it with <code><b>{@link #header}: true</b></code>.</p>
  1511.      * @param {String} title The title text to set
  1512.      * @param {String} iconCls (optional) {@link #iconCls iconCls} A user-defined CSS class that provides the icon image for this panel
  1513.      */
  1514.     setTitle : function(title, iconCls){
  1515.         this.title = title;
  1516.         if(this.header && this.headerAsText){
  1517.             this.header.child('span').update(title);
  1518.         }
  1519.         if(iconCls){
  1520.             this.setIconClass(iconCls);
  1521.         }
  1522.         this.fireEvent('titlechange', this, title);
  1523.         return this;
  1524.     },
  1525.     /**
  1526.      * Get the {@link Ext.Updater} for this panel. Enables you to perform Ajax updates of this panel's body.
  1527.      * @return {Ext.Updater} The Updater
  1528.      */
  1529.     getUpdater : function(){
  1530.         return this.body.getUpdater();
  1531.     },
  1532.      /**
  1533.      * Loads this content panel immediately with content returned from an XHR call.
  1534.      * @param {Object/String/Function} config A config object containing any of the following options:
  1535. <pre><code>
  1536. panel.load({
  1537.     url: 'your-url.php',
  1538.     params: {param1: 'foo', param2: 'bar'}, // or a URL encoded string
  1539.     callback: yourFunction,
  1540.     scope: yourObject, // optional scope for the callback
  1541.     discardUrl: false,
  1542.     nocache: false,
  1543.     text: 'Loading...',
  1544.     timeout: 30,
  1545.     scripts: false
  1546. });
  1547. </code></pre>
  1548.      * The only required property is url. The optional properties nocache, text and scripts
  1549.      * are shorthand for disableCaching, indicatorText and loadScripts and are used to set their
  1550.      * associated property on this panel Updater instance.
  1551.      * @return {Ext.Panel} this
  1552.      */
  1553.     load : function(){
  1554.         var um = this.body.getUpdater();
  1555.         um.update.apply(um, arguments);
  1556.         return this;
  1557.     },
  1558.     // private
  1559.     beforeDestroy : function(){
  1560.         Ext.Panel.superclass.beforeDestroy.call(this);
  1561.         if(this.header){
  1562.             this.header.removeAllListeners();
  1563.         }
  1564.         if(this.tools){
  1565.             for(var k in this.tools){
  1566.                 Ext.destroy(this.tools[k]);
  1567.             }
  1568.         }
  1569.         if(Ext.isArray(this.buttons)){
  1570.             while(this.buttons.length) {
  1571.                 Ext.destroy(this.buttons[0]);
  1572.             }
  1573.         }
  1574.         if(this.rendered){
  1575.             Ext.destroy(
  1576.                 this.ft,
  1577.                 this.header,
  1578.                 this.footer,
  1579.                 this.toolbars,
  1580.                 this.tbar,
  1581.                 this.bbar,
  1582.                 this.body,
  1583.                 this.mc,
  1584.                 this.bwrap
  1585.             );
  1586.             if (this.fbar) {
  1587.                 Ext.destroy(
  1588.                     this.fbar,
  1589.                     this.fbar.el
  1590.                 );
  1591.             }
  1592.         }else{
  1593.             Ext.destroy(
  1594.                 this.topToolbar,
  1595.                 this.bottomToolbar
  1596.             );
  1597.         }
  1598.     },
  1599.     // private
  1600.     createClasses : function(){
  1601.         this.headerCls = this.baseCls + '-header';
  1602.         this.headerTextCls = this.baseCls + '-header-text';
  1603.         this.bwrapCls = this.baseCls + '-bwrap';
  1604.         this.tbarCls = this.baseCls + '-tbar';
  1605.         this.bodyCls = this.baseCls + '-body';
  1606.         this.bbarCls = this.baseCls + '-bbar';
  1607.         this.footerCls = this.baseCls + '-footer';
  1608.     },
  1609.     // private
  1610.     createGhost : function(cls, useShim, appendTo){
  1611.         var el = document.createElement('div');
  1612.         el.className = 'x-panel-ghost ' + (cls ? cls : '');
  1613.         if(this.header){
  1614.             el.appendChild(this.el.dom.firstChild.cloneNode(true));
  1615.         }
  1616.         Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());
  1617.         el.style.width = this.el.dom.offsetWidth + 'px';;
  1618.         if(!appendTo){
  1619.             this.container.dom.appendChild(el);
  1620.         }else{
  1621.             Ext.getDom(appendTo).appendChild(el);
  1622.         }
  1623.         if(useShim !== false && this.el.useShim !== false){
  1624.             var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
  1625.             layer.show();
  1626.             return layer;
  1627.         }else{
  1628.             return new Ext.Element(el);
  1629.         }
  1630.     },
  1631.     // private
  1632.     doAutoLoad : function(){
  1633.         var u = this.body.getUpdater();
  1634.         if(this.renderer){
  1635.             u.setRenderer(this.renderer);
  1636.         }
  1637.         u.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad});
  1638.     },
  1639.     /**
  1640.      * Retrieve a tool by id.
  1641.      * @param {String} id
  1642.      * @return {Object} tool
  1643.      */
  1644.     getTool : function(id) {
  1645.         return this.tools[id];
  1646.     }
  1647. /**
  1648.  * @cfg {String} autoEl @hide
  1649.  */
  1650. });
  1651. Ext.reg('panel', Ext.Panel);