talho/openphin

View on GitHub
app/assets/javascripts/ext/src/ext-core/src/adapter/ext-base-dom.js

Summary

Maintainability
F
1 wk
Test Coverage
/*!
 * Ext JS Library 3.3.0
 * Copyright(c) 2006-2010 Ext JS, Inc.
 * licensing@extjs.com
 * http://www.extjs.com/license
 */
(function(){
    var doc = document,
        isCSS1 = doc.compatMode == "CSS1Compat",
        MAX = Math.max,        
        ROUND = Math.round,
        PARSEINT = parseInt;
        
    Ext.lib.Dom = {
        isAncestor : function(p, c) {
            var ret = false;
            
            p = Ext.getDom(p);
            c = Ext.getDom(c);
            if (p && c) {
                if (p.contains) {
                    return p.contains(c);
                } else if (p.compareDocumentPosition) {
                    return !!(p.compareDocumentPosition(c) & 16);
                } else {
                    while (c = c.parentNode) {
                        ret = c == p || ret;                        
                    }
                }                
            }    
            return ret;
        },
        
        getViewWidth : function(full) {
            return full ? this.getDocumentWidth() : this.getViewportWidth();
        },

        getViewHeight : function(full) {
            return full ? this.getDocumentHeight() : this.getViewportHeight();
        },

        getDocumentHeight: function() {            
            return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight());
        },

        getDocumentWidth: function() {            
            return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth());
        },

        getViewportHeight: function(){
            return Ext.isIE ? 
                   (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :
                   self.innerHeight;
        },

        getViewportWidth : function() {
            return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth :
                   Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth;
        },
        
        getY : function(el) {
            return this.getXY(el)[1];
        },

        getX : function(el) {
            return this.getXY(el)[0];
        },

        getXY : function(el) {
            var p, 
                pe, 
                b,
                bt, 
                bl,     
                dbd,           
                x = 0,
                y = 0, 
                scroll,
                hasAbsolute, 
                bd = (doc.body || doc.documentElement),
                ret = [0,0];
                
            el = Ext.getDom(el);

            if(el != bd){
                if (el.getBoundingClientRect) {
                    b = el.getBoundingClientRect();
                    scroll = fly(document).getScroll();
                    ret = [ROUND(b.left + scroll.left), ROUND(b.top + scroll.top)];
                } else {  
                    p = el;        
                    hasAbsolute = fly(el).isStyle("position", "absolute");
        
                    while (p) {
                        pe = fly(p);        
                        x += p.offsetLeft;
                        y += p.offsetTop;
        
                        hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute");
                                
                        if (Ext.isGecko) {                            
                            y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0;
                            x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0;    
        
                            if (p != el && !pe.isStyle('overflow','visible')) {
                                x += bl;
                                y += bt;
                            }
                        }
                        p = p.offsetParent;
                    }
        
                    if (Ext.isSafari && hasAbsolute) {
                        x -= bd.offsetLeft;
                        y -= bd.offsetTop;
                    }
        
                    if (Ext.isGecko && !hasAbsolute) {
                        dbd = fly(bd);
                        x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0;
                        y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0;
                    }
        
                    p = el.parentNode;
                    while (p && p != bd) {
                        if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {
                            x -= p.scrollLeft;
                            y -= p.scrollTop;
                        }
                        p = p.parentNode;
                    }
                    ret = [x,y];
                }
             }
            return ret;
        },

        setXY : function(el, xy) {
            (el = Ext.fly(el, '_setXY')).position();
            
            var pts = el.translatePoints(xy),
                style = el.dom.style,
                pos;                
            
            for (pos in pts) {                
                if (!isNaN(pts[pos])) {
                    style[pos] = pts[pos] + "px";
                }
            }
        },

        setX : function(el, x) {
            this.setXY(el, [x, false]);
        },

        setY : function(el, y) {
            this.setXY(el, [false, y]);
        }
    };
})();