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