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

中间件编程

开发平台:

JavaScript

  1.         return this;
  2.     },
  3.     /**
  4.      * Inserts this element before the passed element in the DOM
  5.      * @param {Mixed} el The element before which this element will be inserted
  6.      * @return {Ext.Element} this
  7.      */
  8.     insertBefore: function(el){             
  9.         (el = GETDOM(el)).parentNode.insertBefore(this.dom, el);
  10.         return this;
  11.     },
  12.     /**
  13.      * Inserts this element after the passed element in the DOM
  14.      * @param {Mixed} el The element to insert after
  15.      * @return {Ext.Element} this
  16.      */
  17.     insertAfter: function(el){
  18.         (el = GETDOM(el)).parentNode.insertBefore(this.dom, el.nextSibling);
  19.         return this;
  20.     },
  21.     /**
  22.      * Inserts (or creates) an element (or DomHelper config) as the first child of this element
  23.      * @param {Mixed/Object} el The id or element to insert or a DomHelper config to create and insert
  24.      * @return {Ext.Element} The new child
  25.      */
  26.     insertFirst: function(el, returnDom){
  27.             el = el || {};
  28.             if(isEl(el)){ // element
  29.                 el = GETDOM(el);
  30.                 this.dom.insertBefore(el, this.dom.firstChild);
  31.                 return !returnDom ? GET(el) : el;
  32.             }else{ // dh config
  33.                 return this.createChild(el, this.dom.firstChild, returnDom);
  34.             }
  35.     },
  36.     /**
  37.      * Replaces the passed element with this element
  38.      * @param {Mixed} el The element to replace
  39.      * @return {Ext.Element} this
  40.      */
  41.     replace: function(el){
  42.         el = GET(el);
  43.         this.insertBefore(el);
  44.         el.remove();
  45.         return this;
  46.     },
  47.     /**
  48.      * Replaces this element with the passed element
  49.      * @param {Mixed/Object} el The new element or a DomHelper config of an element to create
  50.      * @return {Ext.Element} this
  51.      */
  52.     replaceWith: function(el){
  53.     var me = this,
  54.      Element = Ext.Element;
  55.             if(isEl(el)){
  56.                 el = GETDOM(el);
  57.                 me.dom.parentNode.insertBefore(el, me.dom);
  58.             }else{
  59.                 el = DH.insertBefore(me.dom, el);
  60.             }
  61.         
  62.         delete Element.cache[me.id];
  63.         Ext.removeNode(me.dom);      
  64.         me.id = Ext.id(me.dom = el);
  65.         return Element.cache[me.id] = me;        
  66.     },
  67.     
  68. /**
  69.  * Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child element.
  70.  * @param {Object} config DomHelper element config object.  If no tag is specified (e.g., {tag:'input'}) then a div will be
  71.  * automatically generated with the specified attributes.
  72.  * @param {HTMLElement} insertBefore (optional) a child element of this element
  73.  * @param {Boolean} returnDom (optional) true to return the dom node instead of creating an Element
  74.  * @return {Ext.Element} The new child element
  75.  */
  76. createChild: function(config, insertBefore, returnDom){
  77.     config = config || {tag:'div'};
  78.     return insertBefore ? 
  79.         DH.insertBefore(insertBefore, config, returnDom !== true) :
  80.         DH[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config,  returnDom !== true);
  81. },
  82. /**
  83.  * Creates and wraps this element with another element
  84.  * @param {Object} config (optional) DomHelper element config object for the wrapper element or null for an empty div
  85.  * @param {Boolean} returnDom (optional) True to return the raw DOM element instead of Ext.Element
  86.  * @return {HTMLElement/Element} The newly created wrapper element
  87.  */
  88. wrap: function(config, returnDom){        
  89.     var newEl = DH.insertBefore(this.dom, config || {tag: "div"}, !returnDom);
  90.     newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
  91.     return newEl;
  92. },
  93. /**
  94.  * Inserts an html fragment into this element
  95.  * @param {String} where Where to insert the html in relation to this element - beforeBegin, afterBegin, beforeEnd, afterEnd.
  96.  * @param {String} html The HTML fragment
  97.  * @param {Boolean} returnEl (optional) True to return an Ext.Element (defaults to false)
  98.  * @return {HTMLElement/Ext.Element} The inserted node (or nearest related if more than 1 inserted)
  99.  */
  100. insertHtml : function(where, html, returnEl){
  101.     var el = DH.insertHtml(where, this.dom, html);
  102.     return returnEl ? Ext.get(el) : el;
  103. }
  104. }
  105. }());/**
  106.  * @class Ext.Element
  107.  */
  108. Ext.apply(Ext.Element.prototype, function() {
  109. var GETDOM = Ext.getDom,
  110. GET = Ext.get,
  111. DH = Ext.DomHelper;
  112. return {
  113. /**
  114.      * Inserts (or creates) the passed element (or DomHelper config) as a sibling of this element
  115.      * @param {Mixed/Object/Array} el The id, element to insert or a DomHelper config to create and insert *or* an array of any of those.
  116.      * @param {String} where (optional) 'before' or 'after' defaults to before
  117.      * @param {Boolean} returnDom (optional) True to return the raw DOM element instead of Ext.Element
  118.      * @return {Ext.Element} the inserted Element
  119.      */
  120.     insertSibling: function(el, where, returnDom){
  121.         var me = this,
  122.          rt;
  123.         
  124.         if(Ext.isArray(el)){            
  125.             Ext.each(el, function(e) {
  126.             rt = me.insertSibling(e, where, returnDom);
  127.             });
  128.             return rt;
  129.         }
  130.                 
  131.         where = (where || 'before').toLowerCase();
  132.         el = el || {};
  133.        
  134.             if(el.nodeType || el.dom){
  135.                 rt = me.dom.parentNode.insertBefore(GETDOM(el), where == 'before' ? me.dom : me.dom.nextSibling);
  136.                 if (!returnDom) {
  137.                     rt = GET(rt);
  138.                 }
  139.             }else{
  140.                 if (where == 'after' && !me.dom.nextSibling) {
  141.                     rt = DH.append(me.dom.parentNode, el, !returnDom);
  142.                 } else {                    
  143.                     rt = DH[where == 'after' ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
  144.                 }
  145.             }
  146.         return rt;
  147.     }
  148.     };
  149. }());/**
  150.  * @class Ext.Element
  151.  */
  152. Ext.Element.addMethods(function(){  
  153.     // local style camelizing for speed
  154.     var propCache = {},
  155.         camelRe = /(-[a-z])/gi,
  156.         classReCache = {},
  157.         view = document.defaultView,
  158.         propFloat = Ext.isIE ? 'styleFloat' : 'cssFloat',
  159.         opacityRe = /alpha(opacity=(.*))/i,
  160.         trimRe = /^s+|s+$/g,
  161.         EL = Ext.Element,   
  162.         PADDING = "padding",
  163.         MARGIN = "margin",
  164.         BORDER = "border",
  165.         LEFT = "-left",
  166.         RIGHT = "-right",
  167.         TOP = "-top",
  168.         BOTTOM = "-bottom",
  169.         WIDTH = "-width",    
  170.         MATH = Math,
  171.         HIDDEN = 'hidden',
  172.         ISCLIPPED = 'isClipped',
  173.         OVERFLOW = 'overflow',
  174.         OVERFLOWX = 'overflow-x',
  175.         OVERFLOWY = 'overflow-y',
  176.         ORIGINALCLIP = 'originalClip',
  177.         // special markup used throughout Ext when box wrapping elements    
  178.         borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH},
  179.         paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM},
  180.         margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM},
  181.         data = Ext.Element.data;
  182.         
  183.     
  184.     // private  
  185.     function camelFn(m, a) {
  186.         return a.charAt(1).toUpperCase();
  187.     }
  188.     
  189.     // private (needs to be called => addStyles.call(this, sides, styles))
  190.     function addStyles(sides, styles){
  191.         var val = 0;    
  192.         
  193.         Ext.each(sides.match(/w/g), function(s) {
  194.             if (s = parseInt(this.getStyle(styles[s]), 10)) {
  195.                 val += MATH.abs(s);      
  196.             }
  197.         },
  198.         this);
  199.         return val;
  200.     }
  201.     function chkCache(prop) {
  202.         return propCache[prop] || (propCache[prop] = prop == 'float' ? propFloat : prop.replace(camelRe, camelFn));
  203.     }
  204.             
  205.     return {    
  206.         // private  ==> used by Fx  
  207.         adjustWidth : function(width) {
  208.             var me = this;
  209.             var isNum = (typeof width == "number");
  210.             if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
  211.                width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  212.             }
  213.             return (isNum && width < 0) ? 0 : width;
  214.         },
  215.         
  216.         // private   ==> used by Fx 
  217.         adjustHeight : function(height) {
  218.             var me = this;
  219.             var isNum = (typeof height == "number");
  220.             if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
  221.                height -= (me.getBorderWidth("tb") + me.getPadding("tb"));               
  222.             }
  223.             return (isNum && height < 0) ? 0 : height;
  224.         },
  225.     
  226.     
  227.         /**
  228.          * Adds one or more CSS classes to the element. Duplicate classes are automatically filtered out.
  229.          * @param {String/Array} className The CSS class to add, or an array of classes
  230.          * @return {Ext.Element} this
  231.          */
  232.         addClass : function(className){
  233.             var me = this;
  234.             Ext.each(className, function(v) {
  235.                 me.dom.className += (!me.hasClass(v) && v ? " " + v : "");  
  236.             });
  237.             return me;
  238.         },
  239.     
  240.         /**
  241.          * Adds one or more CSS classes to this element and removes the same class(es) from all siblings.
  242.          * @param {String/Array} className The CSS class to add, or an array of classes
  243.          * @return {Ext.Element} this
  244.          */
  245.         radioClass : function(className){
  246.             Ext.each(this.dom.parentNode.childNodes, function(v) {
  247.                 if(v.nodeType == 1) {
  248.                     Ext.fly(v, '_internal').removeClass(className);          
  249.                 }
  250.             });
  251.             return this.addClass(className);
  252.         },
  253.     
  254.         /**
  255.          * Removes one or more CSS classes from the element.
  256.          * @param {String/Array} className The CSS class to remove, or an array of classes
  257.          * @return {Ext.Element} this
  258.          */
  259.         removeClass : function(className){
  260.             var me = this;
  261.             if (me.dom.className) {
  262.                 Ext.each(className, function(v) {               
  263.                     me.dom.className = me.dom.className.replace(
  264.                         classReCache[v] = classReCache[v] || new RegExp('(?:^|\s+)' + v + '(?:\s+|$)', "g"), 
  265.                         " ");               
  266.                 });    
  267.             }
  268.             return me;
  269.         },
  270.     
  271.         /**
  272.          * Toggles the specified CSS class on this element (removes it if it already exists, otherwise adds it).
  273.          * @param {String} className The CSS class to toggle
  274.          * @return {Ext.Element} this
  275.          */
  276.         toggleClass : function(className){
  277.             return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
  278.         },
  279.     
  280.         /**
  281.          * Checks if the specified CSS class exists on this element's DOM node.
  282.          * @param {String} className The CSS class to check for
  283.          * @return {Boolean} True if the class exists, else false
  284.          */
  285.         hasClass : function(className){
  286.             return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
  287.         },
  288.     
  289.         /**
  290.          * Replaces a CSS class on the element with another.  If the old name does not exist, the new name will simply be added.
  291.          * @param {String} oldClassName The CSS class to replace
  292.          * @param {String} newClassName The replacement CSS class
  293.          * @return {Ext.Element} this
  294.          */
  295.         replaceClass : function(oldClassName, newClassName){
  296.             return this.removeClass(oldClassName).addClass(newClassName);
  297.         },
  298.         
  299.         isStyle : function(style, val) {
  300.             return this.getStyle(style) == val;  
  301.         },
  302.     
  303.         /**
  304.          * Normalizes currentStyle and computedStyle.
  305.          * @param {String} property The style property whose value is returned.
  306.          * @return {String} The current value of the style property for this element.
  307.          */
  308.         getStyle : function(){         
  309.             return view && view.getComputedStyle ?
  310.                 function(prop){
  311.                     var el = this.dom,
  312.                         v,                  
  313.                         cs;
  314.                     if(el == document) return null;
  315.                     prop = chkCache(prop);
  316.                     return (v = el.style[prop]) ? v : 
  317.                            (cs = view.getComputedStyle(el, "")) ? cs[prop] : null;
  318.                 } :
  319.                 function(prop){      
  320.                     var el = this.dom, 
  321.                         m, 
  322.                         cs;     
  323.                         
  324.                     if(el == document) return null;      
  325.                     if (prop == 'opacity') {
  326.                         if (el.style.filter.match) {                       
  327.                             if(m = el.style.filter.match(opacityRe)){
  328.                                 var fv = parseFloat(m[1]);
  329.                                 if(!isNaN(fv)){
  330.                                     return fv ? fv / 100 : 0;
  331.                                 }
  332.                             }
  333.                         }
  334.                         return 1;
  335.                     }
  336.                     prop = chkCache(prop);  
  337.                     return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
  338.                 };
  339.         }(),
  340.         
  341.         /**
  342.          * Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values
  343.          * are convert to standard 6 digit hex color.
  344.          * @param {String} attr The css attribute
  345.          * @param {String} defaultValue The default value to use when a valid color isn't found
  346.          * @param {String} prefix (optional) defaults to #. Use an empty string when working with
  347.          * color anims.
  348.          */
  349.         getColor : function(attr, defaultValue, prefix){
  350.             var v = this.getStyle(attr),
  351.                 color = prefix || '#',
  352.                 h;
  353.                 
  354.             if(!v || /transparent|inherit/.test(v)){
  355.                 return defaultValue;
  356.             }
  357.             if(/^r/.test(v)){
  358.                 Ext.each(v.slice(4, v.length -1).split(','), function(s){
  359.                     h = parseInt(s, 10);
  360.                     color += (h < 16 ? '0' : '') + h.toString(16); 
  361.                 });
  362.             }else{
  363.                 v = v.replace('#', '');
  364.                 color += v.length == 3 ? v.replace(/^(w)(w)(w)$/, '$1$1$2$2$3$3') : v;
  365.             }
  366.             return(color.length > 5 ? color.toLowerCase() : defaultValue);
  367.         },
  368.     
  369.         /**
  370.          * Wrapper for setting style properties, also takes single object parameter of multiple styles.
  371.          * @param {String/Object} property The style property to be set, or an object of multiple styles.
  372.          * @param {String} value (optional) The value to apply to the given property, or null if an object was passed.
  373.          * @return {Ext.Element} this
  374.          */
  375.         setStyle : function(prop, value){
  376.             var tmp, 
  377.                 style,
  378.                 camel;
  379.             if (!Ext.isObject(prop)) {
  380.                 tmp = {};
  381.                 tmp[prop] = value;          
  382.                 prop = tmp;
  383.             }
  384.             for (style in prop) {
  385.                 value = prop[style];            
  386.                 style == 'opacity' ? 
  387.                     this.setOpacity(value) : 
  388.                     this.dom.style[chkCache(style)] = value;
  389.             }
  390.             return this;
  391.         },
  392.         
  393.         /**
  394.          * Set the opacity of the element
  395.          * @param {Float} opacity The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
  396.          * @param {Boolean/Object} animate (optional) a standard Element animation config object or <tt>true</tt> for
  397.          * the default animation (<tt>{duration: .35, easing: 'easeIn'}</tt>)
  398.          * @return {Ext.Element} this
  399.          */
  400.          setOpacity : function(opacity, animate){
  401.             var me = this,
  402.                 s = me.dom.style;
  403.                 
  404.             if(!animate || !me.anim){            
  405.                 if(Ext.isIE){
  406.                     var opac = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')' : '', 
  407.                     val = s.filter.replace(opacityRe, '').replace(trimRe, '');
  408.                     s.zoom = 1;
  409.                     s.filter = val + (val.length > 0 ? ' ' : '') + opac;
  410.                 }else{
  411.                     s.opacity = opacity;
  412.                 }
  413.             }else{
  414.                 me.anim({opacity: {to: opacity}}, me.preanim(arguments, 1), null, .35, 'easeIn');
  415.             }
  416.             return me;
  417.         },
  418.         
  419.         /**
  420.          * Clears any opacity settings from this element. Required in some cases for IE.
  421.          * @return {Ext.Element} this
  422.          */
  423.         clearOpacity : function(){
  424.             var style = this.dom.style;
  425.             if(Ext.isIE){
  426.                 if(!Ext.isEmpty(style.filter)){
  427.                     style.filter = style.filter.replace(opacityRe, '').replace(trimRe, '');
  428.                 }
  429.             }else{
  430.                 style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = '';
  431.             }
  432.             return this;
  433.         },
  434.     
  435.         /**
  436.          * Returns the offset height of the element
  437.          * @param {Boolean} contentHeight (optional) true to get the height minus borders and padding
  438.          * @return {Number} The element's height
  439.          */
  440.         getHeight : function(contentHeight){
  441.             var me = this,
  442.                 dom = me.dom,
  443.                 h = MATH.max(dom.offsetHeight, dom.clientHeight) || 0;
  444.             h = !contentHeight ? h : h - me.getBorderWidth("tb") - me.getPadding("tb");
  445.             return h < 0 ? 0 : h;
  446.         },
  447.     
  448.         /**
  449.          * Returns the offset width of the element
  450.          * @param {Boolean} contentWidth (optional) true to get the width minus borders and padding
  451.          * @return {Number} The element's width
  452.          */
  453.         getWidth : function(contentWidth){
  454.             var me = this,
  455.                 dom = me.dom,
  456.                 w = MATH.max(dom.offsetWidth, dom.clientWidth) || 0;
  457.             w = !contentWidth ? w : w - me.getBorderWidth("lr") - me.getPadding("lr");
  458.             return w < 0 ? 0 : w;
  459.         },
  460.     
  461.         /**
  462.          * Set the width of this Element.
  463.          * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  464.          * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  465.          * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  466.          * </ul></div>
  467.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  468.          * @return {Ext.Element} this
  469.          */
  470.         setWidth : function(width, animate){
  471.             var me = this;
  472.             width = me.adjustWidth(width);
  473.             !animate || !me.anim ? 
  474.                 me.dom.style.width = me.addUnits(width) :
  475.                 me.anim({width : {to : width}}, me.preanim(arguments, 1));
  476.             return me;
  477.         },
  478.     
  479.         /**
  480.          * Set the height of this Element.
  481.          * <pre><code>
  482. // change the height to 200px and animate with default configuration
  483. Ext.fly('elementId').setHeight(200, true);
  484. // change the height to 150px and animate with a custom configuration
  485. Ext.fly('elId').setHeight(150, {
  486.     duration : .5, // animation will have a duration of .5 seconds
  487.     // will change the content to "finished"
  488.     callback: function(){ this.{@link #update}("finished"); } 
  489. });
  490.          * </code></pre>
  491.          * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  492.          * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels.)</li>
  493.          * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  494.          * </ul></div>
  495.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  496.          * @return {Ext.Element} this
  497.          */
  498.          setHeight : function(height, animate){
  499.             var me = this;
  500.             height = me.adjustHeight(height);
  501.             !animate || !me.anim ? 
  502.                 me.dom.style.height = me.addUnits(height) :
  503.                 me.anim({height : {to : height}}, me.preanim(arguments, 1));
  504.             return me;
  505.         },
  506.         
  507.         /**
  508.          * Gets the width of the border(s) for the specified side(s)
  509.          * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example,
  510.          * passing <tt>'lr'</tt> would get the border <b><u>l</u></b>eft width + the border <b><u>r</u></b>ight width.
  511.          * @return {Number} The width of the sides passed added together
  512.          */
  513.         getBorderWidth : function(side){
  514.             return addStyles.call(this, side, borders);
  515.         },
  516.     
  517.         /**
  518.          * Gets the width of the padding(s) for the specified side(s)
  519.          * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example,
  520.          * passing <tt>'lr'</tt> would get the padding <b><u>l</u></b>eft + the padding <b><u>r</u></b>ight.
  521.          * @return {Number} The padding of the sides passed added together
  522.          */
  523.         getPadding : function(side){
  524.             return addStyles.call(this, side, paddings);
  525.         },
  526.     
  527.         /**
  528.          *  Store the current overflow setting and clip overflow on the element - use <tt>{@link #unclip}</tt> to remove
  529.          * @return {Ext.Element} this
  530.          */
  531.         clip : function(){
  532.             var me = this,
  533.                 dom = me.dom;
  534.                 
  535.             if(!data(dom, ISCLIPPED)){
  536.                 data(dom, ISCLIPPED, true);
  537.                 data(dom, ORIGINALCLIP, {
  538.                     o: me.getStyle(OVERFLOW),
  539.                     x: me.getStyle(OVERFLOWX),
  540.                     y: me.getStyle(OVERFLOWY)
  541.                 });
  542.                 me.setStyle(OVERFLOW, HIDDEN);
  543.                 me.setStyle(OVERFLOWX, HIDDEN);
  544.                 me.setStyle(OVERFLOWY, HIDDEN);
  545.             }
  546.             return me;
  547.         },
  548.     
  549.         /**
  550.          *  Return clipping (overflow) to original clipping before <tt>{@link #clip}</tt> was called
  551.          * @return {Ext.Element} this
  552.          */
  553.         unclip : function(){
  554.             var me = this,
  555.                 dom = me.dom;
  556.                 
  557.             if(data(dom, ISCLIPPED)){
  558.                 data(dom, ISCLIPPED, false);
  559.                 var o = data(dom, ORIGINALCLIP);
  560.                 if(o.o){
  561.                     me.setStyle(OVERFLOW, o.o);
  562.                 }
  563.                 if(o.x){
  564.                     me.setStyle(OVERFLOWX, o.x);
  565.                 }
  566.                 if(o.y){
  567.                     me.setStyle(OVERFLOWY, o.y);
  568.                 }
  569.             }
  570.             return me;
  571.         },
  572.         
  573.         addStyles : addStyles,
  574.         margins : margins
  575.     }
  576. }()         
  577. );/**
  578.  * @class Ext.Element
  579.  */
  580. // special markup used throughout Ext when box wrapping elements
  581. Ext.Element.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
  582. Ext.Element.addMethods(function(){
  583. var INTERNAL = "_internal";
  584. return {
  585.     /**
  586.      * More flexible version of {@link #setStyle} for setting style properties.
  587.      * @param {String/Object/Function} styles A style specification string, e.g. "width:100px", or object in the form {width:"100px"}, or
  588.      * a function which returns such a specification.
  589.      * @return {Ext.Element} this
  590.      */
  591.     applyStyles : function(style){
  592.         Ext.DomHelper.applyStyles(this.dom, style);
  593.         return this;
  594.     },
  595. /**
  596.      * Returns an object with properties matching the styles requested.
  597.      * For example, el.getStyles('color', 'font-size', 'width') might return
  598.      * {'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}.
  599.      * @param {String} style1 A style name
  600.      * @param {String} style2 A style name
  601.      * @param {String} etc.
  602.      * @return {Object} The style object
  603.      */
  604.     getStyles : function(){
  605.     var ret = {};
  606.     Ext.each(arguments, function(v) {
  607.    ret[v] = this.getStyle(v);
  608.     },
  609.     this);
  610.     return ret;
  611.     },
  612. getStyleSize : function(){
  613.         var me = this,
  614.          w,
  615.          h,
  616.          d = this.dom,
  617.          s = d.style;
  618.         if(s.width && s.width != 'auto'){
  619.             w = parseInt(s.width, 10);
  620.             if(me.isBorderBox()){
  621.                w -= me.getFrameWidth('lr');
  622.             }
  623.         }
  624.         if(s.height && s.height != 'auto'){
  625.             h = parseInt(s.height, 10);
  626.             if(me.isBorderBox()){
  627.                h -= me.getFrameWidth('tb');
  628.             }
  629.         }
  630.         return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
  631.     },
  632.     // private  ==> used by ext full
  633. setOverflow : function(v){
  634. var dom = this.dom;
  635.      if(v=='auto' && Ext.isMac && Ext.isGecko2){ // work around stupid FF 2.0/Mac scroll bar bug
  636.      dom.style.overflow = 'hidden';
  637.          (function(){dom.style.overflow = 'auto';}).defer(1);
  638.      }else{
  639.      dom.style.overflow = v;
  640.      }
  641. },
  642.    /**
  643. * <p>Wraps the specified element with a special 9 element markup/CSS block that renders by default as
  644. * a gray container with a gradient background, rounded corners and a 4-way shadow.</p>
  645. * <p>This special markup is used throughout Ext when box wrapping elements ({@link Ext.Button},
  646. * {@link Ext.Panel} when <tt>{@link Ext.Panel#frame frame=true}</tt>, {@link Ext.Window}).  The markup
  647. * is of this form:</p>
  648. * <pre><code>
  649. Ext.Element.boxMarkup =
  650.     &#39;&lt;div class="{0}-tl">&lt;div class="{0}-tr">&lt;div class="{0}-tc">&lt;/div>&lt;/div>&lt;/div>
  651.      &lt;div class="{0}-ml">&lt;div class="{0}-mr">&lt;div class="{0}-mc">&lt;/div>&lt;/div>&lt;/div>
  652.      &lt;div class="{0}-bl">&lt;div class="{0}-br">&lt;div class="{0}-bc">&lt;/div>&lt;/div>&lt;/div>&#39;;
  653. * </code></pre>
  654. * <p>Example usage:</p>
  655. * <pre><code>
  656. // Basic box wrap
  657. Ext.get("foo").boxWrap();
  658. // You can also add a custom class and use CSS inheritance rules to customize the box look.
  659. // 'x-box-blue' is a built-in alternative -- look at the related CSS definitions as an example
  660. // for how to create a custom box wrap style.
  661. Ext.get("foo").boxWrap().addClass("x-box-blue");
  662. * </code></pre>
  663. * @param {String} class (optional) A base CSS class to apply to the containing wrapper element
  664. * (defaults to <tt>'x-box'</tt>). Note that there are a number of CSS rules that are dependent on
  665. * this name to make the overall effect work, so if you supply an alternate base class, make sure you
  666. * also supply all of the necessary rules.
  667. * @return {Ext.Element} this
  668. */
  669.     boxWrap : function(cls){
  670.         cls = cls || 'x-box';
  671.         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)));
  672.         Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
  673.         return el;
  674.     },
  675.         /**
  676.          * Set the size of this Element. If animation is true, both width and height will be animated concurrently.
  677.          * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  678.          * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  679.          * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  680.          * <li>A size object in the format <code>{width: widthValue, height: heightValue}</code>.</li>
  681.          * </ul></div>
  682.          * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  683.          * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  684.          * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  685.          * </ul></div>
  686.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  687.          * @return {Ext.Element} this
  688.          */
  689.     setSize : function(width, height, animate){
  690. var me = this;
  691. if(Ext.isObject(width)){ // in case of object from getSize()
  692.     height = width.height;
  693.     width = width.width;
  694. }
  695. width = me.adjustWidth(width);
  696. height = me.adjustHeight(height);
  697. if(!animate || !me.anim){
  698.     me.dom.style.width = me.addUnits(width);
  699.     me.dom.style.height = me.addUnits(height);
  700. }else{
  701.     me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2));
  702. }
  703. return me;
  704.     },
  705.     /**
  706.      * Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders
  707.      * when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements
  708.      * if a height has not been set using CSS.
  709.      * @return {Number}
  710.      */
  711.     getComputedHeight : function(){
  712.     var me = this,
  713.          h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
  714.         if(!h){
  715.             h = parseInt(me.getStyle('height'), 10) || 0;
  716.             if(!me.isBorderBox()){
  717.                 h += me.getFrameWidth('tb');
  718.             }
  719.         }
  720.         return h;
  721.     },
  722.     /**
  723.      * Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders
  724.      * when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements
  725.      * if a width has not been set using CSS.
  726.      * @return {Number}
  727.      */
  728.     getComputedWidth : function(){
  729.         var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
  730.         if(!w){
  731.             w = parseInt(this.getStyle('width'), 10) || 0;
  732.             if(!this.isBorderBox()){
  733.                 w += this.getFrameWidth('lr');
  734.             }
  735.         }
  736.         return w;
  737.     },
  738.     /**
  739.      * Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth()
  740.      for more information about the sides.
  741.      * @param {String} sides
  742.      * @return {Number}
  743.      */
  744.     getFrameWidth : function(sides, onlyContentBox){
  745.         return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
  746.     },
  747.     /**
  748.      * Sets up event handlers to add and remove a css class when the mouse is over this element
  749.      * @param {String} className
  750.      * @return {Ext.Element} this
  751.      */
  752.     addClassOnOver : function(className){
  753.         this.hover(
  754.             function(){
  755.                 Ext.fly(this, INTERNAL).addClass(className);
  756.             },
  757.             function(){
  758.                 Ext.fly(this, INTERNAL).removeClass(className);
  759.             }
  760.         );
  761.         return this;
  762.     },
  763.     /**
  764.      * Sets up event handlers to add and remove a css class when this element has the focus
  765.      * @param {String} className
  766.      * @return {Ext.Element} this
  767.      */
  768.     addClassOnFocus : function(className){
  769.     this.on("focus", function(){
  770.         Ext.fly(this, INTERNAL).addClass(className);
  771.     }, this.dom);
  772.     this.on("blur", function(){
  773.         Ext.fly(this, INTERNAL).removeClass(className);
  774.     }, this.dom);
  775.     return this;
  776.     },
  777.     /**
  778.      * 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)
  779.      * @param {String} className
  780.      * @return {Ext.Element} this
  781.      */
  782.     addClassOnClick : function(className){
  783.         var dom = this.dom;
  784.         this.on("mousedown", function(){
  785.             Ext.fly(dom, INTERNAL).addClass(className);
  786.             var d = Ext.getDoc(),
  787.              fn = function(){
  788.                 Ext.fly(dom, INTERNAL).removeClass(className);
  789.                 d.removeListener("mouseup", fn);
  790.             };
  791.             d.on("mouseup", fn);
  792.         });
  793.         return this;
  794.     },
  795.     /**
  796.      * Returns the width and height of the viewport.
  797.         * <pre><code>
  798.         var vpSize = Ext.getBody().getViewSize();
  799.         // all Windows created afterwards will have a default value of 90% height and 95% width
  800.         Ext.Window.override({
  801.             width: vpSize.width * 0.9,
  802.             height: vpSize.height * 0.95
  803.         });
  804.         // To handle window resizing you would have to hook onto onWindowResize.
  805.         </code></pre>
  806.      * @return {Object} An object containing the viewport's size {width: (viewport width), height: (viewport height)}
  807.      */
  808.     getViewSize : function(){
  809.         var doc = document,
  810.          d = this.dom,
  811.          extdom = Ext.lib.Dom,
  812.          isDoc = (d == doc || d == doc.body);
  813.         return { width : (isDoc ? extdom.getViewWidth() : d.clientWidth),
  814.           height : (isDoc ? extdom.getViewHeight() : d.clientHeight) };
  815.     },
  816.     /**
  817.      * Returns the size of the element.
  818.      * @param {Boolean} contentSize (optional) true to get the width/size minus borders and padding
  819.      * @return {Object} An object containing the element's size {width: (element width), height: (element height)}
  820.      */
  821.     getSize : function(contentSize){
  822.         return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
  823.     },
  824.     /**
  825.      * Forces the browser to repaint this element
  826.      * @return {Ext.Element} this
  827.      */
  828.     repaint : function(){
  829.         var dom = this.dom;
  830.         this.addClass("x-repaint");
  831.         setTimeout(function(){
  832.             Ext.fly(dom).removeClass("x-repaint");
  833.         }, 1);
  834.         return this;
  835.     },
  836.     /**
  837.      * Disables text selection for this element (normalized across browsers)
  838.      * @return {Ext.Element} this
  839.      */
  840.     unselectable : function(){
  841.         this.dom.unselectable = "on";
  842.         return this.swallowEvent("selectstart", true).
  843.              applyStyles("-moz-user-select:none;-khtml-user-select:none;").
  844.              addClass("x-unselectable");
  845.     },
  846.     /**
  847.      * Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed,
  848.      * then it returns the calculated width of the sides (see getPadding)
  849.      * @param {String} sides (optional) Any combination of l, r, t, b to get the sum of those sides
  850.      * @return {Object/Number}
  851.      */
  852.     getMargins : function(side){
  853.     var me = this,
  854.      key,
  855.      hash = {t:"top", l:"left", r:"right", b: "bottom"},
  856.      o = {};
  857.     if (!side) {
  858.         for (key in me.margins){
  859.          o[hash[key]] = parseInt(me.getStyle(me.margins[key]), 10) || 0;
  860.                 }
  861.         return o;
  862.         } else {
  863.             return me.addStyles.call(me, side, me.margins);
  864.         }
  865.     }
  866.     };
  867. }());/**
  868.  * @class Ext.Element
  869.  */
  870. (function(){
  871. var D = Ext.lib.Dom,
  872.         LEFT = "left",
  873.         RIGHT = "right",
  874.         TOP = "top",
  875.         BOTTOM = "bottom",
  876.         POSITION = "position",
  877.         STATIC = "static",
  878.         RELATIVE = "relative",
  879.         AUTO = "auto",
  880.         ZINDEX = "z-index";
  881. function animTest(args, animate, i) {
  882. return this.preanim && !!animate ? this.preanim(args, i) : false
  883. }
  884. Ext.Element.addMethods({
  885. /**
  886.       * 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).
  887.       * @return {Number} The X position of the element
  888.       */
  889.     getX : function(){
  890.         return D.getX(this.dom);
  891.     },
  892.     /**
  893.       * 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).
  894.       * @return {Number} The Y position of the element
  895.       */
  896.     getY : function(){
  897.         return D.getY(this.dom);
  898.     },
  899.     /**
  900.       * 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).
  901.       * @return {Array} The XY position of the element
  902.       */
  903.     getXY : function(){
  904.         return D.getXY(this.dom);
  905.     },
  906.     /**
  907.       * 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.
  908.       * @param {Mixed} element The element to get the offsets from.
  909.       * @return {Array} The XY page offsets (e.g. [100, -200])
  910.       */
  911.     getOffsetsTo : function(el){
  912.         var o = this.getXY(),
  913.          e = Ext.fly(el, '_internal').getXY();
  914.         return [o[0]-e[0],o[1]-e[1]];
  915.     },
  916.     /**
  917.      * 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).
  918.      * @param {Number} The X position of the element
  919.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  920.      * @return {Ext.Element} this
  921.      */
  922.     setX : function(x, animate){     
  923.     return this.setXY([x, this.getY()], animTest.call(this, arguments, animate, 1));
  924.     },
  925.     /**
  926.      * 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).
  927.      * @param {Number} The Y position of the element
  928.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  929.      * @return {Ext.Element} this
  930.      */
  931.     setY : function(y, animate){     
  932.     return this.setXY([this.getX(), y], animTest.call(this, arguments, animate, 1));
  933.     },
  934.     /**
  935.      * Sets the element's left position directly using CSS style (instead of {@link #setX}).
  936.      * @param {String} left The left CSS property value
  937.      * @return {Ext.Element} this
  938.      */
  939.     setLeft : function(left){
  940.         this.setStyle(LEFT, this.addUnits(left));
  941.         return this;
  942.     },
  943.     /**
  944.      * Sets the element's top position directly using CSS style (instead of {@link #setY}).
  945.      * @param {String} top The top CSS property value
  946.      * @return {Ext.Element} this
  947.      */
  948.     setTop : function(top){
  949.         this.setStyle(TOP, this.addUnits(top));
  950.         return this;
  951.     },
  952.     /**
  953.      * Sets the element's CSS right style.
  954.      * @param {String} right The right CSS property value
  955.      * @return {Ext.Element} this
  956.      */
  957.     setRight : function(right){
  958.         this.setStyle(RIGHT, this.addUnits(right));
  959.         return this;
  960.     },
  961.     /**
  962.      * Sets the element's CSS bottom style.
  963.      * @param {String} bottom The bottom CSS property value
  964.      * @return {Ext.Element} this
  965.      */
  966.     setBottom : function(bottom){
  967.         this.setStyle(BOTTOM, this.addUnits(bottom));
  968.         return this;
  969.     },
  970.     /**
  971.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  972.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  973.      * @param {Array} pos Contains X & Y [x, y] values for new position (coordinates are page-based)
  974.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  975.      * @return {Ext.Element} this
  976.      */
  977.     setXY : function(pos, animate){
  978.     var me = this;
  979.         if(!animate || !me.anim){
  980.             D.setXY(me.dom, pos);
  981.         }else{
  982.             me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion');
  983.         }
  984.         return me;
  985.     },
  986.     /**
  987.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  988.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  989.      * @param {Number} x X value for new position (coordinates are page-based)
  990.      * @param {Number} y Y value for new position (coordinates are page-based)
  991.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  992.      * @return {Ext.Element} this
  993.      */
  994.     setLocation : function(x, y, animate){
  995.         return this.setXY([x, y], animTest.call(this, arguments, animate, 2));
  996.     },
  997.     /**
  998.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  999.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  1000.      * @param {Number} x X value for new position (coordinates are page-based)
  1001.      * @param {Number} y Y value for new position (coordinates are page-based)
  1002.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  1003.      * @return {Ext.Element} this
  1004.      */
  1005.     moveTo : function(x, y, animate){
  1006.         return this.setXY([x, y], animTest.call(this, arguments, animate, 2));        
  1007.     },    
  1008.     
  1009.     /**
  1010.      * Gets the left X coordinate
  1011.      * @param {Boolean} local True to get the local css position instead of page coordinate
  1012.      * @return {Number}
  1013.      */
  1014.     getLeft : function(local){
  1015.     return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
  1016.     },
  1017.     /**
  1018.      * Gets the right X coordinate of the element (element X position + element width)
  1019.      * @param {Boolean} local True to get the local css position instead of page coordinate
  1020.      * @return {Number}
  1021.      */
  1022.     getRight : function(local){
  1023.     var me = this;
  1024.     return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0;
  1025.     },
  1026.     /**
  1027.      * Gets the top Y coordinate
  1028.      * @param {Boolean} local True to get the local css position instead of page coordinate
  1029.      * @return {Number}
  1030.      */
  1031.     getTop : function(local) {
  1032.     return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0;
  1033.     },
  1034.     /**
  1035.      * Gets the bottom Y coordinate of the element (element Y position + element height)
  1036.      * @param {Boolean} local True to get the local css position instead of page coordinate
  1037.      * @return {Number}
  1038.      */
  1039.     getBottom : function(local){
  1040.     var me = this;
  1041.     return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0;
  1042.     },
  1043.     /**
  1044.     * Initializes positioning on this element. If a desired position is not passed, it will make the
  1045.     * the element positioned relative IF it is not already positioned.
  1046.     * @param {String} pos (optional) Positioning to use "relative", "absolute" or "fixed"
  1047.     * @param {Number} zIndex (optional) The zIndex to apply
  1048.     * @param {Number} x (optional) Set the page X position
  1049.     * @param {Number} y (optional) Set the page Y position
  1050.     */
  1051.     position : function(pos, zIndex, x, y){
  1052.     var me = this;
  1053.     
  1054.         if(!pos && me.isStyle(POSITION, STATIC)){           
  1055.             me.setStyle(POSITION, RELATIVE);           
  1056.         } else if(pos) {
  1057.             me.setStyle(POSITION, pos);
  1058.         }
  1059.         if(zIndex){
  1060.             me.setStyle(ZINDEX, zIndex);
  1061.         }
  1062.         if(x || y) me.setXY([x || false, y || false]);
  1063.     },
  1064.     /**
  1065.     * Clear positioning back to the default when the document was loaded
  1066.     * @param {String} value (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'.
  1067.     * @return {Ext.Element} this
  1068.      */
  1069.     clearPositioning : function(value){
  1070.         value = value || '';
  1071.         this.setStyle({
  1072.             left : value,
  1073.             right : value,
  1074.             top : value,
  1075.             bottom : value,
  1076.             "z-index" : "",
  1077.             position : STATIC
  1078.         });
  1079.         return this;
  1080.     },
  1081.     /**
  1082.     * Gets an object with all CSS positioning properties. Useful along with setPostioning to get
  1083.     * snapshot before performing an update and then restoring the element.
  1084.     * @return {Object}
  1085.     */
  1086.     getPositioning : function(){
  1087.         var l = this.getStyle(LEFT);
  1088.         var t = this.getStyle(TOP);
  1089.         return {
  1090.             "position" : this.getStyle(POSITION),
  1091.             "left" : l,
  1092.             "right" : l ? "" : this.getStyle(RIGHT),
  1093.             "top" : t,
  1094.             "bottom" : t ? "" : this.getStyle(BOTTOM),
  1095.             "z-index" : this.getStyle(ZINDEX)
  1096.         };
  1097.     },
  1098.     
  1099.     /**
  1100.     * Set positioning with an object returned by getPositioning().
  1101.     * @param {Object} posCfg
  1102.     * @return {Ext.Element} this
  1103.      */
  1104.     setPositioning : function(pc){
  1105.     var me = this,
  1106.      style = me.dom.style;
  1107.     
  1108.         me.setStyle(pc);
  1109.         
  1110.         if(pc.right == AUTO){
  1111.             style.right = "";
  1112.         }
  1113.         if(pc.bottom == AUTO){
  1114.             style.bottom = "";
  1115.         }
  1116.         
  1117.         return me;
  1118.     },    
  1119.     /**
  1120.      * Translates the passed page coordinates into left/top css values for this element
  1121.      * @param {Number/Array} x The page x or an array containing [x, y]
  1122.      * @param {Number} y (optional) The page y, required if x is not an array
  1123.      * @return {Object} An object with left and top properties. e.g. {left: (value), top: (value)}
  1124.      */
  1125.     translatePoints : function(x, y){              
  1126.     y = isNaN(x[1]) ? y : x[1];
  1127.         x = isNaN(x[0]) ? x : x[0];
  1128.         var me = this,
  1129.          relative = me.isStyle(POSITION, RELATIVE),
  1130.          o = me.getXY(),
  1131.          l = parseInt(me.getStyle(LEFT), 10),
  1132.          t = parseInt(me.getStyle(TOP), 10);
  1133.         
  1134.         l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft);
  1135.         t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop);        
  1136.         return {left: (x - o[0] + l), top: (y - o[1] + t)}; 
  1137.     },
  1138.     
  1139.     animTest : animTest
  1140. });
  1141. })();/**
  1142.  * @class Ext.Element
  1143.  */
  1144. Ext.Element.addMethods({
  1145.     /**
  1146.      * 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.
  1147.      * @param {Object} box The box to fill {x, y, width, height}
  1148.      * @param {Boolean} adjust (optional) Whether to adjust for box-model issues automatically
  1149.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1150.      * @return {Ext.Element} this
  1151.      */
  1152.     setBox : function(box, adjust, animate){
  1153.         var me = this,
  1154.          w = box.width, 
  1155.          h = box.height;
  1156.         if((adjust && !me.autoBoxAdjust) && !me.isBorderBox()){
  1157.            w -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  1158.            h -= (me.getBorderWidth("tb") + me.getPadding("tb"));
  1159.         }
  1160.         me.setBounds(box.x, box.y, w, h, me.animTest.call(me, arguments, animate, 2));
  1161.         return me;
  1162.     },
  1163.     
  1164.     /**
  1165.      * Return a box {x, y, width, height} that can be used to set another elements
  1166.      * size/location to match this element.
  1167.      * @param {Boolean} contentBox (optional) If true a box for the content of the element is returned.
  1168.      * @param {Boolean} local (optional) If true the element's left and top are returned instead of page x/y.
  1169.      * @return {Object} box An object in the format {x, y, width, height}
  1170.      */
  1171. getBox : function(contentBox, local) {     
  1172.     var me = this,
  1173.          xy,
  1174.          left,
  1175.          top,
  1176.          getBorderWidth = me.getBorderWidth,
  1177.          getPadding = me.getPadding, 
  1178.          l,
  1179.          r,
  1180.          t,
  1181.          b;
  1182.         if(!local){
  1183.             xy = me.getXY();
  1184.         }else{
  1185.             left = parseInt(me.getStyle("left"), 10) || 0;
  1186.             top = parseInt(me.getStyle("top"), 10) || 0;
  1187.             xy = [left, top];
  1188.         }
  1189.         var el = me.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
  1190.         if(!contentBox){
  1191.             bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};
  1192.         }else{
  1193.             l = getBorderWidth.call(me, "l") + getPadding.call(me, "l");
  1194.             r = getBorderWidth.call(me, "r") + getPadding.call(me, "r");
  1195.             t = getBorderWidth.call(me, "t") + getPadding.call(me, "t");
  1196.             b = getBorderWidth.call(me, "b") + getPadding.call(me, "b");
  1197.             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)};
  1198.         }
  1199.         bx.right = bx.x + bx.width;
  1200.         bx.bottom = bx.y + bx.height;
  1201.         return bx;
  1202. },
  1203.     /**
  1204.      * Move this element relative to its current position.
  1205.      * @param {String} direction Possible values are: "l" (or "left"), "r" (or "right"), "t" (or "top", or "up"), "b" (or "bottom", or "down").
  1206.      * @param {Number} distance How far to move the element in pixels
  1207.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1208.      * @return {Ext.Element} this
  1209.      */
  1210.      move : function(direction, distance, animate){
  1211.         var me = this,        
  1212.          xy = me.getXY(),
  1213.          x = xy[0],
  1214.          y = xy[1],        
  1215.          left = [x - distance, y],
  1216.          right = [x + distance, y],
  1217.          top = [x, y - distance],
  1218.          bottom = [x, y + distance],
  1219.         hash = {
  1220.          l : left,
  1221.          left : left,
  1222.          r : right,
  1223.          right : right,
  1224.          t : top,
  1225.          top : top,
  1226.          up : top,
  1227.          b : bottom, 
  1228.          bottom : bottom,
  1229.          down : bottom         
  1230.         };
  1231.         
  1232.       direction = direction.toLowerCase();    
  1233.       me.moveTo(hash[direction][0], hash[direction][1], me.animTest.call(me, arguments, animate, 2));
  1234.     },
  1235.     
  1236.     /**
  1237.      * Quick set left and top adding default units
  1238.      * @param {String} left The left CSS property value
  1239.      * @param {String} top The top CSS property value
  1240.      * @return {Ext.Element} this
  1241.      */
  1242.      setLeftTop : function(left, top){
  1243.     var me = this,
  1244.      style = me.dom.style;
  1245.         style.left = me.addUnits(left);
  1246.         style.top = me.addUnits(top);
  1247.         return me;
  1248.     },
  1249.     
  1250.     /**
  1251.      * Returns the region of the given element.
  1252.      * The element must be part of the DOM tree to have a region (display:none or elements not appended return false).
  1253.      * @return {Region} A Ext.lib.Region containing "top, left, bottom, right" member data.
  1254.      */
  1255.     getRegion : function(){
  1256.         return Ext.lib.Dom.getRegion(this.dom);
  1257.     },
  1258.     
  1259.     /**
  1260.      * Sets the element's position and size in one shot. If animation is true then width, height, x and y will be animated concurrently.
  1261.      * @param {Number} x X value for new position (coordinates are page-based)
  1262.      * @param {Number} y Y value for new position (coordinates are page-based)
  1263.      * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  1264.      * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels)</li>
  1265.      * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  1266.      * </ul></div>
  1267.      * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  1268.      * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels)</li>
  1269.      * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  1270.      * </ul></div>
  1271.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1272.      * @return {Ext.Element} this
  1273.      */
  1274.     setBounds : function(x, y, width, height, animate){
  1275.     var me = this;
  1276.         if (!animate || !me.anim) {
  1277.             me.setSize(width, height);
  1278.             me.setLocation(x, y);
  1279.         } else {
  1280.             me.anim({points: {to: [x, y]}, 
  1281.               width: {to: me.adjustWidth(width)}, 
  1282.               height: {to: me.adjustHeight(height)}},
  1283.                      me.preanim(arguments, 4), 
  1284.                      'motion');
  1285.         }
  1286.         return me;
  1287.     },
  1288.     /**
  1289.      * Sets the element's position and size the specified region. If animation is true then width, height, x and y will be animated concurrently.
  1290.      * @param {Ext.lib.Region} region The region to fill
  1291.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1292.      * @return {Ext.Element} this
  1293.      */
  1294.     setRegion : function(region, animate) {
  1295.         return this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.animTest.call(this, arguments, animate, 1));
  1296.     }
  1297. });/**
  1298.  * @class Ext.Element
  1299.  */
  1300. Ext.Element.addMethods({
  1301.     /**
  1302.      * Returns true if this element is scrollable.
  1303.      * @return {Boolean}
  1304.      */
  1305.     isScrollable : function(){
  1306.         var dom = this.dom;
  1307.         return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
  1308.     },
  1309.     /**
  1310.      * 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().
  1311.      * @param {String} side Either "left" for scrollLeft values or "top" for scrollTop values.
  1312.      * @param {Number} value The new scroll value.
  1313.      * @return {Element} this
  1314.      */
  1315.     scrollTo : function(side, value){
  1316.         this.dom["scroll" + (/top/i.test(side) ? "Top" : "Left")] = value;
  1317.         return this;
  1318.     },
  1319.     /**
  1320.      * Returns the current scroll position of the element.
  1321.      * @return {Object} An object containing the scroll position in the format {left: (scrollLeft), top: (scrollTop)}
  1322.      */
  1323.     getScroll : function(){
  1324.         var d = this.dom, 
  1325.             doc = document,
  1326.             body = doc.body,
  1327.             docElement = doc.documentElement,
  1328.             l,
  1329.             t,
  1330.             ret;
  1331.         if(d == doc || d == body){
  1332.             if(Ext.isIE && Ext.isStrict){
  1333.                 l = docElement.scrollLeft; 
  1334.                 t = docElement.scrollTop;
  1335.             }else{
  1336.                 l = window.pageXOffset;
  1337.                 t = window.pageYOffset;
  1338.             }
  1339.             ret = {left: l || (body ? body.scrollLeft : 0), top: t || (body ? body.scrollTop : 0)};
  1340.         }else{
  1341.             ret = {left: d.scrollLeft, top: d.scrollTop};
  1342.         }
  1343.         return ret;
  1344.     }
  1345. });/**
  1346.  * @class Ext.Element
  1347.  */
  1348. Ext.Element.addMethods({
  1349.     /**
  1350.      * 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().
  1351.      * @param {String} side Either "left" for scrollLeft values or "top" for scrollTop values.
  1352.      * @param {Number} value The new scroll value
  1353.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1354.      * @return {Element} this
  1355.      */
  1356.     scrollTo : function(side, value, animate){
  1357.         var tester = /top/i,
  1358.          prop = "scroll" + (tester.test(side) ? "Top" : "Left"),
  1359.          me = this,
  1360.          dom = me.dom;
  1361.         if (!animate || !me.anim) {
  1362.             dom[prop] = value;
  1363.         } else {
  1364.             me.anim({scroll: {to: tester.test(prop) ? [dom[prop], value] : [value, dom[prop]]}},
  1365.               me.preanim(arguments, 2), 'scroll');
  1366.         }
  1367.         return me;
  1368.     },
  1369.     
  1370.     /**
  1371.      * Scrolls this element into view within the passed container.
  1372.      * @param {Mixed} container (optional) The container element to scroll (defaults to document.body).  Should be a
  1373.      * string (id), dom node, or Ext.Element.
  1374.      * @param {Boolean} hscroll (optional) False to disable horizontal scroll (defaults to true)
  1375.      * @return {Ext.Element} this
  1376.      */
  1377.     scrollIntoView : function(container, hscroll){
  1378.         var c = Ext.getDom(container) || Ext.getBody().dom,
  1379.          el = this.dom,
  1380.          o = this.getOffsetsTo(c),
  1381.             l = o[0] + c.scrollLeft,
  1382.             t = o[1] + c.scrollTop,
  1383.             b = t + el.offsetHeight,
  1384.             r = l + el.offsetWidth,
  1385.          ch = c.clientHeight,
  1386.          ct = parseInt(c.scrollTop, 10),
  1387.          cl = parseInt(c.scrollLeft, 10),
  1388.          cb = ct + ch,
  1389.          cr = cl + c.clientWidth;
  1390.         if (el.offsetHeight > ch || t < ct) {
  1391.          c.scrollTop = t;
  1392.         } else if (b > cb){
  1393.             c.scrollTop = b-ch;
  1394.         }
  1395.         c.scrollTop = c.scrollTop; // corrects IE, other browsers will ignore
  1396.         if(hscroll !== false){
  1397. if(el.offsetWidth > c.clientWidth || l < cl){
  1398.                 c.scrollLeft = l;
  1399.             }else if(r > cr){
  1400.                 c.scrollLeft = r - c.clientWidth;
  1401.             }
  1402.             c.scrollLeft = c.scrollLeft;
  1403.         }
  1404.         return this;
  1405.     },
  1406.     // private
  1407.     scrollChildIntoView : function(child, hscroll){
  1408.         Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
  1409.     },
  1410.     
  1411.     /**
  1412.      * Scrolls this element the specified direction. Does bounds checking to make sure the scroll is
  1413.      * within this element's scrollable range.
  1414.      * @param {String} direction Possible values are: "l" (or "left"), "r" (or "right"), "t" (or "top", or "up"), "b" (or "bottom", or "down").
  1415.      * @param {Number} distance How far to scroll the element in pixels
  1416.      * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  1417.      * @return {Boolean} Returns true if a scroll was triggered or false if the element
  1418.      * was scrolled as far as it could go.
  1419.      */
  1420.      scroll : function(direction, distance, animate){
  1421.          if(!this.isScrollable()){
  1422.              return;
  1423.          }
  1424.          var el = this.dom,
  1425.             l = el.scrollLeft, t = el.scrollTop,
  1426.             w = el.scrollWidth, h = el.scrollHeight,
  1427.             cw = el.clientWidth, ch = el.clientHeight,
  1428.             scrolled = false, v,
  1429.             hash = {
  1430.                 l: Math.min(l + distance, w-cw),
  1431.                 r: v = Math.max(l - distance, 0),
  1432.                 t: Math.max(t - distance, 0),
  1433.                 b: Math.min(t + distance, h-ch)
  1434.             };
  1435.             hash.d = hash.b;
  1436.             hash.u = hash.t;
  1437.             
  1438.          direction = direction.substr(0, 1);
  1439.          if((v = hash[direction]) > -1){
  1440.             scrolled = true;
  1441.             this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.preanim(arguments, 2));
  1442.          }
  1443.          return scrolled;
  1444.     }
  1445. });/**
  1446.  * @class Ext.Element
  1447.  */
  1448. /**
  1449.  * Visibility mode constant for use with {@link #setVisibilityMode}. Use visibility to hide element
  1450.  * @static
  1451.  * @type Number
  1452.  */
  1453. Ext.Element.VISIBILITY = 1;
  1454. /**
  1455.  * Visibility mode constant for use with {@link #setVisibilityMode}. Use display to hide element
  1456.  * @static
  1457.  * @type Number
  1458.  */
  1459. Ext.Element.DISPLAY = 2;
  1460. Ext.Element.addMethods(function(){
  1461.     var VISIBILITY = "visibility",
  1462.         DISPLAY = "display",
  1463.         HIDDEN = "hidden",
  1464.         NONE = "none",      
  1465.         ORIGINALDISPLAY = 'originalDisplay',
  1466.         VISMODE = 'visibilityMode',
  1467.         ELDISPLAY = Ext.Element.DISPLAY,
  1468.         data = Ext.Element.data,
  1469.         getDisplay = function(dom){
  1470.             var d = data(dom, ORIGINALDISPLAY);
  1471.             if(d === undefined){
  1472.                 data(dom, ORIGINALDISPLAY, d = '');
  1473.             }
  1474.             return d;
  1475.         },
  1476.         getVisMode = function(dom){
  1477.             var m = data(dom, VISMODE);
  1478.             if(m === undefined){
  1479.                 data(dom, VISMODE, m = 1)
  1480.             }
  1481.             return m;
  1482.         };
  1483.     
  1484.     return {
  1485.         /**
  1486.          * The element's default display mode  (defaults to "")
  1487.          * @type String
  1488.          */
  1489.         originalDisplay : "",
  1490.         visibilityMode : 1,
  1491.         
  1492.         /**
  1493.          * Sets the element's visibility mode. When setVisible() is called it
  1494.          * will use this to determine whether to set the visibility or the display property.
  1495.          * @param visMode Ext.Element.VISIBILITY or Ext.Element.DISPLAY
  1496.          * @return {Ext.Element} this
  1497.          */
  1498.         setVisibilityMode : function(visMode){  
  1499.             data(this.dom, VISMODE, visMode);
  1500.             return this;
  1501.         },
  1502.         
  1503.         /**
  1504.          * Perform custom animation on this element.
  1505.          * <div><ul class="mdetail-params">
  1506.          * <li><u>Animation Properties</u></li>
  1507.          * 
  1508.          * <p>The Animation Control Object enables gradual transitions for any member of an
  1509.          * element's style object that takes a numeric value including but not limited to
  1510.          * these properties:</p><div><ul class="mdetail-params">
  1511.          * <li><tt>bottom, top, left, right</tt></li>
  1512.          * <li><tt>height, width</tt></li>
  1513.          * <li><tt>margin, padding</tt></li>
  1514.          * <li><tt>borderWidth</tt></li>
  1515.          * <li><tt>opacity</tt></li>
  1516.          * <li><tt>fontSize</tt></li>
  1517.          * <li><tt>lineHeight</tt></li>
  1518.          * </ul></div>
  1519.          * 
  1520.          * 
  1521.          * <li><u>Animation Property Attributes</u></li>
  1522.          * 
  1523.          * <p>Each Animation Property is a config object with optional properties:</p>
  1524.          * <div><ul class="mdetail-params">
  1525.          * <li><tt>by</tt>*  : relative change - start at current value, change by this value</li>
  1526.          * <li><tt>from</tt> : ignore current value, start from this value</li>
  1527.          * <li><tt>to</tt>*  : start at current value, go to this value</li>
  1528.          * <li><tt>unit</tt> : any allowable unit specification</li>
  1529.          * <p>* do not specify both <tt>to</tt> and <tt>by</tt> for an animation property</p>
  1530.          * </ul></div>
  1531.          * 
  1532.          * <li><u>Animation Types</u></li>
  1533.          * 
  1534.          * <p>The supported animation types:</p><div><ul class="mdetail-params">
  1535.          * <li><tt>'run'</tt> : Default
  1536.          * <pre><code>
  1537. var el = Ext.get('complexEl');
  1538. el.animate(
  1539.     // animation control object
  1540.     {
  1541.         borderWidth: {to: 3, from: 0},
  1542.         opacity: {to: .3, from: 1},
  1543.         height: {to: 50, from: el.getHeight()},
  1544.         width: {to: 300, from: el.getWidth()},
  1545.         top  : {by: - 100, unit: 'px'},
  1546.     },
  1547.     0.35,      // animation duration
  1548.     null,      // callback
  1549.     'easeOut', // easing method
  1550.     'run'      // animation type ('run','color','motion','scroll')    
  1551. );
  1552.          * </code></pre>
  1553.          * </li>
  1554.          * <li><tt>'color'</tt>
  1555.          * <p>Animates transition of background, text, or border colors.</p>
  1556.          * <pre><code>
  1557. el.animate(
  1558.     // animation control object
  1559.     {
  1560.         color: { to: '#06e' },
  1561.         backgroundColor: { to: '#e06' }
  1562.     },
  1563.     0.35,      // animation duration
  1564.     null,      // callback
  1565.     'easeOut', // easing method
  1566.     'color'    // animation type ('run','color','motion','scroll')    
  1567. );
  1568.          * </code></pre> 
  1569.          * </li>
  1570.          * 
  1571.          * <li><tt>'motion'</tt>
  1572.          * <p>Animates the motion of an element to/from specific points using optional bezier
  1573.          * way points during transit.</p>
  1574.          * <pre><code>
  1575. el.animate(
  1576.     // animation control object
  1577.     {
  1578.         borderWidth: {to: 3, from: 0},