ext-all-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:2341k
源码类别:

中间件编程

开发平台:

JavaScript

  1. // Element animation options object
  2. var opt = {
  3.     {@link Ext.Fx#duration duration}: 1,
  4.     {@link Ext.Fx#easing easing}: 'elasticIn',
  5.     {@link Ext.Fx#callback callback}: this.foo,
  6.     {@link Ext.Fx#scope scope}: this
  7. };
  8. // animation with some options set
  9. el.setWidth(100, opt);
  10.  * </code></pre>
  11.  * <p>The Element animation object being used for the animation will be set on the options
  12.  * object as "anim", which allows you to stop or manipulate the animation. Here is an example:</p>
  13.  * <pre><code>
  14. // using the "anim" property to get the Anim object
  15. if(opt.anim.isAnimated()){
  16.     opt.anim.stop();
  17. }
  18.  * </code></pre>
  19.  * <p>Also see the <tt>{@link #animate}</tt> method for another animation technique.</p>
  20.  * <p><b> Composite (Collections of) Elements</b></p>
  21.  * <p>For working with collections of Elements, see {@link Ext.CompositeElement}</p>
  22.  * @constructor Create a new Element directly.
  23.  * @param {String/HTMLElement} element
  24.  * @param {Boolean} forceNew (optional) By default the constructor checks to see if there is already an instance of this element in the cache and if there is it returns the same instance. This will skip that check (useful for extending this class).
  25.  */
  26. (function(){
  27. var DOC = document;
  28. Ext.Element = function(element, forceNew){
  29.     var dom = typeof element == "string" ?
  30.               DOC.getElementById(element) : element,
  31.         id;
  32.     if(!dom) return null;
  33.     id = dom.id;
  34.     if(!forceNew && id && Ext.Element.cache[id]){ // element object already exists
  35.         return Ext.Element.cache[id];
  36.     }
  37.     /**
  38.      * The DOM element
  39.      * @type HTMLElement
  40.      */
  41.     this.dom = dom;
  42.     /**
  43.      * The DOM element ID
  44.      * @type String
  45.      */
  46.     this.id = id || Ext.id(dom);
  47. };
  48. var D = Ext.lib.Dom,
  49.     DH = Ext.DomHelper,
  50.     E = Ext.lib.Event,
  51.     A = Ext.lib.Anim,
  52.     El = Ext.Element;
  53. El.prototype = {
  54.     /**
  55.      * Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
  56.      * @param {Object} o The object with the attributes
  57.      * @param {Boolean} useSet (optional) false to override the default setAttribute to use expandos.
  58.      * @return {Ext.Element} this
  59.      */
  60.     set : function(o, useSet){
  61.         var el = this.dom,
  62.             attr,
  63.             val;        
  64.        
  65.         for(attr in o){
  66.             val = o[attr];
  67.             if (attr != "style" && !Ext.isFunction(val)) {
  68.                 if (attr == "cls" ) {
  69.                     el.className = val;
  70.                 } else if (o.hasOwnProperty(attr)) {
  71.                     if (useSet || !!el.setAttribute) el.setAttribute(attr, val);
  72.                     else el[attr] = val;
  73.                 }
  74.             }
  75.         }
  76.         if(o.style){
  77.             Ext.DomHelper.applyStyles(el, o.style);
  78.         }
  79.         return this;
  80.     },
  81.     
  82. //  Mouse events
  83.     /**
  84.      * @event click
  85.      * Fires when a mouse click is detected within the element.
  86.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  87.      * @param {HtmlElement} t The target of the event.
  88.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  89.      */
  90.     /**
  91.      * @event dblclick
  92.      * Fires when a mouse double click is detected within the element.
  93.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  94.      * @param {HtmlElement} t The target of the event.
  95.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  96.      */
  97.     /**
  98.      * @event mousedown
  99.      * Fires when a mousedown is detected within the element.
  100.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  101.      * @param {HtmlElement} t The target of the event.
  102.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  103.      */
  104.     /**
  105.      * @event mouseup
  106.      * Fires when a mouseup is detected within the element.
  107.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  108.      * @param {HtmlElement} t The target of the event.
  109.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  110.      */
  111.     /**
  112.      * @event mouseover
  113.      * Fires when a mouseover is detected within the element.
  114.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  115.      * @param {HtmlElement} t The target of the event.
  116.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  117.      */
  118.     /**
  119.      * @event mousemove
  120.      * Fires when a mousemove is detected with the element.
  121.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  122.      * @param {HtmlElement} t The target of the event.
  123.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  124.      */
  125.     /**
  126.      * @event mouseout
  127.      * Fires when a mouseout is detected with the element.
  128.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  129.      * @param {HtmlElement} t The target of the event.
  130.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  131.      */
  132.     /**
  133.      * @event mouseenter
  134.      * Fires when the mouse enters the element.
  135.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  136.      * @param {HtmlElement} t The target of the event.
  137.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  138.      */
  139.     /**
  140.      * @event mouseleave
  141.      * Fires when the mouse leaves the element.
  142.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  143.      * @param {HtmlElement} t The target of the event.
  144.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  145.      */
  146.     
  147. //  Keyboard events
  148.     /**
  149.      * @event keypress
  150.      * Fires when a keypress is detected within the element.
  151.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  152.      * @param {HtmlElement} t The target of the event.
  153.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  154.      */
  155.     /**
  156.      * @event keydown
  157.      * Fires when a keydown is detected within the element.
  158.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  159.      * @param {HtmlElement} t The target of the event.
  160.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  161.      */
  162.     /**
  163.      * @event keyup
  164.      * Fires when a keyup is detected within the element.
  165.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  166.      * @param {HtmlElement} t The target of the event.
  167.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  168.      */
  169. //  HTML frame/object events
  170.     /**
  171.      * @event load
  172.      * Fires when the user agent finishes loading all content within the element. Only supported by window, frames, objects and images.
  173.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  174.      * @param {HtmlElement} t The target of the event.
  175.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  176.      */
  177.     /**
  178.      * @event unload
  179.      * Fires when the user agent removes all content from a window or frame. For elements, it fires when the target element or any of its content has been removed.
  180.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  181.      * @param {HtmlElement} t The target of the event.
  182.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  183.      */
  184.     /**
  185.      * @event abort
  186.      * Fires when an object/image is stopped from loading before completely loaded.
  187.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  188.      * @param {HtmlElement} t The target of the event.
  189.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  190.      */
  191.     /**
  192.      * @event error
  193.      * Fires when an object/image/frame cannot be loaded properly.
  194.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  195.      * @param {HtmlElement} t The target of the event.
  196.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  197.      */
  198.     /**
  199.      * @event resize
  200.      * Fires when a document view is resized.
  201.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  202.      * @param {HtmlElement} t The target of the event.
  203.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  204.      */
  205.     /**
  206.      * @event scroll
  207.      * Fires when a document view is scrolled.
  208.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  209.      * @param {HtmlElement} t The target of the event.
  210.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  211.      */
  212. //  Form events
  213.     /**
  214.      * @event select
  215.      * Fires when a user selects some text in a text field, including input and textarea.
  216.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  217.      * @param {HtmlElement} t The target of the event.
  218.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  219.      */
  220.     /**
  221.      * @event change
  222.      * Fires when a control loses the input focus and its value has been modified since gaining focus.
  223.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  224.      * @param {HtmlElement} t The target of the event.
  225.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  226.      */
  227.     /**
  228.      * @event submit
  229.      * Fires when a form is submitted.
  230.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  231.      * @param {HtmlElement} t The target of the event.
  232.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  233.      */
  234.     /**
  235.      * @event reset
  236.      * Fires when a form is reset.
  237.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  238.      * @param {HtmlElement} t The target of the event.
  239.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  240.      */
  241.     /**
  242.      * @event focus
  243.      * Fires when an element receives focus either via the pointing device or by tab navigation.
  244.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  245.      * @param {HtmlElement} t The target of the event.
  246.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  247.      */
  248.     /**
  249.      * @event blur
  250.      * Fires when an element loses focus either via the pointing device or by tabbing navigation.
  251.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  252.      * @param {HtmlElement} t The target of the event.
  253.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  254.      */
  255. //  User Interface events
  256.     /**
  257.      * @event DOMFocusIn
  258.      * Where supported. Similar to HTML focus event, but can be applied to any focusable element.
  259.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  260.      * @param {HtmlElement} t The target of the event.
  261.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  262.      */
  263.     /**
  264.      * @event DOMFocusOut
  265.      * Where supported. Similar to HTML blur event, but can be applied to any focusable element.
  266.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  267.      * @param {HtmlElement} t The target of the event.
  268.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  269.      */
  270.     /**
  271.      * @event DOMActivate
  272.      * Where supported. Fires when an element is activated, for instance, through a mouse click or a keypress.
  273.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  274.      * @param {HtmlElement} t The target of the event.
  275.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  276.      */
  277. //  DOM Mutation events
  278.     /**
  279.      * @event DOMSubtreeModified
  280.      * Where supported. Fires when the subtree is modified.
  281.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  282.      * @param {HtmlElement} t The target of the event.
  283.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  284.      */
  285.     /**
  286.      * @event DOMNodeInserted
  287.      * Where supported. Fires when a node has been added as a child of another node.
  288.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  289.      * @param {HtmlElement} t The target of the event.
  290.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  291.      */
  292.     /**
  293.      * @event DOMNodeRemoved
  294.      * Where supported. Fires when a descendant node of the element is removed.
  295.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  296.      * @param {HtmlElement} t The target of the event.
  297.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  298.      */
  299.     /**
  300.      * @event DOMNodeRemovedFromDocument
  301.      * Where supported. Fires when a node is being removed from a document.
  302.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  303.      * @param {HtmlElement} t The target of the event.
  304.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  305.      */
  306.     /**
  307.      * @event DOMNodeInsertedIntoDocument
  308.      * Where supported. Fires when a node is being inserted into a document.
  309.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  310.      * @param {HtmlElement} t The target of the event.
  311.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  312.      */
  313.     /**
  314.      * @event DOMAttrModified
  315.      * Where supported. Fires when an attribute has been modified.
  316.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  317.      * @param {HtmlElement} t The target of the event.
  318.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  319.      */
  320.     /**
  321.      * @event DOMCharacterDataModified
  322.      * Where supported. Fires when the character data has been modified.
  323.      * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
  324.      * @param {HtmlElement} t The target of the event.
  325.      * @param {Object} o The options configuration passed to the {@link #addListener} call.
  326.      */
  327.     /**
  328.      * The default unit to append to CSS values where a unit isn't provided (defaults to px).
  329.      * @type String
  330.      */
  331.     defaultUnit : "px",
  332.     /**
  333.      * Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child)
  334.      * @param {String} selector The simple selector to test
  335.      * @return {Boolean} True if this element matches the selector, else false
  336.      */
  337.     is : function(simpleSelector){
  338.         return Ext.DomQuery.is(this.dom, simpleSelector);
  339.     },
  340.     /**
  341.      * Tries to focus the element. Any exceptions are caught and ignored.
  342.      * @param {Number} defer (optional) Milliseconds to defer the focus
  343.      * @return {Ext.Element} this
  344.      */
  345.     focus : function(defer, /* private */ dom) {
  346.         var me = this,
  347.             dom = dom || me.dom;
  348.         try{
  349.             if(Number(defer)){
  350.                 me.focus.defer(defer, null, [null, dom]);
  351.             }else{
  352.                 dom.focus();
  353.             }
  354.         }catch(e){}
  355.         return me;
  356.     },
  357.     /**
  358.      * Tries to blur the element. Any exceptions are caught and ignored.
  359.      * @return {Ext.Element} this
  360.      */
  361.     blur : function() {
  362.         try{
  363.             this.dom.blur();
  364.         }catch(e){}
  365.         return this;
  366.     },
  367.     /**
  368.      * Returns the value of the "value" attribute
  369.      * @param {Boolean} asNumber true to parse the value as a number
  370.      * @return {String/Number}
  371.      */
  372.     getValue : function(asNumber){
  373.         var val = this.dom.value;
  374.         return asNumber ? parseInt(val, 10) : val;
  375.     },
  376.     /**
  377.      * Appends an event handler to this element.  The shorthand version {@link #on} is equivalent.
  378.      * @param {String} eventName The type of event to handle
  379.      * @param {Function} fn The handler function the event invokes. This function is passed
  380.      * the following parameters:<ul>
  381.      * <li><b>evt</b> : EventObject<div class="sub-desc">The {@link Ext.EventObject EventObject} describing the event.</div></li>
  382.      * <li><b>el</b> : Element<div class="sub-desc">The {@link Ext.Element Element} which was the target of the event.
  383.      * Note that this may be filtered by using the <tt>delegate</tt> option.</div></li>
  384.      * <li><b>o</b> : Object<div class="sub-desc">The options object from the addListener call.</div></li>
  385.      * </ul>
  386.      * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the handler function is executed.
  387.      * <b>If omitted, defaults to this Element.</b>.
  388.      * @param {Object} options (optional) An object containing handler configuration properties.
  389.      * This may contain any of the following properties:<ul>
  390.      * <li><b>scope</b> Object : <div class="sub-desc">The scope (<code><b>this</b></code> reference) in which the handler function is executed.
  391.      * <b>If omitted, defaults to this Element.</b></div></li>
  392.      * <li><b>delegate</b> String: <div class="sub-desc">A simple selector to filter the target or look for a descendant of the target. See below for additional details.</div></li>
  393.      * <li><b>stopEvent</b> Boolean: <div class="sub-desc">True to stop the event. That is stop propagation, and prevent the default action.</div></li>
  394.      * <li><b>preventDefault</b> Boolean: <div class="sub-desc">True to prevent the default action</div></li>
  395.      * <li><b>stopPropagation</b> Boolean: <div class="sub-desc">True to prevent event propagation</div></li>
  396.      * <li><b>normalized</b> Boolean: <div class="sub-desc">False to pass a browser event to the handler function instead of an Ext.EventObject</div></li>
  397.      * <li><b>target</b> Ext.Element: <div class="sub-desc">Only call the handler if the event was fired on the target Element, <i>not</i> if the event was bubbled up from a child node.</div></li>
  398.      * <li><b>delay</b> Number: <div class="sub-desc">The number of milliseconds to delay the invocation of the handler after the event fires.</div></li>
  399.      * <li><b>single</b> Boolean: <div class="sub-desc">True to add a handler to handle just the next firing of the event, and then remove itself.</div></li>
  400.      * <li><b>buffer</b> Number: <div class="sub-desc">Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed
  401.      * by the specified number of milliseconds. If the event fires again within that time, the original
  402.      * handler is <em>not</em> invoked, but the new handler is scheduled in its place.</div></li>
  403.      * </ul><br>
  404.      * <p>
  405.      * <b>Combining Options</b><br>
  406.      * In the following examples, the shorthand form {@link #on} is used rather than the more verbose
  407.      * addListener.  The two are equivalent.  Using the options argument, it is possible to combine different
  408.      * types of listeners:<br>
  409.      * <br>
  410.      * A delayed, one-time listener that auto stops the event and adds a custom argument (forumId) to the
  411.      * options object. The options object is available as the third parameter in the handler function.<div style="margin: 5px 20px 20px;">
  412.      * Code:<pre><code>
  413. el.on('click', this.onClick, this, {
  414.     single: true,
  415.     delay: 100,
  416.     stopEvent : true,
  417.     forumId: 4
  418. });</code></pre></p>
  419.      * <p>
  420.      * <b>Attaching multiple handlers in 1 call</b><br>
  421.      * The method also allows for a single argument to be passed which is a config object containing properties
  422.      * which specify multiple handlers.</p>
  423.      * <p>
  424.      * Code:<pre><code>
  425. el.on({
  426.     'click' : {
  427.         fn: this.onClick,
  428.         scope: this,
  429.         delay: 100
  430.     },
  431.     'mouseover' : {
  432.         fn: this.onMouseOver,
  433.         scope: this
  434.     },
  435.     'mouseout' : {
  436.         fn: this.onMouseOut,
  437.         scope: this
  438.     }
  439. });</code></pre>
  440.      * <p>
  441.      * Or a shorthand syntax:<br>
  442.      * Code:<pre><code></p>
  443. el.on({
  444.     'click' : this.onClick,
  445.     'mouseover' : this.onMouseOver,
  446.     'mouseout' : this.onMouseOut,
  447.     scope: this
  448. });
  449.      * </code></pre></p>
  450.      * <p><b>delegate</b></p>
  451.      * <p>This is a configuration option that you can pass along when registering a handler for
  452.      * an event to assist with event delegation. Event delegation is a technique that is used to
  453.      * reduce memory consumption and prevent exposure to memory-leaks. By registering an event
  454.      * for a container element as opposed to each element within a container. By setting this
  455.      * configuration option to a simple selector, the target element will be filtered to look for
  456.      * a descendant of the target.
  457.      * For example:<pre><code>
  458. // using this markup:
  459. &lt;div id='elId'>
  460.     &lt;p id='p1'>paragraph one&lt;/p>
  461.     &lt;p id='p2' class='clickable'>paragraph two&lt;/p>
  462.     &lt;p id='p3'>paragraph three&lt;/p>
  463. &lt;/div>
  464. // utilize event delegation to registering just one handler on the container element: 
  465. el = Ext.get('elId');
  466. el.on(
  467.     'click',
  468.     function(e,t) {
  469.         // handle click
  470.         console.info(t.id); // 'p2'
  471.     },
  472.     this,
  473.     {
  474.         // filter the target element to be a descendant with the class 'clickable'
  475.         delegate: '.clickable' 
  476.     }
  477. );
  478.      * </code></pre></p>
  479.      * @return {Ext.Element} this
  480.      */
  481.     addListener : function(eventName, fn, scope, options){
  482.         Ext.EventManager.on(this.dom,  eventName, fn, scope || this, options);
  483.         return this;
  484.     },
  485.     /**
  486.      * Removes an event handler from this element.  The shorthand version {@link #un} is equivalent.
  487.      * <b>Note</b>: if a <i>scope</i> was explicitly specified when {@link #addListener adding} the
  488.      * listener, the same scope must be specified here.
  489.      * Example:
  490.      * <pre><code>
  491. el.removeListener('click', this.handlerFn);
  492. // or
  493. el.un('click', this.handlerFn);
  494. </code></pre>
  495.      * @param {String} eventName the type of event to remove
  496.      * @param {Function} fn the method the event invokes
  497.      * @param {Object} scope (optional) The scope (The <tt>this</tt> reference) of the handler function. Defaults
  498.      * to this Element.
  499.      * @return {Ext.Element} this
  500.      */
  501.     removeListener : function(eventName, fn, scope){
  502.         Ext.EventManager.removeListener(this.dom,  eventName, fn, scope || this);
  503.         return this;
  504.     },
  505.     /**
  506.      * Removes all previous added listeners from this element
  507.      * @return {Ext.Element} this
  508.      */
  509.     removeAllListeners : function(){
  510.         Ext.EventManager.removeAll(this.dom);
  511.         return this;
  512.     },
  513.     /**
  514.      * @private Test if size has a unit, otherwise appends the default
  515.      */
  516.     addUnits : function(size){
  517.         if(size === "" || size == "auto" || size === undefined){
  518.             size = size || '';
  519.         } else if(!isNaN(size) || !unitPattern.test(size)){
  520.             size = size + (this.defaultUnit || 'px');
  521.         }
  522.         return size;
  523.     },
  524.     /**
  525.      * <p>Updates the <a href="http://developer.mozilla.org/en/DOM/element.innerHTML">innerHTML</a> of this Element
  526.      * from a specified URL. Note that this is subject to the <a href="http://en.wikipedia.org/wiki/Same_origin_policy">Same Origin Policy</a></p>
  527.      * <p>Updating innerHTML of an element will <b>not</b> execute embedded <tt>&lt;script></tt> elements. This is a browser restriction.</p>
  528.      * @param {Mixed} options. Either a sring containing the URL from which to load the HTML, or an {@link Ext.Ajax#request} options object specifying
  529.      * exactly how to request the HTML.
  530.      * @return {Ext.Element} this
  531.      */
  532.     load : function(url, params, cb){
  533.         Ext.Ajax.request(Ext.apply({
  534.             params: params,
  535.             url: url.url || url,
  536.             callback: cb,
  537.             el: this.dom,
  538.             indicatorText: url.indicatorText || ''
  539.         }, Ext.isObject(url) ? url : {}));
  540.         return this;
  541.     },
  542.     /**
  543.      * Tests various css rules/browsers to determine if this element uses a border box
  544.      * @return {Boolean}
  545.      */
  546.     isBorderBox : function(){
  547.         return noBoxAdjust[(this.dom.tagName || "").toLowerCase()] || Ext.isBorderBox;
  548.     },
  549.     /**
  550.      * Removes this element from the DOM and deletes it from the cache
  551.      */
  552.     remove : function(){
  553.         var me = this,
  554.             dom = me.dom;
  555.         
  556.         me.removeAllListeners();
  557.         delete El.cache[dom.id];
  558.         delete El.dataCache[dom.id]
  559.         Ext.removeNode(dom);
  560.     },
  561.     /**
  562.      * Sets up event handlers to call the passed functions when the mouse is moved into and out of the Element.
  563.      * @param {Function} overFn The function to call when the mouse enters the Element.
  564.      * @param {Function} outFn The function to call when the mouse leaves the Element.
  565.      * @param {Object} scope (optional) The scope (<tt>this</tt> reference) in which the functions are executed. Defaults to the Element's DOM element.
  566.      * @param {Object} options (optional) Options for the listener. See {@link Ext.util.Observable#addListener the <tt>options</tt> parameter}.
  567.      * @return {Ext.Element} this
  568.      */
  569.     hover : function(overFn, outFn, scope, options){
  570.         var me = this;
  571.         me.on('mouseenter', overFn, scope || me.dom, options);
  572.         me.on('mouseleave', outFn, scope || me.dom, options);
  573.         return me;
  574.     },
  575.     /**
  576.      * Returns true if this element is an ancestor of the passed element
  577.      * @param {HTMLElement/String} el The element to check
  578.      * @return {Boolean} True if this element is an ancestor of el, else false
  579.      */
  580.     contains : function(el){
  581.         return !el ? false : Ext.lib.Dom.isAncestor(this.dom, el.dom ? el.dom : el);
  582.     },
  583.     /**
  584.      * Returns the value of a namespaced attribute from the element's underlying DOM node.
  585.      * @param {String} namespace The namespace in which to look for the attribute
  586.      * @param {String} name The attribute name
  587.      * @return {String} The attribute value
  588.      * @deprecated
  589.      */
  590.     getAttributeNS : function(ns, name){
  591.         return this.getAttribute(name, ns); 
  592.     },
  593.     
  594.     /**
  595.      * Returns the value of an attribute from the element's underlying DOM node.
  596.      * @param {String} name The attribute name
  597.      * @param {String} namespace (optional) The namespace in which to look for the attribute
  598.      * @return {String} The attribute value
  599.      */
  600.     getAttribute : Ext.isIE ? function(name, ns){
  601.         var d = this.dom,
  602.             type = typeof d[ns + ":" + name];
  603.         if(['undefined', 'unknown'].indexOf(type) == -1){
  604.             return d[ns + ":" + name];
  605.         }
  606.         return d[name];
  607.     } : function(name, ns){
  608.         var d = this.dom;
  609.         return d.getAttributeNS(ns, name) || d.getAttribute(ns + ":" + name) || d.getAttribute(name) || d[name];
  610.     },
  611.     
  612.     /**
  613.     * Update the innerHTML of this element
  614.     * @param {String} html The new HTML
  615.     * @return {Ext.Element} this
  616.      */
  617.     update : function(html) {
  618.         this.dom.innerHTML = html;
  619.         return this;
  620.     }
  621. };
  622. var ep = El.prototype;
  623. El.addMethods = function(o){
  624.    Ext.apply(ep, o);
  625. };
  626. /**
  627.  * Appends an event handler (shorthand for {@link #addListener}).
  628.  * @param {String} eventName The type of event to handle
  629.  * @param {Function} fn The handler function the event invokes
  630.  * @param {Object} scope (optional) The scope (this element) of the handler function
  631.  * @param {Object} options (optional) An object containing standard {@link #addListener} options
  632.  * @member Ext.Element
  633.  * @method on
  634.  */
  635. ep.on = ep.addListener;
  636. /**
  637.  * Removes an event handler from this element (see {@link #removeListener} for additional notes).
  638.  * @param {String} eventName the type of event to remove
  639.  * @param {Function} fn the method the event invokes
  640.  * @param {Object} scope (optional) The scope (The <tt>this</tt> reference) of the handler function. Defaults
  641.  * to this Element.
  642.  * @return {Ext.Element} this
  643.  * @member Ext.Element
  644.  * @method un
  645.  */
  646. ep.un = ep.removeListener;
  647. /**
  648.  * true to automatically adjust width and height settings for box-model issues (default to true)
  649.  */
  650. ep.autoBoxAdjust = true;
  651. // private
  652. var unitPattern = /d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
  653.     docEl;
  654. /**
  655.  * @private
  656.  */
  657. El.cache = {};
  658. El.dataCache = {};
  659. /**
  660.  * Retrieves Ext.Element objects.
  661.  * <p><b>This method does not retrieve {@link Ext.Component Component}s.</b> This method
  662.  * retrieves Ext.Element objects which encapsulate DOM elements. To retrieve a Component by
  663.  * its ID, use {@link Ext.ComponentMgr#get}.</p>
  664.  * <p>Uses simple caching to consistently return the same object. Automatically fixes if an
  665.  * object was recreated with the same id via AJAX or DOM.</p>
  666.  * @param {Mixed} el The id of the node, a DOM Node or an existing Element.
  667.  * @return {Element} The Element object (or null if no matching element was found)
  668.  * @static
  669.  * @member Ext.Element
  670.  * @method get
  671.  */
  672. El.get = function(el){
  673.     var ex,
  674.         elm,
  675.         id;
  676.     if(!el){ return null; }
  677.     if (typeof el == "string") { // element id
  678.         if (!(elm = DOC.getElementById(el))) {
  679.             return null;
  680.         }
  681.         if (ex = El.cache[el]) {
  682.             ex.dom = elm;
  683.         } else {
  684.             ex = El.cache[el] = new El(elm);
  685.         }
  686.         return ex;
  687.     } else if (el.tagName) { // dom element
  688.         if(!(id = el.id)){
  689.             id = Ext.id(el);
  690.         }
  691.         if(ex = El.cache[id]){
  692.             ex.dom = el;
  693.         }else{
  694.             ex = El.cache[id] = new El(el);
  695.         }
  696.         return ex;
  697.     } else if (el instanceof El) {
  698.         if(el != docEl){
  699.             el.dom = DOC.getElementById(el.id) || el.dom; // refresh dom element in case no longer valid,
  700.                                                           // catch case where it hasn't been appended
  701.             El.cache[el.id] = el; // in case it was created directly with Element(), let's cache it
  702.         }
  703.         return el;
  704.     } else if(el.isComposite) {
  705.         return el;
  706.     } else if(Ext.isArray(el)) {
  707.         return El.select(el);
  708.     } else if(el == DOC) {
  709.         // create a bogus element object representing the document object
  710.         if(!docEl){
  711.             var f = function(){};
  712.             f.prototype = El.prototype;
  713.             docEl = new f();
  714.             docEl.dom = DOC;
  715.         }
  716.         return docEl;
  717.     }
  718.     return null;
  719. };
  720. // private method for getting and setting element data
  721. El.data = function(el, key, value){
  722.     var c = El.dataCache[el.id];
  723.     if(!c){
  724.         c = El.dataCache[el.id] = {};
  725.     }
  726.     if(arguments.length == 2){
  727.         return c[key];    
  728.     }else{
  729.         c[key] = value;
  730.     }
  731. };
  732. // private
  733. // Garbage collection - uncache elements/purge listeners on orphaned elements
  734. // so we don't hold a reference and cause the browser to retain them
  735. function garbageCollect(){
  736.     if(!Ext.enableGarbageCollector){
  737.         clearInterval(El.collectorThread);
  738.     } else {
  739.         var eid,
  740.             el,
  741.             d;
  742.         for(eid in El.cache){
  743.             el = El.cache[eid];
  744.             d = el.dom;
  745.             // -------------------------------------------------------
  746.             // Determining what is garbage:
  747.             // -------------------------------------------------------
  748.             // !d
  749.             // dom node is null, definitely garbage
  750.             // -------------------------------------------------------
  751.             // !d.parentNode
  752.             // no parentNode == direct orphan, definitely garbage
  753.             // -------------------------------------------------------
  754.             // !d.offsetParent && !document.getElementById(eid)
  755.             // display none elements have no offsetParent so we will
  756.             // also try to look it up by it's id. However, check
  757.             // offsetParent first so we don't do unneeded lookups.
  758.             // This enables collection of elements that are not orphans
  759.             // directly, but somewhere up the line they have an orphan
  760.             // parent.
  761.             // -------------------------------------------------------
  762.             if(!d || !d.parentNode || (!d.offsetParent && !DOC.getElementById(eid))){
  763.                 delete El.cache[eid];
  764.                 if(d && Ext.enableListenerCollection){
  765.                     Ext.EventManager.removeAll(d);
  766.                 }
  767.             }
  768.         }
  769.     }
  770. }
  771. El.collectorThreadId = setInterval(garbageCollect, 30000);
  772. var flyFn = function(){};
  773. flyFn.prototype = El.prototype;
  774. // dom is optional
  775. El.Flyweight = function(dom){
  776.     this.dom = dom;
  777. };
  778. El.Flyweight.prototype = new flyFn();
  779. El.Flyweight.prototype.isFlyweight = true;
  780. El._flyweights = {};
  781. /**
  782.  * <p>Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element -
  783.  * the dom node can be overwritten by other code. Shorthand of {@link Ext.Element#fly}</p>
  784.  * <p>Use this to make one-time references to DOM elements which are not going to be accessed again either by
  785.  * application code, or by Ext's classes. If accessing an element which will be processed regularly, then {@link Ext#get}
  786.  * will be more appropriate to take advantage of the caching provided by the Ext.Element class.</p>
  787.  * @param {String/HTMLElement} el The dom node or id
  788.  * @param {String} named (optional) Allows for creation of named reusable flyweights to prevent conflicts
  789.  * (e.g. internally Ext uses "_global")
  790.  * @return {Element} The shared Element object (or null if no matching element was found)
  791.  * @member Ext.Element
  792.  * @method fly
  793.  */
  794. El.fly = function(el, named){
  795.     var ret = null;
  796.     named = named || '_global';
  797.     if (el = Ext.getDom(el)) {
  798.         (El._flyweights[named] = El._flyweights[named] || new El.Flyweight()).dom = el;
  799.         ret = El._flyweights[named];
  800.     }
  801.     return ret;
  802. };
  803. /**
  804.  * Retrieves Ext.Element objects.
  805.  * <p><b>This method does not retrieve {@link Ext.Component Component}s.</b> This method
  806.  * retrieves Ext.Element objects which encapsulate DOM elements. To retrieve a Component by
  807.  * its ID, use {@link Ext.ComponentMgr#get}.</p>
  808.  * <p>Uses simple caching to consistently return the same object. Automatically fixes if an
  809.  * object was recreated with the same id via AJAX or DOM.</p>
  810.  * Shorthand of {@link Ext.Element#get}
  811.  * @param {Mixed} el The id of the node, a DOM Node or an existing Element.
  812.  * @return {Element} The Element object (or null if no matching element was found)
  813.  * @member Ext
  814.  * @method get
  815.  */
  816. Ext.get = El.get;
  817. /**
  818.  * <p>Gets the globally shared flyweight Element, with the passed node as the active element. Do not store a reference to this element -
  819.  * the dom node can be overwritten by other code. Shorthand of {@link Ext.Element#fly}</p>
  820.  * <p>Use this to make one-time references to DOM elements which are not going to be accessed again either by
  821.  * application code, or by Ext's classes. If accessing an element which will be processed regularly, then {@link Ext#get}
  822.  * will be more appropriate to take advantage of the caching provided by the Ext.Element class.</p>
  823.  * @param {String/HTMLElement} el The dom node or id
  824.  * @param {String} named (optional) Allows for creation of named reusable flyweights to prevent conflicts
  825.  * (e.g. internally Ext uses "_global")
  826.  * @return {Element} The shared Element object (or null if no matching element was found)
  827.  * @member Ext
  828.  * @method fly
  829.  */
  830. Ext.fly = El.fly;
  831. // speedy lookup for elements never to box adjust
  832. var noBoxAdjust = Ext.isStrict ? {
  833.     select:1
  834. } : {
  835.     input:1, select:1, textarea:1
  836. };
  837. if(Ext.isIE || Ext.isGecko){
  838.     noBoxAdjust['button'] = 1;
  839. }
  840. Ext.EventManager.on(window, 'unload', function(){
  841.     delete El.cache;
  842.     delete El.dataCache;
  843.     delete El._flyweights;
  844. });
  845. })();
  846. /**
  847.  * @class Ext.Element
  848.  */
  849. Ext.Element.addMethods({    
  850.     /**
  851.      * Stops the specified event(s) from bubbling and optionally prevents the default action
  852.      * @param {String/Array} eventName an event / array of events to stop from bubbling
  853.      * @param {Boolean} preventDefault (optional) true to prevent the default action too
  854.      * @return {Ext.Element} this
  855.      */
  856.     swallowEvent : function(eventName, preventDefault){
  857.     var me = this;
  858.         function fn(e){
  859.             e.stopPropagation();
  860.             if(preventDefault){
  861.                 e.preventDefault();
  862.             }
  863.         }
  864.         if(Ext.isArray(eventName)){            
  865.         Ext.each(eventName, function(e) {
  866.                  me.on(e, fn);
  867.             });
  868.             return me;
  869.         }
  870.         me.on(eventName, fn);
  871.         return me;
  872.     },
  873.     
  874.     /**
  875.      * Create an event handler on this element such that when the event fires and is handled by this element,
  876.      * it will be relayed to another object (i.e., fired again as if it originated from that object instead).
  877.      * @param {String} eventName The type of event to relay
  878.      * @param {Object} object Any object that extends {@link Ext.util.Observable} that will provide the context
  879.      * for firing the relayed event
  880.      */
  881.     relayEvent : function(eventName, observable){
  882.         this.on(eventName, function(e){
  883.             observable.fireEvent(eventName, e);
  884.         });
  885.     },
  886.     
  887. /**
  888.      * Removes worthless text nodes
  889.      * @param {Boolean} forceReclean (optional) By default the element
  890.      * keeps track if it has been cleaned already so
  891.      * you can call this over and over. However, if you update the element and
  892.      * need to force a reclean, you can pass true.
  893.      */
  894.     clean : function(forceReclean){
  895.         var me = this, 
  896.             dom = me.dom,
  897.          n = dom.firstChild, 
  898.          ni = -1;
  899.         
  900.     if(Ext.Element.data(dom, 'isCleaned') && forceReclean !== true){
  901.             return me;
  902.         }      
  903.         
  904.       while(n){
  905.           var nx = n.nextSibling;
  906.             if(n.nodeType == 3 && !/S/.test(n.nodeValue)){
  907.                 dom.removeChild(n);
  908.             }else{
  909.                 n.nodeIndex = ++ni;
  910.             }
  911.           n = nx;
  912.       }
  913.         Ext.Element.data(dom, 'isCleaned', true);
  914.       return me;
  915.   },
  916.     
  917.     /**
  918.      * Direct access to the Updater {@link Ext.Updater#update} method. The method takes the same object
  919.      * parameter as {@link Ext.Updater#update}
  920.      * @return {Ext.Element} this
  921.      */
  922.     load : function(){
  923.         var um = this.getUpdater();
  924.         um.update.apply(um, arguments);
  925.         return this;
  926.     },
  927.     /**
  928.     * Gets this element's {@link Ext.Updater Updater}
  929.     * @return {Ext.Updater} The Updater
  930.     */
  931.     getUpdater : function(){
  932.         return this.updateManager || (this.updateManager = new Ext.Updater(this));
  933.     },
  934.     
  935. /**
  936.     * Update the innerHTML of this element, optionally searching for and processing scripts
  937.     * @param {String} html The new HTML
  938.     * @param {Boolean} loadScripts (optional) True to look for and process scripts (defaults to false)
  939.     * @param {Function} callback (optional) For async script loading you can be notified when the update completes
  940.     * @return {Ext.Element} this
  941.      */
  942.     update : function(html, loadScripts, callback){
  943.         html = html || "";
  944.     
  945.         if(loadScripts !== true){
  946.             this.dom.innerHTML = html;
  947.             if(Ext.isFunction(callback)){
  948.                 callback();
  949.             }
  950.             return this;
  951.         }
  952.         
  953.         var id = Ext.id(),
  954.          dom = this.dom;
  955.         html += '<span id="' + id + '"></span>';
  956.         Ext.lib.Event.onAvailable(id, function(){
  957.             var DOC = document,
  958.                 hd = DOC.getElementsByTagName("head")[0],
  959.              re = /(?:<script([^>]*)?>)((n|r|.)*?)(?:</script>)/ig,
  960.              srcRe = /ssrc=(['"])(.*?)1/i,
  961.              typeRe = /stype=(['"])(.*?)1/i,
  962.              match,
  963.              attrs,
  964.              srcMatch,
  965.              typeMatch,
  966.              el,
  967.              s;
  968.             while((match = re.exec(html))){
  969.                 attrs = match[1];
  970.                 srcMatch = attrs ? attrs.match(srcRe) : false;
  971.                 if(srcMatch && srcMatch[2]){
  972.                    s = DOC.createElement("script");
  973.                    s.src = srcMatch[2];
  974.                    typeMatch = attrs.match(typeRe);
  975.                    if(typeMatch && typeMatch[2]){
  976.                        s.type = typeMatch[2];
  977.                    }
  978.                    hd.appendChild(s);
  979.                 }else if(match[2] && match[2].length > 0){
  980.                     if(window.execScript) {
  981.                        window.execScript(match[2]);
  982.                     } else {
  983.                        window.eval(match[2]);
  984.                     }
  985.                 }
  986.             }
  987.             el = DOC.getElementById(id);
  988.             if(el){Ext.removeNode(el);}
  989.             if(Ext.isFunction(callback)){
  990.                 callback();
  991.             }
  992.         });
  993.         dom.innerHTML = html.replace(/(?:<script.*?>)((n|r|.)*?)(?:</script>)/ig, "");
  994.         return this;
  995.     },
  996.     
  997.     /**
  998.      * Creates a proxy element of this element
  999.      * @param {String/Object} config The class name of the proxy element or a DomHelper config object
  1000.      * @param {String/HTMLElement} renderTo (optional) The element or element id to render the proxy to (defaults to document.body)
  1001.      * @param {Boolean} matchBox (optional) True to align and size the proxy to this element now (defaults to false)
  1002.      * @return {Ext.Element} The new proxy element
  1003.      */
  1004.     createProxy : function(config, renderTo, matchBox){
  1005.         config = Ext.isObject(config) ? config : {tag : "div", cls: config};
  1006.         var me = this,
  1007.          proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
  1008.             Ext.DomHelper.insertBefore(me.dom, config, true);        
  1009.         
  1010.         if(matchBox && me.setBox && me.getBox){ // check to make sure Element.position.js is loaded
  1011.            proxy.setBox(me.getBox());
  1012.         }
  1013.         return proxy;
  1014.     }
  1015. });
  1016. Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
  1017. // private
  1018. Ext.Element.uncache = function(el){
  1019.     for(var i = 0, a = arguments, len = a.length; i < len; i++) {
  1020.         if(a[i]){
  1021.             delete Ext.Element.cache[a[i].id || a[i]];
  1022.         }
  1023.     }
  1024. };/**
  1025.  * @class Ext.Element
  1026.  */
  1027. Ext.Element.addMethods({
  1028.     /**
  1029.      * Gets the x,y coordinates specified by the anchor position on the element.
  1030.      * @param {String} anchor (optional) The specified anchor position (defaults to "c").  See {@link #alignTo}
  1031.      * for details on supported anchor positions.
  1032.      * @param {Boolean} local (optional) True to get the local (element top/left-relative) anchor position instead
  1033.      * of page coordinates
  1034.      * @param {Object} size (optional) An object containing the size to use for calculating anchor position
  1035.      * {width: (target width), height: (target height)} (defaults to the element's current size)
  1036.      * @return {Array} [x, y] An array containing the element's x and y coordinates
  1037.      */
  1038.     getAnchorXY : function(anchor, local, s){
  1039.         //Passing a different size is useful for pre-calculating anchors,
  1040.         //especially for anchored animations that change the el size.
  1041. anchor = (anchor || "tl").toLowerCase();
  1042.         s = s || {};
  1043.         
  1044.         var me = this,        
  1045.          vp = me.dom == document.body || me.dom == document,
  1046.          w = s.width || vp ? Ext.lib.Dom.getViewWidth() : me.getWidth(),
  1047.          h = s.height || vp ? Ext.lib.Dom.getViewHeight() : me.getHeight(),                  
  1048.          xy,       
  1049.          r = Math.round,
  1050.          o = me.getXY(),
  1051.          scroll = me.getScroll(),
  1052.          extraX = vp ? scroll.left : !local ? o[0] : 0,
  1053.          extraY = vp ? scroll.top : !local ? o[1] : 0,
  1054.          hash = {
  1055.          c  : [r(w * 0.5), r(h * 0.5)],
  1056.          t  : [r(w * 0.5), 0],
  1057.          l  : [0, r(h * 0.5)],
  1058.          r  : [w, r(h * 0.5)],
  1059.          b  : [r(w * 0.5), h],
  1060.          tl : [0, 0],
  1061.          bl : [0, h],
  1062.          br : [w, h],
  1063.          tr : [w, 0]
  1064.          };
  1065.         
  1066.         xy = hash[anchor];
  1067.         return [xy[0] + extraX, xy[1] + extraY]; 
  1068.     },
  1069.     /**
  1070.      * Anchors an element to another element and realigns it when the window is resized.
  1071.      * @param {Mixed} element The element to align to.
  1072.      * @param {String} position The position to align to.
  1073.      * @param {Array} offsets (optional) Offset the positioning by [x, y]
  1074.      * @param {Boolean/Object} animate (optional) True for the default animation or a standard Element animation config object
  1075.      * @param {Boolean/Number} monitorScroll (optional) True to monitor body scroll and reposition. If this parameter
  1076.      * is a number, it is used as the buffer delay (defaults to 50ms).
  1077.      * @param {Function} callback The function to call after the animation finishes
  1078.      * @return {Ext.Element} this
  1079.      */
  1080.     anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){        
  1081.     var me = this,
  1082.             dom = me.dom;
  1083.     
  1084.     function action(){
  1085.             Ext.fly(dom).alignTo(el, alignment, offsets, animate);
  1086.             Ext.callback(callback, Ext.fly(dom));
  1087.         }
  1088.         
  1089.         Ext.EventManager.onWindowResize(action, me);
  1090.         
  1091.         if(!Ext.isEmpty(monitorScroll)){
  1092.             Ext.EventManager.on(window, 'scroll', action, me,
  1093.                 {buffer: !isNaN(monitorScroll) ? monitorScroll : 50});
  1094.         }
  1095.         action.call(me); // align immediately
  1096.         return me;
  1097.     },
  1098.     /**
  1099.      * Gets the x,y coordinates to align this element with another element. See {@link #alignTo} for more info on the
  1100.      * supported position values.
  1101.      * @param {Mixed} element The element to align to.
  1102.      * @param {String} position The position to align to.
  1103.      * @param {Array} offsets (optional) Offset the positioning by [x, y]
  1104.      * @return {Array} [x, y]
  1105.      */
  1106.     getAlignToXY : function(el, p, o){     
  1107.         el = Ext.get(el);
  1108.         
  1109.         if(!el || !el.dom){
  1110.             throw "Element.alignToXY with an element that doesn't exist";
  1111.         }
  1112.         
  1113.         o = o || [0,0];
  1114.         p = (p == "?" ? "tl-bl?" : (!/-/.test(p) && p !== "" ? "tl-" + p : p || "tl-bl")).toLowerCase();       
  1115.                 
  1116.         var me = this,
  1117.          d = me.dom,
  1118.          a1,
  1119.          a2,
  1120.          x,
  1121.          y,
  1122.          //constrain the aligned el to viewport if necessary
  1123.          w,
  1124.          h,
  1125.          r,
  1126.          dw = Ext.lib.Dom.getViewWidth() -10, // 10px of margin for ie
  1127.          dh = Ext.lib.Dom.getViewHeight()-10, // 10px of margin for ie
  1128.          p1y,
  1129.          p1x,        
  1130.          p2y,
  1131.          p2x,
  1132.          swapY,
  1133.          swapX,
  1134.          doc = document,
  1135.          docElement = doc.documentElement,
  1136.          docBody = doc.body,
  1137.          scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0)+5,
  1138.          scrollY = (docElement.scrollTop || docBody.scrollTop || 0)+5,
  1139.          c = false, //constrain to viewport
  1140.          p1 = "", 
  1141.          p2 = "",
  1142.          m = p.match(/^([a-z]+)-([a-z]+)(?)?$/);
  1143.         
  1144.         if(!m){
  1145.            throw "Element.alignTo with an invalid alignment " + p;
  1146.         }
  1147.         
  1148.         p1 = m[1]; 
  1149.         p2 = m[2]; 
  1150.         c = !!m[3];
  1151.         //Subtract the aligned el's internal xy from the target's offset xy
  1152.         //plus custom offset to get the aligned el's new offset xy
  1153.         a1 = me.getAnchorXY(p1, true);
  1154.         a2 = el.getAnchorXY(p2, false);
  1155.         x = a2[0] - a1[0] + o[0];
  1156.         y = a2[1] - a1[1] + o[1];
  1157.         if(c){    
  1158.        w = me.getWidth();
  1159.            h = me.getHeight();
  1160.            r = el.getRegion();       
  1161.            //If we are at a viewport boundary and the aligned el is anchored on a target border that is
  1162.            //perpendicular to the vp border, allow the aligned el to slide on that border,
  1163.            //otherwise swap the aligned el to the opposite border of the target.
  1164.            p1y = p1.charAt(0);
  1165.            p1x = p1.charAt(p1.length-1);
  1166.            p2y = p2.charAt(0);
  1167.            p2x = p2.charAt(p2.length-1);
  1168.            swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
  1169.            swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));          
  1170.            
  1171.            if (x + w > dw + scrollX) {
  1172.                 x = swapX ? r.left-w : dw+scrollX-w;
  1173.            }
  1174.            if (x < scrollX) {
  1175.                x = swapX ? r.right : scrollX;
  1176.            }
  1177.            if (y + h > dh + scrollY) {
  1178.                 y = swapY ? r.top-h : dh+scrollY-h;
  1179.             }
  1180.            if (y < scrollY){
  1181.                y = swapY ? r.bottom : scrollY;
  1182.            }
  1183.         }
  1184.         return [x,y];
  1185.     },
  1186.     /**
  1187.      * Aligns this element with another element relative to the specified anchor points. If the other element is the
  1188.      * document it aligns it to the viewport.
  1189.      * The position parameter is optional, and can be specified in any one of the following formats:
  1190.      * <ul>
  1191.      *   <li><b>Blank</b>: Defaults to aligning the element's top-left corner to the target's bottom-left corner ("tl-bl").</li>
  1192.      *   <li><b>One anchor (deprecated)</b>: The passed anchor position is used as the target element's anchor point.
  1193.      *       The element being aligned will position its top-left corner (tl) to that point.  <i>This method has been
  1194.      *       deprecated in favor of the newer two anchor syntax below</i>.</li>
  1195.      *   <li><b>Two anchors</b>: If two values from the table below are passed separated by a dash, the first value is used as the
  1196.      *       element's anchor point, and the second value is used as the target's anchor point.</li>
  1197.      * </ul>
  1198.      * In addition to the anchor points, the position parameter also supports the "?" character.  If "?" is passed at the end of
  1199.      * the position string, the element will attempt to align as specified, but the position will be adjusted to constrain to
  1200.      * the viewport if necessary.  Note that the element being aligned might be swapped to align to a different position than
  1201.      * that specified in order to enforce the viewport constraints.
  1202.      * Following are all of the supported anchor positions:
  1203. <pre>
  1204. Value  Description
  1205. -----  -----------------------------
  1206. tl     The top left corner (default)
  1207. t      The center of the top edge
  1208. tr     The top right corner
  1209. l      The center of the left edge
  1210. c      In the center of the element
  1211. r      The center of the right edge
  1212. bl     The bottom left corner
  1213. b      The center of the bottom edge
  1214. br     The bottom right corner
  1215. </pre>
  1216. Example Usage:
  1217. <pre><code>
  1218. // align el to other-el using the default positioning ("tl-bl", non-constrained)
  1219. el.alignTo("other-el");
  1220. // align the top left corner of el with the top right corner of other-el (constrained to viewport)
  1221. el.alignTo("other-el", "tr?");
  1222. // align the bottom right corner of el with the center left edge of other-el
  1223. el.alignTo("other-el", "br-l?");
  1224. // align the center of el with the bottom left corner of other-el and
  1225. // adjust the x position by -6 pixels (and the y position by 0)
  1226. el.alignTo("other-el", "c-bl", [-6, 0]);
  1227. </code></pre>
  1228.      * @param {Mixed} element The element to align to.
  1229.      * @param {String} position The position to align to.
  1230.      * @param {Array} offsets (optional) Offset the positioning by [x, y]
  1231.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1232.      * @return {Ext.Element} this
  1233.      */
  1234.     alignTo : function(element, position, offsets, animate){
  1235.     var me = this;
  1236.         return me.setXY(me.getAlignToXY(element, position, offsets),
  1237.                    me.preanim && !!animate ? me.preanim(arguments, 3) : false);
  1238.     },
  1239.     
  1240.     // private ==>  used outside of core
  1241.     adjustForConstraints : function(xy, parent, offsets){
  1242.         return this.getConstrainToXY(parent || document, false, offsets, xy) ||  xy;
  1243.     },
  1244.     // private ==>  used outside of core
  1245.     getConstrainToXY : function(el, local, offsets, proposedXY){   
  1246.     var os = {top:0, left:0, bottom:0, right: 0};
  1247.         return function(el, local, offsets, proposedXY){
  1248.             el = Ext.get(el);
  1249.             offsets = offsets ? Ext.applyIf(offsets, os) : os;
  1250.             var vw, vh, vx = 0, vy = 0;
  1251.             if(el.dom == document.body || el.dom == document){
  1252.                 vw =Ext.lib.Dom.getViewWidth();
  1253.                 vh = Ext.lib.Dom.getViewHeight();
  1254.             }else{
  1255.                 vw = el.dom.clientWidth;
  1256.                 vh = el.dom.clientHeight;
  1257.                 if(!local){
  1258.                     var vxy = el.getXY();
  1259.                     vx = vxy[0];
  1260.                     vy = vxy[1];
  1261.                 }
  1262.             }
  1263.             var s = el.getScroll();
  1264.             vx += offsets.left + s.left;
  1265.             vy += offsets.top + s.top;
  1266.             vw -= offsets.right;
  1267.             vh -= offsets.bottom;
  1268.             var vr = vx+vw;
  1269.             var vb = vy+vh;
  1270.             var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]);
  1271.             var x = xy[0], y = xy[1];
  1272.             var w = this.dom.offsetWidth, h = this.dom.offsetHeight;
  1273.             // only move it if it needs it
  1274.             var moved = false;
  1275.             // first validate right/bottom
  1276.             if((x + w) > vr){
  1277.                 x = vr - w;
  1278.                 moved = true;
  1279.             }
  1280.             if((y + h) > vb){
  1281.                 y = vb - h;
  1282.                 moved = true;
  1283.             }
  1284.             // then make sure top/left isn't negative
  1285.             if(x < vx){
  1286.                 x = vx;
  1287.                 moved = true;
  1288.             }
  1289.             if(y < vy){
  1290.                 y = vy;
  1291.                 moved = true;
  1292.             }
  1293.             return moved ? [x, y] : false;
  1294.         };
  1295.     }(),
  1296.     
  1297.     
  1298.         
  1299. //         el = Ext.get(el);
  1300. //         offsets = Ext.applyIf(offsets || {}, {top : 0, left : 0, bottom : 0, right : 0});
  1301. //         var me = this,
  1302. //          doc = document,
  1303. //          s = el.getScroll(),
  1304. //          vxy = el.getXY(),
  1305. //          vx = offsets.left + s.left, 
  1306. //          vy = offsets.top + s.top,            
  1307. //          vw = -offsets.right, 
  1308. //          vh = -offsets.bottom, 
  1309. //          vr,
  1310. //          vb,
  1311. //          xy = proposedXY || (!local ? me.getXY() : [me.getLeft(true), me.getTop(true)]),
  1312. //          x = xy[0],
  1313. //          y = xy[1],
  1314. //          w = me.dom.offsetWidth, h = me.dom.offsetHeight,
  1315. //          moved = false; // only move it if it needs it
  1316. //       
  1317. //         
  1318. //         if(el.dom == doc.body || el.dom == doc){
  1319. //             vw += Ext.lib.Dom.getViewWidth();
  1320. //             vh += Ext.lib.Dom.getViewHeight();
  1321. //         }else{
  1322. //             vw += el.dom.clientWidth;
  1323. //             vh += el.dom.clientHeight;
  1324. //             if(!local){                    
  1325. //                 vx += vxy[0];
  1326. //                 vy += vxy[1];
  1327. //             }
  1328. //         }
  1329. //         // first validate right/bottom
  1330. //         if(x + w > vx + vw){
  1331. //             x = vx + vw - w;
  1332. //             moved = true;
  1333. //         }
  1334. //         if(y + h > vy + vh){
  1335. //             y = vy + vh - h;
  1336. //             moved = true;
  1337. //         }
  1338. //         // then make sure top/left isn't negative
  1339. //         if(x < vx){
  1340. //             x = vx;
  1341. //             moved = true;
  1342. //         }
  1343. //         if(y < vy){
  1344. //             y = vy;
  1345. //             moved = true;
  1346. //         }
  1347. //         return moved ? [x, y] : false;
  1348. //    },
  1349.     
  1350.     /**
  1351.     * Calculates the x, y to center this element on the screen
  1352.     * @return {Array} The x, y values [x, y]
  1353.     */
  1354.     getCenterXY : function(){
  1355.         return this.getAlignToXY(document, 'c-c');
  1356.     },
  1357.     /**
  1358.     * Centers the Element in either the viewport, or another Element.
  1359.     * @param {Mixed} centerIn (optional) The element in which to center the element.
  1360.     */
  1361.     center : function(centerIn){
  1362.         return this.alignTo(centerIn || document, 'c-c');        
  1363.     }    
  1364. });
  1365. /**
  1366.  * @class Ext.Element
  1367.  */
  1368. Ext.Element.addMethods(function(){
  1369. var PARENTNODE = 'parentNode',
  1370. NEXTSIBLING = 'nextSibling',
  1371. PREVIOUSSIBLING = 'previousSibling',
  1372. DQ = Ext.DomQuery,
  1373. GET = Ext.get;
  1374. return {
  1375. /**
  1376.      * Looks at this node and then at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child)
  1377.      * @param {String} selector The simple selector to test
  1378.      * @param {Number/Mixed} maxDepth (optional) The max depth to search as a number or element (defaults to 50 || document.body)
  1379.      * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
  1380.      * @return {HTMLElement} The matching DOM node (or null if no match was found)
  1381.      */
  1382.     findParent : function(simpleSelector, maxDepth, returnEl){
  1383.         var p = this.dom,
  1384.          b = document.body, 
  1385.          depth = 0,          
  1386.          stopEl;         
  1387.             if(Ext.isGecko && Object.prototype.toString.call(p) == '[object XULElement]') {
  1388.                 return null;
  1389.             }
  1390.         maxDepth = maxDepth || 50;
  1391.         if (isNaN(maxDepth)) {
  1392.             stopEl = Ext.getDom(maxDepth);
  1393.             maxDepth = Number.MAX_VALUE;
  1394.         }
  1395.         while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){
  1396.             if(DQ.is(p, simpleSelector)){
  1397.                 return returnEl ? GET(p) : p;
  1398.             }
  1399.             depth++;
  1400.             p = p.parentNode;
  1401.         }
  1402.         return null;
  1403.     },
  1404.     /**
  1405.      * Looks at parent nodes for a match of the passed simple selector (e.g. div.some-class or span:first-child)
  1406.      * @param {String} selector The simple selector to test
  1407.      * @param {Number/Mixed} maxDepth (optional) The max depth to
  1408.             search as a number or element (defaults to 10 || document.body)
  1409.      * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
  1410.      * @return {HTMLElement} The matching DOM node (or null if no match was found)
  1411.      */
  1412.     findParentNode : function(simpleSelector, maxDepth, returnEl){
  1413.         var p = Ext.fly(this.dom.parentNode, '_internal');
  1414.         return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
  1415.     },
  1416.     /**
  1417.      * Walks up the dom looking for a parent node that matches the passed simple selector (e.g. div.some-class or span:first-child).
  1418.      * This is a shortcut for findParentNode() that always returns an Ext.Element.
  1419.      * @param {String} selector The simple selector to test
  1420.      * @param {Number/Mixed} maxDepth (optional) The max depth to
  1421.             search as a number or element (defaults to 10 || document.body)
  1422.      * @return {Ext.Element} The matching DOM node (or null if no match was found)
  1423.      */
  1424.     up : function(simpleSelector, maxDepth){
  1425.         return this.findParentNode(simpleSelector, maxDepth, true);
  1426.     },
  1427.     /**
  1428.      * Creates a {@link Ext.CompositeElement} for child nodes based on the passed CSS selector (the selector should not contain an id).
  1429.      * @param {String} selector The CSS selector
  1430.      * @param {Boolean} unique (optional) True to create a unique Ext.Element for each child (defaults to false, which creates a single shared flyweight object)
  1431.      * @return {CompositeElement/CompositeElementLite} The composite element
  1432.      */
  1433.     select : function(selector, unique){
  1434.         return Ext.Element.select(selector, unique, this.dom);
  1435.     },
  1436.     /**
  1437.      * Selects child nodes based on the passed CSS selector (the selector should not contain an id).
  1438.      * @param {String} selector The CSS selector
  1439.      * @return {Array} An array of the matched nodes
  1440.      */
  1441.     query : function(selector, unique){
  1442.         return DQ.select(selector, this.dom);
  1443.     },
  1444.     /**
  1445.      * Selects a single child at any depth below this element based on the passed CSS selector (the selector should not contain an id).
  1446.      * @param {String} selector The CSS selector
  1447.      * @param {Boolean} returnDom (optional) True to return the DOM node instead of Ext.Element (defaults to false)
  1448.      * @return {HTMLElement/Ext.Element} The child Ext.Element (or DOM node if returnDom = true)
  1449.      */
  1450.     child : function(selector, returnDom){
  1451.         var n = DQ.selectNode(selector, this.dom);
  1452.         return returnDom ? n : GET(n);
  1453.     },
  1454.     /**
  1455.      * Selects a single *direct* child based on the passed CSS selector (the selector should not contain an id).
  1456.      * @param {String} selector The CSS selector
  1457.      * @param {Boolean} returnDom (optional) True to return the DOM node instead of Ext.Element (defaults to false)
  1458.      * @return {HTMLElement/Ext.Element} The child Ext.Element (or DOM node if returnDom = true)
  1459.      */
  1460.     down : function(selector, returnDom){
  1461.         var n = DQ.selectNode(" > " + selector, this.dom);
  1462.         return returnDom ? n : GET(n);
  1463.     },
  1464.  /**
  1465.      * Gets the parent node for this element, optionally chaining up trying to match a selector
  1466.      * @param {String} selector (optional) Find a parent node that matches the passed simple selector
  1467.      * @param {Boolean} returnDom (optional) True to return a raw dom node instead of an Ext.Element
  1468.      * @return {Ext.Element/HTMLElement} The parent node or null
  1469.  */
  1470.     parent : function(selector, returnDom){
  1471.         return this.matchNode(PARENTNODE, PARENTNODE, selector, returnDom);
  1472.     },
  1473.      /**
  1474.      * Gets the next sibling, skipping text nodes
  1475.      * @param {String} selector (optional) Find the next sibling that matches the passed simple selector
  1476.      * @param {Boolean} returnDom (optional) True to return a raw dom node instead of an Ext.Element
  1477.      * @return {Ext.Element/HTMLElement} The next sibling or null
  1478.  */
  1479.     next : function(selector, returnDom){
  1480.         return this.matchNode(NEXTSIBLING, NEXTSIBLING, selector, returnDom);
  1481.     },
  1482.     /**
  1483.      * Gets the previous sibling, skipping text nodes
  1484.      * @param {String} selector (optional) Find the previous sibling that matches the passed simple selector
  1485.      * @param {Boolean} returnDom (optional) True to return a raw dom node instead of an Ext.Element
  1486.      * @return {Ext.Element/HTMLElement} The previous sibling or null
  1487.  */
  1488.     prev : function(selector, returnDom){
  1489.         return this.matchNode(PREVIOUSSIBLING, PREVIOUSSIBLING, selector, returnDom);
  1490.     },
  1491.     /**
  1492.      * Gets the first child, skipping text nodes
  1493.      * @param {String} selector (optional) Find the next sibling that matches the passed simple selector
  1494.      * @param {Boolean} returnDom (optional) True to return a raw dom node instead of an Ext.Element
  1495.      * @return {Ext.Element/HTMLElement} The first child or null
  1496.  */
  1497.     first : function(selector, returnDom){
  1498.         return this.matchNode(NEXTSIBLING, 'firstChild', selector, returnDom);
  1499.     },
  1500.     /**
  1501.      * Gets the last child, skipping text nodes
  1502.      * @param {String} selector (optional) Find the previous sibling that matches the passed simple selector
  1503.      * @param {Boolean} returnDom (optional) True to return a raw dom node instead of an Ext.Element
  1504.      * @return {Ext.Element/HTMLElement} The last child or null
  1505.  */
  1506.     last : function(selector, returnDom){
  1507.         return this.matchNode(PREVIOUSSIBLING, 'lastChild', selector, returnDom);
  1508.     },
  1509.     
  1510.     matchNode : function(dir, start, selector, returnDom){
  1511.         var n = this.dom[start];
  1512.         while(n){
  1513.             if(n.nodeType == 1 && (!selector || DQ.is(n, selector))){
  1514.                 return !returnDom ? GET(n) : n;
  1515.             }
  1516.             n = n[dir];
  1517.         }
  1518.         return null;
  1519.     }
  1520.     }
  1521. }());/**
  1522.  * @class Ext.Element
  1523.  */
  1524. Ext.Element.addMethods(
  1525. function() {
  1526. var GETDOM = Ext.getDom,
  1527. GET = Ext.get,
  1528. DH = Ext.DomHelper,
  1529.         isEl = function(el){
  1530.             return  (el.nodeType || el.dom || typeof el == 'string');  
  1531.         };
  1532. return {
  1533.     /**
  1534.      * Appends the passed element(s) to this element
  1535.      * @param {String/HTMLElement/Array/Element/CompositeElement} el
  1536.      * @return {Ext.Element} this
  1537.      */
  1538.     appendChild: function(el){        
  1539.         return GET(el).appendTo(this);        
  1540.     },
  1541.     /**
  1542.      * Appends this element to the passed element
  1543.      * @param {Mixed} el The new parent element
  1544.      * @return {Ext.Element} this
  1545.      */
  1546.     appendTo: function(el){        
  1547.         GETDOM(el).appendChild(this.dom);