ext-all-debug.js
上传用户:zaktkj
上传日期:2022-08-08
资源大小:5770k
文件大小:910k
源码类别:

JavaScript

开发平台:

JavaScript

  1.                 var diffY = Math.abs(this.startY - e.getPageY());
  2.                 if (diffX > this.clickPixelThresh ||
  3.                             diffY > this.clickPixelThresh) {
  4.                     this.startDrag(this.startX, this.startY);
  5.                 }
  6.             }
  7.             if (this.dragThreshMet) {
  8.                 this.dragCurrent.b4Drag(e);
  9.                 this.dragCurrent.onDrag(e);
  10.                 if(!this.dragCurrent.moveOnly){
  11.                     this.fireEvents(e, false);
  12.                 }
  13.             }
  14.             this.stopEvent(e);
  15.             return true;
  16.         },
  17.         fireEvents: function(e, isDrop) {
  18.             var dc = this.dragCurrent;
  19.             if (!dc || dc.isLocked()) {
  20.                 return;
  21.             }
  22.             var pt = e.getPoint();
  23.             var oldOvers = [];
  24.             var outEvts   = [];
  25.             var overEvts  = [];
  26.             var dropEvts  = [];
  27.             var enterEvts = [];
  28.             for (var i in this.dragOvers) {
  29.                 var ddo = this.dragOvers[i];
  30.                 if (! this.isTypeOfDD(ddo)) {
  31.                     continue;
  32.                 }
  33.                 if (! this.isOverTarget(pt, ddo, this.mode)) {
  34.                     outEvts.push( ddo );
  35.                 }
  36.                 oldOvers[i] = true;
  37.                 delete this.dragOvers[i];
  38.             }
  39.             for (var sGroup in dc.groups) {
  40.                 if ("string" != typeof sGroup) {
  41.                     continue;
  42.                 }
  43.                 for (i in this.ids[sGroup]) {
  44.                     var oDD = this.ids[sGroup][i];
  45.                     if (! this.isTypeOfDD(oDD)) {
  46.                         continue;
  47.                     }
  48.                     if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {
  49.                         if (this.isOverTarget(pt, oDD, this.mode)) {
  50.                             if (isDrop) {
  51.                                 dropEvts.push( oDD );
  52.                             } else {
  53.                                 if (!oldOvers[oDD.id]) {
  54.                                     enterEvts.push( oDD );
  55.                                 } else {
  56.                                     overEvts.push( oDD );
  57.                                 }
  58.                                 this.dragOvers[oDD.id] = oDD;
  59.                             }
  60.                         }
  61.                     }
  62.                 }
  63.             }
  64.             if (this.mode) {
  65.                 if (outEvts.length) {
  66.                     dc.b4DragOut(e, outEvts);
  67.                     dc.onDragOut(e, outEvts);
  68.                 }
  69.                 if (enterEvts.length) {
  70.                     dc.onDragEnter(e, enterEvts);
  71.                 }
  72.                 if (overEvts.length) {
  73.                     dc.b4DragOver(e, overEvts);
  74.                     dc.onDragOver(e, overEvts);
  75.                 }
  76.                 if (dropEvts.length) {
  77.                     dc.b4DragDrop(e, dropEvts);
  78.                     dc.onDragDrop(e, dropEvts);
  79.                 }
  80.             } else {
  81.                 var len = 0;
  82.                 for (i=0, len=outEvts.length; i<len; ++i) {
  83.                     dc.b4DragOut(e, outEvts[i].id);
  84.                     dc.onDragOut(e, outEvts[i].id);
  85.                 }
  86.                 for (i=0,len=enterEvts.length; i<len; ++i) {
  87.                     dc.onDragEnter(e, enterEvts[i].id);
  88.                 }
  89.                 for (i=0,len=overEvts.length; i<len; ++i) {
  90.                     dc.b4DragOver(e, overEvts[i].id);
  91.                     dc.onDragOver(e, overEvts[i].id);
  92.                 }
  93.                 for (i=0, len=dropEvts.length; i<len; ++i) {
  94.                     dc.b4DragDrop(e, dropEvts[i].id);
  95.                     dc.onDragDrop(e, dropEvts[i].id);
  96.                 }
  97.             }
  98.             if (isDrop && !dropEvts.length) {
  99.                 dc.onInvalidDrop(e);
  100.             }
  101.         },
  102.         getBestMatch: function(dds) {
  103.             var winner = null;
  104.             var len = dds.length;
  105.             if (len == 1) {
  106.                 winner = dds[0];
  107.             } else {
  108.                 for (var i=0; i<len; ++i) {
  109.                     var dd = dds[i];
  110.                     if (dd.cursorIsOver) {
  111.                         winner = dd;
  112.                         break;
  113.                     } else {
  114.                         if (!winner ||
  115.                             winner.overlap.getArea() < dd.overlap.getArea()) {
  116.                             winner = dd;
  117.                         }
  118.                     }
  119.                 }
  120.             }
  121.             return winner;
  122.         },
  123.         refreshCache: function(groups) {
  124.             for (var sGroup in groups) {
  125.                 if ("string" != typeof sGroup) {
  126.                     continue;
  127.                 }
  128.                 for (var i in this.ids[sGroup]) {
  129.                     var oDD = this.ids[sGroup][i];
  130.                     if (this.isTypeOfDD(oDD)) {
  131.                         var loc = this.getLocation(oDD);
  132.                         if (loc) {
  133.                             this.locationCache[oDD.id] = loc;
  134.                         } else {
  135.                             delete this.locationCache[oDD.id];
  136.                         }
  137.                     }
  138.                 }
  139.             }
  140.         },
  141.         verifyEl: function(el) {
  142.             if (el) {
  143.                 var parent;
  144.                 if(Ext.isIE){
  145.                     try{
  146.                         parent = el.offsetParent;
  147.                     }catch(e){}
  148.                 }else{
  149.                     parent = el.offsetParent;
  150.                 }
  151.                 if (parent) {
  152.                     return true;
  153.                 }
  154.             }
  155.             return false;
  156.         },
  157.         getLocation: function(oDD) {
  158.             if (! this.isTypeOfDD(oDD)) {
  159.                 return null;
  160.             }
  161.             var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
  162.             try {
  163.                 pos= Ext.lib.Dom.getXY(el);
  164.             } catch (e) { }
  165.             if (!pos) {
  166.                 return null;
  167.             }
  168.             x1 = pos[0];
  169.             x2 = x1 + el.offsetWidth;
  170.             y1 = pos[1];
  171.             y2 = y1 + el.offsetHeight;
  172.             t = y1 - oDD.padding[0];
  173.             r = x2 + oDD.padding[1];
  174.             b = y2 + oDD.padding[2];
  175.             l = x1 - oDD.padding[3];
  176.             return new Ext.lib.Region( t, r, b, l );
  177.         },
  178.         isOverTarget: function(pt, oTarget, intersect) {
  179.             var loc = this.locationCache[oTarget.id];
  180.             if (!loc || !this.useCache) {
  181.                 loc = this.getLocation(oTarget);
  182.                 this.locationCache[oTarget.id] = loc;
  183.             }
  184.             if (!loc) {
  185.                 return false;
  186.             }
  187.             oTarget.cursorIsOver = loc.contains( pt );
  188.             var dc = this.dragCurrent;
  189.             if (!dc || !dc.getTargetCoord ||
  190.                     (!intersect && !dc.constrainX && !dc.constrainY)) {
  191.                 return oTarget.cursorIsOver;
  192.             }
  193.             oTarget.overlap = null;
  194.             var pos = dc.getTargetCoord(pt.x, pt.y);
  195.             var el = dc.getDragEl();
  196.             var curRegion = new Ext.lib.Region( pos.y,
  197.                                                    pos.x + el.offsetWidth,
  198.                                                    pos.y + el.offsetHeight,
  199.                                                    pos.x );
  200.             var overlap = curRegion.intersect(loc);
  201.             if (overlap) {
  202.                 oTarget.overlap = overlap;
  203.                 return (intersect) ? true : oTarget.cursorIsOver;
  204.             } else {
  205.                 return false;
  206.             }
  207.         },
  208.         _onUnload: function(e, me) {
  209.             Ext.dd.DragDropMgr.unregAll();
  210.         },
  211.         unregAll: function() {
  212.             if (this.dragCurrent) {
  213.                 this.stopDrag();
  214.                 this.dragCurrent = null;
  215.             }
  216.             this._execOnAll("unreg", []);
  217.             for (var i in this.elementCache) {
  218.                 delete this.elementCache[i];
  219.             }
  220.             this.elementCache = {};
  221.             this.ids = {};
  222.         },
  223.         elementCache: {},
  224.         getElWrapper: function(id) {
  225.             var oWrapper = this.elementCache[id];
  226.             if (!oWrapper || !oWrapper.el) {
  227.                 oWrapper = this.elementCache[id] =
  228.                     new this.ElementWrapper(Ext.getDom(id));
  229.             }
  230.             return oWrapper;
  231.         },
  232.         getElement: function(id) {
  233.             return Ext.getDom(id);
  234.         },
  235.         getCss: function(id) {
  236.             var el = Ext.getDom(id);
  237.             return (el) ? el.style : null;
  238.         },
  239.         ElementWrapper: function(el) {
  240.                 this.el = el || null;
  241.                 this.id = this.el && el.id;
  242.                 this.css = this.el && el.style;
  243.             },
  244.         getPosX: function(el) {
  245.             return Ext.lib.Dom.getX(el);
  246.         },
  247.         getPosY: function(el) {
  248.             return Ext.lib.Dom.getY(el);
  249.         },
  250.         swapNode: function(n1, n2) {
  251.             if (n1.swapNode) {
  252.                 n1.swapNode(n2);
  253.             } else {
  254.                 var p = n2.parentNode;
  255.                 var s = n2.nextSibling;
  256.                 if (s == n1) {
  257.                     p.insertBefore(n1, n2);
  258.                 } else if (n2 == n1.nextSibling) {
  259.                     p.insertBefore(n2, n1);
  260.                 } else {
  261.                     n1.parentNode.replaceChild(n2, n1);
  262.                     p.insertBefore(n1, s);
  263.                 }
  264.             }
  265.         },
  266.         getScroll: function () {
  267.             var t, l, dde=document.documentElement, db=document.body;
  268.             if (dde && (dde.scrollTop || dde.scrollLeft)) {
  269.                 t = dde.scrollTop;
  270.                 l = dde.scrollLeft;
  271.             } else if (db) {
  272.                 t = db.scrollTop;
  273.                 l = db.scrollLeft;
  274.             } else {
  275.             }
  276.             return { top: t, left: l };
  277.         },
  278.         getStyle: function(el, styleProp) {
  279.             return Ext.fly(el).getStyle(styleProp);
  280.         },
  281.         getScrollTop: function () { return this.getScroll().top; },
  282.         getScrollLeft: function () { return this.getScroll().left; },
  283.         moveToEl: function (moveEl, targetEl) {
  284.             var aCoord = Ext.lib.Dom.getXY(targetEl);
  285.             Ext.lib.Dom.setXY(moveEl, aCoord);
  286.         },
  287.         numericSort: function(a, b) { return (a - b); },
  288.         _timeoutCount: 0,
  289.         _addListeners: function() {
  290.             var DDM = Ext.dd.DDM;
  291.             if ( Ext.lib.Event && document ) {
  292.                 DDM._onLoad();
  293.             } else {
  294.                 if (DDM._timeoutCount > 2000) {
  295.                 } else {
  296.                     setTimeout(DDM._addListeners, 10);
  297.                     if (document && document.body) {
  298.                         DDM._timeoutCount += 1;
  299.                     }
  300.                 }
  301.             }
  302.         },
  303.         handleWasClicked: function(node, id) {
  304.             if (this.isHandle(id, node.id)) {
  305.                 return true;
  306.             } else {
  307.                 var p = node.parentNode;
  308.                 while (p) {
  309.                     if (this.isHandle(id, p.id)) {
  310.                         return true;
  311.                     } else {
  312.                         p = p.parentNode;
  313.                     }
  314.                 }
  315.             }
  316.             return false;
  317.         }
  318.     };
  319. }();
  320. Ext.dd.DDM = Ext.dd.DragDropMgr;
  321. Ext.dd.DDM._addListeners();
  322. }
  323. Ext.dd.DD = function(id, sGroup, config) {
  324.     if (id) {
  325.         this.init(id, sGroup, config);
  326.     }
  327. };
  328. Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
  329.     scroll: true,
  330.     autoOffset: function(iPageX, iPageY) {
  331.         var x = iPageX - this.startPageX;
  332.         var y = iPageY - this.startPageY;
  333.         this.setDelta(x, y);
  334.     },
  335.     setDelta: function(iDeltaX, iDeltaY) {
  336.         this.deltaX = iDeltaX;
  337.         this.deltaY = iDeltaY;
  338.     },
  339.     setDragElPos: function(iPageX, iPageY) {
  340.         var el = this.getDragEl();
  341.         this.alignElWithMouse(el, iPageX, iPageY);
  342.     },
  343.     alignElWithMouse: function(el, iPageX, iPageY) {
  344.         var oCoord = this.getTargetCoord(iPageX, iPageY);
  345.         var fly = el.dom ? el : Ext.fly(el, '_dd');
  346.         if (!this.deltaSetXY) {
  347.             var aCoord = [oCoord.x, oCoord.y];
  348.             fly.setXY(aCoord);
  349.             var newLeft = fly.getLeft(true);
  350.             var newTop  = fly.getTop(true);
  351.             this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
  352.         } else {
  353.             fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
  354.         }
  355.         this.cachePosition(oCoord.x, oCoord.y);
  356.         this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
  357.         return oCoord;
  358.     },
  359.     cachePosition: function(iPageX, iPageY) {
  360.         if (iPageX) {
  361.             this.lastPageX = iPageX;
  362.             this.lastPageY = iPageY;
  363.         } else {
  364.             var aCoord = Ext.lib.Dom.getXY(this.getEl());
  365.             this.lastPageX = aCoord[0];
  366.             this.lastPageY = aCoord[1];
  367.         }
  368.     },
  369.     autoScroll: function(x, y, h, w) {
  370.         if (this.scroll) {
  371.             var clientH = Ext.lib.Dom.getViewHeight();
  372.             var clientW = Ext.lib.Dom.getViewWidth();
  373.             var st = this.DDM.getScrollTop();
  374.             var sl = this.DDM.getScrollLeft();
  375.             var bot = h + y;
  376.             var right = w + x;
  377.             var toBot = (clientH + st - y - this.deltaY);
  378.             var toRight = (clientW + sl - x - this.deltaX);
  379.             var thresh = 40;
  380.             var scrAmt = (document.all) ? 80 : 30;
  381.             if ( bot > clientH && toBot < thresh ) {
  382.                 window.scrollTo(sl, st + scrAmt);
  383.             }
  384.             if ( y < st && st > 0 && y - st < thresh ) {
  385.                 window.scrollTo(sl, st - scrAmt);
  386.             }
  387.             if ( right > clientW && toRight < thresh ) {
  388.                 window.scrollTo(sl + scrAmt, st);
  389.             }
  390.             if ( x < sl && sl > 0 && x - sl < thresh ) {
  391.                 window.scrollTo(sl - scrAmt, st);
  392.             }
  393.         }
  394.     },
  395.     getTargetCoord: function(iPageX, iPageY) {
  396.         var x = iPageX - this.deltaX;
  397.         var y = iPageY - this.deltaY;
  398.         if (this.constrainX) {
  399.             if (x < this.minX) { x = this.minX; }
  400.             if (x > this.maxX) { x = this.maxX; }
  401.         }
  402.         if (this.constrainY) {
  403.             if (y < this.minY) { y = this.minY; }
  404.             if (y > this.maxY) { y = this.maxY; }
  405.         }
  406.         x = this.getTick(x, this.xTicks);
  407.         y = this.getTick(y, this.yTicks);
  408.         return {x:x, y:y};
  409.     },
  410.     applyConfig: function() {
  411.         Ext.dd.DD.superclass.applyConfig.call(this);
  412.         this.scroll = (this.config.scroll !== false);
  413.     },
  414.     b4MouseDown: function(e) {
  415.         this.autoOffset(e.getPageX(),
  416.                             e.getPageY());
  417.     },
  418.     b4Drag: function(e) {
  419.         this.setDragElPos(e.getPageX(),
  420.                             e.getPageY());
  421.     },
  422.     toString: function() {
  423.         return ("DD " + this.id);
  424.     }
  425. });
  426. Ext.dd.DDProxy = function(id, sGroup, config) {
  427.     if (id) {
  428.         this.init(id, sGroup, config);
  429.         this.initFrame();
  430.     }
  431. };
  432. Ext.dd.DDProxy.dragElId = "ygddfdiv";
  433. Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
  434.     resizeFrame: true,
  435.     centerFrame: false,
  436.     createFrame: function() {
  437.         var self = this;
  438.         var body = document.body;
  439.         if (!body || !body.firstChild) {
  440.             setTimeout( function() { self.createFrame(); }, 50 );
  441.             return;
  442.         }
  443.         var div = this.getDragEl();
  444.         if (!div) {
  445.             div    = document.createElement("div");
  446.             div.id = this.dragElId;
  447.             var s  = div.style;
  448.             s.position   = "absolute";
  449.             s.visibility = "hidden";
  450.             s.cursor     = "move";
  451.             s.border     = "2px solid #aaa";
  452.             s.zIndex     = 999;
  453.             body.insertBefore(div, body.firstChild);
  454.         }
  455.     },
  456.     initFrame: function() {
  457.         this.createFrame();
  458.     },
  459.     applyConfig: function() {
  460.         Ext.dd.DDProxy.superclass.applyConfig.call(this);
  461.         this.resizeFrame = (this.config.resizeFrame !== false);
  462.         this.centerFrame = (this.config.centerFrame);
  463.         this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
  464.     },
  465.     showFrame: function(iPageX, iPageY) {
  466.         var el = this.getEl();
  467.         var dragEl = this.getDragEl();
  468.         var s = dragEl.style;
  469.         this._resizeProxy();
  470.         if (this.centerFrame) {
  471.             this.setDelta( Math.round(parseInt(s.width,  10)/2),
  472.                            Math.round(parseInt(s.height, 10)/2) );
  473.         }
  474.         this.setDragElPos(iPageX, iPageY);
  475.         Ext.fly(dragEl).show();
  476.     },
  477.     _resizeProxy: function() {
  478.         if (this.resizeFrame) {
  479.             var el = this.getEl();
  480.             Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
  481.         }
  482.     },
  483.     b4MouseDown: function(e) {
  484.         var x = e.getPageX();
  485.         var y = e.getPageY();
  486.         this.autoOffset(x, y);
  487.         this.setDragElPos(x, y);
  488.     },
  489.     b4StartDrag: function(x, y) {
  490.         this.showFrame(x, y);
  491.     },
  492.     b4EndDrag: function(e) {
  493.         Ext.fly(this.getDragEl()).hide();
  494.     },
  495.     endDrag: function(e) {
  496.         var lel = this.getEl();
  497.         var del = this.getDragEl();
  498.         del.style.visibility = "";
  499.         this.beforeMove();
  500.         lel.style.visibility = "hidden";
  501.         Ext.dd.DDM.moveToEl(lel, del);
  502.         del.style.visibility = "hidden";
  503.         lel.style.visibility = "";
  504.         this.afterDrag();
  505.     },
  506.     beforeMove : function(){
  507.     },
  508.     afterDrag : function(){
  509.     },
  510.     toString: function() {
  511.         return ("DDProxy " + this.id);
  512.     }
  513. });
  514. Ext.dd.DDTarget = function(id, sGroup, config) {
  515.     if (id) {
  516.         this.initTarget(id, sGroup, config);
  517.     }
  518. };
  519. Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
  520.     toString: function() {
  521.         return ("DDTarget " + this.id);
  522.     }
  523. });
  524. Ext.dd.DragTracker = function(config){
  525.     Ext.apply(this, config);
  526.     this.addEvents(
  527.         'mousedown',
  528.         'mouseup',
  529.         'mousemove',
  530.         'dragstart',
  531.         'dragend',
  532.         'drag'
  533.     );
  534.     this.dragRegion = new Ext.lib.Region(0,0,0,0);
  535.     if(this.el){
  536.         this.initEl(this.el);
  537.     }
  538. }
  539. Ext.extend(Ext.dd.DragTracker, Ext.util.Observable,  {
  540.     active: false,
  541.     tolerance: 5,
  542.     autoStart: false,
  543.     initEl: function(el){
  544.         this.el = Ext.get(el);
  545.         el.on('mousedown', this.onMouseDown, this,
  546.                 this.delegate ? {delegate: this.delegate} : undefined);
  547.     },
  548.     destroy : function(){
  549.         this.el.un('mousedown', this.onMouseDown, this);
  550.     },
  551.     onMouseDown: function(e, target){
  552.         if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){
  553.             this.startXY = this.lastXY = e.getXY();
  554.             this.dragTarget = this.delegate ? target : this.el.dom;
  555.             e.preventDefault();
  556.             var doc = Ext.getDoc();
  557.             doc.on('mouseup', this.onMouseUp, this);
  558.             doc.on('mousemove', this.onMouseMove, this);
  559.             doc.on('selectstart', this.stopSelect, this);
  560.             if(this.autoStart){
  561.                 this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this);
  562.             }
  563.         }
  564.     },
  565.     onMouseMove: function(e, target){
  566.         e.preventDefault();
  567.         var xy = e.getXY(), s = this.startXY;
  568.         this.lastXY = xy;
  569.         if(!this.active){
  570.             if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){
  571.                 this.triggerStart();
  572.             }else{
  573.                 return;
  574.             }
  575.         }
  576.         this.fireEvent('mousemove', this, e);
  577.         this.onDrag(e);
  578.         this.fireEvent('drag', this, e);
  579.     },
  580.     onMouseUp: function(e){
  581.         var doc = Ext.getDoc();
  582.         doc.un('mousemove', this.onMouseMove, this);
  583.         doc.un('mouseup', this.onMouseUp, this);
  584.         doc.un('selectstart', this.stopSelect, this);
  585.         e.preventDefault();
  586.         this.clearStart();
  587.         this.active = false;
  588.         delete this.elRegion;
  589.         this.fireEvent('mouseup', this, e);
  590.         this.onEnd(e);
  591.         this.fireEvent('dragend', this, e);
  592.     },
  593.     triggerStart: function(isTimer){
  594.         this.clearStart();
  595.         this.active = true;
  596.         this.onStart(this.startXY);
  597.         this.fireEvent('dragstart', this, this.startXY);
  598.     },
  599.     clearStart : function(){
  600.         if(this.timer){
  601.             clearTimeout(this.timer);
  602.             delete this.timer;
  603.         }
  604.     },
  605.     stopSelect : function(e){
  606.         e.stopEvent();
  607.         return false;
  608.     },
  609.     onBeforeStart : function(e){
  610.     },
  611.     onStart : function(xy){
  612.     },
  613.     onDrag : function(e){
  614.     },
  615.     onEnd : function(e){
  616.     },
  617.     getDragTarget : function(){
  618.         return this.dragTarget;
  619.     },
  620.     getDragCt : function(){
  621.         return this.el;
  622.     },
  623.     getXY : function(constrain){
  624.         return constrain ?
  625.                this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;
  626.     },
  627.     getOffset : function(constrain){
  628.         var xy = this.getXY(constrain);
  629.         var s = this.startXY;
  630.         return [s[0]-xy[0], s[1]-xy[1]];
  631.     },
  632.     constrainModes: {
  633.         'point' : function(xy){
  634.             if(!this.elRegion){
  635.                 this.elRegion = this.getDragCt().getRegion();
  636.             }
  637.             var dr = this.dragRegion;
  638.             dr.left = xy[0];
  639.             dr.top = xy[1];
  640.             dr.right = xy[0];
  641.             dr.bottom = xy[1];
  642.             dr.constrainTo(this.elRegion);
  643.             return [dr.left, dr.top];
  644.         }
  645.     }
  646. });
  647. Ext.dd.ScrollManager = function(){
  648.     var ddm = Ext.dd.DragDropMgr;
  649.     var els = {};
  650.     var dragEl = null;
  651.     var proc = {};
  652.     var onStop = function(e){
  653.         dragEl = null;
  654.         clearProc();
  655.     };
  656.     var triggerRefresh = function(){
  657.         if(ddm.dragCurrent){
  658.              ddm.refreshCache(ddm.dragCurrent.groups);
  659.         }
  660.     };
  661.     var doScroll = function(){
  662.         if(ddm.dragCurrent){
  663.             var dds = Ext.dd.ScrollManager;
  664.             var inc = proc.el.ddScrollConfig ?
  665.                       proc.el.ddScrollConfig.increment : dds.increment;
  666.             if(!dds.animate){
  667.                 if(proc.el.scroll(proc.dir, inc)){
  668.                     triggerRefresh();
  669.                 }
  670.             }else{
  671.                 proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
  672.             }
  673.         }
  674.     };
  675.     var clearProc = function(){
  676.         if(proc.id){
  677.             clearInterval(proc.id);
  678.         }
  679.         proc.id = 0;
  680.         proc.el = null;
  681.         proc.dir = "";
  682.     };
  683.     var startProc = function(el, dir){
  684.         clearProc();
  685.         proc.el = el;
  686.         proc.dir = dir;
  687.         proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency);
  688.     };
  689.     var onFire = function(e, isDrop){
  690.         if(isDrop || !ddm.dragCurrent){ return; }
  691.         var dds = Ext.dd.ScrollManager;
  692.         if(!dragEl || dragEl != ddm.dragCurrent){
  693.             dragEl = ddm.dragCurrent;
  694.             dds.refreshCache();
  695.         }
  696.         var xy = Ext.lib.Event.getXY(e);
  697.         var pt = new Ext.lib.Point(xy[0], xy[1]);
  698.         for(var id in els){
  699.             var el = els[id], r = el._region;
  700.             var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
  701.             if(r && r.contains(pt) && el.isScrollable()){
  702.                 if(r.bottom - pt.y <= c.vthresh){
  703.                     if(proc.el != el){
  704.                         startProc(el, "down");
  705.                     }
  706.                     return;
  707.                 }else if(r.right - pt.x <= c.hthresh){
  708.                     if(proc.el != el){
  709.                         startProc(el, "left");
  710.                     }
  711.                     return;
  712.                 }else if(pt.y - r.top <= c.vthresh){
  713.                     if(proc.el != el){
  714.                         startProc(el, "up");
  715.                     }
  716.                     return;
  717.                 }else if(pt.x - r.left <= c.hthresh){
  718.                     if(proc.el != el){
  719.                         startProc(el, "right");
  720.                     }
  721.                     return;
  722.                 }
  723.             }
  724.         }
  725.         clearProc();
  726.     };
  727.     ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
  728.     ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
  729.     return {
  730.         register : function(el){
  731.             if(Ext.isArray(el)){
  732.                 for(var i = 0, len = el.length; i < len; i++) {
  733.                     this.register(el[i]);
  734.                 }
  735.             }else{
  736.                 el = Ext.get(el);
  737.                 els[el.id] = el;
  738.             }
  739.         },
  740.         unregister : function(el){
  741.             if(Ext.isArray(el)){
  742.                 for(var i = 0, len = el.length; i < len; i++) {
  743.                     this.unregister(el[i]);
  744.                 }
  745.             }else{
  746.                 el = Ext.get(el);
  747.                 delete els[el.id];
  748.             }
  749.         },
  750.         vthresh : 25,
  751.         hthresh : 25,
  752.         increment : 100,
  753.         frequency : 500,
  754.         animate: true,
  755.         animDuration: .4,
  756.         refreshCache : function(){
  757.             for(var id in els){
  758.                 if(typeof els[id] == 'object'){
  759.                     els[id]._region = els[id].getRegion();
  760.                 }
  761.             }
  762.         }
  763.     };
  764. }();
  765. Ext.dd.Registry = function(){
  766.     var elements = {};
  767.     var handles = {};
  768.     var autoIdSeed = 0;
  769.     var getId = function(el, autogen){
  770.         if(typeof el == "string"){
  771.             return el;
  772.         }
  773.         var id = el.id;
  774.         if(!id && autogen !== false){
  775.             id = "extdd-" + (++autoIdSeed);
  776.             el.id = id;
  777.         }
  778.         return id;
  779.     };
  780.     return {
  781.         register : function(el, data){
  782.             data = data || {};
  783.             if(typeof el == "string"){
  784.                 el = document.getElementById(el);
  785.             }
  786.             data.ddel = el;
  787.             elements[getId(el)] = data;
  788.             if(data.isHandle !== false){
  789.                 handles[data.ddel.id] = data;
  790.             }
  791.             if(data.handles){
  792.                 var hs = data.handles;
  793.                 for(var i = 0, len = hs.length; i < len; i++){
  794.                     handles[getId(hs[i])] = data;
  795.                 }
  796.             }
  797.         },
  798.         unregister : function(el){
  799.             var id = getId(el, false);
  800.             var data = elements[id];
  801.             if(data){
  802.                 delete elements[id];
  803.                 if(data.handles){
  804.                     var hs = data.handles;
  805.                     for(var i = 0, len = hs.length; i < len; i++){
  806.                         delete handles[getId(hs[i], false)];
  807.                     }
  808.                 }
  809.             }
  810.         },
  811.         getHandle : function(id){
  812.             if(typeof id != "string"){
  813.                 id = id.id;
  814.             }
  815.             return handles[id];
  816.         },
  817.         getHandleFromEvent : function(e){
  818.             var t = Ext.lib.Event.getTarget(e);
  819.             return t ? handles[t.id] : null;
  820.         },
  821.         getTarget : function(id){
  822.             if(typeof id != "string"){
  823.                 id = id.id;
  824.             }
  825.             return elements[id];
  826.         },
  827.         getTargetFromEvent : function(e){
  828.             var t = Ext.lib.Event.getTarget(e);
  829.             return t ? elements[t.id] || handles[t.id] : null;
  830.         }
  831.     };
  832. }();
  833. Ext.dd.StatusProxy = function(config){
  834.     Ext.apply(this, config);
  835.     this.id = this.id || Ext.id();
  836.     this.el = new Ext.Layer({
  837.         dh: {
  838.             id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [
  839.                 {tag: "div", cls: "x-dd-drop-icon"},
  840.                 {tag: "div", cls: "x-dd-drag-ghost"}
  841.             ]
  842.         },
  843.         shadow: !config || config.shadow !== false
  844.     });
  845.     this.ghost = Ext.get(this.el.dom.childNodes[1]);
  846.     this.dropStatus = this.dropNotAllowed;
  847. };
  848. Ext.dd.StatusProxy.prototype = {
  849.     dropAllowed : "x-dd-drop-ok",
  850.     dropNotAllowed : "x-dd-drop-nodrop",
  851.     setStatus : function(cssClass){
  852.         cssClass = cssClass || this.dropNotAllowed;
  853.         if(this.dropStatus != cssClass){
  854.             this.el.replaceClass(this.dropStatus, cssClass);
  855.             this.dropStatus = cssClass;
  856.         }
  857.     },
  858.     reset : function(clearGhost){
  859.         this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
  860.         this.dropStatus = this.dropNotAllowed;
  861.         if(clearGhost){
  862.             this.ghost.update("");
  863.         }
  864.     },
  865.     update : function(html){
  866.         if(typeof html == "string"){
  867.             this.ghost.update(html);
  868.         }else{
  869.             this.ghost.update("");
  870.             html.style.margin = "0";
  871.             this.ghost.dom.appendChild(html);
  872.         }
  873.     },
  874.     getEl : function(){
  875.         return this.el;
  876.     },
  877.     getGhost : function(){
  878.         return this.ghost;
  879.     },
  880.     hide : function(clear){
  881.         this.el.hide();
  882.         if(clear){
  883.             this.reset(true);
  884.         }
  885.     },
  886.     stop : function(){
  887.         if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
  888.             this.anim.stop();
  889.         }
  890.     },
  891.     show : function(){
  892.         this.el.show();
  893.     },
  894.     sync : function(){
  895.         this.el.sync();
  896.     },
  897.     repair : function(xy, callback, scope){
  898.         this.callback = callback;
  899.         this.scope = scope;
  900.         if(xy && this.animRepair !== false){
  901.             this.el.addClass("x-dd-drag-repair");
  902.             this.el.hideUnders(true);
  903.             this.anim = this.el.shift({
  904.                 duration: this.repairDuration || .5,
  905.                 easing: 'easeOut',
  906.                 xy: xy,
  907.                 stopFx: true,
  908.                 callback: this.afterRepair,
  909.                 scope: this
  910.             });
  911.         }else{
  912.             this.afterRepair();
  913.         }
  914.     },
  915.     afterRepair : function(){
  916.         this.hide(true);
  917.         if(typeof this.callback == "function"){
  918.             this.callback.call(this.scope || this);
  919.         }
  920.         this.callback = null;
  921.         this.scope = null;
  922.     }
  923. };
  924. Ext.dd.DragSource = function(el, config){
  925.     this.el = Ext.get(el);
  926.     if(!this.dragData){
  927.         this.dragData = {};
  928.     }
  929.     Ext.apply(this, config);
  930.     if(!this.proxy){
  931.         this.proxy = new Ext.dd.StatusProxy();
  932.     }
  933.     Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group,
  934.           {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});
  935.     this.dragging = false;
  936. };
  937. Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
  938.     dropAllowed : "x-dd-drop-ok",
  939.     dropNotAllowed : "x-dd-drop-nodrop",
  940.     getDragData : function(e){
  941.         return this.dragData;
  942.     },
  943.     onDragEnter : function(e, id){
  944.         var target = Ext.dd.DragDropMgr.getDDById(id);
  945.         this.cachedTarget = target;
  946.         if(this.beforeDragEnter(target, e, id) !== false){
  947.             if(target.isNotifyTarget){
  948.                 var status = target.notifyEnter(this, e, this.dragData);
  949.                 this.proxy.setStatus(status);
  950.             }else{
  951.                 this.proxy.setStatus(this.dropAllowed);
  952.             }
  953.             if(this.afterDragEnter){
  954.                 this.afterDragEnter(target, e, id);
  955.             }
  956.         }
  957.     },
  958.     beforeDragEnter : function(target, e, id){
  959.         return true;
  960.     },
  961.     alignElWithMouse: function() {
  962.         Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
  963.         this.proxy.sync();
  964.     },
  965.     onDragOver : function(e, id){
  966.         var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
  967.         if(this.beforeDragOver(target, e, id) !== false){
  968.             if(target.isNotifyTarget){
  969.                 var status = target.notifyOver(this, e, this.dragData);
  970.                 this.proxy.setStatus(status);
  971.             }
  972.             if(this.afterDragOver){
  973.                 this.afterDragOver(target, e, id);
  974.             }
  975.         }
  976.     },
  977.     beforeDragOver : function(target, e, id){
  978.         return true;
  979.     },
  980.     onDragOut : function(e, id){
  981.         var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
  982.         if(this.beforeDragOut(target, e, id) !== false){
  983.             if(target.isNotifyTarget){
  984.                 target.notifyOut(this, e, this.dragData);
  985.             }
  986.             this.proxy.reset();
  987.             if(this.afterDragOut){
  988.                 this.afterDragOut(target, e, id);
  989.             }
  990.         }
  991.         this.cachedTarget = null;
  992.     },
  993.     beforeDragOut : function(target, e, id){
  994.         return true;
  995.     },
  996.     onDragDrop : function(e, id){
  997.         var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
  998.         if(this.beforeDragDrop(target, e, id) !== false){
  999.             if(target.isNotifyTarget){
  1000.                 if(target.notifyDrop(this, e, this.dragData)){
  1001.                     this.onValidDrop(target, e, id);
  1002.                 }else{
  1003.                     this.onInvalidDrop(target, e, id);
  1004.                 }
  1005.             }else{
  1006.                 this.onValidDrop(target, e, id);
  1007.             }
  1008.             if(this.afterDragDrop){
  1009.                 this.afterDragDrop(target, e, id);
  1010.             }
  1011.         }
  1012.         delete this.cachedTarget;
  1013.     },
  1014.     beforeDragDrop : function(target, e, id){
  1015.         return true;
  1016.     },
  1017.     onValidDrop : function(target, e, id){
  1018.         this.hideProxy();
  1019.         if(this.afterValidDrop){
  1020.             this.afterValidDrop(target, e, id);
  1021.         }
  1022.     },
  1023.     getRepairXY : function(e, data){
  1024.         return this.el.getXY();
  1025.     },
  1026.     onInvalidDrop : function(target, e, id){
  1027.         this.beforeInvalidDrop(target, e, id);
  1028.         if(this.cachedTarget){
  1029.             if(this.cachedTarget.isNotifyTarget){
  1030.                 this.cachedTarget.notifyOut(this, e, this.dragData);
  1031.             }
  1032.             this.cacheTarget = null;
  1033.         }
  1034.         this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
  1035.         if(this.afterInvalidDrop){
  1036.             this.afterInvalidDrop(e, id);
  1037.         }
  1038.     },
  1039.     afterRepair : function(){
  1040.         if(Ext.enableFx){
  1041.             this.el.highlight(this.hlColor || "c3daf9");
  1042.         }
  1043.         this.dragging = false;
  1044.     },
  1045.     beforeInvalidDrop : function(target, e, id){
  1046.         return true;
  1047.     },
  1048.     handleMouseDown : function(e){
  1049.         if(this.dragging) {
  1050.             return;
  1051.         }
  1052.         var data = this.getDragData(e);
  1053.         if(data && this.onBeforeDrag(data, e) !== false){
  1054.             this.dragData = data;
  1055.             this.proxy.stop();
  1056.             Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);
  1057.         }
  1058.     },
  1059.     onBeforeDrag : function(data, e){
  1060.         return true;
  1061.     },
  1062.     onStartDrag : Ext.emptyFn,
  1063.     startDrag : function(x, y){
  1064.         this.proxy.reset();
  1065.         this.dragging = true;
  1066.         this.proxy.update("");
  1067.         this.onInitDrag(x, y);
  1068.         this.proxy.show();
  1069.     },
  1070.     onInitDrag : function(x, y){
  1071.         var clone = this.el.dom.cloneNode(true);
  1072.         clone.id = Ext.id();
  1073.         this.proxy.update(clone);
  1074.         this.onStartDrag(x, y);
  1075.         return true;
  1076.     },
  1077.     getProxy : function(){
  1078.         return this.proxy;
  1079.     },
  1080.     hideProxy : function(){
  1081.         this.proxy.hide();
  1082.         this.proxy.reset(true);
  1083.         this.dragging = false;
  1084.     },
  1085.     triggerCacheRefresh : function(){
  1086.         Ext.dd.DDM.refreshCache(this.groups);
  1087.     },
  1088.     b4EndDrag: function(e) {
  1089.     },
  1090.     endDrag : function(e){
  1091.         this.onEndDrag(this.dragData, e);
  1092.     },
  1093.     onEndDrag : function(data, e){
  1094.     },
  1095.     autoOffset : function(x, y) {
  1096.         this.setDelta(-12, -20);
  1097.     }
  1098. });
  1099. Ext.dd.DropTarget = function(el, config){
  1100.     this.el = Ext.get(el);
  1101.     Ext.apply(this, config);
  1102.     if(this.containerScroll){
  1103.         Ext.dd.ScrollManager.register(this.el);
  1104.     }
  1105.     Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group,
  1106.           {isTarget: true});
  1107. };
  1108. Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {
  1109.     dropAllowed : "x-dd-drop-ok",
  1110.     dropNotAllowed : "x-dd-drop-nodrop",
  1111.     isTarget : true,
  1112.     isNotifyTarget : true,
  1113.     notifyEnter : function(dd, e, data){
  1114.         if(this.overClass){
  1115.             this.el.addClass(this.overClass);
  1116.         }
  1117.         return this.dropAllowed;
  1118.     },
  1119.     notifyOver : function(dd, e, data){
  1120.         return this.dropAllowed;
  1121.     },
  1122.     notifyOut : function(dd, e, data){
  1123.         if(this.overClass){
  1124.             this.el.removeClass(this.overClass);
  1125.         }
  1126.     },
  1127.     notifyDrop : function(dd, e, data){
  1128.         return false;
  1129.     }
  1130. });
  1131. Ext.dd.DragZone = function(el, config){
  1132.     Ext.dd.DragZone.superclass.constructor.call(this, el, config);
  1133.     if(this.containerScroll){
  1134.         Ext.dd.ScrollManager.register(this.el);
  1135.     }
  1136. };
  1137. Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {
  1138.     getDragData : function(e){
  1139.         return Ext.dd.Registry.getHandleFromEvent(e);
  1140.     },
  1141.     onInitDrag : function(x, y){
  1142.         this.proxy.update(this.dragData.ddel.cloneNode(true));
  1143.         this.onStartDrag(x, y);
  1144.         return true;
  1145.     },
  1146.     afterRepair : function(){
  1147.         if(Ext.enableFx){
  1148.             Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
  1149.         }
  1150.         this.dragging = false;
  1151.     },
  1152.     getRepairXY : function(e){
  1153.         return Ext.Element.fly(this.dragData.ddel).getXY();
  1154.     }
  1155. });
  1156. Ext.dd.DropZone = function(el, config){
  1157.     Ext.dd.DropZone.superclass.constructor.call(this, el, config);
  1158. };
  1159. Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
  1160.     getTargetFromEvent : function(e){
  1161.         return Ext.dd.Registry.getTargetFromEvent(e);
  1162.     },
  1163.     onNodeEnter : function(n, dd, e, data){
  1164.     },
  1165.     onNodeOver : function(n, dd, e, data){
  1166.         return this.dropAllowed;
  1167.     },
  1168.     onNodeOut : function(n, dd, e, data){
  1169.     },
  1170.     onNodeDrop : function(n, dd, e, data){
  1171.         return false;
  1172.     },
  1173.     onContainerOver : function(dd, e, data){
  1174.         return this.dropNotAllowed;
  1175.     },
  1176.     onContainerDrop : function(dd, e, data){
  1177.         return false;
  1178.     },
  1179.     notifyEnter : function(dd, e, data){
  1180.         return this.dropNotAllowed;
  1181.     },
  1182.     notifyOver : function(dd, e, data){
  1183.         var n = this.getTargetFromEvent(e);
  1184.         if(!n){
  1185.             if(this.lastOverNode){
  1186.                 this.onNodeOut(this.lastOverNode, dd, e, data);
  1187.                 this.lastOverNode = null;
  1188.             }
  1189.             return this.onContainerOver(dd, e, data);
  1190.         }
  1191.         if(this.lastOverNode != n){
  1192.             if(this.lastOverNode){
  1193.                 this.onNodeOut(this.lastOverNode, dd, e, data);
  1194.             }
  1195.             this.onNodeEnter(n, dd, e, data);
  1196.             this.lastOverNode = n;
  1197.         }
  1198.         return this.onNodeOver(n, dd, e, data);
  1199.     },
  1200.     notifyOut : function(dd, e, data){
  1201.         if(this.lastOverNode){
  1202.             this.onNodeOut(this.lastOverNode, dd, e, data);
  1203.             this.lastOverNode = null;
  1204.         }
  1205.     },
  1206.     notifyDrop : function(dd, e, data){
  1207.         if(this.lastOverNode){
  1208.             this.onNodeOut(this.lastOverNode, dd, e, data);
  1209.             this.lastOverNode = null;
  1210.         }
  1211.         var n = this.getTargetFromEvent(e);
  1212.         return n ?
  1213.             this.onNodeDrop(n, dd, e, data) :
  1214.             this.onContainerDrop(dd, e, data);
  1215.     },
  1216.     triggerCacheRefresh : function(){
  1217.         Ext.dd.DDM.refreshCache(this.groups);
  1218.     }
  1219. });
  1220. Ext.data.SortTypes = {
  1221.     none : function(s){
  1222.         return s;
  1223.     },
  1224.     stripTagsRE : /</?[^>]+>/gi,
  1225.     asText : function(s){
  1226.         return String(s).replace(this.stripTagsRE, "");
  1227.     },
  1228.     asUCText : function(s){
  1229.         return String(s).toUpperCase().replace(this.stripTagsRE, "");
  1230.     },
  1231.     asUCString : function(s) {
  1232.         return String(s).toUpperCase();
  1233.     },
  1234.     asDate : function(s) {
  1235.         if(!s){
  1236.             return 0;
  1237.         }
  1238.         if(Ext.isDate(s)){
  1239.             return s.getTime();
  1240.         }
  1241.         return Date.parse(String(s));
  1242.     },
  1243.     asFloat : function(s) {
  1244.         var val = parseFloat(String(s).replace(/,/g, ""));
  1245.         if(isNaN(val)) val = 0;
  1246.         return val;
  1247.     },
  1248.     asInt : function(s) {
  1249.         var val = parseInt(String(s).replace(/,/g, ""));
  1250.         if(isNaN(val)) val = 0;
  1251.         return val;
  1252.     }
  1253. };
  1254. Ext.data.Record = function(data, id){
  1255.     this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID;
  1256.     this.data = data;
  1257. };
  1258. Ext.data.Record.create = function(o){
  1259.     var f = Ext.extend(Ext.data.Record, {});
  1260.     var p = f.prototype;
  1261.     p.fields = new Ext.util.MixedCollection(false, function(field){
  1262.         return field.name;
  1263.     });
  1264.     for(var i = 0, len = o.length; i < len; i++){
  1265.         p.fields.add(new Ext.data.Field(o[i]));
  1266.     }
  1267.     f.getField = function(name){
  1268.         return p.fields.get(name);
  1269.     };
  1270.     return f;
  1271. };
  1272. Ext.data.Record.AUTO_ID = 1000;
  1273. Ext.data.Record.EDIT = 'edit';
  1274. Ext.data.Record.REJECT = 'reject';
  1275. Ext.data.Record.COMMIT = 'commit';
  1276. Ext.data.Record.prototype = {
  1277.     dirty : false,
  1278.     editing : false,
  1279.     error: null,
  1280.     modified: null,
  1281.     join : function(store){
  1282.         this.store = store;
  1283.     },
  1284.     set : function(name, value){
  1285.         if(String(this.data[name]) == String(value)){
  1286.             return;
  1287.         }
  1288.         this.dirty = true;
  1289.         if(!this.modified){
  1290.             this.modified = {};
  1291.         }
  1292.         if(typeof this.modified[name] == 'undefined'){
  1293.             this.modified[name] = this.data[name];
  1294.         }
  1295.         this.data[name] = value;
  1296.         if(!this.editing && this.store){
  1297.             this.store.afterEdit(this);
  1298.         }
  1299.     },
  1300.     get : function(name){
  1301.         return this.data[name];
  1302.     },
  1303.     beginEdit : function(){
  1304.         this.editing = true;
  1305.         this.modified = {};
  1306.     },
  1307.     cancelEdit : function(){
  1308.         this.editing = false;
  1309.         delete this.modified;
  1310.     },
  1311.     endEdit : function(){
  1312.         this.editing = false;
  1313.         if(this.dirty && this.store){
  1314.             this.store.afterEdit(this);
  1315.         }
  1316.     },
  1317.     reject : function(silent){
  1318.         var m = this.modified;
  1319.         for(var n in m){
  1320.             if(typeof m[n] != "function"){
  1321.                 this.data[n] = m[n];
  1322.             }
  1323.         }
  1324.         this.dirty = false;
  1325.         delete this.modified;
  1326.         this.editing = false;
  1327.         if(this.store && silent !== true){
  1328.             this.store.afterReject(this);
  1329.         }
  1330.     },
  1331.     commit : function(silent){
  1332.         this.dirty = false;
  1333.         delete this.modified;
  1334.         this.editing = false;
  1335.         if(this.store && silent !== true){
  1336.             this.store.afterCommit(this);
  1337.         }
  1338.     },
  1339.     getChanges : function(){
  1340.         var m = this.modified, cs = {};
  1341.         for(var n in m){
  1342.             if(m.hasOwnProperty(n)){
  1343.                 cs[n] = this.data[n];
  1344.             }
  1345.         }
  1346.         return cs;
  1347.     },
  1348.     hasError : function(){
  1349.         return this.error != null;
  1350.     },
  1351.     clearError : function(){
  1352.         this.error = null;
  1353.     },
  1354.     copy : function(newId) {
  1355.         return new this.constructor(Ext.apply({}, this.data), newId || this.id);
  1356.     },
  1357.     isModified : function(fieldName){
  1358.         return this.modified && this.modified.hasOwnProperty(fieldName);
  1359.     }
  1360. };
  1361. Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
  1362.     register : function(){
  1363.         for(var i = 0, s; s = arguments[i]; i++){
  1364.             this.add(s);
  1365.         }
  1366.     },
  1367.     unregister : function(){
  1368.         for(var i = 0, s; s = arguments[i]; i++){
  1369.             this.remove(this.lookup(s));
  1370.         }
  1371.     },
  1372.     lookup : function(id){
  1373.         return typeof id == "object" ? id : this.get(id);
  1374.     },
  1375.     getKey : function(o){
  1376.          return o.storeId || o.id;
  1377.     }
  1378. });
  1379. Ext.data.Store = function(config){
  1380.     this.data = new Ext.util.MixedCollection(false);
  1381.     this.data.getKey = function(o){
  1382.         return o.id;
  1383.     };
  1384.     this.baseParams = {};
  1385.     this.paramNames = {
  1386.         "start" : "start",
  1387.         "limit" : "limit",
  1388.         "sort" : "sort",
  1389.         "dir" : "dir"
  1390.     };
  1391.     if(config && config.data){
  1392.         this.inlineData = config.data;
  1393.         delete config.data;
  1394.     }
  1395.     Ext.apply(this, config);
  1396.     if(this.url && !this.proxy){
  1397.         this.proxy = new Ext.data.HttpProxy({url: this.url});
  1398.     }
  1399.     if(this.reader){
  1400.         if(!this.recordType){
  1401.             this.recordType = this.reader.recordType;
  1402.         }
  1403.         if(this.reader.onMetaChange){
  1404.             this.reader.onMetaChange = this.onMetaChange.createDelegate(this);
  1405.         }
  1406.     }
  1407.     if(this.recordType){
  1408.         this.fields = this.recordType.prototype.fields;
  1409.     }
  1410.     this.modified = [];
  1411.     this.addEvents(
  1412.         'datachanged',
  1413.         'metachange',
  1414.         'add',
  1415.         'remove',
  1416.         'update',
  1417.         'clear',
  1418.         'beforeload',
  1419.         'load',
  1420.         'loadexception'
  1421.     );
  1422.     if(this.proxy){
  1423.         this.relayEvents(this.proxy,  ["loadexception"]);
  1424.     }
  1425.     this.sortToggle = {};
  1426.     if(this.sortInfo){
  1427.         this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);
  1428.     }
  1429.     Ext.data.Store.superclass.constructor.call(this);
  1430.     if(this.storeId || this.id){
  1431.         Ext.StoreMgr.register(this);
  1432.     }
  1433.     if(this.inlineData){
  1434.         this.loadData(this.inlineData);
  1435.         delete this.inlineData;
  1436.     }else if(this.autoLoad){
  1437.         this.load.defer(10, this, [
  1438.             typeof this.autoLoad == 'object' ?
  1439.                 this.autoLoad : undefined]);
  1440.     }
  1441. };
  1442. Ext.extend(Ext.data.Store, Ext.util.Observable, {
  1443.     remoteSort : false,
  1444.     pruneModifiedRecords : false,
  1445.    lastOptions : null,
  1446.     destroy : function(){
  1447.         if(this.id){
  1448.             Ext.StoreMgr.unregister(this);
  1449.         }
  1450.         this.data = null;
  1451.         this.purgeListeners();
  1452.     },
  1453.     add : function(records){
  1454.         records = [].concat(records);
  1455.         if(records.length < 1){
  1456.             return;
  1457.         }
  1458.         for(var i = 0, len = records.length; i < len; i++){
  1459.             records[i].join(this);
  1460.         }
  1461.         var index = this.data.length;
  1462.         this.data.addAll(records);
  1463.         if(this.snapshot){
  1464.             this.snapshot.addAll(records);
  1465.         }
  1466.         this.fireEvent("add", this, records, index);
  1467.     },
  1468.     addSorted : function(record){
  1469.         var index = this.findInsertIndex(record);
  1470.         this.insert(index, record);
  1471.     },
  1472.     remove : function(record){
  1473.         var index = this.data.indexOf(record);
  1474.         this.data.removeAt(index);
  1475.         if(this.pruneModifiedRecords){
  1476.             this.modified.remove(record);
  1477.         }
  1478.         if(this.snapshot){
  1479.             this.snapshot.remove(record);
  1480.         }
  1481.         this.fireEvent("remove", this, record, index);
  1482.     },
  1483.     removeAll : function(){
  1484.         this.data.clear();
  1485.         if(this.snapshot){
  1486.             this.snapshot.clear();
  1487.         }
  1488.         if(this.pruneModifiedRecords){
  1489.             this.modified = [];
  1490.         }
  1491.         this.fireEvent("clear", this);
  1492.     },
  1493.     insert : function(index, records){
  1494.         records = [].concat(records);
  1495.         for(var i = 0, len = records.length; i < len; i++){
  1496.             this.data.insert(index, records[i]);
  1497.             records[i].join(this);
  1498.         }
  1499.         this.fireEvent("add", this, records, index);
  1500.     },
  1501.     indexOf : function(record){
  1502.         return this.data.indexOf(record);
  1503.     },
  1504.     indexOfId : function(id){
  1505.         return this.data.indexOfKey(id);
  1506.     },
  1507.     getById : function(id){
  1508.         return this.data.key(id);
  1509.     },
  1510.     getAt : function(index){
  1511.         return this.data.itemAt(index);
  1512.     },
  1513.     getRange : function(start, end){
  1514.         return this.data.getRange(start, end);
  1515.     },
  1516.     storeOptions : function(o){
  1517.         o = Ext.apply({}, o);
  1518.         delete o.callback;
  1519.         delete o.scope;
  1520.         this.lastOptions = o;
  1521.     },
  1522.     load : function(options){
  1523.         options = options || {};
  1524.         if(this.fireEvent("beforeload", this, options) !== false){
  1525.             this.storeOptions(options);
  1526.             var p = Ext.apply(options.params || {}, this.baseParams);
  1527.             if(this.sortInfo && this.remoteSort){
  1528.                 var pn = this.paramNames;
  1529.                 p[pn["sort"]] = this.sortInfo.field;
  1530.                 p[pn["dir"]] = this.sortInfo.direction;
  1531.             }
  1532.             this.proxy.load(p, this.reader, this.loadRecords, this, options);
  1533.             return true;
  1534.         } else {
  1535.           return false;
  1536.         }
  1537.     },
  1538.     reload : function(options){
  1539.         this.load(Ext.applyIf(options||{}, this.lastOptions));
  1540.     },
  1541.     loadRecords : function(o, options, success){
  1542.         if(!o || success === false){
  1543.             if(success !== false){
  1544.                 this.fireEvent("load", this, [], options);
  1545.             }
  1546.             if(options.callback){
  1547.                 options.callback.call(options.scope || this, [], options, false);
  1548.             }
  1549.             return;
  1550.         }
  1551.         var r = o.records, t = o.totalRecords || r.length;
  1552.         if(!options || options.add !== true){
  1553.             if(this.pruneModifiedRecords){
  1554.                 this.modified = [];
  1555.             }
  1556.             for(var i = 0, len = r.length; i < len; i++){
  1557.                 r[i].join(this);
  1558.             }
  1559.             if(this.snapshot){
  1560.                 this.data = this.snapshot;
  1561.                 delete this.snapshot;
  1562.             }
  1563.             this.data.clear();
  1564.             this.data.addAll(r);
  1565.             this.totalLength = t;
  1566.             this.applySort();
  1567.             this.fireEvent("datachanged", this);
  1568.         }else{
  1569.             this.totalLength = Math.max(t, this.data.length+r.length);
  1570.             this.add(r);
  1571.         }
  1572.         this.fireEvent("load", this, r, options);
  1573.         if(options.callback){
  1574.             options.callback.call(options.scope || this, r, options, true);
  1575.         }
  1576.     },
  1577.     loadData : function(o, append){
  1578.         var r = this.reader.readRecords(o);
  1579.         this.loadRecords(r, {add: append}, true);
  1580.     },
  1581.     getCount : function(){
  1582.         return this.data.length || 0;
  1583.     },
  1584.     getTotalCount : function(){
  1585.         return this.totalLength || 0;
  1586.     },
  1587.     getSortState : function(){
  1588.         return this.sortInfo;
  1589.     },
  1590.     applySort : function(){
  1591.         if(this.sortInfo && !this.remoteSort){
  1592.             var s = this.sortInfo, f = s.field;
  1593.             this.sortData(f, s.direction);
  1594.         }
  1595.     },
  1596.     sortData : function(f, direction){
  1597.         direction = direction || 'ASC';
  1598.         var st = this.fields.get(f).sortType;
  1599.         var fn = function(r1, r2){
  1600.             var v1 = st(r1.data[f]), v2 = st(r2.data[f]);
  1601.             return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
  1602.         };
  1603.         this.data.sort(direction, fn);
  1604.         if(this.snapshot && this.snapshot != this.data){
  1605.             this.snapshot.sort(direction, fn);
  1606.         }
  1607.     },
  1608.     setDefaultSort : function(field, dir){
  1609.         dir = dir ? dir.toUpperCase() : "ASC";
  1610.         this.sortInfo = {field: field, direction: dir};
  1611.         this.sortToggle[field] = dir;
  1612.     },
  1613.     sort : function(fieldName, dir){
  1614.         var f = this.fields.get(fieldName);
  1615.         if(!f){
  1616.             return false;
  1617.         }
  1618.         if(!dir){
  1619.             if(this.sortInfo && this.sortInfo.field == f.name){
  1620.                 dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC");
  1621.             }else{
  1622.                 dir = f.sortDir;
  1623.             }
  1624.         }
  1625.         var st = (this.sortToggle) ? this.sortToggle[f.name] : null;
  1626.         var si = (this.sortInfo) ? this.sortInfo : null;
  1627.         this.sortToggle[f.name] = dir;
  1628.         this.sortInfo = {field: f.name, direction: dir};
  1629.         if(!this.remoteSort){
  1630.             this.applySort();
  1631.             this.fireEvent("datachanged", this);
  1632.         }else{
  1633.             if (!this.load(this.lastOptions)) {
  1634.                 if (st) {
  1635.                     this.sortToggle[f.name] = st;
  1636.                 }
  1637.                 if (si) {
  1638.                     this.sortInfo = si;
  1639.                 }
  1640.             }
  1641.         }
  1642.     },
  1643.     each : function(fn, scope){
  1644.         this.data.each(fn, scope);
  1645.     },
  1646.     getModifiedRecords : function(){
  1647.         return this.modified;
  1648.     },
  1649.     createFilterFn : function(property, value, anyMatch, caseSensitive){
  1650.         if(Ext.isEmpty(value, false)){
  1651.             return false;
  1652.         }
  1653.         value = this.data.createValueMatcher(value, anyMatch, caseSensitive);
  1654.         return function(r){
  1655.             return value.test(r.data[property]);
  1656.         };
  1657.     },
  1658.     sum : function(property, start, end){
  1659.         var rs = this.data.items, v = 0;
  1660.         start = start || 0;
  1661.         end = (end || end === 0) ? end : rs.length-1;
  1662.         for(var i = start; i <= end; i++){
  1663.             v += (rs[i].data[property] || 0);
  1664.         }
  1665.         return v;
  1666.     },
  1667.     filter : function(property, value, anyMatch, caseSensitive){
  1668.         var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
  1669.         return fn ? this.filterBy(fn) : this.clearFilter();
  1670.     },
  1671.     filterBy : function(fn, scope){
  1672.         this.snapshot = this.snapshot || this.data;
  1673.         this.data = this.queryBy(fn, scope||this);
  1674.         this.fireEvent("datachanged", this);
  1675.     },
  1676.     query : function(property, value, anyMatch, caseSensitive){
  1677.         var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
  1678.         return fn ? this.queryBy(fn) : this.data.clone();
  1679.     },
  1680.     queryBy : function(fn, scope){
  1681.         var data = this.snapshot || this.data;
  1682.         return data.filterBy(fn, scope||this);
  1683.     },
  1684.     find : function(property, value, start, anyMatch, caseSensitive){
  1685.         var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
  1686.         return fn ? this.data.findIndexBy(fn, null, start) : -1;
  1687.     },
  1688.     findBy : function(fn, scope, start){
  1689.         return this.data.findIndexBy(fn, scope, start);
  1690.     },
  1691.     collect : function(dataIndex, allowNull, bypassFilter){
  1692.         var d = (bypassFilter === true && this.snapshot) ?
  1693.                 this.snapshot.items : this.data.items;
  1694.         var v, sv, r = [], l = {};
  1695.         for(var i = 0, len = d.length; i < len; i++){
  1696.             v = d[i].data[dataIndex];
  1697.             sv = String(v);
  1698.             if((allowNull || !Ext.isEmpty(v)) && !l[sv]){
  1699.                 l[sv] = true;
  1700.                 r[r.length] = v;
  1701.             }
  1702.         }
  1703.         return r;
  1704.     },
  1705.     clearFilter : function(suppressEvent){
  1706.         if(this.isFiltered()){
  1707.             this.data = this.snapshot;
  1708.             delete this.snapshot;
  1709.             if(suppressEvent !== true){
  1710.                 this.fireEvent("datachanged", this);
  1711.             }
  1712.         }
  1713.     },
  1714.     isFiltered : function(){
  1715.         return this.snapshot && this.snapshot != this.data;
  1716.     },
  1717.     afterEdit : function(record){
  1718.         if(this.modified.indexOf(record) == -1){
  1719.             this.modified.push(record);
  1720.         }
  1721.         this.fireEvent("update", this, record, Ext.data.Record.EDIT);
  1722.     },
  1723.     afterReject : function(record){
  1724.         this.modified.remove(record);
  1725.         this.fireEvent("update", this, record, Ext.data.Record.REJECT);
  1726.     },
  1727.     afterCommit : function(record){
  1728.         this.modified.remove(record);
  1729.         this.fireEvent("update", this, record, Ext.data.Record.COMMIT);
  1730.     },
  1731.     commitChanges : function(){
  1732.         var m = this.modified.slice(0);
  1733.         this.modified = [];
  1734.         for(var i = 0, len = m.length; i < len; i++){
  1735.             m[i].commit();
  1736.         }
  1737.     },
  1738.     rejectChanges : function(){
  1739.         var m = this.modified.slice(0);
  1740.         this.modified = [];
  1741.         for(var i = 0, len = m.length; i < len; i++){
  1742.             m[i].reject();
  1743.         }
  1744.     },
  1745.     onMetaChange : function(meta, rtype, o){
  1746.         this.recordType = rtype;
  1747.         this.fields = rtype.prototype.fields;
  1748.         delete this.snapshot;
  1749.         this.sortInfo = meta.sortInfo;
  1750.         this.modified = [];
  1751.         this.fireEvent('metachange', this, this.reader.meta);
  1752.     },
  1753.     findInsertIndex : function(record){
  1754.         this.suspendEvents();
  1755.         var data = this.data.clone();
  1756.         this.data.add(record);
  1757.         this.applySort();
  1758.         var index = this.data.indexOf(record);
  1759.         this.data = data;
  1760.         this.resumeEvents();
  1761.         return index;
  1762.     }
  1763. });
  1764. Ext.data.SimpleStore = function(config){
  1765.     Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {
  1766.         reader: new Ext.data.ArrayReader({
  1767.                 id: config.id
  1768.             },
  1769.             Ext.data.Record.create(config.fields)
  1770.         )
  1771.     }));
  1772. };
  1773. Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {
  1774.     loadData : function(data, append){
  1775.         if(this.expandData === true){
  1776.             var r = [];
  1777.             for(var i = 0, len = data.length; i < len; i++){
  1778.                 r[r.length] = [data[i]];
  1779.             }
  1780.             data = r;
  1781.         }
  1782.         Ext.data.SimpleStore.superclass.loadData.call(this, data, append);
  1783.     }
  1784. });
  1785. Ext.data.JsonStore = function(c){
  1786.     Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {
  1787.         proxy: !c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined,
  1788.         reader: new Ext.data.JsonReader(c, c.fields)
  1789.     }));
  1790. };
  1791. Ext.extend(Ext.data.JsonStore, Ext.data.Store);
  1792. Ext.data.Field = function(config){
  1793.     if(typeof config == "string"){
  1794.         config = {name: config};
  1795.     }
  1796.     Ext.apply(this, config);
  1797.     if(!this.type){
  1798.         this.type = "auto";
  1799.     }
  1800.     var st = Ext.data.SortTypes;
  1801.     if(typeof this.sortType == "string"){
  1802.         this.sortType = st[this.sortType];
  1803.     }
  1804.     if(!this.sortType){
  1805.         switch(this.type){
  1806.             case "string":
  1807.                 this.sortType = st.asUCString;
  1808.                 break;
  1809.             case "date":
  1810.                 this.sortType = st.asDate;
  1811.                 break;
  1812.             default:
  1813.                 this.sortType = st.none;
  1814.         }
  1815.     }
  1816.     var stripRe = /[$,%]/g;
  1817.     if(!this.convert){
  1818.         var cv, dateFormat = this.dateFormat;
  1819.         switch(this.type){
  1820.             case "":
  1821.             case "auto":
  1822.             case undefined:
  1823.                 cv = function(v){ return v; };
  1824.                 break;
  1825.             case "string":
  1826.                 cv = function(v){ return (v === undefined || v === null) ? '' : String(v); };
  1827.                 break;
  1828.             case "int":
  1829.                 cv = function(v){
  1830.                     return v !== undefined && v !== null && v !== '' ?
  1831.                            parseInt(String(v).replace(stripRe, ""), 10) : '';
  1832.                     };
  1833.                 break;
  1834.             case "float":
  1835.                 cv = function(v){
  1836.                     return v !== undefined && v !== null && v !== '' ?
  1837.                            parseFloat(String(v).replace(stripRe, ""), 10) : '';
  1838.                     };
  1839.                 break;
  1840.             case "bool":
  1841.             case "boolean":
  1842.                 cv = function(v){ return v === true || v === "true" || v == 1; };
  1843.                 break;
  1844.             case "date":
  1845.                 cv = function(v){
  1846.                     if(!v){
  1847.                         return '';
  1848.                     }
  1849.                     if(Ext.isDate(v)){
  1850.                         return v;
  1851.                     }
  1852.                     if(dateFormat){
  1853.                         if(dateFormat == "timestamp"){
  1854.                             return new Date(v*1000);
  1855.                         }
  1856.                         if(dateFormat == "time"){
  1857.                             return new Date(parseInt(v, 10));
  1858.                         }
  1859.                         return Date.parseDate(v, dateFormat);
  1860.                     }
  1861.                     var parsed = Date.parse(v);
  1862.                     return parsed ? new Date(parsed) : null;
  1863.                 };
  1864.              break;
  1865.         }
  1866.         this.convert = cv;
  1867.     }
  1868. };
  1869. Ext.data.Field.prototype = {
  1870.     dateFormat: null,
  1871.     defaultValue: "",
  1872.     mapping: null,
  1873.     sortType : null,
  1874.     sortDir : "ASC"
  1875. };
  1876. Ext.data.DataReader = function(meta, recordType){
  1877.     this.meta = meta;
  1878.     this.recordType = Ext.isArray(recordType) ?
  1879.         Ext.data.Record.create(recordType) : recordType;
  1880. };
  1881. Ext.data.DataReader.prototype = {
  1882. };
  1883. Ext.data.DataProxy = function(){
  1884.     this.addEvents(
  1885.         'beforeload',
  1886.         'load',
  1887.         'loadexception'
  1888.     );
  1889.     Ext.data.DataProxy.superclass.constructor.call(this);
  1890. };
  1891. Ext.extend(Ext.data.DataProxy, Ext.util.Observable);
  1892. Ext.data.MemoryProxy = function(data){
  1893.     Ext.data.MemoryProxy.superclass.constructor.call(this);
  1894.     this.data = data;
  1895. };
  1896. Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
  1897.     load : function(params, reader, callback, scope, arg){
  1898.         params = params || {};
  1899.         var result;
  1900.         try {
  1901.             result = reader.readRecords(this.data);
  1902.         }catch(e){
  1903.             this.fireEvent("loadexception", this, arg, null, e);
  1904.             callback.call(scope, null, arg, false);
  1905.             return;
  1906.         }
  1907.         callback.call(scope, result, arg, true);
  1908.     },
  1909.     update : function(params, records){
  1910.     }
  1911. });
  1912. Ext.data.HttpProxy = function(conn){
  1913.     Ext.data.HttpProxy.superclass.constructor.call(this);
  1914.     this.conn = conn;
  1915.     this.useAjax = !conn || !conn.events;
  1916. };
  1917. Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
  1918.     getConnection : function(){
  1919.         return this.useAjax ? Ext.Ajax : this.conn;
  1920.     },
  1921.     load : function(params, reader, callback, scope, arg){
  1922.         if(this.fireEvent("beforeload", this, params) !== false){
  1923.             var  o = {
  1924.                 params : params || {},
  1925.                 request: {
  1926.                     callback : callback,
  1927.                     scope : scope,
  1928.                     arg : arg
  1929.                 },
  1930.                 reader: reader,
  1931.                 callback : this.loadResponse,
  1932.                 scope: this
  1933.             };
  1934.             if(this.useAjax){
  1935.                 Ext.applyIf(o, this.conn);
  1936.                 if(this.activeRequest){
  1937.                     Ext.Ajax.abort(this.activeRequest);
  1938.                 }
  1939.                 this.activeRequest = Ext.Ajax.request(o);
  1940.             }else{
  1941.                 this.conn.request(o);
  1942.             }
  1943.         }else{
  1944.             callback.call(scope||this, null, arg, false);
  1945.         }
  1946.     },
  1947.     loadResponse : function(o, success, response){
  1948.         delete this.activeRequest;
  1949.         if(!success){
  1950.             this.fireEvent("loadexception", this, o, response);
  1951.             o.request.callback.call(o.request.scope, null, o.request.arg, false);
  1952.             return;
  1953.         }
  1954.         var result;
  1955.         try {
  1956.             result = o.reader.read(response);
  1957.         }catch(e){
  1958.             this.fireEvent("loadexception", this, o, response, e);
  1959.             o.request.callback.call(o.request.scope, null, o.request.arg, false);
  1960.             return;
  1961.         }
  1962.         this.fireEvent("load", this, o, o.request.arg);
  1963.         o.request.callback.call(o.request.scope, result, o.request.arg, true);
  1964.     },
  1965.     update : function(dataSet){
  1966.     },
  1967.     updateResponse : function(dataSet){
  1968.     }
  1969. });
  1970. Ext.data.ScriptTagProxy = function(config){
  1971.     Ext.data.ScriptTagProxy.superclass.constructor.call(this);
  1972.     Ext.apply(this, config);
  1973.     this.head = document.getElementsByTagName("head")[0];
  1974. };
  1975. Ext.data.ScriptTagProxy.TRANS_ID = 1000;
  1976. Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
  1977.     timeout : 30000,
  1978.     callbackParam : "callback",
  1979.     nocache : true,
  1980.     load : function(params, reader, callback, scope, arg){
  1981.         if(this.fireEvent("beforeload", this, params) !== false){
  1982.             var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
  1983.             var url = this.url;
  1984.             url += (url.indexOf("?") != -1 ? "&" : "?") + p;
  1985.             if(this.nocache){
  1986.                 url += "&_dc=" + (new Date().getTime());
  1987.             }
  1988.             var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
  1989.             var trans = {
  1990.                 id : transId,
  1991.                 cb : "stcCallback"+transId,
  1992.                 scriptId : "stcScript"+transId,
  1993.                 params : params,
  1994.                 arg : arg,
  1995.                 url : url,
  1996.                 callback : callback,
  1997.                 scope : scope,
  1998.                 reader : reader
  1999.             };
  2000.             var conn = this;
  2001.             window[trans.cb] = function(o){
  2002.                 conn.handleResponse(o, trans);
  2003.             };
  2004.             url += String.format("&{0}={1}", this.callbackParam, trans.cb);
  2005.             if(this.autoAbort !== false){
  2006.                 this.abort();
  2007.             }
  2008.             trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
  2009.             var script = document.createElement("script");
  2010.             script.setAttribute("src", url);
  2011.             script.setAttribute("type", "text/javascript");
  2012.             script.setAttribute("id", trans.scriptId);
  2013.             this.head.appendChild(script);
  2014.             this.trans = trans;
  2015.         }else{
  2016.             callback.call(scope||this, null, arg, false);
  2017.         }
  2018.     },
  2019.     isLoading : function(){
  2020.         return this.trans ? true : false;
  2021.     },
  2022.     abort : function(){
  2023.         if(this.isLoading()){
  2024.             this.destroyTrans(this.trans);
  2025.         }
  2026.     },
  2027.     destroyTrans : function(trans, isLoaded){
  2028.         this.head.removeChild(document.getElementById(trans.scriptId));
  2029.         clearTimeout(trans.timeoutId);
  2030.         if(isLoaded){
  2031.             window[trans.cb] = undefined;
  2032.             try{
  2033.                 delete window[trans.cb];
  2034.             }catch(e){}
  2035.         }else{
  2036.             window[trans.cb] = function(){
  2037.                 window[trans.cb] = undefined;
  2038.                 try{
  2039.                     delete window[trans.cb];
  2040.                 }catch(e){}
  2041.             };
  2042.         }
  2043.     },
  2044.     handleResponse : function(o, trans){
  2045.         this.trans = false;
  2046.         this.destroyTrans(trans, true);
  2047.         var result;
  2048.         try {
  2049.             result = trans.reader.readRecords(o);
  2050.         }catch(e){
  2051.             this.fireEvent("loadexception", this, o, trans.arg, e);
  2052.             trans.callback.call(trans.scope||window, null, trans.arg, false);
  2053.             return;
  2054.         }
  2055.         this.fireEvent("load", this, o, trans.arg);
  2056.         trans.callback.call(trans.scope||window, result, trans.arg, true);
  2057.     },
  2058.     handleFailure : function(trans){
  2059.         this.trans = false;
  2060.         this.destroyTrans(trans, false);
  2061.         this.fireEvent("loadexception", this, null, trans.arg);
  2062.         trans.callback.call(trans.scope||window, null, trans.arg, false);
  2063.     }
  2064. });
  2065. Ext.data.JsonReader = function(meta, recordType){
  2066.     meta = meta || {};
  2067.     Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);
  2068. };
  2069. Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
  2070.     read : function(response){
  2071.         var json = response.responseText;
  2072.         var o = eval("("+json+")");
  2073.         if(!o) {
  2074.             throw {message: "JsonReader.read: Json object not found"};
  2075.         }
  2076.         if(o.metaData){
  2077.             delete this.ef;
  2078.             this.meta = o.metaData;
  2079.             this.recordType = Ext.data.Record.create(o.metaData.fields);
  2080.             this.onMetaChange(this.meta, this.recordType, o);
  2081.         }
  2082.         return this.readRecords(o);
  2083.     },
  2084.     onMetaChange : function(meta, recordType, o){
  2085.     },
  2086.     simpleAccess: function(obj, subsc) {
  2087.         return obj[subsc];
  2088.     },
  2089.     getJsonAccessor: function(){
  2090.         var re = /[[.]/;
  2091.         return function(expr) {
  2092.             try {
  2093.                 return(re.test(expr))
  2094.                     ? new Function("obj", "return obj." + expr)
  2095.                     : function(obj){
  2096.                         return obj[expr];
  2097.                     };
  2098.             } catch(e){}
  2099.             return Ext.emptyFn;
  2100.         };
  2101.     }(),
  2102.     readRecords : function(o){
  2103.         this.jsonData = o;
  2104.         var s = this.meta, Record = this.recordType,
  2105.             f = Record.prototype.fields, fi = f.items, fl = f.length;
  2106.         if (!this.ef) {
  2107.             if(s.totalProperty) {
  2108.                 this.getTotal = this.getJsonAccessor(s.totalProperty);
  2109.             }
  2110.             if(s.successProperty) {
  2111.                 this.getSuccess = this.getJsonAccessor(s.successProperty);
  2112.             }
  2113.             this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;};
  2114.             if (s.id) {
  2115.                 var g = this.getJsonAccessor(s.id);
  2116.                 this.getId = function(rec) {
  2117.                     var r = g(rec);
  2118.                     return (r === undefined || r === "") ? null : r;
  2119.                 };
  2120.             } else {
  2121.                 this.getId = function(){return null;};
  2122.             }
  2123.             this.ef = [];
  2124.             for(var i = 0; i < fl; i++){
  2125.                 f = fi[i];
  2126.                 var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
  2127.                 this.ef[i] = this.getJsonAccessor(map);
  2128.             }
  2129.         }
  2130.         var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;
  2131.         if(s.totalProperty){
  2132.             var v = parseInt(this.getTotal(o), 10);
  2133.             if(!isNaN(v)){
  2134.                 totalRecords = v;
  2135.             }
  2136.         }
  2137.         if(s.successProperty){
  2138.             var v = this.getSuccess(o);
  2139.             if(v === false || v === 'false'){
  2140.                 success = false;
  2141.             }
  2142.         }
  2143.         var records = [];
  2144.         for(var i = 0; i < c; i++){
  2145.             var n = root[i];
  2146.             var values = {};
  2147.             var id = this.getId(n);
  2148.             for(var j = 0; j < fl; j++){
  2149.                 f = fi[j];
  2150.                 var v = this.ef[j](n);
  2151.                 values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, n);
  2152.             }
  2153.             var record = new Record(values, id);
  2154.             record.json = n;
  2155.             records[i] = record;
  2156.         }
  2157.         return {
  2158.             success : success,
  2159.             records : records,
  2160.             totalRecords : totalRecords
  2161.         };
  2162.     }
  2163. });
  2164. Ext.data.XmlReader = function(meta, recordType){
  2165.     meta = meta || {};
  2166.     Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields);
  2167. };
  2168. Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
  2169.     read : function(response){
  2170.         var doc = response.responseXML;
  2171.         if(!doc) {
  2172.             throw {message: "XmlReader.read: XML Document not available"};
  2173.         }
  2174.         return this.readRecords(doc);
  2175.     },
  2176.     readRecords : function(doc){
  2177.         this.xmlData = doc;
  2178.         var root = doc.documentElement || doc;
  2179.         var q = Ext.DomQuery;
  2180.         var recordType = this.recordType, fields = recordType.prototype.fields;
  2181.         var sid = this.meta.id;
  2182.         var totalRecords = 0, success = true;
  2183.         if(this.meta.totalRecords){
  2184.             totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);
  2185.         }
  2186.         if(this.meta.success){
  2187.             var sv = q.selectValue(this.meta.success, root, true);
  2188.             success = sv !== false && sv !== 'false';
  2189.         }
  2190.         var records = [];
  2191.         var ns = q.select(this.meta.record, root);
  2192.         for(var i = 0, len = ns.length; i < len; i++) {
  2193.             var n = ns[i];
  2194.             var values = {};
  2195.             var id = sid ? q.selectValue(sid, n) : undefined;
  2196.             for(var j = 0, jlen = fields.length; j < jlen; j++){
  2197.                 var f = fields.items[j];
  2198.                 var v = q.selectValue(f.mapping || f.name, n, f.defaultValue);
  2199.                 v = f.convert(v, n);
  2200.                 values[f.name] = v;
  2201.             }
  2202.             var record = new recordType(values, id);
  2203.             record.node = n;
  2204.             records[records.length] = record;
  2205.         }
  2206.         return {
  2207.             success : success,
  2208.             records : records,
  2209.             totalRecords : totalRecords || records.length
  2210.         };
  2211.     }
  2212. });
  2213. Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
  2214.     readRecords : function(o){
  2215.         var sid = this.meta ? this.meta.id : null;
  2216.         var recordType = this.recordType, fields = recordType.prototype.fields;
  2217.         var records = [];
  2218.         var root = o;
  2219.         for(var i = 0; i < root.length; i++){
  2220.             var n = root[i];
  2221.             var values = {};
  2222.             var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
  2223.             for(var j = 0, jlen = fields.length; j < jlen; j++){
  2224.                 var f = fields.items[j];
  2225.                 var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
  2226.                 var v = n[k] !== undefined ? n[k] : f.defaultValue;
  2227.                 v = f.convert(v, n);
  2228.                 values[f.name] = v;
  2229.             }
  2230.             var record = new recordType(values, id);
  2231.             record.json = n;
  2232.             records[records.length] = record;
  2233.         }
  2234.         return {
  2235.             records : records,
  2236.             totalRecords : records.length
  2237.         };
  2238.     }
  2239. });
  2240. Ext.data.Tree = function(root){
  2241.    this.nodeHash = {};
  2242.    this.root = null;
  2243.    if(root){
  2244.        this.setRootNode(root);
  2245.    }
  2246.    this.addEvents(
  2247.        "append",
  2248.        "remove",
  2249.        "move",
  2250.        "insert",
  2251.        "beforeappend",
  2252.        "beforeremove",
  2253.        "beforemove",
  2254.        "beforeinsert"
  2255.    );
  2256.     Ext.data.Tree.superclass.constructor.call(this);
  2257. };
  2258. Ext.extend(Ext.data.Tree, Ext.util.Observable, {
  2259.     pathSeparator: "/",
  2260.     proxyNodeEvent : function(){
  2261.         return this.fireEvent.apply(this, arguments);
  2262.     },
  2263.     getRootNode : function(){
  2264.         return this.root;
  2265.     },
  2266.     setRootNode : function(node){
  2267.         this.root = node;
  2268.         node.ownerTree = this;
  2269.         node.isRoot = true;
  2270.         this.registerNode(node);
  2271.         return node;
  2272.     },
  2273.     getNodeById : function(id){
  2274.         return this.nodeHash[id];
  2275.     },
  2276.     registerNode : function(node){
  2277.         this.nodeHash[node.id] = node;
  2278.     },
  2279.     unregisterNode : function(node){
  2280.         delete this.nodeHash[node.id];
  2281.     },
  2282.     toString : function(){
  2283.         return "[Tree"+(this.id?" "+this.id:"")+"]";
  2284.     }
  2285. });
  2286. Ext.data.Node = function(attributes){
  2287.     this.attributes = attributes || {};
  2288.     this.leaf = this.attributes.leaf;
  2289.     this.id = this.attributes.id;
  2290.     if(!this.id){
  2291.         this.id = Ext.id(null, "ynode-");
  2292.         this.attributes.id = this.id;
  2293.     }
  2294.     this.childNodes = [];
  2295.     if(!this.childNodes.indexOf){
  2296.         this.childNodes.indexOf = function(o){
  2297.             for(var i = 0, len = this.length; i < len; i++){
  2298.                 if(this[i] == o) return i;
  2299.             }
  2300.             return -1;
  2301.         };
  2302.     }
  2303.     this.parentNode = null;
  2304.     this.firstChild = null;
  2305.     this.lastChild = null;
  2306.     this.previousSibling = null;
  2307.     this.nextSibling = null;
  2308.     this.addEvents({
  2309.        "append" : true,
  2310.        "remove" : true,
  2311.        "move" : true,
  2312.        "insert" : true,
  2313.        "beforeappend" : true,
  2314.        "beforeremove" : true,
  2315.        "beforemove" : true,
  2316.        "beforeinsert" : true
  2317.    });
  2318.     this.listeners = this.attributes.listeners;
  2319.     Ext.data.Node.superclass.constructor.call(this);
  2320. };
  2321. Ext.extend(Ext.data.Node, Ext.util.Observable, {
  2322.     fireEvent : function(evtName){
  2323.         if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){
  2324.             return false;
  2325.         }
  2326.         var ot = this.getOwnerTree();
  2327.         if(ot){
  2328.             if(ot.proxyNodeEvent.apply(ot, arguments) === false){
  2329.                 return false;
  2330.             }
  2331.         }
  2332.         return true;
  2333.     },
  2334.     isLeaf : function(){
  2335.         return this.leaf === true;
  2336.     },
  2337.     setFirstChild : function(node){
  2338.         this.firstChild = node;
  2339.     },
  2340.     setLastChild : function(node){
  2341.         this.lastChild = node;
  2342.     },
  2343.     isLast : function(){
  2344.        return (!this.parentNode ? true : this.parentNode.lastChild == this);
  2345.     },
  2346.     isFirst : function(){
  2347.        return (!this.parentNode ? true : this.parentNode.firstChild == this);
  2348.     },
  2349.     hasChildNodes : function(){
  2350.         return !this.isLeaf() && this.childNodes.length > 0;
  2351.     },
  2352.     appendChild : function(node){
  2353.         var multi = false;
  2354.         if(Ext.isArray(node)){
  2355.             multi = node;
  2356.         }else if(arguments.length > 1){
  2357.             multi = arguments;
  2358.         }
  2359.         if(multi){
  2360.             for(var i = 0, len = multi.length; i < len; i++) {
  2361.                 this.appendChild(multi[i]);
  2362.             }
  2363.         }else{
  2364.             if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){
  2365.                 return false;
  2366.             }
  2367.             var index = this.childNodes.length;
  2368.             var oldParent = node.parentNode;
  2369.             if(oldParent){
  2370.                 if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){
  2371.                     return false;
  2372.                 }
  2373.                 oldParent.removeChild(node);
  2374.             }
  2375.             index = this.childNodes.length;
  2376.             if(index == 0){
  2377.                 this.setFirstChild(node);
  2378.             }
  2379.             this.childNodes.push(node);
  2380.             node.parentNode = this;
  2381.             var ps = this.childNodes[index-1];
  2382.             if(ps){
  2383.                 node.previousSibling = ps;
  2384.                 ps.nextSibling = node;
  2385.             }else{
  2386.                 node.previousSibling = null;
  2387.             }
  2388.             node.nextSibling = null;
  2389.             this.setLastChild(node);
  2390.             node.setOwnerTree(this.getOwnerTree());
  2391.             this.fireEvent("append", this.ownerTree, this, node, index);
  2392.             if(oldParent){
  2393.                 node.fireEvent("move", this.ownerTree, node, oldParent, this, index);
  2394.             }
  2395.             return node;
  2396.         }
  2397.     },
  2398.     removeChild : function(node){
  2399.         var index = this.childNodes.indexOf(node);
  2400.         if(index == -1){
  2401.             return false;
  2402.         }
  2403.         if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){
  2404.             return false;
  2405.         }
  2406.         this.childNodes.splice(index, 1);
  2407.         if(node.previousSibling){
  2408.             node.previousSibling.nextSibling = node.nextSibling;
  2409.         }
  2410.         if(node.nextSibling){
  2411.             node.nextSibling.previousSibling = node.previousSibling;
  2412.         }
  2413.         if(this.firstChild == node){
  2414.             this.setFirstChild(node.nextSibling);
  2415.         }
  2416.         if(this.lastChild == node){
  2417.             this.setLastChild(node.previousSibling);
  2418.         }
  2419.         node.setOwnerTree(null);
  2420.         node.parentNode = null;
  2421.         node.previousSibling = null;
  2422.         node.nextSibling = null;
  2423.         this.fireEvent("remove", this.ownerTree, this, node);
  2424.         return node;
  2425.     },
  2426.     insertBefore : function(node, refNode){
  2427.         if(!refNode){
  2428.             return this.appendChild(node);
  2429.         }
  2430.         if(node == refNode){
  2431.             return false;
  2432.         }
  2433.         if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){
  2434.             return false;
  2435.         }
  2436.         var index = this.childNodes.indexOf(refNode);
  2437.         var oldParent = node.parentNode;
  2438.         var refIndex = index;
  2439.         if(oldParent == this && this.childNodes.indexOf(node) < index){
  2440.             refIndex--;
  2441.         }
  2442.         if(oldParent){
  2443.             if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){
  2444.                 return false;
  2445.             }
  2446.             oldParent.removeChild(node);
  2447.         }
  2448.         if(refIndex == 0){
  2449.             this.setFirstChild(node);
  2450.         }
  2451.         this.childNodes.splice(refIndex, 0, node);
  2452.         node.parentNode = this;
  2453.         var ps = this.childNodes[refIndex-1];
  2454.         if(ps){
  2455.             node.previousSibling = ps;
  2456.             ps.nextSibling = node;
  2457.         }else{
  2458.             node.previousSibling = null;
  2459.         }
  2460.         node.nextSibling = refNode;
  2461.         refNode.previousSibling = node;
  2462.         node.setOwnerTree(this.getOwnerTree());
  2463.         this.fireEvent("insert", this.ownerTree, this, node, refNode);
  2464.         if(oldParent){
  2465.             node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);
  2466.         }
  2467.         return node;
  2468.     },
  2469.     remove : function(){
  2470.         this.parentNode.removeChild(this);
  2471.         return this;
  2472.     },
  2473.     item : function(index){
  2474.         return this.childNodes[index];
  2475.     },
  2476.     replaceChild : function(newChild, oldChild){
  2477.         this.insertBefore(newChild, oldChild);
  2478.         this.removeChild(oldChild);
  2479.         return oldChild;
  2480.     },
  2481.     indexOf : function(child){
  2482.         return this.childNodes.indexOf(child);
  2483.     },
  2484.     getOwnerTree : function(){
  2485.         if(!this.ownerTree){
  2486.             var p = this;
  2487.             while(p){
  2488.                 if(p.ownerTree){
  2489.                     this.ownerTree = p.ownerTree;
  2490.                     break;
  2491.                 }
  2492.                 p = p.parentNode;
  2493.             }
  2494.         }
  2495.         return this.ownerTree;
  2496.     },
  2497.     getDepth : function(){
  2498.         var depth = 0;
  2499.         var p = this;
  2500.         while(p.parentNode){
  2501.             ++depth;
  2502.             p = p.parentNode;
  2503.         }
  2504.         return depth;
  2505.     },
  2506.     setOwnerTree : function(tree){
  2507.         if(tree != this.ownerTree){
  2508.             if(this.ownerTree){
  2509.                 this.ownerTree.unregisterNode(this);
  2510.             }
  2511.             this.ownerTree = tree;
  2512.             var cs = this.childNodes;
  2513.             for(var i = 0, len = cs.length; i < len; i++) {
  2514.                 cs[i].setOwnerTree(tree);
  2515.             }
  2516.             if(tree){
  2517.                 tree.registerNode(this);
  2518.             }
  2519.         }
  2520.     },
  2521.     getPath : function(attr){
  2522.         attr = attr || "id";
  2523.         var p = this.parentNode;
  2524.         var b = [this.attributes[attr]];
  2525.         while(p){
  2526.             b.unshift(p.attributes[attr]);
  2527.             p = p.parentNode;
  2528.         }
  2529.         var sep = this.getOwnerTree().pathSeparator;
  2530.         return sep + b.join(sep);
  2531.     },
  2532.     bubble : function(fn, scope, args){
  2533.         var p = this;
  2534.         while(p){
  2535.             if(fn.apply(scope || p, args || [p]) === false){
  2536.                 break;
  2537.             }
  2538.             p = p.parentNode;
  2539.         }
  2540.     },
  2541.     cascade : function(fn, scope, args){
  2542.         if(fn.apply(scope || this, args || [this]) !== false){
  2543.             var cs = this.childNodes;
  2544.             for(var i = 0, len = cs.length; i < len; i++) {
  2545.                 cs[i].cascade(fn, scope, args);
  2546.             }
  2547.         }
  2548.     },
  2549.     eachChild : function(fn, scope, args){
  2550.         var cs = this.childNodes;
  2551.         for(var i = 0, len = cs.length; i < len; i++) {
  2552.             if(fn.apply(scope || this, args || [cs[i]]) === false){
  2553.                 break;
  2554.             }
  2555.         }
  2556.     },
  2557.     findChild : function(attribute, value){
  2558.         var cs = this.childNodes;
  2559.         for(var i = 0, len = cs.length; i < len; i++) {
  2560.             if(cs[i].attributes[attribute] == value){
  2561.                 return cs[i];
  2562.             }
  2563.         }
  2564.         return null;
  2565.     },
  2566.     findChildBy : function(fn, scope){
  2567.         var cs = this.childNodes;
  2568.         for(var i = 0, len = cs.length; i < len; i++) {
  2569.             if(fn.call(scope||cs[i], cs[i]) === true){
  2570.                 return cs[i];
  2571.             }
  2572.         }
  2573.         return null;
  2574.     },
  2575.     sort : function(fn, scope){
  2576.         var cs = this.childNodes;
  2577.         var len = cs.length;
  2578.         if(len > 0){
  2579.             var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;
  2580.             cs.sort(sortFn);
  2581.             for(var i = 0; i < len; i++){
  2582.                 var n = cs[i];
  2583.                 n.previousSibling = cs[i-1];
  2584.                 n.nextSibling = cs[i+1];
  2585.                 if(i == 0){
  2586.                     this.setFirstChild(n);
  2587.                 }
  2588.                 if(i == len-1){
  2589.                     this.setLastChild(n);
  2590.                 }
  2591.             }
  2592.         }
  2593.     },
  2594.     contains : function(node){
  2595.         return node.isAncestor(this);
  2596.     },
  2597.     isAncestor : function(node){
  2598.         var p = this.parentNode;
  2599.         while(p){
  2600.             if(p == node){
  2601.                 return true;
  2602.             }
  2603.             p = p.parentNode;
  2604.         }
  2605.         return false;
  2606.     },
  2607.     toString : function(){
  2608.         return "[Node"+(this.id?" "+this.id:"")+"]";
  2609.     }
  2610. });
  2611. Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
  2612.     remoteGroup : false,
  2613.     groupOnSort:false,
  2614.     clearGrouping : function(){
  2615.         this.groupField = false;
  2616.         if(this.remoteGroup){
  2617.             if(this.baseParams){
  2618.                 delete this.baseParams.groupBy;
  2619.             }
  2620.             this.reload();
  2621.         }else{
  2622.             this.applySort();
  2623.             this.fireEvent('datachanged', this);
  2624.         }
  2625.     },
  2626.     groupBy : function(field, forceRegroup){
  2627.         if(this.groupField == field && !forceRegroup){
  2628.             return;
  2629.         }
  2630.         this.groupField = field;
  2631.         if(this.remoteGroup){
  2632.             if(!this.baseParams){
  2633.                 this.baseParams = {};
  2634.             }
  2635.             this.baseParams['groupBy'] = field;
  2636.         }
  2637.         if(this.groupOnSort){
  2638.             this.sort(field);
  2639.             return;
  2640.         }
  2641.         if(this.remoteGroup){
  2642.             this.reload();
  2643.         }else{
  2644.             var si = this.sortInfo || {};
  2645.             if(si.field != field){
  2646.                 this.applySort();
  2647.             }else{
  2648.                 this.sortData(field);
  2649.             }
  2650.             this.fireEvent('datachanged', this);
  2651.         }
  2652.     },
  2653.     applySort : function(){
  2654.         Ext.data.GroupingStore.superclass.applySort.call(this);
  2655.         if(!this.groupOnSort && !this.remoteGroup){
  2656.             var gs = this.getGroupState();
  2657.             if(gs && gs != this.sortInfo.field){
  2658.                 this.sortData(this.groupField);
  2659.             }
  2660.         }
  2661.     },
  2662.     applyGrouping : function(alwaysFireChange){
  2663.         if(this.groupField !== false){
  2664.             this.groupBy(this.groupField, true);
  2665.             return true;
  2666.         }else{
  2667.             if(alwaysFireChange === true){
  2668.                 this.fireEvent('datachanged', this);
  2669.             }
  2670.             return false;
  2671.         }
  2672.     },
  2673.     getGroupState : function(){
  2674.         return this.groupOnSort && this.groupField !== false ?
  2675.                (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;
  2676.     }
  2677. });
  2678. Ext.ComponentMgr = function(){
  2679.     var all = new Ext.util.MixedCollection();
  2680.     var types = {};
  2681.     return {
  2682.         register : function(c){
  2683.             all.add(c);
  2684.         },
  2685.         unregister : function(c){
  2686.             all.remove(c);
  2687.         },
  2688.         get : function(id){
  2689.             return all.get(id);
  2690.         },
  2691.         onAvailable : function(id, fn, scope){
  2692.             all.on("add", function(index, o){
  2693.                 if(o.id == id){
  2694.                     fn.call(scope || o, o);
  2695.                     all.un("add", fn, scope);
  2696.                 }
  2697.             });
  2698.         },
  2699.         all : all,
  2700.         registerType : function(xtype, cls){
  2701.             types[xtype] = cls;
  2702.             cls.xtype = xtype;
  2703.         },
  2704.         create : function(config, defaultType){
  2705.             return new types[config.xtype || defaultType](config);
  2706.         }
  2707.     };
  2708. }();
  2709. Ext.reg = Ext.ComponentMgr.registerType;
  2710. Ext.Component = function(config){
  2711.     config = config || {};
  2712.     if(config.initialConfig){
  2713.         if(config.isAction){                       this.baseAction = config;
  2714.         }
  2715.         config = config.initialConfig;     }else if(config.tagName || config.dom || typeof config == "string"){         config = {applyTo: config, id: config.id || config};
  2716.     }
  2717.     this.initialConfig = config;
  2718.     Ext.apply(this, config);
  2719.     this.addEvents(
  2720.         'disable',
  2721.         'enable',
  2722.         'beforeshow',
  2723.         'show',
  2724.         'beforehide',
  2725.         'hide',
  2726.         'beforerender',
  2727.         'render',
  2728.         'beforedestroy',
  2729.         'destroy',
  2730.         'beforestaterestore',
  2731.         'staterestore',
  2732.         'beforestatesave',
  2733.         'statesave'
  2734.     );
  2735.     this.getId();
  2736.     Ext.ComponentMgr.register(this);
  2737.     Ext.Component.superclass.constructor.call(this);
  2738.     if(this.baseAction){
  2739.         this.baseAction.addComponent(this);
  2740.     }
  2741.     this.initComponent();
  2742.     if(this.plugins){
  2743.         if(Ext.isArray(this.plugins)){
  2744.             for(var i = 0, len = this.plugins.length; i < len; i++){
  2745.                 this.plugins[i].init(this);
  2746.             }
  2747.         }else{
  2748.             this.plugins.init(this);
  2749.         }
  2750.     }
  2751.     if(this.stateful !== false){
  2752.         this.initState(config);
  2753.     }
  2754.     if(this.applyTo){
  2755.         this.applyToMarkup(this.applyTo);
  2756.         delete this.applyTo;
  2757.     }else if(this.renderTo){
  2758.         this.render(this.renderTo);
  2759.         delete this.renderTo;
  2760.     }
  2761. };
  2762. Ext.Component.AUTO_ID = 1000;
  2763. Ext.extend(Ext.Component, Ext.util.Observable, {
  2764.     disabledClass : "x-item-disabled",
  2765.     allowDomMove : true,
  2766.     autoShow : false,
  2767.     hideMode: 'display',
  2768.     hideParent: false,
  2769.     hidden : false,
  2770.     disabled : false,
  2771.     rendered : false,
  2772.         ctype : "Ext.Component",
  2773.         actionMode : "el",
  2774.         getActionEl : function(){
  2775.         return this[this.actionMode];
  2776.     },
  2777.     initComponent : Ext.emptyFn,
  2778.     render : function(container, position){
  2779.         if(!this.rendered && this.fireEvent("beforerender", this) !== false){
  2780.             if(!container && this.el){
  2781.                 this.el = Ext.get(this.el);
  2782.                 container = this.el.dom.parentNode;
  2783.                 this.allowDomMove = false;
  2784.             }
  2785.             this.container = Ext.get(container);
  2786.             if(this.ctCls){
  2787.                 this.container.addClass(this.ctCls);
  2788.             }
  2789.             this.rendered = true;
  2790.             if(position !== undefined){
  2791.                 if(typeof position == 'number'){
  2792.                     position = this.container.dom.childNodes[position];
  2793.                 }else{
  2794.                     position = Ext.getDom(position);
  2795.                 }
  2796.             }
  2797.             this.onRender(this.container, position || null);
  2798.             if(this.autoShow){
  2799.                 this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
  2800.             }
  2801.             if(this.cls){
  2802.                 this.el.addClass(this.cls);
  2803.                 delete this.cls;
  2804.             }
  2805.             if(this.style){
  2806.                 this.el.applyStyles(this.style);
  2807.                 delete this.style;
  2808.             }
  2809.             this.fireEvent("render", this);
  2810.             this.afterRender(this.container);
  2811.             if(this.hidden){
  2812.                 this.hide();
  2813.             }
  2814.             if(this.disabled){
  2815.                 this.disable();
  2816.             }
  2817.             this.initStateEvents();
  2818.         }
  2819.         return this;
  2820.     },
  2821.         initState : function(config){
  2822.         if(Ext.state.Manager){
  2823.             var state = Ext.state.Manager.get(this.stateId || this.id);
  2824.             if(state){
  2825.                 if(this.fireEvent('beforestaterestore', this, state) !== false){
  2826.                     this.applyState(state);
  2827.                     this.fireEvent('staterestore', this, state);
  2828.                 }
  2829.             }
  2830.         }
  2831.     },
  2832.         initStateEvents : function(){
  2833.         if(this.stateEvents){
  2834.             for(var i = 0, e; e = this.stateEvents[i]; i++){
  2835.                 this.on(e, this.saveState, this, {delay:100});
  2836.             }
  2837.         }
  2838.     },
  2839.         applyState : function(state, config){
  2840.         if(state){
  2841.             Ext.apply(this, state);
  2842.         }
  2843.     },
  2844.         getState : function(){
  2845.         return null;
  2846.     },
  2847.         saveState : function(){
  2848.         if(Ext.state.Manager){
  2849.             var state = this.getState();
  2850.             if(this.fireEvent('beforestatesave', this, state) !== false){
  2851.                 Ext.state.Manager.set(this.stateId || this.id, state);
  2852.                 this.fireEvent('statesave', this, state);
  2853.             }
  2854.         }
  2855.     },
  2856.     applyToMarkup : function(el){
  2857.         this.allowDomMove = false;
  2858.         this.el = Ext.get(el);
  2859.         this.render(this.el.dom.parentNode);
  2860.     },
  2861.     addClass : function(cls){
  2862.         if(this.el){
  2863.             this.el.addClass(cls);
  2864.         }else{
  2865.             this.cls = this.cls ? this.cls + ' ' + cls : cls;
  2866.         }
  2867.     },
  2868.     removeClass : function(cls){
  2869.         if(this.el){
  2870.             this.el.removeClass(cls);
  2871.         }else if(this.cls){
  2872.             this.cls = this.cls.split(' ').remove(cls).join(' ');
  2873.         }
  2874.     },
  2875.             onRender : function(ct, position){
  2876.         if(this.autoEl){
  2877.             if(typeof this.autoEl == 'string'){
  2878.                 this.el = document.createElement(this.autoEl);
  2879.             }else{
  2880.                 var div = document.createElement('div');
  2881.                 Ext.DomHelper.overwrite(div, this.autoEl);
  2882.                 this.el = div.firstChild;
  2883.             }
  2884.             if (!this.el.id) {
  2885.                 this.el.id = this.getId();
  2886.             }
  2887.         }
  2888.         if(this.el){
  2889.             this.el = Ext.get(this.el);
  2890.             if(this.allowDomMove !== false){
  2891.                 ct.dom.insertBefore(this.el.dom, position);
  2892.             }
  2893.         }
  2894.     },
  2895.         getAutoCreate : function(){
  2896.         var cfg = typeof this.autoCreate == "object" ?
  2897.                       this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
  2898.         if(this.id && !cfg.id){
  2899.             cfg.id = this.id;
  2900.         }
  2901.         return cfg;
  2902.     },
  2903.         afterRender : Ext.emptyFn,
  2904.     destroy : function(){
  2905.         if(this.fireEvent("beforedestroy", this) !== false){
  2906.             this.beforeDestroy();
  2907.             if(this.rendered){
  2908.                 this.el.removeAllListeners();
  2909.                 this.el.remove();
  2910.                 if(this.actionMode == "container"){
  2911.                     this.container.remove();
  2912.                 }
  2913.             }
  2914.             this.onDestroy();
  2915.             Ext.ComponentMgr.unregister(this);
  2916.             this.fireEvent("destroy", this);
  2917.             this.purgeListeners();
  2918.         }
  2919.     },
  2920.         beforeDestroy : Ext.emptyFn,
  2921.         onDestroy  : Ext.emptyFn,
  2922.     getEl : function(){
  2923.         return this.el;
  2924.     },
  2925.     getId : function(){
  2926.         return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID));
  2927.     },
  2928.     getItemId : function(){
  2929.         return this.itemId || this.getId();
  2930.     },
  2931.     focus : function(selectText, delay){
  2932.         if(delay){
  2933.             this.focus.defer(typeof delay == 'number' ? delay : 10, this, [selectText, false]);
  2934.             return;
  2935.         }
  2936.         if(this.rendered){
  2937.             this.el.focus();
  2938.             if(selectText === true){
  2939.                 this.el.dom.select();
  2940.             }
  2941.         }
  2942.         return this;
  2943.     },
  2944.         blur : function(){
  2945.         if(this.rendered){
  2946.             this.el.blur();
  2947.         }
  2948.         return this;
  2949.     },
  2950.     disable : function(){
  2951.         if(this.rendered){
  2952.             this.onDisable();
  2953.         }
  2954.         this.disabled = true;
  2955.         this.fireEvent("disable", this);
  2956.         return this;
  2957.     },
  2958.         onDisable : function(){
  2959.         this.getActionEl().addClass(this.disabledClass);
  2960.         this.el.dom.disabled = true;
  2961.     },
  2962.     enable : function(){
  2963.         if(this.rendered){
  2964.             this.onEnable();
  2965.         }
  2966.         this.disabled = false;
  2967.         this.fireEvent("enable", this);
  2968.         return this;
  2969.     },
  2970.         onEnable : function(){
  2971.         this.getActionEl().removeClass(this.disabledClass);
  2972.         this.el.dom.disabled = false;
  2973.     },
  2974.     setDisabled : function(disabled){
  2975.         this[disabled ? "disable" : "enable"]();
  2976.     },
  2977.     show: function(){
  2978.         if(this.fireEvent("beforeshow", this) !== false){
  2979.             this.hidden = false;
  2980.             if(this.autoRender){
  2981.                 this.render(typeof this.autoRender == 'boolean' ? Ext.getBody() : this.autoRender);
  2982.             }
  2983.             if(this.rendered){
  2984.                 this.onShow();
  2985.             }
  2986.             this.fireEvent("show", this);
  2987.         }
  2988.         return this;
  2989.     },
  2990.         onShow : function(){
  2991.         if(this.hideParent){
  2992.             this.container.removeClass('x-hide-' + this.hideMode);
  2993.         }else{
  2994.             this.getActionEl().removeClass('x-hide-' + this.hideMode);
  2995.         }
  2996.     },
  2997.     hide: function(){
  2998.         if(this.fireEvent("beforehide", this) !== false){
  2999.             this.hidden = true;
  3000.             if(this.rendered){
  3001.                 this.onHide();
  3002.             }
  3003.             this.fireEvent("hide", this);
  3004.         }
  3005.         return this;
  3006.     },
  3007.         onHide : function(){
  3008.         if(this.hideParent){
  3009.             this.container.addClass('x-hide-' + this.hideMode);
  3010.         }else{
  3011.             this.getActionEl().addClass('x-hide-' + this.hideMode);
  3012.         }
  3013.     },
  3014.     setVisible: function(visible){
  3015.         if(visible) {
  3016.             this.show();
  3017.         }else{
  3018.             this.hide();
  3019.         }
  3020.         return this;
  3021.     },
  3022.     isVisible : function(){
  3023.         return this.rendered && this.getActionEl().isVisible();
  3024.     },
  3025.     cloneConfig : function(overrides){
  3026.         overrides = overrides || {};
  3027.         var id = overrides.id || Ext.id();
  3028.         var cfg = Ext.applyIf(overrides, this.initialConfig);
  3029.         cfg.id = id;         return new this.constructor(cfg);
  3030.     },
  3031.     getXType : function(){
  3032.         return this.constructor.xtype;
  3033.     },
  3034.     isXType : function(xtype, shallow){
  3035.         return !shallow ?
  3036.                ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 :
  3037.                 this.constructor.xtype == xtype;
  3038.     },
  3039.     getXTypes : function(){
  3040.         var tc = this.constructor;
  3041.         if(!tc.xtypes){
  3042.             var c = [], sc = this;
  3043.             while(sc && sc.constructor.xtype){
  3044.                 c.unshift(sc.constructor.xtype);
  3045.                 sc = sc.constructor.superclass;
  3046.             }
  3047.             tc.xtypeChain = c;
  3048.             tc.xtypes = c.join('/');
  3049.         }
  3050.         return tc.xtypes;
  3051.     },
  3052.     findParentBy: function(fn) {
  3053.         for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);
  3054.         return p || null;
  3055.     },
  3056.     findParentByType: function(xtype) {
  3057.         return typeof xtype == 'function' ?
  3058.             this.findParentBy(function(p){
  3059.                 return p.constructor === xtype;
  3060.             }) :
  3061.             this.findParentBy(function(p){
  3062.                 return p.constructor.xtype === xtype;
  3063.             });
  3064.     }
  3065. });
  3066. Ext.reg('component', Ext.Component);
  3067. Ext.Action = function(config){
  3068.     this.initialConfig = config;
  3069.     this.items = [];
  3070. }
  3071. Ext.Action.prototype = {
  3072.     isAction : true,
  3073.     setText : function(text){
  3074.         this.initialConfig.text = text;
  3075.         this.callEach('setText', [text]);
  3076.     },
  3077.     getText : function(){
  3078.         return this.initialConfig.text;
  3079.     },
  3080.     setIconClass : function(cls){
  3081.         this.initialConfig.iconCls = cls;
  3082.         this.callEach('setIconClass', [cls]);
  3083.     },
  3084.     getIconClass : function(){
  3085.         return this.initialConfig.iconCls;
  3086.     },
  3087.     setDisabled : function(v){
  3088.         this.initialConfig.disabled = v;
  3089.         this.callEach('setDisabled', [v]);
  3090.     },
  3091.     enable : function(){
  3092.         this.setDisabled(false);
  3093.     },
  3094.     disable : function(){
  3095.         this.setDisabled(true);
  3096.     },
  3097.     isDisabled : function(){
  3098.         return this.initialConfig.disabled;
  3099.     },
  3100.     setHidden : function(v){
  3101.         this.initialConfig.hidden = v;
  3102.         this.callEach('setVisible', [!v]);
  3103.     },
  3104.     show : function(){
  3105.         this.setHidden(false);
  3106.     },
  3107.     hide : function(){
  3108.         this.setHidden(true);
  3109.     },
  3110.     isHidden : function(){
  3111.         return this.initialConfig.hidden;
  3112.     },
  3113.     setHandler : function(fn, scope){
  3114.         this.initialConfig.handler = fn;
  3115.         this.initialConfig.scope = scope;
  3116.         this.callEach('setHandler', [fn, scope]);
  3117.     },