ext-all-debug.js
上传用户:chliyg
上传日期:2016-05-15
资源大小:3196k
文件大小:951k
源码类别:

Jsp/Servlet

开发平台:

Java

  1.         cssClass = cssClass || this.dropNotAllowed;
  2.         if(this.dropStatus != cssClass){
  3.             this.el.replaceClass(this.dropStatus, cssClass);
  4.             this.dropStatus = cssClass;
  5.         }
  6.     },
  7.     
  8.     reset : function(clearGhost){
  9.         this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
  10.         this.dropStatus = this.dropNotAllowed;
  11.         if(clearGhost){
  12.             this.ghost.update("");
  13.         }
  14.     },
  15.     
  16.     update : function(html){
  17.         if(typeof html == "string"){
  18.             this.ghost.update(html);
  19.         }else{
  20.             this.ghost.update("");
  21.             html.style.margin = "0";
  22.             this.ghost.dom.appendChild(html);
  23.         }
  24.         var el = this.ghost.dom.firstChild; 
  25.         if(el){
  26.             Ext.fly(el).setStyle(Ext.isIE ? 'styleFloat' : 'cssFloat', 'none');
  27.         }
  28.     },
  29.     
  30.     getEl : function(){
  31.         return this.el;
  32.     },
  33.     
  34.     getGhost : function(){
  35.         return this.ghost;
  36.     },
  37.     
  38.     hide : function(clear){
  39.         this.el.hide();
  40.         if(clear){
  41.             this.reset(true);
  42.         }
  43.     },
  44.     
  45.     stop : function(){
  46.         if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
  47.             this.anim.stop();
  48.         }
  49.     },
  50.     
  51.     show : function(){
  52.         this.el.show();
  53.     },
  54.     
  55.     sync : function(){
  56.         this.el.sync();
  57.     },
  58.     
  59.     repair : function(xy, callback, scope){
  60.         this.callback = callback;
  61.         this.scope = scope;
  62.         if(xy && this.animRepair !== false){
  63.             this.el.addClass("x-dd-drag-repair");
  64.             this.el.hideUnders(true);
  65.             this.anim = this.el.shift({
  66.                 duration: this.repairDuration || .5,
  67.                 easing: 'easeOut',
  68.                 xy: xy,
  69.                 stopFx: true,
  70.                 callback: this.afterRepair,
  71.                 scope: this
  72.             });
  73.         }else{
  74.             this.afterRepair();
  75.         }
  76.     },
  77.          afterRepair : function(){
  78.         this.hide(true);
  79.         if(typeof this.callback == "function"){
  80.             this.callback.call(this.scope || this);
  81.         }
  82.         this.callback = null;
  83.         this.scope = null;
  84.     }
  85. };
  86. Ext.dd.DragSource = function(el, config){
  87.     this.el = Ext.get(el);
  88.     if(!this.dragData){
  89.         this.dragData = {};
  90.     }
  91.     
  92.     Ext.apply(this, config);
  93.     
  94.     if(!this.proxy){
  95.         this.proxy = new Ext.dd.StatusProxy();
  96.     }
  97.     Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, 
  98.           {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});
  99.     
  100.     this.dragging = false;
  101. };
  102. Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
  103.     
  104.     
  105.     dropAllowed : "x-dd-drop-ok",
  106.     
  107.     dropNotAllowed : "x-dd-drop-nodrop",
  108.     
  109.     getDragData : function(e){
  110.         return this.dragData;
  111.     },
  112.          onDragEnter : function(e, id){
  113.         var target = Ext.dd.DragDropMgr.getDDById(id);
  114.         this.cachedTarget = target;
  115.         if(this.beforeDragEnter(target, e, id) !== false){
  116.             if(target.isNotifyTarget){
  117.                 var status = target.notifyEnter(this, e, this.dragData);
  118.                 this.proxy.setStatus(status);
  119.             }else{
  120.                 this.proxy.setStatus(this.dropAllowed);
  121.             }
  122.             
  123.             if(this.afterDragEnter){
  124.                 
  125.                 this.afterDragEnter(target, e, id);
  126.             }
  127.         }
  128.     },
  129.     
  130.     beforeDragEnter : function(target, e, id){
  131.         return true;
  132.     },
  133.          alignElWithMouse: function() {
  134.         Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
  135.         this.proxy.sync();
  136.     },
  137.          onDragOver : function(e, id){
  138.         var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
  139.         if(this.beforeDragOver(target, e, id) !== false){
  140.             if(target.isNotifyTarget){
  141.                 var status = target.notifyOver(this, e, this.dragData);
  142.                 this.proxy.setStatus(status);
  143.             }
  144.             if(this.afterDragOver){
  145.                 
  146.                 this.afterDragOver(target, e, id);
  147.             }
  148.         }
  149.     },
  150.     
  151.     beforeDragOver : function(target, e, id){
  152.         return true;
  153.     },
  154.          onDragOut : function(e, id){
  155.         var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
  156.         if(this.beforeDragOut(target, e, id) !== false){
  157.             if(target.isNotifyTarget){
  158.                 target.notifyOut(this, e, this.dragData);
  159.             }
  160.             this.proxy.reset();
  161.             if(this.afterDragOut){
  162.                 
  163.                 this.afterDragOut(target, e, id);
  164.             }
  165.         }
  166.         this.cachedTarget = null;
  167.     },
  168.     
  169.     beforeDragOut : function(target, e, id){
  170.         return true;
  171.     },
  172.     
  173.          onDragDrop : function(e, id){
  174.         var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
  175.         if(this.beforeDragDrop(target, e, id) !== false){
  176.             if(target.isNotifyTarget){
  177.                 if(target.notifyDrop(this, e, this.dragData)){                      this.onValidDrop(target, e, id);
  178.                 }else{
  179.                     this.onInvalidDrop(target, e, id);
  180.                 }
  181.             }else{
  182.                 this.onValidDrop(target, e, id);
  183.             }
  184.             
  185.             if(this.afterDragDrop){
  186.                 
  187.                 this.afterDragDrop(target, e, id);
  188.             }
  189.         }
  190.         delete this.cachedTarget;
  191.     },
  192.     
  193.     beforeDragDrop : function(target, e, id){
  194.         return true;
  195.     },
  196.          onValidDrop : function(target, e, id){
  197.         this.hideProxy();
  198.         if(this.afterValidDrop){
  199.             
  200.             this.afterValidDrop(target, e, id);
  201.         }
  202.     },
  203.          getRepairXY : function(e, data){
  204.         return this.el.getXY();  
  205.     },
  206.          onInvalidDrop : function(target, e, id){
  207.         this.beforeInvalidDrop(target, e, id);
  208.         if(this.cachedTarget){
  209.             if(this.cachedTarget.isNotifyTarget){
  210.                 this.cachedTarget.notifyOut(this, e, this.dragData);
  211.             }
  212.             this.cacheTarget = null;
  213.         }
  214.         this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
  215.         if(this.afterInvalidDrop){
  216.             
  217.             this.afterInvalidDrop(e, id);
  218.         }
  219.     },
  220.          afterRepair : function(){
  221.         if(Ext.enableFx){
  222.             this.el.highlight(this.hlColor || "c3daf9");
  223.         }
  224.         this.dragging = false;
  225.     },
  226.     
  227.     beforeInvalidDrop : function(target, e, id){
  228.         return true;
  229.     },
  230.          handleMouseDown : function(e){
  231.         if(this.dragging) {
  232.             return;
  233.         }
  234.         var data = this.getDragData(e);
  235.         if(data && this.onBeforeDrag(data, e) !== false){
  236.             this.dragData = data;
  237.             this.proxy.stop();
  238.             Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);
  239.         } 
  240.     },
  241.     
  242.     onBeforeDrag : function(data, e){
  243.         return true;
  244.     },
  245.     
  246.     onStartDrag : Ext.emptyFn,
  247.          startDrag : function(x, y){
  248.         this.proxy.reset();
  249.         this.dragging = true;
  250.         this.proxy.update("");
  251.         this.onInitDrag(x, y);
  252.         this.proxy.show();
  253.     },
  254.          onInitDrag : function(x, y){
  255.         var clone = this.el.dom.cloneNode(true);
  256.         clone.id = Ext.id();          this.proxy.update(clone);
  257.         this.onStartDrag(x, y);
  258.         return true;
  259.     },
  260.     
  261.     getProxy : function(){
  262.         return this.proxy;  
  263.     },
  264.     
  265.     hideProxy : function(){
  266.         this.proxy.hide();  
  267.         this.proxy.reset(true);
  268.         this.dragging = false;
  269.     },
  270.          triggerCacheRefresh : function(){
  271.         Ext.dd.DDM.refreshCache(this.groups);
  272.     },
  273.          b4EndDrag: function(e) {
  274.     },
  275.          endDrag : function(e){
  276.         this.onEndDrag(this.dragData, e);
  277.     },
  278.          onEndDrag : function(data, e){
  279.     },
  280.     
  281.          autoOffset : function(x, y) {
  282.         this.setDelta(-12, -20);
  283.     }    
  284. });
  285. Ext.dd.DropTarget = function(el, config){
  286.     this.el = Ext.get(el);
  287.     
  288.     Ext.apply(this, config);
  289.     
  290.     if(this.containerScroll){
  291.         Ext.dd.ScrollManager.register(this.el);
  292.     }
  293.     
  294.     Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, 
  295.           {isTarget: true});
  296. };
  297. Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {
  298.     
  299.     
  300.     
  301.     dropAllowed : "x-dd-drop-ok",
  302.     
  303.     dropNotAllowed : "x-dd-drop-nodrop",
  304.          isTarget : true,
  305.          isNotifyTarget : true,
  306.     
  307.     notifyEnter : function(dd, e, data){
  308.         if(this.overClass){
  309.             this.el.addClass(this.overClass);
  310.         }
  311.         return this.dropAllowed;
  312.     },
  313.     
  314.     notifyOver : function(dd, e, data){
  315.         return this.dropAllowed;
  316.     },
  317.     
  318.     notifyOut : function(dd, e, data){
  319.         if(this.overClass){
  320.             this.el.removeClass(this.overClass);
  321.         }
  322.     },
  323.     
  324.     notifyDrop : function(dd, e, data){
  325.         return false;
  326.     }
  327. });
  328. Ext.dd.DragZone = function(el, config){
  329.     Ext.dd.DragZone.superclass.constructor.call(this, el, config);
  330.     if(this.containerScroll){
  331.         Ext.dd.ScrollManager.register(this.el);
  332.     }
  333. };
  334. Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {
  335.     
  336.     
  337.     
  338.     getDragData : function(e){
  339.         return Ext.dd.Registry.getHandleFromEvent(e);
  340.     },
  341.     
  342.     
  343.     onInitDrag : function(x, y){
  344.         this.proxy.update(this.dragData.ddel.cloneNode(true));
  345.         this.onStartDrag(x, y);
  346.         return true;
  347.     },
  348.     
  349.     
  350.     afterRepair : function(){
  351.         if(Ext.enableFx){
  352.             Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
  353.         }
  354.         this.dragging = false;
  355.     },
  356.     
  357.     getRepairXY : function(e){
  358.         return Ext.Element.fly(this.dragData.ddel).getXY();  
  359.     }
  360. });
  361. Ext.dd.DropZone = function(el, config){
  362.     Ext.dd.DropZone.superclass.constructor.call(this, el, config);
  363. };
  364. Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
  365.     
  366.     getTargetFromEvent : function(e){
  367.         return Ext.dd.Registry.getTargetFromEvent(e);
  368.     },
  369.     
  370.     onNodeEnter : function(n, dd, e, data){
  371.         
  372.     },
  373.     
  374.     onNodeOver : function(n, dd, e, data){
  375.         return this.dropAllowed;
  376.     },
  377.     
  378.     onNodeOut : function(n, dd, e, data){
  379.         
  380.     },
  381.     
  382.     onNodeDrop : function(n, dd, e, data){
  383.         return false;
  384.     },
  385.     
  386.     onContainerOver : function(dd, e, data){
  387.         return this.dropNotAllowed;
  388.     },
  389.     
  390.     onContainerDrop : function(dd, e, data){
  391.         return false;
  392.     },
  393.     
  394.     notifyEnter : function(dd, e, data){
  395.         return this.dropNotAllowed;
  396.     },
  397.     
  398.     notifyOver : function(dd, e, data){
  399.         var n = this.getTargetFromEvent(e);
  400.         if(!n){              if(this.lastOverNode){
  401.                 this.onNodeOut(this.lastOverNode, dd, e, data);
  402.                 this.lastOverNode = null;
  403.             }
  404.             return this.onContainerOver(dd, e, data);
  405.         }
  406.         if(this.lastOverNode != n){
  407.             if(this.lastOverNode){
  408.                 this.onNodeOut(this.lastOverNode, dd, e, data);
  409.             }
  410.             this.onNodeEnter(n, dd, e, data);
  411.             this.lastOverNode = n;
  412.         }
  413.         return this.onNodeOver(n, dd, e, data);
  414.     },
  415.     
  416.     notifyOut : function(dd, e, data){
  417.         if(this.lastOverNode){
  418.             this.onNodeOut(this.lastOverNode, dd, e, data);
  419.             this.lastOverNode = null;
  420.         }
  421.     },
  422.     
  423.     notifyDrop : function(dd, e, data){
  424.         if(this.lastOverNode){
  425.             this.onNodeOut(this.lastOverNode, dd, e, data);
  426.             this.lastOverNode = null;
  427.         }
  428.         var n = this.getTargetFromEvent(e);
  429.         return n ?
  430.             this.onNodeDrop(n, dd, e, data) :
  431.             this.onContainerDrop(dd, e, data);
  432.     },
  433.          triggerCacheRefresh : function(){
  434.         Ext.dd.DDM.refreshCache(this.groups);
  435.     }  
  436. });
  437. Ext.data.SortTypes = {
  438.     
  439.     none : function(s){
  440.         return s;
  441.     },
  442.     
  443.     
  444.     stripTagsRE : /</?[^>]+>/gi,
  445.     
  446.     
  447.     asText : function(s){
  448.         return String(s).replace(this.stripTagsRE, "");
  449.     },
  450.     
  451.     
  452.     asUCText : function(s){
  453.         return String(s).toUpperCase().replace(this.stripTagsRE, "");
  454.     },
  455.     
  456.     
  457.     asUCString : function(s) {
  458.      return String(s).toUpperCase();
  459.     },
  460.     
  461.     
  462.     asDate : function(s) {
  463.         if(!s){
  464.             return 0;
  465.         }
  466.         if(Ext.isDate(s)){
  467.             return s.getTime();
  468.         }
  469.      return Date.parse(String(s));
  470.     },
  471.     
  472.     
  473.     asFloat : function(s) {
  474.      var val = parseFloat(String(s).replace(/,/g, ""));
  475.         if(isNaN(val)) val = 0;
  476.      return val;
  477.     },
  478.     
  479.     
  480.     asInt : function(s) {
  481.         var val = parseInt(String(s).replace(/,/g, ""));
  482.         if(isNaN(val)) val = 0;
  483.      return val;
  484.     }
  485. }; Ext.data.Record = function(data, id){     this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID;     this.data = data; }; Ext.data.Record.create = function(o){     var f = Ext.extend(Ext.data.Record, {}); var p = f.prototype;     p.fields = new Ext.util.MixedCollection(false, function(field){         return field.name;     });     for(var i = 0, len = o.length; i < len; i++){         p.fields.add(new Ext.data.Field(o[i]));     }     f.getField = function(name){         return p.fields.get(name);     };     return f; }; Ext.data.Record.AUTO_ID = 1000; Ext.data.Record.EDIT = 'edit'; Ext.data.Record.REJECT = 'reject'; Ext.data.Record.COMMIT = 'commit'; Ext.data.Record.prototype = {               dirty : false,     editing : false,     error: null,          modified: null,         join : function(store){         this.store = store;     },          set : function(name, value){         if(String(this.data[name]) == String(value)){             return;         }         this.dirty = true;         if(!this.modified){             this.modified = {};         }         if(typeof this.modified[name] == 'undefined'){             this.modified[name] = this.data[name];         }         this.data[name] = value;         if(!this.editing && this.store){             this.store.afterEdit(this);         }     },          get : function(name){         return this.data[name];     },          beginEdit : function(){         this.editing = true;         this.modified = {};     },          cancelEdit : function(){         this.editing = false;         delete this.modified;     },          endEdit : function(){         this.editing = false;         if(this.dirty && this.store){             this.store.afterEdit(this);         }     },          reject : function(silent){         var m = this.modified;         for(var n in m){             if(typeof m[n] != "function"){                 this.data[n] = m[n];             }         }         this.dirty = false;         delete this.modified;         this.editing = false;         if(this.store && silent !== true){             this.store.afterReject(this);         }     },          commit : function(silent){         this.dirty = false;         delete this.modified;         this.editing = false;         if(this.store && silent !== true){             this.store.afterCommit(this);         }     },          getChanges : function(){         var m = this.modified, cs = {};         for(var n in m){             if(m.hasOwnProperty(n)){                 cs[n] = this.data[n];             }         }         return cs;     },         hasError : function(){         return this.error != null;     },         clearError : function(){         this.error = null;     },          copy : function(newId) {         return new this.constructor(Ext.apply({}, this.data), newId || this.id);     },          isModified : function(fieldName){         return !!(this.modified && this.modified.hasOwnProperty(fieldName));     } }; Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {               register : function(){         for(var i = 0, s; s = arguments[i]; i++){             this.add(s);         }     },          unregister : function(){         for(var i = 0, s; s = arguments[i]; i++){             this.remove(this.lookup(s));         }     },          lookup : function(id){         return typeof id == "object" ? id : this.get(id);     },         getKey : function(o){          return o.storeId || o.id;     } }); Ext.data.Store = function(config){     this.data = new Ext.util.MixedCollection(false);     this.data.getKey = function(o){         return o.id;     };          this.baseParams = {};         this.paramNames = {         "start" : "start",         "limit" : "limit",         "sort" : "sort",         "dir" : "dir"     };     if(config && config.data){         this.inlineData = config.data;         delete config.data;     }     Ext.apply(this, config);     if(this.url && !this.proxy){         this.proxy = new Ext.data.HttpProxy({url: this.url});     }     if(this.reader){         if(!this.recordType){             this.recordType = this.reader.recordType;         }         if(this.reader.onMetaChange){             this.reader.onMetaChange = this.onMetaChange.createDelegate(this);         }     }     if(this.recordType){         this.fields = this.recordType.prototype.fields;     }     this.modified = [];     this.addEvents(                  'datachanged',                  'metachange',                  'add',                  'remove',                  'update',                  'clear',                  'beforeload',                  'load',                  'loadexception'     );     if(this.proxy){         this.relayEvents(this.proxy,  ["loadexception"]);     }     this.sortToggle = {}; if(this.sortInfo){ this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction); }     Ext.data.Store.superclass.constructor.call(this);     if(this.storeId || this.id){         Ext.StoreMgr.register(this);     }     if(this.inlineData){         this.loadData(this.inlineData);         delete this.inlineData;     }else if(this.autoLoad){         this.load.defer(10, this, [             typeof this.autoLoad == 'object' ?                 this.autoLoad : undefined]);     } }; Ext.extend(Ext.data.Store, Ext.util.Observable, {                                                  remoteSort : false,          pruneModifiedRecords : false,         lastOptions : null,     destroy : function(){         if(this.id){             Ext.StoreMgr.unregister(this);         }         this.data = null;         this.purgeListeners();     },          add : function(records){         records = [].concat(records);         if(records.length < 1){             return;         }         for(var i = 0, len = records.length; i < len; i++){             records[i].join(this);         }         var index = this.data.length;         this.data.addAll(records);         if(this.snapshot){             this.snapshot.addAll(records);         }         this.fireEvent("add", this, records, index);     },          addSorted : function(record){         var index = this.findInsertIndex(record);         this.insert(index, record);     },          remove : function(record){         var index = this.data.indexOf(record);         this.data.removeAt(index);         if(this.pruneModifiedRecords){             this.modified.remove(record);         }         if(this.snapshot){             this.snapshot.remove(record);         }         this.fireEvent("remove", this, record, index);     },          removeAll : function(){         this.data.clear();         if(this.snapshot){             this.snapshot.clear();         }         if(this.pruneModifiedRecords){             this.modified = [];         }         this.fireEvent("clear", this);     },          insert : function(index, records){         records = [].concat(records);         for(var i = 0, len = records.length; i < len; i++){             this.data.insert(index, records[i]);             records[i].join(this);         }         this.fireEvent("add", this, records, index);     },          indexOf : function(record){         return this.data.indexOf(record);     },          indexOfId : function(id){         return this.data.indexOfKey(id);     },          getById : function(id){         return this.data.key(id);     },          getAt : function(index){         return this.data.itemAt(index);     },          getRange : function(start, end){         return this.data.getRange(start, end);     },         storeOptions : function(o){         o = Ext.apply({}, o);         delete o.callback;         delete o.scope;         this.lastOptions = o;     },          load : function(options){         options = options || {};         if(this.fireEvent("beforeload", this, options) !== false){             this.storeOptions(options);             var p = Ext.apply(options.params || {}, this.baseParams);             if(this.sortInfo && this.remoteSort){                 var pn = this.paramNames;                 p[pn["sort"]] = this.sortInfo.field;                 p[pn["dir"]] = this.sortInfo.direction;             }             this.proxy.load(p, this.reader, this.loadRecords, this, options);             return true;         } else {           return false;         }     },          reload : function(options){         this.load(Ext.applyIf(options||{}, this.lastOptions));     },             loadRecords : function(o, options, success){         if(!o || success === false){             if(success !== false){                 this.fireEvent("load", this, [], options);             }             if(options.callback){                 options.callback.call(options.scope || this, [], options, false);             }             return;         }         var r = o.records, t = o.totalRecords || r.length;         if(!options || options.add !== true){             if(this.pruneModifiedRecords){                 this.modified = [];             }             for(var i = 0, len = r.length; i < len; i++){                 r[i].join(this);             }             if(this.snapshot){                 this.data = this.snapshot;                 delete this.snapshot;             }             this.data.clear();             this.data.addAll(r);             this.totalLength = t;             this.applySort();             this.fireEvent("datachanged", this);         }else{             this.totalLength = Math.max(t, this.data.length+r.length);             this.add(r);         }         this.fireEvent("load", this, r, options);         if(options.callback){             options.callback.call(options.scope || this, r, options, true);         }     },          loadData : function(o, append){         var r = this.reader.readRecords(o);         this.loadRecords(r, {add: append}, true);     },          getCount : function(){         return this.data.length || 0;     },          getTotalCount : function(){         return this.totalLength || 0;     },          getSortState : function(){         return this.sortInfo;     },         applySort : function(){         if(this.sortInfo && !this.remoteSort){             var s = this.sortInfo, f = s.field;             this.sortData(f, s.direction);         }     },         sortData : function(f, direction){         direction = direction || 'ASC';         var st = this.fields.get(f).sortType;         var fn = function(r1, r2){             var v1 = st(r1.data[f]), v2 = st(r2.data[f]);             return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);         };         this.data.sort(direction, fn);         if(this.snapshot && this.snapshot != this.data){             this.snapshot.sort(direction, fn);         }     },          setDefaultSort : function(field, dir){         dir = dir ? dir.toUpperCase() : "ASC";         this.sortInfo = {field: field, direction: dir};         this.sortToggle[field] = dir;     },          sort : function(fieldName, dir){         var f = this.fields.get(fieldName);         if(!f){             return false;         }         if(!dir){             if(this.sortInfo && this.sortInfo.field == f.name){                 dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC");             }else{                 dir = f.sortDir;             }         }         var st = (this.sortToggle) ? this.sortToggle[f.name] : null;         var si = (this.sortInfo) ? this.sortInfo : null;         this.sortToggle[f.name] = dir;         this.sortInfo = {field: f.name, direction: dir};         if(!this.remoteSort){             this.applySort();             this.fireEvent("datachanged", this);         }else{             if (!this.load(this.lastOptions)) {                 if (st) {                     this.sortToggle[f.name] = st;                 }                 if (si) {                     this.sortInfo = si;                 }             }         }     },          each : function(fn, scope){         this.data.each(fn, scope);     },          getModifiedRecords : function(){         return this.modified;     },         createFilterFn : function(property, value, anyMatch, caseSensitive){         if(Ext.isEmpty(value, false)){             return false;         }         value = this.data.createValueMatcher(value, anyMatch, caseSensitive);         return function(r){             return value.test(r.data[property]);         };     },          sum : function(property, start, end){         var rs = this.data.items, v = 0;         start = start || 0;         end = (end || end === 0) ? end : rs.length-1;         for(var i = start; i <= end; i++){             v += (rs[i].data[property] || 0);         }         return v;     },          filter : function(property, value, anyMatch, caseSensitive){         var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);         return fn ? this.filterBy(fn) : this.clearFilter();     },          filterBy : function(fn, scope){         this.snapshot = this.snapshot || this.data;         this.data = this.queryBy(fn, scope||this);         this.fireEvent("datachanged", this);     },          query : function(property, value, anyMatch, caseSensitive){         var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);         return fn ? this.queryBy(fn) : this.data.clone();     },          queryBy : function(fn, scope){         var data = this.snapshot || this.data;         return data.filterBy(fn, scope||this);     },          find : function(property, value, start, anyMatch, caseSensitive){         var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);         return fn ? this.data.findIndexBy(fn, null, start) : -1;     },          findBy : function(fn, scope, start){         return this.data.findIndexBy(fn, scope, start);     },          collect : function(dataIndex, allowNull, bypassFilter){         var d = (bypassFilter === true && this.snapshot) ?                 this.snapshot.items : this.data.items;         var v, sv, r = [], l = {};         for(var i = 0, len = d.length; i < len; i++){             v = d[i].data[dataIndex];             sv = String(v);             if((allowNull || !Ext.isEmpty(v)) && !l[sv]){                 l[sv] = true;                 r[r.length] = v;             }         }         return r;     },          clearFilter : function(suppressEvent){         if(this.isFiltered()){             this.data = this.snapshot;             delete this.snapshot;             if(suppressEvent !== true){                 this.fireEvent("datachanged", this);             }         }     },          isFiltered : function(){         return this.snapshot && this.snapshot != this.data;     },         afterEdit : function(record){         if(this.modified.indexOf(record) == -1){             this.modified.push(record);         }         this.fireEvent("update", this, record, Ext.data.Record.EDIT);     },         afterReject : function(record){         this.modified.remove(record);         this.fireEvent("update", this, record, Ext.data.Record.REJECT);     },         afterCommit : function(record){         this.modified.remove(record);         this.fireEvent("update", this, record, Ext.data.Record.COMMIT);     },          commitChanges : function(){         var m = this.modified.slice(0);         this.modified = [];         for(var i = 0, len = m.length; i < len; i++){             m[i].commit();         }     },          rejectChanges : function(){         var m = this.modified.slice(0);         this.modified = [];         for(var i = 0, len = m.length; i < len; i++){             m[i].reject();         }     },         onMetaChange : function(meta, rtype, o){         this.recordType = rtype;         this.fields = rtype.prototype.fields;         delete this.snapshot;         this.sortInfo = meta.sortInfo;         this.modified = [];         this.fireEvent('metachange', this, this.reader.meta);     },         findInsertIndex : function(record){         this.suspendEvents();         var data = this.data.clone();         this.data.add(record);         this.applySort();         var index = this.data.indexOf(record);         this.data = data;         this.resumeEvents();         return index;     } }); Ext.data.SimpleStore = function(config){     Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {         reader: new Ext.data.ArrayReader({                 id: config.id             },             Ext.data.Record.create(config.fields)         )     })); }; Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {     loadData : function(data, append){         if(this.expandData === true){             var r = [];             for(var i = 0, len = data.length; i < len; i++){                 r[r.length] = [data[i]];             }             data = r;         }         Ext.data.SimpleStore.superclass.loadData.call(this, data, append);     } }); Ext.data.JsonStore = function(c){               Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {         proxy: c.proxy || (!c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined),         reader: new Ext.data.JsonReader(c, c.fields)     })); }; Ext.extend(Ext.data.JsonStore, Ext.data.Store); Ext.data.Field = function(config){
  486.     if(typeof config == "string"){
  487.         config = {name: config};
  488.     }
  489.     Ext.apply(this, config);
  490.     
  491.     if(!this.type){
  492.         this.type = "auto";
  493.     }
  494.     
  495.     var st = Ext.data.SortTypes;
  496.          if(typeof this.sortType == "string"){
  497.         this.sortType = st[this.sortType];
  498.     }
  499.     
  500.          if(!this.sortType){
  501.         switch(this.type){
  502.             case "string":
  503.                 this.sortType = st.asUCString;
  504.                 break;
  505.             case "date":
  506.                 this.sortType = st.asDate;
  507.                 break;
  508.             default:
  509.                 this.sortType = st.none;
  510.         }
  511.     }
  512.          var stripRe = /[$,%]/g;
  513.               if(!this.convert){
  514.         var cv, dateFormat = this.dateFormat;
  515.         switch(this.type){
  516.             case "":
  517.             case "auto":
  518.             case undefined:
  519.                 cv = function(v){ return v; };
  520.                 break;
  521.             case "string":
  522.                 cv = function(v){ return (v === undefined || v === null) ? '' : String(v); };
  523.                 break;
  524.             case "int":
  525.                 cv = function(v){
  526.                     return v !== undefined && v !== null && v !== '' ?
  527.                            parseInt(String(v).replace(stripRe, ""), 10) : '';
  528.                     };
  529.                 break;
  530.             case "float":
  531.                 cv = function(v){
  532.                     return v !== undefined && v !== null && v !== '' ?
  533.                            parseFloat(String(v).replace(stripRe, ""), 10) : ''; 
  534.                     };
  535.                 break;
  536.             case "bool":
  537.             case "boolean":
  538.                 cv = function(v){ return v === true || v === "true" || v == 1; };
  539.                 break;
  540.             case "date":
  541.                 cv = function(v){
  542.                     if(!v){
  543.                         return '';
  544.                     }
  545.                     if(Ext.isDate(v)){
  546.                         return v;
  547.                     }
  548.                     if(dateFormat){
  549.                         if(dateFormat == "timestamp"){
  550.                             return new Date(v*1000);
  551.                         }
  552.                         if(dateFormat == "time"){
  553.                             return new Date(parseInt(v, 10));
  554.                         }
  555.                         return Date.parseDate(v, dateFormat);
  556.                     }
  557.                     var parsed = Date.parse(v);
  558.                     return parsed ? new Date(parsed) : null;
  559.                 };
  560.              break;
  561.             
  562.         }
  563.         this.convert = cv;
  564.     }
  565. };
  566. Ext.data.Field.prototype = {
  567.     dateFormat: null,
  568.     defaultValue: "",
  569.     mapping: null,
  570.     sortType : null,
  571.     sortDir : "ASC"
  572. };
  573. Ext.data.DataReader = function(meta, recordType){
  574.     
  575.     this.meta = meta;
  576.     this.recordType = Ext.isArray(recordType) ? 
  577.         Ext.data.Record.create(recordType) : recordType;
  578. };
  579. Ext.data.DataReader.prototype = {
  580.     
  581. };
  582. Ext.data.DataProxy = function(){
  583.     this.addEvents(
  584.         
  585.         'beforeload',
  586.         
  587.         'load'
  588.     );
  589.     Ext.data.DataProxy.superclass.constructor.call(this);
  590. };
  591. Ext.extend(Ext.data.DataProxy, Ext.util.Observable);
  592. Ext.data.MemoryProxy = function(data){
  593.     Ext.data.MemoryProxy.superclass.constructor.call(this);
  594.     this.data = data;
  595. };
  596. Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
  597.     
  598.     
  599.     
  600.     load : function(params, reader, callback, scope, arg){
  601.         params = params || {};
  602.         var result;
  603.         try {
  604.             result = reader.readRecords(this.data);
  605.         }catch(e){
  606.             this.fireEvent("loadexception", this, arg, null, e);
  607.             callback.call(scope, null, arg, false);
  608.             return;
  609.         }
  610.         callback.call(scope, result, arg, true);
  611.     },
  612.     
  613.          update : function(params, records){
  614.         
  615.     }
  616. });
  617. Ext.data.HttpProxy = function(conn){
  618.     Ext.data.HttpProxy.superclass.constructor.call(this);
  619.     
  620.     this.conn = conn;
  621.     this.useAjax = !conn || !conn.events;
  622.     
  623. };
  624. Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
  625.     
  626.     getConnection : function(){
  627.         return this.useAjax ? Ext.Ajax : this.conn;
  628.     },
  629.     
  630.     load : function(params, reader, callback, scope, arg){
  631.         if(this.fireEvent("beforeload", this, params) !== false){
  632.             var  o = {
  633.                 params : params || {},
  634.                 request: {
  635.                     callback : callback,
  636.                     scope : scope,
  637.                     arg : arg
  638.                 },
  639.                 reader: reader,
  640.                 callback : this.loadResponse,
  641.                 scope: this
  642.             };
  643.             if(this.useAjax){
  644.                 Ext.applyIf(o, this.conn);
  645.                 if(this.activeRequest){
  646.                     Ext.Ajax.abort(this.activeRequest);
  647.                 }
  648.                 this.activeRequest = Ext.Ajax.request(o);
  649.             }else{
  650.                 this.conn.request(o);
  651.             }
  652.         }else{
  653.             callback.call(scope||this, null, arg, false);
  654.         }
  655.     },
  656.          loadResponse : function(o, success, response){
  657.         delete this.activeRequest;
  658.         if(!success){
  659.             this.fireEvent("loadexception", this, o, response);
  660.             o.request.callback.call(o.request.scope, null, o.request.arg, false);
  661.             return;
  662.         }
  663.         var result;
  664.         try {
  665.             result = o.reader.read(response);
  666.         }catch(e){
  667.             this.fireEvent("loadexception", this, o, response, e);
  668.             o.request.callback.call(o.request.scope, null, o.request.arg, false);
  669.             return;
  670.         }
  671.         this.fireEvent("load", this, o, o.request.arg);
  672.         o.request.callback.call(o.request.scope, result, o.request.arg, true);
  673.     },
  674.     
  675.          update : function(dataSet){
  676.         
  677.     },
  678.     
  679.          updateResponse : function(dataSet){
  680.         
  681.     }
  682. });
  683. Ext.data.ScriptTagProxy = function(config){
  684.     Ext.data.ScriptTagProxy.superclass.constructor.call(this);
  685.     Ext.apply(this, config);
  686.     this.head = document.getElementsByTagName("head")[0];
  687.     
  688.     
  689. };
  690. Ext.data.ScriptTagProxy.TRANS_ID = 1000;
  691. Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
  692.     
  693.     
  694.     timeout : 30000,
  695.     
  696.     callbackParam : "callback",
  697.     
  698.     nocache : true,
  699.     
  700.     load : function(params, reader, callback, scope, arg){
  701.         if(this.fireEvent("beforeload", this, params) !== false){
  702.             var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
  703.             var url = this.url;
  704.             url += (url.indexOf("?") != -1 ? "&" : "?") + p;
  705.             if(this.nocache){
  706.                 url += "&_dc=" + (new Date().getTime());
  707.             }
  708.             var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
  709.             var trans = {
  710.                 id : transId,
  711.                 cb : "stcCallback"+transId,
  712.                 scriptId : "stcScript"+transId,
  713.                 params : params,
  714.                 arg : arg,
  715.                 url : url,
  716.                 callback : callback,
  717.                 scope : scope,
  718.                 reader : reader
  719.             };
  720.             var conn = this;
  721.             window[trans.cb] = function(o){
  722.                 conn.handleResponse(o, trans);
  723.             };
  724.             url += String.format("&{0}={1}", this.callbackParam, trans.cb);
  725.             if(this.autoAbort !== false){
  726.                 this.abort();
  727.             }
  728.             trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
  729.             var script = document.createElement("script");
  730.             script.setAttribute("src", url);
  731.             script.setAttribute("type", "text/javascript");
  732.             script.setAttribute("id", trans.scriptId);
  733.             this.head.appendChild(script);
  734.             this.trans = trans;
  735.         }else{
  736.             callback.call(scope||this, null, arg, false);
  737.         }
  738.     },
  739.          isLoading : function(){
  740.         return this.trans ? true : false;
  741.     },
  742.     
  743.     abort : function(){
  744.         if(this.isLoading()){
  745.             this.destroyTrans(this.trans);
  746.         }
  747.     },
  748.          destroyTrans : function(trans, isLoaded){
  749.         this.head.removeChild(document.getElementById(trans.scriptId));
  750.         clearTimeout(trans.timeoutId);
  751.         if(isLoaded){
  752.             window[trans.cb] = undefined;
  753.             try{
  754.                 delete window[trans.cb];
  755.             }catch(e){}
  756.         }else{
  757.                          window[trans.cb] = function(){
  758.                 window[trans.cb] = undefined;
  759.                 try{
  760.                     delete window[trans.cb];
  761.                 }catch(e){}
  762.             };
  763.         }
  764.     },
  765.          handleResponse : function(o, trans){
  766.         this.trans = false;
  767.         this.destroyTrans(trans, true);
  768.         var result;
  769.         try {
  770.             result = trans.reader.readRecords(o);
  771.         }catch(e){
  772.             this.fireEvent("loadexception", this, o, trans.arg, e);
  773.             trans.callback.call(trans.scope||window, null, trans.arg, false);
  774.             return;
  775.         }
  776.         this.fireEvent("load", this, o, trans.arg);
  777.         trans.callback.call(trans.scope||window, result, trans.arg, true);
  778.     },
  779.          handleFailure : function(trans){
  780.         this.trans = false;
  781.         this.destroyTrans(trans, false);
  782.         this.fireEvent("loadexception", this, null, trans.arg);
  783.         trans.callback.call(trans.scope||window, null, trans.arg, false);
  784.     }
  785. }); Ext.data.JsonReader = function(meta, recordType){     meta = meta || {};     Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields); }; Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {               read : function(response){         var json = response.responseText;         var o = eval("("+json+")");         if(!o) {             throw {message: "JsonReader.read: Json object not found"};         }         return this.readRecords(o);     },         onMetaChange : function(meta, recordType, o){     },          simpleAccess: function(obj, subsc) {      return obj[subsc];     },     getJsonAccessor: function(){         var re = /[[.]/;         return function(expr) {             try {                 return(re.test(expr))                     ? new Function("obj", "return obj." + expr)                     : function(obj){                         return obj[expr];                     };             } catch(e){}             return Ext.emptyFn;         };     }(),          readRecords : function(o){                  this.jsonData = o;         if(o.metaData){             delete this.ef;             this.meta = o.metaData;             this.recordType = Ext.data.Record.create(o.metaData.fields);             this.onMetaChange(this.meta, this.recordType, o);         }         var s = this.meta, Record = this.recordType,             f = Record.prototype.fields, fi = f.items, fl = f.length;         if (!this.ef) {             if(s.totalProperty) {             this.getTotal = this.getJsonAccessor(s.totalProperty);         }         if(s.successProperty) {             this.getSuccess = this.getJsonAccessor(s.successProperty);         }         this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;};         if (s.id) {          var g = this.getJsonAccessor(s.id);          this.getId = function(rec) {          var r = g(rec);          return (r === undefined || r === "") ? null : r;          };         } else {          this.getId = function(){return null;};         }             this.ef = [];             for(var i = 0; i < fl; i++){                 f = fi[i];                 var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;                 this.ef[i] = this.getJsonAccessor(map);             }         }      var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;      if(s.totalProperty){             var v = parseInt(this.getTotal(o), 10);             if(!isNaN(v)){                 totalRecords = v;             }         }         if(s.successProperty){             var v = this.getSuccess(o);             if(v === false || v === 'false'){                 success = false;             }         }         var records = [];     for(var i = 0; i < c; i++){     var n = root[i];         var values = {};         var id = this.getId(n);         for(var j = 0; j < fl; j++){             f = fi[j];                 var v = this.ef[j](n);                 values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, n);         }         var record = new Record(values, id);         record.json = n;         records[i] = record;     }     return {         success : success,         records : records,         totalRecords : totalRecords     };     } }); Ext.data.XmlReader = function(meta, recordType){     meta = meta || {};     Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields); }; Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {          read : function(response){         var doc = response.responseXML;         if(!doc) {             throw {message: "XmlReader.read: XML Document not available"};         }         return this.readRecords(doc);     },          readRecords : function(doc){                  this.xmlData = doc;         var root = doc.documentElement || doc;      var q = Ext.DomQuery;      var recordType = this.recordType, fields = recordType.prototype.fields;      var sid = this.meta.id;      var totalRecords = 0, success = true;      if(this.meta.totalRecords){          totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);      }         if(this.meta.success){             var sv = q.selectValue(this.meta.success, root, true);             success = sv !== false && sv !== 'false';      }      var records = [];      var ns = q.select(this.meta.record, root);         for(var i = 0, len = ns.length; i < len; i++) {         var n = ns[i];         var values = {};         var id = sid ? q.selectValue(sid, n) : undefined;         for(var j = 0, jlen = fields.length; j < jlen; j++){             var f = fields.items[j];                 var v = q.selectValue(f.mapping || f.name, n, f.defaultValue);             v = f.convert(v, n);             values[f.name] = v;         }         var record = new recordType(values, id);         record.node = n;         records[records.length] = record;     }     return {         success : success,         records : records,         totalRecords : totalRecords || records.length     };     } }); Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {          readRecords : function(o){         var sid = this.meta ? this.meta.id : null;      var recordType = this.recordType, fields = recordType.prototype.fields;      var records = [];      var root = o;     for(var i = 0; i < root.length; i++){     var n = root[i];         var values = {};         var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);         for(var j = 0, jlen = fields.length; j < jlen; j++){                 var f = fields.items[j];                 var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;                 var v = n[k] !== undefined ? n[k] : f.defaultValue;                 v = f.convert(v, n);                 values[f.name] = v;             }         var record = new recordType(values, id);         record.json = n;         records[records.length] = record;     }     return {         records : records,         totalRecords : records.length     };     } });
  786. Ext.data.Tree = function(root){
  787.    this.nodeHash = {};
  788.    
  789.    this.root = null;
  790.    if(root){
  791.        this.setRootNode(root);
  792.    }
  793.    this.addEvents(
  794.        
  795.        "append",
  796.        
  797.        "remove",
  798.        
  799.        "move",
  800.        
  801.        "insert",
  802.        
  803.        "beforeappend",
  804.        
  805.        "beforeremove",
  806.        
  807.        "beforemove",
  808.        
  809.        "beforeinsert"
  810.    );
  811.     Ext.data.Tree.superclass.constructor.call(this);
  812. };
  813. Ext.extend(Ext.data.Tree, Ext.util.Observable, {
  814.     
  815.     pathSeparator: "/",
  816.          proxyNodeEvent : function(){
  817.         return this.fireEvent.apply(this, arguments);
  818.     },
  819.     
  820.     getRootNode : function(){
  821.         return this.root;
  822.     },
  823.     
  824.     setRootNode : function(node){
  825.         this.root = node;
  826.         node.ownerTree = this;
  827.         node.isRoot = true;
  828.         this.registerNode(node);
  829.         return node;
  830.     },
  831.     
  832.     getNodeById : function(id){
  833.         return this.nodeHash[id];
  834.     },
  835.          registerNode : function(node){
  836.         this.nodeHash[node.id] = node;
  837.     },
  838.          unregisterNode : function(node){
  839.         delete this.nodeHash[node.id];
  840.     },
  841.     toString : function(){
  842.         return "[Tree"+(this.id?" "+this.id:"")+"]";
  843.     }
  844. });
  845. Ext.data.Node = function(attributes){
  846.     
  847.     this.attributes = attributes || {};
  848.     this.leaf = this.attributes.leaf;
  849.     
  850.     this.id = this.attributes.id;
  851.     if(!this.id){
  852.         this.id = Ext.id(null, "ynode-");
  853.         this.attributes.id = this.id;
  854.     }
  855.     
  856.     this.childNodes = [];
  857.     if(!this.childNodes.indexOf){          this.childNodes.indexOf = function(o){
  858.             for(var i = 0, len = this.length; i < len; i++){
  859.                 if(this[i] == o) return i;
  860.             }
  861.             return -1;
  862.         };
  863.     }
  864.     
  865.     this.parentNode = null;
  866.     
  867.     this.firstChild = null;
  868.     
  869.     this.lastChild = null;
  870.     
  871.     this.previousSibling = null;
  872.     
  873.     this.nextSibling = null;
  874.     this.addEvents({
  875.        
  876.        "append" : true,
  877.        
  878.        "remove" : true,
  879.        
  880.        "move" : true,
  881.        
  882.        "insert" : true,
  883.        
  884.        "beforeappend" : true,
  885.        
  886.        "beforeremove" : true,
  887.        
  888.        "beforemove" : true,
  889.        
  890.        "beforeinsert" : true
  891.    });
  892.     this.listeners = this.attributes.listeners;
  893.     Ext.data.Node.superclass.constructor.call(this);
  894. };
  895. Ext.extend(Ext.data.Node, Ext.util.Observable, {
  896.          fireEvent : function(evtName){
  897.                  if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){
  898.             return false;
  899.         }
  900.                  var ot = this.getOwnerTree();
  901.         if(ot){
  902.             if(ot.proxyNodeEvent.apply(ot, arguments) === false){
  903.                 return false;
  904.             }
  905.         }
  906.         return true;
  907.     },
  908.     
  909.     isLeaf : function(){
  910.         return this.leaf === true;
  911.     },
  912.          setFirstChild : function(node){
  913.         this.firstChild = node;
  914.     },
  915.          setLastChild : function(node){
  916.         this.lastChild = node;
  917.     },
  918.     
  919.     isLast : function(){
  920.        return (!this.parentNode ? true : this.parentNode.lastChild == this);
  921.     },
  922.     
  923.     isFirst : function(){
  924.        return (!this.parentNode ? true : this.parentNode.firstChild == this);
  925.     },
  926.     
  927.     hasChildNodes : function(){
  928.         return !this.isLeaf() && this.childNodes.length > 0;
  929.     },
  930.     
  931.     
  932.     isExpandable : function(){
  933.         return this.attributes.expandable || this.hasChildNodes();
  934.     },
  935.     
  936.     appendChild : function(node){
  937.         var multi = false;
  938.         if(Ext.isArray(node)){
  939.             multi = node;
  940.         }else if(arguments.length > 1){
  941.             multi = arguments;
  942.         }
  943.                  if(multi){
  944.             for(var i = 0, len = multi.length; i < len; i++) {
  945.              this.appendChild(multi[i]);
  946.             }
  947.         }else{
  948.             if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){
  949.                 return false;
  950.             }
  951.             var index = this.childNodes.length;
  952.             var oldParent = node.parentNode;
  953.                          if(oldParent){
  954.                 if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){
  955.                     return false;
  956.                 }
  957.                 oldParent.removeChild(node);
  958.             }
  959.             index = this.childNodes.length;
  960.             if(index == 0){
  961.                 this.setFirstChild(node);
  962.             }
  963.             this.childNodes.push(node);
  964.             node.parentNode = this;
  965.             var ps = this.childNodes[index-1];
  966.             if(ps){
  967.                 node.previousSibling = ps;
  968.                 ps.nextSibling = node;
  969.             }else{
  970.                 node.previousSibling = null;
  971.             }
  972.             node.nextSibling = null;
  973.             this.setLastChild(node);
  974.             node.setOwnerTree(this.getOwnerTree());
  975.             this.fireEvent("append", this.ownerTree, this, node, index);
  976.             if(oldParent){
  977.                 node.fireEvent("move", this.ownerTree, node, oldParent, this, index);
  978.             }
  979.             return node;
  980.         }
  981.     },
  982.     
  983.     removeChild : function(node){
  984.         var index = this.childNodes.indexOf(node);
  985.         if(index == -1){
  986.             return false;
  987.         }
  988.         if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){
  989.             return false;
  990.         }
  991.                  this.childNodes.splice(index, 1);
  992.                  if(node.previousSibling){
  993.             node.previousSibling.nextSibling = node.nextSibling;
  994.         }
  995.         if(node.nextSibling){
  996.             node.nextSibling.previousSibling = node.previousSibling;
  997.         }
  998.                  if(this.firstChild == node){
  999.             this.setFirstChild(node.nextSibling);
  1000.         }
  1001.         if(this.lastChild == node){
  1002.             this.setLastChild(node.previousSibling);
  1003.         }
  1004.         node.setOwnerTree(null);
  1005.                  node.parentNode = null;
  1006.         node.previousSibling = null;
  1007.         node.nextSibling = null;
  1008.         this.fireEvent("remove", this.ownerTree, this, node);
  1009.         return node;
  1010.     },
  1011.     
  1012.     insertBefore : function(node, refNode){
  1013.         if(!refNode){              return this.appendChild(node);
  1014.         }
  1015.                  if(node == refNode){
  1016.             return false;
  1017.         }
  1018.         if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){
  1019.             return false;
  1020.         }
  1021.         var index = this.childNodes.indexOf(refNode);
  1022.         var oldParent = node.parentNode;
  1023.         var refIndex = index;
  1024.                  if(oldParent == this && this.childNodes.indexOf(node) < index){
  1025.             refIndex--;
  1026.         }
  1027.                  if(oldParent){
  1028.             if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){
  1029.                 return false;
  1030.             }
  1031.             oldParent.removeChild(node);
  1032.         }
  1033.         if(refIndex == 0){
  1034.             this.setFirstChild(node);
  1035.         }
  1036.         this.childNodes.splice(refIndex, 0, node);
  1037.         node.parentNode = this;
  1038.         var ps = this.childNodes[refIndex-1];
  1039.         if(ps){
  1040.             node.previousSibling = ps;
  1041.             ps.nextSibling = node;
  1042.         }else{
  1043.             node.previousSibling = null;
  1044.         }
  1045.         node.nextSibling = refNode;
  1046.         refNode.previousSibling = node;
  1047.         node.setOwnerTree(this.getOwnerTree());
  1048.         this.fireEvent("insert", this.ownerTree, this, node, refNode);
  1049.         if(oldParent){
  1050.             node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);
  1051.         }
  1052.         return node;
  1053.     },
  1054.     
  1055.     remove : function(){
  1056.         this.parentNode.removeChild(this);
  1057.         return this;
  1058.     },
  1059.     
  1060.     item : function(index){
  1061.         return this.childNodes[index];
  1062.     },
  1063.     
  1064.     replaceChild : function(newChild, oldChild){
  1065.         this.insertBefore(newChild, oldChild);
  1066.         this.removeChild(oldChild);
  1067.         return oldChild;
  1068.     },
  1069.     
  1070.     indexOf : function(child){
  1071.         return this.childNodes.indexOf(child);
  1072.     },
  1073.     
  1074.     getOwnerTree : function(){
  1075.                  if(!this.ownerTree){
  1076.             var p = this;
  1077.             while(p){
  1078.                 if(p.ownerTree){
  1079.                     this.ownerTree = p.ownerTree;
  1080.                     break;
  1081.                 }
  1082.                 p = p.parentNode;
  1083.             }
  1084.         }
  1085.         return this.ownerTree;
  1086.     },
  1087.     
  1088.     getDepth : function(){
  1089.         var depth = 0;
  1090.         var p = this;
  1091.         while(p.parentNode){
  1092.             ++depth;
  1093.             p = p.parentNode;
  1094.         }
  1095.         return depth;
  1096.     },
  1097.          setOwnerTree : function(tree){
  1098.                  if(tree != this.ownerTree){
  1099.             if(this.ownerTree){
  1100.                 this.ownerTree.unregisterNode(this);
  1101.             }
  1102.             this.ownerTree = tree;
  1103.             var cs = this.childNodes;
  1104.             for(var i = 0, len = cs.length; i < len; i++) {
  1105.              cs[i].setOwnerTree(tree);
  1106.             }
  1107.             if(tree){
  1108.                 tree.registerNode(this);
  1109.             }
  1110.         }
  1111.     },
  1112.     
  1113.     getPath : function(attr){
  1114.         attr = attr || "id";
  1115.         var p = this.parentNode;
  1116.         var b = [this.attributes[attr]];
  1117.         while(p){
  1118.             b.unshift(p.attributes[attr]);
  1119.             p = p.parentNode;
  1120.         }
  1121.         var sep = this.getOwnerTree().pathSeparator;
  1122.         return sep + b.join(sep);
  1123.     },
  1124.     
  1125.     bubble : function(fn, scope, args){
  1126.         var p = this;
  1127.         while(p){
  1128.             if(fn.apply(scope || p, args || [p]) === false){
  1129.                 break;
  1130.             }
  1131.             p = p.parentNode;
  1132.         }
  1133.     },
  1134.     
  1135.     cascade : function(fn, scope, args){
  1136.         if(fn.apply(scope || this, args || [this]) !== false){
  1137.             var cs = this.childNodes;
  1138.             for(var i = 0, len = cs.length; i < len; i++) {
  1139.              cs[i].cascade(fn, scope, args);
  1140.             }
  1141.         }
  1142.     },
  1143.     
  1144.     eachChild : function(fn, scope, args){
  1145.         var cs = this.childNodes;
  1146.         for(var i = 0, len = cs.length; i < len; i++) {
  1147.          if(fn.apply(scope || this, args || [cs[i]]) === false){
  1148.              break;
  1149.          }
  1150.         }
  1151.     },
  1152.     
  1153.     findChild : function(attribute, value){
  1154.         var cs = this.childNodes;
  1155.         for(var i = 0, len = cs.length; i < len; i++) {
  1156.          if(cs[i].attributes[attribute] == value){
  1157.              return cs[i];
  1158.          }
  1159.         }
  1160.         return null;
  1161.     },
  1162.     
  1163.     findChildBy : function(fn, scope){
  1164.         var cs = this.childNodes;
  1165.         for(var i = 0, len = cs.length; i < len; i++) {
  1166.          if(fn.call(scope||cs[i], cs[i]) === true){
  1167.              return cs[i];
  1168.          }
  1169.         }
  1170.         return null;
  1171.     },
  1172.     
  1173.     sort : function(fn, scope){
  1174.         var cs = this.childNodes;
  1175.         var len = cs.length;
  1176.         if(len > 0){
  1177.             var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;
  1178.             cs.sort(sortFn);
  1179.             for(var i = 0; i < len; i++){
  1180.                 var n = cs[i];
  1181.                 n.previousSibling = cs[i-1];
  1182.                 n.nextSibling = cs[i+1];
  1183.                 if(i == 0){
  1184.                     this.setFirstChild(n);
  1185.                 }
  1186.                 if(i == len-1){
  1187.                     this.setLastChild(n);
  1188.                 }
  1189.             }
  1190.         }
  1191.     },
  1192.     
  1193.     contains : function(node){
  1194.         return node.isAncestor(this);
  1195.     },
  1196.     
  1197.     isAncestor : function(node){
  1198.         var p = this.parentNode;
  1199.         while(p){
  1200.             if(p == node){
  1201.                 return true;
  1202.             }
  1203.             p = p.parentNode;
  1204.         }
  1205.         return false;
  1206.     },
  1207.     toString : function(){
  1208.         return "[Node"+(this.id?" "+this.id:"")+"]";
  1209.     }
  1210. });
  1211. Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
  1212.     
  1213.     
  1214.     remoteGroup : false,
  1215.     
  1216.     groupOnSort:false,
  1217.     
  1218.     clearGrouping : function(){
  1219.         this.groupField = false;
  1220.         if(this.remoteGroup){
  1221.             if(this.baseParams){
  1222.                 delete this.baseParams.groupBy;
  1223.             }
  1224.             this.reload();
  1225.         }else{
  1226.             this.applySort();
  1227.             this.fireEvent('datachanged', this);
  1228.         }
  1229.     },
  1230.     
  1231.     groupBy : function(field, forceRegroup){
  1232.         if(this.groupField == field && !forceRegroup){
  1233.             return;          }
  1234.         this.groupField = field;
  1235.         if(this.remoteGroup){
  1236.             if(!this.baseParams){
  1237.                 this.baseParams = {};
  1238.             }
  1239.             this.baseParams['groupBy'] = field;
  1240.         }
  1241.         if(this.groupOnSort){
  1242.             this.sort(field);
  1243.             return;
  1244.         }
  1245.         if(this.remoteGroup){
  1246.             this.reload();
  1247.         }else{
  1248.             var si = this.sortInfo || {};
  1249.             if(si.field != field){
  1250.                 this.applySort();
  1251.             }else{
  1252.                 this.sortData(field);
  1253.             }
  1254.             this.fireEvent('datachanged', this);
  1255.         }
  1256.     },
  1257.          applySort : function(){
  1258.         Ext.data.GroupingStore.superclass.applySort.call(this);
  1259.         if(!this.groupOnSort && !this.remoteGroup){
  1260.             var gs = this.getGroupState();
  1261.             if(gs && gs != this.sortInfo.field){
  1262.                 this.sortData(this.groupField);
  1263.             }
  1264.         }
  1265.     },
  1266.          applyGrouping : function(alwaysFireChange){
  1267.         if(this.groupField !== false){
  1268.             this.groupBy(this.groupField, true);
  1269.             return true;
  1270.         }else{
  1271.             if(alwaysFireChange === true){
  1272.                 this.fireEvent('datachanged', this);
  1273.             }
  1274.             return false;
  1275.         }
  1276.     },
  1277.          getGroupState : function(){
  1278.         return this.groupOnSort && this.groupField !== false ?
  1279.                (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;
  1280.     }
  1281. }); Ext.ComponentMgr = function(){     var all = new Ext.util.MixedCollection();     var types = {};     return {                  register : function(c){             all.add(c);         },                  unregister : function(c){             all.remove(c);         },                  get : function(id){             return all.get(id);         },                  onAvailable : function(id, fn, scope){             all.on("add", function(index, o){                 if(o.id == id){                     fn.call(scope || o, o);                     all.un("add", fn, scope);                 }             });         },                  all : all,                  registerType : function(xtype, cls){             types[xtype] = cls;             cls.xtype = xtype;         },                  create : function(config, defaultType){             return new types[config.xtype || defaultType](config);         }     }; }(); Ext.reg = Ext.ComponentMgr.registerType; // this will be called a lot internally, shorthand to keep the bytes down Ext.Component = function(config){     config = config || {};     if(config.initialConfig){         if(config.isAction){                       this.baseAction = config;         }         config = config.initialConfig;     }else if(config.tagName || config.dom || typeof config == "string"){         config = {applyTo: config, id: config.id || config};     }          this.initialConfig = config;     Ext.apply(this, config);     this.addEvents(                  'disable',                  'enable',                  'beforeshow',                  'show',                  'beforehide',                  'hide',                  'beforerender',                  'render',                  'beforedestroy',                  'destroy',                  'beforestaterestore',                  'staterestore',                  'beforestatesave',                  'statesave'     );     this.getId();     Ext.ComponentMgr.register(this);     Ext.Component.superclass.constructor.call(this);     if(this.baseAction){         this.baseAction.addComponent(this);     }     this.initComponent();     if(this.plugins){         if(Ext.isArray(this.plugins)){             for(var i = 0, len = this.plugins.length; i < len; i++){                 this.plugins[i] = this.initPlugin(this.plugins[i]);             }         }else{             this.plugins = this.initPlugin(this.plugins);         }     }     if(this.stateful !== false){         this.initState(config);     }     if(this.applyTo){         this.applyToMarkup(this.applyTo);         delete this.applyTo;     }else if(this.renderTo){         this.render(this.renderTo);         delete this.renderTo;     } }; Ext.Component.AUTO_ID = 1000; Ext.extend(Ext.Component, Ext.util.Observable, {                                                                                     disabledClass : "x-item-disabled",     allowDomMove : true,     autoShow : false,          hideMode: 'display',          hideParent: false,               hidden : false,          disabled : false,          rendered : false,         ctype : "Ext.Component",         actionMode : "el",         getActionEl : function(){         return this[this.actionMode];     },     initPlugin : function(p){         p.init(this);         return p;     },          initComponent : Ext.emptyFn,          render : function(container, position){         if(!this.rendered && this.fireEvent("beforerender", this) !== false){             if(!container && this.el){                 this.el = Ext.get(this.el);                 container = this.el.dom.parentNode;                 this.allowDomMove = false;             }             this.container = Ext.get(container);             if(this.ctCls){                 this.container.addClass(this.ctCls);             }             this.rendered = true;             if(position !== undefined){                 if(typeof position == 'number'){                     position = this.container.dom.childNodes[position];                 }else{                     position = Ext.getDom(position);                 }             }             this.onRender(this.container, position || null);             if(this.autoShow){                 this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);             }             if(this.cls){                 this.el.addClass(this.cls);                 delete this.cls;             }             if(this.style){                 this.el.applyStyles(this.style);                 delete this.style;             }             this.fireEvent("render", this);             this.afterRender(this.container);             if(this.hidden){                 this.hide();             }             if(this.disabled){                 this.disable();             }             if(this.stateful !== false){                 this.initStateEvents();             }         }         return this;     },         initState : function(config){         if(Ext.state.Manager){             var state = Ext.state.Manager.get(this.stateId || this.id);             if(state){                 if(this.fireEvent('beforestaterestore', this, state) !== false){                     this.applyState(state);                     this.fireEvent('staterestore', this, state);                 }             }         }     },         initStateEvents : function(){         if(this.stateEvents){             for(var i = 0, e; e = this.stateEvents[i]; i++){                 this.on(e, this.saveState, this, {delay:100});             }         }     },         applyState : function(state, config){         if(state){             Ext.apply(this, state);         }     },         getState : function(){         return null;     },         saveState : function(){         if(Ext.state.Manager){             var state = this.getState();             if(this.fireEvent('beforestatesave', this, state) !== false){                 Ext.state.Manager.set(this.stateId || this.id, state);                 this.fireEvent('statesave', this, state);             }         }     },          applyToMarkup : function(el){         this.allowDomMove = false;         this.el = Ext.get(el);         this.render(this.el.dom.parentNode);     },          addClass : function(cls){         if(this.el){             this.el.addClass(cls);         }else{             this.cls = this.cls ? this.cls + ' ' + cls : cls;         }     },          removeClass : function(cls){         if(this.el){             this.el.removeClass(cls);         }else if(this.cls){             this.cls = this.cls.split(' ').remove(cls).join(' ');         }     },             onRender : function(ct, position){         if(this.autoEl){             if(typeof this.autoEl == 'string'){                 this.el = document.createElement(this.autoEl);             }else{                 var div = document.createElement('div');                 Ext.DomHelper.overwrite(div, this.autoEl);                 this.el = div.firstChild;             }             if (!this.el.id) {              this.el.id = this.getId();             }         }         if(this.el){             this.el = Ext.get(this.el);             if(this.allowDomMove !== false){                 ct.dom.insertBefore(this.el.dom, position);             }             if(this.overCls) {                 this.el.addClassOnOver(this.overCls);             }            }     },         getAutoCreate : function(){         var cfg = typeof this.autoCreate == "object" ?                       this.autoCreate : Ext.apply({}, this.defaultAutoCreate);         if(this.id && !cfg.id){             cfg.id = this.id;         }         return cfg;     },         afterRender : Ext.emptyFn,          destroy : function(){         if(this.fireEvent("beforedestroy", this) !== false){             this.beforeDestroy();             if(this.rendered){                 this.el.removeAllListeners();                 this.el.remove();                 if(this.actionMode == "container"){                     this.container.remove();                 }             }             this.onDestroy();             Ext.ComponentMgr.unregister(this);             this.fireEvent("destroy", this);             this.purgeListeners();         }     },     beforeDestroy : Ext.emptyFn,     onDestroy  : Ext.emptyFn,          getEl : function(){         return this.el;     },          getId : function(){         return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID));     },          getItemId : function(){         return this.itemId || this.getId();     },          focus : function(selectText, delay){         if(delay){             this.focus.defer(typeof delay == 'number' ? delay : 10, this, [selectText, false]);             return;         }         if(this.rendered){             this.el.focus();             if(selectText === true){                 this.el.dom.select();             }         }         return this;     },         blur : function(){         if(this.rendered){             this.el.blur();         }         return this;     },          disable : function(){         if(this.rendered){             this.onDisable();         }         this.disabled = true;         this.fireEvent("disable", this);         return this;     },     onDisable : function(){         this.getActionEl().addClass(this.disabledClass);         this.el.dom.disabled = true;     },          enable : function(){         if(this.rendered){             this.onEnable();         }         this.disabled = false;         this.fireEvent("enable", this);         return this;     },     onEnable : function(){         this.getActionEl().removeClass(this.disabledClass);         this.el.dom.disabled = false;     },          setDisabled : function(disabled){         this[disabled ? "disable" : "enable"]();     },          show: function(){         if(this.fireEvent("beforeshow", this) !== false){             this.hidden = false;             if(this.autoRender){                 this.render(typeof this.autoRender == 'boolean' ? Ext.getBody() : this.autoRender);             }             if(this.rendered){                 this.onShow();             }             this.fireEvent("show", this);         }         return this;     },         onShow : function(){         if(this.hideParent){             this.container.removeClass('x-hide-' + this.hideMode);         }else{             this.getActionEl().removeClass('x-hide-' + this.hideMode);         }     },          hide: function(){         if(this.fireEvent("beforehide", this) !== false){             this.hidden = true;             if(this.rendered){                 this.onHide();             }             this.fireEvent("hide", this);         }         return this;     },         onHide : function(){         if(this.hideParent){             this.container.addClass('x-hide-' + this.hideMode);         }else{             this.getActionEl().addClass('x-hide-' + this.hideMode);         }     },          setVisible: function(visible){         if(visible) {             this.show();         }else{             this.hide();         }         return this;     },          isVisible : function(){         return this.rendered && this.getActionEl().isVisible();     },          cloneConfig : function(overrides){         overrides = overrides || {};         var id = overrides.id || Ext.id();         var cfg = Ext.applyIf(overrides, this.initialConfig);         cfg.id = id;         return new this.constructor(cfg);     },          getXType : function(){         return this.constructor.xtype;     },          isXType : function(xtype, shallow){         return !shallow ?                ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 :                 this.constructor.xtype == xtype;     },          getXTypes : function(){         var tc = this.constructor;         if(!tc.xtypes){             var c = [], sc = this;             while(sc && sc.constructor.xtype){                 c.unshift(sc.constructor.xtype);                 sc = sc.constructor.superclass;             }             tc.xtypeChain = c;             tc.xtypes = c.join('/');         }         return tc.xtypes;     },          findParentBy: function(fn) {         for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);         return p || null;     },          findParentByType: function(xtype) {         return typeof xtype == 'function' ?             this.findParentBy(function(p){                 return p.constructor === xtype;             }) :             this.findParentBy(function(p){                 return p.constructor.xtype === xtype;             });     },         mon : function(item, ename, fn, scope, opt){         if(!this.mons){             this.mons = [];             this.on('beforedestroy', function(){                 for(var i= 0, len = this.mons.length; i < len; i++){                     var m = this.mons[i];                     m.item.un(m.ename, m.fn, m.scope);                 }             }, this);         }         this.mons.push({             item: item, ename: ename, fn: fn, scope: scope         });         item.on(ename, fn, scope, opt);     } }); Ext.reg('component', Ext.Component);
  1282. Ext.Action = function(config){
  1283.     this.initialConfig = config;
  1284.     this.items = [];
  1285. }
  1286. Ext.Action.prototype = {
  1287.     
  1288.     
  1289.     
  1290.     
  1291.     
  1292.     
  1293.          isAction : true,
  1294.     
  1295.     setText : function(text){
  1296.         this.initialConfig.text = text;
  1297.         this.callEach('setText', [text]);
  1298.     },
  1299.     
  1300.     getText : function(){
  1301.         return this.initialConfig.text;
  1302.     },
  1303.     
  1304.     setIconClass : function(cls){
  1305.         this.initialConfig.iconCls = cls;
  1306.         this.callEach('setIconClass', [cls]);
  1307.     },
  1308.     
  1309.     getIconClass : function(){
  1310.         return this.initialConfig.iconCls;
  1311.     },
  1312.     
  1313.     setDisabled : function(v){
  1314.         this.initialConfig.disabled = v;
  1315.         this.callEach('setDisabled', [v]);
  1316.     },
  1317.     
  1318.     enable : function(){
  1319.         this.setDisabled(false);
  1320.     },
  1321.     
  1322.     disable : function(){
  1323.         this.setDisabled(true);
  1324.     },
  1325.     
  1326.     isDisabled : function(){
  1327.         return this.initialConfig.disabled;
  1328.     },
  1329.     
  1330.     setHidden : function(v){
  1331.         this.initialConfig.hidden = v;
  1332.         this.callEach('setVisible', [!v]);
  1333.     },
  1334.     
  1335.     show : function(){
  1336.         this.setHidden(false);
  1337.     },
  1338.     
  1339.     hide : function(){
  1340.         this.setHidden(true);
  1341.     },
  1342.     
  1343.     isHidden : function(){
  1344.         return this.initialConfig.hidden;
  1345.     },
  1346.     
  1347.     setHandler : function(fn, scope){
  1348.         this.initialConfig.handler = fn;
  1349.         this.initialConfig.scope = scope;
  1350.         this.callEach('setHandler', [fn, scope]);
  1351.     },
  1352.     
  1353.     each : function(fn, scope){
  1354.         Ext.each(this.items, fn, scope);
  1355.     },
  1356.          callEach : function(fnName, args){
  1357.         var cs = this.items;
  1358.         for(var i = 0, len = cs.length; i < len; i++){
  1359.             cs[i][fnName].apply(cs[i], args);
  1360.         }
  1361.     },
  1362.          addComponent : function(comp){
  1363.         this.items.push(comp);
  1364.         comp.on('destroy', this.removeComponent, this);
  1365.     },
  1366.          removeComponent : function(comp){
  1367.         this.items.remove(comp);
  1368.     },
  1369.     
  1370.     execute : function(){
  1371.         this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);
  1372.     }
  1373. };
  1374. (function(){ 
  1375. Ext.Layer = function(config, existingEl){
  1376.     config = config || {};
  1377.     var dh = Ext.DomHelper;
  1378.     var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
  1379.     if(existingEl){
  1380.         this.dom = Ext.getDom(existingEl);
  1381.     }
  1382.     if(!this.dom){
  1383.         var o = config.dh || {tag: "div", cls: "x-layer"};
  1384.         this.dom = dh.append(pel, o);
  1385.     }
  1386.     if(config.cls){
  1387.         this.addClass(config.cls);
  1388.     }
  1389.     this.constrain = config.constrain !== false;
  1390.     this.visibilityMode = Ext.Element.VISIBILITY;
  1391.     if(config.id){
  1392.         this.id = this.dom.id = config.id;
  1393.     }else{
  1394.         this.id = Ext.id(this.dom);
  1395.     }
  1396.     this.zindex = config.zindex || this.getZIndex();
  1397.     this.position("absolute", this.zindex);
  1398.     if(config.shadow){
  1399.         this.shadowOffset = config.shadowOffset || 4;
  1400.         this.shadow = new Ext.Shadow({
  1401.             offset : this.shadowOffset,
  1402.             mode : config.shadow
  1403.         });
  1404.     }else{
  1405.         this.shadowOffset = 0;
  1406.     }
  1407.     this.useShim = config.shim !== false && Ext.useShims;
  1408.     this.useDisplay = config.useDisplay;
  1409.     this.hide();
  1410. };
  1411. var supr = Ext.Element.prototype;
  1412. var shims = [];
  1413. Ext.extend(Ext.Layer, Ext.Element, {
  1414.     getZIndex : function(){
  1415.         return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000;
  1416.     },
  1417.     getShim : function(){
  1418.         if(!this.useShim){
  1419.             return null;
  1420.         }
  1421.         if(this.shim){
  1422.             return this.shim;
  1423.         }
  1424.         var shim = shims.shift();
  1425.         if(!shim){
  1426.             shim = this.createShim();
  1427.             shim.enableDisplayMode('block');
  1428.             shim.dom.style.display = 'none';
  1429.             shim.dom.style.visibility = 'visible';
  1430.         }
  1431.         var pn = this.dom.parentNode;
  1432.         if(shim.dom.parentNode != pn){
  1433.             pn.insertBefore(shim.dom, this.dom);
  1434.         }
  1435.         shim.setStyle('z-index', this.getZIndex()-2);
  1436.         this.shim = shim;
  1437.         return shim;
  1438.     },
  1439.     hideShim : function(){
  1440.         if(this.shim){
  1441.             this.shim.setDisplayed(false);
  1442.             shims.push(this.shim);
  1443.             delete this.shim;
  1444.         }
  1445.     },
  1446.     disableShadow : function(){
  1447.         if(this.shadow){
  1448.             this.shadowDisabled = true;
  1449.             this.shadow.hide();
  1450.             this.lastShadowOffset = this.shadowOffset;
  1451.             this.shadowOffset = 0;
  1452.         }
  1453.     },
  1454.     enableShadow : function(show){
  1455.         if(this.shadow){
  1456.             this.shadowDisabled = false;
  1457.             this.shadowOffset = this.lastShadowOffset;
  1458.             delete this.lastShadowOffset;
  1459.             if(show){
  1460.                 this.sync(true);
  1461.             }
  1462.         }
  1463.     },
  1464.                    sync : function(doShow){
  1465.         var sw = this.shadow;
  1466.         if(!this.updating && this.isVisible() && (sw || this.useShim)){
  1467.             var sh = this.getShim();
  1468.             var w = this.getWidth(),
  1469.                 h = this.getHeight();
  1470.             var l = this.getLeft(true),
  1471.                 t = this.getTop(true);
  1472.             if(sw && !this.shadowDisabled){
  1473.                 if(doShow && !sw.isVisible()){
  1474.                     sw.show(this);
  1475.                 }else{
  1476.                     sw.realign(l, t, w, h);
  1477.                 }
  1478.                 if(sh){
  1479.                     if(doShow){
  1480.                        sh.show();
  1481.                     }
  1482.                                          var a = sw.adjusts, s = sh.dom.style;
  1483.                     s.left = (Math.min(l, l+a.l))+"px";
  1484.                     s.top = (Math.min(t, t+a.t))+"px";
  1485.                     s.width = (w+a.w)+"px";
  1486.                     s.height = (h+a.h)+"px";
  1487.                 }
  1488.             }else if(sh){
  1489.                 if(doShow){
  1490.                    sh.show();
  1491.                 }
  1492.                 sh.setSize(w, h);
  1493.                 sh.setLeftTop(l, t);
  1494.             }
  1495.             
  1496.         }
  1497.     },
  1498.          destroy : function(){
  1499.         this.hideShim();
  1500.         if(this.shadow){
  1501.             this.shadow.hide();
  1502.         }
  1503.         this.removeAllListeners();
  1504.         Ext.removeNode(this.dom);
  1505.         Ext.Element.uncache(this.id);
  1506.     },
  1507.     remove : function(){
  1508.         this.destroy();
  1509.     },
  1510.          beginUpdate : function(){