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