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

Jsp/Servlet

开发平台:

Java

  1.         disable : function(){
  2.             if(tip){
  3.                 tip.disable();
  4.             }
  5.             locks.push(1);
  6.         },
  7.         
  8.         isEnabled : function(){
  9.             return tip !== undefined && !tip.disabled;
  10.         },
  11.         
  12.         getQuickTip : function(){
  13.             return tip;
  14.         },
  15.         
  16.         register : function(){
  17.             tip.register.apply(tip, arguments);
  18.         },
  19.         
  20.         unregister : function(){
  21.             tip.unregister.apply(tip, arguments);
  22.         },
  23.         
  24.         tips :function(){
  25.             tip.register.apply(tip, arguments);
  26.         }
  27.     }
  28. }();
  29. Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
  30.     rootVisible : true,
  31.     animate: Ext.enableFx,
  32.     lines : true,
  33.     enableDD : false,
  34.     hlDrop : Ext.enableFx,
  35.     pathSeparator: "/",
  36.     initComponent : function(){
  37.         Ext.tree.TreePanel.superclass.initComponent.call(this);
  38.         if(!this.eventModel){
  39.             this.eventModel = new Ext.tree.TreeEventModel(this);
  40.         }
  41.         
  42.                  var l = this.loader;
  43.         if(!l){
  44.             l = new Ext.tree.TreeLoader({
  45.                 dataUrl: this.dataUrl
  46.             });
  47.         }else if(typeof l == 'object' && !l.load){
  48.             l = new Ext.tree.TreeLoader(l);
  49.         }
  50.         this.loader = l;
  51.         
  52.         this.nodeHash = {};
  53.         
  54.         if(this.root){
  55.            this.setRootNode(this.root);
  56.         }
  57.         this.addEvents(
  58.             
  59.            "append",
  60.            
  61.            "remove",
  62.            
  63.            "movenode",
  64.            
  65.            "insert",
  66.            
  67.            "beforeappend",
  68.            
  69.            "beforeremove",
  70.            
  71.            "beforemovenode",
  72.            
  73.             "beforeinsert",
  74.             
  75.             "beforeload",
  76.             
  77.             "load",
  78.             
  79.             "textchange",
  80.             
  81.             "beforeexpandnode",
  82.             
  83.             "beforecollapsenode",
  84.             
  85.             "expandnode",
  86.             
  87.             "disabledchange",
  88.             
  89.             "collapsenode",
  90.             
  91.             "beforeclick",
  92.             
  93.             "click",
  94.             
  95.             "checkchange",
  96.             
  97.             "dblclick",
  98.             
  99.             "contextmenu",
  100.             
  101.             "beforechildrenrendered",
  102.            
  103.             "startdrag",
  104.             
  105.             "enddrag",
  106.             
  107.             "dragdrop",
  108.             
  109.             "beforenodedrop",
  110.             
  111.             "nodedrop",
  112.              
  113.             "nodedragover"
  114.         );
  115.         if(this.singleExpand){
  116.             this.on("beforeexpandnode", this.restrictExpand, this);
  117.         }
  118.     },
  119.          proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){
  120.         if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){
  121.             ename = ename+'node';
  122.         }
  123.                  return this.fireEvent(ename, a1, a2, a3, a4, a5, a6);
  124.     },
  125.     
  126.     getRootNode : function(){
  127.         return this.root;
  128.     },
  129.     
  130.     setRootNode : function(node){
  131.         if(!node.render){              node = this.loader.createNode(node);
  132.         }
  133.         this.root = node;
  134.         node.ownerTree = this;
  135.         node.isRoot = true;
  136.         this.registerNode(node);
  137.         if(!this.rootVisible){
  138.          var uiP = node.attributes.uiProvider;
  139.          node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node); 
  140.         }
  141.         return node;
  142.     },
  143.     
  144.     getNodeById : function(id){
  145.         return this.nodeHash[id];
  146.     },
  147.          registerNode : function(node){
  148.         this.nodeHash[node.id] = node;
  149.     },
  150.          unregisterNode : function(node){
  151.         delete this.nodeHash[node.id];
  152.     },
  153.          toString : function(){
  154.         return "[Tree"+(this.id?" "+this.id:"")+"]";
  155.     },
  156.          restrictExpand : function(node){
  157.         var p = node.parentNode;
  158.         if(p){
  159.             if(p.expandedChild && p.expandedChild.parentNode == p){
  160.                 p.expandedChild.collapse();
  161.             }
  162.             p.expandedChild = node;
  163.         }
  164.     },
  165.     
  166.     getChecked : function(a, startNode){
  167.         startNode = startNode || this.root;
  168.         var r = [];
  169.         var f = function(){
  170.             if(this.attributes.checked){
  171.                 r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a]));
  172.             }
  173.         }
  174.         startNode.cascade(f);
  175.         return r;
  176.     },
  177.     
  178.     getEl : function(){
  179.         return this.el;
  180.     },
  181.     
  182.     getLoader : function(){
  183.         return this.loader;
  184.     },
  185.     
  186.     expandAll : function(){
  187.         this.root.expand(true);
  188.     },
  189.     
  190.     collapseAll : function(){
  191.         this.root.collapse(true);
  192.     },
  193.     
  194.     getSelectionModel : function(){
  195.         if(!this.selModel){
  196.             this.selModel = new Ext.tree.DefaultSelectionModel();
  197.         }
  198.         return this.selModel;
  199.     },
  200.     
  201.     expandPath : function(path, attr, callback){
  202.         attr = attr || "id";
  203.         var keys = path.split(this.pathSeparator);
  204.         var curNode = this.root;
  205.         if(curNode.attributes[attr] != keys[1]){              if(callback){
  206.                 callback(false, null);
  207.             }
  208.             return;
  209.         }
  210.         var index = 1;
  211.         var f = function(){
  212.             if(++index == keys.length){
  213.                 if(callback){
  214.                     callback(true, curNode);
  215.                 }
  216.                 return;
  217.             }
  218.             var c = curNode.findChild(attr, keys[index]);
  219.             if(!c){
  220.                 if(callback){
  221.                     callback(false, curNode);
  222.                 }
  223.                 return;
  224.             }
  225.             curNode = c;
  226.             c.expand(false, false, f);
  227.         };
  228.         curNode.expand(false, false, f);
  229.     },
  230.     
  231.     selectPath : function(path, attr, callback){
  232.         attr = attr || "id";
  233.         var keys = path.split(this.pathSeparator);
  234.         var v = keys.pop();
  235.         if(keys.length > 0){
  236.             var f = function(success, node){
  237.                 if(success && node){
  238.                     var n = node.findChild(attr, v);
  239.                     if(n){
  240.                         n.select();
  241.                         if(callback){
  242.                             callback(true, n);
  243.                         }
  244.                     }else if(callback){
  245.                         callback(false, n);
  246.                     }
  247.                 }else{
  248.                     if(callback){
  249.                         callback(false, n);
  250.                     }
  251.                 }
  252.             };
  253.             this.expandPath(keys.join(this.pathSeparator), attr, f);
  254.         }else{
  255.             this.root.select();
  256.             if(callback){
  257.                 callback(true, this.root);
  258.             }
  259.         }
  260.     },
  261.     
  262.     getTreeEl : function(){
  263.         return this.body;
  264.     },
  265.          onRender : function(ct, position){
  266.         Ext.tree.TreePanel.superclass.onRender.call(this, ct, position);
  267.         this.el.addClass('x-tree');
  268.         this.innerCt = this.body.createChild({tag:"ul",
  269.                cls:"x-tree-root-ct " +
  270.                (this.useArrows ? 'x-tree-arrows' : this.lines ? "x-tree-lines" : "x-tree-no-lines")});
  271.     },
  272.          initEvents : function(){
  273.         Ext.tree.TreePanel.superclass.initEvents.call(this);
  274.         if(this.containerScroll){
  275.             Ext.dd.ScrollManager.register(this.body);
  276.         }
  277.         if((this.enableDD || this.enableDrop) && !this.dropZone){
  278.            
  279.              this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
  280.                ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true
  281.            });
  282.         }
  283.         if((this.enableDD || this.enableDrag) && !this.dragZone){
  284.            
  285.             this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
  286.                ddGroup: this.ddGroup || "TreeDD",
  287.                scroll: this.ddScroll
  288.            });
  289.         }
  290.         this.getSelectionModel().init(this);
  291.     },
  292.          afterRender : function(){
  293.         Ext.tree.TreePanel.superclass.afterRender.call(this);
  294.         this.root.render();
  295.         if(!this.rootVisible){
  296.             this.root.renderChildren();
  297.         }
  298.     },
  299.     onDestroy : function(){
  300.         if(this.rendered){
  301.             this.body.removeAllListeners();
  302.             Ext.dd.ScrollManager.unregister(this.body);
  303.             if(this.dropZone){
  304.                 this.dropZone.unreg();
  305.             }
  306.             if(this.dragZone){
  307.                this.dragZone.unreg();
  308.             }
  309.         }
  310.         this.root.destroy();
  311.         this.nodeHash = null;
  312.         Ext.tree.TreePanel.superclass.onDestroy.call(this);
  313.     }
  314.     
  315.     
  316.     
  317.     
  318.     
  319.     
  320.     
  321.     
  322.     
  323.     
  324.     
  325.     
  326.     
  327.     
  328.     
  329.     
  330.     
  331.     
  332.     
  333.     
  334.     
  335.     
  336.     
  337.     
  338.     
  339.     
  340.     
  341.     
  342.     
  343.     
  344.     
  345.     
  346.     
  347.     
  348.     
  349.     
  350.     
  351.     
  352.     
  353.     
  354.     
  355.     
  356.     
  357.     
  358. });
  359. Ext.tree.TreePanel.nodeTypes = {};
  360. Ext.reg('treepanel', Ext.tree.TreePanel); Ext.tree.TreeEventModel = function(tree){
  361.     this.tree = tree;
  362.     this.tree.on('render', this.initEvents, this);
  363. }
  364. Ext.tree.TreeEventModel.prototype = {
  365.     initEvents : function(){
  366.         var el = this.tree.getTreeEl();
  367.         el.on('click', this.delegateClick, this);
  368.         if(this.tree.trackMouseOver !== false){
  369.             el.on('mouseover', this.delegateOver, this);
  370.             el.on('mouseout', this.delegateOut, this);
  371.         }
  372.         el.on('dblclick', this.delegateDblClick, this);
  373.         el.on('contextmenu', this.delegateContextMenu, this);
  374.     },
  375.     getNode : function(e){
  376.         var t;
  377.         if(t = e.getTarget('.x-tree-node-el', 10)){
  378.             var id = Ext.fly(t, '_treeEvents').getAttributeNS('ext', 'tree-node-id');
  379.             if(id){
  380.                 return this.tree.getNodeById(id);
  381.             }
  382.         }
  383.         return null;
  384.     },
  385.     getNodeTarget : function(e){
  386.         var t = e.getTarget('.x-tree-node-icon', 1);
  387.         if(!t){
  388.             t = e.getTarget('.x-tree-node-el', 6);
  389.         }
  390.         return t;
  391.     },
  392.     delegateOut : function(e, t){
  393.         if(!this.beforeEvent(e)){
  394.             return;
  395.         }
  396.         if(e.getTarget('.x-tree-ec-icon', 1)){
  397.             var n = this.getNode(e);
  398.             this.onIconOut(e, n);
  399.             if(n == this.lastEcOver){
  400.                 delete this.lastEcOver;
  401.             }
  402.         }
  403.         if((t = this.getNodeTarget(e)) && !e.within(t, true)){
  404.             this.onNodeOut(e, this.getNode(e));
  405.         }
  406.     },
  407.     delegateOver : function(e, t){
  408.         if(!this.beforeEvent(e)){
  409.             return;
  410.         }
  411.         if(this.lastEcOver){              this.onIconOut(e, this.lastEcOver);
  412.             delete this.lastEcOver;
  413.         }
  414.         if(e.getTarget('.x-tree-ec-icon', 1)){
  415.             this.lastEcOver = this.getNode(e);
  416.             this.onIconOver(e, this.lastEcOver);
  417.         }
  418.         if(t = this.getNodeTarget(e)){
  419.             this.onNodeOver(e, this.getNode(e));
  420.         }
  421.     },
  422.     delegateClick : function(e, t){
  423.         if(!this.beforeEvent(e)){
  424.             return;
  425.         }
  426.         if(e.getTarget('input[type=checkbox]', 1)){
  427.             this.onCheckboxClick(e, this.getNode(e));
  428.         }
  429.         else if(e.getTarget('.x-tree-ec-icon', 1)){
  430.             this.onIconClick(e, this.getNode(e));
  431.         }
  432.         else if(this.getNodeTarget(e)){
  433.             this.onNodeClick(e, this.getNode(e));
  434.         }
  435.     },
  436.     delegateDblClick : function(e, t){
  437.         if(this.beforeEvent(e) && this.getNodeTarget(e)){
  438.             this.onNodeDblClick(e, this.getNode(e));
  439.         }
  440.     },
  441.     delegateContextMenu : function(e, t){
  442.         if(this.beforeEvent(e) && this.getNodeTarget(e)){
  443.             this.onNodeContextMenu(e, this.getNode(e));
  444.         }
  445.     },
  446.     onNodeClick : function(e, node){
  447.         node.ui.onClick(e);
  448.     },
  449.     onNodeOver : function(e, node){
  450.         node.ui.onOver(e);
  451.     },
  452.     onNodeOut : function(e, node){
  453.         node.ui.onOut(e);
  454.     },
  455.     onIconOver : function(e, node){
  456.         node.ui.addClass('x-tree-ec-over');
  457.     },
  458.     onIconOut : function(e, node){
  459.         node.ui.removeClass('x-tree-ec-over');
  460.     },
  461.     onIconClick : function(e, node){
  462.         node.ui.ecClick(e);
  463.     },
  464.     onCheckboxClick : function(e, node){
  465.         node.ui.onCheckChange(e);
  466.     },
  467.     onNodeDblClick : function(e, node){
  468.         node.ui.onDblClick(e);
  469.     },
  470.     onNodeContextMenu : function(e, node){
  471.         node.ui.onContextMenu(e);
  472.     },
  473.     beforeEvent : function(e){
  474.         if(this.disabled){
  475.             e.stopEvent();
  476.             return false;
  477.         }
  478.         return true;
  479.     },
  480.     disable: function(){
  481.         this.disabled = true;
  482.     },
  483.     enable: function(){
  484.         this.disabled = false;
  485.     }
  486. };
  487. Ext.tree.DefaultSelectionModel = function(config){
  488.    this.selNode = null;
  489.    
  490.    this.addEvents(
  491.        
  492.        "selectionchange",
  493.        
  494.        "beforeselect"
  495.    );
  496.     Ext.apply(this, config);
  497.     Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);
  498. };
  499. Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {
  500.     init : function(tree){
  501.         this.tree = tree;
  502.         tree.getTreeEl().on("keydown", this.onKeyDown, this);
  503.         tree.on("click", this.onNodeClick, this);
  504.     },
  505.     
  506.     onNodeClick : function(node, e){
  507.         this.select(node);
  508.     },
  509.     
  510.     
  511.     select : function(node){
  512.         var last = this.selNode;
  513.         if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){
  514.             if(last){
  515.                 last.ui.onSelectedChange(false);
  516.             }
  517.             this.selNode = node;
  518.             node.ui.onSelectedChange(true);
  519.             this.fireEvent("selectionchange", this, node, last);
  520.         }
  521.         return node;
  522.     },
  523.     
  524.     
  525.     unselect : function(node){
  526.         if(this.selNode == node){
  527.             this.clearSelections();
  528.         }    
  529.     },
  530.     
  531.     
  532.     clearSelections : function(){
  533.         var n = this.selNode;
  534.         if(n){
  535.             n.ui.onSelectedChange(false);
  536.             this.selNode = null;
  537.             this.fireEvent("selectionchange", this, null);
  538.         }
  539.         return n;
  540.     },
  541.     
  542.     
  543.     getSelectedNode : function(){
  544.         return this.selNode;    
  545.     },
  546.     
  547.     
  548.     isSelected : function(node){
  549.         return this.selNode == node;  
  550.     },
  551.     
  552.     selectPrevious : function(){
  553.         var s = this.selNode || this.lastSelNode;
  554.         if(!s){
  555.             return null;
  556.         }
  557.         var ps = s.previousSibling;
  558.         if(ps){
  559.             if(!ps.isExpanded() || ps.childNodes.length < 1){
  560.                 return this.select(ps);
  561.             } else{
  562.                 var lc = ps.lastChild;
  563.                 while(lc && lc.isExpanded() && lc.childNodes.length > 0){
  564.                     lc = lc.lastChild;
  565.                 }
  566.                 return this.select(lc);
  567.             }
  568.         } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
  569.             return this.select(s.parentNode);
  570.         }
  571.         return null;
  572.     },
  573.     
  574.     selectNext : function(){
  575.         var s = this.selNode || this.lastSelNode;
  576.         if(!s){
  577.             return null;
  578.         }
  579.         if(s.firstChild && s.isExpanded()){
  580.              return this.select(s.firstChild);
  581.          }else if(s.nextSibling){
  582.              return this.select(s.nextSibling);
  583.          }else if(s.parentNode){
  584.             var newS = null;
  585.             s.parentNode.bubble(function(){
  586.                 if(this.nextSibling){
  587.                     newS = this.getOwnerTree().selModel.select(this.nextSibling);
  588.                     return false;
  589.                 }
  590.             });
  591.             return newS;
  592.          }
  593.         return null;
  594.     },
  595.     onKeyDown : function(e){
  596.         var s = this.selNode || this.lastSelNode;
  597.                  var sm = this;
  598.         if(!s){
  599.             return;
  600.         }
  601.         var k = e.getKey();
  602.         switch(k){
  603.              case e.DOWN:
  604.                  e.stopEvent();
  605.                  this.selectNext();
  606.              break;
  607.              case e.UP:
  608.                  e.stopEvent();
  609.                  this.selectPrevious();
  610.              break;
  611.              case e.RIGHT:
  612.                  e.preventDefault();
  613.                  if(s.hasChildNodes()){
  614.                      if(!s.isExpanded()){
  615.                          s.expand();
  616.                      }else if(s.firstChild){
  617.                          this.select(s.firstChild, e);
  618.                      }
  619.                  }
  620.              break;
  621.              case e.LEFT:
  622.                  e.preventDefault();
  623.                  if(s.hasChildNodes() && s.isExpanded()){
  624.                      s.collapse();
  625.                  }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
  626.                      this.select(s.parentNode, e);
  627.                  }
  628.              break;
  629.         };
  630.     }
  631. });
  632. Ext.tree.MultiSelectionModel = function(config){
  633.    this.selNodes = [];
  634.    this.selMap = {};
  635.    this.addEvents(
  636.        
  637.        "selectionchange"
  638.    );
  639.     Ext.apply(this, config);
  640.     Ext.tree.MultiSelectionModel.superclass.constructor.call(this);
  641. };
  642. Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {
  643.     init : function(tree){
  644.         this.tree = tree;
  645.         tree.getTreeEl().on("keydown", this.onKeyDown, this);
  646.         tree.on("click", this.onNodeClick, this);
  647.     },
  648.     
  649.     onNodeClick : function(node, e){
  650.         this.select(node, e, e.ctrlKey);
  651.     },
  652.     
  653.     
  654.     select : function(node, e, keepExisting){
  655.         if(keepExisting !== true){
  656.             this.clearSelections(true);
  657.         }
  658.         if(this.isSelected(node)){
  659.             this.lastSelNode = node;
  660.             return node;
  661.         }
  662.         this.selNodes.push(node);
  663.         this.selMap[node.id] = node;
  664.         this.lastSelNode = node;
  665.         node.ui.onSelectedChange(true);
  666.         this.fireEvent("selectionchange", this, this.selNodes);
  667.         return node;
  668.     },
  669.     
  670.     
  671.     unselect : function(node){
  672.         if(this.selMap[node.id]){
  673.             node.ui.onSelectedChange(false);
  674.             var sn = this.selNodes;
  675.             var index = sn.indexOf(node);
  676.             if(index != -1){
  677.                 this.selNodes.splice(index, 1);
  678.             }
  679.             delete this.selMap[node.id];
  680.             this.fireEvent("selectionchange", this, this.selNodes);
  681.         }
  682.     },
  683.     
  684.     
  685.     clearSelections : function(suppressEvent){
  686.         var sn = this.selNodes;
  687.         if(sn.length > 0){
  688.             for(var i = 0, len = sn.length; i < len; i++){
  689.                 sn[i].ui.onSelectedChange(false);
  690.             }
  691.             this.selNodes = [];
  692.             this.selMap = {};
  693.             if(suppressEvent !== true){
  694.                 this.fireEvent("selectionchange", this, this.selNodes);
  695.             }
  696.         }
  697.     },
  698.     
  699.     
  700.     isSelected : function(node){
  701.         return this.selMap[node.id] ? true : false;  
  702.     },
  703.     
  704.     
  705.     getSelectedNodes : function(){
  706.         return this.selNodes;    
  707.     },
  708.     onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
  709.     selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
  710.     selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
  711. });
  712. Ext.tree.TreeNode = function(attributes){
  713.     attributes = attributes || {};
  714.     if(typeof attributes == "string"){
  715.         attributes = {text: attributes};
  716.     }
  717.     this.childrenRendered = false;
  718.     this.rendered = false;
  719.     Ext.tree.TreeNode.superclass.constructor.call(this, attributes);
  720.     this.expanded = attributes.expanded === true;
  721.     this.isTarget = attributes.isTarget !== false;
  722.     this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;
  723.     this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;
  724.     
  725.     this.text = attributes.text;
  726.     
  727.     this.disabled = attributes.disabled === true;
  728.     this.addEvents(
  729.         
  730.         "textchange",
  731.         
  732.         "beforeexpand",
  733.         
  734.         "beforecollapse",
  735.         
  736.         "expand",
  737.         
  738.         "disabledchange",
  739.         
  740.         "collapse",
  741.         
  742.         "beforeclick",
  743.         
  744.         "click",
  745.         
  746.         "checkchange",
  747.         
  748.         "dblclick",
  749.         
  750.         "contextmenu",
  751.         
  752.         "beforechildrenrendered"
  753.     );
  754.     var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
  755.     
  756.     this.ui = new uiClass(this);
  757. };
  758. Ext.extend(Ext.tree.TreeNode, Ext.data.Node, {
  759.     preventHScroll: true,
  760.     
  761.     isExpanded : function(){
  762.         return this.expanded;
  763.     },
  764.     getUI : function(){
  765.         return this.ui;
  766.     },
  767.     getLoader : function(){
  768.         var owner;
  769.         return this.loader || ((owner = this.getOwnerTree()) && owner.loader ? owner.loader : new Ext.tree.TreeLoader());
  770.     },
  771.          setFirstChild : function(node){
  772.         var of = this.firstChild;
  773.         Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);
  774.         if(this.childrenRendered && of && node != of){
  775.             of.renderIndent(true, true);
  776.         }
  777.         if(this.rendered){
  778.             this.renderIndent(true, true);
  779.         }
  780.     },
  781.          setLastChild : function(node){
  782.         var ol = this.lastChild;
  783.         Ext.tree.TreeNode.superclass.setLastChild.call(this, node);
  784.         if(this.childrenRendered && ol && node != ol){
  785.             ol.renderIndent(true, true);
  786.         }
  787.         if(this.rendered){
  788.             this.renderIndent(true, true);
  789.         }
  790.     },
  791.               appendChild : function(n){
  792.         if(!n.render && !Ext.isArray(n)){
  793.             n = this.getLoader().createNode(n);
  794.         }
  795.         var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n);
  796.         if(node && this.childrenRendered){
  797.             node.render();
  798.         }
  799.         this.ui.updateExpandIcon();
  800.         return node;
  801.     },
  802.          removeChild : function(node){
  803.         this.ownerTree.getSelectionModel().unselect(node);
  804.         Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
  805.                  if(this.childrenRendered){
  806.             node.ui.remove();
  807.         }
  808.         if(this.childNodes.length < 1){
  809.             this.collapse(false, false);
  810.         }else{
  811.             this.ui.updateExpandIcon();
  812.         }
  813.         if(!this.firstChild && !this.isHiddenRoot()) {
  814.             this.childrenRendered = false;
  815.         }
  816.         return node;
  817.     },
  818.          insertBefore : function(node, refNode){
  819.         if(!node.render){ 
  820.             node = this.getLoader().createNode(node);
  821.         }
  822.         var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments);
  823.         if(newNode && refNode && this.childrenRendered){
  824.             node.render();
  825.         }
  826.         this.ui.updateExpandIcon();
  827.         return newNode;
  828.     },
  829.     
  830.     setText : function(text){
  831.         var oldText = this.text;
  832.         this.text = text;
  833.         this.attributes.text = text;
  834.         if(this.rendered){              this.ui.onTextChange(this, text, oldText);
  835.         }
  836.         this.fireEvent("textchange", this, text, oldText);
  837.     },
  838.     
  839.     select : function(){
  840.         this.getOwnerTree().getSelectionModel().select(this);
  841.     },
  842.     
  843.     unselect : function(){
  844.         this.getOwnerTree().getSelectionModel().unselect(this);
  845.     },
  846.     
  847.     isSelected : function(){
  848.         return this.getOwnerTree().getSelectionModel().isSelected(this);
  849.     },
  850.     
  851.     expand : function(deep, anim, callback){
  852.         if(!this.expanded){
  853.             if(this.fireEvent("beforeexpand", this, deep, anim) === false){
  854.                 return;
  855.             }
  856.             if(!this.childrenRendered){
  857.                 this.renderChildren();
  858.             }
  859.             this.expanded = true;
  860.             if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){
  861.                 this.ui.animExpand(function(){
  862.                     this.fireEvent("expand", this);
  863.                     if(typeof callback == "function"){
  864.                         callback(this);
  865.                     }
  866.                     if(deep === true){
  867.                         this.expandChildNodes(true);
  868.                     }
  869.                 }.createDelegate(this));
  870.                 return;
  871.             }else{
  872.                 this.ui.expand();
  873.                 this.fireEvent("expand", this);
  874.                 if(typeof callback == "function"){
  875.                     callback(this);
  876.                 }
  877.             }
  878.         }else{
  879.            if(typeof callback == "function"){
  880.                callback(this);
  881.            }
  882.         }
  883.         if(deep === true){
  884.             this.expandChildNodes(true);
  885.         }
  886.     },
  887.     isHiddenRoot : function(){
  888.         return this.isRoot && !this.getOwnerTree().rootVisible;
  889.     },
  890.     
  891.     collapse : function(deep, anim){
  892.         if(this.expanded && !this.isHiddenRoot()){
  893.             if(this.fireEvent("beforecollapse", this, deep, anim) === false){
  894.                 return;
  895.             }
  896.             this.expanded = false;
  897.             if((this.getOwnerTree().animate && anim !== false) || anim){
  898.                 this.ui.animCollapse(function(){
  899.                     this.fireEvent("collapse", this);
  900.                     if(deep === true){
  901.                         this.collapseChildNodes(true);
  902.                     }
  903.                 }.createDelegate(this));
  904.                 return;
  905.             }else{
  906.                 this.ui.collapse();
  907.                 this.fireEvent("collapse", this);
  908.             }
  909.         }
  910.         if(deep === true){
  911.             var cs = this.childNodes;
  912.             for(var i = 0, len = cs.length; i < len; i++) {
  913.              cs[i].collapse(true, false);
  914.             }
  915.         }
  916.     },
  917.          delayedExpand : function(delay){
  918.         if(!this.expandProcId){
  919.             this.expandProcId = this.expand.defer(delay, this);
  920.         }
  921.     },
  922.          cancelExpand : function(){
  923.         if(this.expandProcId){
  924.             clearTimeout(this.expandProcId);
  925.         }
  926.         this.expandProcId = false;
  927.     },
  928.     
  929.     toggle : function(){
  930.         if(this.expanded){
  931.             this.collapse();
  932.         }else{
  933.             this.expand();
  934.         }
  935.     },
  936.     
  937.     ensureVisible : function(callback){
  938.         var tree = this.getOwnerTree();
  939.         tree.expandPath(this.parentNode.getPath(), false, function(){
  940.             var node = tree.getNodeById(this.id);               tree.getTreeEl().scrollChildIntoView(node.ui.anchor);
  941.             Ext.callback(callback);
  942.         }.createDelegate(this));
  943.     },
  944.     
  945.     expandChildNodes : function(deep){
  946.         var cs = this.childNodes;
  947.         for(var i = 0, len = cs.length; i < len; i++) {
  948.          cs[i].expand(deep);
  949.         }
  950.     },
  951.     
  952.     collapseChildNodes : function(deep){
  953.         var cs = this.childNodes;
  954.         for(var i = 0, len = cs.length; i < len; i++) {
  955.          cs[i].collapse(deep);
  956.         }
  957.     },
  958.     
  959.     disable : function(){
  960.         this.disabled = true;
  961.         this.unselect();
  962.         if(this.rendered && this.ui.onDisableChange){              this.ui.onDisableChange(this, true);
  963.         }
  964.         this.fireEvent("disabledchange", this, true);
  965.     },
  966.     
  967.     enable : function(){
  968.         this.disabled = false;
  969.         if(this.rendered && this.ui.onDisableChange){              this.ui.onDisableChange(this, false);
  970.         }
  971.         this.fireEvent("disabledchange", this, false);
  972.     },
  973.          renderChildren : function(suppressEvent){
  974.         if(suppressEvent !== false){
  975.             this.fireEvent("beforechildrenrendered", this);
  976.         }
  977.         var cs = this.childNodes;
  978.         for(var i = 0, len = cs.length; i < len; i++){
  979.             cs[i].render(true);
  980.         }
  981.         this.childrenRendered = true;
  982.     },
  983.          sort : function(fn, scope){
  984.         Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
  985.         if(this.childrenRendered){
  986.             var cs = this.childNodes;
  987.             for(var i = 0, len = cs.length; i < len; i++){
  988.                 cs[i].render(true);
  989.             }
  990.         }
  991.     },
  992.          render : function(bulkRender){
  993.         this.ui.render(bulkRender);
  994.         if(!this.rendered){
  995.                          this.getOwnerTree().registerNode(this);
  996.             this.rendered = true;
  997.             if(this.expanded){
  998.                 this.expanded = false;
  999.                 this.expand(false, false);
  1000.             }
  1001.         }
  1002.     },
  1003.          renderIndent : function(deep, refresh){
  1004.         if(refresh){
  1005.             this.ui.childIndent = null;
  1006.         }
  1007.         this.ui.renderIndent();
  1008.         if(deep === true && this.childrenRendered){
  1009.             var cs = this.childNodes;
  1010.             for(var i = 0, len = cs.length; i < len; i++){
  1011.                 cs[i].renderIndent(true, refresh);
  1012.             }
  1013.         }
  1014.     },
  1015.     beginUpdate : function(){
  1016.         this.childrenRendered = false;
  1017.     },
  1018.     endUpdate : function(){
  1019.         if(this.expanded && this.rendered){
  1020.             this.renderChildren();
  1021.         }
  1022.     },
  1023.     destroy : function(){
  1024.         if(this.childNodes){
  1025.         for(var i = 0,l = this.childNodes.length; i < l; i++){
  1026.             this.childNodes[i].destroy();
  1027.         }
  1028.             this.childNodes = null;
  1029.         }
  1030.         if(this.ui.destroy){
  1031.             this.ui.destroy();
  1032.         }
  1033.     }
  1034. });
  1035. Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;
  1036.  Ext.tree.AsyncTreeNode = function(config){
  1037.     this.loaded = config && config.loaded === true;
  1038.     this.loading = false;
  1039.     Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
  1040.     
  1041.     this.addEvents('beforeload', 'load');
  1042.     
  1043.     
  1044. };
  1045. Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
  1046.     expand : function(deep, anim, callback){
  1047.         if(this.loading){              var timer;
  1048.             var f = function(){
  1049.                 if(!this.loading){                      clearInterval(timer);
  1050.                     this.expand(deep, anim, callback);
  1051.                 }
  1052.             }.createDelegate(this);
  1053.             timer = setInterval(f, 200);
  1054.             return;
  1055.         }
  1056.         if(!this.loaded){
  1057.             if(this.fireEvent("beforeload", this) === false){
  1058.                 return;
  1059.             }
  1060.             this.loading = true;
  1061.             this.ui.beforeLoad(this);
  1062.             var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
  1063.             if(loader){
  1064.                 loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback]));
  1065.                 return;
  1066.             }
  1067.         }
  1068.         Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback);
  1069.     },
  1070.     
  1071.     
  1072.     isLoading : function(){
  1073.         return this.loading;  
  1074.     },
  1075.     
  1076.     loadComplete : function(deep, anim, callback){
  1077.         this.loading = false;
  1078.         this.loaded = true;
  1079.         this.ui.afterLoad(this);
  1080.         this.fireEvent("load", this);
  1081.         this.expand(deep, anim, callback);
  1082.     },
  1083.     
  1084.     
  1085.     isLoaded : function(){
  1086.         return this.loaded;
  1087.     },
  1088.     
  1089.     hasChildNodes : function(){
  1090.         if(!this.isLeaf() && !this.loaded){
  1091.             return true;
  1092.         }else{
  1093.             return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);
  1094.         }
  1095.     },
  1096.     
  1097.     reload : function(callback){
  1098.         this.collapse(false, false);
  1099.         while(this.firstChild){
  1100.             this.removeChild(this.firstChild);
  1101.         }
  1102.         this.childrenRendered = false;
  1103.         this.loaded = false;
  1104.         if(this.isHiddenRoot()){
  1105.             this.expanded = false;
  1106.         }
  1107.         this.expand(false, false, callback);
  1108.     }
  1109. });
  1110. Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;
  1111. Ext.tree.TreeNodeUI = function(node){
  1112.     this.node = node;
  1113.     this.rendered = false;
  1114.     this.animating = false;
  1115.     this.wasLeaf = true;
  1116.     this.ecc = 'x-tree-ec-icon x-tree-elbow';
  1117.     this.emptyIcon = Ext.BLANK_IMAGE_URL;
  1118. };
  1119. Ext.tree.TreeNodeUI.prototype = {
  1120.          removeChild : function(node){
  1121.         if(this.rendered){
  1122.             this.ctNode.removeChild(node.ui.getEl());
  1123.         } 
  1124.     },
  1125.          beforeLoad : function(){
  1126.          this.addClass("x-tree-node-loading");
  1127.     },
  1128.          afterLoad : function(){
  1129.          this.removeClass("x-tree-node-loading");
  1130.     },
  1131.          onTextChange : function(node, text, oldText){
  1132.         if(this.rendered){
  1133.             this.textNode.innerHTML = text;
  1134.         }
  1135.     },
  1136.          onDisableChange : function(node, state){
  1137.         this.disabled = state;
  1138. if (this.checkbox) {
  1139. this.checkbox.disabled = state;
  1140. }        
  1141.         if(state){
  1142.             this.addClass("x-tree-node-disabled");
  1143.         }else{
  1144.             this.removeClass("x-tree-node-disabled");
  1145.         } 
  1146.     },
  1147.          onSelectedChange : function(state){
  1148.         if(state){
  1149.             this.focus();
  1150.             this.addClass("x-tree-selected");
  1151.         }else{
  1152.                          this.removeClass("x-tree-selected");
  1153.         }
  1154.     },
  1155.          onMove : function(tree, node, oldParent, newParent, index, refNode){
  1156.         this.childIndent = null;
  1157.         if(this.rendered){
  1158.             var targetNode = newParent.ui.getContainer();
  1159.             if(!targetNode){                 this.holder = document.createElement("div");
  1160.                 this.holder.appendChild(this.wrap);
  1161.                 return;
  1162.             }
  1163.             var insertBefore = refNode ? refNode.ui.getEl() : null;
  1164.             if(insertBefore){
  1165.                 targetNode.insertBefore(this.wrap, insertBefore);
  1166.             }else{
  1167.                 targetNode.appendChild(this.wrap);
  1168.             }
  1169.             this.node.renderIndent(true);
  1170.         }
  1171.     },
  1172.     addClass : function(cls){
  1173.         if(this.elNode){
  1174.             Ext.fly(this.elNode).addClass(cls);
  1175.         }
  1176.     },
  1177.     removeClass : function(cls){
  1178.         if(this.elNode){
  1179.             Ext.fly(this.elNode).removeClass(cls);  
  1180.         }
  1181.     },
  1182.          remove : function(){
  1183.         if(this.rendered){
  1184.             this.holder = document.createElement("div");
  1185.             this.holder.appendChild(this.wrap);
  1186.         }  
  1187.     },
  1188.          fireEvent : function(){
  1189.         return this.node.fireEvent.apply(this.node, arguments);  
  1190.     },
  1191.          initEvents : function(){
  1192.         this.node.on("move", this.onMove, this);
  1193.         if(this.node.disabled){
  1194.             this.addClass("x-tree-node-disabled");
  1195. if (this.checkbox) {
  1196. this.checkbox.disabled = true;
  1197. }            
  1198.         }
  1199.         if(this.node.hidden){
  1200.             this.hide();
  1201.         }
  1202.         var ot = this.node.getOwnerTree();
  1203.         var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;
  1204.         if(dd && (!this.node.isRoot || ot.rootVisible)){
  1205.             Ext.dd.Registry.register(this.elNode, {
  1206.                 node: this.node,
  1207.                 handles: this.getDDHandles(),
  1208.                 isHandle: false
  1209.             });
  1210.         }
  1211.     },
  1212.          getDDHandles : function(){
  1213.         return [this.iconNode, this.textNode, this.elNode];
  1214.     },
  1215.     hide : function(){
  1216.         this.node.hidden = true;
  1217.         if(this.wrap){
  1218.             this.wrap.style.display = "none";
  1219.         }
  1220.     },
  1221.     show : function(){
  1222.         this.node.hidden = false;
  1223.         if(this.wrap){
  1224.             this.wrap.style.display = "";
  1225.         } 
  1226.     },
  1227.          onContextMenu : function(e){
  1228.         if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {
  1229.             e.preventDefault();
  1230.             this.focus();
  1231.             this.fireEvent("contextmenu", this.node, e);
  1232.         }
  1233.     },
  1234.          onClick : function(e){
  1235.         if(this.dropping){
  1236.             e.stopEvent();
  1237.             return;
  1238.         }
  1239.         if(this.fireEvent("beforeclick", this.node, e) !== false){
  1240.             var a = e.getTarget('a');
  1241.             if(!this.disabled && this.node.attributes.href && a){
  1242.                 this.fireEvent("click", this.node, e);
  1243.                 return;
  1244.             }else if(a && e.ctrlKey){
  1245.                 e.stopEvent();
  1246.             }
  1247.             e.preventDefault();
  1248.             if(this.disabled){
  1249.                 return;
  1250.             }
  1251.             if(this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()){
  1252.                 this.node.toggle();
  1253.             }
  1254.             this.fireEvent("click", this.node, e);
  1255.         }else{
  1256.             e.stopEvent();
  1257.         }
  1258.     },
  1259.          onDblClick : function(e){
  1260.         e.preventDefault();
  1261.         if(this.disabled){
  1262.             return;
  1263.         }
  1264.         if(this.checkbox){
  1265.             this.toggleCheck();
  1266.         }
  1267.         if(!this.animating && this.node.isExpandable()){
  1268.             this.node.toggle();
  1269.         }
  1270.         this.fireEvent("dblclick", this.node, e);
  1271.     },
  1272.     onOver : function(e){
  1273.         this.addClass('x-tree-node-over');
  1274.     },
  1275.     onOut : function(e){
  1276.         this.removeClass('x-tree-node-over');
  1277.     },
  1278.          onCheckChange : function(){
  1279.         var checked = this.checkbox.checked;
  1280. this.checkbox.defaultChecked = checked;
  1281.         this.node.attributes.checked = checked;
  1282.         this.fireEvent('checkchange', this.node, checked);
  1283.     },
  1284.          ecClick : function(e){
  1285.         if(!this.animating && this.node.isExpandable()){
  1286.             this.node.toggle();
  1287.         }
  1288.     },
  1289.          startDrop : function(){
  1290.         this.dropping = true;
  1291.     },
  1292.     
  1293.          endDrop : function(){ 
  1294.        setTimeout(function(){
  1295.            this.dropping = false;
  1296.        }.createDelegate(this), 50); 
  1297.     },
  1298.          expand : function(){
  1299.         this.updateExpandIcon();
  1300.         this.ctNode.style.display = "";
  1301.     },
  1302.          focus : function(){
  1303.         if(!this.node.preventHScroll){
  1304.             try{this.anchor.focus();
  1305.             }catch(e){}
  1306.         }else if(!Ext.isIE){
  1307.             try{
  1308.                 var noscroll = this.node.getOwnerTree().getTreeEl().dom;
  1309.                 var l = noscroll.scrollLeft;
  1310.                 this.anchor.focus();
  1311.                 noscroll.scrollLeft = l;
  1312.             }catch(e){}
  1313.         }
  1314.     },
  1315.     toggleCheck : function(value){
  1316.         var cb = this.checkbox;
  1317.         if(cb){
  1318.             cb.checked = (value === undefined ? !cb.checked : value);
  1319.             this.onCheckChange();
  1320.         }
  1321.     },
  1322.          blur : function(){
  1323.         try{
  1324.             this.anchor.blur();
  1325.         }catch(e){} 
  1326.     },
  1327.          animExpand : function(callback){
  1328.         var ct = Ext.get(this.ctNode);
  1329.         ct.stopFx();
  1330.         if(!this.node.isExpandable()){
  1331.             this.updateExpandIcon();
  1332.             this.ctNode.style.display = "";
  1333.             Ext.callback(callback);
  1334.             return;
  1335.         }
  1336.         this.animating = true;
  1337.         this.updateExpandIcon();
  1338.         
  1339.         ct.slideIn('t', {
  1340.            callback : function(){
  1341.                this.animating = false;
  1342.                Ext.callback(callback);
  1343.             },
  1344.             scope: this,
  1345.             duration: this.node.ownerTree.duration || .25
  1346.         });
  1347.     },
  1348.          highlight : function(){
  1349.         var tree = this.node.getOwnerTree();
  1350.         Ext.fly(this.wrap).highlight(
  1351.             tree.hlColor || "C3DAF9",
  1352.             {endColor: tree.hlBaseColor}
  1353.         );
  1354.     },
  1355.          collapse : function(){
  1356.         this.updateExpandIcon();
  1357.         this.ctNode.style.display = "none";
  1358.     },
  1359.          animCollapse : function(callback){
  1360.         var ct = Ext.get(this.ctNode);
  1361.         ct.enableDisplayMode('block');
  1362.         ct.stopFx();
  1363.         this.animating = true;
  1364.         this.updateExpandIcon();
  1365.         ct.slideOut('t', {
  1366.             callback : function(){
  1367.                this.animating = false;
  1368.                Ext.callback(callback);
  1369.             },
  1370.             scope: this,
  1371.             duration: this.node.ownerTree.duration || .25
  1372.         });
  1373.     },
  1374.          getContainer : function(){
  1375.         return this.ctNode;  
  1376.     },
  1377.          getEl : function(){
  1378.         return this.wrap;  
  1379.     },
  1380.          appendDDGhost : function(ghostNode){
  1381.         ghostNode.appendChild(this.elNode.cloneNode(true));
  1382.     },
  1383.          getDDRepairXY : function(){
  1384.         return Ext.lib.Dom.getXY(this.iconNode);
  1385.     },
  1386.          onRender : function(){
  1387.         this.render();    
  1388.     },
  1389.          render : function(bulkRender){
  1390.         var n = this.node, a = n.attributes;
  1391.         var targetNode = n.parentNode ? 
  1392.               n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom;
  1393.         
  1394.         if(!this.rendered){
  1395.             this.rendered = true;
  1396.             this.renderElements(n, a, targetNode, bulkRender);
  1397.             if(a.qtip){
  1398.                if(this.textNode.setAttributeNS){
  1399.                    this.textNode.setAttributeNS("ext", "qtip", a.qtip);
  1400.                    if(a.qtipTitle){
  1401.                        this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle);
  1402.                    }
  1403.                }else{
  1404.                    this.textNode.setAttribute("ext:qtip", a.qtip);
  1405.                    if(a.qtipTitle){
  1406.                        this.textNode.setAttribute("ext:qtitle", a.qtipTitle);
  1407.                    }
  1408.                } 
  1409.             }else if(a.qtipCfg){
  1410.                 a.qtipCfg.target = Ext.id(this.textNode);
  1411.                 Ext.QuickTips.register(a.qtipCfg);
  1412.             }
  1413.             this.initEvents();
  1414.             if(!this.node.expanded){
  1415.                 this.updateExpandIcon(true);
  1416.             }
  1417.         }else{
  1418.             if(bulkRender === true) {
  1419.                 targetNode.appendChild(this.wrap);
  1420.             }
  1421.         }
  1422.     },
  1423.          renderElements : function(n, a, targetNode, bulkRender){
  1424.                  this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';
  1425.         var cb = typeof a.checked == 'boolean';
  1426.         var href = a.href ? a.href : Ext.isGecko ? "" : "#";
  1427.         var buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',
  1428.             '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
  1429.             '<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />',
  1430.             '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />',
  1431.             cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',
  1432.             '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',
  1433.              a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",
  1434.             '<ul class="x-tree-node-ct" style="display:none;"></ul>',
  1435.             "</li>"].join('');
  1436.         var nel;
  1437.         if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){
  1438.             this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);
  1439.         }else{
  1440.             this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);
  1441.         }
  1442.         
  1443.         this.elNode = this.wrap.childNodes[0];
  1444.         this.ctNode = this.wrap.childNodes[1];
  1445.         var cs = this.elNode.childNodes;
  1446.         this.indentNode = cs[0];
  1447.         this.ecNode = cs[1];
  1448.         this.iconNode = cs[2];
  1449.         var index = 3;
  1450.         if(cb){
  1451.             this.checkbox = cs[3];
  1452. this.checkbox.defaultChecked = this.checkbox.checked;
  1453.             index++;
  1454.         }
  1455.         this.anchor = cs[index];
  1456.         this.textNode = cs[index].firstChild;
  1457.     },
  1458.     getAnchor : function(){
  1459.         return this.anchor;
  1460.     },
  1461.     
  1462.     getTextEl : function(){
  1463.         return this.textNode;
  1464.     },
  1465.     
  1466.     getIconEl : function(){
  1467.         return this.iconNode;
  1468.     },
  1469.     isChecked : function(){
  1470.         return this.checkbox ? this.checkbox.checked : false; 
  1471.     },
  1472.          updateExpandIcon : function(){
  1473.         if(this.rendered){
  1474.             var n = this.node, c1, c2;
  1475.             var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow";
  1476.             if(n.isExpandable()){
  1477.                 if(n.expanded){
  1478.                     cls += "-minus";
  1479.                     c1 = "x-tree-node-collapsed";
  1480.                     c2 = "x-tree-node-expanded";
  1481.                 }else{
  1482.                     cls += "-plus";
  1483.                     c1 = "x-tree-node-expanded";
  1484.                     c2 = "x-tree-node-collapsed";
  1485.                 }
  1486.                 if(this.wasLeaf){
  1487.                     this.removeClass("x-tree-node-leaf");
  1488.                     this.wasLeaf = false;
  1489.                 }
  1490.                 if(this.c1 != c1 || this.c2 != c2){
  1491.                     Ext.fly(this.elNode).replaceClass(c1, c2);
  1492.                     this.c1 = c1; this.c2 = c2;
  1493.                 }
  1494.             }else{
  1495.                 if(!this.wasLeaf){
  1496.                     Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf");
  1497.                     delete this.c1;
  1498.                     delete this.c2;
  1499.                     this.wasLeaf = true;
  1500.                 }
  1501.             }
  1502.             var ecc = "x-tree-ec-icon "+cls;
  1503.             if(this.ecc != ecc){
  1504.                 this.ecNode.className = ecc;
  1505.                 this.ecc = ecc;
  1506.             }
  1507.         }
  1508.     },
  1509.          getChildIndent : function(){
  1510.         if(!this.childIndent){
  1511.             var buf = [];
  1512.             var p = this.node;
  1513.             while(p){
  1514.                 if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){
  1515.                     if(!p.isLast()) {