ext-all-debug.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:1167k
源码类别:

JavaScript

开发平台:

JavaScript

  1.             'exception'
  2.         );
  3.         Ext.direct.Provider.superclass.constructor.call(this, config);
  4.     },
  5.     
  6.     isConnected: function(){
  7.         return false;
  8.     },
  9.     
  10.     connect: Ext.emptyFn,
  11.     
  12.     
  13.     disconnect: Ext.emptyFn
  14. });
  15. Ext.direct.JsonProvider = Ext.extend(Ext.direct.Provider, {
  16.     parseResponse: function(xhr){
  17.         if(!Ext.isEmpty(xhr.responseText)){
  18.             if(typeof xhr.responseText == 'object'){
  19.                 return xhr.responseText;
  20.             }
  21.             return Ext.decode(xhr.responseText);
  22.         }
  23.         return null;
  24.     },
  25.     getEvents: function(xhr){
  26.         var data = null;
  27.         try{
  28.             data = this.parseResponse(xhr);
  29.         }catch(e){
  30.             var event = new Ext.Direct.ExceptionEvent({
  31.                 data: e,
  32.                 xhr: xhr,
  33.                 code: Ext.Direct.exceptions.PARSE,
  34.                 message: 'Error parsing json response: nn ' + data
  35.             })
  36.             return [event];
  37.         }
  38.         var events = [];
  39.         if(Ext.isArray(data)){
  40.             for(var i = 0, len = data.length; i < len; i++){
  41.                 events.push(Ext.Direct.createEvent(data[i]));
  42.             }
  43.         }else{
  44.             events.push(Ext.Direct.createEvent(data));
  45.         }
  46.         return events;
  47.     }
  48. });
  49. Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, {
  50.     
  51.     
  52.     priority: 3,
  53.     
  54.     
  55.     interval: 3000,
  56.     
  57.     
  58.     
  59.     
  60.     constructor : function(config){
  61.         Ext.direct.PollingProvider.superclass.constructor.call(this, config);
  62.         this.addEvents(
  63.             
  64.             'beforepoll',            
  65.             
  66.             'poll'
  67.         );
  68.     },
  69.     
  70.     isConnected: function(){
  71.         return !!this.pollTask;
  72.     },
  73.     
  74.     connect: function(){
  75.         if(this.url && !this.pollTask){
  76.             this.pollTask = Ext.TaskMgr.start({
  77.                 run: function(){
  78.                     if(this.fireEvent('beforepoll', this) !== false){
  79.                         if(typeof this.url == 'function'){
  80.                             this.url(this.baseParams);
  81.                         }else{
  82.                             Ext.Ajax.request({
  83.                                 url: this.url,
  84.                                 callback: this.onData,
  85.                                 scope: this,
  86.                                 params: this.baseParams
  87.                             });
  88.                         }
  89.                     }
  90.                 },
  91.                 interval: this.interval,
  92.                 scope: this
  93.             });
  94.             this.fireEvent('connect', this);
  95.         }else if(!this.url){
  96.             throw 'Error initializing PollingProvider, no url configured.';
  97.         }
  98.     },
  99.     
  100.     disconnect: function(){
  101.         if(this.pollTask){
  102.             Ext.TaskMgr.stop(this.pollTask);
  103.             delete this.pollTask;
  104.             this.fireEvent('disconnect', this);
  105.         }
  106.     },
  107.     
  108.     onData: function(opt, success, xhr){
  109.         if(success){
  110.             var events = this.getEvents(xhr);
  111.             for(var i = 0, len = events.length; i < len; i++){
  112.                 var e = events[i];
  113.                 this.fireEvent('data', this, e);
  114.             }
  115.         }else{
  116.             var e = new Ext.Direct.ExceptionEvent({
  117.                 data: e,
  118.                 code: Ext.Direct.exceptions.TRANSPORT,
  119.                 message: 'Unable to connect to the server.',
  120.                 xhr: xhr
  121.             });
  122.             this.fireEvent('data', this, e);
  123.         }
  124.     }
  125. });
  126. Ext.Direct.PROVIDERS['polling'] = Ext.direct.PollingProvider;
  127. Ext.direct.RemotingProvider = Ext.extend(Ext.direct.JsonProvider, {       
  128.     
  129.     
  130.     
  131.     
  132.     
  133.     
  134.     
  135.     
  136.     
  137.     enableBuffer: 10,
  138.     
  139.     
  140.     maxRetries: 1,
  141.     
  142.     
  143.     timeout: undefined,
  144.     constructor : function(config){
  145.         Ext.direct.RemotingProvider.superclass.constructor.call(this, config);
  146.         this.addEvents(
  147.                         
  148.             'beforecall',            
  149.                         
  150.             'call'
  151.         );
  152.         this.namespace = (Ext.isString(this.namespace)) ? Ext.ns(this.namespace) : this.namespace || window;
  153.         this.transactions = {};
  154.         this.callBuffer = [];
  155.     },
  156.     
  157.     initAPI : function(){
  158.         var o = this.actions;
  159.         for(var c in o){
  160.             var cls = this.namespace[c] || (this.namespace[c] = {}),
  161.                 ms = o[c];
  162.             for(var i = 0, len = ms.length; i < len; i++){
  163.                 var m = ms[i];
  164.                 cls[m.name] = this.createMethod(c, m);
  165.             }
  166.         }
  167.     },
  168.     
  169.     isConnected: function(){
  170.         return !!this.connected;
  171.     },
  172.     connect: function(){
  173.         if(this.url){
  174.             this.initAPI();
  175.             this.connected = true;
  176.             this.fireEvent('connect', this);
  177.         }else if(!this.url){
  178.             throw 'Error initializing RemotingProvider, no url configured.';
  179.         }
  180.     },
  181.     disconnect: function(){
  182.         if(this.connected){
  183.             this.connected = false;
  184.             this.fireEvent('disconnect', this);
  185.         }
  186.     },
  187.     onData: function(opt, success, xhr){
  188.         if(success){
  189.             var events = this.getEvents(xhr);
  190.             for(var i = 0, len = events.length; i < len; i++){
  191.                 var e = events[i],
  192.                     t = this.getTransaction(e);
  193.                 this.fireEvent('data', this, e);
  194.                 if(t){
  195.                     this.doCallback(t, e, true);
  196.                     Ext.Direct.removeTransaction(t);
  197.                 }
  198.             }
  199.         }else{
  200.             var ts = [].concat(opt.ts);
  201.             for(var i = 0, len = ts.length; i < len; i++){
  202.                 var t = this.getTransaction(ts[i]);
  203.                 if(t && t.retryCount < this.maxRetries){
  204.                     t.retry();
  205.                 }else{
  206.                     var e = new Ext.Direct.ExceptionEvent({
  207.                         data: e,
  208.                         transaction: t,
  209.                         code: Ext.Direct.exceptions.TRANSPORT,
  210.                         message: 'Unable to connect to the server.',
  211.                         xhr: xhr
  212.                     });
  213.                     this.fireEvent('data', this, e);
  214.                     if(t){
  215.                         this.doCallback(t, e, false);
  216.                         Ext.Direct.removeTransaction(t);
  217.                     }
  218.                 }
  219.             }
  220.         }
  221.     },
  222.     getCallData: function(t){
  223.         return {
  224.             action: t.action,
  225.             method: t.method,
  226.             data: t.data,
  227.             type: 'rpc',
  228.             tid: t.tid
  229.         };
  230.     },
  231.     doSend : function(data){
  232.         var o = {
  233.             url: this.url,
  234.             callback: this.onData,
  235.             scope: this,
  236.             ts: data,
  237.             timeout: this.timeout
  238.         }, callData;
  239.         if(Ext.isArray(data)){
  240.             callData = [];
  241.             for(var i = 0, len = data.length; i < len; i++){
  242.                 callData.push(this.getCallData(data[i]));
  243.             }
  244.         }else{
  245.             callData = this.getCallData(data);
  246.         }
  247.         if(this.enableUrlEncode){
  248.             var params = {};
  249.             params[Ext.isString(this.enableUrlEncode) ? this.enableUrlEncode : 'data'] = Ext.encode(callData);
  250.             o.params = params;
  251.         }else{
  252.             o.jsonData = callData;
  253.         }
  254.         Ext.Ajax.request(o);
  255.     },
  256.     combineAndSend : function(){
  257.         var len = this.callBuffer.length;
  258.         if(len > 0){
  259.             this.doSend(len == 1 ? this.callBuffer[0] : this.callBuffer);
  260.             this.callBuffer = [];
  261.         }
  262.     },
  263.     queueTransaction: function(t){
  264.         if(t.form){
  265.             this.processForm(t);
  266.             return;
  267.         }
  268.         this.callBuffer.push(t);
  269.         if(this.enableBuffer){
  270.             if(!this.callTask){
  271.                 this.callTask = new Ext.util.DelayedTask(this.combineAndSend, this);
  272.             }
  273.             this.callTask.delay(Ext.isNumber(this.enableBuffer) ? this.enableBuffer : 10);
  274.         }else{
  275.             this.combineAndSend();
  276.         }
  277.     },
  278.     doCall : function(c, m, args){
  279.         var data = null, hs = args[m.len], scope = args[m.len+1];
  280.         if(m.len !== 0){
  281.             data = args.slice(0, m.len);
  282.         }
  283.         var t = new Ext.Direct.Transaction({
  284.             provider: this,
  285.             args: args,
  286.             action: c,
  287.             method: m.name,
  288.             data: data,
  289.             cb: scope && Ext.isFunction(hs) ? hs.createDelegate(scope) : hs
  290.         });
  291.         if(this.fireEvent('beforecall', this, t) !== false){
  292.             Ext.Direct.addTransaction(t);
  293.             this.queueTransaction(t);
  294.             this.fireEvent('call', this, t);
  295.         }
  296.     },
  297.     doForm : function(c, m, form, callback, scope){
  298.         var t = new Ext.Direct.Transaction({
  299.             provider: this,
  300.             action: c,
  301.             method: m.name,
  302.             args:[form, callback, scope],
  303.             cb: scope && Ext.isFunction(callback) ? callback.createDelegate(scope) : callback,
  304.             isForm: true
  305.         });
  306.         if(this.fireEvent('beforecall', this, t) !== false){
  307.             Ext.Direct.addTransaction(t);
  308.             var isUpload = String(form.getAttribute("enctype")).toLowerCase() == 'multipart/form-data',
  309.                 params = {
  310.                     extTID: t.tid,
  311.                     extAction: c,
  312.                     extMethod: m.name,
  313.                     extType: 'rpc',
  314.                     extUpload: String(isUpload)
  315.                 };
  316.             
  317.             
  318.             
  319.             Ext.apply(t, {
  320.                 form: Ext.getDom(form),
  321.                 isUpload: isUpload,
  322.                 params: callback && Ext.isObject(callback.params) ? Ext.apply(params, callback.params) : params
  323.             });
  324.             this.fireEvent('call', this, t);
  325.             this.processForm(t);
  326.         }
  327.     },
  328.     
  329.     processForm: function(t){
  330.         Ext.Ajax.request({
  331.             url: this.url,
  332.             params: t.params,
  333.             callback: this.onData,
  334.             scope: this,
  335.             form: t.form,
  336.             isUpload: t.isUpload,
  337.             ts: t
  338.         });
  339.     },
  340.     createMethod : function(c, m){
  341.         var f;
  342.         if(!m.formHandler){
  343.             f = function(){
  344.                 this.doCall(c, m, Array.prototype.slice.call(arguments, 0));
  345.             }.createDelegate(this);
  346.         }else{
  347.             f = function(form, callback, scope){
  348.                 this.doForm(c, m, form, callback, scope);
  349.             }.createDelegate(this);
  350.         }
  351.         f.directCfg = {
  352.             action: c,
  353.             method: m
  354.         };
  355.         return f;
  356.     },
  357.     getTransaction: function(opt){
  358.         return opt && opt.tid ? Ext.Direct.getTransaction(opt.tid) : null;
  359.     },
  360.     doCallback: function(t, e){
  361.         var fn = e.status ? 'success' : 'failure';
  362.         if(t && t.cb){
  363.             var hs = t.cb,
  364.                 result = Ext.isDefined(e.result) ? e.result : e.data;
  365.             if(Ext.isFunction(hs)){
  366.                 hs(result, e);
  367.             } else{
  368.                 Ext.callback(hs[fn], hs.scope, [result, e]);
  369.                 Ext.callback(hs.callback, hs.scope, [result, e]);
  370.             }
  371.         }
  372.     }
  373. });
  374. Ext.Direct.PROVIDERS['remoting'] = Ext.direct.RemotingProvider;
  375. Ext.Resizable = function(el, config){
  376.     this.el = Ext.get(el);
  377.     
  378.     if(config && config.wrap){
  379.         config.resizeChild = this.el;
  380.         this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : {cls:'xresizable-wrap'});
  381.         this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap';
  382.         this.el.setStyle('overflow', 'hidden');
  383.         this.el.setPositioning(config.resizeChild.getPositioning());
  384.         config.resizeChild.clearPositioning();
  385.         if(!config.width || !config.height){
  386.             var csize = config.resizeChild.getSize();
  387.             this.el.setSize(csize.width, csize.height);
  388.         }
  389.         if(config.pinned && !config.adjustments){
  390.             config.adjustments = 'auto';
  391.         }
  392.     }
  393.     
  394.     this.proxy = this.el.createProxy({tag: 'div', cls: 'x-resizable-proxy', id: this.el.id + '-rzproxy'}, Ext.getBody());
  395.     this.proxy.unselectable();
  396.     this.proxy.enableDisplayMode('block');
  397.     Ext.apply(this, config);
  398.     
  399.     if(this.pinned){
  400.         this.disableTrackOver = true;
  401.         this.el.addClass('x-resizable-pinned');
  402.     }
  403.     
  404.     var position = this.el.getStyle('position');
  405.     if(position != 'absolute' && position != 'fixed'){
  406.         this.el.setStyle('position', 'relative');
  407.     }
  408.     if(!this.handles){ 
  409.         this.handles = 's,e,se';
  410.         if(this.multiDirectional){
  411.             this.handles += ',n,w';
  412.         }
  413.     }
  414.     if(this.handles == 'all'){
  415.         this.handles = 'n s e w ne nw se sw';
  416.     }
  417.     var hs = this.handles.split(/s*?[,;]s*?| /);
  418.     var ps = Ext.Resizable.positions;
  419.     for(var i = 0, len = hs.length; i < len; i++){
  420.         if(hs[i] && ps[hs[i]]){
  421.             var pos = ps[hs[i]];
  422.             this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent);
  423.         }
  424.     }
  425.     
  426.     this.corner = this.southeast;
  427.     
  428.     if(this.handles.indexOf('n') != -1 || this.handles.indexOf('w') != -1){
  429.         this.updateBox = true;
  430.     }   
  431.    
  432.     this.activeHandle = null;
  433.     
  434.     if(this.resizeChild){
  435.         if(typeof this.resizeChild == 'boolean'){
  436.             this.resizeChild = Ext.get(this.el.dom.firstChild, true);
  437.         }else{
  438.             this.resizeChild = Ext.get(this.resizeChild, true);
  439.         }
  440.     }
  441.     
  442.     if(this.adjustments == 'auto'){
  443.         var rc = this.resizeChild;
  444.         var hw = this.west, he = this.east, hn = this.north, hs = this.south;
  445.         if(rc && (hw || hn)){
  446.             rc.position('relative');
  447.             rc.setLeft(hw ? hw.el.getWidth() : 0);
  448.             rc.setTop(hn ? hn.el.getHeight() : 0);
  449.         }
  450.         this.adjustments = [
  451.             (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),
  452.             (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 
  453.         ];
  454.     }
  455.     
  456.     if(this.draggable){
  457.         this.dd = this.dynamic ? 
  458.             this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});
  459.         this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);
  460.         if(this.constrainTo){
  461.             this.dd.constrainTo(this.constrainTo);
  462.         }
  463.     }
  464.     
  465.     this.addEvents(
  466.         
  467.         'beforeresize',
  468.         
  469.         'resize'
  470.     );
  471.     
  472.     if(this.width !== null && this.height !== null){
  473.         this.resizeTo(this.width, this.height);
  474.     }else{
  475.         this.updateChildSize();
  476.     }
  477.     if(Ext.isIE){
  478.         this.el.dom.style.zoom = 1;
  479.     }
  480.     Ext.Resizable.superclass.constructor.call(this);
  481. };
  482. Ext.extend(Ext.Resizable, Ext.util.Observable, {
  483.     
  484.     adjustments : [0, 0],
  485.     
  486.     animate : false,
  487.     
  488.     
  489.     disableTrackOver : false,
  490.     
  491.     draggable: false,
  492.     
  493.     duration : 0.35,
  494.     
  495.     dynamic : false,
  496.     
  497.     easing : 'easeOutStrong',
  498.     
  499.     enabled : true,
  500.     
  501.     
  502.     handles : false,
  503.     
  504.     multiDirectional : false,
  505.     
  506.     height : null,
  507.     
  508.     width : null,
  509.     
  510.     heightIncrement : 0,
  511.     
  512.     widthIncrement : 0,
  513.     
  514.     minHeight : 5,
  515.     
  516.     minWidth : 5,
  517.     
  518.     maxHeight : 10000,
  519.     
  520.     maxWidth : 10000,
  521.     
  522.     minX: 0,
  523.     
  524.     minY: 0,
  525.     
  526.     pinned : false,
  527.     
  528.     preserveRatio : false,
  529.      
  530.     resizeChild : false,
  531.     
  532.     transparent: false,
  533.     
  534.     
  535.     
  536.     
  537.     resizeTo : function(width, height){
  538.         this.el.setSize(width, height);
  539.         this.updateChildSize();
  540.         this.fireEvent('resize', this, width, height, null);
  541.     },
  542.     
  543.     startSizing : function(e, handle){
  544.         this.fireEvent('beforeresize', this, e);
  545.         if(this.enabled){ 
  546.             if(!this.overlay){
  547.                 this.overlay = this.el.createProxy({tag: 'div', cls: 'x-resizable-overlay', html: '&#160;'}, Ext.getBody());
  548.                 this.overlay.unselectable();
  549.                 this.overlay.enableDisplayMode('block');
  550.                 this.overlay.on({
  551.                     scope: this,
  552.                     mousemove: this.onMouseMove,
  553.                     mouseup: this.onMouseUp
  554.                 });
  555.             }
  556.             this.overlay.setStyle('cursor', handle.el.getStyle('cursor'));
  557.             this.resizing = true;
  558.             this.startBox = this.el.getBox();
  559.             this.startPoint = e.getXY();
  560.             this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],
  561.                             (this.startBox.y + this.startBox.height) - this.startPoint[1]];
  562.             this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
  563.             this.overlay.show();
  564.             if(this.constrainTo) {
  565.                 var ct = Ext.get(this.constrainTo);
  566.                 this.resizeRegion = ct.getRegion().adjust(
  567.                     ct.getFrameWidth('t'),
  568.                     ct.getFrameWidth('l'),
  569.                     -ct.getFrameWidth('b'),
  570.                     -ct.getFrameWidth('r')
  571.                 );
  572.             }
  573.             this.proxy.setStyle('visibility', 'hidden'); 
  574.             this.proxy.show();
  575.             this.proxy.setBox(this.startBox);
  576.             if(!this.dynamic){
  577.                 this.proxy.setStyle('visibility', 'visible');
  578.             }
  579.         }
  580.     },
  581.     
  582.     onMouseDown : function(handle, e){
  583.         if(this.enabled){
  584.             e.stopEvent();
  585.             this.activeHandle = handle;
  586.             this.startSizing(e, handle);
  587.         }          
  588.     },
  589.     
  590.     onMouseUp : function(e){
  591.         this.activeHandle = null;
  592.         var size = this.resizeElement();
  593.         this.resizing = false;
  594.         this.handleOut();
  595.         this.overlay.hide();
  596.         this.proxy.hide();
  597.         this.fireEvent('resize', this, size.width, size.height, e);
  598.     },
  599.     
  600.     updateChildSize : function(){
  601.         if(this.resizeChild){
  602.             var el = this.el;
  603.             var child = this.resizeChild;
  604.             var adj = this.adjustments;
  605.             if(el.dom.offsetWidth){
  606.                 var b = el.getSize(true);
  607.                 child.setSize(b.width+adj[0], b.height+adj[1]);
  608.             }
  609.             
  610.             
  611.             
  612.             
  613.             if(Ext.isIE){
  614.                 setTimeout(function(){
  615.                     if(el.dom.offsetWidth){
  616.                         var b = el.getSize(true);
  617.                         child.setSize(b.width+adj[0], b.height+adj[1]);
  618.                     }
  619.                 }, 10);
  620.             }
  621.         }
  622.     },
  623.     
  624.     snap : function(value, inc, min){
  625.         if(!inc || !value){
  626.             return value;
  627.         }
  628.         var newValue = value;
  629.         var m = value % inc;
  630.         if(m > 0){
  631.             if(m > (inc/2)){
  632.                 newValue = value + (inc-m);
  633.             }else{
  634.                 newValue = value - m;
  635.             }
  636.         }
  637.         return Math.max(min, newValue);
  638.     },
  639.     
  640.     resizeElement : function(){
  641.         var box = this.proxy.getBox();
  642.         if(this.updateBox){
  643.             this.el.setBox(box, false, this.animate, this.duration, null, this.easing);
  644.         }else{
  645.             this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);
  646.         }
  647.         this.updateChildSize();
  648.         if(!this.dynamic){
  649.             this.proxy.hide();
  650.         }
  651.         if(this.draggable && this.constrainTo){
  652.             this.dd.resetConstraints();
  653.             this.dd.constrainTo(this.constrainTo);
  654.         }
  655.         return box;
  656.     },
  657.     
  658.     constrain : function(v, diff, m, mx){
  659.         if(v - diff < m){
  660.             diff = v - m;    
  661.         }else if(v - diff > mx){
  662.             diff = v - mx; 
  663.         }
  664.         return diff;                
  665.     },
  666.     
  667.     onMouseMove : function(e){
  668.         if(this.enabled && this.activeHandle){
  669.             try{
  670.             if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) {
  671.                 return;
  672.             }
  673.             
  674.             var curSize = this.curSize || this.startBox,
  675.                 x = this.startBox.x, y = this.startBox.y,
  676.                 ox = x, 
  677.                 oy = y,
  678.                 w = curSize.width, 
  679.                 h = curSize.height,
  680.                 ow = w, 
  681.                 oh = h,
  682.                 mw = this.minWidth, 
  683.                 mh = this.minHeight,
  684.                 mxw = this.maxWidth, 
  685.                 mxh = this.maxHeight,
  686.                 wi = this.widthIncrement,
  687.                 hi = this.heightIncrement,
  688.                 eventXY = e.getXY(),
  689.                 diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])),
  690.                 diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])),
  691.                 pos = this.activeHandle.position,
  692.                 tw,
  693.                 th;
  694.             
  695.             switch(pos){
  696.                 case 'east':
  697.                     w += diffX; 
  698.                     w = Math.min(Math.max(mw, w), mxw);
  699.                     break;
  700.                 case 'south':
  701.                     h += diffY;
  702.                     h = Math.min(Math.max(mh, h), mxh);
  703.                     break;
  704.                 case 'southeast':
  705.                     w += diffX; 
  706.                     h += diffY;
  707.                     w = Math.min(Math.max(mw, w), mxw);
  708.                     h = Math.min(Math.max(mh, h), mxh);
  709.                     break;
  710.                 case 'north':
  711.                     diffY = this.constrain(h, diffY, mh, mxh);
  712.                     y += diffY;
  713.                     h -= diffY;
  714.                     break;
  715.                 case 'west':
  716.                     diffX = this.constrain(w, diffX, mw, mxw);
  717.                     x += diffX;
  718.                     w -= diffX;
  719.                     break;
  720.                 case 'northeast':
  721.                     w += diffX; 
  722.                     w = Math.min(Math.max(mw, w), mxw);
  723.                     diffY = this.constrain(h, diffY, mh, mxh);
  724.                     y += diffY;
  725.                     h -= diffY;
  726.                     break;
  727.                 case 'northwest':
  728.                     diffX = this.constrain(w, diffX, mw, mxw);
  729.                     diffY = this.constrain(h, diffY, mh, mxh);
  730.                     y += diffY;
  731.                     h -= diffY;
  732.                     x += diffX;
  733.                     w -= diffX;
  734.                     break;
  735.                case 'southwest':
  736.                     diffX = this.constrain(w, diffX, mw, mxw);
  737.                     h += diffY;
  738.                     h = Math.min(Math.max(mh, h), mxh);
  739.                     x += diffX;
  740.                     w -= diffX;
  741.                     break;
  742.             }
  743.             
  744.             var sw = this.snap(w, wi, mw);
  745.             var sh = this.snap(h, hi, mh);
  746.             if(sw != w || sh != h){
  747.                 switch(pos){
  748.                     case 'northeast':
  749.                         y -= sh - h;
  750.                     break;
  751.                     case 'north':
  752.                         y -= sh - h;
  753.                         break;
  754.                     case 'southwest':
  755.                         x -= sw - w;
  756.                     break;
  757.                     case 'west':
  758.                         x -= sw - w;
  759.                         break;
  760.                     case 'northwest':
  761.                         x -= sw - w;
  762.                         y -= sh - h;
  763.                     break;
  764.                 }
  765.                 w = sw;
  766.                 h = sh;
  767.             }
  768.             
  769.             if(this.preserveRatio){
  770.                 switch(pos){
  771.                     case 'southeast':
  772.                     case 'east':
  773.                         h = oh * (w/ow);
  774.                         h = Math.min(Math.max(mh, h), mxh);
  775.                         w = ow * (h/oh);
  776.                        break;
  777.                     case 'south':
  778.                         w = ow * (h/oh);
  779.                         w = Math.min(Math.max(mw, w), mxw);
  780.                         h = oh * (w/ow);
  781.                         break;
  782.                     case 'northeast':
  783.                         w = ow * (h/oh);
  784.                         w = Math.min(Math.max(mw, w), mxw);
  785.                         h = oh * (w/ow);
  786.                     break;
  787.                     case 'north':
  788.                         tw = w;
  789.                         w = ow * (h/oh);
  790.                         w = Math.min(Math.max(mw, w), mxw);
  791.                         h = oh * (w/ow);
  792.                         x += (tw - w) / 2;
  793.                         break;
  794.                     case 'southwest':
  795.                         h = oh * (w/ow);
  796.                         h = Math.min(Math.max(mh, h), mxh);
  797.                         tw = w;
  798.                         w = ow * (h/oh);
  799.                         x += tw - w;
  800.                         break;
  801.                     case 'west':
  802.                         th = h;
  803.                         h = oh * (w/ow);
  804.                         h = Math.min(Math.max(mh, h), mxh);
  805.                         y += (th - h) / 2;
  806.                         tw = w;
  807.                         w = ow * (h/oh);
  808.                         x += tw - w;
  809.                        break;
  810.                     case 'northwest':
  811.                         tw = w;
  812.                         th = h;
  813.                         h = oh * (w/ow);
  814.                         h = Math.min(Math.max(mh, h), mxh);
  815.                         w = ow * (h/oh);
  816.                         y += th - h;
  817.                         x += tw - w;
  818.                         break;
  819.                         
  820.                 }
  821.             }
  822.             this.proxy.setBounds(x, y, w, h);
  823.             if(this.dynamic){
  824.                 this.resizeElement();
  825.             }
  826.             }catch(ex){}
  827.         }
  828.     },
  829.     
  830.     handleOver : function(){
  831.         if(this.enabled){
  832.             this.el.addClass('x-resizable-over');
  833.         }
  834.     },
  835.     
  836.     handleOut : function(){
  837.         if(!this.resizing){
  838.             this.el.removeClass('x-resizable-over');
  839.         }
  840.     },
  841.     
  842.     
  843.     getEl : function(){
  844.         return this.el;
  845.     },
  846.     
  847.     
  848.     getResizeChild : function(){
  849.         return this.resizeChild;
  850.     },
  851.     
  852.     
  853.     destroy : function(removeEl){
  854.         Ext.destroy(this.dd, this.overlay, this.proxy);
  855.         this.overlay = null;
  856.         this.proxy = null;
  857.         
  858.         var ps = Ext.Resizable.positions;
  859.         for(var k in ps){
  860.             if(typeof ps[k] != 'function' && this[ps[k]]){
  861.                 this[ps[k]].destroy();
  862.             }
  863.         }
  864.         if(removeEl){
  865.             this.el.update('');
  866.             Ext.destroy(this.el);
  867.             this.el = null;
  868.         }
  869.         this.purgeListeners();
  870.     },
  871.     syncHandleHeight : function(){
  872.         var h = this.el.getHeight(true);
  873.         if(this.west){
  874.             this.west.el.setHeight(h);
  875.         }
  876.         if(this.east){
  877.             this.east.el.setHeight(h);
  878.         }
  879.     }
  880. });
  881. Ext.Resizable.positions = {
  882.     n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast'
  883. };
  884. Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){
  885.     if(!this.tpl){
  886.         
  887.         var tpl = Ext.DomHelper.createTemplate(
  888.             {tag: 'div', cls: 'x-resizable-handle x-resizable-handle-{0}'}
  889.         );
  890.         tpl.compile();
  891.         Ext.Resizable.Handle.prototype.tpl = tpl;
  892.     }
  893.     this.position = pos;
  894.     this.rz = rz;
  895.     this.el = this.tpl.append(rz.el.dom, [this.position], true);
  896.     this.el.unselectable();
  897.     if(transparent){
  898.         this.el.setOpacity(0);
  899.     }
  900.     this.el.on('mousedown', this.onMouseDown, this);
  901.     if(!disableTrackOver){
  902.         this.el.on({
  903.             scope: this,
  904.             mouseover: this.onMouseOver,
  905.             mouseout: this.onMouseOut
  906.         });
  907.     }
  908. };
  909. Ext.Resizable.Handle.prototype = {
  910.     
  911.     afterResize : function(rz){
  912.         
  913.     },
  914.     
  915.     onMouseDown : function(e){
  916.         this.rz.onMouseDown(this, e);
  917.     },
  918.     
  919.     onMouseOver : function(e){
  920.         this.rz.handleOver(this, e);
  921.     },
  922.     
  923.     onMouseOut : function(e){
  924.         this.rz.handleOut(this, e);
  925.     },
  926.     
  927.     destroy : function(){
  928.         Ext.destroy(this.el);
  929.         this.el = null;
  930.     }
  931. };
  932. Ext.Window = Ext.extend(Ext.Panel, {
  933.     
  934.     
  935.     
  936.     
  937.     
  938.     
  939.     
  940.     
  941.     
  942.     
  943.     
  944.     baseCls : 'x-window',
  945.     
  946.     resizable : true,
  947.     
  948.     draggable : true,
  949.     
  950.     closable : true,
  951.     
  952.     closeAction : 'close',
  953.     
  954.     constrain : false,
  955.     
  956.     constrainHeader : false,
  957.     
  958.     plain : false,
  959.     
  960.     minimizable : false,
  961.     
  962.     maximizable : false,
  963.     
  964.     minHeight : 100,
  965.     
  966.     minWidth : 200,
  967.     
  968.     expandOnShow : true,
  969.     
  970.     collapsible : false,
  971.     
  972.     initHidden : undefined,
  973.     
  974.     hidden : true,
  975.     
  976.     monitorResize : true,
  977.     
  978.     
  979.     
  980.     
  981.     
  982.     elements : 'header,body',
  983.     
  984.     frame : true,
  985.     
  986.     floating : true,
  987.     
  988.     initComponent : function(){
  989.         this.initTools();
  990.         Ext.Window.superclass.initComponent.call(this);
  991.         this.addEvents(
  992.             
  993.             
  994.             
  995.             'resize',
  996.             
  997.             'maximize',
  998.             
  999.             'minimize',
  1000.             
  1001.             'restore'
  1002.         );
  1003.         
  1004.         if(Ext.isDefined(this.initHidden)){
  1005.             this.hidden = this.initHidden;
  1006.         }
  1007.         if(this.hidden === false){
  1008.             this.hidden = true;
  1009.             this.show();
  1010.         }
  1011.     },
  1012.     
  1013.     getState : function(){
  1014.         return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox(true));
  1015.     },
  1016.     
  1017.     onRender : function(ct, position){
  1018.         Ext.Window.superclass.onRender.call(this, ct, position);
  1019.         if(this.plain){
  1020.             this.el.addClass('x-window-plain');
  1021.         }
  1022.         
  1023.         this.focusEl = this.el.createChild({
  1024.                     tag: 'a', href:'#', cls:'x-dlg-focus',
  1025.                     tabIndex:'-1', html: '&#160;'});
  1026.         this.focusEl.swallowEvent('click', true);
  1027.         this.proxy = this.el.createProxy('x-window-proxy');
  1028.         this.proxy.enableDisplayMode('block');
  1029.         if(this.modal){
  1030.             this.mask = this.container.createChild({cls:'ext-el-mask'}, this.el.dom);
  1031.             this.mask.enableDisplayMode('block');
  1032.             this.mask.hide();
  1033.             this.mon(this.mask, 'click', this.focus, this);
  1034.         }
  1035.         if(this.maximizable){
  1036.             this.mon(this.header, 'dblclick', this.toggleMaximize, this);
  1037.         }
  1038.     },
  1039.     
  1040.     initEvents : function(){
  1041.         Ext.Window.superclass.initEvents.call(this);
  1042.         if(this.animateTarget){
  1043.             this.setAnimateTarget(this.animateTarget);
  1044.         }
  1045.         if(this.resizable){
  1046.             this.resizer = new Ext.Resizable(this.el, {
  1047.                 minWidth: this.minWidth,
  1048.                 minHeight:this.minHeight,
  1049.                 handles: this.resizeHandles || 'all',
  1050.                 pinned: true,
  1051.                 resizeElement : this.resizerAction
  1052.             });
  1053.             this.resizer.window = this;
  1054.             this.mon(this.resizer, 'beforeresize', this.beforeResize, this);
  1055.         }
  1056.         if(this.draggable){
  1057.             this.header.addClass('x-window-draggable');
  1058.         }
  1059.         this.mon(this.el, 'mousedown', this.toFront, this);
  1060.         this.manager = this.manager || Ext.WindowMgr;
  1061.         this.manager.register(this);
  1062.         if(this.maximized){
  1063.             this.maximized = false;
  1064.             this.maximize();
  1065.         }
  1066.         if(this.closable){
  1067.             var km = this.getKeyMap();
  1068.             km.on(27, this.onEsc, this);
  1069.             km.disable();
  1070.         }
  1071.     },
  1072.     initDraggable : function(){
  1073.         
  1074.         this.dd = new Ext.Window.DD(this);
  1075.     },
  1076.    
  1077.     onEsc : function(){
  1078.         this[this.closeAction]();
  1079.     },
  1080.     
  1081.     beforeDestroy : function(){
  1082.         if (this.rendered){
  1083.             this.hide();
  1084.           if(this.doAnchor){
  1085.                 Ext.EventManager.removeResizeListener(this.doAnchor, this);
  1086.               Ext.EventManager.un(window, 'scroll', this.doAnchor, this);
  1087.             }
  1088.             Ext.destroy(
  1089.                 this.focusEl,
  1090.                 this.resizer,
  1091.                 this.dd,
  1092.                 this.proxy,
  1093.                 this.mask
  1094.             );
  1095.         }
  1096.         Ext.Window.superclass.beforeDestroy.call(this);
  1097.     },
  1098.     
  1099.     onDestroy : function(){
  1100.         if(this.manager){
  1101.             this.manager.unregister(this);
  1102.         }
  1103.         Ext.Window.superclass.onDestroy.call(this);
  1104.     },
  1105.     
  1106.     initTools : function(){
  1107.         if(this.minimizable){
  1108.             this.addTool({
  1109.                 id: 'minimize',
  1110.                 handler: this.minimize.createDelegate(this, [])
  1111.             });
  1112.         }
  1113.         if(this.maximizable){
  1114.             this.addTool({
  1115.                 id: 'maximize',
  1116.                 handler: this.maximize.createDelegate(this, [])
  1117.             });
  1118.             this.addTool({
  1119.                 id: 'restore',
  1120.                 handler: this.restore.createDelegate(this, []),
  1121.                 hidden:true
  1122.             });
  1123.         }
  1124.         if(this.closable){
  1125.             this.addTool({
  1126.                 id: 'close',
  1127.                 handler: this[this.closeAction].createDelegate(this, [])
  1128.             });
  1129.         }
  1130.     },
  1131.     
  1132.     resizerAction : function(){
  1133.         var box = this.proxy.getBox();
  1134.         this.proxy.hide();
  1135.         this.window.handleResize(box);
  1136.         return box;
  1137.     },
  1138.     
  1139.     beforeResize : function(){
  1140.         this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); 
  1141.         this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
  1142.         this.resizeBox = this.el.getBox();
  1143.     },
  1144.     
  1145.     updateHandles : function(){
  1146.         if(Ext.isIE && this.resizer){
  1147.             this.resizer.syncHandleHeight();
  1148.             this.el.repaint();
  1149.         }
  1150.     },
  1151.     
  1152.     handleResize : function(box){
  1153.         var rz = this.resizeBox;
  1154.         if(rz.x != box.x || rz.y != box.y){
  1155.             this.updateBox(box);
  1156.         }else{
  1157.             this.setSize(box);
  1158.         }
  1159.         this.focus();
  1160.         this.updateHandles();
  1161.         this.saveState();
  1162.     },
  1163.     
  1164.     focus : function(){
  1165.         var f = this.focusEl, db = this.defaultButton, t = typeof db;
  1166.         if(Ext.isDefined(db)){
  1167.             if(Ext.isNumber(db) && this.fbar){
  1168.                 f = this.fbar.items.get(db);
  1169.             }else if(Ext.isString(db)){
  1170.                 f = Ext.getCmp(db);
  1171.             }else{
  1172.                 f = db;
  1173.             }
  1174.         }
  1175.         f = f || this.focusEl;
  1176.         f.focus.defer(10, f);
  1177.     },
  1178.     
  1179.     setAnimateTarget : function(el){
  1180.         el = Ext.get(el);
  1181.         this.animateTarget = el;
  1182.     },
  1183.     
  1184.     beforeShow : function(){
  1185.         delete this.el.lastXY;
  1186.         delete this.el.lastLT;
  1187.         if(this.x === undefined || this.y === undefined){
  1188.             var xy = this.el.getAlignToXY(this.container, 'c-c');
  1189.             var pos = this.el.translatePoints(xy[0], xy[1]);
  1190.             this.x = this.x === undefined? pos.left : this.x;
  1191.             this.y = this.y === undefined? pos.top : this.y;
  1192.         }
  1193.         this.el.setLeftTop(this.x, this.y);
  1194.         if(this.expandOnShow){
  1195.             this.expand(false);
  1196.         }
  1197.         if(this.modal){
  1198.             Ext.getBody().addClass('x-body-masked');
  1199.             this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
  1200.             this.mask.show();
  1201.         }
  1202.     },
  1203.     
  1204.     show : function(animateTarget, cb, scope){
  1205.         if(!this.rendered){
  1206.             this.render(Ext.getBody());
  1207.         }
  1208.         if(this.hidden === false){
  1209.             this.toFront();
  1210.             return this;
  1211.         }
  1212.         if(this.fireEvent('beforeshow', this) === false){
  1213.             return this;
  1214.         }
  1215.         if(cb){
  1216.             this.on('show', cb, scope, {single:true});
  1217.         }
  1218.         this.hidden = false;
  1219.         if(Ext.isDefined(animateTarget)){
  1220.             this.setAnimateTarget(animateTarget);
  1221.         }
  1222.         this.beforeShow();
  1223.         if(this.animateTarget){
  1224.             this.animShow();
  1225.         }else{
  1226.             this.afterShow();
  1227.         }
  1228.         return this;
  1229.     },
  1230.     
  1231.     afterShow : function(isAnim){
  1232.         this.proxy.hide();
  1233.         this.el.setStyle('display', 'block');
  1234.         this.el.show();
  1235.         if(this.maximized){
  1236.             this.fitContainer();
  1237.         }
  1238.         if(Ext.isMac && Ext.isGecko2){ 
  1239.             this.cascade(this.setAutoScroll);
  1240.         }
  1241.         if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
  1242.             Ext.EventManager.onWindowResize(this.onWindowResize, this);
  1243.         }
  1244.         this.doConstrain();
  1245.         this.doLayout();
  1246.         if(this.keyMap){
  1247.             this.keyMap.enable();
  1248.         }
  1249.         this.toFront();
  1250.         this.updateHandles();
  1251.         if(isAnim && (Ext.isIE || Ext.isWebKit)){
  1252.             var sz = this.getSize();
  1253.             this.onResize(sz.width, sz.height);
  1254.         }
  1255.         this.onShow();
  1256.         this.fireEvent('show', this);
  1257.     },
  1258.     
  1259.     animShow : function(){
  1260.         this.proxy.show();
  1261.         this.proxy.setBox(this.animateTarget.getBox());
  1262.         this.proxy.setOpacity(0);
  1263.         var b = this.getBox();
  1264.         this.el.setStyle('display', 'none');
  1265.         this.proxy.shift(Ext.apply(b, {
  1266.             callback: this.afterShow.createDelegate(this, [true], false),
  1267.             scope: this,
  1268.             easing: 'easeNone',
  1269.             duration: 0.25,
  1270.             opacity: 0.5
  1271.         }));
  1272.     },
  1273.     
  1274.     hide : function(animateTarget, cb, scope){
  1275.         if(this.hidden || this.fireEvent('beforehide', this) === false){
  1276.             return this;
  1277.         }
  1278.         if(cb){
  1279.             this.on('hide', cb, scope, {single:true});
  1280.         }
  1281.         this.hidden = true;
  1282.         if(animateTarget !== undefined){
  1283.             this.setAnimateTarget(animateTarget);
  1284.         }
  1285.         if(this.modal){
  1286.             this.mask.hide();
  1287.             Ext.getBody().removeClass('x-body-masked');
  1288.         }
  1289.         if(this.animateTarget){
  1290.             this.animHide();
  1291.         }else{
  1292.             this.el.hide();
  1293.             this.afterHide();
  1294.         }
  1295.         return this;
  1296.     },
  1297.     
  1298.     afterHide : function(){
  1299.         this.proxy.hide();
  1300.         if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
  1301.             Ext.EventManager.removeResizeListener(this.onWindowResize, this);
  1302.         }
  1303.         if(this.keyMap){
  1304.             this.keyMap.disable();
  1305.         }
  1306.         this.onHide();
  1307.         this.fireEvent('hide', this);
  1308.     },
  1309.     
  1310.     animHide : function(){
  1311.         this.proxy.setOpacity(0.5);
  1312.         this.proxy.show();
  1313.         var tb = this.getBox(false);
  1314.         this.proxy.setBox(tb);
  1315.         this.el.hide();
  1316.         this.proxy.shift(Ext.apply(this.animateTarget.getBox(), {
  1317.             callback: this.afterHide,
  1318.             scope: this,
  1319.             duration: 0.25,
  1320.             easing: 'easeNone',
  1321.             opacity: 0
  1322.         }));
  1323.     },
  1324.     
  1325.     onShow : Ext.emptyFn,
  1326.     
  1327.     onHide : Ext.emptyFn,
  1328.     
  1329.     onWindowResize : function(){
  1330.         if(this.maximized){
  1331.             this.fitContainer();
  1332.         }
  1333.         if(this.modal){
  1334.             this.mask.setSize('100%', '100%');
  1335.             var force = this.mask.dom.offsetHeight;
  1336.             this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
  1337.         }
  1338.         this.doConstrain();
  1339.     },
  1340.     
  1341.     doConstrain : function(){
  1342.         if(this.constrain || this.constrainHeader){
  1343.             var offsets;
  1344.             if(this.constrain){
  1345.                 offsets = {
  1346.                     right:this.el.shadowOffset,
  1347.                     left:this.el.shadowOffset,
  1348.                     bottom:this.el.shadowOffset
  1349.                 };
  1350.             }else {
  1351.                 var s = this.getSize();
  1352.                 offsets = {
  1353.                     right:-(s.width - 100),
  1354.                     bottom:-(s.height - 25)
  1355.                 };
  1356.             }
  1357.             var xy = this.el.getConstrainToXY(this.container, true, offsets);
  1358.             if(xy){
  1359.                 this.setPosition(xy[0], xy[1]);
  1360.             }
  1361.         }
  1362.     },
  1363.     
  1364.     ghost : function(cls){
  1365.         var ghost = this.createGhost(cls);
  1366.         var box = this.getBox(true);
  1367.         ghost.setLeftTop(box.x, box.y);
  1368.         ghost.setWidth(box.width);
  1369.         this.el.hide();
  1370.         this.activeGhost = ghost;
  1371.         return ghost;
  1372.     },
  1373.     
  1374.     unghost : function(show, matchPosition){
  1375.         if(!this.activeGhost) {
  1376.             return;
  1377.         }
  1378.         if(show !== false){
  1379.             this.el.show();
  1380.             this.focus();
  1381.             if(Ext.isMac && Ext.isGecko2){ 
  1382.                 this.cascade(this.setAutoScroll);
  1383.             }
  1384.         }
  1385.         if(matchPosition !== false){
  1386.             this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));
  1387.         }
  1388.         this.activeGhost.hide();
  1389.         this.activeGhost.remove();
  1390.         delete this.activeGhost;
  1391.     },
  1392.     
  1393.     minimize : function(){
  1394.         this.fireEvent('minimize', this);
  1395.         return this;
  1396.     },
  1397.     
  1398.     close : function(){
  1399.         if(this.fireEvent('beforeclose', this) !== false){
  1400.             if(this.hidden){
  1401.                 this.doClose();
  1402.             }else{
  1403.                 this.hide(null, this.doClose, this);
  1404.             }
  1405.         }
  1406.     },
  1407.     
  1408.     doClose : function(){
  1409.         this.fireEvent('close', this);
  1410.         this.destroy();
  1411.     },
  1412.     
  1413.     maximize : function(){
  1414.         if(!this.maximized){
  1415.             this.expand(false);
  1416.             this.restoreSize = this.getSize();
  1417.             this.restorePos = this.getPosition(true);
  1418.             if (this.maximizable){
  1419.                 this.tools.maximize.hide();
  1420.                 this.tools.restore.show();
  1421.             }
  1422.             this.maximized = true;
  1423.             this.el.disableShadow();
  1424.             if(this.dd){
  1425.                 this.dd.lock();
  1426.             }
  1427.             if(this.collapsible){
  1428.                 this.tools.toggle.hide();
  1429.             }
  1430.             this.el.addClass('x-window-maximized');
  1431.             this.container.addClass('x-window-maximized-ct');
  1432.             this.setPosition(0, 0);
  1433.             this.fitContainer();
  1434.             this.fireEvent('maximize', this);
  1435.         }
  1436.         return this;
  1437.     },
  1438.     
  1439.     restore : function(){
  1440.         if(this.maximized){
  1441.             var t = this.tools;
  1442.             this.el.removeClass('x-window-maximized');
  1443.             if(t.restore){
  1444.                 t.restore.hide();
  1445.             }
  1446.             if(t.maximize){
  1447.                 t.maximize.show();
  1448.             }
  1449.             this.setPosition(this.restorePos[0], this.restorePos[1]);
  1450.             this.setSize(this.restoreSize.width, this.restoreSize.height);
  1451.             delete this.restorePos;
  1452.             delete this.restoreSize;
  1453.             this.maximized = false;
  1454.             this.el.enableShadow(true);
  1455.             if(this.dd){
  1456.                 this.dd.unlock();
  1457.             }
  1458.             if(this.collapsible && t.toggle){
  1459.                 t.toggle.show();
  1460.             }
  1461.             this.container.removeClass('x-window-maximized-ct');
  1462.             this.doConstrain();
  1463.             this.fireEvent('restore', this);
  1464.         }
  1465.         return this;
  1466.     },
  1467.     
  1468.     toggleMaximize : function(){
  1469.         return this[this.maximized ? 'restore' : 'maximize']();
  1470.     },
  1471.     
  1472.     fitContainer : function(){
  1473.         var vs = this.container.getViewSize(false);
  1474.         this.setSize(vs.width, vs.height);
  1475.     },
  1476.     
  1477.     
  1478.     setZIndex : function(index){
  1479.         if(this.modal){
  1480.             this.mask.setStyle('z-index', index);
  1481.         }
  1482.         this.el.setZIndex(++index);
  1483.         index += 5;
  1484.         if(this.resizer){
  1485.             this.resizer.proxy.setStyle('z-index', ++index);
  1486.         }
  1487.         this.lastZIndex = index;
  1488.     },
  1489.     
  1490.     alignTo : function(element, position, offsets){
  1491.         var xy = this.el.getAlignToXY(element, position, offsets);
  1492.         this.setPagePosition(xy[0], xy[1]);
  1493.         return this;
  1494.     },
  1495.     
  1496.     anchorTo : function(el, alignment, offsets, monitorScroll){
  1497.       if(this.doAnchor){
  1498.           Ext.EventManager.removeResizeListener(this.doAnchor, this);
  1499.           Ext.EventManager.un(window, 'scroll', this.doAnchor, this);
  1500.       }
  1501.       this.doAnchor = function(){
  1502.           this.alignTo(el, alignment, offsets);
  1503.       };
  1504.       Ext.EventManager.onWindowResize(this.doAnchor, this);
  1505.       var tm = typeof monitorScroll;
  1506.       if(tm != 'undefined'){
  1507.           Ext.EventManager.on(window, 'scroll', this.doAnchor, this,
  1508.               {buffer: tm == 'number' ? monitorScroll : 50});
  1509.       }
  1510.       this.doAnchor();
  1511.       return this;
  1512.     },
  1513.     
  1514.     toFront : function(e){
  1515.         if(this.manager.bringToFront(this)){
  1516.             if(!e || !e.getTarget().focus){
  1517.                 this.focus();
  1518.             }
  1519.         }
  1520.         return this;
  1521.     },
  1522.     
  1523.     setActive : function(active){
  1524.         if(active){
  1525.             if(!this.maximized){
  1526.                 this.el.enableShadow(true);
  1527.             }
  1528.             this.fireEvent('activate', this);
  1529.         }else{
  1530.             this.el.disableShadow();
  1531.             this.fireEvent('deactivate', this);
  1532.         }
  1533.     },
  1534.     
  1535.     toBack : function(){
  1536.         this.manager.sendToBack(this);
  1537.         return this;
  1538.     },
  1539.     
  1540.     center : function(){
  1541.         var xy = this.el.getAlignToXY(this.container, 'c-c');
  1542.         this.setPagePosition(xy[0], xy[1]);
  1543.         return this;
  1544.     }
  1545.     
  1546. });
  1547. Ext.reg('window', Ext.Window);
  1548. Ext.Window.DD = function(win){
  1549.     this.win = win;
  1550.     Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
  1551.     this.setHandleElId(win.header.id);
  1552.     this.scroll = false;
  1553. };
  1554. Ext.extend(Ext.Window.DD, Ext.dd.DD, {
  1555.     moveOnly:true,
  1556.     headerOffsets:[100, 25],
  1557.     startDrag : function(){
  1558.         var w = this.win;
  1559.         this.proxy = w.ghost();
  1560.         if(w.constrain !== false){
  1561.             var so = w.el.shadowOffset;
  1562.             this.constrainTo(w.container, {right: so, left: so, bottom: so});
  1563.         }else if(w.constrainHeader !== false){
  1564.             var s = this.proxy.getSize();
  1565.             this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});
  1566.         }
  1567.     },
  1568.     b4Drag : Ext.emptyFn,
  1569.     onDrag : function(e){
  1570.         this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());
  1571.     },
  1572.     endDrag : function(e){
  1573.         this.win.unghost();
  1574.         this.win.saveState();
  1575.     }
  1576. });
  1577. Ext.WindowGroup = function(){
  1578.     var list = {};
  1579.     var accessList = [];
  1580.     var front = null;
  1581.     
  1582.     var sortWindows = function(d1, d2){
  1583.         return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;
  1584.     };
  1585.     
  1586.     var orderWindows = function(){
  1587.         var a = accessList, len = a.length;
  1588.         if(len > 0){
  1589.             a.sort(sortWindows);
  1590.             var seed = a[0].manager.zseed;
  1591.             for(var i = 0; i < len; i++){
  1592.                 var win = a[i];
  1593.                 if(win && !win.hidden){
  1594.                     win.setZIndex(seed + (i*10));
  1595.                 }
  1596.             }
  1597.         }
  1598.         activateLast();
  1599.     };
  1600.     
  1601.     var setActiveWin = function(win){
  1602.         if(win != front){
  1603.             if(front){
  1604.                 front.setActive(false);
  1605.             }
  1606.             front = win;
  1607.             if(win){
  1608.                 win.setActive(true);
  1609.             }
  1610.         }
  1611.     };
  1612.     
  1613.     var activateLast = function(){
  1614.         for(var i = accessList.length-1; i >=0; --i) {
  1615.             if(!accessList[i].hidden){
  1616.                 setActiveWin(accessList[i]);
  1617.                 return;
  1618.             }
  1619.         }
  1620.         
  1621.         setActiveWin(null);
  1622.     };
  1623.     return {
  1624.         
  1625.         zseed : 9000,
  1626.         
  1627.         register : function(win){
  1628.             if(win.manager){
  1629.                 win.manager.unregister(win);
  1630.             }
  1631.             win.manager = this;
  1632.             list[win.id] = win;
  1633.             accessList.push(win);
  1634.             win.on('hide', activateLast);
  1635.         },
  1636.         
  1637.         unregister : function(win){
  1638.             delete win.manager;
  1639.             delete list[win.id];
  1640.             win.un('hide', activateLast);
  1641.             accessList.remove(win);
  1642.         },
  1643.         
  1644.         get : function(id){
  1645.             return typeof id == "object" ? id : list[id];
  1646.         },
  1647.         
  1648.         bringToFront : function(win){
  1649.             win = this.get(win);
  1650.             if(win != front){
  1651.                 win._lastAccess = new Date().getTime();
  1652.                 orderWindows();
  1653.                 return true;
  1654.             }
  1655.             return false;
  1656.         },
  1657.         
  1658.         sendToBack : function(win){
  1659.             win = this.get(win);
  1660.             win._lastAccess = -(new Date().getTime());
  1661.             orderWindows();
  1662.             return win;
  1663.         },
  1664.         
  1665.         hideAll : function(){
  1666.             for(var id in list){
  1667.                 if(list[id] && typeof list[id] != "function" && list[id].isVisible()){
  1668.                     list[id].hide();
  1669.                 }
  1670.             }
  1671.         },
  1672.         
  1673.         getActive : function(){
  1674.             return front;
  1675.         },
  1676.         
  1677.         getBy : function(fn, scope){
  1678.             var r = [];
  1679.             for(var i = accessList.length-1; i >=0; --i) {
  1680.                 var win = accessList[i];
  1681.                 if(fn.call(scope||win, win) !== false){
  1682.                     r.push(win);
  1683.                 }
  1684.             }
  1685.             return r;
  1686.         },
  1687.         
  1688.         each : function(fn, scope){
  1689.             for(var id in list){
  1690.                 if(list[id] && typeof list[id] != "function"){
  1691.                     if(fn.call(scope || list[id], list[id]) === false){
  1692.                         return;
  1693.                     }
  1694.                 }
  1695.             }
  1696.         }
  1697.     };
  1698. };
  1699. Ext.WindowMgr = new Ext.WindowGroup();
  1700. Ext.MessageBox = function(){
  1701.     var dlg, opt, mask, waitTimer,
  1702.         bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl,
  1703.         buttons, activeTextEl, bwidth, bufferIcon = '', iconCls = '',
  1704.         buttonNames = ['ok', 'yes', 'no', 'cancel'];
  1705.     
  1706.     var handleButton = function(button){
  1707.         buttons[button].blur();
  1708.         if(dlg.isVisible()){
  1709.             dlg.hide();
  1710.             handleHide();
  1711.             Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value, opt], 1);
  1712.         }
  1713.     };
  1714.     
  1715.     var handleHide = function(){
  1716.         if(opt && opt.cls){
  1717.             dlg.el.removeClass(opt.cls);
  1718.         }
  1719.         progressBar.reset();        
  1720.     };
  1721.     
  1722.     var handleEsc = function(d, k, e){
  1723.         if(opt && opt.closable !== false){
  1724.             dlg.hide();
  1725.             handleHide();
  1726.         }
  1727.         if(e){
  1728.             e.stopEvent();
  1729.         }
  1730.     };
  1731.     
  1732.     var updateButtons = function(b){
  1733.         var width = 0,
  1734.             cfg;
  1735.         if(!b){
  1736.             Ext.each(buttonNames, function(name){
  1737.                 buttons[name].hide();
  1738.             });
  1739.             return width;
  1740.         }
  1741.         dlg.footer.dom.style.display = '';
  1742.         Ext.iterate(buttons, function(name, btn){
  1743.             cfg = b[name];
  1744.             if(cfg){
  1745.                 btn.show();
  1746.                 btn.setText(Ext.isString(cfg) ? cfg : Ext.MessageBox.buttonText[name]);
  1747.                 width += btn.getEl().getWidth() + 15;
  1748.             }else{
  1749.                 btn.hide();
  1750.             }
  1751.         });
  1752.         return width;
  1753.     };
  1754.     return {
  1755.         
  1756.         getDialog : function(titleText){
  1757.            if(!dlg){
  1758.                 var btns = [];
  1759.                 
  1760.                 buttons = {};
  1761.                 Ext.each(buttonNames, function(name){
  1762.                     btns.push(buttons[name] = new Ext.Button({
  1763.                         text: this.buttonText[name],
  1764.                         handler: handleButton.createCallback(name),
  1765.                         hideMode: 'offsets'
  1766.                     }));
  1767.                 }, this);
  1768.                 dlg = new Ext.Window({
  1769.                     autoCreate : true,
  1770.                     title:titleText,
  1771.                     resizable:false,
  1772.                     constrain:true,
  1773.                     constrainHeader:true,
  1774.                     minimizable : false,
  1775.                     maximizable : false,
  1776.                     stateful: false,
  1777.                     modal: true,
  1778.                     shim:true,
  1779.                     buttonAlign:"center",
  1780.                     width:400,
  1781.                     height:100,
  1782.                     minHeight: 80,
  1783.                     plain:true,
  1784.                     footer:true,
  1785.                     closable:true,
  1786.                     close : function(){
  1787.                         if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){
  1788.                             handleButton("no");
  1789.                         }else{
  1790.                             handleButton("cancel");
  1791.                         }
  1792.                     },
  1793.                     fbar: new Ext.Toolbar({
  1794.                         items: btns,
  1795.                         enableOverflow: false
  1796.                     })
  1797.                 });
  1798.                 dlg.render(document.body);
  1799.                 dlg.getEl().addClass('x-window-dlg');
  1800.                 mask = dlg.mask;
  1801.                 bodyEl = dlg.body.createChild({
  1802.                     html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'
  1803.                 });
  1804.                 iconEl = Ext.get(bodyEl.dom.firstChild);
  1805.                 var contentEl = bodyEl.dom.childNodes[1];
  1806.                 msgEl = Ext.get(contentEl.firstChild);
  1807.                 textboxEl = Ext.get(contentEl.childNodes[2].firstChild);
  1808.                 textboxEl.enableDisplayMode();
  1809.                 textboxEl.addKeyListener([10,13], function(){
  1810.                     if(dlg.isVisible() && opt && opt.buttons){
  1811.                         if(opt.buttons.ok){
  1812.                             handleButton("ok");
  1813.                         }else if(opt.buttons.yes){
  1814.                             handleButton("yes");
  1815.                         }
  1816.                     }
  1817.                 });
  1818.                 textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]);
  1819.                 textareaEl.enableDisplayMode();
  1820.                 progressBar = new Ext.ProgressBar({
  1821.                     renderTo:bodyEl
  1822.                 });
  1823.                bodyEl.createChild({cls:'x-clear'});
  1824.             }
  1825.             return dlg;
  1826.         },
  1827.         
  1828.         updateText : function(text){
  1829.             if(!dlg.isVisible() && !opt.width){
  1830.                 dlg.setSize(this.maxWidth, 100); 
  1831.             }
  1832.             msgEl.update(text || '&#160;');
  1833.             var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0;
  1834.             var mw = msgEl.getWidth() + msgEl.getMargins('lr');
  1835.             var fw = dlg.getFrameWidth('lr');
  1836.             var bw = dlg.body.getFrameWidth('lr');
  1837.             if (Ext.isIE && iw > 0){
  1838.                 
  1839.                 
  1840.                 iw += 3;
  1841.             }
  1842.             var w = Math.max(Math.min(opt.width || iw+mw+fw+bw, this.maxWidth),
  1843.                         Math.max(opt.minWidth || this.minWidth, bwidth || 0));
  1844.             if(opt.prompt === true){
  1845.                 activeTextEl.setWidth(w-iw-fw-bw);
  1846.             }
  1847.             if(opt.progress === true || opt.wait === true){
  1848.                 progressBar.setSize(w-iw-fw-bw);
  1849.             }
  1850.             if(Ext.isIE && w == bwidth){
  1851.                 w += 4; 
  1852.             }
  1853.             dlg.setSize(w, 'auto').center();
  1854.             return this;
  1855.         },
  1856.         
  1857.         updateProgress : function(value, progressText, msg){
  1858.             progressBar.updateProgress(value, progressText);
  1859.             if(msg){
  1860.                 this.updateText(msg);
  1861.             }
  1862.             return this;
  1863.         },
  1864.         
  1865.         isVisible : function(){
  1866.             return dlg && dlg.isVisible();
  1867.         },
  1868.         
  1869.         hide : function(){
  1870.             var proxy = dlg ? dlg.activeGhost : null;
  1871.             if(this.isVisible() || proxy){
  1872.                 dlg.hide();
  1873.                 handleHide();
  1874.                 if (proxy){
  1875.                     
  1876.                     
  1877.                     dlg.unghost(false, false);
  1878.                 } 
  1879.             }
  1880.             return this;
  1881.         },
  1882.         
  1883.         show : function(options){
  1884.             if(this.isVisible()){
  1885.                 this.hide();
  1886.             }
  1887.             opt = options;
  1888.             var d = this.getDialog(opt.title || "&#160;");
  1889.             d.setTitle(opt.title || "&#160;");
  1890.             var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true);
  1891.             d.tools.close.setDisplayed(allowClose);
  1892.             activeTextEl = textboxEl;
  1893.             opt.prompt = opt.prompt || (opt.multiline ? true : false);
  1894.             if(opt.prompt){
  1895.                 if(opt.multiline){
  1896.                     textboxEl.hide();
  1897.                     textareaEl.show();
  1898.                     textareaEl.setHeight(Ext.isNumber(opt.multiline) ? opt.multiline : this.defaultTextHeight);
  1899.                     activeTextEl = textareaEl;
  1900.                 }else{
  1901.                     textboxEl.show();
  1902.                     textareaEl.hide();
  1903.                 }
  1904.             }else{
  1905.                 textboxEl.hide();
  1906.                 textareaEl.hide();
  1907.             }
  1908.             activeTextEl.dom.value = opt.value || "";
  1909.             if(opt.prompt){
  1910.                 d.focusEl = activeTextEl;
  1911.             }else{
  1912.                 var bs = opt.buttons;
  1913.                 var db = null;
  1914.                 if(bs && bs.ok){
  1915.                     db = buttons["ok"];
  1916.                 }else if(bs && bs.yes){
  1917.                     db = buttons["yes"];
  1918.                 }
  1919.                 if (db){
  1920.                     d.focusEl = db;
  1921.                 }
  1922.             }
  1923.             if(opt.iconCls){
  1924.               d.setIconClass(opt.iconCls);
  1925.             }
  1926.             this.setIcon(Ext.isDefined(opt.icon) ? opt.icon : bufferIcon);
  1927.             bwidth = updateButtons(opt.buttons);
  1928.             progressBar.setVisible(opt.progress === true || opt.wait === true);
  1929.             this.updateProgress(0, opt.progressText);
  1930.             this.updateText(opt.msg);
  1931.             if(opt.cls){
  1932.                 d.el.addClass(opt.cls);
  1933.             }
  1934.             d.proxyDrag = opt.proxyDrag === true;
  1935.             d.modal = opt.modal !== false;
  1936.             d.mask = opt.modal !== false ? mask : false;
  1937.             if(!d.isVisible()){
  1938.                 
  1939.                 document.body.appendChild(dlg.el.dom);
  1940.                 d.setAnimateTarget(opt.animEl);
  1941.                 
  1942.                 d.on('show', function(){
  1943.                     if(allowClose === true){
  1944.                         d.keyMap.enable();
  1945.                     }else{
  1946.                         d.keyMap.disable();
  1947.                     }
  1948.                 }, this, {single:true});
  1949.                 d.show(opt.animEl);
  1950.             }
  1951.             if(opt.wait === true){
  1952.                 progressBar.wait(opt.waitConfig);
  1953.             }
  1954.             return this;
  1955.         },
  1956.         
  1957.         setIcon : function(icon){
  1958.             if(!dlg){
  1959.                 bufferIcon = icon;
  1960.                 return;
  1961.             }
  1962.             bufferIcon = undefined;
  1963.             if(icon && icon != ''){
  1964.                 iconEl.removeClass('x-hidden');
  1965.                 iconEl.replaceClass(iconCls, icon);
  1966.                 bodyEl.addClass('x-dlg-icon');
  1967.                 iconCls = icon;
  1968.             }else{
  1969.                 iconEl.replaceClass(iconCls, 'x-hidden');
  1970.                 bodyEl.removeClass('x-dlg-icon');
  1971.                 iconCls = '';
  1972.             }
  1973.             return this;
  1974.         },
  1975.         
  1976.         progress : function(title, msg, progressText){
  1977.             this.show({
  1978.                 title : title,
  1979.                 msg : msg,
  1980.                 buttons: false,
  1981.                 progress:true,
  1982.                 closable:false,
  1983.                 minWidth: this.minProgressWidth,
  1984.                 progressText: progressText
  1985.             });
  1986.             return this;
  1987.         },
  1988.         
  1989.         wait : function(msg, title, config){
  1990.             this.show({
  1991.                 title : title,
  1992.                 msg : msg,
  1993.                 buttons: false,
  1994.                 closable:false,
  1995.                 wait:true,
  1996.                 modal:true,
  1997.                 minWidth: this.minProgressWidth,
  1998.                 waitConfig: config
  1999.             });
  2000.             return this;
  2001.         },
  2002.         
  2003.         alert : function(title, msg, fn, scope){
  2004.             this.show({
  2005.                 title : title,
  2006.                 msg : msg,
  2007.                 buttons: this.OK,
  2008.                 fn: fn,
  2009.                 scope : scope
  2010.             });
  2011.             return this;
  2012.         },
  2013.         
  2014.         confirm : function(title, msg, fn, scope){
  2015.             this.show({
  2016.                 title : title,
  2017.                 msg : msg,
  2018.                 buttons: this.YESNO,
  2019.                 fn: fn,
  2020.                 scope : scope,
  2021.                 icon: this.QUESTION
  2022.             });
  2023.             return this;
  2024.         },
  2025.         
  2026.         prompt : function(title, msg, fn, scope, multiline, value){
  2027.             this.show({
  2028.                 title : title,
  2029.                 msg : msg,
  2030.                 buttons: this.OKCANCEL,
  2031.                 fn: fn,
  2032.                 minWidth:250,
  2033.                 scope : scope,
  2034.                 prompt:true,
  2035.                 multiline: multiline,
  2036.                 value: value
  2037.             });
  2038.             return this;
  2039.         },
  2040.         
  2041.         OK : {ok:true},
  2042.         
  2043.         CANCEL : {cancel:true},
  2044.         
  2045.         OKCANCEL : {ok:true, cancel:true},
  2046.         
  2047.         YESNO : {yes:true, no:true},
  2048.         
  2049.         YESNOCANCEL : {yes:true, no:true, cancel:true},
  2050.         
  2051.         INFO : 'ext-mb-info',
  2052.         
  2053.         WARNING : 'ext-mb-warning',
  2054.         
  2055.         QUESTION : 'ext-mb-question',
  2056.         
  2057.         ERROR : 'ext-mb-error',
  2058.         
  2059.         defaultTextHeight : 75,
  2060.         
  2061.         maxWidth : 600,
  2062.         
  2063.         minWidth : 100,
  2064.         
  2065.         minProgressWidth : 250,
  2066.         
  2067.         buttonText : {
  2068.             ok : "OK",
  2069.             cancel : "Cancel",
  2070.             yes : "Yes",
  2071.             no : "No"
  2072.         }
  2073.     };
  2074. }();
  2075. Ext.Msg = Ext.MessageBox;
  2076. Ext.dd.PanelProxy = function(panel, config){
  2077.     this.panel = panel;
  2078.     this.id = this.panel.id +'-ddproxy';
  2079.     Ext.apply(this, config);
  2080. };
  2081. Ext.dd.PanelProxy.prototype = {
  2082.     
  2083.     insertProxy : true,
  2084.     
  2085.     setStatus : Ext.emptyFn,
  2086.     reset : Ext.emptyFn,
  2087.     update : Ext.emptyFn,
  2088.     stop : Ext.emptyFn,
  2089.     sync: Ext.emptyFn,
  2090.     
  2091.     getEl : function(){
  2092.         return this.ghost;
  2093.     },
  2094.     
  2095.     getGhost : function(){
  2096.         return this.ghost;
  2097.     },
  2098.     
  2099.     getProxy : function(){
  2100.         return this.proxy;
  2101.     },
  2102.     
  2103.     hide : function(){
  2104.         if(this.ghost){
  2105.             if(this.proxy){
  2106.                 this.proxy.remove();
  2107.                 delete this.proxy;
  2108.             }
  2109.             this.panel.el.dom.style.display = '';
  2110.             this.ghost.remove();
  2111.             delete this.ghost;
  2112.         }
  2113.     },
  2114.     
  2115.     show : function(){
  2116.         if(!this.ghost){
  2117.             this.ghost = this.panel.createGhost(undefined, undefined, Ext.getBody());
  2118.             this.ghost.setXY(this.panel.el.getXY())
  2119.             if(this.insertProxy){
  2120.                 this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});
  2121.                 this.proxy.setSize(this.panel.getSize());
  2122.             }
  2123.             this.panel.el.dom.style.display = 'none';
  2124.         }
  2125.     },
  2126.     
  2127.     repair : function(xy, callback, scope){
  2128.         this.hide();
  2129.         if(typeof callback == "function"){
  2130.             callback.call(scope || this);
  2131.         }
  2132.     },
  2133.     
  2134.     moveProxy : function(parentNode, before){
  2135.         if(this.proxy){
  2136.             parentNode.insertBefore(this.proxy.dom, before);
  2137.         }
  2138.     }
  2139. };
  2140. Ext.Panel.DD = function(panel, cfg){
  2141.     this.panel = panel;
  2142.     this.dragData = {panel: panel};
  2143.     this.proxy = new Ext.dd.PanelProxy(panel, cfg);
  2144.     Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg);
  2145.     var h = panel.header;
  2146.     if(h){
  2147.         this.setHandleElId(h.id);
  2148.     }
  2149.     (h ? h : this.panel.body).setStyle('cursor', 'move');
  2150.     this.scroll = false;
  2151. };
  2152. Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, {
  2153.     showFrame: Ext.emptyFn,
  2154.     startDrag: Ext.emptyFn,
  2155.     b4StartDrag: function(x, y) {
  2156.         this.proxy.show();
  2157.     },
  2158.     b4MouseDown: function(e) {
  2159.         var x = e.getPageX();
  2160.         var y = e.getPageY();
  2161.         this.autoOffset(x, y);
  2162.     },
  2163.     onInitDrag : function(x, y){
  2164.         this.onStartDrag(x, y);
  2165.         return true;
  2166.     },
  2167.     createFrame : Ext.emptyFn,
  2168.     getDragEl : function(e){
  2169.         return this.proxy.ghost.dom;
  2170.     },
  2171.     endDrag : function(e){
  2172.         this.proxy.hide();
  2173.         this.panel.saveState();
  2174.     },
  2175.     autoOffset : function(x, y) {
  2176.         x -= this.startPageX;
  2177.         y -= this.startPageY;
  2178.         this.setDelta(x, y);
  2179.     }
  2180. });
  2181. Ext.state.Provider = function(){
  2182.     
  2183.     this.addEvents("statechange");
  2184.     this.state = {};
  2185.     Ext.state.Provider.superclass.constructor.call(this);
  2186. };
  2187. Ext.extend(Ext.state.Provider, Ext.util.Observable, {
  2188.     
  2189.     get : function(name, defaultValue){
  2190.         return typeof this.state[name] == "undefined" ?
  2191.             defaultValue : this.state[name];
  2192.     },
  2193.     
  2194.     clear : function(name){
  2195.         delete this.state[name];
  2196.         this.fireEvent("statechange", this, name, null);
  2197.     },
  2198.     
  2199.     set : function(name, value){
  2200.         this.state[name] = value;
  2201.         this.fireEvent("statechange", this, name, value);
  2202.     },
  2203.     
  2204.     decodeValue : function(cookie){
  2205.         var re = /^(a|n|d|b|s|o):(.*)$/;
  2206.         var matches = re.exec(unescape(cookie));
  2207.         if(!matches || !matches[1]) return; 
  2208.         var type = matches[1];
  2209.         var v = matches[2];
  2210.         switch(type){
  2211.             case "n":
  2212.                 return parseFloat(v);
  2213.             case "d":
  2214.                 return new Date(Date.parse(v));
  2215.             case "b":
  2216.                 return (v == "1");
  2217.             case "a":
  2218.                 var all = [];
  2219.                 if(v != ''){
  2220.                     Ext.each(v.split('^'), function(val){
  2221.                         all.push(this.decodeValue(val));
  2222.                     }, this);
  2223.                 }
  2224.                 return all;
  2225.            case "o":
  2226.                 var all = {};
  2227.                 if(v != ''){
  2228.                     Ext.each(v.split('^'), function(val){
  2229.                         var kv = val.split('=');
  2230.                         all[kv[0]] = this.decodeValue(kv[1]);
  2231.                     }, this);
  2232.                 }
  2233.                 return all;
  2234.            default:
  2235.                 return v;
  2236.         }
  2237.     },
  2238.     
  2239.     encodeValue : function(v){
  2240.         var enc;
  2241.         if(typeof v == "number"){
  2242.             enc = "n:" + v;
  2243.         }else if(typeof v == "boolean"){
  2244.             enc = "b:" + (v ? "1" : "0");
  2245.         }else if(Ext.isDate(v)){
  2246.             enc = "d:" + v.toGMTString();
  2247.         }else if(Ext.isArray(v)){
  2248.             var flat = "";
  2249.             for(var i = 0, len = v.length; i < len; i++){
  2250.                 flat += this.encodeValue(v[i]);
  2251.                 if(i != len-1) flat += "^";
  2252.             }
  2253.             enc = "a:" + flat;
  2254.         }else if(typeof v == "object"){
  2255.             var flat = "";
  2256.             for(var key in v){
  2257.                 if(typeof v[key] != "function" && v[key] !== undefined){
  2258.                     flat += key + "=" + this.encodeValue(v[key]) + "^";
  2259.                 }
  2260.             }
  2261.             enc = "o:" + flat.substring(0, flat.length-1);
  2262.         }else{
  2263.             enc = "s:" + v;
  2264.         }
  2265.         return escape(enc);
  2266.     }
  2267. });
  2268. Ext.state.Manager = function(){
  2269.     var provider = new Ext.state.Provider();
  2270.     return {
  2271.         
  2272.         setProvider : function(stateProvider){
  2273.             provider = stateProvider;
  2274.         },
  2275.         
  2276.         get : function(key, defaultValue){
  2277.             return provider.get(key, defaultValue);
  2278.         },
  2279.         
  2280.          set : function(key, value){
  2281.             provider.set(key, value);
  2282.         },
  2283.         
  2284.         clear : function(key){
  2285.             provider.clear(key);
  2286.         },
  2287.         
  2288.         getProvider : function(){
  2289.             return provider;
  2290.         }
  2291.     };
  2292. }();
  2293. Ext.state.CookieProvider = function(config){
  2294.     Ext.state.CookieProvider.superclass.constructor.call(this);
  2295.     this.path = "/";
  2296.     this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); 
  2297.     this.domain = null;
  2298.     this.secure = false;
  2299.     Ext.apply(this, config);
  2300.     this.state = this.readCookies();
  2301. };
  2302. Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
  2303.     
  2304.     set : function(name, value){
  2305.         if(typeof value == "undefined" || value === null){
  2306.             this.clear(name);
  2307.             return;
  2308.         }
  2309.         this.setCookie(name, value);
  2310.         Ext.state.CookieProvider.superclass.set.call(this, name, value);
  2311.     },
  2312.     
  2313.     clear : function(name){
  2314.         this.clearCookie(name);
  2315.         Ext.state.CookieProvider.superclass.clear.call(this, name);
  2316.     },
  2317.     
  2318.     readCookies : function(){
  2319.         var cookies = {};
  2320.         var c = document.cookie + ";";
  2321.         var re = /s?(.*?)=(.*?);/g;
  2322.      var matches;
  2323.      while((matches = re.exec(c)) != null){
  2324.             var name = matches[1];
  2325.             var value = matches[2];
  2326.             if(name && name.substring(0,3) == "ys-"){
  2327.                 cookies[name.substr(3)] = this.decodeValue(value);
  2328.             }
  2329.         }
  2330.         return cookies;
  2331.     },
  2332.     
  2333.     setCookie : function(name, value){
  2334.         document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
  2335.            ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
  2336.            ((this.path == null) ? "" : ("; path=" + this.path)) +
  2337.            ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
  2338.            ((this.secure == true) ? "; secure" : "");
  2339.     },
  2340.     
  2341.     clearCookie : function(name){
  2342.         document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
  2343.            ((this.path == null) ? "" : ("; path=" + this.path)) +
  2344.            ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
  2345.            ((this.secure == true) ? "; secure" : "");
  2346.     }
  2347. });
  2348. Ext.DataView = Ext.extend(Ext.BoxComponent, {
  2349.     
  2350.     
  2351.     
  2352.     
  2353.     
  2354.     
  2355.     
  2356.     
  2357.     
  2358.     selectedClass : "x-view-selected",
  2359.     
  2360.     emptyText : "",
  2361.     
  2362.     deferEmptyText: true,
  2363.     
  2364.     trackOver: false,
  2365.     
  2366.     last: false,
  2367.     
  2368.     initComponent : function(){
  2369.         Ext.DataView.superclass.initComponent.call(this);
  2370.         if(Ext.isString(this.tpl) || Ext.isArray(this.tpl)){
  2371.             this.tpl = new Ext.XTemplate(this.tpl);
  2372.         }
  2373.         this.addEvents(
  2374.             
  2375.             "beforeclick",
  2376.             
  2377.             "click",
  2378.             
  2379.             "mouseenter",
  2380.             
  2381.             "mouseleave",
  2382.             
  2383.             "containerclick",
  2384.             
  2385.             "dblclick",
  2386.             
  2387.             "contextmenu",
  2388.             
  2389.             "containercontextmenu",
  2390.             
  2391.             "selectionchange",
  2392.             
  2393.             "beforeselect"
  2394.         );
  2395.         this.store = Ext.StoreMgr.lookup(this.store);
  2396.         this.all = new Ext.CompositeElementLite();
  2397.         this.selected = new Ext.CompositeElementLite();
  2398.     },
  2399.     
  2400.     afterRender : function(){
  2401.         Ext.DataView.superclass.afterRender.call(this);
  2402. this.mon(this.getTemplateTarget(), {
  2403.             "click": this.onClick,
  2404.             "dblclick": this.onDblClick,
  2405.             "contextmenu": this.onContextMenu,
  2406.             scope:this
  2407.         });
  2408.         if(this.overClass || this.trackOver){
  2409.             this.mon(this.getTemplateTarget(), {
  2410.                 "mouseover": this.onMouseOver,
  2411.                 "mouseout": this.onMouseOut,
  2412.                 scope:this
  2413.             });
  2414.         }
  2415.         if(this.store){
  2416.             this.bindStore(this.store, true);
  2417.         }
  2418.     },
  2419.     
  2420.     refresh : function(){
  2421.         this.clearSelections(false, true);
  2422.         var el = this.getTemplateTarget();
  2423.         el.update("");
  2424.         var records = this.store.getRange();
  2425.         if(records.length < 1){
  2426.             if(!this.deferEmptyText || this.hasSkippedEmptyText){
  2427.                 el.update(this.emptyText);
  2428.             }
  2429.             this.all.clear();
  2430.         }else{
  2431.             this.tpl.overwrite(el, this.collectData(records, 0));
  2432.             this.all.fill(Ext.query(this.itemSelector, el.dom));
  2433.             this.updateIndexes(0);
  2434.         }
  2435.         this.hasSkippedEmptyText = true;
  2436.     },
  2437.     getTemplateTarget: function(){
  2438.         return this.el;
  2439.     },
  2440.     
  2441.     prepareData : function(data){
  2442.         return data;
  2443.     },
  2444.     
  2445.     collectData : function(records, startIndex){
  2446.         var r = [];
  2447.         for(var i = 0, len = records.length; i < len; i++){
  2448.             r[r.length] = this.prepareData(records[i].data, startIndex+i, records[i]);
  2449.         }
  2450.         return r;
  2451.     },
  2452.     
  2453.     bufferRender : function(records){
  2454.         var div = document.createElement('div');
  2455.         this.tpl.overwrite(div, this.collectData(records));
  2456.         return Ext.query(this.itemSelector, div);
  2457.     },
  2458.     
  2459.     onUpdate : function(ds, record){
  2460.         var index = this.store.indexOf(record);
  2461.         if(index > -1){
  2462.             var sel = this.isSelected(index);
  2463.             var original = this.all.elements[index];
  2464.             var node = this.bufferRender([record], index)[0];
  2465.             this.all.replaceElement(index, node, true);
  2466.             if(sel){
  2467.                 this.selected.replaceElement(original, node);
  2468.                 this.all.item(index).addClass(this.selectedClass);
  2469.             }
  2470.             this.updateIndexes(index, index);
  2471.         }
  2472.     },
  2473.     
  2474.     onAdd : function(ds, records, index){
  2475.         if(this.all.getCount() === 0){
  2476.             this.refresh();
  2477.             return;
  2478.         }
  2479.         var nodes = this.bufferRender(records, index), n, a = this.all.elements;
  2480.         if(index < this.all.getCount()){
  2481.             n = this.all.item(index).insertSibling(nodes, 'before', true);
  2482.             a.splice.apply(a, [index, 0].concat(nodes));
  2483.         }else{
  2484.             n = this.all.last().insertSibling(nodes, 'after', true);
  2485.             a.push.apply(a, nodes);
  2486.         }
  2487.         this.updateIndexes(index);
  2488.     },
  2489.     
  2490.     onRemove : function(ds, record, index){
  2491.         this.deselect(index);
  2492.         this.all.removeElement(index, true);
  2493.         this.updateIndexes(index);
  2494.         if (this.store.getCount() === 0){
  2495.             this.refresh();
  2496.         }
  2497.     },
  2498.     
  2499.     refreshNode : function(index){
  2500.         this.onUpdate(this.store, this.store.getAt(index));
  2501.     },
  2502.     
  2503.     updateIndexes : function(startIndex, endIndex){
  2504.         var ns = this.all.elements;
  2505.         startIndex = startIndex || 0;
  2506.         endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));
  2507.         for(var i = startIndex; i <= endIndex; i++){
  2508.             ns[i].viewIndex = i;
  2509.         }
  2510.     },
  2511.     
  2512.     
  2513.     getStore : function(){
  2514.         return this.store;
  2515.     },
  2516.     
  2517.     bindStore : function(store, initial){
  2518.         if(!initial && this.store){
  2519.             if(store !== this.store && this.store.autoDestroy){
  2520.                 this.store.destroy();
  2521.             }else{
  2522.                 this.store.un("beforeload", this.onBeforeLoad, this);
  2523.                 this.store.un("datachanged", this.refresh, this);
  2524.                 this.store.un("add", this.onAdd, this);
  2525.                 this.store.un("remove", this.onRemove, this);
  2526.                 this.store.un("update", this.onUpdate, this);
  2527.                 this.store.un("clear", this.refresh, this);
  2528.             }
  2529.             if(!store){
  2530.                 this.store = null;
  2531.             }
  2532.         }
  2533.         if(store){
  2534.             store = Ext.StoreMgr.lookup(store);
  2535.             store.on({
  2536.                 scope: this,
  2537.                 beforeload: this.onBeforeLoad,
  2538.                 datachanged: this.refresh,
  2539.                 add: this.onAdd,
  2540.                 remove: this.onRemove,
  2541.                 update: this.onUpdate,
  2542.                 clear: this.refresh
  2543.             });
  2544.         }
  2545.         this.store = store;
  2546.         if(store){
  2547.             this.refresh();
  2548.         }
  2549.     },
  2550.     
  2551.     findItemFromChild : function(node){
  2552.         return Ext.fly(node).findParent(this.itemSelector, this.getTemplateTarget());
  2553.     },
  2554.     
  2555.     onClick : function(e){
  2556.         var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
  2557.         if(item){
  2558.             var index = this.indexOf(item);
  2559.             if(this.onItemClick(item, index, e) !== false){
  2560.                 this.fireEvent("click", this, index, item, e);
  2561.             }
  2562.         }else{
  2563.             if(this.fireEvent("containerclick", this, e) !== false){
  2564.                 this.onContainerClick(e);
  2565.             }
  2566.         }
  2567.     },
  2568.     onContainerClick : function(e){
  2569.         this.clearSelections();
  2570.     },
  2571.     
  2572.     onContextMenu : function(e){
  2573.         var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
  2574.         if(item){
  2575.             this.fireEvent("contextmenu", this, this.indexOf(item), item, e);
  2576.         }else{
  2577.             this.fireEvent("containercontextmenu", this, e);
  2578.         }
  2579.     },
  2580.     
  2581.     onDblClick : function(e){
  2582.         var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
  2583.         if(item){
  2584.             this.fireEvent("dblclick", this, this.indexOf(item), item, e);
  2585.         }
  2586.     },
  2587.     
  2588.     onMouseOver : function(e){
  2589.         var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
  2590.         if(item && item !== this.lastItem){
  2591.             this.lastItem = item;
  2592.             Ext.fly(item).addClass(this.overClass);
  2593.             this.fireEvent("mouseenter", this, this.indexOf(item), item, e);
  2594.         }
  2595.     },
  2596.     
  2597.     onMouseOut : function(e){
  2598.         if(this.lastItem){
  2599.             if(!e.within(this.lastItem, true, true)){
  2600.                 Ext.fly(this.lastItem).removeClass(this.overClass);
  2601.                 this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, e);
  2602.                 delete this.lastItem;
  2603.             }
  2604.         }
  2605.     },
  2606.     
  2607.     onItemClick : function(item, index, e){
  2608.         if(this.fireEvent("beforeclick", this, index, item, e) === false){
  2609.             return false;
  2610.         }
  2611.         if(this.multiSelect){
  2612.             this.doMultiSelection(item, index, e);
  2613.             e.preventDefault();
  2614.         }else if(this.singleSelect){
  2615.             this.doSingleSelection(item, index, e);
  2616.             e.preventDefault();
  2617.         }
  2618.         return true;
  2619.     },
  2620.     
  2621.     doSingleSelection : function(item, index, e){
  2622.         if(e.ctrlKey && this.isSelected(index)){
  2623.             this.deselect(index);
  2624.         }else{
  2625.             this.select(index, false);
  2626.         }
  2627.     },
  2628.     
  2629.     doMultiSelection : function(item, index, e){
  2630.         if(e.shiftKey && this.last !== false){
  2631.             var last = this.last;
  2632.             this.selectRange(last, index, e.ctrlKey);
  2633.             this.last = last; 
  2634.         }else{
  2635.             if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){
  2636.                 this.deselect(index);
  2637.             }else{
  2638.                 this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect);
  2639.             }
  2640.         }
  2641.     },
  2642.     
  2643.     getSelectionCount : function(){
  2644.         return this.selected.getCount();
  2645.     },
  2646.     
  2647.     getSelectedNodes : function(){
  2648.         return this.selected.elements;
  2649.     },
  2650.     
  2651.     getSelectedIndexes : function(){
  2652.         var indexes = [], s = this.selected.elements;
  2653.         for(var i = 0, len = s.length; i < len; i++){
  2654.             indexes.push(s[i].viewIndex);
  2655.         }
  2656.         return indexes;
  2657.     },
  2658.     
  2659.     getSelectedRecords : function(){
  2660.         var r = [], s = this.selected.elements;
  2661.         for(var i = 0, len = s.length; i < len; i++){
  2662.             r[r.length] = this.store.getAt(s[i].viewIndex);
  2663.         }
  2664.         return r;
  2665.     },
  2666.     
  2667.     getRecords : function(nodes){
  2668.         var r = [], s = nodes;
  2669.         for(var i = 0, len = s.length; i < len; i++){
  2670.             r[r.length] = this.store.getAt(s[i].viewIndex);
  2671.         }
  2672.         return r;
  2673.     },
  2674.     
  2675.     getRecord : function(node){
  2676.         return this.store.getAt(node.viewIndex);
  2677.     },
  2678.     
  2679.     clearSelections : function(suppressEvent, skipUpdate){
  2680.         if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){
  2681.             if(!skipUpdate){
  2682.                 this.selected.removeClass(this.selectedClass);
  2683.             }
  2684.             this.selected.clear();
  2685.             this.last = false;
  2686.             if(!suppressEvent){
  2687.                 this.fireEvent("selectionchange", this, this.selected.elements);
  2688.             }
  2689.         }
  2690.     },
  2691.     
  2692.     isSelected : function(node){
  2693.         return this.selected.contains(this.getNode(node));
  2694.     },
  2695.     
  2696.     deselect : function(node){
  2697.         if(this.isSelected(node)){
  2698.             node = this.getNode(node);
  2699.             this.selected.removeElement(node);
  2700.             if(this.last == node.viewIndex){
  2701.                 this.last = false;
  2702.             }
  2703.             Ext.fly(node).removeClass(this.selectedClass);
  2704.             this.fireEvent("selectionchange", this, this.selected.elements);
  2705.         }
  2706.     },
  2707.     
  2708.     select : function(nodeInfo, keepExisting, suppressEvent){
  2709.         if(Ext.isArray(nodeInfo)){
  2710.             if(!keepExisting){
  2711.                 this.clearSelections(true);
  2712.             }
  2713.             for(var i = 0, len = nodeInfo.length; i < len; i++){
  2714.                 this.select(nodeInfo[i], true, true);
  2715.             }
  2716.             if(!suppressEvent){
  2717.                 this.fireEvent("selectionchange", this, this.selected.elements);
  2718.             }
  2719.         } else{
  2720.             var node = this.getNode(nodeInfo);
  2721.             if(!keepExisting){
  2722.                 this.clearSelections(true);
  2723.             }
  2724.             if(node && !this.isSelected(node)){
  2725.                 if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){
  2726.                     Ext.fly(node).addClass(this.selectedClass);
  2727.                     this.selected.add(node);
  2728.                     this.last = node.viewIndex;
  2729.                     if(!suppressEvent){
  2730.                         this.fireEvent("selectionchange", this, this.selected.elements);
  2731.                     }
  2732.                 }
  2733.             }
  2734.         }
  2735.     },
  2736.     
  2737.     selectRange : function(start, end, keepExisting){
  2738.         if(!keepExisting){
  2739.             this.clearSelections(true);
  2740.         }
  2741.         this.select(this.getNodes(start, end), true);
  2742.     },
  2743.     
  2744.     getNode : function(nodeInfo){
  2745.         if(Ext.isString(nodeInfo)){
  2746.             return document.getElementById(nodeInfo);
  2747.         }else if(Ext.isNumber(nodeInfo)){
  2748.             return this.all.elements[nodeInfo];
  2749.         }
  2750.         return nodeInfo;
  2751.     },
  2752.     
  2753.     getNodes : function(start, end){
  2754.         var ns = this.all.elements;
  2755.         start = start || 0;
  2756.         end = !Ext.isDefined(end) ? Math.max(ns.length - 1, 0) : end;
  2757.         var nodes = [], i;
  2758.         if(start <= end){
  2759.             for(i = start; i <= end && ns[i]; i++){
  2760.                 nodes.push(ns[i]);
  2761.             }
  2762.         } else{
  2763.             for(i = start; i >= end && ns[i]; i--){
  2764.                 nodes.push(ns[i]);
  2765.             }
  2766.         }
  2767.         return nodes;
  2768.     },
  2769.     
  2770.     indexOf : function(node){
  2771.         node = this.getNode(node);
  2772.         if(Ext.isNumber(node.viewIndex)){
  2773.             return node.viewIndex;
  2774.         }
  2775.         return this.all.indexOf(node);
  2776.     },
  2777.     
  2778.     onBeforeLoad : function(){
  2779.         if(this.loadingText){
  2780.             this.clearSelections(false, true);
  2781.             this.getTemplateTarget().update('<div class="loading-indicator">'+this.loadingText+'</div>');
  2782.             this.all.clear();
  2783.         }
  2784.     },
  2785.     onDestroy : function(){
  2786.         this.all.clear();
  2787.         this.selected.clear();
  2788.         Ext.DataView.superclass.onDestroy.call(this);
  2789.         this.bindStore(null);
  2790.     }
  2791. });
  2792. Ext.DataView.prototype.setStore = Ext.DataView.prototype.bindStore;
  2793. Ext.reg('dataview', Ext.DataView);
  2794. Ext.list.ListView = Ext.extend(Ext.DataView, {
  2795.     
  2796.     
  2797.     
  2798.     itemSelector: 'dl',
  2799.     
  2800.     selectedClass:'x-list-selected',
  2801.     
  2802.     overClass:'x-list-over',
  2803.     
  2804.     
  2805.     scrollOffset : undefined,
  2806.     
  2807.     columnResize: true,
  2808.     
  2809.     
  2810.     columnSort: true,
  2811.     
  2812.     
  2813.     maxWidth: Ext.isIE ? 99 : 100,
  2814.     
  2815.     initComponent : function(){
  2816.         if(this.columnResize){
  2817.             this.colResizer = new Ext.list.ColumnResizer(this.colResizer);
  2818.             this.colResizer.init(this);
  2819.         }
  2820.         if(this.columnSort){
  2821.             this.colSorter = new Ext.list.Sorter(this.columnSort);
  2822.             this.colSorter.init(this);
  2823.         }
  2824.         if(!this.internalTpl){
  2825.             this.internalTpl = new Ext.XTemplate(
  2826.                 '<div class="x-list-header"><div class="x-list-header-inner">',
  2827.                     '<tpl for="columns">',
  2828.                     '<div style="width:{[values.width*100]}%;text-align:{align};"><em unselectable="on" id="',this.id, '-xlhd-{#}">',
  2829.                         '{header}',
  2830.                     '</em></div>',
  2831.                     '</tpl>',
  2832.                     '<div class="x-clear"></div>',
  2833.                 '</div></div>',
  2834.                 '<div class="x-list-body"><div class="x-list-body-inner">',
  2835.                 '</div></div>'
  2836.             );
  2837.         }
  2838.         if(!this.tpl){
  2839.             this.tpl = new Ext.XTemplate(
  2840.                 '<tpl for="rows">',
  2841.                     '<dl>',
  2842.                         '<tpl for="parent.columns">',
  2843.                         '<dt style="width:{[values.width*100]}%;text-align:{align};">',
  2844.                         '<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">',
  2845.                             '{[values.tpl.apply(parent)]}',
  2846.                         '</em></dt>',
  2847.                         '</tpl>',
  2848.                         '<div class="x-clear"></div>',
  2849.                     '</dl>',
  2850.                 '</tpl>'
  2851.             );
  2852.         };
  2853.         
  2854.         var cs = this.columns, 
  2855.             allocatedWidth = 0, 
  2856.             colsWithWidth = 0, 
  2857.             len = cs.length, 
  2858.             columns = [];
  2859.             
  2860.         for(var i = 0; i < len; i++){
  2861.             var c = cs[i];
  2862.             if(!c.isColumn) {
  2863.                 c.xtype = c.xtype ? (/^lv/.test(c.xtype) ? c.xtype : 'lv' + c.xtype) : 'lvcolumn';
  2864.                 c = Ext.create(c);
  2865.             }
  2866.             if(c.width) {
  2867.                 allocatedWidth += c.width*100;
  2868.                 colsWithWidth++;
  2869.             }
  2870.             columns.push(c);
  2871.         }
  2872.         
  2873.         cs = this.columns = columns;
  2874.         
  2875.         
  2876.         if(colsWithWidth < len){
  2877.             var remaining = len - colsWithWidth;
  2878.             if(allocatedWidth < this.maxWidth){
  2879.                 var perCol = ((this.maxWidth-allocatedWidth) / remaining)/100;
  2880.                 for(var j = 0; j < len; j++){
  2881.                     var c = cs[j];
  2882.                     if(!c.width){
  2883.                         c.width = perCol;
  2884.                     }
  2885.                 }
  2886.             }
  2887.         }
  2888.         Ext.list.ListView.superclass.initComponent.call(this);
  2889.     },
  2890.     onRender : function(){
  2891.         this.autoEl = {
  2892.             cls: 'x-list-wrap'  
  2893.         };
  2894.         Ext.list.ListView.superclass.onRender.apply(this, arguments);
  2895.         this.internalTpl.overwrite(this.el, {columns: this.columns});
  2896.         
  2897.         this.innerBody = Ext.get(this.el.dom.childNodes[1].firstChild);
  2898.         this.innerHd = Ext.get(this.el.dom.firstChild.firstChild);
  2899.         if(this.hideHeaders){
  2900.             this.el.dom.firstChild.style.display = 'none';
  2901.         }
  2902.     },
  2903.     getTemplateTarget : function(){
  2904.         return this.innerBody;
  2905.     },
  2906.     
  2907.     collectData : function(){
  2908.         var rs = Ext.list.ListView.superclass.collectData.apply(this, arguments);
  2909.         return {
  2910.             columns: this.columns,
  2911.             rows: rs
  2912.         }
  2913.     },
  2914.     verifyInternalSize : function(){
  2915.         if(this.lastSize){
  2916.             this.onResize(this.lastSize.width, this.lastSize.height);
  2917.         }
  2918.     },
  2919.     
  2920.     onResize : function(w, h){
  2921.         var bd = this.innerBody.dom;
  2922.         var hd = this.innerHd.dom
  2923.         if(!bd){
  2924.             return;
  2925.         }
  2926.         var bdp = bd.parentNode;
  2927.         if(Ext.isNumber(w)){
  2928.             var sw = w - Ext.num(this.scrollOffset, Ext.getScrollBarWidth());
  2929.             if(this.reserveScrollOffset || ((bdp.offsetWidth - bdp.clientWidth) > 10)){
  2930.                 bd.style.width = sw + 'px';
  2931.                 hd.style.width = sw + 'px';
  2932.             }else{
  2933.                 bd.style.width = w + 'px';
  2934.                 hd.style.width = w + 'px';
  2935.                 setTimeout(function(){
  2936.                     if((bdp.offsetWidth - bdp.clientWidth) > 10){
  2937.                         bd.style.width = sw + 'px';
  2938.                         hd.style.width = sw + 'px';
  2939.                     }
  2940.                 }, 10);
  2941.             }
  2942.         }
  2943.         if(Ext.isNumber(h)){
  2944.             bdp.style.height = (h - hd.parentNode.offsetHeight) + 'px';
  2945.         }
  2946.     },
  2947.     updateIndexes : function(){
  2948.         Ext.list.ListView.superclass.updateIndexes.apply(this, arguments);
  2949.         this.verifyInternalSize();
  2950.     },
  2951.     findHeaderIndex : function(hd){
  2952.         hd = hd.dom || hd;
  2953.         var pn = hd.parentNode, cs = pn.parentNode.childNodes;
  2954.         for(var i = 0, c; c = cs[i]; i++){
  2955.             if(c == pn){
  2956.                 return i;
  2957.             }
  2958.         }
  2959.         return -1;
  2960.     },
  2961.     setHdWidths : function(){
  2962.         var els = this.innerHd.dom.getElementsByTagName('div');
  2963.         for(var i = 0, cs = this.columns, len = cs.length; i < len; i++){
  2964.             els[i].style.width = (cs[i].width*100) + '%';
  2965.         }
  2966.     }
  2967. });
  2968. Ext.reg('listview', Ext.list.ListView);
  2969. Ext.ListView = Ext.list.ListView;
  2970. Ext.list.Column = Ext.extend(Object, {
  2971.     
  2972.     isColumn: true,
  2973.     
  2974.             
  2975.     align: 'left',
  2976.         
  2977.     header: '',
  2978.     
  2979.         
  2980.     width: null,
  2981.     
  2982.     cls: '',
  2983.     
  2984.     
  2985.     
  2986.     
  2987.     constructor : function(c){
  2988.         if(!c.tpl){
  2989.             c.tpl = new Ext.XTemplate('{' + c.dataIndex + '}');
  2990.         }
  2991.         else if(Ext.isString(c.tpl)){
  2992.             c.tpl = new Ext.XTemplate(c.tpl);
  2993.         }
  2994.         
  2995.         Ext.apply(this, c);
  2996.     }
  2997. });
  2998. Ext.reg('lvcolumn', Ext.list.Column);
  2999. Ext.list.NumberColumn = Ext.extend(Ext.list.Column, {
  3000.         
  3001.     format: '0,000.00',
  3002.     
  3003.     constructor : function(c) {
  3004.         c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':number("' + (c.format || this.format) + '")}');       
  3005.         Ext.list.NumberColumn.superclass.constructor.call(this, c);
  3006.     }
  3007. });
  3008. Ext.reg('lvnumbercolumn', Ext.list.NumberColumn);
  3009. Ext.list.DateColumn = Ext.extend(Ext.list.Column, {
  3010.     format: 'm/d/Y',
  3011.     constructor : function(c) {
  3012.         c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':date("' + (c.format || this.format) + '")}');      
  3013.         Ext.list.DateColumn.superclass.constructor.call(this, c);
  3014.     }
  3015. });
  3016. Ext.reg('lvdatecolumn', Ext.list.DateColumn);
  3017. Ext.list.BooleanColumn = Ext.extend(Ext.list.Column, {
  3018.     
  3019.     trueText: 'true',
  3020.     
  3021.     falseText: 'false',
  3022.     
  3023.     undefinedText: '&#160;',
  3024.     
  3025.     constructor : function(c) {
  3026.         c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}');
  3027.         
  3028.         var t = this.trueText, f = this.falseText, u = this.undefinedText;
  3029.         c.tpl.format = function(v){
  3030.             if(v === undefined){
  3031.                 return u;
  3032.             }
  3033.             if(!v || v === 'false'){
  3034.                 return f;
  3035.             }
  3036.             return t;
  3037.         };
  3038.         
  3039.         Ext.list.DateColumn.superclass.constructor.call(this, c);
  3040.     }
  3041. });
  3042. Ext.reg('lvbooleancolumn', Ext.list.BooleanColumn);
  3043. Ext.list.ColumnResizer = Ext.extend(Ext.util.Observable, {
  3044.     
  3045.     minPct: .05,
  3046.     constructor: function(config){
  3047.         Ext.apply(this, config);
  3048.         Ext.list.ColumnResizer.superclass.constructor.call(this);
  3049.     },
  3050.     init : function(listView){
  3051.         this.view = listView;
  3052.         listView.on('render', this.initEvents, this);
  3053.     },
  3054.     initEvents : function(view){
  3055.         view.mon(view.innerHd, 'mousemove', this.handleHdMove, this);
  3056.         this.tracker = new Ext.dd.DragTracker({
  3057.             onBeforeStart: this.onBeforeStart.createDelegate(this),
  3058.             onStart: this.onStart.createDelegate(this),
  3059.             onDrag: this.onDrag.createDelegate(this),
  3060.             onEnd: this.onEnd.createDelegate(this),
  3061.             tolerance: 3,
  3062.             autoStart: 300
  3063.         });
  3064.         this.tracker.initEl(view.innerHd);
  3065.         view.on('beforedestroy', this.tracker.destroy, this.tracker);
  3066.     },
  3067.     handleHdMove : function(e, t){
  3068.         var hw = 5,
  3069.             x = e.getPageX(),
  3070.             hd = e.getTarget('em', 3, true);
  3071.         if(hd){
  3072.             var r = hd.getRegion(),
  3073.                 ss = hd.dom.style,
  3074.                 pn = hd.dom.parentNode;
  3075.             if(x - r.left <= hw && pn != pn.parentNode.firstChild){
  3076.                 this.activeHd = Ext.get(pn.previousSibling.firstChild);
  3077.                 ss.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize';
  3078.             } else if(r.right - x <= hw && pn != pn.parentNode.lastChild.previousSibling){
  3079.                 this.activeHd = hd;
  3080.                 ss.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize';
  3081.             } else{
  3082.                 delete this.activeHd;
  3083.                 ss.cursor = '';
  3084.             }
  3085.         }
  3086.     },
  3087.     onBeforeStart : function(e){
  3088.         this.dragHd = this.activeHd;
  3089.         return !!this.dragHd;
  3090.     },
  3091.     onStart: function(e){
  3092.         this.view.disableHeaders = true;
  3093.         this.proxy = this.view.el.createChild({cls:'x-list-resizer'});
  3094.         this.proxy.setHeight(this.view.el.getHeight());
  3095.         var x = this.tracker.getXY()[0],
  3096.             w = this.view.innerHd.getWidth();
  3097.         this.hdX = this.dragHd.getX();
  3098.         this.hdIndex = this.view.findHeaderIndex(this.dragHd);
  3099.         this.proxy.setX(this.hdX);
  3100.         this.proxy.setWidth(x-this.hdX);
  3101.         this.minWidth = w*this.minPct;
  3102.         this.maxWidth = w - (this.minWidth*(this.view.columns.length-1-this.hdIndex));
  3103.     },
  3104.     onDrag: function(e){
  3105.         var cursorX = this.tracker.getXY()[0];
  3106.         this.proxy.setWidth((cursorX-this.hdX).constrain(this.minWidth, this.maxWidth));
  3107.     },
  3108.     onEnd: function(e){
  3109.         
  3110.         var nw = this.proxy.getWidth();
  3111.         this.proxy.remove();
  3112.         var index = this.hdIndex,
  3113.             vw = this.view,
  3114.             cs = vw.columns,
  3115.             len = cs.length,
  3116.             w = this.view.innerHd.getWidth(),
  3117.             minPct = this.minPct * 100,
  3118.             pct = Math.ceil((nw * vw.maxWidth) / w),
  3119.             diff = (cs[index].width * 100) - pct,
  3120.             each = Math.floor(diff / (len-1-index)),
  3121.             mod = diff - (each * (len-1-index));
  3122.         for(var i = index+1; i < len; i++){
  3123.             var cw = (cs[i].width * 100) + each,
  3124.                 ncw = Math.max(minPct, cw);
  3125.             if(cw != ncw){
  3126.                 mod += cw - ncw;
  3127.             }
  3128.             cs[i].width = ncw / 100;
  3129.         }
  3130.         cs[index].width = pct / 100;
  3131.         cs[index+1].width += (mod / 100);
  3132.         delete this.dragHd;
  3133.         vw.setHdWidths();
  3134.         vw.refresh();
  3135.         setTimeout(function(){
  3136.             vw.disableHeaders = false;
  3137.         }, 100);
  3138.     }
  3139. });
  3140. Ext.ListView.ColumnResizer = Ext.list.ColumnResizer;
  3141. Ext.list.Sorter = Ext.extend(Ext.util.Observable, {
  3142.     
  3143.     sortClasses : ["sort-asc", "sort-desc"],
  3144.     constructor: function(config){
  3145.         Ext.apply(this, config);
  3146.         Ext.list.Sorter.superclass.constructor.call(this);
  3147.     },
  3148.     init : function(listView){
  3149.         this.view = listView;
  3150.         listView.on('render', this.initEvents, this);
  3151.     },
  3152.     initEvents : function(view){
  3153.         view.mon(view.innerHd, 'click', this.onHdClick, this);
  3154.         view.innerHd.setStyle('cursor', 'pointer');
  3155.         view.mon(view.store, 'datachanged', this.updateSortState, this);
  3156.         this.updateSortState.defer(10, this, [view.store]);
  3157.     },
  3158.     updateSortState : function(store){
  3159.         var state = store.getSortState();
  3160.         if(!state){
  3161.             return;
  3162.         }
  3163.         this.sortState = state;
  3164.         var cs = this.view.columns, sortColumn = -1;
  3165.         for(var i = 0, len = cs.length; i < len; i++){
  3166.             if(cs[i].dataIndex == state.field){
  3167.                 sortColumn = i;
  3168.                 break;
  3169.             }
  3170.         }
  3171.         if(sortColumn != -1){
  3172.             var sortDir = state.direction;
  3173.             this.updateSortIcon(sortColumn, sortDir);
  3174.         }
  3175.     },
  3176.     updateSortIcon : function(col, dir){
  3177.         var sc = this.sortClasses;
  3178.         var hds = this.view.innerHd.select('em').removeClass(sc);
  3179.         hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);
  3180.     },
  3181.     onHdClick : function(e){
  3182.         var hd = e.getTarget('em', 3);
  3183.         if(hd && !this.view.disableHeaders){
  3184.             var index = this.view.findHeaderIndex(hd);
  3185.             this.view.store.sort(this.view.columns[index].dataIndex);
  3186.         }
  3187.     }
  3188. });
  3189. Ext.ListView.Sorter = Ext.list.Sorter;
  3190. Ext.TabPanel = Ext.extend(Ext.Panel,  {
  3191.     
  3192.     
  3193.     
  3194.     monitorResize : true,
  3195.     
  3196.     deferredRender : true,
  3197.     
  3198.     tabWidth : 120,
  3199.     
  3200.     minTabWidth : 30,
  3201.     
  3202.     resizeTabs : false,
  3203.     
  3204.     enableTabScroll : false,
  3205.     
  3206.     scrollIncrement : 0,
  3207.     
  3208.     scrollRepeatInterval : 400,
  3209.     
  3210.     scrollDuration : 0.35,
  3211.     
  3212.     animScroll : true,
  3213.     
  3214.     tabPosition : 'top',
  3215.     
  3216.     baseCls : 'x-tab-panel',
  3217.     
  3218.     autoTabs : false,
  3219.     
  3220.     autoTabSelector : 'div.x-tab',
  3221.     
  3222.     activeTab : undefined,
  3223.     
  3224.     tabMargin : 2,
  3225.     
  3226.     plain : false,
  3227.     
  3228.     wheelIncrement : 20,
  3229.     
  3230.     idDelimiter : '__',
  3231.     
  3232.     itemCls : 'x-tab-item',
  3233.     
  3234.     elements : 'body',
  3235.     headerAsText : false,
  3236.     frame : false,
  3237.     hideBorders :true,
  3238.     
  3239.     initComponent : function(){
  3240.         this.frame = false;
  3241.         Ext.TabPanel.superclass.initComponent.call(this);
  3242.         this.addEvents(
  3243.             
  3244.             'beforetabchange',
  3245.             
  3246.             'tabchange',
  3247.             
  3248.             'contextmenu'
  3249.         );
  3250.         
  3251.         this.setLayout(new Ext.layout.CardLayout(Ext.apply({
  3252.             layoutOnCardChange: this.layoutOnTabChange,
  3253.             deferredRender: this.deferredRender
  3254.         }, this.layoutConfig)));
  3255.         if(this.tabPosition == 'top'){
  3256.             this.elements += ',header';
  3257.             this.stripTarget = 'header';
  3258.         }else {
  3259.             this.elements += ',footer';
  3260.             this.stripTarget = 'footer';
  3261.         }
  3262.         if(!this.stack){
  3263.             this.stack = Ext.TabPanel.AccessStack();
  3264.         }
  3265.         this.initItems();
  3266.     },
  3267.     
  3268.     onRender : function(ct, position){
  3269.         Ext.TabPanel.superclass.onRender.call(this, ct, position);
  3270.         if(this.plain){
  3271.             var pos = this.tabPosition == 'top' ? 'header' : 'footer';
  3272.             this[pos].addClass('x-tab-panel-'+pos+'-plain');
  3273.         }
  3274.         var st = this[this.stripTarget];
  3275.         this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{
  3276.             tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});
  3277.         var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);
  3278.         st.createChild({cls:'x-tab-strip-spacer'}, beforeEl);
  3279.         this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
  3280.         
  3281.         this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge', cn: [{tag: 'span', cls: 'x-tab-strip-text', cn: '&#160;'}]});
  3282.         this.strip.createChild({cls:'x-clear'});
  3283.         this.body.addClass('x-tab-panel-body-'+this.tabPosition);
  3284.         
  3285.         if(!this.itemTpl){
  3286.             var tt = new Ext.Template(
  3287.                  '<li class="{cls}" id="{id}"><a class="x-tab-strip-close"></a>',
  3288.                  '<a class="x-tab-right" href="#"><em class="x-tab-left">',
  3289.                  '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',
  3290.                  '</em></a></li>'
  3291.             );
  3292.             tt.disableFormats = true;
  3293.             tt.compile();
  3294.             Ext.TabPanel.prototype.itemTpl = tt;
  3295.         }
  3296.         this.items.each(this.initTab, this);
  3297.     },
  3298.     
  3299.     afterRender : function(){
  3300.         Ext.TabPanel.superclass.afterRender.call(this);
  3301.         if(this.autoTabs){
  3302.             this.readTabs(false);
  3303.         }
  3304.         if(this.activeTab !== undefined){
  3305.             var item = Ext.isObject(this.activeTab) ? this.activeTab : this.items.get(this.activeTab);
  3306.             delete this.activeTab;
  3307.             this.setActiveTab(item);
  3308.         }
  3309.     },
  3310.     
  3311.     initEvents : function(){
  3312.         Ext.TabPanel.superclass.initEvents.call(this);
  3313.         this.mon(this.strip, {
  3314.             scope: this,
  3315.             mousedown: this.onStripMouseDown,
  3316.             contextmenu: this.onStripContextMenu
  3317.         });
  3318.         if(this.enableTabScroll){
  3319.             this.mon(this.strip, 'mousewheel', this.onWheel, this);
  3320.         }
  3321.     },
  3322.     
  3323.     findTargets : function(e){
  3324.         var item = null;
  3325.         var itemEl = e.getTarget('li', this.strip);
  3326.         if(itemEl){
  3327.             item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);
  3328.             if(item.disabled){
  3329.                 return {
  3330.                     close : null,
  3331.                     item : null,
  3332.                     el : null
  3333.                 };
  3334.             }
  3335.         }
  3336.         return {
  3337.             close : e.getTarget('.x-tab-strip-close', this.strip),
  3338.             item : item,
  3339.             el : itemEl
  3340.         };
  3341.     },
  3342.     
  3343.     onStripMouseDown : function(e){
  3344.         if(e.button !== 0){
  3345.             return;
  3346.         }
  3347.         e.preventDefault();
  3348.         var t = this.findTargets(e);
  3349.         if(t.close){
  3350.             if (t.item.fireEvent('beforeclose', t.item) !== false) {
  3351.                 t.item.fireEvent('close', t.item);
  3352.                 this.remove(t.item);
  3353.             }
  3354.             return;
  3355.         }
  3356.         if(t.item && t.item != this.activeTab){
  3357.             this.setActiveTab(t.item);
  3358.         }
  3359.     },
  3360.     
  3361.     onStripContextMenu : function(e){
  3362.         e.preventDefault();
  3363.         var t = this.findTargets(e);
  3364.         if(t.item){
  3365.             this.fireEvent('contextmenu', this, t.item, e);
  3366.         }
  3367.     },
  3368.     
  3369.     readTabs : function(removeExisting){
  3370.         if(removeExisting === true){
  3371.             this.items.each(function(item){
  3372.                 this.remove(item);
  3373.             }, this);
  3374.         }
  3375.         var tabs = this.el.query(this.autoTabSelector);
  3376.         for(var i = 0, len = tabs.length; i < len; i++){
  3377.             var tab = tabs[i],
  3378.                 title = tab.getAttribute('title');
  3379.             tab.removeAttribute('title');
  3380.             this.add({
  3381.                 title: title,
  3382.                 contentEl: tab
  3383.             });
  3384.         }
  3385.     },
  3386.     
  3387.     initTab : function(item, index){
  3388.         var before = this.strip.dom.childNodes[index],
  3389.             p = this.getTemplateArgs(item),
  3390.             el = before ?
  3391.                  this.itemTpl.insertBefore(before, p) :
  3392.                  this.itemTpl.append(this.strip, p),
  3393.             cls = 'x-tab-strip-over',
  3394.             tabEl = Ext.get(el);
  3395.         tabEl.hover(function(){
  3396.             if(!item.disabled){
  3397.                 tabEl.addClass(cls);
  3398.             }
  3399.         }, function(){
  3400.             tabEl.removeClass(cls);
  3401.         });
  3402.         if(item.tabTip){
  3403.             tabEl.child('span.x-tab-strip-text', true).qtip = item.tabTip;
  3404.         }
  3405.         item.tabEl = el;
  3406.         
  3407.         tabEl.select('a').on('click', function(e){
  3408.             if(!e.getPageX()){
  3409.                 this.onStripMouseDown(e);
  3410.             }
  3411.         }, this, {preventDefault: true});
  3412.         item.on({
  3413.             scope: this,
  3414.             disable: this.onItemDisabled,
  3415.             enable: this.onItemEnabled,
  3416.             titlechange: this.onItemTitleChanged,
  3417.             iconchange: this.onItemIconChanged,
  3418.             beforeshow: this.onBeforeShowItem
  3419.         });
  3420.     },
  3421.     
  3422.     
  3423.     
  3424.     getTemplateArgs : function(item) {
  3425.         var cls = item.closable ? 'x-tab-strip-closable' : '';
  3426.         if(item.disabled){
  3427.             cls += ' x-item-disabled';
  3428.         }
  3429.         if(item.iconCls){
  3430.             cls += ' x-tab-with-icon';
  3431.         }
  3432.         if(item.tabCls){
  3433.             cls += ' ' + item.tabCls;
  3434.         }
  3435.         return {
  3436.             id: this.id + this.idDelimiter + item.getItemId(),
  3437.             text: item.title,
  3438.             cls: cls,
  3439.             iconCls: item.iconCls || ''
  3440.         };
  3441.     },
  3442.     
  3443.     onAdd : function(c){
  3444.         Ext.TabPanel.superclass.onAdd.call(this, c);
  3445.         if(this.rendered){
  3446.             var items = this.items;
  3447.             this.initTab(c, items.indexOf(c));
  3448.             if(items.getCount() == 1){
  3449.                 this.syncSize();
  3450.             }
  3451.             this.delegateUpdates();
  3452.         }
  3453.     },
  3454.     
  3455.     onBeforeAdd : function(item){
  3456.         var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);
  3457.         if(existing){
  3458.             this.setActiveTab(item);
  3459.             return false;
  3460.         }
  3461.         Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
  3462.         var es = item.elements;
  3463.         item.elements = es ? es.replace(',header', '') : es;
  3464.         item.border = (item.border === true);
  3465.     },
  3466.     
  3467.     onRemove : function(c){
  3468.         var te = Ext.get(c.tabEl);
  3469.         
  3470.         if(te){
  3471.             te.select('a').removeAllListeners();
  3472.             Ext.destroy(te);
  3473.         }
  3474.         Ext.TabPanel.superclass.onRemove.call(this, c);
  3475.         this.stack.remove(c);
  3476.         delete c.tabEl;
  3477.         c.un('disable', this.onItemDisabled, this);
  3478.         c.un('enable', this.onItemEnabled, this);
  3479.         c.un('titlechange', this.onItemTitleChanged, this);
  3480.         c.un('iconchange', this.onItemIconChanged, this);
  3481.         c.un('beforeshow', this.onBeforeShowItem, this);
  3482.         if(c == this.activeTab){
  3483.             var next = this.stack.next();
  3484.             if(next){
  3485.                 this.setActiveTab(next);
  3486.             }else if(this.items.getCount() > 0){
  3487.                 this.setActiveTab(0);
  3488.             }else{
  3489.                 this.setActiveTab(null);
  3490.             }
  3491.         }
  3492.         if(!this.destroying){
  3493.             this.delegateUpdates();
  3494.         }
  3495.     },
  3496.     
  3497.     onBeforeShowItem : function(item){
  3498.         if(item != this.activeTab){
  3499.             this.setActiveTab(item);
  3500.             return false;
  3501.         }
  3502.     },
  3503.     
  3504.     onItemDisabled : function(item){
  3505.         var el = this.getTabEl(item);
  3506.         if(el){
  3507.             Ext.fly(el).addClass('x-item-disabled');
  3508.         }
  3509.         this.stack.remove(item);
  3510.     },
  3511.     
  3512.     onItemEnabled : function(item){
  3513.         var el = this.getTabEl(item);
  3514.         if(el){
  3515.             Ext.fly(el).removeClass('x-item-disabled');
  3516.         }
  3517.     },
  3518.     
  3519.     onItemTitleChanged : function(item){
  3520.         var el = this.getTabEl(item);
  3521.         if(el){
  3522.             Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;
  3523.         }
  3524.     },
  3525.     
  3526.     onItemIconChanged : function(item, iconCls, oldCls){
  3527.         var el = this.getTabEl(item);
  3528.         if(el){
  3529.             el = Ext.get(el);
  3530.             el.child('span.x-tab-strip-text').replaceClass(oldCls, iconCls);
  3531.             el[Ext.isEmpty(iconCls) ? 'removeClass' : 'addClass']('x-tab-with-icon');
  3532.         }
  3533.     },
  3534.     
  3535.     getTabEl : function(item){
  3536.         var c = this.getComponent(item);
  3537.         return c ? c.tabEl : null;
  3538.     },
  3539.     
  3540.     onResize : function(){
  3541.         Ext.TabPanel.superclass.onResize.apply(this, arguments);
  3542.         this.delegateUpdates();
  3543.     },
  3544.     
  3545.     beginUpdate : function(){
  3546.         this.suspendUpdates = true;
  3547.     },
  3548.     
  3549.     endUpdate : function(){
  3550.         this.suspendUpdates = false;
  3551.         this.delegateUpdates();
  3552.     },
  3553.     
  3554.     hideTabStripItem : function(item){
  3555.         item = this.getComponent(item);
  3556.         var el = this.getTabEl(item);
  3557.         if(el){
  3558.             el.style.display = 'none';
  3559.             this.delegateUpdates();
  3560.         }
  3561.         this.stack.remove(item);
  3562.     },
  3563.     
  3564.     unhideTabStripItem : function(item){
  3565.         item = this.getComponent(item);
  3566.         var el = this.getTabEl(item);
  3567.         if(el){
  3568.             el.style.display = '';
  3569.             this.delegateUpdates();
  3570.         }
  3571.     },
  3572.     
  3573.     delegateUpdates : function(){
  3574.         if(this.suspendUpdates){
  3575.             return;
  3576.         }
  3577.         if(this.resizeTabs && this.rendered){
  3578.             this.autoSizeTabs();
  3579.         }
  3580.         if(this.enableTabScroll && this.rendered){
  3581.             this.autoScrollTabs();
  3582.         }
  3583.     },
  3584.     
  3585.     autoSizeTabs : function(){
  3586.         var count = this.items.length,
  3587.             ce = this.tabPosition != 'bottom' ? 'header' : 'footer',
  3588.             ow = this[ce].dom.offsetWidth,
  3589.             aw = this[ce].dom.clientWidth;
  3590.         if(!this.resizeTabs || count < 1 || !aw){ 
  3591.             return;
  3592.         }
  3593.         var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); 
  3594.         this.lastTabWidth = each;
  3595.         var lis = this.strip.query("li:not([className^=x-tab-edge])");
  3596.         for(var i = 0, len = lis.length; i < len; i++) {
  3597.             var li = lis[i],
  3598.                 inner = Ext.fly(li).child('.x-tab-strip-inner', true),
  3599.                 tw = li.offsetWidth,
  3600.                 iw = inner.offsetWidth;
  3601.             inner.style.width = (each - (tw-iw)) + 'px';
  3602.         }
  3603.     },
  3604.     
  3605.     adjustBodyWidth : function(w){
  3606.         if(this.header){
  3607.             this.header.setWidth(w);
  3608.         }
  3609.         if(this.footer){
  3610.             this.footer.setWidth(w);
  3611.         }
  3612.         return w;
  3613.     },
  3614.     
  3615.     setActiveTab : function(item){
  3616.         item = this.getComponent(item);
  3617.         if(this.fireEvent('beforetabchange', this, item, this.activeTab) === false){
  3618.             return;
  3619.         }
  3620.         if(!this.rendered){
  3621.             this.activeTab = item;
  3622.             return;
  3623.         }
  3624.         if(this.activeTab != item){
  3625.             if(this.activeTab){
  3626.                 var oldEl = this.getTabEl(this.activeTab);
  3627.                 if(oldEl){
  3628.                     Ext.fly(oldEl).removeClass('x-tab-strip-active');
  3629.                 }
  3630.             }
  3631.             if(item){
  3632.                 var el = this.getTabEl(item);
  3633.                 Ext.fly(el).addClass('x-tab-strip-active');
  3634.                 this.activeTab = item;
  3635.                 this.stack.add(item);
  3636.                 this.layout.setActiveItem(item);
  3637.                 if(this.scrolling){
  3638.                     this.scrollToTab(item, this.animScroll);
  3639.                 }
  3640.             }
  3641.             this.fireEvent('tabchange', this, item);
  3642.         }
  3643.     },
  3644.     
  3645.     getActiveTab : function(){
  3646.         return this.activeTab || null;
  3647.     },
  3648.     
  3649.     getItem : function(item){
  3650.         return this.getComponent(item);
  3651.     },
  3652.     
  3653.     autoScrollTabs : function(){
  3654.         this.pos = this.tabPosition=='bottom' ? this.footer : this.header;
  3655.         var count = this.items.length,
  3656.             ow = this.pos.dom.offsetWidth,
  3657.             tw = this.pos.dom.clientWidth,
  3658.             wrap = this.stripWrap,
  3659.             wd = wrap.dom,
  3660.             cw = wd.offsetWidth,
  3661.             pos = this.getScrollPos(),
  3662.             l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
  3663.         if(!this.enableTabScroll || count < 1 || cw < 20){ 
  3664.             return;
  3665.         }
  3666.         if(l <= tw){
  3667.             wd.scrollLeft = 0;
  3668.             wrap.setWidth(tw);
  3669.             if(this.scrolling){
  3670.                 this.scrolling = false;
  3671.                 this.pos.removeClass('x-tab-scrolling');
  3672.                 this.scrollLeft.hide();
  3673.                 this.scrollRight.hide();
  3674.                 
  3675.                 if(Ext.isAir || Ext.isWebKit){
  3676.                     wd.style.marginLeft = '';
  3677.                     wd.style.marginRight = '';
  3678.                 }
  3679.             }
  3680.         }else{
  3681.             if(!this.scrolling){
  3682.                 this.pos.addClass('x-tab-scrolling');
  3683.                 
  3684.                 if(Ext.isAir || Ext.isWebKit){
  3685.                     wd.style.marginLeft = '18px';
  3686.                     wd.style.marginRight = '18px';
  3687.                 }
  3688.             }
  3689.             tw -= wrap.getMargins('lr');
  3690.             wrap.setWidth(tw > 20 ? tw : 20);
  3691.             if(!this.scrolling){
  3692.                 if(!this.scrollLeft){
  3693.                     this.createScrollers();
  3694.                 }else{
  3695.                     this.scrollLeft.show();
  3696.                     this.scrollRight.show();
  3697.                 }
  3698.             }
  3699.             this.scrolling = true;
  3700.             if(pos > (l-tw)){ 
  3701.                 wd.scrollLeft = l-tw;
  3702.             }else{ 
  3703.                 this.scrollToTab(this.activeTab, false);
  3704.             }
  3705.             this.updateScrollButtons();
  3706.         }
  3707.     },
  3708.     
  3709.     createScrollers : function(){
  3710.         this.pos.addClass('x-tab-scrolling-' + this.tabPosition);
  3711.         var h = this.stripWrap.dom.offsetHeight;
  3712.         
  3713.         var sl = this.pos.insertFirst({
  3714.             cls:'x-tab-scroller-left'
  3715.         });
  3716.         sl.setHeight(h);
  3717.         sl.addClassOnOver('x-tab-scroller-left-over');
  3718.         this.leftRepeater = new Ext.util.ClickRepeater(sl, {
  3719.             interval : this.scrollRepeatInterval,
  3720.             handler: this.onScrollLeft,
  3721.             scope: this
  3722.         });
  3723.         this.scrollLeft = sl;
  3724.         
  3725.         var sr = this.pos.insertFirst({
  3726.             cls:'x-tab-scroller-right'
  3727.         });
  3728.         sr.setHeight(h);
  3729.         sr.addClassOnOver('x-tab-scroller-right-over');
  3730.         this.rightRepeater = new Ext.util.ClickRepeater(sr, {
  3731.             interval : this.scrollRepeatInterval,
  3732.             handler: this.onScrollRight,
  3733.             scope: this
  3734.         });
  3735.         this.scrollRight = sr;
  3736.     },
  3737.     
  3738.     getScrollWidth : function(){
  3739.         return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
  3740.     },
  3741.     
  3742.     getScrollPos : function(){
  3743.         return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
  3744.     },
  3745.     
  3746.     getScrollArea : function(){
  3747.         return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
  3748.     },
  3749.     
  3750.     getScrollAnim : function(){
  3751.         return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};
  3752.     },
  3753.     
  3754.     getScrollIncrement : function(){
  3755.         return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);
  3756.     },
  3757.     
  3758.     scrollToTab : function(item, animate){
  3759.         if(!item){ 
  3760.             return; 
  3761.         }
  3762.         var el = this.getTabEl(item),
  3763.             pos = this.getScrollPos(), 
  3764.             area = this.getScrollArea(),
  3765.             left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos,
  3766.             right = left + el.offsetWidth;
  3767.         if(left < pos){
  3768.             this.scrollTo(left, animate);
  3769.         }else if(right > (pos + area)){
  3770.             this.scrollTo(right - area, animate);
  3771.         }
  3772.     },
  3773.     
  3774.     scrollTo : function(pos, animate){
  3775.         this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
  3776.         if(!animate){
  3777.             this.updateScrollButtons();
  3778.         }
  3779.     },
  3780.     onWheel : function(e){
  3781.         var d = e.getWheelDelta()*this.wheelIncrement*-1;
  3782.         e.stopEvent();
  3783.         var pos = this.getScrollPos(),
  3784.             newpos = pos + d,
  3785.             sw = this.getScrollWidth()-this.getScrollArea();
  3786.         var s = Math.max(0, Math.min(sw, newpos));
  3787.         if(s != pos){
  3788.             this.scrollTo(s, false);
  3789.         }
  3790.     },
  3791.     
  3792.     onScrollRight : function(){
  3793.         var sw = this.getScrollWidth()-this.getScrollArea(),
  3794.             pos = this.getScrollPos(),
  3795.             s = Math.min(sw, pos + this.getScrollIncrement());
  3796.         if(s != pos){
  3797.             this.scrollTo(s, this.animScroll);
  3798.         }
  3799.     },
  3800.     
  3801.     onScrollLeft : function(){
  3802.         var pos = this.getScrollPos(),
  3803.             s = Math.max(0, pos - this.getScrollIncrement());
  3804.         if(s != pos){
  3805.             this.scrollTo(s, this.animScroll);
  3806.         }
  3807.     },
  3808.     
  3809.     updateScrollButtons : function(){
  3810.         var pos = this.getScrollPos();
  3811.         this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');
  3812.         this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');
  3813.     },
  3814.     
  3815.     beforeDestroy : function() {
  3816.         Ext.destroy(this.leftRepeater, this.rightRepeater);
  3817.         this.deleteMembers('strip', 'edge', 'scrollLeft', 'scrollRight', 'stripWrap');
  3818.         this.activeTab = null;
  3819.         Ext.TabPanel.superclass.beforeDestroy.apply(this);
  3820.     }
  3821.     
  3822.     
  3823.     
  3824.     
  3825.     
  3826.     
  3827.     
  3828.     
  3829.     
  3830.     
  3831.     
  3832.     
  3833. });
  3834. Ext.reg('tabpanel', Ext.TabPanel);
  3835. Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
  3836. Ext.TabPanel.AccessStack = function(){
  3837.     var items = [];
  3838.     return {
  3839.         add : function(item){
  3840.             items.push(item);
  3841.             if(items.length > 10){
  3842.                 items.shift();
  3843.             }
  3844.         },
  3845.         remove : function(item){
  3846.             var s = [];
  3847.             for(var i = 0, len = items.length; i < len; i++) {
  3848.                 if(items[i] != item){
  3849.                     s.push(items[i]);
  3850.                 }
  3851.             }
  3852.             items = s;
  3853.         },
  3854.         next : function(){
  3855.             return items.pop();
  3856.         }
  3857.     };
  3858. };
  3859. Ext.Button = Ext.extend(Ext.BoxComponent, {
  3860.     
  3861.     hidden : false,
  3862.     
  3863.     disabled : false,
  3864.     
  3865.     pressed : false,
  3866.     
  3867.     
  3868.     
  3869.     enableToggle : false,
  3870.     
  3871.     
  3872.     
  3873.     menuAlign : 'tl-bl?',
  3874.     
  3875.     
  3876.     
  3877.     type : 'button',
  3878.     
  3879.     menuClassTarget : 'tr:nth(2)',
  3880.     
  3881.     clickEvent : 'click',
  3882.     
  3883.     handleMouseEvents : true,
  3884.     
  3885.     tooltipType : 'qtip',
  3886.     
  3887.     buttonSelector : 'button:first-child',
  3888.     
  3889.     scale : 'small',
  3890.     
  3891.     
  3892.     iconAlign : 'left',
  3893.     
  3894.     arrowAlign : 'right',
  3895.     
  3896.     
  3897.     
  3898.     initComponent : function(){
  3899.         Ext.Button.superclass.initComponent.call(this);
  3900.         this.addEvents(
  3901.             
  3902.             'click',
  3903.             
  3904.             'toggle',
  3905.             
  3906.             'mouseover',
  3907.             
  3908.             'mouseout',
  3909.             
  3910.             'menushow',
  3911.             
  3912.             'menuhide',
  3913.             
  3914.             'menutriggerover',
  3915.             
  3916.             'menutriggerout'
  3917.         );
  3918.         if(this.menu){
  3919.             this.menu = Ext.menu.MenuMgr.get(this.menu);
  3920.         }
  3921.         if(Ext.isString(this.toggleGroup)){
  3922.             this.enableToggle = true;
  3923.         }
  3924.     },
  3925.     getTemplateArgs : function(){
  3926.         return [this.type, 'x-btn-' + this.scale + ' x-btn-icon-' + this.scale + '-' + this.iconAlign, this.getMenuClass(), this.cls, this.id];
  3927.     },
  3928.     
  3929.     setButtonClass : function(){
  3930.         if(this.useSetClass){
  3931.             if(!Ext.isEmpty(this.oldCls)){
  3932.                 this.el.removeClass([this.oldCls, 'x-btn-pressed']);
  3933.             }
  3934.             this.oldCls = (this.iconCls || this.icon) ? (this.text ? ' x-btn-text-icon' : ' x-btn-icon') : ' x-btn-noicon';
  3935.             this.el.addClass([this.oldCls, this.pressed ? 'x-btn-pressed' : null]);
  3936.         }
  3937.     },
  3938.     
  3939.     getMenuClass : function(){
  3940.         return this.menu ? (this.arrowAlign != 'bottom' ? 'x-btn-arrow' : 'x-btn-arrow-bottom') : '';
  3941.     },
  3942.     
  3943.     onRender : function(ct, position){
  3944.         if(!this.template){
  3945.             if(!Ext.Button.buttonTemplate){
  3946.                 
  3947.                 Ext.Button.buttonTemplate = new Ext.Template(
  3948.                     '<table id="{4}" cellspacing="0" class="x-btn {3}"><tbody class="{1}">',
  3949.                     '<tr><td class="x-btn-tl"><i>&#160;</i></td><td class="x-btn-tc"></td><td class="x-btn-tr"><i>&#160;</i></td></tr>',
  3950.                     '<tr><td class="x-btn-ml"><i>&#160;</i></td><td class="x-btn-mc"><em class="{2}" unselectable="on"><button type="{0}"></button></em></td><td class="x-btn-mr"><i>&#160;</i></td></tr>',
  3951.                     '<tr><td class="x-btn-bl"><i>&#160;</i></td><td class="x-btn-bc"></td><td class="x-btn-br"><i>&#160;</i></td></tr>',
  3952.                     '</tbody></table>');
  3953.                 Ext.Button.buttonTemplate.compile();
  3954.             }
  3955.             this.template = Ext.Button.buttonTemplate;
  3956.         }
  3957.         var btn, targs = this.getTemplateArgs();
  3958.         if(position){
  3959.             btn = this.template.insertBefore(position, targs, true);
  3960.         }else{
  3961.             btn = this.template.append(ct, targs, true);
  3962.         }
  3963.         
  3964.         this.btnEl = btn.child(this.buttonSelector);
  3965.         this.mon(this.btnEl, {
  3966.             scope: this,
  3967.             focus: this.onFocus,
  3968.             blur: this.onBlur
  3969.         });
  3970.         this.initButtonEl(btn, this.btnEl);
  3971.         Ext.ButtonToggleMgr.register(this);
  3972.     },
  3973.     
  3974.     initButtonEl : function(btn, btnEl){
  3975.         this.el = btn;
  3976.         this.setIcon(this.icon);
  3977.         this.setText(this.text);
  3978.         this.setIconClass(this.iconCls);
  3979.         if(Ext.isDefined(this.tabIndex)){
  3980.             btnEl.dom.tabIndex = this.tabIndex;
  3981.         }
  3982.         if(this.tooltip){
  3983.             this.setTooltip(this.tooltip, true);
  3984.         }
  3985.         if(this.handleMouseEvents){
  3986.             this.mon(btn, {
  3987.                 scope: this,
  3988.                 mouseover: this.onMouseOver,
  3989.                 mousedown: this.onMouseDown
  3990.             });
  3991.             
  3992.             
  3993.         }
  3994.         if(this.menu){
  3995.             this.mon(this.menu, {
  3996.                 scope: this,
  3997.                 show: this.onMenuShow,
  3998.                 hide: this.onMenuHide
  3999.             });
  4000.         }
  4001.         if(this.repeat){
  4002.             var repeater = new Ext.util.ClickRepeater(btn, Ext.isObject(this.repeat) ? this.repeat : {});
  4003.             this.mon(repeater, 'click', this.onClick, this);
  4004.         }
  4005.         this.mon(btn, this.clickEvent, this.onClick, this);
  4006.     },
  4007.     
  4008.     afterRender : function(){
  4009.         Ext.Button.superclass.afterRender.call(this);
  4010.         this.useSetClass = true;
  4011.         this.setButtonClass();
  4012.         this.doc = Ext.getDoc();
  4013.         this.doAutoWidth();
  4014.     },
  4015.     
  4016.     setIconClass : function(cls){
  4017.         this.iconCls = cls;
  4018.         if(this.el){
  4019.             this.btnEl.dom.className = '';
  4020.             this.btnEl.addClass(['x-btn-text', cls || '']);
  4021.             this.setButtonClass();
  4022.         }
  4023.         return this;
  4024.     },
  4025.     
  4026.     setTooltip : function(tooltip,  initial){
  4027.         if(this.rendered){
  4028.             if(!initial){
  4029.                 this.clearTip();
  4030.             }
  4031.             if(Ext.isObject(tooltip)){
  4032.                 Ext.QuickTips.register(Ext.apply({
  4033.                       target: this.btnEl.id
  4034.                 }, tooltip));
  4035.                 this.tooltip = tooltip;
  4036.             }else{
  4037.                 this.btnEl.dom[this.tooltipType] = tooltip;
  4038.             }
  4039.         }else{
  4040.             this.tooltip = tooltip;
  4041.         }
  4042.         return this;
  4043.     },
  4044.     
  4045.     clearTip : function(){
  4046.         if(Ext.isObject(this.tooltip)){
  4047.             Ext.QuickTips.unregister(this.btnEl);
  4048.         }
  4049.     },
  4050.     
  4051.     beforeDestroy : function(){
  4052.         if(this.rendered){
  4053.             this.clearTip();
  4054.         }
  4055.         if(this.menu && this.menu.autoDestroy) {
  4056.             Ext.destroy(this.menu);
  4057.         }
  4058.         Ext.destroy(this.repeater);
  4059.     },
  4060.     
  4061.     onDestroy : function(){
  4062.         if(this.rendered){
  4063.             this.doc.un('mouseover', this.monitorMouseOver, this);
  4064.             this.doc.un('mouseup', this.onMouseUp, this);
  4065.             delete this.doc;
  4066.             delete this.btnEl;
  4067.             Ext.ButtonToggleMgr.unregister(this);
  4068.         }
  4069.     },
  4070.