2 * Ext JS Library 2.2.1
\r
3 * Copyright(c) 2006-2009, Ext JS, LLC.
\r
4 * licensing@extjs.com
\r
6 * http://extjs.com/license
\r
9 if(typeof jQuery == "undefined"){
\r
10 throw "Unable to load Ext, jQuery not found.";
\r
17 getViewWidth : function(full){
\r
18 // jQuery doesn't report full window size on document query, so max both
\r
19 return full ? Math.max(jQuery(document).width(),jQuery(window).width()) : jQuery(window).width();
\r
22 getViewHeight : function(full){
\r
23 // jQuery doesn't report full window size on document query, so max both
\r
24 return full ? Math.max(jQuery(document).height(),jQuery(window).height()) : jQuery(window).height();
\r
27 isAncestor : function(p, c){
\r
30 if (!p || !c) {return false;}
\r
32 if(p.contains && !Ext.isSafari) {
\r
33 return p.contains(c);
\r
34 }else if(p.compareDocumentPosition) {
\r
35 return !!(p.compareDocumentPosition(c) & 16);
\r
37 var parent = c.parentNode;
\r
42 else if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") {
\r
45 parent = parent.parentNode;
\r
51 getRegion : function(el){
\r
52 return Ext.lib.Region.getRegion(el);
\r
55 //////////////////////////////////////////////////////////////////////////////////////
\r
56 // Use of jQuery.offset() removed to promote consistent behavior across libs.
\r
58 //////////////////////////////////////////////////////////////////////////////////////
\r
60 getY : function(el){
\r
61 return this.getXY(el)[1];
\r
64 getX : function(el){
\r
65 return this.getXY(el)[0];
\r
68 getXY : function(el) {
\r
69 var p, pe, b, scroll, bd = (document.body || document.documentElement);
\r
70 el = Ext.getDom(el);
\r
76 if (el.getBoundingClientRect) {
\r
77 b = el.getBoundingClientRect();
\r
78 scroll = fly(document).getScroll();
\r
79 return [b.left + scroll.left, b.top + scroll.top];
\r
85 var hasAbsolute = fly(el).getStyle("position") == "absolute";
\r
92 if (!hasAbsolute && fly(p).getStyle("position") == "absolute") {
\r
99 var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;
\r
100 var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;
\r
107 if (p != el && pe.getStyle('overflow') != 'visible') {
\r
112 p = p.offsetParent;
\r
115 if (Ext.isSafari && hasAbsolute) {
\r
116 x -= bd.offsetLeft;
\r
120 if (Ext.isGecko && !hasAbsolute) {
\r
122 x += parseInt(dbd.getStyle("borderLeftWidth"), 10) || 0;
\r
123 y += parseInt(dbd.getStyle("borderTopWidth"), 10) || 0;
\r
127 while (p && p != bd) {
\r
128 if (!Ext.isOpera || (p.tagName != 'TR' && fly(p).getStyle("display") != "inline")) {
\r
137 setXY : function(el, xy){
\r
138 el = Ext.fly(el, '_setXY');
\r
140 var pts = el.translatePoints(xy);
\r
141 if(xy[0] !== false){
\r
142 el.dom.style.left = pts.left + "px";
\r
144 if(xy[1] !== false){
\r
145 el.dom.style.top = pts.top + "px";
\r
149 setX : function(el, x){
\r
150 this.setXY(el, [x, false]);
\r
153 setY : function(el, y){
\r
154 this.setXY(el, [false, y]);
\r
158 // all lib flyweight calls use their own flyweight to prevent collisions with developer flyweights
\r
161 libFlyweight = new Ext.Element.Flyweight();
\r
163 libFlyweight.dom = el;
\r
164 return libFlyweight;
\r
167 getPageX : function(e){
\r
168 e = e.browserEvent || e;
\r
172 getPageY : function(e){
\r
173 e = e.browserEvent || e;
\r
177 getXY : function(e){
\r
178 e = e.browserEvent || e;
\r
179 return [e.pageX, e.pageY];
\r
182 getTarget : function(e){
\r
186 // all Ext events will go through event manager which provides scoping
\r
187 on : function(el, eventName, fn, scope, override){
\r
188 jQuery(el).bind(eventName, fn);
\r
191 un : function(el, eventName, fn){
\r
192 jQuery(el).unbind(eventName, fn);
\r
195 purgeElement : function(el){
\r
196 jQuery(el).unbind();
\r
199 preventDefault : function(e){
\r
200 e = e.browserEvent || e;
\r
201 if(e.preventDefault){
\r
202 e.preventDefault();
\r
204 e.returnValue = false;
\r
208 stopPropagation : function(e){
\r
209 e = e.browserEvent || e;
\r
210 if(e.stopPropagation){
\r
211 e.stopPropagation();
\r
213 e.cancelBubble = true;
\r
217 stopEvent : function(e){
\r
218 this.preventDefault(e);
\r
219 this.stopPropagation(e);
\r
222 onAvailable : function(id, fn, scope){
\r
223 var start = new Date();
\r
224 var f = function(){
\r
225 if(start.getElapsed() > 10000){
\r
226 clearInterval(iid);
\r
228 var el = document.getElementById(id);
\r
230 clearInterval(iid);
\r
231 fn.call(scope||window, el);
\r
234 var iid = setInterval(f, 50);
\r
237 resolveTextNode: function(node) {
\r
238 if (node && 3 == node.nodeType) {
\r
239 return node.parentNode;
\r
245 getRelatedTarget: function(ev) {
\r
246 ev = ev.browserEvent || ev;
\r
247 var t = ev.relatedTarget;
\r
249 if (ev.type == "mouseout") {
\r
251 } else if (ev.type == "mouseover") {
\r
252 t = ev.fromElement;
\r
256 return this.resolveTextNode(t);
\r
260 Ext.lib.Ajax = function(){
\r
261 var createComplete = function(cb){
\r
262 return function(xhr, status){
\r
263 if((status == 'error' || status == 'timeout') && cb.failure){
\r
264 cb.failure.call(cb.scope||window, {
\r
265 responseText: xhr.responseText,
\r
266 responseXML : xhr.responseXML,
\r
267 argument: cb.argument
\r
269 }else if(cb.success){
\r
270 cb.success.call(cb.scope||window, {
\r
271 responseText: xhr.responseText,
\r
272 responseXML : xhr.responseXML,
\r
273 argument: cb.argument
\r
279 request : function(method, uri, cb, data, options){
\r
284 timeout: cb.timeout,
\r
285 complete: createComplete(cb)
\r
289 var hs = options.headers;
\r
290 if(options.xmlData){
\r
291 o.data = options.xmlData;
\r
292 o.processData = false;
\r
293 o.type = (method ? method : (options.method ? options.method : 'POST'));
\r
294 if (!hs || !hs['Content-Type']){
\r
295 o.contentType = 'text/xml';
\r
297 }else if(options.jsonData){
\r
298 o.data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;
\r
299 o.processData = false;
\r
300 o.type = (method ? method : (options.method ? options.method : 'POST'));
\r
301 if (!hs || !hs['Content-Type']){
\r
302 o.contentType = 'application/json';
\r
306 o.beforeSend = function(xhr){
\r
308 if(hs.hasOwnProperty(h)){
\r
309 xhr.setRequestHeader(h, hs[h]);
\r
318 formRequest : function(form, uri, cb, data, isUpload, sslUri){
\r
320 type: Ext.getDom(form).method ||'POST',
\r
322 data: jQuery(form).serialize()+(data?'&'+data:''),
\r
323 timeout: cb.timeout,
\r
324 complete: createComplete(cb)
\r
328 isCallInProgress : function(trans){
\r
332 abort : function(trans){
\r
336 serializeForm : function(form){
\r
337 return jQuery(form.dom||form).serialize();
\r
342 Ext.lib.Anim = function(){
\r
343 var createAnim = function(cb, scope){
\r
344 var animated = true;
\r
346 stop : function(skipToLast){
\r
350 isAnimated : function(){
\r
354 proxyCallback : function(){
\r
356 Ext.callback(cb, scope);
\r
361 scroll : function(el, args, duration, easing, cb, scope){
\r
362 // scroll anim not supported so just scroll immediately
\r
363 var anim = createAnim(cb, scope);
\r
364 el = Ext.getDom(el);
\r
365 if(typeof args.scroll.to[0] == 'number'){
\r
366 el.scrollLeft = args.scroll.to[0];
\r
368 if(typeof args.scroll.to[1] == 'number'){
\r
369 el.scrollTop = args.scroll.to[1];
\r
371 anim.proxyCallback();
\r
375 motion : function(el, args, duration, easing, cb, scope){
\r
376 return this.run(el, args, duration, easing, cb, scope);
\r
379 color : function(el, args, duration, easing, cb, scope){
\r
380 // color anim not supported, so execute callback immediately
\r
381 var anim = createAnim(cb, scope);
\r
382 anim.proxyCallback();
\r
386 run : function(el, args, duration, easing, cb, scope, type){
\r
387 var anim = createAnim(cb, scope), e = Ext.fly(el, '_animrun');
\r
389 for(var k in args){
\r
392 e.setStyle(k, args[k].from);
\r
395 switch(k){ // jquery doesn't support, so convert
\r
399 if(by = args.points.by){
\r
400 var xy = e.getXY();
\r
401 pts = e.translatePoints([xy[0]+by[0], xy[1]+by[1]]);
\r
403 pts = e.translatePoints(args.points.to);
\r
407 if(!parseInt(e.getStyle('left'), 10)){ // auto bug
\r
410 if(!parseInt(e.getStyle('top'), 10)){
\r
413 if(args.points.from){
\r
414 e.setXY(args.points.from);
\r
418 o.width = args.width.to;
\r
421 o.height = args.height.to;
\r
424 o.opacity = args.opacity.to;
\r
427 o.left = args.left.to;
\r
430 o.top = args.top.to;
\r
437 // TODO: find out about easing plug in?
\r
438 jQuery(el).animate(o, duration*1000, undefined, anim.proxyCallback);
\r
445 Ext.lib.Region = function(t, r, b, l) {
\r
454 Ext.lib.Region.prototype = {
\r
455 contains : function(region) {
\r
456 return ( region.left >= this.left &&
\r
457 region.right <= this.right &&
\r
458 region.top >= this.top &&
\r
459 region.bottom <= this.bottom );
\r
463 getArea : function() {
\r
464 return ( (this.bottom - this.top) * (this.right - this.left) );
\r
467 intersect : function(region) {
\r
468 var t = Math.max( this.top, region.top );
\r
469 var r = Math.min( this.right, region.right );
\r
470 var b = Math.min( this.bottom, region.bottom );
\r
471 var l = Math.max( this.left, region.left );
\r
473 if (b >= t && r >= l) {
\r
474 return new Ext.lib.Region(t, r, b, l);
\r
479 union : function(region) {
\r
480 var t = Math.min( this.top, region.top );
\r
481 var r = Math.max( this.right, region.right );
\r
482 var b = Math.max( this.bottom, region.bottom );
\r
483 var l = Math.min( this.left, region.left );
\r
485 return new Ext.lib.Region(t, r, b, l);
\r
488 constrainTo : function(r) {
\r
489 this.top = this.top.constrain(r.top, r.bottom);
\r
490 this.bottom = this.bottom.constrain(r.top, r.bottom);
\r
491 this.left = this.left.constrain(r.left, r.right);
\r
492 this.right = this.right.constrain(r.left, r.right);
\r
496 adjust : function(t, l, b, r){
\r
505 Ext.lib.Region.getRegion = function(el) {
\r
506 var p = Ext.lib.Dom.getXY(el);
\r
509 var r = p[0] + el.offsetWidth;
\r
510 var b = p[1] + el.offsetHeight;
\r
513 return new Ext.lib.Region(t, r, b, l);
\r
516 Ext.lib.Point = function(x, y) {
\r
517 if (Ext.isArray(x)) {
\r
521 this.x = this.right = this.left = this[0] = x;
\r
522 this.y = this.top = this.bottom = this[1] = y;
\r
525 Ext.lib.Point.prototype = new Ext.lib.Region();
\r
527 // prevent IE leaks
\r
529 function fnCleanUp() {
\r
530 var p = Function.prototype;
\r
531 delete p.createSequence;
\r
533 delete p.createDelegate;
\r
534 delete p.createCallback;
\r
535 delete p.createInterceptor;
\r
537 window.detachEvent("onunload", fnCleanUp);
\r
539 window.attachEvent("onunload", fnCleanUp);
\r