    (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]);
            }
        };
    })();