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

JavaScript

开发平台:

JavaScript

  1.         * <p>This special markup is used throughout Ext when box wrapping elements ({@link Ext.Button},
  2.         * {@link Ext.Panel} when <tt>{@link Ext.Panel#frame frame=true}</tt>, {@link Ext.Window}).  The markup
  3.         * is of this form:</p>
  4.         * <pre><code>
  5.     Ext.Element.boxMarkup =
  6.     &#39;&lt;div class="{0}-tl">&lt;div class="{0}-tr">&lt;div class="{0}-tc">&lt;/div>&lt;/div>&lt;/div>
  7.      &lt;div class="{0}-ml">&lt;div class="{0}-mr">&lt;div class="{0}-mc">&lt;/div>&lt;/div>&lt;/div>
  8.      &lt;div class="{0}-bl">&lt;div class="{0}-br">&lt;div class="{0}-bc">&lt;/div>&lt;/div>&lt;/div>&#39;;
  9.         * </code></pre>
  10.         * <p>Example usage:</p>
  11.         * <pre><code>
  12.     // Basic box wrap
  13.     Ext.get("foo").boxWrap();
  14.     // You can also add a custom class and use CSS inheritance rules to customize the box look.
  15.     // 'x-box-blue' is a built-in alternative -- look at the related CSS definitions as an example
  16.     // for how to create a custom box wrap style.
  17.     Ext.get("foo").boxWrap().addClass("x-box-blue");
  18.         * </code></pre>
  19.         * @param {String} class (optional) A base CSS class to apply to the containing wrapper element
  20.         * (defaults to <tt>'x-box'</tt>). Note that there are a number of CSS rules that are dependent on
  21.         * this name to make the overall effect work, so if you supply an alternate base class, make sure you
  22.         * also supply all of the necessary rules.
  23.         * @return {Ext.Element} The outermost wrapping element of the created box structure.
  24.         */
  25.         boxWrap : function(cls){
  26.             cls = cls || 'x-box';
  27.             var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + String.format(Ext.Element.boxMarkup, cls) + "</div>"));        //String.format('<div class="{0}">'+Ext.Element.boxMarkup+'</div>', cls)));
  28.             Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
  29.             return el;
  30.         },
  31.         /**
  32.          * Set the size of this Element. If animation is true, both width and height will be animated concurrently.
  33.          * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  34.          * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  35.          * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  36.          * <li>A size object in the format <code>{width: widthValue, height: heightValue}</code>.</li>
  37.          * </ul></div>
  38.          * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  39.          * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  40.          * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  41.          * </ul></div>
  42.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  43.          * @return {Ext.Element} this
  44.          */
  45.         setSize : function(width, height, animate){
  46.             var me = this;
  47.             if(Ext.isObject(width)){ // in case of object from getSize()
  48.                 height = width.height;
  49.                 width = width.width;
  50.             }
  51.             width = me.adjustWidth(width);
  52.             height = me.adjustHeight(height);
  53.             if(!animate || !me.anim){
  54.                 me.dom.style.width = me.addUnits(width);
  55.                 me.dom.style.height = me.addUnits(height);
  56.             }else{
  57.                 me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2));
  58.             }
  59.             return me;
  60.         },
  61.         /**
  62.          * Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders
  63.          * when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements
  64.          * if a height has not been set using CSS.
  65.          * @return {Number}
  66.          */
  67.         getComputedHeight : function(){
  68.             var me = this,
  69.                 h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
  70.             if(!h){
  71.                 h = parseInt(me.getStyle('height'), 10) || 0;
  72.                 if(!me.isBorderBox()){
  73.                     h += me.getFrameWidth('tb');
  74.                 }
  75.             }
  76.             return h;
  77.         },
  78.         /**
  79.          * Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders
  80.          * when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements
  81.          * if a width has not been set using CSS.
  82.          * @return {Number}
  83.          */
  84.         getComputedWidth : function(){
  85.             var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
  86.             if(!w){
  87.                 w = parseInt(this.getStyle('width'), 10) || 0;
  88.                 if(!this.isBorderBox()){
  89.                     w += this.getFrameWidth('lr');
  90.                 }
  91.             }
  92.             return w;
  93.         },
  94.         /**
  95.          * Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth()
  96.          for more information about the sides.
  97.          * @param {String} sides
  98.          * @return {Number}
  99.          */
  100.         getFrameWidth : function(sides, onlyContentBox){
  101.             return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
  102.         },
  103.         /**
  104.          * Sets up event handlers to add and remove a css class when the mouse is over this element
  105.          * @param {String} className
  106.          * @return {Ext.Element} this
  107.          */
  108.         addClassOnOver : function(className){
  109.             this.hover(
  110.                 function(){
  111.                     Ext.fly(this, INTERNAL).addClass(className);
  112.                 },
  113.                 function(){
  114.                     Ext.fly(this, INTERNAL).removeClass(className);
  115.                 }
  116.             );
  117.             return this;
  118.         },
  119.         /**
  120.          * Sets up event handlers to add and remove a css class when this element has the focus
  121.          * @param {String} className
  122.          * @return {Ext.Element} this
  123.          */
  124.         addClassOnFocus : function(className){
  125.             this.on("focus", function(){
  126.                 Ext.fly(this, INTERNAL).addClass(className);
  127.             }, this.dom);
  128.             this.on("blur", function(){
  129.                 Ext.fly(this, INTERNAL).removeClass(className);
  130.             }, this.dom);
  131.             return this;
  132.         },
  133.         /**
  134.          * Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect)
  135.          * @param {String} className
  136.          * @return {Ext.Element} this
  137.          */
  138.         addClassOnClick : function(className){
  139.             var dom = this.dom;
  140.             this.on("mousedown", function(){
  141.                 Ext.fly(dom, INTERNAL).addClass(className);
  142.                 var d = Ext.getDoc(),
  143.                     fn = function(){
  144.                         Ext.fly(dom, INTERNAL).removeClass(className);
  145.                         d.removeListener("mouseup", fn);
  146.                     };
  147.                 d.on("mouseup", fn);
  148.             });
  149.             return this;
  150.         },
  151.         /**
  152.          * <p>Returns the dimensions of the element available to lay content out in.<p>
  153.          * <p>If the element (or any ancestor element) has CSS style <code>display : none</code>, the dimensions will be zero.</p>
  154.          * example:<pre><code>
  155.         var vpSize = Ext.getBody().getViewSize();
  156.         // all Windows created afterwards will have a default value of 90% height and 95% width
  157.         Ext.Window.override({
  158.             width: vpSize.width * 0.9,
  159.             height: vpSize.height * 0.95
  160.         });
  161.         // To handle window resizing you would have to hook onto onWindowResize.
  162.         </code></pre>
  163.          * @param {Boolean} contentBox True to return the W3 content box <i>within</i> the padding area of the element. False
  164.          * or omitted to return the full area of the element within the border. See <a href="http://www.w3.org/TR/CSS2/box.html">http://www.w3.org/TR/CSS2/box.html</a>
  165.          * @return {Object} An object containing the elements's area: <code>{width: &lt;element width>, height: &lt;element height>}</code>
  166.          */
  167.         getViewSize : function(contentBox){
  168.             var doc = document,
  169.                 me = this,
  170.                 d = me.dom,
  171.                 extdom = Ext.lib.Dom,
  172.                 isDoc = (d == doc || d == doc.body),
  173.                 isBB, w, h, tbBorder = 0, lrBorder = 0,
  174.                 tbPadding = 0, lrPadding = 0;
  175.             if (isDoc) {
  176.                 return { width: extdom.getViewWidth(), height: extdom.getViewHeight() };
  177.             }
  178.             isBB = me.isBorderBox();
  179.             tbBorder = me.getBorderWidth('tb');
  180.             lrBorder = me.getBorderWidth('lr');
  181.             tbPadding = me.getPadding('tb');
  182.             lrPadding = me.getPadding('lr');
  183.             // Width calcs
  184.             // Try the style first, then clientWidth, then offsetWidth
  185.             if (w = me.getStyle('width').match(pxMatch)){
  186.                 if ((w = parseInt(w[1], 10)) && isBB){
  187.                     // Style includes the padding and border if isBB
  188.                     w -= (lrBorder + lrPadding);
  189.                 }
  190.                 if (!contentBox){
  191.                     w += lrPadding;
  192.                 }
  193.             } else {
  194.                 if (!(w = d.clientWidth) && (w = d.offsetWidth)){
  195.                     w -= lrBorder;
  196.                 }
  197.                 if (w && contentBox){
  198.                     w -= lrPadding;
  199.                 }
  200.             }
  201.             // Height calcs
  202.             // Try the style first, then clientHeight, then offsetHeight
  203.             if (h = me.getStyle('height').match(pxMatch)){
  204.                 if ((h = parseInt(h[1], 10)) && isBB){
  205.                     // Style includes the padding and border if isBB
  206.                     h -= (tbBorder + tbPadding);
  207.                 }
  208.                 if (!contentBox){
  209.                     h += tbPadding;
  210.                 }
  211.             } else {
  212.                 if (!(h = d.clientHeight) && (h = d.offsetHeight)){
  213.                     h -= tbBorder;
  214.                 }
  215.                 if (h && contentBox){
  216.                     h -= tbPadding;
  217.                 }
  218.             }
  219.             return {
  220.                 width : w,
  221.                 height : h
  222.             };
  223.         },
  224.         /**
  225.          * Returns the size of the element.
  226.          * @param {Boolean} contentSize (optional) true to get the width/size minus borders and padding
  227.          * @return {Object} An object containing the element's size {width: (element width), height: (element height)}
  228.          */
  229.         getSize : function(contentSize){
  230.             return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
  231.         },
  232.         /**
  233.          * Forces the browser to repaint this element
  234.          * @return {Ext.Element} this
  235.          */
  236.         repaint : function(){
  237.             var dom = this.dom;
  238.             this.addClass("x-repaint");
  239.             setTimeout(function(){
  240.                 Ext.fly(dom).removeClass("x-repaint");
  241.             }, 1);
  242.             return this;
  243.         },
  244.         /**
  245.          * Disables text selection for this element (normalized across browsers)
  246.          * @return {Ext.Element} this
  247.          */
  248.         unselectable : function(){
  249.             this.dom.unselectable = "on";
  250.             return this.swallowEvent("selectstart", true).
  251.                         applyStyles("-moz-user-select:none;-khtml-user-select:none;").
  252.                         addClass("x-unselectable");
  253.         },
  254.         /**
  255.          * Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed,
  256.          * then it returns the calculated width of the sides (see getPadding)
  257.          * @param {String} sides (optional) Any combination of l, r, t, b to get the sum of those sides
  258.          * @return {Object/Number}
  259.          */
  260.         getMargins : function(side){
  261.             var me = this,
  262.                 key,
  263.                 hash = {t:"top", l:"left", r:"right", b: "bottom"},
  264.                 o = {};
  265.             if (!side) {
  266.                 for (key in me.margins){
  267.                     o[hash[key]] = parseInt(me.getStyle(me.margins[key]), 10) || 0;
  268.                 }
  269.                 return o;
  270.             } else {
  271.                 return me.addStyles.call(me, side, me.margins);
  272.             }
  273.         }
  274.     };
  275. }());
  276. /**
  277.  * @class Ext.Element
  278.  */
  279. (function(){
  280. var D = Ext.lib.Dom,
  281.         LEFT = "left",
  282.         RIGHT = "right",
  283.         TOP = "top",
  284.         BOTTOM = "bottom",
  285.         POSITION = "position",
  286.         STATIC = "static",
  287.         RELATIVE = "relative",
  288.         AUTO = "auto",
  289.         ZINDEX = "z-index";
  290. Ext.Element.addMethods({
  291. /**
  292.       * Gets the current X position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  293.       * @return {Number} The X position of the element
  294.       */
  295.     getX : function(){
  296.         return D.getX(this.dom);
  297.     },
  298.     /**
  299.       * Gets the current Y position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  300.       * @return {Number} The Y position of the element
  301.       */
  302.     getY : function(){
  303.         return D.getY(this.dom);
  304.     },
  305.     /**
  306.       * Gets the current position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  307.       * @return {Array} The XY position of the element
  308.       */
  309.     getXY : function(){
  310.         return D.getXY(this.dom);
  311.     },
  312.     /**
  313.       * Returns the offsets of this element from the passed element. Both element must be part of the DOM tree and not have display:none to have page coordinates.
  314.       * @param {Mixed} element The element to get the offsets from.
  315.       * @return {Array} The XY page offsets (e.g. [100, -200])
  316.       */
  317.     getOffsetsTo : function(el){
  318.         var o = this.getXY(),
  319.          e = Ext.fly(el, '_internal').getXY();
  320.         return [o[0]-e[0],o[1]-e[1]];
  321.     },
  322.     /**
  323.      * Sets the X position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  324.      * @param {Number} The X position of the element
  325.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  326.      * @return {Ext.Element} this
  327.      */
  328.     setX : function(x, animate){     
  329.     return this.setXY([x, this.getY()], this.animTest(arguments, animate, 1));
  330.     },
  331.     /**
  332.      * Sets the Y position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  333.      * @param {Number} The Y position of the element
  334.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  335.      * @return {Ext.Element} this
  336.      */
  337.     setY : function(y, animate){     
  338.     return this.setXY([this.getX(), y], this.animTest(arguments, animate, 1));
  339.     },
  340.     /**
  341.      * Sets the element's left position directly using CSS style (instead of {@link #setX}).
  342.      * @param {String} left The left CSS property value
  343.      * @return {Ext.Element} this
  344.      */
  345.     setLeft : function(left){
  346.         this.setStyle(LEFT, this.addUnits(left));
  347.         return this;
  348.     },
  349.     /**
  350.      * Sets the element's top position directly using CSS style (instead of {@link #setY}).
  351.      * @param {String} top The top CSS property value
  352.      * @return {Ext.Element} this
  353.      */
  354.     setTop : function(top){
  355.         this.setStyle(TOP, this.addUnits(top));
  356.         return this;
  357.     },
  358.     /**
  359.      * Sets the element's CSS right style.
  360.      * @param {String} right The right CSS property value
  361.      * @return {Ext.Element} this
  362.      */
  363.     setRight : function(right){
  364.         this.setStyle(RIGHT, this.addUnits(right));
  365.         return this;
  366.     },
  367.     /**
  368.      * Sets the element's CSS bottom style.
  369.      * @param {String} bottom The bottom CSS property value
  370.      * @return {Ext.Element} this
  371.      */
  372.     setBottom : function(bottom){
  373.         this.setStyle(BOTTOM, this.addUnits(bottom));
  374.         return this;
  375.     },
  376.     /**
  377.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  378.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  379.      * @param {Array} pos Contains X & Y [x, y] values for new position (coordinates are page-based)
  380.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  381.      * @return {Ext.Element} this
  382.      */
  383.     setXY : function(pos, animate){
  384.     var me = this;
  385.         if(!animate || !me.anim){
  386.             D.setXY(me.dom, pos);
  387.         }else{
  388.             me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion');
  389.         }
  390.         return me;
  391.     },
  392.     /**
  393.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  394.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  395.      * @param {Number} x X value for new position (coordinates are page-based)
  396.      * @param {Number} y Y value for new position (coordinates are page-based)
  397.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  398.      * @return {Ext.Element} this
  399.      */
  400.     setLocation : function(x, y, animate){
  401.         return this.setXY([x, y], this.animTest(arguments, animate, 2));
  402.     },
  403.     /**
  404.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  405.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  406.      * @param {Number} x X value for new position (coordinates are page-based)
  407.      * @param {Number} y Y value for new position (coordinates are page-based)
  408.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  409.      * @return {Ext.Element} this
  410.      */
  411.     moveTo : function(x, y, animate){
  412.         return this.setXY([x, y], this.animTest(arguments, animate, 2));        
  413.     },    
  414.     
  415.     /**
  416.      * Gets the left X coordinate
  417.      * @param {Boolean} local True to get the local css position instead of page coordinate
  418.      * @return {Number}
  419.      */
  420.     getLeft : function(local){
  421.     return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
  422.     },
  423.     /**
  424.      * Gets the right X coordinate of the element (element X position + element width)
  425.      * @param {Boolean} local True to get the local css position instead of page coordinate
  426.      * @return {Number}
  427.      */
  428.     getRight : function(local){
  429.     var me = this;
  430.     return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0;
  431.     },
  432.     /**
  433.      * Gets the top Y coordinate
  434.      * @param {Boolean} local True to get the local css position instead of page coordinate
  435.      * @return {Number}
  436.      */
  437.     getTop : function(local) {
  438.     return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0;
  439.     },
  440.     /**
  441.      * Gets the bottom Y coordinate of the element (element Y position + element height)
  442.      * @param {Boolean} local True to get the local css position instead of page coordinate
  443.      * @return {Number}
  444.      */
  445.     getBottom : function(local){
  446.     var me = this;
  447.     return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0;
  448.     },
  449.     /**
  450.     * Initializes positioning on this element. If a desired position is not passed, it will make the
  451.     * the element positioned relative IF it is not already positioned.
  452.     * @param {String} pos (optional) Positioning to use "relative", "absolute" or "fixed"
  453.     * @param {Number} zIndex (optional) The zIndex to apply
  454.     * @param {Number} x (optional) Set the page X position
  455.     * @param {Number} y (optional) Set the page Y position
  456.     */
  457.     position : function(pos, zIndex, x, y){
  458.     var me = this;
  459.     
  460.         if(!pos && me.isStyle(POSITION, STATIC)){           
  461.             me.setStyle(POSITION, RELATIVE);           
  462.         } else if(pos) {
  463.             me.setStyle(POSITION, pos);
  464.         }
  465.         if(zIndex){
  466.             me.setStyle(ZINDEX, zIndex);
  467.         }
  468.         if(x || y) me.setXY([x || false, y || false]);
  469.     },
  470.     /**
  471.     * Clear positioning back to the default when the document was loaded
  472.     * @param {String} value (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'.
  473.     * @return {Ext.Element} this
  474.      */
  475.     clearPositioning : function(value){
  476.         value = value || '';
  477.         this.setStyle({
  478.             left : value,
  479.             right : value,
  480.             top : value,
  481.             bottom : value,
  482.             "z-index" : "",
  483.             position : STATIC
  484.         });
  485.         return this;
  486.     },
  487.     /**
  488.     * Gets an object with all CSS positioning properties. Useful along with setPostioning to get
  489.     * snapshot before performing an update and then restoring the element.
  490.     * @return {Object}
  491.     */
  492.     getPositioning : function(){
  493.         var l = this.getStyle(LEFT);
  494.         var t = this.getStyle(TOP);
  495.         return {
  496.             "position" : this.getStyle(POSITION),
  497.             "left" : l,
  498.             "right" : l ? "" : this.getStyle(RIGHT),
  499.             "top" : t,
  500.             "bottom" : t ? "" : this.getStyle(BOTTOM),
  501.             "z-index" : this.getStyle(ZINDEX)
  502.         };
  503.     },
  504.     
  505.     /**
  506.     * Set positioning with an object returned by getPositioning().
  507.     * @param {Object} posCfg
  508.     * @return {Ext.Element} this
  509.      */
  510.     setPositioning : function(pc){
  511.     var me = this,
  512.      style = me.dom.style;
  513.     
  514.         me.setStyle(pc);
  515.         
  516.         if(pc.right == AUTO){
  517.             style.right = "";
  518.         }
  519.         if(pc.bottom == AUTO){
  520.             style.bottom = "";
  521.         }
  522.         
  523.         return me;
  524.     },    
  525.     /**
  526.      * Translates the passed page coordinates into left/top css values for this element
  527.      * @param {Number/Array} x The page x or an array containing [x, y]
  528.      * @param {Number} y (optional) The page y, required if x is not an array
  529.      * @return {Object} An object with left and top properties. e.g. {left: (value), top: (value)}
  530.      */
  531.     translatePoints : function(x, y){              
  532.     y = isNaN(x[1]) ? y : x[1];
  533.         x = isNaN(x[0]) ? x : x[0];
  534.         var me = this,
  535.          relative = me.isStyle(POSITION, RELATIVE),
  536.          o = me.getXY(),
  537.          l = parseInt(me.getStyle(LEFT), 10),
  538.          t = parseInt(me.getStyle(TOP), 10);
  539.         
  540.         l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft);
  541.         t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop);        
  542.         return {left: (x - o[0] + l), top: (y - o[1] + t)}; 
  543.     },
  544.     
  545.     animTest : function(args, animate, i) {
  546.         return !!animate && this.preanim ? this.preanim(args, i) : false;
  547.     }
  548. });
  549. })();/**
  550.  * @class Ext.Element
  551.  */
  552. Ext.Element.addMethods({
  553.     /**
  554.      * Sets the element's box. Use getBox() on another element to get a box obj. If animate is true then width, height, x and y will be animated concurrently.
  555.      * @param {Object} box The box to fill {x, y, width, height}
  556.      * @param {Boolean} adjust (optional) Whether to adjust for box-model issues automatically
  557.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  558.      * @return {Ext.Element} this
  559.      */
  560.     setBox : function(box, adjust, animate){
  561.         var me = this,
  562.          w = box.width, 
  563.          h = box.height;
  564.         if((adjust && !me.autoBoxAdjust) && !me.isBorderBox()){
  565.            w -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  566.            h -= (me.getBorderWidth("tb") + me.getPadding("tb"));
  567.         }
  568.         me.setBounds(box.x, box.y, w, h, me.animTest.call(me, arguments, animate, 2));
  569.         return me;
  570.     },
  571.     /**
  572.      * Return an object defining the area of this Element which can be passed to {@link #setBox} to
  573.      * set another Element's size/location to match this element.
  574.      * @param {Boolean} contentBox (optional) If true a box for the content of the element is returned.
  575.      * @param {Boolean} local (optional) If true the element's left and top are returned instead of page x/y.
  576.      * @return {Object} box An object in the format<pre><code>
  577. {
  578.     x: &lt;Element's X position>,
  579.     y: &lt;Element's Y position>,
  580.     width: &lt;Element's width>,
  581.     height: &lt;Element's height>,
  582.     bottom: &lt;Element's lower bound>,
  583.     right: &lt;Element's rightmost bound>
  584. }
  585. </code></pre>
  586.      * The returned object may also be addressed as an Array where index 0 contains the X position
  587.      * and index 1 contains the Y position. So the result may also be used for {@link #setXY}
  588.      */
  589. getBox : function(contentBox, local) {     
  590.     var me = this,
  591.          xy,
  592.          left,
  593.          top,
  594.          getBorderWidth = me.getBorderWidth,
  595.          getPadding = me.getPadding, 
  596.          l,
  597.          r,
  598.          t,
  599.          b;
  600.         if(!local){
  601.             xy = me.getXY();
  602.         }else{
  603.             left = parseInt(me.getStyle("left"), 10) || 0;
  604.             top = parseInt(me.getStyle("top"), 10) || 0;
  605.             xy = [left, top];
  606.         }
  607.         var el = me.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
  608.         if(!contentBox){
  609.             bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};
  610.         }else{
  611.             l = getBorderWidth.call(me, "l") + getPadding.call(me, "l");
  612.             r = getBorderWidth.call(me, "r") + getPadding.call(me, "r");
  613.             t = getBorderWidth.call(me, "t") + getPadding.call(me, "t");
  614.             b = getBorderWidth.call(me, "b") + getPadding.call(me, "b");
  615.             bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)};
  616.         }
  617.         bx.right = bx.x + bx.width;
  618.         bx.bottom = bx.y + bx.height;
  619.         return bx;
  620. },
  621.     /**
  622.      * Move this element relative to its current position.
  623.      * @param {String} direction Possible values are: "l" (or "left"), "r" (or "right"), "t" (or "top", or "up"), "b" (or "bottom", or "down").
  624.      * @param {Number} distance How far to move the element in pixels
  625.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  626.      * @return {Ext.Element} this
  627.      */
  628.      move : function(direction, distance, animate){
  629.         var me = this,        
  630.          xy = me.getXY(),
  631.          x = xy[0],
  632.          y = xy[1],        
  633.          left = [x - distance, y],
  634.          right = [x + distance, y],
  635.          top = [x, y - distance],
  636.          bottom = [x, y + distance],
  637.         hash = {
  638.          l : left,
  639.          left : left,
  640.          r : right,
  641.          right : right,
  642.          t : top,
  643.          top : top,
  644.          up : top,
  645.          b : bottom, 
  646.          bottom : bottom,
  647.          down : bottom         
  648.         };
  649.         
  650.       direction = direction.toLowerCase();    
  651.       me.moveTo(hash[direction][0], hash[direction][1], me.animTest.call(me, arguments, animate, 2));
  652.     },
  653.     
  654.     /**
  655.      * Quick set left and top adding default units
  656.      * @param {String} left The left CSS property value
  657.      * @param {String} top The top CSS property value
  658.      * @return {Ext.Element} this
  659.      */
  660.      setLeftTop : function(left, top){
  661.     var me = this,
  662.      style = me.dom.style;
  663.         style.left = me.addUnits(left);
  664.         style.top = me.addUnits(top);
  665.         return me;
  666.     },
  667.     
  668.     /**
  669.      * Returns the region of the given element.
  670.      * The element must be part of the DOM tree to have a region (display:none or elements not appended return false).
  671.      * @return {Region} A Ext.lib.Region containing "top, left, bottom, right" member data.
  672.      */
  673.     getRegion : function(){
  674.         return Ext.lib.Dom.getRegion(this.dom);
  675.     },
  676.     
  677.     /**
  678.      * Sets the element's position and size in one shot. If animation is true then width, height, x and y will be animated concurrently.
  679.      * @param {Number} x X value for new position (coordinates are page-based)
  680.      * @param {Number} y Y value for new position (coordinates are page-based)
  681.      * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  682.      * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels)</li>
  683.      * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  684.      * </ul></div>
  685.      * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  686.      * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels)</li>
  687.      * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  688.      * </ul></div>
  689.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  690.      * @return {Ext.Element} this
  691.      */
  692.     setBounds : function(x, y, width, height, animate){
  693.     var me = this;
  694.         if (!animate || !me.anim) {
  695.             me.setSize(width, height);
  696.             me.setLocation(x, y);
  697.         } else {
  698.             me.anim({points: {to: [x, y]}, 
  699.               width: {to: me.adjustWidth(width)}, 
  700.               height: {to: me.adjustHeight(height)}},
  701.                      me.preanim(arguments, 4), 
  702.                      'motion');
  703.         }
  704.         return me;
  705.     },
  706.     /**
  707.      * Sets the element's position and size the specified region. If animation is true then width, height, x and y will be animated concurrently.
  708.      * @param {Ext.lib.Region} region The region to fill
  709.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  710.      * @return {Ext.Element} this
  711.      */
  712.     setRegion : function(region, animate) {
  713.         return this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.animTest.call(this, arguments, animate, 1));
  714.     }
  715. });/**
  716.  * @class Ext.Element
  717.  */
  718. Ext.Element.addMethods({
  719.     /**
  720.      * Returns true if this element is scrollable.
  721.      * @return {Boolean}
  722.      */
  723.     isScrollable : function(){
  724.         var dom = this.dom;
  725.         return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
  726.     },
  727.     /**
  728.      * Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it will try to do it. For auto bounds checking, use scroll().
  729.      * @param {String} side Either "left" for scrollLeft values or "top" for scrollTop values.
  730.      * @param {Number} value The new scroll value.
  731.      * @return {Element} this
  732.      */
  733.     scrollTo : function(side, value){
  734.         this.dom["scroll" + (/top/i.test(side) ? "Top" : "Left")] = value;
  735.         return this;
  736.     },
  737.     /**
  738.      * Returns the current scroll position of the element.
  739.      * @return {Object} An object containing the scroll position in the format {left: (scrollLeft), top: (scrollTop)}
  740.      */
  741.     getScroll : function(){
  742.         var d = this.dom, 
  743.             doc = document,
  744.             body = doc.body,
  745.             docElement = doc.documentElement,
  746.             l,
  747.             t,
  748.             ret;
  749.         if(d == doc || d == body){
  750.             if(Ext.isIE && Ext.isStrict){
  751.                 l = docElement.scrollLeft; 
  752.                 t = docElement.scrollTop;
  753.             }else{
  754.                 l = window.pageXOffset;
  755.                 t = window.pageYOffset;
  756.             }
  757.             ret = {left: l || (body ? body.scrollLeft : 0), top: t || (body ? body.scrollTop : 0)};
  758.         }else{
  759.             ret = {left: d.scrollLeft, top: d.scrollTop};
  760.         }
  761.         return ret;
  762.     }
  763. });/**
  764.  * @class Ext.Element
  765.  */
  766. Ext.Element.addMethods({
  767.     /**
  768.      * Scrolls this element the specified scroll point. It does NOT do bounds checking so if you scroll to a weird value it will try to do it. For auto bounds checking, use scroll().
  769.      * @param {String} side Either "left" for scrollLeft values or "top" for scrollTop values.
  770.      * @param {Number} value The new scroll value
  771.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  772.      * @return {Element} this
  773.      */
  774.     scrollTo : function(side, value, animate){
  775.         var top = /top/i.test(side), //check if we're scrolling top or left
  776.          me = this,
  777.          dom = me.dom,
  778.             prop;
  779.         if (!animate || !me.anim) {
  780.             prop = 'scroll' + (top ? 'Top' : 'Left'), // just setting the value, so grab the direction
  781.             dom[prop] = value;
  782.         }else{
  783.             prop = 'scroll' + (top ? 'Left' : 'Top'), // if scrolling top, we need to grab scrollLeft, if left, scrollTop
  784.             me.anim({scroll: {to: top ? [dom[prop], value] : [value, dom[prop]]}},
  785.               me.preanim(arguments, 2), 'scroll');
  786.         }
  787.         return me;
  788.     },
  789.     
  790.     /**
  791.      * Scrolls this element into view within the passed container.
  792.      * @param {Mixed} container (optional) The container element to scroll (defaults to document.body).  Should be a
  793.      * string (id), dom node, or Ext.Element.
  794.      * @param {Boolean} hscroll (optional) False to disable horizontal scroll (defaults to true)
  795.      * @return {Ext.Element} this
  796.      */
  797.     scrollIntoView : function(container, hscroll){
  798.         var c = Ext.getDom(container) || Ext.getBody().dom,
  799.          el = this.dom,
  800.          o = this.getOffsetsTo(c),
  801.             l = o[0] + c.scrollLeft,
  802.             t = o[1] + c.scrollTop,
  803.             b = t + el.offsetHeight,
  804.             r = l + el.offsetWidth,
  805.          ch = c.clientHeight,
  806.          ct = parseInt(c.scrollTop, 10),
  807.          cl = parseInt(c.scrollLeft, 10),
  808.          cb = ct + ch,
  809.          cr = cl + c.clientWidth;
  810.         if (el.offsetHeight > ch || t < ct) {
  811.          c.scrollTop = t;
  812.         } else if (b > cb){
  813.             c.scrollTop = b-ch;
  814.         }
  815.         c.scrollTop = c.scrollTop; // corrects IE, other browsers will ignore
  816.         if(hscroll !== false){
  817. if(el.offsetWidth > c.clientWidth || l < cl){
  818.                 c.scrollLeft = l;
  819.             }else if(r > cr){
  820.                 c.scrollLeft = r - c.clientWidth;
  821.             }
  822.             c.scrollLeft = c.scrollLeft;
  823.         }
  824.         return this;
  825.     },
  826.     // private
  827.     scrollChildIntoView : function(child, hscroll){
  828.         Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
  829.     },
  830.     
  831.     /**
  832.      * Scrolls this element the specified direction. Does bounds checking to make sure the scroll is
  833.      * within this element's scrollable range.
  834.      * @param {String} direction Possible values are: "l" (or "left"), "r" (or "right"), "t" (or "top", or "up"), "b" (or "bottom", or "down").
  835.      * @param {Number} distance How far to scroll the element in pixels
  836.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  837.      * @return {Boolean} Returns true if a scroll was triggered or false if the element
  838.      * was scrolled as far as it could go.
  839.      */
  840.      scroll : function(direction, distance, animate){
  841.          if(!this.isScrollable()){
  842.              return;
  843.          }
  844.          var el = this.dom,
  845.             l = el.scrollLeft, t = el.scrollTop,
  846.             w = el.scrollWidth, h = el.scrollHeight,
  847.             cw = el.clientWidth, ch = el.clientHeight,
  848.             scrolled = false, v,
  849.             hash = {
  850.                 l: Math.min(l + distance, w-cw),
  851.                 r: v = Math.max(l - distance, 0),
  852.                 t: Math.max(t - distance, 0),
  853.                 b: Math.min(t + distance, h-ch)
  854.             };
  855.             hash.d = hash.b;
  856.             hash.u = hash.t;
  857.             
  858.          direction = direction.substr(0, 1);
  859.          if((v = hash[direction]) > -1){
  860.             scrolled = true;
  861.             this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.preanim(arguments, 2));
  862.          }
  863.          return scrolled;
  864.     }
  865. });/**
  866.  * @class Ext.Element
  867.  */
  868. /**
  869.  * Visibility mode constant for use with {@link #setVisibilityMode}. Use visibility to hide element
  870.  * @static
  871.  * @type Number
  872.  */
  873. Ext.Element.VISIBILITY = 1;
  874. /**
  875.  * Visibility mode constant for use with {@link #setVisibilityMode}. Use display to hide element
  876.  * @static
  877.  * @type Number
  878.  */
  879. Ext.Element.DISPLAY = 2;
  880. Ext.Element.addMethods(function(){
  881.     var VISIBILITY = "visibility",
  882.         DISPLAY = "display",
  883.         HIDDEN = "hidden",
  884.         NONE = "none",      
  885.         ORIGINALDISPLAY = 'originalDisplay',
  886.         VISMODE = 'visibilityMode',
  887.         ELDISPLAY = Ext.Element.DISPLAY,
  888.         data = Ext.Element.data,
  889.         getDisplay = function(dom){
  890.             var d = data(dom, ORIGINALDISPLAY);
  891.             if(d === undefined){
  892.                 data(dom, ORIGINALDISPLAY, d = '');
  893.             }
  894.             return d;
  895.         },
  896.         getVisMode = function(dom){
  897.             var m = data(dom, VISMODE);
  898.             if(m === undefined){
  899.                 data(dom, VISMODE, m = 1)
  900.             }
  901.             return m;
  902.         };
  903.     
  904.     return {
  905.         /**
  906.          * The element's default display mode  (defaults to "")
  907.          * @type String
  908.          */
  909.         originalDisplay : "",
  910.         visibilityMode : 1,
  911.         
  912.         /**
  913.          * Sets the element's visibility mode. When setVisible() is called it
  914.          * will use this to determine whether to set the visibility or the display property.
  915.          * @param {Number} visMode Ext.Element.VISIBILITY or Ext.Element.DISPLAY
  916.          * @return {Ext.Element} this
  917.          */
  918.         setVisibilityMode : function(visMode){  
  919.             data(this.dom, VISMODE, visMode);
  920.             return this;
  921.         },
  922.         
  923.         /**
  924.          * Perform custom animation on this element.
  925.          * <div><ul class="mdetail-params">
  926.          * <li><u>Animation Properties</u></li>
  927.          * 
  928.          * <p>The Animation Control Object enables gradual transitions for any member of an
  929.          * element's style object that takes a numeric value including but not limited to
  930.          * these properties:</p><div><ul class="mdetail-params">
  931.          * <li><tt>bottom, top, left, right</tt></li>
  932.          * <li><tt>height, width</tt></li>
  933.          * <li><tt>margin, padding</tt></li>
  934.          * <li><tt>borderWidth</tt></li>
  935.          * <li><tt>opacity</tt></li>
  936.          * <li><tt>fontSize</tt></li>
  937.          * <li><tt>lineHeight</tt></li>
  938.          * </ul></div>
  939.          * 
  940.          * 
  941.          * <li><u>Animation Property Attributes</u></li>
  942.          * 
  943.          * <p>Each Animation Property is a config object with optional properties:</p>
  944.          * <div><ul class="mdetail-params">
  945.          * <li><tt>by</tt>*  : relative change - start at current value, change by this value</li>
  946.          * <li><tt>from</tt> : ignore current value, start from this value</li>
  947.          * <li><tt>to</tt>*  : start at current value, go to this value</li>
  948.          * <li><tt>unit</tt> : any allowable unit specification</li>
  949.          * <p>* do not specify both <tt>to</tt> and <tt>by</tt> for an animation property</p>
  950.          * </ul></div>
  951.          * 
  952.          * <li><u>Animation Types</u></li>
  953.          * 
  954.          * <p>The supported animation types:</p><div><ul class="mdetail-params">
  955.          * <li><tt>'run'</tt> : Default
  956.          * <pre><code>
  957. var el = Ext.get('complexEl');
  958. el.animate(
  959.     // animation control object
  960.     {
  961.         borderWidth: {to: 3, from: 0},
  962.         opacity: {to: .3, from: 1},
  963.         height: {to: 50, from: el.getHeight()},
  964.         width: {to: 300, from: el.getWidth()},
  965.         top  : {by: - 100, unit: 'px'},
  966.     },
  967.     0.35,      // animation duration
  968.     null,      // callback
  969.     'easeOut', // easing method
  970.     'run'      // animation type ('run','color','motion','scroll')    
  971. );
  972.          * </code></pre>
  973.          * </li>
  974.          * <li><tt>'color'</tt>
  975.          * <p>Animates transition of background, text, or border colors.</p>
  976.          * <pre><code>
  977. el.animate(
  978.     // animation control object
  979.     {
  980.         color: { to: '#06e' },
  981.         backgroundColor: { to: '#e06' }
  982.     },
  983.     0.35,      // animation duration
  984.     null,      // callback
  985.     'easeOut', // easing method
  986.     'color'    // animation type ('run','color','motion','scroll')    
  987. );
  988.          * </code></pre> 
  989.          * </li>
  990.          * 
  991.          * <li><tt>'motion'</tt>
  992.          * <p>Animates the motion of an element to/from specific points using optional bezier
  993.          * way points during transit.</p>
  994.          * <pre><code>
  995. el.animate(
  996.     // animation control object
  997.     {
  998.         borderWidth: {to: 3, from: 0},
  999.         opacity: {to: .3, from: 1},
  1000.         height: {to: 50, from: el.getHeight()},
  1001.         width: {to: 300, from: el.getWidth()},
  1002.         top  : {by: - 100, unit: 'px'},
  1003.         points: {
  1004.             to: [50, 100],  // go to this point
  1005.             control: [      // optional bezier way points
  1006.                 [ 600, 800],
  1007.                 [-100, 200]
  1008.             ]
  1009.         }
  1010.     },
  1011.     3000,      // animation duration (milliseconds!)
  1012.     null,      // callback
  1013.     'easeOut', // easing method
  1014.     'motion'   // animation type ('run','color','motion','scroll')    
  1015. );
  1016.          * </code></pre> 
  1017.          * </li>
  1018.          * <li><tt>'scroll'</tt>
  1019.          * <p>Animate horizontal or vertical scrolling of an overflowing page element.</p>
  1020.          * <pre><code>
  1021. el.animate(
  1022.     // animation control object
  1023.     {
  1024.         scroll: {to: [400, 300]}
  1025.     },
  1026.     0.35,      // animation duration
  1027.     null,      // callback
  1028.     'easeOut', // easing method
  1029.     'scroll'   // animation type ('run','color','motion','scroll')    
  1030. );
  1031.          * </code></pre> 
  1032.          * </li>
  1033.          * </ul></div>
  1034.          * 
  1035.          * </ul></div>
  1036.          * 
  1037.          * @param {Object} args The animation control args
  1038.          * @param {Float} duration (optional) How long the animation lasts in seconds (defaults to <tt>.35</tt>)
  1039.          * @param {Function} onComplete (optional) Function to call when animation completes
  1040.          * @param {String} easing (optional) {@link Ext.Fx#easing} method to use (defaults to <tt>'easeOut'</tt>)
  1041.          * @param {String} animType (optional) <tt>'run'</tt> is the default. Can also be <tt>'color'</tt>,
  1042.          * <tt>'motion'</tt>, or <tt>'scroll'</tt>
  1043.          * @return {Ext.Element} this
  1044.          */
  1045.         animate : function(args, duration, onComplete, easing, animType){       
  1046.             this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);
  1047.             return this;
  1048.         },
  1049.     
  1050.         /*
  1051.          * @private Internal animation call
  1052.          */
  1053.         anim : function(args, opt, animType, defaultDur, defaultEase, cb){
  1054.             animType = animType || 'run';
  1055.             opt = opt || {};
  1056.             var me = this,              
  1057.                 anim = Ext.lib.Anim[animType](
  1058.                     me.dom, 
  1059.                     args,
  1060.                     (opt.duration || defaultDur) || .35,
  1061.                     (opt.easing || defaultEase) || 'easeOut',
  1062.                     function(){
  1063.                         if(cb) cb.call(me);
  1064.                         if(opt.callback) opt.callback.call(opt.scope || me, me, opt);
  1065.                     },
  1066.                     me
  1067.                 );
  1068.             opt.anim = anim;
  1069.             return anim;
  1070.         },
  1071.     
  1072.         // private legacy anim prep
  1073.         preanim : function(a, i){
  1074.             return !a[i] ? false : (Ext.isObject(a[i]) ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});
  1075.         },
  1076.         
  1077.         /**
  1078.          * Checks whether the element is currently visible using both visibility and display properties.         
  1079.          * @return {Boolean} True if the element is currently visible, else false
  1080.          */
  1081.         isVisible : function() {
  1082.             return !this.isStyle(VISIBILITY, HIDDEN) && !this.isStyle(DISPLAY, NONE);
  1083.         },
  1084.         
  1085.         /**
  1086.          * Sets the visibility of the element (see details). If the visibilityMode is set to Element.DISPLAY, it will use
  1087.          * the display property to hide the element, otherwise it uses visibility. The default is to hide and show using the visibility property.
  1088.          * @param {Boolean} visible Whether the element is visible
  1089.          * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  1090.          * @return {Ext.Element} this
  1091.          */
  1092.          setVisible : function(visible, animate){
  1093.             var me = this,
  1094.                 dom = me.dom,
  1095.                 isDisplay = getVisMode(this.dom) == ELDISPLAY;
  1096.                 
  1097.             if (!animate || !me.anim) {
  1098.                 if(isDisplay){
  1099.                     me.setDisplayed(visible);
  1100.                 }else{
  1101.                     me.fixDisplay();
  1102.                     dom.style.visibility = visible ? "visible" : HIDDEN;
  1103.                 }
  1104.             }else{
  1105.                 // closure for composites            
  1106.                 if(visible){
  1107.                     me.setOpacity(.01);
  1108.                     me.setVisible(true);
  1109.                 }
  1110.                 me.anim({opacity: { to: (visible?1:0) }},
  1111.                         me.preanim(arguments, 1),
  1112.                         null,
  1113.                         .35,
  1114.                         'easeIn',
  1115.                         function(){
  1116.                              if(!visible){
  1117.                                  dom.style[isDisplay ? DISPLAY : VISIBILITY] = (isDisplay) ? NONE : HIDDEN;                     
  1118.                                  Ext.fly(dom).setOpacity(1);
  1119.                              }
  1120.                         });
  1121.             }
  1122.             return me;
  1123.         },
  1124.     
  1125.         /**
  1126.          * Toggles the element's visibility or display, depending on visibility mode.
  1127.          * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  1128.          * @return {Ext.Element} this
  1129.          */
  1130.         toggle : function(animate){
  1131.             var me = this;
  1132.             me.setVisible(!me.isVisible(), me.preanim(arguments, 0));
  1133.             return me;
  1134.         },
  1135.     
  1136.         /**
  1137.          * Sets the CSS display property. Uses originalDisplay if the specified value is a boolean true.
  1138.          * @param {Mixed} value Boolean value to display the element using its default display, or a string to set the display directly.
  1139.          * @return {Ext.Element} this
  1140.          */
  1141.         setDisplayed : function(value) {            
  1142.             if(typeof value == "boolean"){
  1143.                value = value ? getDisplay(this.dom) : NONE;
  1144.             }
  1145.             this.setStyle(DISPLAY, value);
  1146.             return this;
  1147.         },
  1148.         
  1149.         // private
  1150.         fixDisplay : function(){
  1151.             var me = this;
  1152.             if(me.isStyle(DISPLAY, NONE)){
  1153.                 me.setStyle(VISIBILITY, HIDDEN);
  1154.                 me.setStyle(DISPLAY, getDisplay(this.dom)); // first try reverting to default
  1155.                 if(me.isStyle(DISPLAY, NONE)){ // if that fails, default to block
  1156.                     me.setStyle(DISPLAY, "block");
  1157.                 }
  1158.             }
  1159.         },
  1160.     
  1161.         /**
  1162.          * Hide this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}.
  1163.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1164.          * @return {Ext.Element} this
  1165.          */
  1166.         hide : function(animate){
  1167.             this.setVisible(false, this.preanim(arguments, 0));
  1168.             return this;
  1169.         },
  1170.     
  1171.         /**
  1172.         * Show this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}.
  1173.         * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1174.          * @return {Ext.Element} this
  1175.          */
  1176.         show : function(animate){
  1177.             this.setVisible(true, this.preanim(arguments, 0));
  1178.             return this;
  1179.         }
  1180.     }
  1181. }());/**
  1182.  * @class Ext.Element
  1183.  */
  1184. Ext.Element.addMethods(
  1185. function(){
  1186.     var VISIBILITY = "visibility",
  1187.         DISPLAY = "display",
  1188.         HIDDEN = "hidden",
  1189.         NONE = "none",
  1190.     XMASKED = "x-masked",
  1191. XMASKEDRELATIVE = "x-masked-relative",
  1192.         data = Ext.Element.data;
  1193. return {
  1194. /**
  1195.      * Checks whether the element is currently visible using both visibility and display properties.
  1196.      * @param {Boolean} deep (optional) True to walk the dom and see if parent elements are hidden (defaults to false)
  1197.      * @return {Boolean} True if the element is currently visible, else false
  1198.      */
  1199.     isVisible : function(deep) {
  1200.         var vis = !this.isStyle(VISIBILITY,HIDDEN) && !this.isStyle(DISPLAY,NONE),
  1201.          p = this.dom.parentNode;
  1202.         if(deep !== true || !vis){
  1203.             return vis;
  1204.         }         
  1205.         while(p && !/body/i.test(p.tagName)){
  1206.             if(!Ext.fly(p, '_isVisible').isVisible()){
  1207.                 return false;
  1208.             }
  1209.             p = p.parentNode;
  1210.         }
  1211.         return true;
  1212.     },
  1213.     
  1214.     /**
  1215.      * Returns true if display is not "none"
  1216.      * @return {Boolean}
  1217.      */
  1218.     isDisplayed : function() {
  1219.         return !this.isStyle(DISPLAY, NONE);
  1220.     },
  1221.     
  1222. /**
  1223.      * Convenience method for setVisibilityMode(Element.DISPLAY)
  1224.      * @param {String} display (optional) What to set display to when visible
  1225.      * @return {Ext.Element} this
  1226.      */
  1227.     enableDisplayMode : function(display){     
  1228.         this.setVisibilityMode(Ext.Element.DISPLAY);
  1229.         if(!Ext.isEmpty(display)){
  1230.                 data(this.dom, 'originalDisplay', display);
  1231.             }
  1232.         return this;
  1233.     },
  1234.     
  1235. /**
  1236.      * Puts a mask over this element to disable user interaction. Requires core.css.
  1237.      * This method can only be applied to elements which accept child nodes.
  1238.      * @param {String} msg (optional) A message to display in the mask
  1239.      * @param {String} msgCls (optional) A css class to apply to the msg element
  1240.      * @return {Element} The mask element
  1241.      */
  1242.     mask : function(msg, msgCls){
  1243.     var me = this,
  1244.      dom = me.dom,
  1245.      dh = Ext.DomHelper,
  1246.      EXTELMASKMSG = "ext-el-mask-msg",
  1247.                 el, 
  1248.                 mask;
  1249.     
  1250.         if(me.getStyle("position") == "static"){
  1251.             me.addClass(XMASKEDRELATIVE);
  1252.         }
  1253.         if((el = data(dom, 'maskMsg'))){
  1254.             el.remove();
  1255.         }
  1256.         if((el = data(dom, 'mask'))){
  1257.             el.remove();
  1258.         }
  1259.             mask = dh.append(dom, {cls : "ext-el-mask"}, true);
  1260.         data(dom, 'mask', mask);
  1261.         me.addClass(XMASKED);
  1262.         mask.setDisplayed(true);
  1263.         if(typeof msg == 'string'){
  1264.                 var mm = dh.append(dom, {cls : EXTELMASKMSG, cn:{tag:'div'}}, true);
  1265.                 data(dom, 'maskMsg', mm);
  1266.             mm.dom.className = msgCls ? EXTELMASKMSG + " " + msgCls : EXTELMASKMSG;
  1267.             mm.dom.firstChild.innerHTML = msg;
  1268.             mm.setDisplayed(true);
  1269.             mm.center(me);
  1270.         }
  1271.         if(Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && me.getStyle('height') == 'auto'){ // ie will not expand full height automatically
  1272.             mask.setSize(undefined, me.getHeight());
  1273.         }
  1274.         return mask;
  1275.     },
  1276.     /**
  1277.      * Removes a previously applied mask.
  1278.      */
  1279.     unmask : function(){
  1280.     var me = this,
  1281.                 dom = me.dom,
  1282.      mask = data(dom, 'mask'),
  1283.      maskMsg = data(dom, 'maskMsg');
  1284.         if(mask){
  1285.             if(maskMsg){
  1286.                 maskMsg.remove();
  1287.                     data(dom, 'maskMsg', undefined);
  1288.             }
  1289.             mask.remove();
  1290.                 data(dom, 'mask', undefined);
  1291.         }
  1292.         me.removeClass([XMASKED, XMASKEDRELATIVE]);
  1293.     },
  1294.     /**
  1295.      * Returns true if this element is masked
  1296.      * @return {Boolean}
  1297.      */
  1298.     isMasked : function(){
  1299.             var m = data(this.dom, 'mask');
  1300.         return m && m.isVisible();
  1301.     },
  1302.     
  1303.     /**
  1304.      * Creates an iframe shim for this element to keep selects and other windowed objects from
  1305.      * showing through.
  1306.      * @return {Ext.Element} The new shim element
  1307.      */
  1308.     createShim : function(){
  1309.         var el = document.createElement('iframe'),        
  1310.          shim;
  1311.         el.frameBorder = '0';
  1312.         el.className = 'ext-shim';
  1313.         el.src = Ext.SSL_SECURE_URL;
  1314.         shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
  1315.         shim.autoBoxAdjust = false;
  1316.         return shim;
  1317.     }
  1318.     };
  1319. }());/**
  1320.  * @class Ext.Element
  1321.  */
  1322. Ext.Element.addMethods({
  1323.     /**
  1324.      * Convenience method for constructing a KeyMap
  1325.      * @param {Number/Array/Object/String} key Either a string with the keys to listen for, the numeric key code, array of key codes or an object with the following options:
  1326.      * <code>{key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}</code>
  1327.      * @param {Function} fn The function to call
  1328.      * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the specified function is executed. Defaults to this Element.
  1329.      * @return {Ext.KeyMap} The KeyMap created
  1330.      */
  1331.     addKeyListener : function(key, fn, scope){
  1332.         var config;
  1333.         if(!Ext.isObject(key) || Ext.isArray(key)){
  1334.             config = {
  1335.                 key: key,
  1336.                 fn: fn,
  1337.                 scope: scope
  1338.             };
  1339.         }else{
  1340.             config = {
  1341.                 key : key.key,
  1342.                 shift : key.shift,
  1343.                 ctrl : key.ctrl,
  1344.                 alt : key.alt,
  1345.                 fn: fn,
  1346.                 scope: scope
  1347.             };
  1348.         }
  1349.         return new Ext.KeyMap(this, config);
  1350.     },
  1351.     /**
  1352.      * Creates a KeyMap for this element
  1353.      * @param {Object} config The KeyMap config. See {@link Ext.KeyMap} for more details
  1354.      * @return {Ext.KeyMap} The KeyMap created
  1355.      */
  1356.     addKeyMap : function(config){
  1357.         return new Ext.KeyMap(this, config);
  1358.     }
  1359. });(function(){
  1360.     // contants
  1361.     var NULL = null,
  1362.         UNDEFINED = undefined,
  1363.         TRUE = true,
  1364.         FALSE = false,
  1365.         SETX = "setX",
  1366.         SETY = "setY",
  1367.         SETXY = "setXY",
  1368.         LEFT = "left",
  1369.         BOTTOM = "bottom",
  1370.         TOP = "top",
  1371.         RIGHT = "right",
  1372.         HEIGHT = "height",
  1373.         WIDTH = "width",
  1374.         POINTS = "points",
  1375.         HIDDEN = "hidden",
  1376.         ABSOLUTE = "absolute",
  1377.         VISIBLE = "visible",
  1378.         MOTION = "motion",
  1379.         POSITION = "position",
  1380.         EASEOUT = "easeOut",
  1381.         /*
  1382.          * Use a light flyweight here since we are using so many callbacks and are always assured a DOM element
  1383.          */
  1384.         flyEl = new Ext.Element.Flyweight(),
  1385.         queues = {},
  1386.         getObject = function(o){
  1387.             return o || {};
  1388.         },
  1389.         fly = function(dom){
  1390.             flyEl.dom = dom;
  1391.             flyEl.id = Ext.id(dom);
  1392.             return flyEl;
  1393.         },
  1394.         /*
  1395.          * Queueing now stored outside of the element due to closure issues
  1396.          */
  1397.         getQueue = function(id){
  1398.             if(!queues[id]){
  1399.                 queues[id] = [];
  1400.             }
  1401.             return queues[id];
  1402.         },
  1403.         setQueue = function(id, value){
  1404.             queues[id] = value;
  1405.         };
  1406.         
  1407. //Notifies Element that fx methods are available
  1408. Ext.enableFx = TRUE;
  1409. /**