Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / src / adapter / core / ext-base-dom.js
1 /*!
2  * Ext JS Library 3.0.0
3  * Copyright(c) 2006-2009 Ext JS, LLC
4  * licensing@extjs.com
5  * http://www.extjs.com/license
6  */
7 (function(){\r
8         var doc = document,\r
9                 isCSS1 = doc.compatMode == "CSS1Compat",\r
10                 MAX = Math.max,         \r
11                 PARSEINT = parseInt;\r
12                 \r
13         Ext.lib.Dom = {\r
14             isAncestor : function(p, c) {\r
15                     var ret = false;\r
16                         \r
17                         p = Ext.getDom(p);\r
18                         c = Ext.getDom(c);\r
19                         if (p && c) {\r
20                                 if (p.contains) {\r
21                                         return p.contains(c);\r
22                                 } else if (p.compareDocumentPosition) {\r
23                                         return !!(p.compareDocumentPosition(c) & 16);\r
24                                 } else {\r
25                                         while (c = c.parentNode) {\r
26                                                 ret = c == p || ret;                                    \r
27                                         }\r
28                                 }                   \r
29                         }       \r
30                         return ret;\r
31                 },\r
32                 \r
33         getViewWidth : function(full) {\r
34             return full ? this.getDocumentWidth() : this.getViewportWidth();\r
35         },\r
36 \r
37         getViewHeight : function(full) {\r
38             return full ? this.getDocumentHeight() : this.getViewportHeight();\r
39         },\r
40 \r
41         getDocumentHeight: function() {            \r
42             return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight());\r
43         },\r
44 \r
45         getDocumentWidth: function() {            \r
46             return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth());\r
47         },\r
48 \r
49         getViewportHeight: function(){\r
50                 return Ext.isIE ? \r
51                            (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :\r
52                            self.innerHeight;\r
53         },\r
54 \r
55         getViewportWidth : function() {\r
56                 return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth :\r
57                            Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth;\r
58         },\r
59         \r
60         getY : function(el) {\r
61             return this.getXY(el)[1];\r
62         },\r
63 \r
64         getX : function(el) {\r
65             return this.getXY(el)[0];\r
66         },\r
67 \r
68         getXY : function(el) {\r
69             var p, \r
70                 pe, \r
71                 b,\r
72                 bt, \r
73                 bl,     \r
74                 dbd,            \r
75                 x = 0,\r
76                 y = 0, \r
77                 scroll,\r
78                 hasAbsolute, \r
79                 bd = (doc.body || doc.documentElement),\r
80                 ret = [0,0];\r
81                 \r
82             el = Ext.getDom(el);\r
83 \r
84             if(el != bd){\r
85                     if (el.getBoundingClientRect) {\r
86                         b = el.getBoundingClientRect();\r
87                         scroll = fly(document).getScroll();\r
88                         ret = [b.left + scroll.left, b.top + scroll.top];\r
89                     } else {  \r
90                             p = el;             \r
91                             hasAbsolute = fly(el).isStyle("position", "absolute");\r
92                 \r
93                             while (p) {\r
94                                     pe = fly(p);                \r
95                                 x += p.offsetLeft;\r
96                                 y += p.offsetTop;\r
97                 \r
98                                 hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute");\r
99                                                 \r
100                                 if (Ext.isGecko) {                                  \r
101                                     y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0;\r
102                                     x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0;        \r
103                 \r
104                                     if (p != el && !pe.isStyle('overflow','visible')) {\r
105                                         x += bl;\r
106                                         y += bt;\r
107                                     }\r
108                                 }\r
109                                 p = p.offsetParent;\r
110                             }\r
111                 \r
112                             if (Ext.isSafari && hasAbsolute) {\r
113                                 x -= bd.offsetLeft;\r
114                                 y -= bd.offsetTop;\r
115                             }\r
116                 \r
117                             if (Ext.isGecko && !hasAbsolute) {\r
118                                 dbd = fly(bd);\r
119                                 x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0;\r
120                                 y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0;\r
121                             }\r
122                 \r
123                             p = el.parentNode;\r
124                             while (p && p != bd) {\r
125                                 if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {\r
126                                     x -= p.scrollLeft;\r
127                                     y -= p.scrollTop;\r
128                                 }\r
129                                 p = p.parentNode;\r
130                             }\r
131                             ret = [x,y];\r
132                     }\r
133                 }\r
134             return ret\r
135         },\r
136 \r
137         setXY : function(el, xy) {\r
138             (el = Ext.fly(el, '_setXY')).position();\r
139             \r
140             var pts = el.translatePoints(xy),\r
141                 style = el.dom.style,\r
142                 pos;                    \r
143             \r
144             for (pos in pts) {              \r
145                     if(!isNaN(pts[pos])) style[pos] = pts[pos] + "px"\r
146             }\r
147         },\r
148 \r
149         setX : function(el, x) {\r
150             this.setXY(el, [x, false]);\r
151         },\r
152 \r
153         setY : function(el, y) {\r
154             this.setXY(el, [false, y]);\r
155         }\r
156     };\r
157 })();