| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-dom-Element'>/**</span> * @class Ext.dom.Element */(function() {var Element = Ext.dom.Element,    LEFT = "left",    RIGHT = "right",    TOP = "top",    BOTTOM = "bottom",    POSITION = "position",    STATIC = "static",    RELATIVE = "relative",    AUTO = "auto",    ZINDEX = "z-index",    BODY = 'BODY',    PADDING = 'padding',    BORDER = 'border',    SLEFT = '-left',    SRIGHT = '-right',    STOP = '-top',    SBOTTOM = '-bottom',    SWIDTH = '-width',    // special markup used throughout Ext when box wrapping elements    borders = {l: BORDER + SLEFT + SWIDTH, r: BORDER + SRIGHT + SWIDTH, t: BORDER + STOP + SWIDTH, b: BORDER + SBOTTOM + SWIDTH},    paddings = {l: PADDING + SLEFT, r: PADDING + SRIGHT, t: PADDING + STOP, b: PADDING + SBOTTOM},    paddingsTLRB = [paddings.l, paddings.r, paddings.t, paddings.b],    bordersTLRB = [borders.l,  borders.r,  borders.t,  borders.b],    positionTopLeft = ['position', 'top', 'left'];Element.override({    getX: function() {        return Element.getX(this.dom);    },    getY: function() {        return Element.getY(this.dom);    },<span id='Ext-dom-Element-method-getXY'>    /**</span>      * 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).      * @return {Number[]} The XY position of the element      */    getXY: function() {        return Element.getXY(this.dom);    },<span id='Ext-dom-Element-method-getOffsetsTo'>    /**</span>      * 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.      * @param {String/HTMLElement/Ext.Element} element The element to get the offsets from.      * @return {Number[]} The XY page offsets (e.g. `[100, -200]`)      */    getOffsetsTo : function(el){        var o = this.getXY(),                e = Ext.fly(el, '_internal').getXY();        return [o[0] - e[0],o[1] - e[1]];    },    setX: function(x, animate) {        return this.setXY([x, this.getY()], animate);    },    setY: function(y, animate) {        return this.setXY([this.getX(), y], animate);    },    setLeft: function(left) {        this.setStyle(LEFT, this.addUnits(left));        return this;    },    setTop: function(top) {        this.setStyle(TOP, this.addUnits(top));        return this;    },    setRight: function(right) {        this.setStyle(RIGHT, this.addUnits(right));        return this;    },    setBottom: function(bottom) {        this.setStyle(BOTTOM, this.addUnits(bottom));        return this;    },<span id='Ext-dom-Element-method-setXY'>    /**</span>     * Sets the position of the element in page coordinates, regardless of how the element     * is positioned. The element must be part of the DOM tree to have page coordinates     * (`display:none` or elements not appended return false).     * @param {Number[]} pos Contains X & Y [x, y] values for new position (coordinates are page-based)     * @param {Boolean/Object} [animate] True for the default animation, or a standard Element     * animation config object     * @return {Ext.Element} this     */    setXY: function(pos, animate) {        var me = this;        if (!animate || !me.anim) {            Element.setXY(me.dom, pos);        }        else {            if (!Ext.isObject(animate)) {                animate = {};            }            me.animate(Ext.applyIf({ to: { x: pos[0], y: pos[1] } }, animate));        }        return me;    },    pxRe: /^\d+(?:\.\d*)?px$/i,<span id='Ext-dom-Element-method-getLocalX'>    /**</span>     * Returns the x-coordinate of this element reletive to its `offsetParent`.     * @return {Number} The local x-coordinate (relative to the `offsetParent`).     */    getLocalX: function() {        var me = this,            offsetParent,            x = me.getStyle(LEFT);        if (!x || x === AUTO) {            return 0;        }        if (x && me.pxRe.test(x)) {            return parseFloat(x);        }        x = me.getX();        offsetParent = me.dom.offsetParent;        if (offsetParent) {            x -= Ext.fly(offsetParent).getX();        }        return x;    },<span id='Ext-dom-Element-method-getLocalY'>    /**</span>     * Returns the y-coordinate of this element reletive to its `offsetParent`.     * @return {Number} The local y-coordinate (relative to the `offsetParent`).     */    getLocalY: function() {        var me = this,            offsetParent,            y = me.getStyle(TOP);        if (!y || y === AUTO) {            return 0;        }        if (y && me.pxRe.test(y)) {            return parseFloat(y);        }        y = me.getY();        offsetParent = me.dom.offsetParent;        if (offsetParent) {            y -= Ext.fly(offsetParent).getY();        }        return y;    },    getLeft: function(local) {        return local ? this.getLocalX() : this.getX();    },    getRight: function(local) {        return (local ? this.getLocalX() : this.getX()) + this.getWidth();    },    getTop: function(local) {        return local ? this.getLocalY() : this.getY();    },    getBottom: function(local) {        return (local ? this.getLocalY() : this.getY()) + this.getHeight();    },    translatePoints: function(x, y) {        var me = this,            styles = me.getStyle(positionTopLeft),            relative = styles.position == 'relative',            left = parseFloat(styles.left),            top = parseFloat(styles.top),            xy = me.getXY();        if (Ext.isArray(x)) {             y = x[1];             x = x[0];        }        if (isNaN(left)) {            left = relative ? 0 : me.dom.offsetLeft;        }        if (isNaN(top)) {            top = relative ? 0 : me.dom.offsetTop;        }        left = (typeof x == 'number') ? x - xy[0] + left : undefined;        top = (typeof y == 'number') ? y - xy[1] + top : undefined;        return {            left: left,            top: top        };    },    setBox: function(box, adjust, animate) {        var me = this,                w = box.width,                h = box.height;        if ((adjust && !me.autoBoxAdjust) && !me.isBorderBox()) {            w -= (me.getBorderWidth("lr") + me.getPadding("lr"));            h -= (me.getBorderWidth("tb") + me.getPadding("tb"));        }        me.setBounds(box.x, box.y, w, h, animate);        return me;    },    getBox: function(contentBox, local) {        var me = this,            xy,            left,            top,            paddingWidth,            bordersWidth,            l, r, t, b, w, h, bx;        if (!local) {            xy = me.getXY();        } else {            xy = me.getStyle([LEFT, TOP]);            xy = [ parseFloat(xy.left) || 0, parseFloat(xy.top) || 0];        }        w = me.getWidth();        h = me.getHeight();        if (!contentBox) {            bx = {                x: xy[0],                y: xy[1],                0: xy[0],                1: xy[1],                width: w,                height: h            };        } else {            paddingWidth = me.getStyle(paddingsTLRB);            bordersWidth = me.getStyle(bordersTLRB);            l = (parseFloat(bordersWidth[borders.l]) || 0) + (parseFloat(paddingWidth[paddings.l]) || 0);            r = (parseFloat(bordersWidth[borders.r]) || 0) + (parseFloat(paddingWidth[paddings.r]) || 0);            t = (parseFloat(bordersWidth[borders.t]) || 0) + (parseFloat(paddingWidth[paddings.t]) || 0);            b = (parseFloat(bordersWidth[borders.b]) || 0) + (parseFloat(paddingWidth[paddings.b]) || 0);            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)            };        }        bx.right = bx.x + bx.width;        bx.bottom = bx.y + bx.height;        return bx;    },    getPageBox: function(getRegion) {        var me = this,            el = me.dom,            isDoc = el.nodeName == BODY,            w = isDoc ? Ext.dom.AbstractElement.getViewWidth() : el.offsetWidth,            h = isDoc ? Ext.dom.AbstractElement.getViewHeight() : el.offsetHeight,            xy = me.getXY(),            t = xy[1],            r = xy[0] + w,            b = xy[1] + h,            l = xy[0];        if (getRegion) {            return new Ext.util.Region(t, r, b, l);        }        else {            return {                left: l,                top: t,                width: w,                height: h,                right: r,                bottom: b            };        }    },<span id='Ext-dom-Element-method-setLocation'>    /**</span>     * Sets the position of the element in page coordinates, regardless of how the element     * is positioned. The element must be part of the DOM tree to have page coordinates     * (`display:none` or elements not appended return false).     * @param {Number} x X value for new position (coordinates are page-based)     * @param {Number} y Y value for new position (coordinates are page-based)     * @param {Boolean/Object} [animate] True for the default animation, or a standard Element     * animation config object     * @return {Ext.dom.AbstractElement} this     */    setLocation : function(x, y, animate) {        return this.setXY([x, y], animate);    },<span id='Ext-dom-Element-method-moveTo'>    /**</span>     * Sets the position of the element in page coordinates, regardless of how the element     * is positioned. The element must be part of the DOM tree to have page coordinates     * (`display:none` or elements not appended return false).     * @param {Number} x X value for new position (coordinates are page-based)     * @param {Number} y Y value for new position (coordinates are page-based)     * @param {Boolean/Object} [animate] True for the default animation, or a standard Element     * animation config object     * @return {Ext.dom.AbstractElement} this     */    moveTo : function(x, y, animate) {        return this.setXY([x, y], animate);    },<span id='Ext-dom-Element-method-position'>    /**</span>     * Initializes positioning on this element. If a desired position is not passed, it will make the     * the element positioned relative IF it is not already positioned.     * @param {String} [pos] Positioning to use "relative", "absolute" or "fixed"     * @param {Number} [zIndex] The zIndex to apply     * @param {Number} [x] Set the page X position     * @param {Number} [y] Set the page Y position     */    position : function(pos, zIndex, x, y) {        var me = this;        if (!pos && me.isStyle(POSITION, STATIC)) {            me.setStyle(POSITION, RELATIVE);        } else if (pos) {            me.setStyle(POSITION, pos);        }        if (zIndex) {            me.setStyle(ZINDEX, zIndex);        }        if (x || y) {            me.setXY([x || false, y || false]);        }    },<span id='Ext-dom-Element-method-clearPositioning'>    /**</span>     * Clears positioning back to the default when the document was loaded.     * @param {String} [value=''] The value to use for the left, right, top, bottom. You could use 'auto'.     * @return {Ext.dom.AbstractElement} this     */    clearPositioning : function(value) {        value = value || '';        this.setStyle({            left : value,            right : value,            top : value,            bottom : value,            "z-index" : "",            position : STATIC        });        return this;    },<span id='Ext-dom-Element-method-getPositioning'>    /**</span>     * Gets an object with all CSS positioning properties. Useful along with #setPostioning to get     * snapshot before performing an update and then restoring the element.     * @return {Object}     */    getPositioning : function(){        var styles = this.getStyle([LEFT, TOP, POSITION, RIGHT, BOTTOM, ZINDEX]);        styles[RIGHT] =  styles[LEFT] ? '' : styles[RIGHT];        styles[BOTTOM] = styles[TOP] ? '' : styles[BOTTOM];        return styles;    },<span id='Ext-dom-Element-method-setPositioning'>    /**</span>     * Set positioning with an object returned by #getPositioning.     * @param {Object} posCfg     * @return {Ext.dom.AbstractElement} this     */    setPositioning : function(pc) {        var me = this,            style = me.dom.style;        me.setStyle(pc);        if (pc.right == AUTO) {            style.right = "";        }        if (pc.bottom == AUTO) {            style.bottom = "";        }        return me;    },<span id='Ext-dom-Element-method-move'>    /**</span>     * Move this element relative to its current position.     * @param {String} direction Possible values are:     *     * - `"l"` (or `"left"`)     * - `"r"` (or `"right"`)     * - `"t"` (or `"top"`, or `"up"`)     * - `"b"` (or `"bottom"`, or `"down"`)     *     * @param {Number} distance How far to move the element in pixels     * @param {Boolean/Object} [animate] true for the default animation or a standard Element     * animation config object     */    move: function(direction, distance, animate) {        var me = this,            xy = me.getXY(),            x = xy[0],            y = xy[1],            left = [x - distance, y],            right = [x + distance, y],            top = [x, y - distance],            bottom = [x, y + distance],            hash = {                l: left,                left: left,                r: right,                right: right,                t: top,                top: top,                up: top,                b: bottom,                bottom: bottom,                down: bottom            };        direction = direction.toLowerCase();        me.moveTo(hash[direction][0], hash[direction][1], animate);    },<span id='Ext-dom-Element-method-setLeftTop'>    /**</span>     * Conveniently sets left and top adding default units.     * @param {String} left The left CSS property value     * @param {String} top The top CSS property value     * @return {Ext.dom.Element} this     */    setLeftTop: function(left, top) {        var style = this.dom.style;        style.left = Element.addUnits(left);        style.top = Element.addUnits(top);        return this;    },<span id='Ext-dom-Element-method-getRegion'>    /**</span>     * Returns the region of this element.     * The element must be part of the DOM tree to have a region     * (display:none or elements not appended return false).     * @return {Ext.util.Region} A Region containing "top, left, bottom, right" member data.     */    getRegion: function() {        return this.getPageBox(true);    },<span id='Ext-dom-Element-method-getViewRegion'>    /**</span>     * Returns the **content** region of this element. That is the region within the borders and padding.     * @return {Ext.util.Region} A Region containing "top, left, bottom, right" member data.     */    getViewRegion: function() {        var me = this,            isBody = me.dom.nodeName == BODY,            scroll, pos, top, left, width, height;        // For the body we want to do some special logic        if (isBody) {            scroll = me.getScroll();            left = scroll.left;            top = scroll.top;            width = Ext.dom.AbstractElement.getViewportWidth();            height = Ext.dom.AbstractElement.getViewportHeight();        }        else {            pos = me.getXY();            left = pos[0] + me.getBorderWidth('l') + me.getPadding('l');            top = pos[1] + me.getBorderWidth('t') + me.getPadding('t');            width = me.getWidth(true);            height = me.getHeight(true);        }        return new Ext.util.Region(top, left + width - 1, top + height - 1, left);    },<span id='Ext-dom-Element-method-setBounds'>    /**</span>     * Sets the element's position and size in one shot. If animation is true then width, height,     * x and y will be animated concurrently.     *     * @param {Number} x X value for new position (coordinates are page-based)     * @param {Number} y Y value for new position (coordinates are page-based)     * @param {Number/String} width The new width. This may be one of:     *     * - A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels)     * - A String used to set the CSS width style. Animation may **not** be used.     *     * @param {Number/String} height The new height. This may be one of:     *     * - A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels)     * - A String used to set the CSS height style. Animation may **not** be used.     *     * @param {Boolean/Object} [animate] true for the default animation or a standard Element     * animation config object     *     * @return {Ext.dom.AbstractElement} this     */    setBounds: function(x, y, width, height, animate) {        var me = this;        if (!animate || !me.anim) {            me.setSize(width, height);            me.setLocation(x, y);        } else {            if (!Ext.isObject(animate)) {                animate = {};            }            me.animate(Ext.applyIf({                to: {                    x: x,                    y: y,                    width: me.adjustWidth(width),                    height: me.adjustHeight(height)                }            }, animate));        }        return me;    },<span id='Ext-dom-Element-method-setRegion'>    /**</span>     * Sets the element's position and size the specified region. If animation is true then width, height,     * x and y will be animated concurrently.     *     * @param {Ext.util.Region} region The region to fill     * @param {Boolean/Object} [animate] true for the default animation or a standard Element     * animation config object     * @return {Ext.dom.AbstractElement} this     */    setRegion: function(region, animate) {        return this.setBounds(region.left, region.top, region.right - region.left, region.bottom - region.top, animate);    }});}());</pre></body></html>
 |