commit extjs-2.2.1
[extjs.git] / source / adapter / yui-bridge.js
1 /*\r
2  * Ext JS Library 2.2.1\r
3  * Copyright(c) 2006-2009, Ext JS, LLC.\r
4  * licensing@extjs.com\r
5  * \r
6  * http://extjs.com/license\r
7  */\r
8 \r
9 if(typeof YAHOO == "undefined"){\r
10     throw "Unable to load Ext, core YUI utilities (yahoo, dom, event) not found.";\r
11 }\r
12 \r
13 (function(){\r
14 var E = YAHOO.util.Event;\r
15 var D = YAHOO.util.Dom;\r
16 var CN = YAHOO.util.Connect;\r
17 \r
18 var ES = YAHOO.util.Easing;\r
19 var A = YAHOO.util.Anim;\r
20 var libFlyweight;\r
21 \r
22 Ext.lib.Dom = {\r
23     getViewWidth : function(full){\r
24         return full ? D.getDocumentWidth() : D.getViewportWidth();\r
25     },\r
26 \r
27     getViewHeight : function(full){\r
28         return full ? D.getDocumentHeight() : D.getViewportHeight();\r
29     },\r
30 \r
31     isAncestor : function(haystack, needle){\r
32         return D.isAncestor(haystack, needle);\r
33     },\r
34 \r
35     getRegion : function(el){\r
36         return D.getRegion(el);\r
37     },\r
38 \r
39     getY : function(el){\r
40         return this.getXY(el)[1];\r
41     },\r
42 \r
43     getX : function(el){\r
44         return this.getXY(el)[0];\r
45     },\r
46 \r
47     // original version based on YahooUI getXY\r
48     // this version fixes several issues in Safari and FF\r
49     // and boosts performance by removing the batch overhead, repetitive dom lookups and array index calls\r
50     getXY : function(el){\r
51         var p, pe, b, scroll, bd = (document.body || document.documentElement);\r
52         el = Ext.getDom(el);\r
53 \r
54         if(el == bd){\r
55             return [0, 0];\r
56         }\r
57 \r
58         if (el.getBoundingClientRect) {\r
59             b = el.getBoundingClientRect();\r
60             scroll = fly(document).getScroll();\r
61             return [b.left + scroll.left, b.top + scroll.top];\r
62         }\r
63         var x = 0, y = 0;\r
64 \r
65         p = el;\r
66 \r
67         var hasAbsolute = fly(el).getStyle("position") == "absolute";\r
68 \r
69         while (p) {\r
70 \r
71             x += p.offsetLeft;\r
72             y += p.offsetTop;\r
73 \r
74             if (!hasAbsolute && fly(p).getStyle("position") == "absolute") {\r
75                 hasAbsolute = true;\r
76             }\r
77 \r
78             if (Ext.isGecko) {\r
79                 pe = fly(p);\r
80 \r
81                 var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;\r
82                 var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;\r
83 \r
84 \r
85                 x += bl;\r
86                 y += bt;\r
87 \r
88 \r
89                 if (p != el && pe.getStyle('overflow') != 'visible') {\r
90                     x += bl;\r
91                     y += bt;\r
92                 }\r
93             }\r
94             p = p.offsetParent;\r
95         }\r
96 \r
97         if (Ext.isSafari && hasAbsolute) {\r
98             x -= bd.offsetLeft;\r
99             y -= bd.offsetTop;\r
100         }\r
101 \r
102         if (Ext.isGecko && !hasAbsolute) {\r
103             var dbd = fly(bd);\r
104             x += parseInt(dbd.getStyle("borderLeftWidth"), 10) || 0;\r
105             y += parseInt(dbd.getStyle("borderTopWidth"), 10) || 0;\r
106         }\r
107 \r
108         p = el.parentNode;\r
109         while (p && p != bd) {\r
110             if (!Ext.isOpera || (p.tagName != 'TR' && fly(p).getStyle("display") != "inline")) {\r
111                 x -= p.scrollLeft;\r
112                 y -= p.scrollTop;\r
113             }\r
114             p = p.parentNode;\r
115         }\r
116         return [x, y];\r
117     },\r
118 \r
119     setXY : function(el, xy){\r
120         el = Ext.fly(el, '_setXY');\r
121         el.position();\r
122         var pts = el.translatePoints(xy);\r
123         if(xy[0] !== false){\r
124             el.dom.style.left = pts.left + "px";\r
125         }\r
126         if(xy[1] !== false){\r
127             el.dom.style.top = pts.top + "px";\r
128         }\r
129     },\r
130 \r
131     setX : function(el, x){\r
132         this.setXY(el, [x, false]);\r
133     },\r
134 \r
135     setY : function(el, y){\r
136         this.setXY(el, [false, y]);\r
137     }\r
138 };\r
139 \r
140 Ext.lib.Event = {\r
141     getPageX : function(e){\r
142         return E.getPageX(e.browserEvent || e);\r
143     },\r
144 \r
145     getPageY : function(e){\r
146         return E.getPageY(e.browserEvent || e);\r
147     },\r
148 \r
149     getXY : function(e){\r
150         return E.getXY(e.browserEvent || e);\r
151     },\r
152 \r
153     getTarget : function(e){\r
154         return E.getTarget(e.browserEvent || e);\r
155     },\r
156 \r
157     getRelatedTarget : function(e){\r
158         return E.getRelatedTarget(e.browserEvent || e);\r
159     },\r
160 \r
161     on : function(el, eventName, fn, scope, override){\r
162         E.on(el, eventName, fn, scope, override);\r
163     },\r
164 \r
165     un : function(el, eventName, fn){\r
166         E.removeListener(el, eventName, fn);\r
167     },\r
168 \r
169     purgeElement : function(el){\r
170         E.purgeElement(el);\r
171     },\r
172 \r
173     preventDefault : function(e){\r
174         E.preventDefault(e.browserEvent || e);\r
175     },\r
176 \r
177     stopPropagation : function(e){\r
178         E.stopPropagation(e.browserEvent || e);\r
179     },\r
180 \r
181     stopEvent : function(e){\r
182         E.stopEvent(e.browserEvent || e);\r
183     },\r
184 \r
185     onAvailable : function(el, fn, scope, override){\r
186         return E.onAvailable(el, fn, scope, override);\r
187     }\r
188 };\r
189 \r
190 Ext.lib.Ajax = {\r
191     request : function(method, uri, cb, data, options){\r
192         if(options){\r
193             var hs = options.headers;\r
194             if(hs){\r
195                 for(var h in hs){\r
196                     if(hs.hasOwnProperty(h)){\r
197                         CN.initHeader(h, hs[h], false);\r
198                     }\r
199                 }\r
200             }\r
201             if(options.xmlData){\r
202                 if (!hs || !hs['Content-Type']){\r
203                     CN.initHeader('Content-Type', 'text/xml', false);\r
204                 }\r
205                 method = (method ? method : (options.method ? options.method : 'POST'));\r
206                 data = options.xmlData;\r
207             }else if(options.jsonData){\r
208                 if (!hs || !hs['Content-Type']){\r
209                     CN.initHeader('Content-Type', 'application/json', false);\r
210                 }\r
211                 method = (method ? method : (options.method ? options.method : 'POST'));\r
212                 data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;\r
213             }\r
214         }\r
215         return CN.asyncRequest(method, uri, cb, data);\r
216     },\r
217 \r
218     formRequest : function(form, uri, cb, data, isUpload, sslUri){\r
219         CN.setForm(form, isUpload, sslUri);\r
220         return CN.asyncRequest(Ext.getDom(form).method ||'POST', uri, cb, data);\r
221     },\r
222 \r
223     isCallInProgress : function(trans){\r
224         return CN.isCallInProgress(trans);\r
225     },\r
226 \r
227     abort : function(trans){\r
228         return CN.abort(trans);\r
229     },\r
230 \r
231     serializeForm : function(form){\r
232         var d = CN.setForm(form.dom || form);\r
233         CN.resetFormState();\r
234         return d;\r
235     }\r
236 };\r
237 \r
238 Ext.lib.Region = YAHOO.util.Region;\r
239 Ext.lib.Point = YAHOO.util.Point;\r
240 \r
241 \r
242 Ext.lib.Anim = {\r
243     scroll : function(el, args, duration, easing, cb, scope){\r
244         this.run(el, args, duration, easing, cb, scope, YAHOO.util.Scroll);\r
245     },\r
246 \r
247     motion : function(el, args, duration, easing, cb, scope){\r
248         this.run(el, args, duration, easing, cb, scope, YAHOO.util.Motion);\r
249     },\r
250 \r
251     color : function(el, args, duration, easing, cb, scope){\r
252         this.run(el, args, duration, easing, cb, scope, YAHOO.util.ColorAnim);\r
253     },\r
254 \r
255     run : function(el, args, duration, easing, cb, scope, type){\r
256         type = type || YAHOO.util.Anim;\r
257         if(typeof easing == "string"){\r
258             easing = YAHOO.util.Easing[easing];\r
259         }\r
260         var anim = new type(el, args, duration, easing);\r
261         anim.animateX(function(){\r
262             Ext.callback(cb, scope);\r
263         });\r
264         return anim;\r
265     }\r
266 };\r
267 \r
268 // all lib flyweight calls use their own flyweight to prevent collisions with developer flyweights\r
269 function fly(el){\r
270     if(!libFlyweight){\r
271         libFlyweight = new Ext.Element.Flyweight();\r
272     }\r
273     libFlyweight.dom = el;\r
274     return libFlyweight;\r
275 }\r
276 \r
277 // prevent IE leaks\r
278 if(Ext.isIE) {\r
279     function fnCleanUp() {\r
280         var p = Function.prototype;\r
281         delete p.createSequence;\r
282         delete p.defer;\r
283         delete p.createDelegate;\r
284         delete p.createCallback;\r
285         delete p.createInterceptor;\r
286 \r
287         window.detachEvent("onunload", fnCleanUp);\r
288     }\r
289     window.attachEvent("onunload", fnCleanUp);\r
290 }\r
291 // various overrides\r
292 \r
293 // add ability for callbacks with animations\r
294 if(YAHOO.util.Anim){\r
295     YAHOO.util.Anim.prototype.animateX = function(callback, scope){\r
296         var f = function(){\r
297             this.onComplete.unsubscribe(f);\r
298             if(typeof callback == "function"){\r
299                 callback.call(scope || this, this);\r
300             }\r
301         };\r
302         this.onComplete.subscribe(f, this, true);\r
303         this.animate();\r
304     };\r
305 }\r
306 \r
307 if(YAHOO.util.DragDrop && Ext.dd.DragDrop){\r
308     YAHOO.util.DragDrop.defaultPadding = Ext.dd.DragDrop.defaultPadding;\r
309     YAHOO.util.DragDrop.constrainTo = Ext.dd.DragDrop.constrainTo;\r
310 }\r
311 \r
312 YAHOO.util.Dom.getXY = function(el) {\r
313     var f = function(el) {\r
314         return Ext.lib.Dom.getXY(el);\r
315     };\r
316     return YAHOO.util.Dom.batch(el, f, YAHOO.util.Dom, true);\r
317 };\r
318 \r
319 \r
320 // workaround for Safari anim duration speed problems\r
321 if(YAHOO.util.AnimMgr){\r
322     YAHOO.util.AnimMgr.fps = 1000;\r
323 }\r
324 \r
325 YAHOO.util.Region.prototype.adjust = function(t, l, b, r){\r
326     this.top += t;\r
327     this.left += l;\r
328     this.right += r;\r
329     this.bottom += b;\r
330     return this;\r
331 };\r
332     \r
333 YAHOO.util.Region.prototype.constrainTo = function(r) {\r
334     this.top = this.top.constrain(r.top, r.bottom);\r
335     this.bottom = this.bottom.constrain(r.top, r.bottom);\r
336     this.left = this.left.constrain(r.left, r.right);\r
337     this.right = this.right.constrain(r.left, r.right);\r
338     return this;\r
339 };\r
340 \r
341 \r
342 })();