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

JavaScript

开发平台:

JavaScript

  1.                 el.afterFx(o);
  2.             };
  3.             var a, zero = {to: 0};
  4.             switch(anchor.toLowerCase()){
  5.                 case "t":
  6.                     st.left = st.bottom = "0";
  7.                     a = {height: zero};
  8.                 break;
  9.                 case "l":
  10.                     st.right = st.top = "0";
  11.                     a = {width: zero};
  12.                 break;
  13.                 case "r":
  14.                     st.left = st.top = "0";
  15.                     a = {width: zero, points: {to:[b.right, b.y]}};
  16.                 break;
  17.                 case "b":
  18.                     st.left = st.top = "0";
  19.                     a = {height: zero, points: {to:[b.x, b.bottom]}};
  20.                 break;
  21.                 case "tl":
  22.                     st.right = st.bottom = "0";
  23.                     a = {width: zero, height: zero};
  24.                 break;
  25.                 case "bl":
  26.                     st.right = st.top = "0";
  27.                     a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}};
  28.                 break;
  29.                 case "br":
  30.                     st.left = st.top = "0";
  31.                     a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}};
  32.                 break;
  33.                 case "tr":
  34.                     st.left = st.bottom = "0";
  35.                     a = {width: zero, height: zero, points: {to:[b.right, b.y]}};
  36.                 break;
  37.             }
  38.             arguments.callee.anim = wrap.fxanim(a,
  39.                 o,
  40.                 'motion',
  41.                 .5,
  42.                 "easeOut", after);
  43.         });
  44.         return this;
  45.     },
  46.     puff : function(o){
  47.         var el = this.getFxEl();
  48.         o = o || {};
  49.         el.queueFx(o, function(){
  50.             this.clearOpacity();
  51.             this.show();
  52.                         var r = this.getFxRestore();
  53.             var st = this.dom.style;
  54.             var after = function(){
  55.                 if(o.useDisplay){
  56.                     el.setDisplayed(false);
  57.                 }else{
  58.                     el.hide();
  59.                 }
  60.                 el.clearOpacity();
  61.                 el.setPositioning(r.pos);
  62.                 st.width = r.width;
  63.                 st.height = r.height;
  64.                 st.fontSize = '';
  65.                 el.afterFx(o);
  66.             };
  67.             var width = this.getWidth();
  68.             var height = this.getHeight();
  69.             arguments.callee.anim = this.fxanim({
  70.                     width : {to: this.adjustWidth(width * 2)},
  71.                     height : {to: this.adjustHeight(height * 2)},
  72.                     points : {by: [-(width * .5), -(height * .5)]},
  73.                     opacity : {to: 0},
  74.                     fontSize: {to:200, unit: "%"}
  75.                 },
  76.                 o,
  77.                 'motion',
  78.                 .5,
  79.                 "easeOut", after);
  80.         });
  81.         return this;
  82.     },
  83.     switchOff : function(o){
  84.         var el = this.getFxEl();
  85.         o = o || {};
  86.         el.queueFx(o, function(){
  87.             this.clearOpacity();
  88.             this.clip();
  89.                         var r = this.getFxRestore();
  90.             var st = this.dom.style;
  91.             var after = function(){
  92.                 if(o.useDisplay){
  93.                     el.setDisplayed(false);
  94.                 }else{
  95.                     el.hide();
  96.                 }
  97.                 el.clearOpacity();
  98.                 el.setPositioning(r.pos);
  99.                 st.width = r.width;
  100.                 st.height = r.height;
  101.                 el.afterFx(o);
  102.             };
  103.             this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){
  104.                 this.clearOpacity();
  105.                 (function(){
  106.                     this.fxanim({
  107.                         height:{to:1},
  108.                         points:{by:[0, this.getHeight() * .5]}
  109.                     }, o, 'motion', 0.3, 'easeIn', after);
  110.                 }).defer(100, this);
  111.             });
  112.         });
  113.         return this;
  114.     },
  115.     highlight : function(color, o){
  116.         var el = this.getFxEl();
  117.         o = o || {};
  118.         el.queueFx(o, function(){
  119.             color = color || "ffff9c";
  120.             var attr = o.attr || "backgroundColor";
  121.             this.clearOpacity();
  122.             this.show();
  123.             var origColor = this.getColor(attr);
  124.             var restoreColor = this.dom.style[attr];
  125.             var endColor = (o.endColor || origColor) || "ffffff";
  126.             var after = function(){
  127.                 el.dom.style[attr] = restoreColor;
  128.                 el.afterFx(o);
  129.             };
  130.             var a = {};
  131.             a[attr] = {from: color, to: endColor};
  132.             arguments.callee.anim = this.fxanim(a,
  133.                 o,
  134.                 'color',
  135.                 1,
  136.                 'easeIn', after);
  137.         });
  138.         return this;
  139.     },
  140.     frame : function(color, count, o){
  141.         var el = this.getFxEl();
  142.         o = o || {};
  143.         el.queueFx(o, function(){
  144.             color = color || "#C3DAF9";
  145.             if(color.length == 6){
  146.                 color = "#" + color;
  147.             }
  148.             count = count || 1;
  149.             var duration = o.duration || 1;
  150.             this.show();
  151.             var b = this.getBox();
  152.             var animFn = function(){
  153.                 var proxy = Ext.getBody().createChild({
  154.                      style:{
  155.                         visbility:"hidden",
  156.                         position:"absolute",
  157.                         "z-index":"35000",                         border:"0px solid " + color
  158.                      }
  159.                   });
  160.                 var scale = Ext.isBorderBox ? 2 : 1;
  161.                 proxy.animate({
  162.                     top:{from:b.y, to:b.y - 20},
  163.                     left:{from:b.x, to:b.x - 20},
  164.                     borderWidth:{from:0, to:10},
  165.                     opacity:{from:1, to:0},
  166.                     height:{from:b.height, to:(b.height + (20*scale))},
  167.                     width:{from:b.width, to:(b.width + (20*scale))}
  168.                 }, duration, function(){
  169.                     proxy.remove();
  170.                     if(--count > 0){
  171.                          animFn();
  172.                     }else{
  173.                         el.afterFx(o);
  174.                     }
  175.                 });
  176.             };
  177.             animFn.call(this);
  178.         });
  179.         return this;
  180.     },
  181.     pause : function(seconds){
  182.         var el = this.getFxEl();
  183.         var o = {};
  184.         el.queueFx(o, function(){
  185.             setTimeout(function(){
  186.                 el.afterFx(o);
  187.             }, seconds * 1000);
  188.         });
  189.         return this;
  190.     },
  191.     fadeIn : function(o){
  192.         var el = this.getFxEl();
  193.         o = o || {};
  194.         el.queueFx(o, function(){
  195.             this.setOpacity(0);
  196.             this.fixDisplay();
  197.             this.dom.style.visibility = 'visible';
  198.             var to = o.endOpacity || 1;
  199.             arguments.callee.anim = this.fxanim({opacity:{to:to}},
  200.                 o, null, .5, "easeOut", function(){
  201.                 if(to == 1){
  202.                     this.clearOpacity();
  203.                 }
  204.                 el.afterFx(o);
  205.             });
  206.         });
  207.         return this;
  208.     },
  209.     fadeOut : function(o){
  210.         var el = this.getFxEl();
  211.         o = o || {};
  212.         el.queueFx(o, function(){
  213.             arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}},
  214.                 o, null, .5, "easeOut", function(){
  215.                 if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){
  216.                      this.dom.style.display = "none";
  217.                 }else{
  218.                      this.dom.style.visibility = "hidden";
  219.                 }
  220.                 this.clearOpacity();
  221.                 el.afterFx(o);
  222.             });
  223.         });
  224.         return this;
  225.     },
  226.     scale : function(w, h, o){
  227.         this.shift(Ext.apply({}, o, {
  228.             width: w,
  229.             height: h
  230.         }));
  231.         return this;
  232.     },
  233.     shift : function(o){
  234.         var el = this.getFxEl();
  235.         o = o || {};
  236.         el.queueFx(o, function(){
  237.             var a = {}, w = o.width, h = o.height, x = o.x, y = o.y,  op = o.opacity;
  238.             if(w !== undefined){
  239.                 a.width = {to: this.adjustWidth(w)};
  240.             }
  241.             if(h !== undefined){
  242.                 a.height = {to: this.adjustHeight(h)};
  243.             }
  244.             if(x !== undefined || y !== undefined){
  245.                 a.points = {to: [
  246.                     x !== undefined ? x : this.getX(),
  247.                     y !== undefined ? y : this.getY()
  248.                 ]};
  249.             }
  250.             if(op !== undefined){
  251.                 a.opacity = {to: op};
  252.             }
  253.             if(o.xy !== undefined){
  254.                 a.points = {to: o.xy};
  255.             }
  256.             arguments.callee.anim = this.fxanim(a,
  257.                 o, 'motion', .35, "easeOut", function(){
  258.                 el.afterFx(o);
  259.             });
  260.         });
  261.         return this;
  262.     },
  263.     ghost : function(anchor, o){
  264.         var el = this.getFxEl();
  265.         o = o || {};
  266.         el.queueFx(o, function(){
  267.             anchor = anchor || "b";
  268.                         var r = this.getFxRestore();
  269.             var w = this.getWidth(),
  270.                 h = this.getHeight();
  271.             var st = this.dom.style;
  272.             var after = function(){
  273.                 if(o.useDisplay){
  274.                     el.setDisplayed(false);
  275.                 }else{
  276.                     el.hide();
  277.                 }
  278.                 el.clearOpacity();
  279.                 el.setPositioning(r.pos);
  280.                 st.width = r.width;
  281.                 st.height = r.height;
  282.                 el.afterFx(o);
  283.             };
  284.             var a = {opacity: {to: 0}, points: {}}, pt = a.points;
  285.             switch(anchor.toLowerCase()){
  286.                 case "t":
  287.                     pt.by = [0, -h];
  288.                 break;
  289.                 case "l":
  290.                     pt.by = [-w, 0];
  291.                 break;
  292.                 case "r":
  293.                     pt.by = [w, 0];
  294.                 break;
  295.                 case "b":
  296.                     pt.by = [0, h];
  297.                 break;
  298.                 case "tl":
  299.                     pt.by = [-w, -h];
  300.                 break;
  301.                 case "bl":
  302.                     pt.by = [-w, h];
  303.                 break;
  304.                 case "br":
  305.                     pt.by = [w, h];
  306.                 break;
  307.                 case "tr":
  308.                     pt.by = [w, -h];
  309.                 break;
  310.             }
  311.             arguments.callee.anim = this.fxanim(a,
  312.                 o,
  313.                 'motion',
  314.                 .5,
  315.                 "easeOut", after);
  316.         });
  317.         return this;
  318.     },
  319.     syncFx : function(){
  320.         this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
  321.             block : false,
  322.             concurrent : true,
  323.             stopFx : false
  324.         });
  325.         return this;
  326.     },
  327.     sequenceFx : function(){
  328.         this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
  329.             block : false,
  330.             concurrent : false,
  331.             stopFx : false
  332.         });
  333.         return this;
  334.     },
  335.     nextFx : function(){
  336.         var ef = this.fxQueue[0];
  337.         if(ef){
  338.             ef.call(this);
  339.         }
  340.     },
  341.     hasActiveFx : function(){
  342.         return this.fxQueue && this.fxQueue[0];
  343.     },
  344.     stopFx : function(){
  345.         if(this.hasActiveFx()){
  346.             var cur = this.fxQueue[0];
  347.             if(cur && cur.anim && cur.anim.isAnimated()){
  348.                 this.fxQueue = [cur];                 cur.anim.stop(true);
  349.             }
  350.         }
  351.         return this;
  352.     },
  353.     beforeFx : function(o){
  354.         if(this.hasActiveFx() && !o.concurrent){
  355.            if(o.stopFx){
  356.                this.stopFx();
  357.                return true;
  358.            }
  359.            return false;
  360.         }
  361.         return true;
  362.     },
  363.     hasFxBlock : function(){
  364.         var q = this.fxQueue;
  365.         return q && q[0] && q[0].block;
  366.     },
  367.     queueFx : function(o, fn){
  368.         if(!this.fxQueue){
  369.             this.fxQueue = [];
  370.         }
  371.         if(!this.hasFxBlock()){
  372.             Ext.applyIf(o, this.fxDefaults);
  373.             if(!o.concurrent){
  374.                 var run = this.beforeFx(o);
  375.                 fn.block = o.block;
  376.                 this.fxQueue.push(fn);
  377.                 if(run){
  378.                     this.nextFx();
  379.                 }
  380.             }else{
  381.                 fn.call(this);
  382.             }
  383.         }
  384.         return this;
  385.     },
  386.     fxWrap : function(pos, o, vis){
  387.         var wrap;
  388.         if(!o.wrap || !(wrap = Ext.get(o.wrap))){
  389.             var wrapXY;
  390.             if(o.fixPosition){
  391.                 wrapXY = this.getXY();
  392.             }
  393.             var div = document.createElement("div");
  394.             div.style.visibility = vis;
  395.             wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom));
  396.             wrap.setPositioning(pos);
  397.             if(wrap.getStyle("position") == "static"){
  398.                 wrap.position("relative");
  399.             }
  400.             this.clearPositioning('auto');
  401.             wrap.clip();
  402.             wrap.dom.appendChild(this.dom);
  403.             if(wrapXY){
  404.                 wrap.setXY(wrapXY);
  405.             }
  406.         }
  407.         return wrap;
  408.     },
  409.     fxUnwrap : function(wrap, pos, o){
  410.         this.clearPositioning();
  411.         this.setPositioning(pos);
  412.         if(!o.wrap){
  413.             wrap.dom.parentNode.insertBefore(this.dom, wrap.dom);
  414.             wrap.remove();
  415.         }
  416.     },
  417.     getFxRestore : function(){
  418.         var st = this.dom.style;
  419.         return {pos: this.getPositioning(), width: st.width, height : st.height};
  420.     },
  421.     afterFx : function(o){
  422.         if(o.afterStyle){
  423.             this.applyStyles(o.afterStyle);
  424.         }
  425.         if(o.afterCls){
  426.             this.addClass(o.afterCls);
  427.         }
  428.         if(o.remove === true){
  429.             this.remove();
  430.         }
  431.         Ext.callback(o.callback, o.scope, [this]);
  432.         if(!o.concurrent){
  433.             this.fxQueue.shift();
  434.             this.nextFx();
  435.         }
  436.     },
  437.     getFxEl : function(){         return Ext.get(this.dom);
  438.     },
  439.     fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){
  440.         animType = animType || 'run';
  441.         opt = opt || {};
  442.         var anim = Ext.lib.Anim[animType](
  443.             this.dom, args,
  444.             (opt.duration || defaultDur) || .35,
  445.             (opt.easing || defaultEase) || 'easeOut',
  446.             function(){
  447.                 Ext.callback(cb, this);
  448.             },
  449.             this
  450.         );
  451.         opt.anim = anim;
  452.         return anim;
  453.     }
  454. };
  455. Ext.Fx.resize = Ext.Fx.scale;
  456. Ext.apply(Ext.Element.prototype, Ext.Fx);
  457. Ext.CompositeElement = function(els){
  458.     this.elements = [];
  459.     this.addElements(els);
  460. };
  461. Ext.CompositeElement.prototype = {
  462.     isComposite: true,
  463.     addElements : function(els){
  464.         if(!els) return this;
  465.         if(typeof els == "string"){
  466.             els = Ext.Element.selectorFunction(els);
  467.         }
  468.         var yels = this.elements;
  469.         var index = yels.length-1;
  470.         for(var i = 0, len = els.length; i < len; i++) {
  471.             yels[++index] = Ext.get(els[i]);
  472.         }
  473.         return this;
  474.     },
  475.     fill : function(els){
  476.         this.elements = [];
  477.         this.add(els);
  478.         return this;
  479.     },
  480.     filter : function(selector){
  481.         var els = [];
  482.         this.each(function(el){
  483.             if(el.is(selector)){
  484.                 els[els.length] = el.dom;
  485.             }
  486.         });
  487.         this.fill(els);
  488.         return this;
  489.     },
  490.     invoke : function(fn, args){
  491.         var els = this.elements;
  492.         for(var i = 0, len = els.length; i < len; i++) {
  493.             Ext.Element.prototype[fn].apply(els[i], args);
  494.         }
  495.         return this;
  496.     },
  497.     add : function(els){
  498.         if(typeof els == "string"){
  499.             this.addElements(Ext.Element.selectorFunction(els));
  500.         }else if(els.length !== undefined){
  501.             this.addElements(els);
  502.         }else{
  503.             this.addElements([els]);
  504.         }
  505.         return this;
  506.     },
  507.     each : function(fn, scope){
  508.         var els = this.elements;
  509.         for(var i = 0, len = els.length; i < len; i++){
  510.             if(fn.call(scope || els[i], els[i], this, i) === false) {
  511.                 break;
  512.             }
  513.         }
  514.         return this;
  515.     },
  516.     item : function(index){
  517.         return this.elements[index] || null;
  518.     },
  519.     first : function(){
  520.         return this.item(0);
  521.     },
  522.     last : function(){
  523.         return this.item(this.elements.length-1);
  524.     },
  525.     getCount : function(){
  526.         return this.elements.length;
  527.     },
  528.     contains : function(el){
  529.         return this.indexOf(el) !== -1;
  530.     },
  531.     indexOf : function(el){
  532.         return this.elements.indexOf(Ext.get(el));
  533.     },
  534.     removeElement : function(el, removeDom){
  535.         if(Ext.isArray(el)){
  536.             for(var i = 0, len = el.length; i < len; i++){
  537.                 this.removeElement(el[i]);
  538.             }
  539.             return this;
  540.         }
  541.         var index = typeof el == 'number' ? el : this.indexOf(el);
  542.         if(index !== -1 && this.elements[index]){
  543.             if(removeDom){
  544.                 var d = this.elements[index];
  545.                 if(d.dom){
  546.                     d.remove();
  547.                 }else{
  548.                     Ext.removeNode(d);
  549.                 }
  550.             }
  551.             this.elements.splice(index, 1);
  552.         }
  553.         return this;
  554.     },
  555.     replaceElement : function(el, replacement, domReplace){
  556.         var index = typeof el == 'number' ? el : this.indexOf(el);
  557.         if(index !== -1){
  558.             if(domReplace){
  559.                 this.elements[index].replaceWith(replacement);
  560.             }else{
  561.                 this.elements.splice(index, 1, Ext.get(replacement))
  562.             }
  563.         }
  564.         return this;
  565.     },
  566.     clear : function(){
  567.         this.elements = [];
  568.     }
  569. };
  570. (function(){
  571. Ext.CompositeElement.createCall = function(proto, fnName){
  572.     if(!proto[fnName]){
  573.         proto[fnName] = function(){
  574.             return this.invoke(fnName, arguments);
  575.         };
  576.     }
  577. };
  578. for(var fnName in Ext.Element.prototype){
  579.     if(typeof Ext.Element.prototype[fnName] == "function"){
  580.         Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName);
  581.     }
  582. };
  583. })();
  584. Ext.CompositeElementLite = function(els){
  585.     Ext.CompositeElementLite.superclass.constructor.call(this, els);
  586.     this.el = new Ext.Element.Flyweight();
  587. };
  588. Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {
  589.     addElements : function(els){
  590.         if(els){
  591.             if(Ext.isArray(els)){
  592.                 this.elements = this.elements.concat(els);
  593.             }else{
  594.                 var yels = this.elements;
  595.                 var index = yels.length-1;
  596.                 for(var i = 0, len = els.length; i < len; i++) {
  597.                     yels[++index] = els[i];
  598.                 }
  599.             }
  600.         }
  601.         return this;
  602.     },
  603.     invoke : function(fn, args){
  604.         var els = this.elements;
  605.         var el = this.el;
  606.         for(var i = 0, len = els.length; i < len; i++) {
  607.             el.dom = els[i];
  608.             Ext.Element.prototype[fn].apply(el, args);
  609.         }
  610.         return this;
  611.     },
  612.     item : function(index){
  613.         if(!this.elements[index]){
  614.             return null;
  615.         }
  616.         this.el.dom = this.elements[index];
  617.         return this.el;
  618.     },
  619.     addListener : function(eventName, handler, scope, opt){
  620.         var els = this.elements;
  621.         for(var i = 0, len = els.length; i < len; i++) {
  622.             Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt);
  623.         }
  624.         return this;
  625.     },
  626.     each : function(fn, scope){
  627.         var els = this.elements;
  628.         var el = this.el;
  629.         for(var i = 0, len = els.length; i < len; i++){
  630.             el.dom = els[i];
  631.             if(fn.call(scope || el, el, this, i) === false){
  632.                 break;
  633.             }
  634.         }
  635.         return this;
  636.     },
  637.     indexOf : function(el){
  638.         return this.elements.indexOf(Ext.getDom(el));
  639.     },
  640.     replaceElement : function(el, replacement, domReplace){
  641.         var index = typeof el == 'number' ? el : this.indexOf(el);
  642.         if(index !== -1){
  643.             replacement = Ext.getDom(replacement);
  644.             if(domReplace){
  645.                 var d = this.elements[index];
  646.                 d.parentNode.insertBefore(replacement, d);
  647.                 Ext.removeNode(d);
  648.             }
  649.             this.elements.splice(index, 1, replacement);
  650.         }
  651.         return this;
  652.     }
  653. });
  654. Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
  655. if(Ext.DomQuery){
  656.     Ext.Element.selectorFunction = Ext.DomQuery.select;
  657. }
  658. Ext.Element.select = function(selector, unique, root){
  659.     var els;
  660.     if(typeof selector == "string"){
  661.         els = Ext.Element.selectorFunction(selector, root);
  662.     }else if(selector.length !== undefined){
  663.         els = selector;
  664.     }else{
  665.         throw "Invalid selector";
  666.     }
  667.     if(unique === true){
  668.         return new Ext.CompositeElement(els);
  669.     }else{
  670.         return new Ext.CompositeElementLite(els);
  671.     }
  672. };
  673. Ext.select = Ext.Element.select;
  674. Ext.data.Connection = function(config){
  675.     Ext.apply(this, config);
  676.     this.addEvents(
  677.         "beforerequest",
  678.         "requestcomplete",
  679.         "requestexception"
  680.     );
  681.     Ext.data.Connection.superclass.constructor.call(this);
  682. };
  683. Ext.extend(Ext.data.Connection, Ext.util.Observable, {
  684.     timeout : 30000,
  685.     autoAbort:false,
  686.     disableCaching: true,
  687.     request : function(o){
  688.         if(this.fireEvent("beforerequest", this, o) !== false){
  689.             var p = o.params;
  690.             if(typeof p == "function"){
  691.                 p = p.call(o.scope||window, o);
  692.             }
  693.             if(typeof p == "object"){
  694.                 p = Ext.urlEncode(p);
  695.             }
  696.             if(this.extraParams){
  697.                 var extras = Ext.urlEncode(this.extraParams);
  698.                 p = p ? (p + '&' + extras) : extras;
  699.             }
  700.             var url = o.url || this.url;
  701.             if(typeof url == 'function'){
  702.                 url = url.call(o.scope||window, o);
  703.             }
  704.             if(o.form){
  705.                 var form = Ext.getDom(o.form);
  706.                 url = url || form.action;
  707.                 var enctype = form.getAttribute("enctype");
  708.                 if(o.isUpload || (enctype && enctype.toLowerCase() == 'multipart/form-data')){
  709.                     return this.doFormUpload(o, p, url);
  710.                 }
  711.                 var f = Ext.lib.Ajax.serializeForm(form);
  712.                 p = p ? (p + '&' + f) : f;
  713.             }
  714.             var hs = o.headers;
  715.             if(this.defaultHeaders){
  716.                 hs = Ext.apply(hs || {}, this.defaultHeaders);
  717.                 if(!o.headers){
  718.                     o.headers = hs;
  719.                 }
  720.             }
  721.             var cb = {
  722.                 success: this.handleResponse,
  723.                 failure: this.handleFailure,
  724.                 scope: this,
  725.                 argument: {options: o},
  726.                 timeout : o.timeout || this.timeout
  727.             };
  728.             var method = o.method||this.method||(p ? "POST" : "GET");
  729.             if(method == 'GET' && (this.disableCaching && o.disableCaching !== false) || o.disableCaching === true){
  730.                 url += (url.indexOf('?') != -1 ? '&' : '?') + '_dc=' + (new Date().getTime());
  731.             }
  732.             if(typeof o.autoAbort == 'boolean'){
  733.                 if(o.autoAbort){
  734.                     this.abort();
  735.                 }
  736.             }else if(this.autoAbort !== false){
  737.                 this.abort();
  738.             }
  739.             if((method == 'GET' && p) || o.xmlData || o.jsonData){
  740.                 url += (url.indexOf('?') != -1 ? '&' : '?') + p;
  741.                 p = '';
  742.             }
  743.             this.transId = Ext.lib.Ajax.request(method, url, cb, p, o);
  744.             return this.transId;
  745.         }else{
  746.             Ext.callback(o.callback, o.scope, [o, null, null]);
  747.             return null;
  748.         }
  749.     },
  750.     isLoading : function(transId){
  751.         if(transId){
  752.             return Ext.lib.Ajax.isCallInProgress(transId);
  753.         }else{
  754.             return this.transId ? true : false;
  755.         }
  756.     },
  757.     abort : function(transId){
  758.         if(transId || this.isLoading()){
  759.             Ext.lib.Ajax.abort(transId || this.transId);
  760.         }
  761.     },
  762.     handleResponse : function(response){
  763.         this.transId = false;
  764.         var options = response.argument.options;
  765.         response.argument = options ? options.argument : null;
  766.         this.fireEvent("requestcomplete", this, response, options);
  767.         Ext.callback(options.success, options.scope, [response, options]);
  768.         Ext.callback(options.callback, options.scope, [options, true, response]);
  769.     },
  770.     handleFailure : function(response, e){
  771.         this.transId = false;
  772.         var options = response.argument.options;
  773.         response.argument = options ? options.argument : null;
  774.         this.fireEvent("requestexception", this, response, options, e);
  775.         Ext.callback(options.failure, options.scope, [response, options]);
  776.         Ext.callback(options.callback, options.scope, [options, false, response]);
  777.     },
  778.     doFormUpload : function(o, ps, url){
  779.         var id = Ext.id();
  780.         var frame = document.createElement('iframe');
  781.         frame.id = id;
  782.         frame.name = id;
  783.         frame.className = 'x-hidden';
  784.         if(Ext.isIE){
  785.             frame.src = Ext.SSL_SECURE_URL;
  786.         }
  787.         document.body.appendChild(frame);
  788.         if(Ext.isIE){
  789.            document.frames[id].name = id;
  790.         }
  791.         var form = Ext.getDom(o.form);
  792.         form.target = id;
  793.         form.method = 'POST';
  794.         form.enctype = form.encoding = 'multipart/form-data';
  795.         if(url){
  796.             form.action = url;
  797.         }
  798.         var hiddens, hd;
  799.         if(ps){
  800.             hiddens = [];
  801.             ps = Ext.urlDecode(ps, false);
  802.             for(var k in ps){
  803.                 if(ps.hasOwnProperty(k)){
  804.                     hd = document.createElement('input');
  805.                     hd.type = 'hidden';
  806.                     hd.name = k;
  807.                     hd.value = ps[k];
  808.                     form.appendChild(hd);
  809.                     hiddens.push(hd);
  810.                 }
  811.             }
  812.         }
  813.         function cb(){
  814.             var r = {
  815.                 responseText : '',
  816.                 responseXML : null
  817.             };
  818.             r.argument = o ? o.argument : null;
  819.             try {
  820.                 var doc;
  821.                 if(Ext.isIE){
  822.                     doc = frame.contentWindow.document;
  823.                 }else {
  824.                     doc = (frame.contentDocument || window.frames[id].document);
  825.                 }
  826.                 if(doc && doc.body){
  827.                     r.responseText = doc.body.innerHTML;
  828.                 }
  829.                 if(doc && doc.XMLDocument){
  830.                     r.responseXML = doc.XMLDocument;
  831.                 }else {
  832.                     r.responseXML = doc;
  833.                 }
  834.             }
  835.             catch(e) {
  836.             }
  837.             Ext.EventManager.removeListener(frame, 'load', cb, this);
  838.             this.fireEvent("requestcomplete", this, r, o);
  839.             Ext.callback(o.success, o.scope, [r, o]);
  840.             Ext.callback(o.callback, o.scope, [o, true, r]);
  841.             setTimeout(function(){Ext.removeNode(frame);}, 100);
  842.         }
  843.         Ext.EventManager.on(frame, 'load', cb, this);
  844.         form.submit();
  845.         if(hiddens){
  846.             for(var i = 0, len = hiddens.length; i < len; i++){
  847.                 Ext.removeNode(hiddens[i]);
  848.             }
  849.         }
  850.     }
  851. });
  852. Ext.Ajax = new Ext.data.Connection({
  853.     autoAbort : false,
  854.     serializeForm : function(form){
  855.         return Ext.lib.Ajax.serializeForm(form);
  856.     }
  857. });
  858. Ext.Updater = function(el, forceNew){
  859.     el = Ext.get(el);
  860.     if(!forceNew && el.updateManager){
  861.         return el.updateManager;
  862.     }
  863.     this.el = el;
  864.     this.defaultUrl = null;
  865.     this.addEvents(
  866.         "beforeupdate",
  867.         "update",
  868.         "failure"
  869.     );
  870.     var d = Ext.Updater.defaults;
  871.     this.sslBlankUrl = d.sslBlankUrl;
  872.     this.disableCaching = d.disableCaching;
  873.     this.indicatorText = d.indicatorText;
  874.     this.showLoadIndicator = d.showLoadIndicator;
  875.     this.timeout = d.timeout;
  876.     this.loadScripts = d.loadScripts;
  877.     this.transaction = null;
  878.     this.autoRefreshProcId = null;
  879.     this.refreshDelegate = this.refresh.createDelegate(this);
  880.     this.updateDelegate = this.update.createDelegate(this);
  881.     this.formUpdateDelegate = this.formUpdate.createDelegate(this);
  882.     if(!this.renderer){
  883.     this.renderer = new Ext.Updater.BasicRenderer();
  884.     }
  885.     Ext.Updater.superclass.constructor.call(this);
  886. };
  887. Ext.extend(Ext.Updater, Ext.util.Observable, {
  888.     getEl : function(){
  889.         return this.el;
  890.     },
  891.     update : function(url, params, callback, discardUrl){
  892.         if(this.fireEvent("beforeupdate", this.el, url, params) !== false){
  893.             var method = this.method, cfg, callerScope;
  894.             if(typeof url == "object"){
  895.                 cfg = url;
  896.                 url = cfg.url;
  897.                 params = params || cfg.params;
  898.                 callback = callback || cfg.callback;
  899.                 discardUrl = discardUrl || cfg.discardUrl;
  900.                 callerScope = cfg.scope;
  901.                 if(typeof cfg.method != "undefined"){method = cfg.method;};
  902.                 if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;};
  903.                 if(typeof cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};
  904.                 if(typeof cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;};
  905.                 if(typeof cfg.timeout != "undefined"){this.timeout = cfg.timeout;};
  906.             }
  907.             this.showLoading();
  908.             if(!discardUrl){
  909.                 this.defaultUrl = url;
  910.             }
  911.             if(typeof url == "function"){
  912.                 url = url.call(this);
  913.             }
  914.             method = method || (params ? "POST" : "GET");
  915.             if(method == "GET"){
  916.                 url = this.prepareUrl(url);
  917.             }
  918.             var o = Ext.apply(cfg ||{}, {
  919.                 url : url,
  920.                 params: (typeof params == "function" && callerScope) ? params.createDelegate(callerScope) : params,
  921.                 success: this.processSuccess,
  922.                 failure: this.processFailure,
  923.                 scope: this,
  924.                 callback: undefined,
  925.                 timeout: (this.timeout*1000),
  926.                 argument: {
  927.                     "options": cfg,
  928.                     "url": url,
  929.                     "form": null,
  930.                     "callback": callback,
  931.                     "scope": callerScope || window,
  932.                     "params": params
  933.                 }
  934.             });
  935.             this.transaction = Ext.Ajax.request(o);
  936.         }
  937.     },
  938.     formUpdate : function(form, url, reset, callback){
  939.         if(this.fireEvent("beforeupdate", this.el, form, url) !== false){
  940.             if(typeof url == "function"){
  941.                 url = url.call(this);
  942.             }
  943.             form = Ext.getDom(form)
  944.             this.transaction = Ext.Ajax.request({
  945.                 form: form,
  946.                 url:url,
  947.                 success: this.processSuccess,
  948.                 failure: this.processFailure,
  949.                 scope: this,
  950.                 timeout: (this.timeout*1000),
  951.                 argument: {
  952.                     "url": url,
  953.                     "form": form,
  954.                     "callback": callback,
  955.                     "reset": reset
  956.                 }
  957.             });
  958.             this.showLoading.defer(1, this);
  959.         }
  960.     },
  961.     refresh : function(callback){
  962.         if(this.defaultUrl == null){
  963.             return;
  964.         }
  965.         this.update(this.defaultUrl, null, callback, true);
  966.     },
  967.     startAutoRefresh : function(interval, url, params, callback, refreshNow){
  968.         if(refreshNow){
  969.             this.update(url || this.defaultUrl, params, callback, true);
  970.         }
  971.         if(this.autoRefreshProcId){
  972.             clearInterval(this.autoRefreshProcId);
  973.         }
  974.         this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000);
  975.     },
  976.      stopAutoRefresh : function(){
  977.         if(this.autoRefreshProcId){
  978.             clearInterval(this.autoRefreshProcId);
  979.             delete this.autoRefreshProcId;
  980.         }
  981.     },
  982.     isAutoRefreshing : function(){
  983.        return this.autoRefreshProcId ? true : false;
  984.     },
  985.     showLoading : function(){
  986.         if(this.showLoadIndicator){
  987.             this.el.update(this.indicatorText);
  988.         }
  989.     },
  990.     prepareUrl : function(url){
  991.         if(this.disableCaching){
  992.             var append = "_dc=" + (new Date().getTime());
  993.             if(url.indexOf("?") !== -1){
  994.                 url += "&" + append;
  995.             }else{
  996.                 url += "?" + append;
  997.             }
  998.         }
  999.         return url;
  1000.     },
  1001.     processSuccess : function(response){
  1002.         this.transaction = null;
  1003.         if(response.argument.form && response.argument.reset){
  1004.             try{
  1005.                 response.argument.form.reset();
  1006.             }catch(e){}
  1007.         }
  1008.         if(this.loadScripts){
  1009.             this.renderer.render(this.el, response, this,
  1010.                 this.updateComplete.createDelegate(this, [response]));
  1011.         }else{
  1012.             this.renderer.render(this.el, response, this);
  1013.             this.updateComplete(response);
  1014.         }
  1015.     },
  1016.     updateComplete : function(response){
  1017.         this.fireEvent("update", this.el, response);
  1018.         if(typeof response.argument.callback == "function"){
  1019.             response.argument.callback.call(response.argument.scope, this.el, true, response, response.argument.options);
  1020.         }
  1021.     },
  1022.     processFailure : function(response){
  1023.         this.transaction = null;
  1024.         this.fireEvent("failure", this.el, response);
  1025.         if(typeof response.argument.callback == "function"){
  1026.             response.argument.callback.call(response.argument.scope, this.el, false, response, response.argument.options);
  1027.         }
  1028.     },
  1029.     setRenderer : function(renderer){
  1030.         this.renderer = renderer;
  1031.     },
  1032.     getRenderer : function(){
  1033.        return this.renderer;
  1034.     },
  1035.     setDefaultUrl : function(defaultUrl){
  1036.         this.defaultUrl = defaultUrl;
  1037.     },
  1038.     abort : function(){
  1039.         if(this.transaction){
  1040.             Ext.Ajax.abort(this.transaction);
  1041.         }
  1042.     },
  1043.     isUpdating : function(){
  1044.         if(this.transaction){
  1045.             return Ext.Ajax.isLoading(this.transaction);
  1046.         }
  1047.         return false;
  1048.     }
  1049. });
  1050.    Ext.Updater.defaults = {
  1051.          timeout : 30,
  1052.         loadScripts : false,
  1053.         sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"),
  1054.         disableCaching : false,
  1055.         showLoadIndicator : true,
  1056.         indicatorText : '<div class="loading-indicator">Loading...</div>'
  1057.    };
  1058. Ext.Updater.updateElement = function(el, url, params, options){
  1059.     var um = Ext.get(el).getUpdater();
  1060.     Ext.apply(um, options);
  1061.     um.update(url, params, options ? options.callback : null);
  1062. };
  1063. Ext.Updater.update = Ext.Updater.updateElement;
  1064. Ext.Updater.BasicRenderer = function(){};
  1065. Ext.Updater.BasicRenderer.prototype = {
  1066.      render : function(el, response, updateManager, callback){
  1067.         el.update(response.responseText, updateManager.loadScripts, callback);
  1068.     }
  1069. };
  1070. Ext.UpdateManager = Ext.Updater;
  1071. Date.parseFunctions = {count:0};
  1072. Date.parseRegexes = [];
  1073. Date.formatFunctions = {count:0};
  1074. Date.prototype.dateFormat = function(format) {
  1075.     if (Date.formatFunctions[format] == null) {
  1076.         Date.createNewFormat(format);
  1077.     }
  1078.     var func = Date.formatFunctions[format];
  1079.     return this[func]();
  1080. };
  1081. Date.prototype.format = Date.prototype.dateFormat;
  1082. Date.createNewFormat = function(format) {
  1083.     var funcName = "format" + Date.formatFunctions.count++;
  1084.     Date.formatFunctions[format] = funcName;
  1085.     var code = "Date.prototype." + funcName + " = function(){return ";
  1086.     var special = false;
  1087.     var ch = '';
  1088.     for (var i = 0; i < format.length; ++i) {
  1089.         ch = format.charAt(i);
  1090.         if (!special && ch == "\") {
  1091.             special = true;
  1092.         }
  1093.         else if (special) {
  1094.             special = false;
  1095.             code += "'" + String.escape(ch) + "' + ";
  1096.         }
  1097.         else {
  1098.             code += Date.getFormatCode(ch);
  1099.         }
  1100.     }
  1101.     eval(code.substring(0, code.length - 3) + ";}");
  1102. };
  1103. Date.getFormatCode = function(character) {
  1104.     switch (character) {
  1105.     case "d":
  1106.         return "String.leftPad(this.getDate(), 2, '0') + ";
  1107.     case "D":
  1108.         return "Date.getShortDayName(this.getDay()) + ";     case "j":
  1109.         return "this.getDate() + ";
  1110.     case "l":
  1111.         return "Date.dayNames[this.getDay()] + ";
  1112.     case "N":
  1113.         return "(this.getDay() ? this.getDay() : 7) + ";
  1114.     case "S":
  1115.         return "this.getSuffix() + ";
  1116.     case "w":
  1117.         return "this.getDay() + ";
  1118.     case "z":
  1119.         return "this.getDayOfYear() + ";
  1120.     case "W":
  1121.         return "String.leftPad(this.getWeekOfYear(), 2, '0') + ";
  1122.     case "F":
  1123.         return "Date.monthNames[this.getMonth()] + ";
  1124.     case "m":
  1125.         return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
  1126.     case "M":
  1127.         return "Date.getShortMonthName(this.getMonth()) + ";     case "n":
  1128.         return "(this.getMonth() + 1) + ";
  1129.     case "t":
  1130.         return "this.getDaysInMonth() + ";
  1131.     case "L":
  1132.         return "(this.isLeapYear() ? 1 : 0) + ";
  1133.     case "o":
  1134.         return "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0))) + ";
  1135.     case "Y":
  1136.         return "this.getFullYear() + ";
  1137.     case "y":
  1138.         return "('' + this.getFullYear()).substring(2, 4) + ";
  1139.     case "a":
  1140.         return "(this.getHours() < 12 ? 'am' : 'pm') + ";
  1141.     case "A":
  1142.         return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
  1143.     case "g":
  1144.         return "((this.getHours() % 12) ? this.getHours() % 12 : 12) + ";
  1145.     case "G":
  1146.         return "this.getHours() + ";
  1147.     case "h":
  1148.         return "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0') + ";
  1149.     case "H":
  1150.         return "String.leftPad(this.getHours(), 2, '0') + ";
  1151.     case "i":
  1152.         return "String.leftPad(this.getMinutes(), 2, '0') + ";
  1153.     case "s":
  1154.         return "String.leftPad(this.getSeconds(), 2, '0') + ";
  1155.     case "u":
  1156.         return "String.leftPad(this.getMilliseconds(), 3, '0') + ";
  1157.     case "O":
  1158.         return "this.getGMTOffset() + ";
  1159.     case "P":
  1160.         return "this.getGMTOffset(true) + ";
  1161.     case "T":
  1162.         return "this.getTimezone() + ";
  1163.     case "Z":
  1164.         return "(this.getTimezoneOffset() * -60) + ";
  1165.     case "c":
  1166.         for (var df = Date.getFormatCode, c = "Y-m-dTH:i:sP", code = "", i = 0, l = c.length; i < l; ++i) {
  1167.           var e = c.charAt(i);
  1168.           code += e == "T" ? "'T' + " : df(e);         }
  1169.         return code;
  1170.     case "U":
  1171.         return "Math.round(this.getTime() / 1000) + ";
  1172.     default:
  1173.         return "'" + String.escape(character) + "' + ";
  1174.     }
  1175. };
  1176. Date.parseDate = function(input, format) {
  1177.     if (Date.parseFunctions[format] == null) {
  1178.         Date.createParser(format);
  1179.     }
  1180.     var func = Date.parseFunctions[format];
  1181.     return Date[func](input);
  1182. };
  1183. Date.createParser = function(format) {
  1184.     var funcName = "parse" + Date.parseFunctions.count++;
  1185.     var regexNum = Date.parseRegexes.length;
  1186.     var currentGroup = 1;
  1187.     Date.parseFunctions[format] = funcName;
  1188.     var code = "Date." + funcName + " = function(input){n"
  1189.         + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1, ms = -1, o, z, u, v;n"
  1190.         + "input = String(input);var d = new Date();n"
  1191.         + "y = d.getFullYear();n"
  1192.         + "m = d.getMonth();n"
  1193.         + "d = d.getDate();n"
  1194.         + "var results = input.match(Date.parseRegexes[" + regexNum + "]);n"
  1195.         + "if (results && results.length > 0) {";
  1196.     var regex = "";
  1197.     var special = false;
  1198.     var ch = '';
  1199.     for (var i = 0; i < format.length; ++i) {
  1200.         ch = format.charAt(i);
  1201.         if (!special && ch == "\") {
  1202.             special = true;
  1203.         }
  1204.         else if (special) {
  1205.             special = false;
  1206.             regex += String.escape(ch);
  1207.         }
  1208.         else {
  1209.             var obj = Date.formatCodeToRegex(ch, currentGroup);
  1210.             currentGroup += obj.g;
  1211.             regex += obj.s;
  1212.             if (obj.g && obj.c) {
  1213.                 code += obj.c;
  1214.             }
  1215.         }
  1216.     }
  1217.     code += "if (u)n"
  1218.         + "{v = new Date(u * 1000);}"         + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0)n"
  1219.         + "{v = new Date(y, m, d, h, i, s, ms);}n"
  1220.         + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)n"
  1221.         + "{v = new Date(y, m, d, h, i, s);}n"
  1222.         + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)n"
  1223.         + "{v = new Date(y, m, d, h, i);}n"
  1224.         + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0)n"
  1225.         + "{v = new Date(y, m, d, h);}n"
  1226.         + "else if (y >= 0 && m >= 0 && d > 0)n"
  1227.         + "{v = new Date(y, m, d);}n"
  1228.         + "else if (y >= 0 && m >= 0)n"
  1229.         + "{v = new Date(y, m);}n"
  1230.         + "else if (y >= 0)n"
  1231.         + "{v = new Date(y);}n"
  1232.         + "}return (v && (z || o))?n"         + "    (z ? v.add(Date.SECOND, (v.getTimezoneOffset() * 60) + (z*1)) :n"         + "        v.add(Date.HOUR, (v.getGMTOffset() / 100) + (o / -100))) : vn"         + ";}";
  1233.     Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$", "i");
  1234.     eval(code);
  1235. };
  1236. Date.formatCodeToRegex = function(character, currentGroup) {
  1237.     switch (character) {
  1238.     case "d":
  1239.         return {g:1,
  1240.             c:"d = parseInt(results[" + currentGroup + "], 10);n",
  1241.             s:"(\d{2})"};     case "D":
  1242.         for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i);         return {g:0,
  1243.             c:null,
  1244.             s:"(?:" + a.join("|") +")"};
  1245.     case "j":
  1246.         return {g:1,
  1247.             c:"d = parseInt(results[" + currentGroup + "], 10);n",
  1248.             s:"(\d{1,2})"};     case "l":
  1249.         return {g:0,
  1250.             c:null,
  1251.             s:"(?:" + Date.dayNames.join("|") + ")"};
  1252.     case "N":
  1253.         return {g:0,
  1254.             c:null,
  1255.             s:"[1-7]"};     case "S":
  1256.         return {g:0,
  1257.             c:null,
  1258.             s:"(?:st|nd|rd|th)"};
  1259.     case "w":
  1260.         return {g:0,
  1261.             c:null,
  1262.             s:"[0-6]"};     case "z":
  1263.         return {g:0,
  1264.             c:null,
  1265.             s:"(?:\d{1,3}"};     case "W":
  1266.         return {g:0,
  1267.             c:null,
  1268.             s:"(?:\d{2})"};     case "F":
  1269.         return {g:1,
  1270.             c:"m = parseInt(Date.getMonthNumber(results[" + currentGroup + "]), 10);n",             s:"(" + Date.monthNames.join("|") + ")"};
  1271.     case "m":
  1272.         return {g:1,
  1273.             c:"m = parseInt(results[" + currentGroup + "], 10) - 1;n",
  1274.             s:"(\d{2})"};     case "M":
  1275.         for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i);         return {g:1,
  1276.             c:"m = parseInt(Date.getMonthNumber(results[" + currentGroup + "]), 10);n",             s:"(" + a.join("|") + ")"};
  1277.     case "n":
  1278.         return {g:1,
  1279.             c:"m = parseInt(results[" + currentGroup + "], 10) - 1;n",
  1280.             s:"(\d{1,2})"};     case "t":
  1281.         return {g:0,
  1282.             c:null,
  1283.             s:"(?:\d{2})"};     case "L":
  1284.         return {g:0,
  1285.             c:null,
  1286.             s:"(?:1|0)"};
  1287.     case "o":
  1288.     case "Y":
  1289.         return {g:1,
  1290.             c:"y = parseInt(results[" + currentGroup + "], 10);n",
  1291.             s:"(\d{4})"};     case "y":
  1292.         return {g:1,
  1293.             c:"var ty = parseInt(results[" + currentGroup + "], 10);n"
  1294.                 + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;n",
  1295.             s:"(\d{1,2})"};     case "a":
  1296.         return {g:1,
  1297.             c:"if (results[" + currentGroup + "] == 'am') {n"
  1298.                 + "if (h == 12) { h = 0; }n"
  1299.                 + "} else { if (h < 12) { h += 12; }}",
  1300.             s:"(am|pm)"};
  1301.     case "A":
  1302.         return {g:1,
  1303.             c:"if (results[" + currentGroup + "] == 'AM') {n"
  1304.                 + "if (h == 12) { h = 0; }n"
  1305.                 + "} else { if (h < 12) { h += 12; }}",
  1306.             s:"(AM|PM)"};
  1307.     case "g":
  1308.     case "G":
  1309.         return {g:1,
  1310.             c:"h = parseInt(results[" + currentGroup + "], 10);n",
  1311.             s:"(\d{1,2})"};     case "h":
  1312.     case "H":
  1313.         return {g:1,
  1314.             c:"h = parseInt(results[" + currentGroup + "], 10);n",
  1315.             s:"(\d{2})"};     case "i":
  1316.         return {g:1,
  1317.             c:"i = parseInt(results[" + currentGroup + "], 10);n",
  1318.             s:"(\d{2})"};     case "s":
  1319.         return {g:1,
  1320.             c:"s = parseInt(results[" + currentGroup + "], 10);n",
  1321.             s:"(\d{2})"};     case "u":
  1322.         return {g:1,
  1323.             c:"ms = parseInt(results[" + currentGroup + "], 10);n",
  1324.             s:"(\d{3})"};     case "O":
  1325.         return {g:1,
  1326.             c:[
  1327.                 "o = results[", currentGroup, "];n",
  1328.                 "var sn = o.substring(0,1);n",                 "var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);n",                 "var mn = o.substring(3,5) % 60;n",                 "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?n",                 "    (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;n"
  1329.             ].join(""),
  1330.             s: "([+-]\d{4})"};     case "P":
  1331.         return {g:1,
  1332.             c:[
  1333.                 "o = results[", currentGroup, "];n",
  1334.                 "var sn = o.substring(0,1);n",                 "var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);n",                 "var mn = o.substring(4,6) % 60;n",                 "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?n",                 "    (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;n"
  1335.             ].join(""),
  1336.             s: "([+-]\d{2}:\d{2})"};     case "T":
  1337.         return {g:0,
  1338.             c:null,
  1339.             s:"[A-Z]{1,4}"};     case "Z":
  1340.         return {g:1,
  1341.             c:"z = results[" + currentGroup + "] * 1;n"                   + "z = (-43200 <= z && z <= 50400)? z : null;n",
  1342.             s:"([+-]?\d{1,5})"};     case "c":
  1343.         var df = Date.formatCodeToRegex, calc = [];
  1344.         var arr = [df("Y", 1), df("m", 2), df("d", 3), df("h", 4), df("i", 5), df("s", 6), df("P", 7)];
  1345.         for (var i = 0, l = arr.length; i < l; ++i) {
  1346.           calc.push(arr[i].c);
  1347.         }
  1348.         return {g:1,
  1349.             c:calc.join(""),
  1350.             s:arr[0].s + "-" + arr[1].s + "-" + arr[2].s + "T" + arr[3].s + ":" + arr[4].s + ":" + arr[5].s + arr[6].s};
  1351.     case "U":
  1352.         return {g:1,
  1353.             c:"u = parseInt(results[" + currentGroup + "], 10);n",
  1354.             s:"(-?\d+)"};     default:
  1355.         return {g:0,
  1356.             c:null,
  1357.             s:Ext.escapeRe(character)};
  1358.     }
  1359. };
  1360. Date.prototype.getTimezone = function() {
  1361.                                                     return this.toString().replace(/^.* (?:((.*))|([A-Z]{1,4})(?:[-+][0-9]{4})?(?: -?d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
  1362. };
  1363. Date.prototype.getGMTOffset = function(colon) {
  1364.     return (this.getTimezoneOffset() > 0 ? "-" : "+")
  1365.         + String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0")
  1366.         + (colon ? ":" : "")
  1367.         + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
  1368. };
  1369. Date.prototype.getDayOfYear = function() {
  1370.     var num = 0;
  1371.     Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
  1372.     for (var i = 0; i < this.getMonth(); ++i) {
  1373.         num += Date.daysInMonth[i];
  1374.     }
  1375.     return num + this.getDate() - 1;
  1376. };
  1377. Date.prototype.getWeekOfYear = function() {
  1378.         var ms1d = 864e5;     var ms7d = 7 * ms1d;     var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d;     var AWN = Math.floor(DC3 / 7);     var Wyr = new Date(AWN * ms7d).getUTCFullYear();
  1379.     return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
  1380. };
  1381. Date.prototype.isLeapYear = function() {
  1382.     var year = this.getFullYear();
  1383.     return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
  1384. };
  1385. Date.prototype.getFirstDayOfMonth = function() {
  1386.     var day = (this.getDay() - (this.getDate() - 1)) % 7;
  1387.     return (day < 0) ? (day + 7) : day;
  1388. };
  1389. Date.prototype.getLastDayOfMonth = function() {
  1390.     var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
  1391.     return (day < 0) ? (day + 7) : day;
  1392. };
  1393. Date.prototype.getFirstDateOfMonth = function() {
  1394.     return new Date(this.getFullYear(), this.getMonth(), 1);
  1395. };
  1396. Date.prototype.getLastDateOfMonth = function() {
  1397.     return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());
  1398. };
  1399. Date.prototype.getDaysInMonth = function() {
  1400.     Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
  1401.     return Date.daysInMonth[this.getMonth()];
  1402. };
  1403. Date.prototype.getSuffix = function() {
  1404.     switch (this.getDate()) {
  1405.         case 1:
  1406.         case 21:
  1407.         case 31:
  1408.             return "st";
  1409.         case 2:
  1410.         case 22:
  1411.             return "nd";
  1412.         case 3:
  1413.         case 23:
  1414.             return "rd";
  1415.         default:
  1416.             return "th";
  1417.     }
  1418. };
  1419. Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
  1420. Date.monthNames =
  1421.    ["January",
  1422.     "February",
  1423.     "March",
  1424.     "April",
  1425.     "May",
  1426.     "June",
  1427.     "July",
  1428.     "August",
  1429.     "September",
  1430.     "October",
  1431.     "November",
  1432.     "December"];
  1433. Date.getShortMonthName = function(month) {
  1434.     return Date.monthNames[month].substring(0, 3);
  1435. }
  1436. Date.dayNames =
  1437.    ["Sunday",
  1438.     "Monday",
  1439.     "Tuesday",
  1440.     "Wednesday",
  1441.     "Thursday",
  1442.     "Friday",
  1443.     "Saturday"];
  1444. Date.getShortDayName = function(day) {
  1445.     return Date.dayNames[day].substring(0, 3);
  1446. }
  1447. Date.y2kYear = 50;
  1448. Date.monthNumbers = {
  1449.     Jan:0,
  1450.     Feb:1,
  1451.     Mar:2,
  1452.     Apr:3,
  1453.     May:4,
  1454.     Jun:5,
  1455.     Jul:6,
  1456.     Aug:7,
  1457.     Sep:8,
  1458.     Oct:9,
  1459.     Nov:10,
  1460.     Dec:11};
  1461. Date.getMonthNumber = function(name) {
  1462.         return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
  1463. }
  1464. Date.prototype.clone = function() {
  1465.   return new Date(this.getTime());
  1466. };
  1467. Date.prototype.clearTime = function(clone){
  1468.     if(clone){
  1469.         return this.clone().clearTime();
  1470.     }
  1471.     this.setHours(0);
  1472.     this.setMinutes(0);
  1473.     this.setSeconds(0);
  1474.     this.setMilliseconds(0);
  1475.     return this;
  1476. };
  1477. if(Ext.isSafari){
  1478.     Date.brokenSetMonth = Date.prototype.setMonth;
  1479.   Date.prototype.setMonth = function(num){
  1480.     if(num <= -1){
  1481.       var n = Math.ceil(-num);
  1482.       var back_year = Math.ceil(n/12);
  1483.       var month = (n % 12) ? 12 - n % 12 : 0 ;
  1484.       this.setFullYear(this.getFullYear() - back_year);
  1485.       return Date.brokenSetMonth.call(this, month);
  1486.     } else {
  1487.       return Date.brokenSetMonth.apply(this, arguments);
  1488.     }
  1489.   };
  1490. }
  1491. Date.MILLI = "ms";
  1492. Date.SECOND = "s";
  1493. Date.MINUTE = "mi";
  1494. Date.HOUR = "h";
  1495. Date.DAY = "d";
  1496. Date.MONTH = "mo";
  1497. Date.YEAR = "y";
  1498. Date.prototype.add = function(interval, value){
  1499.   var d = this.clone();
  1500.   if (!interval || value === 0) return d;
  1501.   switch(interval.toLowerCase()){
  1502.     case Date.MILLI:
  1503.       d.setMilliseconds(this.getMilliseconds() + value);
  1504.       break;
  1505.     case Date.SECOND:
  1506.       d.setSeconds(this.getSeconds() + value);
  1507.       break;
  1508.     case Date.MINUTE:
  1509.       d.setMinutes(this.getMinutes() + value);
  1510.       break;
  1511.     case Date.HOUR:
  1512.       d.setHours(this.getHours() + value);
  1513.       break;
  1514.     case Date.DAY:
  1515.       d.setDate(this.getDate() + value);
  1516.       break;
  1517.     case Date.MONTH:
  1518.       var day = this.getDate();
  1519.       if(day > 28){
  1520.           day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate());
  1521.       }
  1522.       d.setDate(day);
  1523.       d.setMonth(this.getMonth() + value);
  1524.       break;
  1525.     case Date.YEAR:
  1526.       d.setFullYear(this.getFullYear() + value);
  1527.       break;
  1528.   }
  1529.   return d;
  1530. };
  1531. Date.prototype.between = function(start, end){
  1532.     var t = this.getTime();
  1533.     return start.getTime() <= t && t <= end.getTime();
  1534. }
  1535. Ext.util.DelayedTask = function(fn, scope, args){
  1536.     var id = null, d, t;
  1537.     var call = function(){
  1538.         var now = new Date().getTime();
  1539.         if(now - t >= d){
  1540.             clearInterval(id);
  1541.             id = null;
  1542.             fn.apply(scope, args || []);
  1543.         }
  1544.     };
  1545.     this.delay = function(delay, newFn, newScope, newArgs){
  1546.         if(id && delay != d){
  1547.             this.cancel();
  1548.         }
  1549.         d = delay;
  1550.         t = new Date().getTime();
  1551.         fn = newFn || fn;
  1552.         scope = newScope || scope;
  1553.         args = newArgs || args;
  1554.         if(!id){
  1555.             id = setInterval(call, d);
  1556.         }
  1557.     };
  1558.     this.cancel = function(){
  1559.         if(id){
  1560.             clearInterval(id);
  1561.             id = null;
  1562.         }
  1563.     };
  1564. };
  1565. Ext.util.TaskRunner = function(interval){
  1566.     interval = interval || 10;
  1567.     var tasks = [], removeQueue = [];
  1568.     var id = 0;
  1569.     var running = false;
  1570.         var stopThread = function(){
  1571.         running = false;
  1572.         clearInterval(id);
  1573.         id = 0;
  1574.     };
  1575.         var startThread = function(){
  1576.         if(!running){
  1577.             running = true;
  1578.             id = setInterval(runTasks, interval);
  1579.         }
  1580.     };
  1581.         var removeTask = function(t){
  1582.         removeQueue.push(t);
  1583.         if(t.onStop){
  1584.             t.onStop.apply(t.scope || t);
  1585.         }
  1586.     };
  1587.         var runTasks = function(){
  1588.         if(removeQueue.length > 0){
  1589.             for(var i = 0, len = removeQueue.length; i < len; i++){
  1590.                 tasks.remove(removeQueue[i]);
  1591.             }
  1592.             removeQueue = [];
  1593.             if(tasks.length < 1){
  1594.                 stopThread();
  1595.                 return;
  1596.             }
  1597.         }
  1598.         var now = new Date().getTime();
  1599.         for(var i = 0, len = tasks.length; i < len; ++i){
  1600.             var t = tasks[i];
  1601.             var itime = now - t.taskRunTime;
  1602.             if(t.interval <= itime){
  1603.                 var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
  1604.                 t.taskRunTime = now;
  1605.                 if(rt === false || t.taskRunCount === t.repeat){
  1606.                     removeTask(t);
  1607.                     return;
  1608.                 }
  1609.             }
  1610.             if(t.duration && t.duration <= (now - t.taskStartTime)){
  1611.                 removeTask(t);
  1612.             }
  1613.         }
  1614.     };
  1615.     this.start = function(task){
  1616.         tasks.push(task);
  1617.         task.taskStartTime = new Date().getTime();
  1618.         task.taskRunTime = 0;
  1619.         task.taskRunCount = 0;
  1620.         startThread();
  1621.         return task;
  1622.     };
  1623.     this.stop = function(task){
  1624.         removeTask(task);
  1625.         return task;
  1626.     };
  1627.     this.stopAll = function(){
  1628.         stopThread();
  1629.         for(var i = 0, len = tasks.length; i < len; i++){
  1630.             if(tasks[i].onStop){
  1631.                 tasks[i].onStop();
  1632.             }
  1633.         }
  1634.         tasks = [];
  1635.         removeQueue = [];
  1636.     };
  1637. };
  1638. Ext.TaskMgr = new Ext.util.TaskRunner();
  1639. Ext.util.MixedCollection = function(allowFunctions, keyFn){
  1640.     this.items = [];
  1641.     this.map = {};
  1642.     this.keys = [];
  1643.     this.length = 0;
  1644.     this.addEvents(
  1645.         "clear",
  1646.         "add",
  1647.         "replace",
  1648.         "remove",
  1649.         "sort"
  1650.     );
  1651.     this.allowFunctions = allowFunctions === true;
  1652.     if(keyFn){
  1653.         this.getKey = keyFn;
  1654.     }
  1655.     Ext.util.MixedCollection.superclass.constructor.call(this);
  1656. };
  1657. Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {
  1658.     allowFunctions : false,
  1659.     add : function(key, o){
  1660.         if(arguments.length == 1){
  1661.             o = arguments[0];
  1662.             key = this.getKey(o);
  1663.         }
  1664.         if(typeof key == "undefined" || key === null){
  1665.             this.length++;
  1666.             this.items.push(o);
  1667.             this.keys.push(null);
  1668.         }else{
  1669.             var old = this.map[key];
  1670.             if(old){
  1671.                 return this.replace(key, o);
  1672.             }
  1673.             this.length++;
  1674.             this.items.push(o);
  1675.             this.map[key] = o;
  1676.             this.keys.push(key);
  1677.         }
  1678.         this.fireEvent("add", this.length-1, o, key);
  1679.         return o;
  1680.     },
  1681.     getKey : function(o){
  1682.          return o.id;
  1683.     },
  1684.     replace : function(key, o){
  1685.         if(arguments.length == 1){
  1686.             o = arguments[0];
  1687.             key = this.getKey(o);
  1688.         }
  1689.         var old = this.item(key);
  1690.         if(typeof key == "undefined" || key === null || typeof old == "undefined"){
  1691.              return this.add(key, o);
  1692.         }
  1693.         var index = this.indexOfKey(key);
  1694.         this.items[index] = o;
  1695.         this.map[key] = o;
  1696.         this.fireEvent("replace", key, old, o);
  1697.         return o;
  1698.     },
  1699.     addAll : function(objs){
  1700.         if(arguments.length > 1 || Ext.isArray(objs)){
  1701.             var args = arguments.length > 1 ? arguments : objs;
  1702.             for(var i = 0, len = args.length; i < len; i++){
  1703.                 this.add(args[i]);
  1704.             }
  1705.         }else{
  1706.             for(var key in objs){
  1707.                 if(this.allowFunctions || typeof objs[key] != "function"){
  1708.                     this.add(key, objs[key]);
  1709.                 }
  1710.             }
  1711.         }
  1712.     },
  1713.     each : function(fn, scope){
  1714.         var items = [].concat(this.items);
  1715.         for(var i = 0, len = items.length; i < len; i++){
  1716.             if(fn.call(scope || items[i], items[i], i, len) === false){
  1717.                 break;
  1718.             }
  1719.         }
  1720.     },
  1721.     eachKey : function(fn, scope){
  1722.         for(var i = 0, len = this.keys.length; i < len; i++){
  1723.             fn.call(scope || window, this.keys[i], this.items[i], i, len);
  1724.         }
  1725.     },
  1726.     find : function(fn, scope){
  1727.         for(var i = 0, len = this.items.length; i < len; i++){
  1728.             if(fn.call(scope || window, this.items[i], this.keys[i])){
  1729.                 return this.items[i];
  1730.             }
  1731.         }
  1732.         return null;
  1733.     },
  1734.     insert : function(index, key, o){
  1735.         if(arguments.length == 2){
  1736.             o = arguments[1];
  1737.             key = this.getKey(o);
  1738.         }
  1739.         if(index >= this.length){
  1740.             return this.add(key, o);
  1741.         }
  1742.         this.length++;
  1743.         this.items.splice(index, 0, o);
  1744.         if(typeof key != "undefined" && key != null){
  1745.             this.map[key] = o;
  1746.         }
  1747.         this.keys.splice(index, 0, key);
  1748.         this.fireEvent("add", index, o, key);
  1749.         return o;
  1750.     },
  1751.     remove : function(o){
  1752.         return this.removeAt(this.indexOf(o));
  1753.     },
  1754.     removeAt : function(index){
  1755.         if(index < this.length && index >= 0){
  1756.             this.length--;
  1757.             var o = this.items[index];
  1758.             this.items.splice(index, 1);
  1759.             var key = this.keys[index];
  1760.             if(typeof key != "undefined"){
  1761.                 delete this.map[key];
  1762.             }
  1763.             this.keys.splice(index, 1);
  1764.             this.fireEvent("remove", o, key);
  1765.             return o;
  1766.         }
  1767.         return false;
  1768.     },
  1769.     removeKey : function(key){
  1770.         return this.removeAt(this.indexOfKey(key));
  1771.     },
  1772.     getCount : function(){
  1773.         return this.length;
  1774.     },
  1775.     indexOf : function(o){
  1776.         return this.items.indexOf(o);
  1777.     },
  1778.     indexOfKey : function(key){
  1779.         return this.keys.indexOf(key);
  1780.     },
  1781.     item : function(key){
  1782.         var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key];
  1783.         return typeof item != 'function' || this.allowFunctions ? item : null;
  1784.     },
  1785.     itemAt : function(index){
  1786.         return this.items[index];
  1787.     },
  1788.     key : function(key){
  1789.         return this.map[key];
  1790.     },
  1791.     contains : function(o){
  1792.         return this.indexOf(o) != -1;
  1793.     },
  1794.     containsKey : function(key){
  1795.         return typeof this.map[key] != "undefined";
  1796.     },
  1797.     clear : function(){
  1798.         this.length = 0;
  1799.         this.items = [];
  1800.         this.keys = [];
  1801.         this.map = {};
  1802.         this.fireEvent("clear");
  1803.     },
  1804.     first : function(){
  1805.         return this.items[0];
  1806.     },
  1807.     last : function(){
  1808.         return this.items[this.length-1];
  1809.     },
  1810.     _sort : function(property, dir, fn){
  1811.         var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1;
  1812.         fn = fn || function(a, b){
  1813.             return a-b;
  1814.         };
  1815.         var c = [], k = this.keys, items = this.items;
  1816.         for(var i = 0, len = items.length; i < len; i++){
  1817.             c[c.length] = {key: k[i], value: items[i], index: i};
  1818.         }
  1819.         c.sort(function(a, b){
  1820.             var v = fn(a[property], b[property]) * dsc;
  1821.             if(v == 0){
  1822.                 v = (a.index < b.index ? -1 : 1);
  1823.             }
  1824.             return v;
  1825.         });
  1826.         for(var i = 0, len = c.length; i < len; i++){
  1827.             items[i] = c[i].value;
  1828.             k[i] = c[i].key;
  1829.         }
  1830.         this.fireEvent("sort", this);
  1831.     },
  1832.     sort : function(dir, fn){
  1833.         this._sort("value", dir, fn);
  1834.     },
  1835.     keySort : function(dir, fn){
  1836.         this._sort("key", dir, fn || function(a, b){
  1837.             return String(a).toUpperCase()-String(b).toUpperCase();
  1838.         });
  1839.     },
  1840.     getRange : function(start, end){
  1841.         var items = this.items;
  1842.         if(items.length < 1){
  1843.             return [];
  1844.         }
  1845.         start = start || 0;
  1846.         end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1);
  1847.         var r = [];
  1848.         if(start <= end){
  1849.             for(var i = start; i <= end; i++) {
  1850.                 r[r.length] = items[i];
  1851.             }
  1852.         }else{
  1853.             for(var i = start; i >= end; i--) {
  1854.                 r[r.length] = items[i];
  1855.             }
  1856.         }
  1857.         return r;
  1858.     },
  1859.     filter : function(property, value, anyMatch, caseSensitive){
  1860.         if(Ext.isEmpty(value, false)){
  1861.             return this.clone();
  1862.         }
  1863.         value = this.createValueMatcher(value, anyMatch, caseSensitive);
  1864.         return this.filterBy(function(o){
  1865.             return o && value.test(o[property]);
  1866.         });
  1867.     },
  1868.     filterBy : function(fn, scope){
  1869.         var r = new Ext.util.MixedCollection();
  1870.         r.getKey = this.getKey;
  1871.         var k = this.keys, it = this.items;
  1872.         for(var i = 0, len = it.length; i < len; i++){
  1873.             if(fn.call(scope||this, it[i], k[i])){
  1874.                 r.add(k[i], it[i]);
  1875.             }
  1876.         }
  1877.         return r;
  1878.     },
  1879.     findIndex : function(property, value, start, anyMatch, caseSensitive){
  1880.         if(Ext.isEmpty(value, false)){
  1881.             return -1;
  1882.         }
  1883.         value = this.createValueMatcher(value, anyMatch, caseSensitive);
  1884.         return this.findIndexBy(function(o){
  1885.             return o && value.test(o[property]);
  1886.         }, null, start);
  1887.     },
  1888.     findIndexBy : function(fn, scope, start){
  1889.         var k = this.keys, it = this.items;
  1890.         for(var i = (start||0), len = it.length; i < len; i++){
  1891.             if(fn.call(scope||this, it[i], k[i])){
  1892.                 return i;
  1893.             }
  1894.         }
  1895.         if(typeof start == 'number' && start > 0){
  1896.             for(var i = 0; i < start; i++){
  1897.                 if(fn.call(scope||this, it[i], k[i])){
  1898.                     return i;
  1899.                 }
  1900.             }
  1901.         }
  1902.         return -1;
  1903.     },
  1904.     createValueMatcher : function(value, anyMatch, caseSensitive){
  1905.         if(!value.exec){
  1906.             value = String(value);
  1907.             value = new RegExp((anyMatch === true ? '' : '^') + Ext.escapeRe(value), caseSensitive ? '' : 'i');
  1908.         }
  1909.         return value;
  1910.     },
  1911.     clone : function(){
  1912.         var r = new Ext.util.MixedCollection();
  1913.         var k = this.keys, it = this.items;
  1914.         for(var i = 0, len = it.length; i < len; i++){
  1915.             r.add(k[i], it[i]);
  1916.         }
  1917.         r.getKey = this.getKey;
  1918.         return r;
  1919.     }
  1920. });
  1921. Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
  1922. Ext.util.JSON = new (function(){
  1923.     var useHasOwn = {}.hasOwnProperty ? true : false;
  1924.     var pad = function(n) {
  1925.         return n < 10 ? "0" + n : n;
  1926.     };
  1927.     var m = {
  1928.         "b": '\b',
  1929.         "t": '\t',
  1930.         "n": '\n',
  1931.         "f": '\f',
  1932.         "r": '\r',
  1933.         '"' : '\"',
  1934.         "\": '\\'
  1935.     };
  1936.     var encodeString = function(s){
  1937.         if (/["\x00-x1f]/.test(s)) {
  1938.             return '"' + s.replace(/([x00-x1f\"])/g, function(a, b) {
  1939.                 var c = m[b];
  1940.                 if(c){
  1941.                     return c;
  1942.                 }
  1943.                 c = b.charCodeAt();
  1944.                 return "\u00" +
  1945.                     Math.floor(c / 16).toString(16) +
  1946.                     (c % 16).toString(16);
  1947.             }) + '"';
  1948.         }
  1949.         return '"' + s + '"';
  1950.     };
  1951.     var encodeArray = function(o){
  1952.         var a = ["["], b, i, l = o.length, v;
  1953.             for (i = 0; i < l; i += 1) {
  1954.                 v = o[i];
  1955.                 switch (typeof v) {
  1956.                     case "undefined":
  1957.                     case "function":
  1958.                     case "unknown":
  1959.                         break;
  1960.                     default:
  1961.                         if (b) {
  1962.                             a.push(',');
  1963.                         }
  1964.                         a.push(v === null ? "null" : Ext.util.JSON.encode(v));
  1965.                         b = true;
  1966.                 }
  1967.             }
  1968.             a.push("]");
  1969.             return a.join("");
  1970.     };
  1971.     var encodeDate = function(o){
  1972.         return '"' + o.getFullYear() + "-" +
  1973.                 pad(o.getMonth() + 1) + "-" +
  1974.                 pad(o.getDate()) + "T" +
  1975.                 pad(o.getHours()) + ":" +
  1976.                 pad(o.getMinutes()) + ":" +
  1977.                 pad(o.getSeconds()) + '"';
  1978.     };
  1979.     this.encode = function(o){
  1980.         if(typeof o == "undefined" || o === null){
  1981.             return "null";
  1982.         }else if(Ext.isArray(o)){
  1983.             return encodeArray(o);
  1984.         }else if(Ext.isDate(o)){
  1985.             return encodeDate(o);
  1986.         }else if(typeof o == "string"){
  1987.             return encodeString(o);
  1988.         }else if(typeof o == "number"){
  1989.             return isFinite(o) ? String(o) : "null";
  1990.         }else if(typeof o == "boolean"){
  1991.             return String(o);
  1992.         }else {
  1993.             var a = ["{"], b, i, v;
  1994.             for (i in o) {
  1995.                 if(!useHasOwn || o.hasOwnProperty(i)) {
  1996.                     v = o[i];
  1997.                     switch (typeof v) {
  1998.                     case "undefined":
  1999.                     case "function":
  2000.                     case "unknown":
  2001.                         break;
  2002.                     default:
  2003.                         if(b){
  2004.                             a.push(',');
  2005.                         }
  2006.                         a.push(this.encode(i), ":",
  2007.                                 v === null ? "null" : this.encode(v));
  2008.                         b = true;
  2009.                     }
  2010.                 }
  2011.             }
  2012.             a.push("}");
  2013.             return a.join("");
  2014.         }
  2015.     };
  2016.     this.decode = function(json){
  2017.         return eval("(" + json + ')');
  2018.     };
  2019. })();
  2020. Ext.encode = Ext.util.JSON.encode;
  2021. Ext.decode = Ext.util.JSON.decode;
  2022. Ext.util.Format = function(){
  2023.     var trimRe = /^s+|s+$/g;
  2024.     return {
  2025.         ellipsis : function(value, len){
  2026.             if(value && value.length > len){
  2027.                 return value.substr(0, len-3)+"...";
  2028.             }
  2029.             return value;
  2030.         },
  2031.         undef : function(value){
  2032.             return value !== undefined ? value : "";
  2033.         },
  2034.         defaultValue : function(value, defaultValue){
  2035.             return value !== undefined && value !== '' ? value : defaultValue;
  2036.         },
  2037.         htmlEncode : function(value){
  2038.             return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
  2039.         },
  2040.         htmlDecode : function(value){
  2041.             return !value ? value : String(value).replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"');
  2042.         },
  2043.         trim : function(value){
  2044.             return String(value).replace(trimRe, "");
  2045.         },
  2046.         substr : function(value, start, length){
  2047.             return String(value).substr(start, length);
  2048.         },
  2049.         lowercase : function(value){
  2050.             return String(value).toLowerCase();
  2051.         },
  2052.         uppercase : function(value){
  2053.             return String(value).toUpperCase();
  2054.         },
  2055.         capitalize : function(value){
  2056.             return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
  2057.         },
  2058.         call : function(value, fn){
  2059.             if(arguments.length > 2){
  2060.                 var args = Array.prototype.slice.call(arguments, 2);
  2061.                 args.unshift(value);
  2062.                 return eval(fn).apply(window, args);
  2063.             }else{
  2064.                 return eval(fn).call(window, value);
  2065.             }
  2066.         },
  2067.         usMoney : function(v){
  2068.             v = (Math.round((v-0)*100))/100;
  2069.             v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v);
  2070.             v = String(v);
  2071.             var ps = v.split('.');
  2072.             var whole = ps[0];
  2073.             var sub = ps[1] ? '.'+ ps[1] : '.00';
  2074.             var r = /(d+)(d{3})/;
  2075.             while (r.test(whole)) {
  2076.                 whole = whole.replace(r, '$1' + ',' + '$2');
  2077.             }
  2078.             v = whole + sub;
  2079.             if(v.charAt(0) == '-'){
  2080.                 return '-$' + v.substr(1);
  2081.             }
  2082.             return "$" +  v;
  2083.         },
  2084.         date : function(v, format){
  2085.             if(!v){
  2086.                 return "";
  2087.             }
  2088.             if(!Ext.isDate(v)){
  2089.                 v = new Date(Date.parse(v));
  2090.             }
  2091.             return v.dateFormat(format || "m/d/Y");
  2092.         },
  2093.         dateRenderer : function(format){
  2094.             return function(v){
  2095.                 return Ext.util.Format.date(v, format);
  2096.             };
  2097.         },
  2098.         stripTagsRE : /</?[^>]+>/gi,
  2099.         stripTags : function(v){
  2100.             return !v ? v : String(v).replace(this.stripTagsRE, "");
  2101.         },
  2102.         stripScriptsRe : /(?:<script.*?>)((n|r|.)*?)(?:</script>)/ig,
  2103.         stripScripts : function(v){
  2104.             return !v ? v : String(v).replace(this.stripScriptsRe, "");
  2105.         },
  2106.         fileSize : function(size){
  2107.             if(size < 1024) {
  2108.                 return size + " bytes";
  2109.             } else if(size < 1048576) {
  2110.                 return (Math.round(((size*10) / 1024))/10) + " KB";
  2111.             } else {
  2112.                 return (Math.round(((size*10) / 1048576))/10) + " MB";
  2113.             }
  2114.         },
  2115.         math : function(){
  2116.             var fns = {};
  2117.             return function(v, a){
  2118.                 if(!fns[a]){
  2119.                     fns[a] = new Function('v', 'return v ' + a + ';');
  2120.                 }
  2121.                 return fns[a](v);
  2122.             }
  2123.         }()
  2124.     };
  2125. }();
  2126. Ext.XTemplate = function(){
  2127.     Ext.XTemplate.superclass.constructor.apply(this, arguments);
  2128.     var s = this.html;
  2129.     s = ['<tpl>', s, '</tpl>'].join('');
  2130.     var re = /<tplb[^>]*>((?:(?=([^<]+))2|<(?!tplb[^>]*>))*?)</tpl>/;
  2131.     var nameRe = /^<tplb[^>]*?for="(.*?)"/;
  2132.     var ifRe = /^<tplb[^>]*?if="(.*?)"/;
  2133.     var execRe = /^<tplb[^>]*?exec="(.*?)"/;
  2134.     var m, id = 0;
  2135.     var tpls = [];
  2136.     while(m = s.match(re)){
  2137.        var m2 = m[0].match(nameRe);
  2138.        var m3 = m[0].match(ifRe);
  2139.        var m4 = m[0].match(execRe);
  2140.        var exp = null, fn = null, exec = null;
  2141.        var name = m2 && m2[1] ? m2[1] : '';
  2142.        if(m3){
  2143.            exp = m3 && m3[1] ? m3[1] : null;
  2144.            if(exp){
  2145.                fn = new Function('values', 'parent', 'xindex', 'xcount', 'with(values){ return '+(Ext.util.Format.htmlDecode(exp))+'; }');
  2146.            }
  2147.        }
  2148.        if(m4){
  2149.            exp = m4 && m4[1] ? m4[1] : null;
  2150.            if(exp){
  2151.                exec = new Function('values', 'parent', 'xindex', 'xcount', 'with(values){ '+(Ext.util.Format.htmlDecode(exp))+'; }');
  2152.            }
  2153.        }
  2154.        if(name){
  2155.            switch(name){
  2156.                case '.': name = new Function('values', 'parent', 'with(values){ return values; }'); break;
  2157.                case '..': name = new Function('values', 'parent', 'with(values){ return parent; }'); break;
  2158.                default: name = new Function('values', 'parent', 'with(values){ return '+name+'; }');
  2159.            }
  2160.        }
  2161.        tpls.push({
  2162.             id: id,
  2163.             target: name,
  2164.             exec: exec,
  2165.             test: fn,
  2166.             body: m[1]||''
  2167.         });
  2168.        s = s.replace(m[0], '{xtpl'+ id + '}');
  2169.        ++id;
  2170.     }
  2171.     for(var i = tpls.length-1; i >= 0; --i){
  2172.         this.compileTpl(tpls[i]);
  2173.     }
  2174.     this.master = tpls[tpls.length-1];
  2175.     this.tpls = tpls;
  2176. };
  2177. Ext.extend(Ext.XTemplate, Ext.Template, {
  2178.     re : /{([w-.#]+)(?::([w.]*)(?:((.*?)?))?)?(s?[+-*\]s?[d.+-*\()]+)?}/g,
  2179.     codeRe : /{[((?:\]|.|n)*?)]}/g,
  2180.     applySubTemplate : function(id, values, parent, xindex, xcount){
  2181.         var t = this.tpls[id];
  2182.         if(t.test && !t.test.call(this, values, parent, xindex, xcount)){
  2183.             return '';
  2184.         }
  2185.         if(t.exec && t.exec.call(this, values, parent, xindex, xcount)){
  2186.             return '';
  2187.         }
  2188.         var vs = t.target ? t.target.call(this, values, parent) : values;
  2189.         parent = t.target ? values : parent;
  2190.         if(t.target && Ext.isArray(vs)){
  2191.             var buf = [];
  2192.             for(var i = 0, len = vs.length; i < len; i++){
  2193.                 buf[buf.length] = t.compiled.call(this, vs[i], parent, i+1, len);
  2194.             }
  2195.             return buf.join('');
  2196.         }
  2197.         return t.compiled.call(this, vs, parent, xindex, xcount);
  2198.     },
  2199.     compileTpl : function(tpl){
  2200.         var fm = Ext.util.Format;
  2201.         var useF = this.disableFormats !== true;
  2202.         var sep = Ext.isGecko ? "+" : ",";
  2203.         var fn = function(m, name, format, args, math){
  2204.             if(name.substr(0, 4) == 'xtpl'){
  2205.                 return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'";
  2206.             }
  2207.             var v;
  2208.             if(name === '.'){
  2209.                 v = 'values';
  2210.             }else if(name === '#'){
  2211.                 v = 'xindex';
  2212.             }else if(name.indexOf('.') != -1){
  2213.                 v = name;
  2214.             }else{
  2215.                 v = "values['" + name + "']";
  2216.             }
  2217.             if(math){
  2218.                 v = '(' + v + math + ')';
  2219.             }
  2220.             if(format && useF){
  2221.                 args = args ? ',' + args : "";
  2222.                 if(format.substr(0, 5) != "this."){
  2223.                     format = "fm." + format + '(';
  2224.                 }else{
  2225.                     format = 'this.call("'+ format.substr(5) + '", ';
  2226.                     args = ", values";
  2227.                 }
  2228.             }else{
  2229.                 args= ''; format = "("+v+" === undefined ? '' : ";
  2230.             }
  2231.             return "'"+ sep + format + v + args + ")"+sep+"'";
  2232.         };
  2233.         var codeFn = function(m, code){
  2234.             return "'"+ sep +'('+code+')'+sep+"'";
  2235.         };
  2236.         var body;
  2237.         if(Ext.isGecko){
  2238.             body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" +
  2239.                    tpl.body.replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn).replace(this.codeRe, codeFn) +
  2240.                     "';};";
  2241.         }else{
  2242.             body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];
  2243.             body.push(tpl.body.replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn).replace(this.codeRe, codeFn));
  2244.             body.push("'].join('');};");
  2245.             body = body.join('');
  2246.         }
  2247.         eval(body);
  2248.         return this;
  2249.     },
  2250.     apply : function(values){
  2251.         return this.master.compiled.call(this, values, {}, 1, 1);
  2252.     },
  2253.     applyTemplate : function(values){
  2254.         return this.master.compiled.call(this, values, {}, 1, 1);
  2255.     },
  2256.     compile : function(){return this;}
  2257. });
  2258. Ext.XTemplate.from = function(el){
  2259.     el = Ext.getDom(el);
  2260.     return new Ext.XTemplate(el.value || el.innerHTML);
  2261. };
  2262. Ext.util.CSS = function(){
  2263.     var rules = null;
  2264.     var doc = document;
  2265.     var camelRe = /(-[a-z])/gi;
  2266.     var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
  2267.    return {
  2268.    createStyleSheet : function(cssText, id){
  2269.        var ss;
  2270.        var head = doc.getElementsByTagName("head")[0];
  2271.        var rules = doc.createElement("style");
  2272.        rules.setAttribute("type", "text/css");
  2273.        if(id){
  2274.            rules.setAttribute("id", id);
  2275.        }
  2276.        if(Ext.isIE){
  2277.            head.appendChild(rules);
  2278.            ss = rules.styleSheet;
  2279.            ss.cssText = cssText;
  2280.        }else{
  2281.            try{
  2282.                 rules.appendChild(doc.createTextNode(cssText));
  2283.            }catch(e){
  2284.                rules.cssText = cssText;
  2285.            }
  2286.            head.appendChild(rules);
  2287.            ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]);
  2288.        }
  2289.        this.cacheStyleSheet(ss);
  2290.        return ss;
  2291.    },
  2292.    removeStyleSheet : function(id){
  2293.        var existing = doc.getElementById(id);
  2294.        if(existing){
  2295.            existing.parentNode.removeChild(existing);
  2296.        }
  2297.    },
  2298.    swapStyleSheet : function(id, url){
  2299.        this.removeStyleSheet(id);
  2300.        var ss = doc.createElement("link");
  2301.        ss.setAttribute("rel", "stylesheet");
  2302.        ss.setAttribute("type", "text/css");
  2303.        ss.setAttribute("id", id);
  2304.        ss.setAttribute("href", url);
  2305.        doc.getElementsByTagName("head")[0].appendChild(ss);
  2306.    },
  2307.    refreshCache : function(){
  2308.        return this.getRules(true);
  2309.    },
  2310.    cacheStyleSheet : function(ss){
  2311.        if(!rules){
  2312.            rules = {};
  2313.        }
  2314.        try{
  2315.            var ssRules = ss.cssRules || ss.rules;
  2316.            for(var j = ssRules.length-1; j >= 0; --j){
  2317.                rules[ssRules[j].selectorText] = ssRules[j];
  2318.            }
  2319.        }catch(e){}
  2320.    },
  2321.    getRules : function(refreshCache){
  2322.         if(rules == null || refreshCache){
  2323.             rules = {};
  2324.             var ds = doc.styleSheets;
  2325.             for(var i =0, len = ds.length; i < len; i++){
  2326.                 try{
  2327.                     this.cacheStyleSheet(ds[i]);
  2328.                 }catch(e){}
  2329.             }
  2330.         }
  2331.         return rules;
  2332.     },
  2333.    getRule : function(selector, refreshCache){
  2334.         var rs = this.getRules(refreshCache);
  2335.         if(!Ext.isArray(selector)){
  2336.             return rs[selector];
  2337.         }
  2338.         for(var i = 0; i < selector.length; i++){
  2339.             if(rs[selector[i]]){
  2340.                 return rs[selector[i]];
  2341.             }
  2342.         }
  2343.         return null;
  2344.     },
  2345.    updateRule : function(selector, property, value){
  2346.         if(!Ext.isArray(selector)){
  2347.             var rule = this.getRule(selector);
  2348.             if(rule){
  2349.                 rule.style[property.replace(camelRe, camelFn)] = value;
  2350.                 return true;
  2351.             }
  2352.         }else{
  2353.             for(var i = 0; i < selector.length; i++){
  2354.                 if(this.updateRule(selector[i], property, value)){
  2355.                     return true;
  2356.                 }
  2357.             }
  2358.         }
  2359.         return false;
  2360.     }
  2361.    };
  2362. }();
  2363. Ext.util.ClickRepeater = function(el, config)
  2364. {
  2365.     this.el = Ext.get(el);
  2366.     this.el.unselectable();
  2367.     Ext.apply(this, config);
  2368.     this.addEvents(
  2369.         "mousedown",
  2370.         "click",
  2371.         "mouseup"
  2372.     );
  2373.     this.el.on("mousedown", this.handleMouseDown, this);
  2374.     if(this.preventDefault || this.stopDefault){
  2375.         this.el.on("click", function(e){
  2376.             if(this.preventDefault){
  2377.                 e.preventDefault();
  2378.             }
  2379.             if(this.stopDefault){
  2380.                 e.stopEvent();
  2381.             }
  2382.         }, this);
  2383.     }
  2384.         if(this.handler){
  2385.         this.on("click", this.handler,  this.scope || this);
  2386.     }
  2387.     Ext.util.ClickRepeater.superclass.constructor.call(this);
  2388. };
  2389. Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, {
  2390.     interval : 20,
  2391.     delay: 250,
  2392.     preventDefault : true,
  2393.     stopDefault : false,
  2394.     timer : 0,
  2395.         handleMouseDown : function(){
  2396.         clearTimeout(this.timer);
  2397.         this.el.blur();
  2398.         if(this.pressClass){
  2399.             this.el.addClass(this.pressClass);
  2400.         }
  2401.         this.mousedownTime = new Date();
  2402.         Ext.getDoc().on("mouseup", this.handleMouseUp, this);
  2403.         this.el.on("mouseout", this.handleMouseOut, this);
  2404.         this.fireEvent("mousedown", this);
  2405.         this.fireEvent("click", this);
  2406.         if (this.accelerate) {
  2407.             this.delay = 400;
  2408.         }
  2409.         this.timer = this.click.defer(this.delay || this.interval, this);
  2410.     },
  2411.         click : function(){
  2412.         this.fireEvent("click", this);
  2413.         this.timer = this.click.defer(this.accelerate ?
  2414.             this.easeOutExpo(this.mousedownTime.getElapsed(),
  2415.                 400,
  2416.                 -390,
  2417.                 12000) :
  2418.             this.interval, this);
  2419.     },
  2420.     easeOutExpo : function (t, b, c, d) {
  2421.         return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
  2422.     },
  2423.         handleMouseOut : function(){
  2424.         clearTimeout(this.timer);
  2425.         if(this.pressClass){
  2426.             this.el.removeClass(this.pressClass);
  2427.         }
  2428.         this.el.on("mouseover", this.handleMouseReturn, this);
  2429.     },
  2430.         handleMouseReturn : function(){
  2431.         this.el.un("mouseover", this.handleMouseReturn);
  2432.         if(this.pressClass){
  2433.             this.el.addClass(this.pressClass);
  2434.         }
  2435.         this.click();
  2436.     },
  2437.         handleMouseUp : function(){
  2438.         clearTimeout(this.timer);
  2439.         this.el.un("mouseover", this.handleMouseReturn);
  2440.         this.el.un("mouseout", this.handleMouseOut);
  2441.         Ext.getDoc().un("mouseup", this.handleMouseUp);
  2442.         this.el.removeClass(this.pressClass);
  2443.         this.fireEvent("mouseup", this);
  2444.     }
  2445. });
  2446. Ext.KeyNav = function(el, config){
  2447.     this.el = Ext.get(el);
  2448.     Ext.apply(this, config);
  2449.     if(!this.disabled){
  2450.         this.disabled = true;
  2451.         this.enable();
  2452.     }
  2453. };
  2454. Ext.KeyNav.prototype = {
  2455.     disabled : false,
  2456.     defaultEventAction: "stopEvent",
  2457.     forceKeyDown : false,
  2458.         prepareEvent : function(e){
  2459.         var k = e.getKey();
  2460.         var h = this.keyToHandler[k];
  2461.                                 if(Ext.isSafari && h && k >= 37 && k <= 40){
  2462.             e.stopEvent();
  2463.         }
  2464.     },
  2465.         relay : function(e){
  2466.         var k = e.getKey();
  2467.         var h = this.keyToHandler[k];
  2468.         if(h && this[h]){
  2469.             if(this.doRelay(e, this[h], h) !== true){
  2470.                 e[this.defaultEventAction]();
  2471.             }
  2472.         }
  2473.     },
  2474.         doRelay : function(e, h, hname){
  2475.         return h.call(this.scope || this, e);
  2476.     },
  2477.         enter : false,
  2478.     left : false,
  2479.     right : false,
  2480.     up : false,
  2481.     down : false,
  2482.     tab : false,
  2483.     esc : false,
  2484.     pageUp : false,
  2485.     pageDown : false,
  2486.     del : false,
  2487.     home : false,
  2488.     end : false,
  2489.         keyToHandler : {
  2490.         37 : "left",
  2491.         39 : "right",
  2492.         38 : "up",
  2493.         40 : "down",
  2494.         33 : "pageUp",
  2495.         34 : "pageDown",
  2496.         46 : "del",
  2497.         36 : "home",
  2498.         35 : "end",
  2499.         13 : "enter",
  2500.         27 : "esc",
  2501.         9  : "tab"
  2502.     },
  2503.     enable: function(){
  2504.         if(this.disabled){
  2505.                                     if(this.forceKeyDown || Ext.isIE || Ext.isAir){
  2506.                 this.el.on("keydown", this.relay,  this);
  2507.             }else{
  2508.                 this.el.on("keydown", this.prepareEvent,  this);
  2509.                 this.el.on("keypress", this.relay,  this);
  2510.             }
  2511.             this.disabled = false;
  2512.         }
  2513.     },
  2514.     disable: function(){
  2515.         if(!this.disabled){
  2516.             if(this.forceKeyDown || Ext.isIE || Ext.isAir){
  2517.                 this.el.un("keydown", this.relay);
  2518.             }else{
  2519.                 this.el.un("keydown", this.prepareEvent);
  2520.                 this.el.un("keypress", this.relay);
  2521.             }
  2522.             this.disabled = true;
  2523.         }
  2524.     }
  2525. };
  2526. Ext.KeyMap = function(el, config, eventName){
  2527.     this.el  = Ext.get(el);
  2528.     this.eventName = eventName || "keydown";
  2529.     this.bindings = [];
  2530.     if(config){
  2531.         this.addBinding(config);
  2532.     }
  2533.     this.enable();
  2534. };
  2535. Ext.KeyMap.prototype = {
  2536.     stopEvent : false,
  2537.     addBinding : function(config){
  2538.         if(Ext.isArray(config)){
  2539.             for(var i = 0, len = config.length; i < len; i++){
  2540.                 this.addBinding(config[i]);
  2541.             }
  2542.             return;
  2543.         }
  2544.         var keyCode = config.key,
  2545.             shift = config.shift,
  2546.             ctrl = config.ctrl,
  2547.             alt = config.alt,
  2548.             fn = config.fn || config.handler,
  2549.             scope = config.scope;
  2550.         if(typeof keyCode == "string"){
  2551.             var ks = [];
  2552.             var keyString = keyCode.toUpperCase();
  2553.             for(var j = 0, len = keyString.length; j < len; j++){
  2554.                 ks.push(keyString.charCodeAt(j));
  2555.             }
  2556.             keyCode = ks;
  2557.         }
  2558.         var keyArray = Ext.isArray(keyCode);
  2559.         var handler = function(e){
  2560.             if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) &&  (!alt || e.altKey)){
  2561.                 var k = e.getKey();
  2562.                 if(keyArray){
  2563.                     for(var i = 0, len = keyCode.length; i < len; i++){
  2564.                         if(keyCode[i] == k){
  2565.                           if(this.stopEvent){
  2566.                               e.stopEvent();
  2567.                           }
  2568.                           fn.call(scope || window, k, e);
  2569.                           return;
  2570.                         }
  2571.                     }
  2572.                 }else{
  2573.                     if(k == keyCode){
  2574.                         if(this.stopEvent){
  2575.                            e.stopEvent();
  2576.                         }
  2577.                         fn.call(scope || window, k, e);
  2578.                     }
  2579.                 }
  2580.             }
  2581.         };
  2582.         this.bindings.push(handler);
  2583.     },
  2584.     on : function(key, fn, scope){
  2585.         var keyCode, shift, ctrl, alt;
  2586.         if(typeof key == "object" && !Ext.isArray(key)){
  2587.             keyCode = key.key;
  2588.             shift = key.shift;
  2589.             ctrl = key.ctrl;
  2590.             alt = key.alt;
  2591.         }else{
  2592.             keyCode = key;
  2593.         }
  2594.         this.addBinding({
  2595.             key: keyCode,
  2596.             shift: shift,
  2597.             ctrl: ctrl,
  2598.             alt: alt,
  2599.             fn: fn,
  2600.             scope: scope
  2601.         })
  2602.     },
  2603.     handleKeyDown : function(e){
  2604.         if(this.enabled){
  2605.             var b = this.bindings;
  2606.             for(var i = 0, len = b.length; i < len; i++){
  2607.                 b[i].call(this, e);
  2608.             }
  2609.         }
  2610.     },
  2611.     isEnabled : function(){
  2612.         return this.enabled;
  2613.     },
  2614.     enable: function(){
  2615.         if(!this.enabled){
  2616.             this.el.on(this.eventName, this.handleKeyDown, this);
  2617.             this.enabled = true;
  2618.         }
  2619.     },
  2620.     disable: function(){
  2621.         if(this.enabled){
  2622.             this.el.removeListener(this.eventName, this.handleKeyDown, this);
  2623.             this.enabled = false;
  2624.         }
  2625.     }
  2626. };
  2627. Ext.util.TextMetrics = function(){
  2628.     var shared;
  2629.     return {
  2630.         measure : function(el, text, fixedWidth){
  2631.             if(!shared){
  2632.                 shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
  2633.             }
  2634.             shared.bind(el);
  2635.             shared.setFixedWidth(fixedWidth || 'auto');
  2636.             return shared.getSize(text);
  2637.         },
  2638.         createInstance : function(el, fixedWidth){
  2639.             return Ext.util.TextMetrics.Instance(el, fixedWidth);
  2640.         }
  2641.     };
  2642. }();
  2643. Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
  2644.     var ml = new Ext.Element(document.createElement('div'));
  2645.     document.body.appendChild(ml.dom);
  2646.     ml.position('absolute');
  2647.     ml.setLeftTop(-1000, -1000);
  2648.     ml.hide();
  2649.     if(fixedWidth){
  2650.         ml.setWidth(fixedWidth);
  2651.     }
  2652.     var instance = {
  2653.         getSize : function(text){
  2654.             ml.update(text);
  2655.             var s = ml.getSize();
  2656.             ml.update('');
  2657.             return s;
  2658.         },
  2659.         bind : function(el){
  2660.             ml.setStyle(
  2661.                 Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height')
  2662.             );
  2663.         },
  2664.         setFixedWidth : function(width){
  2665.             ml.setWidth(width);
  2666.         },
  2667.         getWidth : function(text){
  2668.             ml.dom.style.width = 'auto';
  2669.             return this.getSize(text).width;
  2670.         },
  2671.         getHeight : function(text){
  2672.             return this.getSize(text).height;
  2673.         }
  2674.     };
  2675.     instance.bind(bindTo);
  2676.     return instance;
  2677. };
  2678. Ext.Element.measureText = Ext.util.TextMetrics.measure;
  2679. (function() {
  2680. var Event=Ext.EventManager;
  2681. var Dom=Ext.lib.Dom;
  2682. Ext.dd.DragDrop = function(id, sGroup, config) {
  2683.     if(id) {
  2684.         this.init(id, sGroup, config);
  2685.     }
  2686. };
  2687. Ext.dd.DragDrop.prototype = {
  2688.     id: null,
  2689.     config: null,
  2690.     dragElId: null,
  2691.     handleElId: null,
  2692.     invalidHandleTypes: null,
  2693.     invalidHandleIds: null,
  2694.     invalidHandleClasses: null,
  2695.     startPageX: 0,
  2696.     startPageY: 0,
  2697.     groups: null,
  2698.     locked: false,
  2699.     lock: function() { this.locked = true; },
  2700.     unlock: function() { this.locked = false; },
  2701.     isTarget: true,
  2702.     padding: null,
  2703.     _domRef: null,
  2704.     __ygDragDrop: true,
  2705.     constrainX: false,
  2706.     constrainY: false,
  2707.     minX: 0,
  2708.     maxX: 0,
  2709.     minY: 0,
  2710.     maxY: 0,
  2711.     maintainOffset: false,
  2712.     xTicks: null,
  2713.     yTicks: null,
  2714.     primaryButtonOnly: true,
  2715.     available: false,
  2716.     hasOuterHandles: false,
  2717.     b4StartDrag: function(x, y) { },
  2718.     startDrag: function(x, y) {  },
  2719.     b4Drag: function(e) { },
  2720.     onDrag: function(e) {  },
  2721.     onDragEnter: function(e, id) {  },
  2722.     b4DragOver: function(e) { },
  2723.     onDragOver: function(e, id) {  },
  2724.     b4DragOut: function(e) { },
  2725.     onDragOut: function(e, id) {  },
  2726.     b4DragDrop: function(e) { },
  2727.     onDragDrop: function(e, id) {  },
  2728.     onInvalidDrop: function(e) {  },
  2729.     b4EndDrag: function(e) { },
  2730.     endDrag: function(e) {  },
  2731.     b4MouseDown: function(e) {  },
  2732.     onMouseDown: function(e) {  },
  2733.     onMouseUp: function(e) {  },
  2734.     onAvailable: function () {
  2735.     },
  2736.     defaultPadding : {left:0, right:0, top:0, bottom:0},
  2737.     constrainTo : function(constrainTo, pad, inContent){
  2738.         if(typeof pad == "number"){
  2739.             pad = {left: pad, right:pad, top:pad, bottom:pad};
  2740.         }
  2741.         pad = pad || this.defaultPadding;
  2742.         var b = Ext.get(this.getEl()).getBox();
  2743.         var ce = Ext.get(constrainTo);
  2744.         var s = ce.getScroll();
  2745.         var c, cd = ce.dom;
  2746.         if(cd == document.body){
  2747.             c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
  2748.         }else{
  2749.             var xy = ce.getXY();
  2750.             c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight};
  2751.         }
  2752.         var topSpace = b.y - c.y;
  2753.         var leftSpace = b.x - c.x;
  2754.         this.resetConstraints();
  2755.         this.setXConstraint(leftSpace - (pad.left||0),
  2756.                 c.width - leftSpace - b.width - (pad.right||0),
  2757.                 this.xTickSize
  2758.         );
  2759.         this.setYConstraint(topSpace - (pad.top||0),
  2760.                 c.height - topSpace - b.height - (pad.bottom||0),
  2761.                 this.yTickSize
  2762.         );
  2763.     },
  2764.     getEl: function() {
  2765.         if (!this._domRef) {
  2766.             this._domRef = Ext.getDom(this.id);
  2767.         }
  2768.         return this._domRef;
  2769.     },
  2770.     getDragEl: function() {
  2771.         return Ext.getDom(this.dragElId);
  2772.     },
  2773.     init: function(id, sGroup, config) {
  2774.         this.initTarget(id, sGroup, config);
  2775.         Event.on(this.id, "mousedown", this.handleMouseDown, this);
  2776.     },
  2777.     initTarget: function(id, sGroup, config) {
  2778.         this.config = config || {};
  2779.         this.DDM = Ext.dd.DDM;
  2780.         this.groups = {};
  2781.         if (typeof id !== "string") {
  2782.             id = Ext.id(id);
  2783.         }
  2784.         this.id = id;
  2785.         this.addToGroup((sGroup) ? sGroup : "default");
  2786.         this.handleElId = id;
  2787.         this.setDragElId(id);
  2788.         this.invalidHandleTypes = { A: "A" };
  2789.         this.invalidHandleIds = {};
  2790.         this.invalidHandleClasses = [];
  2791.         this.applyConfig();
  2792.         this.handleOnAvailable();
  2793.     },
  2794.     applyConfig: function() {
  2795.         this.padding           = this.config.padding || [0, 0, 0, 0];
  2796.         this.isTarget          = (this.config.isTarget !== false);
  2797.         this.maintainOffset    = (this.config.maintainOffset);
  2798.         this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
  2799.     },
  2800.     handleOnAvailable: function() {
  2801.         this.available = true;
  2802.         this.resetConstraints();
  2803.         this.onAvailable();
  2804.     },
  2805.     setPadding: function(iTop, iRight, iBot, iLeft) {
  2806.         if (!iRight && 0 !== iRight) {
  2807.             this.padding = [iTop, iTop, iTop, iTop];
  2808.         } else if (!iBot && 0 !== iBot) {
  2809.             this.padding = [iTop, iRight, iTop, iRight];
  2810.         } else {
  2811.             this.padding = [iTop, iRight, iBot, iLeft];
  2812.         }
  2813.     },
  2814.     setInitPosition: function(diffX, diffY) {
  2815.         var el = this.getEl();
  2816.         if (!this.DDM.verifyEl(el)) {
  2817.             return;
  2818.         }
  2819.         var dx = diffX || 0;
  2820.         var dy = diffY || 0;
  2821.         var p = Dom.getXY( el );
  2822.         this.initPageX = p[0] - dx;
  2823.         this.initPageY = p[1] - dy;
  2824.         this.lastPageX = p[0];
  2825.         this.lastPageY = p[1];
  2826.         this.setStartPosition(p);
  2827.     },
  2828.     setStartPosition: function(pos) {
  2829.         var p = pos || Dom.getXY( this.getEl() );
  2830.         this.deltaSetXY = null;
  2831.         this.startPageX = p[0];
  2832.         this.startPageY = p[1];
  2833.     },
  2834.     addToGroup: function(sGroup) {
  2835.         this.groups[sGroup] = true;
  2836.         this.DDM.regDragDrop(this, sGroup);
  2837.     },
  2838.     removeFromGroup: function(sGroup) {
  2839.         if (this.groups[sGroup]) {
  2840.             delete this.groups[sGroup];
  2841.         }
  2842.         this.DDM.removeDDFromGroup(this, sGroup);
  2843.     },
  2844.     setDragElId: function(id) {
  2845.         this.dragElId = id;
  2846.     },
  2847.     setHandleElId: function(id) {
  2848.         if (typeof id !== "string") {
  2849.             id = Ext.id(id);
  2850.         }
  2851.         this.handleElId = id;
  2852.         this.DDM.regHandle(this.id, id);
  2853.     },
  2854.     setOuterHandleElId: function(id) {
  2855.         if (typeof id !== "string") {
  2856.             id = Ext.id(id);
  2857.         }
  2858.         Event.on(id, "mousedown",
  2859.                 this.handleMouseDown, this);
  2860.         this.setHandleElId(id);
  2861.         this.hasOuterHandles = true;
  2862.     },
  2863.     unreg: function() {
  2864.         Event.un(this.id, "mousedown",
  2865.                 this.handleMouseDown);
  2866.         this._domRef = null;
  2867.         this.DDM._remove(this);
  2868.     },
  2869.     destroy : function(){
  2870.         this.unreg();
  2871.     },
  2872.     isLocked: function() {
  2873.         return (this.DDM.isLocked() || this.locked);
  2874.     },
  2875.     handleMouseDown: function(e, oDD){
  2876.         if (this.primaryButtonOnly && e.button != 0) {
  2877.             return;
  2878.         }
  2879.         if (this.isLocked()) {
  2880.             return;
  2881.         }
  2882.         this.DDM.refreshCache(this.groups);
  2883.         var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));
  2884.         if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) )  {
  2885.         } else {
  2886.             if (this.clickValidator(e)) {
  2887.                 this.setStartPosition();
  2888.                 this.b4MouseDown(e);
  2889.                 this.onMouseDown(e);
  2890.                 this.DDM.handleMouseDown(e, this);
  2891.                 this.DDM.stopEvent(e);
  2892.             } else {
  2893.             }
  2894.         }
  2895.     },
  2896.     clickValidator: function(e) {
  2897.         var target = e.getTarget();
  2898.         return ( this.isValidHandleChild(target) &&
  2899.                     (this.id == this.handleElId ||
  2900.                         this.DDM.handleWasClicked(target, this.id)) );
  2901.     },
  2902.     addInvalidHandleType: function(tagName) {
  2903.         var type = tagName.toUpperCase();
  2904.         this.invalidHandleTypes[type] = type;
  2905.     },
  2906.     addInvalidHandleId: function(id) {
  2907.         if (typeof id !== "string") {
  2908.             id = Ext.id(id);
  2909.         }
  2910.         this.invalidHandleIds[id] = id;
  2911.     },
  2912.     addInvalidHandleClass: function(cssClass) {
  2913.         this.invalidHandleClasses.push(cssClass);
  2914.     },
  2915.     removeInvalidHandleType: function(tagName) {
  2916.         var type = tagName.toUpperCase();
  2917.         delete this.invalidHandleTypes[type];
  2918.     },
  2919.     removeInvalidHandleId: function(id) {
  2920.         if (typeof id !== "string") {
  2921.             id = Ext.id(id);
  2922.         }
  2923.         delete this.invalidHandleIds[id];
  2924.     },
  2925.     removeInvalidHandleClass: function(cssClass) {
  2926.         for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
  2927.             if (this.invalidHandleClasses[i] == cssClass) {
  2928.                 delete this.invalidHandleClasses[i];
  2929.             }
  2930.         }
  2931.     },
  2932.     isValidHandleChild: function(node) {
  2933.         var valid = true;
  2934.         var nodeName;
  2935.         try {
  2936.             nodeName = node.nodeName.toUpperCase();
  2937.         } catch(e) {
  2938.             nodeName = node.nodeName;
  2939.         }
  2940.         valid = valid && !this.invalidHandleTypes[nodeName];
  2941.         valid = valid && !this.invalidHandleIds[node.id];
  2942.         for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
  2943.             valid = !Dom.hasClass(node, this.invalidHandleClasses[i]);
  2944.         }
  2945.         return valid;
  2946.     },
  2947.     setXTicks: function(iStartX, iTickSize) {
  2948.         this.xTicks = [];
  2949.         this.xTickSize = iTickSize;
  2950.         var tickMap = {};
  2951.         for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
  2952.             if (!tickMap[i]) {
  2953.                 this.xTicks[this.xTicks.length] = i;
  2954.                 tickMap[i] = true;
  2955.             }
  2956.         }
  2957.         for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
  2958.             if (!tickMap[i]) {
  2959.                 this.xTicks[this.xTicks.length] = i;
  2960.                 tickMap[i] = true;
  2961.             }
  2962.         }
  2963.         this.xTicks.sort(this.DDM.numericSort) ;
  2964.     },
  2965.     setYTicks: function(iStartY, iTickSize) {
  2966.         this.yTicks = [];
  2967.         this.yTickSize = iTickSize;
  2968.         var tickMap = {};
  2969.         for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
  2970.             if (!tickMap[i]) {
  2971.                 this.yTicks[this.yTicks.length] = i;
  2972.                 tickMap[i] = true;
  2973.             }
  2974.         }
  2975.         for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
  2976.             if (!tickMap[i]) {
  2977.                 this.yTicks[this.yTicks.length] = i;
  2978.                 tickMap[i] = true;
  2979.             }
  2980.         }
  2981.         this.yTicks.sort(this.DDM.numericSort) ;
  2982.     },
  2983.     setXConstraint: function(iLeft, iRight, iTickSize) {
  2984.         this.leftConstraint = iLeft;
  2985.         this.rightConstraint = iRight;
  2986.         this.minX = this.initPageX - iLeft;
  2987.         this.maxX = this.initPageX + iRight;
  2988.         if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
  2989.         this.constrainX = true;
  2990.     },
  2991.     clearConstraints: function() {
  2992.         this.constrainX = false;
  2993.         this.constrainY = false;
  2994.         this.clearTicks();
  2995.     },
  2996.     clearTicks: function() {
  2997.         this.xTicks = null;
  2998.         this.yTicks = null;
  2999.         this.xTickSize = 0;
  3000.         this.yTickSize = 0;
  3001.     },
  3002.     setYConstraint: function(iUp, iDown, iTickSize) {
  3003.         this.topConstraint = iUp;
  3004.         this.bottomConstraint = iDown;
  3005.         this.minY = this.initPageY - iUp;
  3006.         this.maxY = this.initPageY + iDown;
  3007.         if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
  3008.         this.constrainY = true;
  3009.     },
  3010.     resetConstraints: function() {
  3011.         if (this.initPageX || this.initPageX === 0) {
  3012.             var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
  3013.             var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
  3014.             this.setInitPosition(dx, dy);
  3015.         } else {
  3016.             this.setInitPosition();
  3017.         }
  3018.         if (this.constrainX) {
  3019.             this.setXConstraint( this.leftConstraint,
  3020.                                  this.rightConstraint,
  3021.                                  this.xTickSize        );
  3022.         }
  3023.         if (this.constrainY) {
  3024.             this.setYConstraint( this.topConstraint,
  3025.                                  this.bottomConstraint,
  3026.                                  this.yTickSize         );
  3027.         }
  3028.     },
  3029.     getTick: function(val, tickArray) {
  3030.         if (!tickArray) {
  3031.             return val;
  3032.         } else if (tickArray[0] >= val) {
  3033.             return tickArray[0];
  3034.         } else {
  3035.             for (var i=0, len=tickArray.length; i<len; ++i) {
  3036.                 var next = i + 1;
  3037.                 if (tickArray[next] && tickArray[next] >= val) {
  3038.                     var diff1 = val - tickArray[i];
  3039.                     var diff2 = tickArray[next] - val;
  3040.                     return (diff2 > diff1) ? tickArray[i] : tickArray[next];
  3041.                 }
  3042.             }
  3043.             return tickArray[tickArray.length - 1];
  3044.         }
  3045.     },
  3046.     toString: function() {
  3047.         return ("DragDrop " + this.id);
  3048.     }
  3049. };
  3050. })();
  3051. if (!Ext.dd.DragDropMgr) {
  3052. Ext.dd.DragDropMgr = function() {
  3053.     var Event = Ext.EventManager;
  3054.     return {
  3055.         ids: {},
  3056.         handleIds: {},
  3057.         dragCurrent: null,
  3058.         dragOvers: {},
  3059.         deltaX: 0,
  3060.         deltaY: 0,
  3061.         preventDefault: true,
  3062.         stopPropagation: true,
  3063.         initalized: false,
  3064.         locked: false,
  3065.         init: function() {
  3066.             this.initialized = true;
  3067.         },
  3068.         POINT: 0,
  3069.         INTERSECT: 1,
  3070.         mode: 0,
  3071.         _execOnAll: function(sMethod, args) {
  3072.             for (var i in this.ids) {
  3073.                 for (var j in this.ids[i]) {
  3074.                     var oDD = this.ids[i][j];
  3075.                     if (! this.isTypeOfDD(oDD)) {
  3076.                         continue;
  3077.                     }
  3078.                     oDD[sMethod].apply(oDD, args);
  3079.                 }
  3080.             }
  3081.         },
  3082.         _onLoad: function() {
  3083.             this.init();
  3084.             Event.on(document, "mouseup",   this.handleMouseUp, this, true);
  3085.             Event.on(document, "mousemove", this.handleMouseMove, this, true);
  3086.             Event.on(window,   "unload",    this._onUnload, this, true);
  3087.             Event.on(window,   "resize",    this._onResize, this, true);
  3088.         },
  3089.         _onResize: function(e) {
  3090.             this._execOnAll("resetConstraints", []);
  3091.         },
  3092.         lock: function() { this.locked = true; },
  3093.         unlock: function() { this.locked = false; },
  3094.         isLocked: function() { return this.locked; },
  3095.         locationCache: {},
  3096.         useCache: true,
  3097.         clickPixelThresh: 3,
  3098.         clickTimeThresh: 350,
  3099.         dragThreshMet: false,
  3100.         clickTimeout: null,
  3101.         startX: 0,
  3102.         startY: 0,
  3103.         regDragDrop: function(oDD, sGroup) {
  3104.             if (!this.initialized) { this.init(); }
  3105.             if (!this.ids[sGroup]) {
  3106.                 this.ids[sGroup] = {};
  3107.             }
  3108.             this.ids[sGroup][oDD.id] = oDD;
  3109.         },
  3110.         removeDDFromGroup: function(oDD, sGroup) {
  3111.             if (!this.ids[sGroup]) {
  3112.                 this.ids[sGroup] = {};
  3113.             }
  3114.             var obj = this.ids[sGroup];
  3115.             if (obj && obj[oDD.id]) {
  3116.                 delete obj[oDD.id];
  3117.             }
  3118.         },
  3119.         _remove: function(oDD) {
  3120.             for (var g in oDD.groups) {
  3121.                 if (g && this.ids[g][oDD.id]) {
  3122.                     delete this.ids[g][oDD.id];
  3123.                 }
  3124.             }
  3125.             delete this.handleIds[oDD.id];
  3126.         },
  3127.         regHandle: function(sDDId, sHandleId) {
  3128.             if (!this.handleIds[sDDId]) {
  3129.                 this.handleIds[sDDId] = {};
  3130.             }
  3131.             this.handleIds[sDDId][sHandleId] = sHandleId;
  3132.         },
  3133.         isDragDrop: function(id) {
  3134.             return ( this.getDDById(id) ) ? true : false;
  3135.         },
  3136.         getRelated: function(p_oDD, bTargetsOnly) {
  3137.             var oDDs = [];
  3138.             for (var i in p_oDD.groups) {
  3139.                 for (j in this.ids[i]) {
  3140.                     var dd = this.ids[i][j];
  3141.                     if (! this.isTypeOfDD(dd)) {
  3142.                         continue;
  3143.                     }
  3144.                     if (!bTargetsOnly || dd.isTarget) {
  3145.                         oDDs[oDDs.length] = dd;
  3146.                     }
  3147.                 }
  3148.             }
  3149.             return oDDs;
  3150.         },
  3151.         isLegalTarget: function (oDD, oTargetDD) {
  3152.             var targets = this.getRelated(oDD, true);
  3153.             for (var i=0, len=targets.length;i<len;++i) {
  3154.                 if (targets[i].id == oTargetDD.id) {
  3155.                     return true;
  3156.                 }
  3157.             }
  3158.             return false;
  3159.         },
  3160.         isTypeOfDD: function (oDD) {
  3161.             return (oDD && oDD.__ygDragDrop);
  3162.         },
  3163.         isHandle: function(sDDId, sHandleId) {
  3164.             return ( this.handleIds[sDDId] &&
  3165.                             this.handleIds[sDDId][sHandleId] );
  3166.         },
  3167.         getDDById: function(id) {
  3168.             for (var i in this.ids) {
  3169.                 if (this.ids[i][id]) {
  3170.                     return this.ids[i][id];
  3171.                 }
  3172.             }
  3173.             return null;
  3174.         },
  3175.         handleMouseDown: function(e, oDD) {
  3176.             if(Ext.QuickTips){
  3177.                 Ext.QuickTips.disable();
  3178.             }
  3179.             this.currentTarget = e.getTarget();
  3180.             this.dragCurrent = oDD;
  3181.             var el = oDD.getEl();
  3182.             this.startX = e.getPageX();
  3183.             this.startY = e.getPageY();
  3184.             this.deltaX = this.startX - el.offsetLeft;
  3185.             this.deltaY = this.startY - el.offsetTop;
  3186.             this.dragThreshMet = false;
  3187.             this.clickTimeout = setTimeout(
  3188.                     function() {
  3189.                         var DDM = Ext.dd.DDM;
  3190.                         DDM.startDrag(DDM.startX, DDM.startY);
  3191.                     },
  3192.                     this.clickTimeThresh );
  3193.         },
  3194.         startDrag: function(x, y) {
  3195.             clearTimeout(this.clickTimeout);
  3196.             if (this.dragCurrent) {
  3197.                 this.dragCurrent.b4StartDrag(x, y);
  3198.                 this.dragCurrent.startDrag(x, y);
  3199.             }
  3200.             this.dragThreshMet = true;
  3201.         },
  3202.         handleMouseUp: function(e) {
  3203.             if(Ext.QuickTips){
  3204.                 Ext.QuickTips.enable();
  3205.             }
  3206.             if (! this.dragCurrent) {
  3207.                 return;
  3208.             }
  3209.             clearTimeout(this.clickTimeout);
  3210.             if (this.dragThreshMet) {
  3211.                 this.fireEvents(e, true);
  3212.             } else {
  3213.             }
  3214.             this.stopDrag(e);
  3215.             this.stopEvent(e);
  3216.         },
  3217.         stopEvent: function(e){
  3218.             if(this.stopPropagation) {
  3219.                 e.stopPropagation();
  3220.             }
  3221.             if (this.preventDefault) {
  3222.                 e.preventDefault();
  3223.             }
  3224.         },
  3225.         stopDrag: function(e) {
  3226.             if (this.dragCurrent) {
  3227.                 if (this.dragThreshMet) {
  3228.                     this.dragCurrent.b4EndDrag(e);
  3229.                     this.dragCurrent.endDrag(e);
  3230.                 }
  3231.                 this.dragCurrent.onMouseUp(e);
  3232.             }
  3233.             this.dragCurrent = null;
  3234.             this.dragOvers = {};
  3235.         },
  3236.         handleMouseMove: function(e) {
  3237.             if (! this.dragCurrent) {
  3238.                 return true;
  3239.             }
  3240.             if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
  3241.                 this.stopEvent(e);
  3242.                 return this.handleMouseUp(e);
  3243.             }
  3244.             if (!this.dragThreshMet) {
  3245.                 var diffX = Math.abs(this.startX - e.getPageX());