(function(){
       
var doc = document,
                isCSS1
= doc.compatMode == "CSS1Compat",
                MAX
= Math.max,        
                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
= [b.left + scroll.left, 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]);
       
}
   
};
})();