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

JavaScript

开发平台:

JavaScript

  1.             csLen = cs.length;
  2.         
  3.         for (i = 0 ; i < csLen; i++) {
  4.             c = cs[i];
  5.             cm = c.margins;
  6.             margin = cm.top + cm.bottom;
  7.             maxWidth = Math.max(maxWidth, c.getWidth() + cm.left + cm.right);
  8.         }
  9.         var innerCtWidth = maxWidth + this.padding.left + this.padding.right;
  10.         switch(this.align){
  11.             case 'stretch':
  12.                 this.innerCt.setSize(w, h);
  13.                 break;
  14.             case 'stretchmax':
  15.             case 'left':
  16.                 this.innerCt.setSize(innerCtWidth, h);
  17.                 break;
  18.             case 'center':
  19.                 this.innerCt.setSize(w = Math.max(w, innerCtWidth), h);
  20.                 break;
  21.         }
  22.         var availableWidth = Math.max(0, w - this.padding.left - this.padding.right);
  23.         
  24.         for (i = 0 ; i < csLen; i++) {
  25.             c = cs[i];
  26.             cm = c.margins;
  27.             if(this.align == 'stretch'){
  28.                 c.setWidth((stretchWidth - (cm.left + cm.right)).constrain(
  29.                     c.minWidth || 0, c.maxWidth || 1000000));
  30.             }else if(this.align == 'stretchmax'){
  31.                 c.setWidth((maxWidth - (cm.left + cm.right)).constrain(
  32.                     c.minWidth || 0, c.maxWidth || 1000000));
  33.             }else if(isStart && c.flex){
  34.                 c.setWidth();
  35.             }
  36.         }
  37.         
  38.         for (i = 0 ; i < csLen; i++) {
  39.             c = cs[i];
  40.             cm = c.margins;
  41.             totalFlex += c.flex || 0;
  42.             ch = c.getHeight();
  43.             margin = cm.top + cm.bottom;
  44.             extraHeight += ch + margin;
  45.             flexHeight += margin + (c.flex ? 0 : ch);
  46.         }
  47.         extraHeight = h - extraHeight - this.padding.top - this.padding.bottom;
  48.         var availHeight = Math.max(0, h - this.padding.top - this.padding.bottom - flexHeight),
  49.             leftOver = availHeight;
  50.         for (i = 0 ; i < csLen; i++) {
  51.             c = cs[i];
  52.             if(isStart && c.flex){
  53.                 ch = Math.floor(availHeight * (c.flex / totalFlex));
  54.                 leftOver -= ch;
  55.                 heights.push(ch);
  56.             }
  57.         }
  58.         if(this.pack == 'center'){
  59.             t += extraHeight ? extraHeight / 2 : 0;
  60.         }else if(this.pack == 'end'){
  61.             t += extraHeight;
  62.         }
  63.         idx = 0;
  64.         
  65.         for (i = 0 ; i < csLen; i++) {
  66.             c = cs[i];
  67.             cm = c.margins;
  68.             t += cm.top;
  69.             aw = availableWidth;
  70.             cl = l + cm.left 
  71.             if(this.align == 'center'){
  72.                 if((diff = availableWidth - (c.getWidth() + cm.left + cm.right)) > 0){
  73.                     cl += (diff/2);
  74.                     aw -= diff;
  75.                 }
  76.             }
  77.             c.setPosition(cl, t);
  78.             if(isStart && c.flex){
  79.                 ch = Math.max(0, heights[idx++] + (leftOver-- > 0 ? 1 : 0));
  80.                 c.setSize(aw, ch);
  81.             }else{
  82.                 ch = c.getHeight();
  83.             }
  84.             t += ch + cm.bottom;
  85.         }
  86.     }
  87. });
  88. Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
  89. Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
  90.     
  91.     align : 'top', 
  92.     
  93.     
  94.     
  95.     onLayout : function(ct, target){
  96.         Ext.layout.HBoxLayout.superclass.onLayout.call(this, ct, target);
  97.         var cs = this.getItems(ct), cm, cw, margin, ch, diff,
  98.             size = target.getViewSize(true),
  99.             w = size.width - this.scrollOffset,
  100.             h = size.height,
  101.             l = this.padding.left, t = this.padding.top,
  102.             isStart = this.pack == 'start',
  103.             isRestore = ['stretch', 'stretchmax'].indexOf(this.align) == -1,
  104.             stretchHeight = h - (this.padding.top + this.padding.bottom),
  105.             extraWidth = 0,
  106.             maxHeight = 0,
  107.             totalFlex = 0,
  108.             flexWidth = 0,
  109.             usedWidth = 0;
  110.         Ext.each(cs, function(c){
  111.             cm = c.margins;
  112.             totalFlex += c.flex || 0;
  113.             cw = c.getWidth();
  114.             margin = cm.left + cm.right;
  115.             extraWidth += cw + margin;
  116.             flexWidth += margin + (c.flex ? 0 : cw);
  117.             maxHeight = Math.max(maxHeight, c.getHeight() + cm.top + cm.bottom);
  118.         });
  119.         extraWidth = w - extraWidth - this.padding.left - this.padding.right;
  120.         var innerCtHeight = maxHeight + this.padding.top + this.padding.bottom;
  121.         switch(this.align){
  122.             case 'stretch':
  123.                 this.innerCt.setSize(w, h);
  124.                 break;
  125.             case 'stretchmax':
  126.             case 'top':
  127.                 this.innerCt.setSize(w, innerCtHeight);
  128.                 break;
  129.             case 'middle':
  130.                 this.innerCt.setSize(w, h = Math.max(h, innerCtHeight));
  131.                 break;
  132.         }
  133.         var availWidth = Math.max(0, w - this.padding.left - this.padding.right - flexWidth),
  134.             leftOver = availWidth,
  135.             widths = [],
  136.             restore = [],
  137.             idx = 0,
  138.             availableHeight = Math.max(0, h - this.padding.top - this.padding.bottom);
  139.         Ext.each(cs, function(c){
  140.             if(isStart && c.flex){
  141.                 cw = Math.floor(availWidth * (c.flex / totalFlex));
  142.                 leftOver -= cw;
  143.                 widths.push(cw);
  144.             }
  145.         });
  146.         if(this.pack == 'center'){
  147.             l += extraWidth ? extraWidth / 2 : 0;
  148.         }else if(this.pack == 'end'){
  149.             l += extraWidth;
  150.         }
  151.         Ext.each(cs, function(c){
  152.             cm = c.margins;
  153.             l += cm.left;
  154.             c.setPosition(l, t + cm.top);
  155.             if(isStart && c.flex){
  156.                 cw = Math.max(0, widths[idx++] + (leftOver-- > 0 ? 1 : 0));
  157.                 if(isRestore){
  158.                     restore.push(c.getHeight());
  159.                 }
  160.                 c.setSize(cw, availableHeight);
  161.             }else{
  162.                 cw = c.getWidth();
  163.             }
  164.             l += cw + cm.right;
  165.         });
  166.         idx = 0;
  167.         Ext.each(cs, function(c){
  168.             cm = c.margins;
  169.             ch = c.getHeight();
  170.             if(isStart && c.flex){
  171.                 ch = restore[idx++];
  172.             }
  173.             if(this.align == 'stretch'){
  174.                 c.setHeight((stretchHeight - (cm.top + cm.bottom)).constrain(
  175.                     c.minHeight || 0, c.maxHeight || 1000000));
  176.             }else if(this.align == 'stretchmax'){
  177.                 c.setHeight((maxHeight - (cm.top + cm.bottom)).constrain(
  178.                     c.minHeight || 0, c.maxHeight || 1000000));
  179.             }else{
  180.                 if(this.align == 'middle'){
  181.                     diff = availableHeight - (ch + cm.top + cm.bottom);
  182.                     ch = t + cm.top + (diff/2);
  183.                     if(diff > 0){
  184.                         c.setPosition(c.x, ch);
  185.                     }
  186.                 }
  187.                 if(isStart && c.flex){
  188.                     c.setHeight(ch);
  189.                 }
  190.             }
  191.         }, this);
  192.     }
  193. });
  194. Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout;
  195. Ext.Viewport = Ext.extend(Ext.Container, {
  196.     
  197.     
  198.     
  199.     
  200.     
  201.     
  202.     
  203.     
  204.     
  205.     
  206.     
  207.     
  208.     initComponent : function() {
  209.         Ext.Viewport.superclass.initComponent.call(this);
  210.         document.getElementsByTagName('html')[0].className += ' x-viewport';
  211.         this.el = Ext.getBody();
  212.         this.el.setHeight = Ext.emptyFn;
  213.         this.el.setWidth = Ext.emptyFn;
  214.         this.el.setSize = Ext.emptyFn;
  215.         this.el.dom.scroll = 'no';
  216.         this.allowDomMove = false;
  217.         this.autoWidth = true;
  218.         this.autoHeight = true;
  219.         Ext.EventManager.onWindowResize(this.fireResize, this);
  220.         this.renderTo = this.el;
  221.     },
  222.     fireResize : function(w, h){
  223.         this.onResize(w, h, w, h);
  224.     }
  225. });
  226. Ext.reg('viewport', Ext.Viewport);
  227. Ext.Panel = Ext.extend(Ext.Container, {
  228.     
  229.     
  230.     
  231.     
  232.     
  233.     
  234.     
  235.     
  236.     
  237.     
  238.     
  239.     
  240.     
  241.     
  242.     
  243.     
  244.     
  245.     
  246.     
  247.     
  248.     
  249.     
  250.     
  251.     
  252.     
  253.     
  254.     
  255.     
  256.     
  257.     
  258.     
  259.     
  260.     
  261.     
  262.     
  263.     
  264.     
  265.     
  266.     
  267.     
  268.     
  269.     baseCls : 'x-panel',
  270.     
  271.     collapsedCls : 'x-panel-collapsed',
  272.     
  273.     maskDisabled : true,
  274.     
  275.     animCollapse : Ext.enableFx,
  276.     
  277.     headerAsText : true,
  278.     
  279.     buttonAlign : 'right',
  280.     
  281.     collapsed : false,
  282.     
  283.     collapseFirst : true,
  284.     
  285.     minButtonWidth : 75,
  286.     
  287.     
  288.     elements : 'body',
  289.     
  290.     preventBodyReset : false,
  291.     
  292.     padding: undefined,
  293.     
  294.     resizeEvent: 'bodyresize',
  295.     
  296.     
  297.     
  298.     toolTarget : 'header',
  299.     collapseEl : 'bwrap',
  300.     slideAnchor : 't',
  301.     disabledClass : '',
  302.     
  303.     deferHeight : true,
  304.     
  305.     expandDefaults: {
  306.         duration : 0.25
  307.     },
  308.     
  309.     collapseDefaults : {
  310.         duration : 0.25
  311.     },
  312.     
  313.     initComponent : function(){
  314.         Ext.Panel.superclass.initComponent.call(this);
  315.         this.addEvents(
  316.             
  317.             'bodyresize',
  318.             
  319.             'titlechange',
  320.             
  321.             'iconchange',
  322.             
  323.             'collapse',
  324.             
  325.             'expand',
  326.             
  327.             'beforecollapse',
  328.             
  329.             'beforeexpand',
  330.             
  331.             'beforeclose',
  332.             
  333.             'close',
  334.             
  335.             'activate',
  336.             
  337.             'deactivate'
  338.         );
  339.         if(this.unstyled){
  340.             this.baseCls = 'x-plain';
  341.         }
  342.         this.toolbars = [];
  343.         
  344.         if(this.tbar){
  345.             this.elements += ',tbar';
  346.             this.topToolbar = this.createToolbar(this.tbar);
  347.             delete this.tbar;
  348.         }
  349.         if(this.bbar){
  350.             this.elements += ',bbar';
  351.             this.bottomToolbar = this.createToolbar(this.bbar);
  352.             delete this.bbar;
  353.         }
  354.         if(this.header === true){
  355.             this.elements += ',header';
  356.             delete this.header;
  357.         }else if(this.headerCfg || (this.title && this.header !== false)){
  358.             this.elements += ',header';
  359.         }
  360.         if(this.footerCfg || this.footer === true){
  361.             this.elements += ',footer';
  362.             delete this.footer;
  363.         }
  364.         if(this.buttons){
  365.             this.fbar = this.buttons;
  366.             delete this.buttons;
  367.         }
  368.         if(this.fbar){
  369.             this.createFbar(this.fbar);
  370.         }
  371.         if(this.autoLoad){
  372.             this.on('render', this.doAutoLoad, this, {delay:10});
  373.         }
  374.     },
  375.     
  376.     createFbar : function(fbar){
  377.         var min = this.minButtonWidth;
  378.         this.elements += ',footer';
  379.         this.fbar = this.createToolbar(fbar, {
  380.             buttonAlign: this.buttonAlign,
  381.             toolbarCls: 'x-panel-fbar',
  382.             enableOverflow: false,
  383.             defaults: function(c){
  384.                 return {
  385.                     minWidth: c.minWidth || min
  386.                 };
  387.             }
  388.         });
  389.         //@compat addButton and buttons could possibly be removed
  390.         //@target 4.0
  391.         
  392.         this.fbar.items.each(function(c){
  393.             c.minWidth = c.minWidth || this.minButtonWidth;
  394.         }, this);
  395.         this.buttons = this.fbar.items.items;
  396.     },
  397.     
  398.     createToolbar: function(tb, options){
  399.         var result;
  400.         
  401.         if(Ext.isArray(tb)){
  402.             tb = {
  403.                 items: tb
  404.             };
  405.         }
  406.         result = tb.events ? Ext.apply(tb, options) : this.createComponent(Ext.apply({}, tb, options), 'toolbar');
  407.         result.ownerCt = this;
  408.         result.bufferResize = false;
  409.         this.toolbars.push(result);
  410.         return result;
  411.     },
  412.     
  413.     createElement : function(name, pnode){
  414.         if(this[name]){
  415.             pnode.appendChild(this[name].dom);
  416.             return;
  417.         }
  418.         if(name === 'bwrap' || this.elements.indexOf(name) != -1){
  419.             if(this[name+'Cfg']){
  420.                 this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
  421.             }else{
  422.                 var el = document.createElement('div');
  423.                 el.className = this[name+'Cls'];
  424.                 this[name] = Ext.get(pnode.appendChild(el));
  425.             }
  426.             if(this[name+'CssClass']){
  427.                 this[name].addClass(this[name+'CssClass']);
  428.             }
  429.             if(this[name+'Style']){
  430.                 this[name].applyStyles(this[name+'Style']);
  431.             }
  432.         }
  433.     },
  434.     
  435.     onRender : function(ct, position){
  436.         Ext.Panel.superclass.onRender.call(this, ct, position);
  437.         this.createClasses();
  438.         var el = this.el,
  439.             d = el.dom,
  440.             bw,
  441.             ts;
  442.         if(this.collapsible && !this.hideCollapseTool){
  443.             this.tools = this.tools ? this.tools.slice(0) : [];
  444.             this.tools[this.collapseFirst?'unshift':'push']({
  445.                 id: 'toggle',
  446.                 handler : this.toggleCollapse,
  447.                 scope: this
  448.             });
  449.         }
  450.         if(this.tools){
  451.             ts = this.tools;
  452.             this.elements += (this.header !== false) ? ',header' : '';
  453.         }
  454.         this.tools = {};
  455.         el.addClass(this.baseCls);
  456.         if(d.firstChild){ 
  457.             this.header = el.down('.'+this.headerCls);
  458.             this.bwrap = el.down('.'+this.bwrapCls);
  459.             var cp = this.bwrap ? this.bwrap : el;
  460.             this.tbar = cp.down('.'+this.tbarCls);
  461.             this.body = cp.down('.'+this.bodyCls);
  462.             this.bbar = cp.down('.'+this.bbarCls);
  463.             this.footer = cp.down('.'+this.footerCls);
  464.             this.fromMarkup = true;
  465.         }
  466.         if (this.preventBodyReset === true) {
  467.             el.addClass('x-panel-reset');
  468.         }
  469.         if(this.cls){
  470.             el.addClass(this.cls);
  471.         }
  472.         if(this.buttons){
  473.             this.elements += ',footer';
  474.         }
  475.         
  476.         
  477.         if(this.frame){
  478.             el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
  479.             this.createElement('header', d.firstChild.firstChild.firstChild);
  480.             this.createElement('bwrap', d);
  481.             
  482.             bw = this.bwrap.dom;
  483.             var ml = d.childNodes[1], bl = d.childNodes[2];
  484.             bw.appendChild(ml);
  485.             bw.appendChild(bl);
  486.             var mc = bw.firstChild.firstChild.firstChild;
  487.             this.createElement('tbar', mc);
  488.             this.createElement('body', mc);
  489.             this.createElement('bbar', mc);
  490.             this.createElement('footer', bw.lastChild.firstChild.firstChild);
  491.             if(!this.footer){
  492.                 this.bwrap.dom.lastChild.className += ' x-panel-nofooter';
  493.             }
  494.             
  495.             this.ft = Ext.get(this.bwrap.dom.lastChild);
  496.             this.mc = Ext.get(mc);
  497.         }else{
  498.             this.createElement('header', d);
  499.             this.createElement('bwrap', d);
  500.             
  501.             bw = this.bwrap.dom;
  502.             this.createElement('tbar', bw);
  503.             this.createElement('body', bw);
  504.             this.createElement('bbar', bw);
  505.             this.createElement('footer', bw);
  506.             if(!this.header){
  507.                 this.body.addClass(this.bodyCls + '-noheader');
  508.                 if(this.tbar){
  509.                     this.tbar.addClass(this.tbarCls + '-noheader');
  510.                 }
  511.             }
  512.         }
  513.         if(Ext.isDefined(this.padding)){
  514.             this.body.setStyle('padding', this.body.addUnits(this.padding));
  515.         }
  516.         if(this.border === false){
  517.             this.el.addClass(this.baseCls + '-noborder');
  518.             this.body.addClass(this.bodyCls + '-noborder');
  519.             if(this.header){
  520.                 this.header.addClass(this.headerCls + '-noborder');
  521.             }
  522.             if(this.footer){
  523.                 this.footer.addClass(this.footerCls + '-noborder');
  524.             }
  525.             if(this.tbar){
  526.                 this.tbar.addClass(this.tbarCls + '-noborder');
  527.             }
  528.             if(this.bbar){
  529.                 this.bbar.addClass(this.bbarCls + '-noborder');
  530.             }
  531.         }
  532.         if(this.bodyBorder === false){
  533.            this.body.addClass(this.bodyCls + '-noborder');
  534.         }
  535.         this.bwrap.enableDisplayMode('block');
  536.         if(this.header){
  537.             this.header.unselectable();
  538.             
  539.             if(this.headerAsText){
  540.                 this.header.dom.innerHTML =
  541.                     '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
  542.                 if(this.iconCls){
  543.                     this.setIconClass(this.iconCls);
  544.                 }
  545.             }
  546.         }
  547.         if(this.floating){
  548.             this.makeFloating(this.floating);
  549.         }
  550.         if(this.collapsible && this.titleCollapse && this.header){
  551.             this.mon(this.header, 'click', this.toggleCollapse, this);
  552.             this.header.setStyle('cursor', 'pointer');
  553.         }
  554.         if(ts){
  555.             this.addTool.apply(this, ts);
  556.         }
  557.         if(this.fbar){
  558.             this.footer.addClass('x-panel-btns');
  559.             this.fbar.render(this.footer);
  560.             this.footer.createChild({cls:'x-clear'});
  561.         }
  562.         if(this.tbar && this.topToolbar){
  563.             this.topToolbar.render(this.tbar);
  564.         }
  565.         if(this.bbar && this.bottomToolbar){
  566.             this.bottomToolbar.render(this.bbar);
  567.         }
  568.     },
  569.     
  570.     setIconClass : function(cls){
  571.         var old = this.iconCls;
  572.         this.iconCls = cls;
  573.         if(this.rendered && this.header){
  574.             if(this.frame){
  575.                 this.header.addClass('x-panel-icon');
  576.                 this.header.replaceClass(old, this.iconCls);
  577.             }else{
  578.                 var hd = this.header,
  579.                     img = hd.child('img.x-panel-inline-icon');
  580.                 if(img){
  581.                     Ext.fly(img).replaceClass(old, this.iconCls);
  582.                 }else{
  583.                     Ext.DomHelper.insertBefore(hd.dom.firstChild, {
  584.                         tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls
  585.                     });
  586.                  }
  587.             }
  588.         }
  589.         this.fireEvent('iconchange', this, cls, old);
  590.     },
  591.     
  592.     makeFloating : function(cfg){
  593.         this.floating = true;
  594.         this.el = new Ext.Layer(Ext.apply({}, cfg, {
  595.             shadow: Ext.isDefined(this.shadow) ? this.shadow : 'sides',
  596.             shadowOffset: this.shadowOffset,
  597.             constrain:false,
  598.             shim: this.shim === false ? false : undefined
  599.         }), this.el);
  600.     },
  601.     
  602.     getTopToolbar : function(){
  603.         return this.topToolbar;
  604.     },
  605.     
  606.     getBottomToolbar : function(){
  607.         return this.bottomToolbar;
  608.     },
  609.     
  610.     addButton : function(config, handler, scope){
  611.         if(!this.fbar){
  612.             this.createFbar([]);
  613.         }
  614.         if(handler){
  615.             if(Ext.isString(config)){
  616.                 config = {text: config};
  617.             }
  618.             config = Ext.apply({
  619.                 handler: handler,
  620.                 scope: scope
  621.             }, config)
  622.         }
  623.         return this.fbar.add(config);
  624.     },
  625.     
  626.     addTool : function(){
  627.         if(!this.rendered){
  628.             if(!this.tools){
  629.                 this.tools = [];
  630.             }
  631.             Ext.each(arguments, function(arg){
  632.                 this.tools.push(arg)
  633.             }, this);
  634.             return;
  635.         }
  636.          
  637.         if(!this[this.toolTarget]){
  638.             return;
  639.         }
  640.         if(!this.toolTemplate){
  641.             
  642.             var tt = new Ext.Template(
  643.                  '<div class="x-tool x-tool-{id}">&#160;</div>'
  644.             );
  645.             tt.disableFormats = true;
  646.             tt.compile();
  647.             Ext.Panel.prototype.toolTemplate = tt;
  648.         }
  649.         for(var i = 0, a = arguments, len = a.length; i < len; i++) {
  650.             var tc = a[i];
  651.             if(!this.tools[tc.id]){
  652.                 var overCls = 'x-tool-'+tc.id+'-over';
  653.                 var t = this.toolTemplate.insertFirst((tc.align !== 'left') ? this[this.toolTarget] : this[this.toolTarget].child('span'), tc, true);
  654.                 this.tools[tc.id] = t;
  655.                 t.enableDisplayMode('block');
  656.                 this.mon(t, 'click',  this.createToolHandler(t, tc, overCls, this));
  657.                 if(tc.on){
  658.                     this.mon(t, tc.on);
  659.                 }
  660.                 if(tc.hidden){
  661.                     t.hide();
  662.                 }
  663.                 if(tc.qtip){
  664.                     if(Ext.isObject(tc.qtip)){
  665.                         Ext.QuickTips.register(Ext.apply({
  666.                               target: t.id
  667.                         }, tc.qtip));
  668.                     } else {
  669.                         t.dom.qtip = tc.qtip;
  670.                     }
  671.                 }
  672.                 t.addClassOnOver(overCls);
  673.             }
  674.         }
  675.     },
  676.     onLayout : function(shallow, force){
  677.         if(this.hasLayout && this.toolbars.length > 0){
  678.             Ext.each(this.toolbars, function(tb){
  679.                 tb.doLayout(undefined, force);
  680.             });
  681.             this.syncHeight();
  682.         }
  683.     },
  684.     syncHeight : function(){
  685.         var h = this.toolbarHeight,
  686.                 bd = this.body,
  687.                 lsh = this.lastSize.height,
  688.                 sz;
  689.         if(this.autoHeight || !Ext.isDefined(lsh) || lsh == 'auto'){
  690.             return;
  691.         }
  692.         if(h != this.getToolbarHeight()){
  693.             h = Math.max(0, this.adjustBodyHeight(lsh - this.getFrameHeight()));
  694.             bd.setHeight(h);
  695.             sz = bd.getSize();
  696.             this.toolbarHeight = this.getToolbarHeight();
  697.             this.onBodyResize(sz.width, sz.height);
  698.         }
  699.     },
  700.     
  701.     onShow : function(){
  702.         if(this.floating){
  703.             return this.el.show();
  704.         }
  705.         Ext.Panel.superclass.onShow.call(this);
  706.     },
  707.     
  708.     onHide : function(){
  709.         if(this.floating){
  710.             return this.el.hide();
  711.         }
  712.         Ext.Panel.superclass.onHide.call(this);
  713.     },
  714.     
  715.     createToolHandler : function(t, tc, overCls, panel){
  716.         return function(e){
  717.             t.removeClass(overCls);
  718.             if(tc.stopEvent !== false){
  719.                 e.stopEvent();
  720.             }
  721.             if(tc.handler){
  722.                 tc.handler.call(tc.scope || t, e, t, panel, tc);
  723.             }
  724.         };
  725.     },
  726.     
  727.     afterRender : function(){
  728.         if(this.floating && !this.hidden){
  729.             this.el.show();
  730.         }
  731.         if(this.title){
  732.             this.setTitle(this.title);
  733.         }
  734.         if(this.collapsed){
  735.             this.collapsed = false;
  736.             this.collapse(false);
  737.         }
  738.         Ext.Panel.superclass.afterRender.call(this); 
  739.         this.initEvents();
  740.     },    
  741.     
  742.     getKeyMap : function(){
  743.         if(!this.keyMap){
  744.             this.keyMap = new Ext.KeyMap(this.el, this.keys);
  745.         }
  746.         return this.keyMap;
  747.     },
  748.     
  749.     initEvents : function(){
  750.         if(this.keys){
  751.             this.getKeyMap();
  752.         }
  753.         if(this.draggable){
  754.             this.initDraggable();
  755.         }
  756.         if(this.toolbars.length > 0){
  757.             Ext.each(this.toolbars, function(tb){
  758.                 tb.doLayout();
  759.                 tb.on({
  760.                     scope: this,
  761.                     afterlayout: this.syncHeight,
  762.                     remove: this.syncHeight
  763.                 });
  764.             }, this);
  765.             if(!this.ownerCt){
  766.                 this.syncHeight();
  767.             }
  768.         }
  769.     },
  770.     
  771.     initDraggable : function(){
  772.         
  773.         this.dd = new Ext.Panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable);
  774.     },
  775.     
  776.     beforeEffect : function(anim){
  777.         if(this.floating){
  778.             this.el.beforeAction();
  779.         }
  780.         if(anim !== false){
  781.             this.el.addClass('x-panel-animated');
  782.         }
  783.     },
  784.     
  785.     afterEffect : function(anim){
  786.         this.syncShadow();
  787.         if(anim !== false){
  788.             this.el.removeClass('x-panel-animated');
  789.         }
  790.     },
  791.     
  792.     createEffect : function(a, cb, scope){
  793.         var o = {
  794.             scope:scope,
  795.             block:true
  796.         };
  797.         if(a === true){
  798.             o.callback = cb;
  799.             return o;
  800.         }else if(!a.callback){
  801.             o.callback = cb;
  802.         }else { 
  803.             o.callback = function(){
  804.                 cb.call(scope);
  805.                 Ext.callback(a.callback, a.scope);
  806.             };
  807.         }
  808.         return Ext.applyIf(o, a);
  809.     },
  810.     
  811.     collapse : function(animate){
  812.         if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
  813.             return;
  814.         }
  815.         var doAnim = animate === true || (animate !== false && this.animCollapse);
  816.         this.beforeEffect(doAnim);
  817.         this.onCollapse(doAnim, animate);
  818.         return this;
  819.     },
  820.     
  821.     onCollapse : function(doAnim, animArg){
  822.         if(doAnim){
  823.             this[this.collapseEl].slideOut(this.slideAnchor,
  824.                     Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),
  825.                         this.collapseDefaults));
  826.         }else{
  827.             this[this.collapseEl].hide();
  828.             this.afterCollapse(false);
  829.         }
  830.     },
  831.     
  832.     afterCollapse : function(anim){
  833.         this.collapsed = true;
  834.         this.el.addClass(this.collapsedCls);
  835.         this.afterEffect(anim);
  836.         this.fireEvent('collapse', this);
  837.     },
  838.     
  839.     expand : function(animate){
  840.         if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
  841.             return;
  842.         }
  843.         var doAnim = animate === true || (animate !== false && this.animCollapse);
  844.         this.el.removeClass(this.collapsedCls);
  845.         this.beforeEffect(doAnim);
  846.         this.onExpand(doAnim, animate);
  847.         return this;
  848.     },
  849.     
  850.     onExpand : function(doAnim, animArg){
  851.         if(doAnim){
  852.             this[this.collapseEl].slideIn(this.slideAnchor,
  853.                     Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),
  854.                         this.expandDefaults));
  855.         }else{
  856.             this[this.collapseEl].show();
  857.             this.afterExpand(false);
  858.         }
  859.     },
  860.     
  861.     afterExpand : function(anim){
  862.         this.collapsed = false;
  863.         this.afterEffect(anim);
  864.         if(Ext.isDefined(this.deferLayout)){
  865.             this.doLayout(true);
  866.         }
  867.         this.fireEvent('expand', this);
  868.     },
  869.     
  870.     toggleCollapse : function(animate){
  871.         this[this.collapsed ? 'expand' : 'collapse'](animate);
  872.         return this;
  873.     },
  874.     
  875.     onDisable : function(){
  876.         if(this.rendered && this.maskDisabled){
  877.             this.el.mask();
  878.         }
  879.         Ext.Panel.superclass.onDisable.call(this);
  880.     },
  881.     
  882.     onEnable : function(){
  883.         if(this.rendered && this.maskDisabled){
  884.             this.el.unmask();
  885.         }
  886.         Ext.Panel.superclass.onEnable.call(this);
  887.     },
  888.     
  889.     onResize : function(w, h){
  890.         if(Ext.isDefined(w) || Ext.isDefined(h)){
  891.             if(!this.collapsed){
  892.                 
  893.                 
  894.                 
  895.                 if(Ext.isNumber(w)){
  896.                     this.body.setWidth(w = this.adjustBodyWidth(w - this.getFrameWidth()));
  897.                 } else if (w == 'auto') {
  898.                     w = this.body.setWidth('auto').dom.offsetWidth;
  899.                 } else {
  900.                     w = this.body.dom.offsetWidth;
  901.                 }
  902.                 if(this.tbar){
  903.                     this.tbar.setWidth(w);
  904.                     if(this.topToolbar){
  905.                         this.topToolbar.setSize(w);
  906.                     }
  907.                 }
  908.                 if(this.bbar){
  909.                     this.bbar.setWidth(w);
  910.                     if(this.bottomToolbar){
  911.                         this.bottomToolbar.setSize(w);
  912.                         
  913.                         if (Ext.isIE) {
  914.                             this.bbar.setStyle('position', 'static');
  915.                             this.bbar.setStyle('position', '');
  916.                         }
  917.                     }
  918.                 }
  919.                 if(this.footer){
  920.                     this.footer.setWidth(w);
  921.                     if(this.fbar){
  922.                         this.fbar.setSize(Ext.isIE ? (w - this.footer.getFrameWidth('lr')) : 'auto');
  923.                     }
  924.                 }
  925.                 
  926.                 if(Ext.isNumber(h)){
  927.                     h = Math.max(0, this.adjustBodyHeight(h - this.getFrameHeight()));
  928.                     this.body.setHeight(h);
  929.                 }else if(h == 'auto'){
  930.                     this.body.setHeight(h);
  931.                 }
  932.                 if(this.disabled && this.el._mask){
  933.                     this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());
  934.                 }
  935.             }else{
  936.                 this.queuedBodySize = {width: w, height: h};
  937.                 if(!this.queuedExpand && this.allowQueuedExpand !== false){
  938.                     this.queuedExpand = true;
  939.                     this.on('expand', function(){
  940.                         delete this.queuedExpand;
  941.                         this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
  942.                     }, this, {single:true});
  943.                 }
  944.             }
  945.             this.onBodyResize(w, h);
  946.         }
  947.         this.syncShadow();
  948.         Ext.Panel.superclass.onResize.call(this);
  949.     },
  950.     
  951.     onBodyResize: function(w, h){
  952.         this.fireEvent('bodyresize', this, w, h);
  953.     },
  954.     
  955.     getToolbarHeight: function(){
  956.         var h = 0;
  957.         if(this.rendered){
  958.             Ext.each(this.toolbars, function(tb){
  959.                 h += tb.getHeight();
  960.             }, this);
  961.         }
  962.         return h;
  963.     },
  964.     
  965.     adjustBodyHeight : function(h){
  966.         return h;
  967.     },
  968.     
  969.     adjustBodyWidth : function(w){
  970.         return w;
  971.     },
  972.     
  973.     onPosition : function(){
  974.         this.syncShadow();
  975.     },
  976.     
  977.     getFrameWidth : function(){
  978.         var w = this.el.getFrameWidth('lr') + this.bwrap.getFrameWidth('lr');
  979.         if(this.frame){
  980.             var l = this.bwrap.dom.firstChild;
  981.             w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
  982.             w += this.mc.getFrameWidth('lr');
  983.         }
  984.         return w;
  985.     },
  986.     
  987.     getFrameHeight : function(){
  988.         var h  = this.el.getFrameWidth('tb') + this.bwrap.getFrameWidth('tb');
  989.         h += (this.tbar ? this.tbar.getHeight() : 0) +
  990.              (this.bbar ? this.bbar.getHeight() : 0);
  991.         if(this.frame){
  992.             h += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight + this.mc.getFrameWidth('tb');
  993.         }else{
  994.             h += (this.header ? this.header.getHeight() : 0) +
  995.                 (this.footer ? this.footer.getHeight() : 0);
  996.         }
  997.         return h;
  998.     },
  999.     
  1000.     getInnerWidth : function(){
  1001.         return this.getSize().width - this.getFrameWidth();
  1002.     },
  1003.     
  1004.     getInnerHeight : function(){
  1005.         return this.getSize().height - this.getFrameHeight();
  1006.     },
  1007.     
  1008.     syncShadow : function(){
  1009.         if(this.floating){
  1010.             this.el.sync(true);
  1011.         }
  1012.     },
  1013.     
  1014.     getLayoutTarget : function(){
  1015.         return this.body;
  1016.     },
  1017.     
  1018.     getContentTarget : function(){
  1019.         return this.body;
  1020.     },
  1021.     
  1022.     setTitle : function(title, iconCls){
  1023.         this.title = title;
  1024.         if(this.header && this.headerAsText){
  1025.             this.header.child('span').update(title);
  1026.         }
  1027.         if(iconCls){
  1028.             this.setIconClass(iconCls);
  1029.         }
  1030.         this.fireEvent('titlechange', this, title);
  1031.         return this;
  1032.     },
  1033.     
  1034.     getUpdater : function(){
  1035.         return this.body.getUpdater();
  1036.     },
  1037.      
  1038.     load : function(){
  1039.         var um = this.body.getUpdater();
  1040.         um.update.apply(um, arguments);
  1041.         return this;
  1042.     },
  1043.     
  1044.     beforeDestroy : function(){
  1045.         Ext.Panel.superclass.beforeDestroy.call(this);
  1046.         if(this.header){
  1047.             this.header.removeAllListeners();
  1048.         }
  1049.         if(this.tools){
  1050.             for(var k in this.tools){
  1051.                 Ext.destroy(this.tools[k]);
  1052.             }
  1053.         }
  1054.         if(Ext.isArray(this.buttons)){
  1055.             while(this.buttons.length) {
  1056.                 Ext.destroy(this.buttons[0]);
  1057.             }
  1058.         }
  1059.         if(this.rendered){
  1060.             Ext.destroy(
  1061.                 this.ft,
  1062.                 this.header,
  1063.                 this.footer,
  1064.                 this.toolbars,
  1065.                 this.tbar,
  1066.                 this.bbar,
  1067.                 this.body,
  1068.                 this.mc,
  1069.                 this.bwrap
  1070.             );
  1071.             if (this.fbar) {
  1072.                 Ext.destroy(
  1073.                     this.fbar,
  1074.                     this.fbar.el
  1075.                 );
  1076.             }
  1077.         }else{
  1078.             Ext.destroy(
  1079.                 this.topToolbar,
  1080.                 this.bottomToolbar
  1081.             );
  1082.         }
  1083.     },
  1084.     
  1085.     createClasses : function(){
  1086.         this.headerCls = this.baseCls + '-header';
  1087.         this.headerTextCls = this.baseCls + '-header-text';
  1088.         this.bwrapCls = this.baseCls + '-bwrap';
  1089.         this.tbarCls = this.baseCls + '-tbar';
  1090.         this.bodyCls = this.baseCls + '-body';
  1091.         this.bbarCls = this.baseCls + '-bbar';
  1092.         this.footerCls = this.baseCls + '-footer';
  1093.     },
  1094.     
  1095.     createGhost : function(cls, useShim, appendTo){
  1096.         var el = document.createElement('div');
  1097.         el.className = 'x-panel-ghost ' + (cls ? cls : '');
  1098.         if(this.header){
  1099.             el.appendChild(this.el.dom.firstChild.cloneNode(true));
  1100.         }
  1101.         Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());
  1102.         el.style.width = this.el.dom.offsetWidth + 'px';;
  1103.         if(!appendTo){
  1104.             this.container.dom.appendChild(el);
  1105.         }else{
  1106.             Ext.getDom(appendTo).appendChild(el);
  1107.         }
  1108.         if(useShim !== false && this.el.useShim !== false){
  1109.             var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
  1110.             layer.show();
  1111.             return layer;
  1112.         }else{
  1113.             return new Ext.Element(el);
  1114.         }
  1115.     },
  1116.     
  1117.     doAutoLoad : function(){
  1118.         var u = this.body.getUpdater();
  1119.         if(this.renderer){
  1120.             u.setRenderer(this.renderer);
  1121.         }
  1122.         u.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad});
  1123.     },
  1124.     
  1125.     getTool : function(id) {
  1126.         return this.tools[id];
  1127.     }
  1128. });
  1129. Ext.reg('panel', Ext.Panel);
  1130. Ext.Editor = function(field, config){
  1131.     if(field.field){
  1132.         this.field = Ext.create(field.field, 'textfield');
  1133.         config = Ext.apply({}, field); 
  1134.         delete config.field;
  1135.     }else{
  1136.         this.field = field;
  1137.     }
  1138.     Ext.Editor.superclass.constructor.call(this, config);
  1139. };
  1140. Ext.extend(Ext.Editor, Ext.Component, {
  1141.     
  1142.     
  1143.     
  1144.     
  1145.     
  1146.     
  1147.     
  1148.     value : "",
  1149.     
  1150.     alignment: "c-c?",
  1151.     
  1152.     offsets: [0, 0],
  1153.     
  1154.     shadow : "frame",
  1155.     
  1156.     constrain : false,
  1157.     
  1158.     swallowKeys : true,
  1159.     
  1160.     completeOnEnter : true,
  1161.     
  1162.     cancelOnEsc : true,
  1163.     
  1164.     updateEl : false,
  1165.     initComponent : function(){
  1166.         Ext.Editor.superclass.initComponent.call(this);
  1167.         this.addEvents(
  1168.             
  1169.             "beforestartedit",
  1170.             
  1171.             "startedit",
  1172.             
  1173.             "beforecomplete",
  1174.             
  1175.             "complete",
  1176.             
  1177.             "canceledit",
  1178.             
  1179.             "specialkey"
  1180.         );
  1181.     },
  1182.     
  1183.     onRender : function(ct, position){
  1184.         this.el = new Ext.Layer({
  1185.             shadow: this.shadow,
  1186.             cls: "x-editor",
  1187.             parentEl : ct,
  1188.             shim : this.shim,
  1189.             shadowOffset: this.shadowOffset || 4,
  1190.             id: this.id,
  1191.             constrain: this.constrain
  1192.         });
  1193.         if(this.zIndex){
  1194.             this.el.setZIndex(this.zIndex);
  1195.         }
  1196.         this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");
  1197.         if(this.field.msgTarget != 'title'){
  1198.             this.field.msgTarget = 'qtip';
  1199.         }
  1200.         this.field.inEditor = true;
  1201.         this.mon(this.field, {
  1202.             scope: this,
  1203.             blur: this.onBlur,
  1204.             specialkey: this.onSpecialKey
  1205.         });
  1206.         if(this.field.grow){
  1207.             this.mon(this.field, "autosize", this.el.sync,  this.el, {delay:1});
  1208.         }
  1209.         this.field.render(this.el).show();
  1210.         this.field.getEl().dom.name = '';
  1211.         if(this.swallowKeys){
  1212.             this.field.el.swallowEvent([
  1213.                 'keypress', 
  1214.                 'keydown'   
  1215.             ]);
  1216.         }
  1217.     },
  1218.     
  1219.     onSpecialKey : function(field, e){
  1220.         var key = e.getKey(),
  1221.             complete = this.completeOnEnter && key == e.ENTER,
  1222.             cancel = this.cancelOnEsc && key == e.ESC;
  1223.         if(complete || cancel){
  1224.             e.stopEvent();
  1225.             if(complete){
  1226.                 this.completeEdit();
  1227.             }else{
  1228.                 this.cancelEdit();
  1229.             }
  1230.             if(field.triggerBlur){
  1231.                 field.triggerBlur(); 
  1232.             }
  1233.         }
  1234.         this.fireEvent('specialkey', field, e);
  1235.     },
  1236.     
  1237.     startEdit : function(el, value){
  1238.         if(this.editing){
  1239.             this.completeEdit();
  1240.         }
  1241.         this.boundEl = Ext.get(el);
  1242.         var v = value !== undefined ? value : this.boundEl.dom.innerHTML;
  1243.         if(!this.rendered){
  1244.             this.render(this.parentEl || document.body);
  1245.         }
  1246.         if(this.fireEvent("beforestartedit", this, this.boundEl, v) !== false){
  1247.             this.startValue = v;
  1248.             this.field.reset();
  1249.             this.field.setValue(v);
  1250.             this.realign(true);
  1251.             this.editing = true;
  1252.             this.show();
  1253.         }
  1254.     },
  1255.     
  1256.     doAutoSize : function(){
  1257.         if(this.autoSize){
  1258.             var sz = this.boundEl.getSize(),
  1259.                 fs = this.field.getSize();
  1260.             switch(this.autoSize){
  1261.                 case "width":
  1262.                     this.setSize(sz.width, fs.height);
  1263.                     break;
  1264.                 case "height":
  1265.                     this.setSize(fs.width, sz.height);
  1266.                     break;
  1267.                 case "none":
  1268.                     this.setSize(fs.width, fs.height);
  1269.                     break;
  1270.                 default:
  1271.                     this.setSize(sz.width, sz.height);
  1272.             }
  1273.         }
  1274.     },
  1275.     
  1276.     setSize : function(w, h){
  1277.         delete this.field.lastSize;
  1278.         this.field.setSize(w, h);
  1279.         if(this.el){
  1280.             if(Ext.isGecko2 || Ext.isOpera){
  1281.                 
  1282.                 this.el.setSize(w, h);
  1283.             }
  1284.             this.el.sync();
  1285.         }
  1286.     },
  1287.     
  1288.     realign : function(autoSize){
  1289.         if(autoSize === true){
  1290.             this.doAutoSize();
  1291.         }
  1292.         this.el.alignTo(this.boundEl, this.alignment, this.offsets);
  1293.     },
  1294.     
  1295.     completeEdit : function(remainVisible){
  1296.         if(!this.editing){
  1297.             return;
  1298.         }
  1299.         var v = this.getValue();
  1300.         if(!this.field.isValid()){
  1301.             if(this.revertInvalid !== false){
  1302.                 this.cancelEdit(remainVisible);
  1303.             }
  1304.             return;
  1305.         }
  1306.         if(String(v) === String(this.startValue) && this.ignoreNoChange){
  1307.             this.hideEdit(remainVisible);
  1308.             return;
  1309.         }
  1310.         if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){
  1311.             v = this.getValue();
  1312.             if(this.updateEl && this.boundEl){
  1313.                 this.boundEl.update(v);
  1314.             }
  1315.             this.hideEdit(remainVisible);
  1316.             this.fireEvent("complete", this, v, this.startValue);
  1317.         }
  1318.     },
  1319.     
  1320.     onShow : function(){
  1321.         this.el.show();
  1322.         if(this.hideEl !== false){
  1323.             this.boundEl.hide();
  1324.         }
  1325.         this.field.show().focus(false, true);
  1326.         this.fireEvent("startedit", this.boundEl, this.startValue);
  1327.     },
  1328.     
  1329.     cancelEdit : function(remainVisible){
  1330.         if(this.editing){
  1331.             var v = this.getValue();
  1332.             this.setValue(this.startValue);
  1333.             this.hideEdit(remainVisible);
  1334.             this.fireEvent("canceledit", this, v, this.startValue);
  1335.         }
  1336.     },
  1337.     
  1338.     
  1339.     hideEdit: function(remainVisible){
  1340.         if(remainVisible !== true){
  1341.             this.editing = false;
  1342.             this.hide();
  1343.         }
  1344.     },
  1345.     
  1346.     onBlur : function(){
  1347.         if(this.allowBlur !== true && this.editing){
  1348.             this.completeEdit();
  1349.         }
  1350.     },
  1351.     
  1352.     onHide : function(){
  1353.         if(this.editing){
  1354.             this.completeEdit();
  1355.             return;
  1356.         }
  1357.         this.field.blur();
  1358.         if(this.field.collapse){
  1359.             this.field.collapse();
  1360.         }
  1361.         this.el.hide();
  1362.         if(this.hideEl !== false){
  1363.             this.boundEl.show();
  1364.         }
  1365.     },
  1366.     
  1367.     setValue : function(v){
  1368.         this.field.setValue(v);
  1369.     },
  1370.     
  1371.     getValue : function(){
  1372.         return this.field.getValue();
  1373.     },
  1374.     beforeDestroy : function(){
  1375.         Ext.destroyMembers(this, 'field');
  1376.         
  1377.         delete this.parentEl;
  1378.         delete this.boundEl;
  1379.     }
  1380. });
  1381. Ext.reg('editor', Ext.Editor);
  1382. Ext.ColorPalette = Ext.extend(Ext.Component, {
  1383.     
  1384.     itemCls : 'x-color-palette',
  1385.     
  1386.     value : null,
  1387.     
  1388.     clickEvent :'click',
  1389.     
  1390.     ctype : 'Ext.ColorPalette',
  1391.     
  1392.     allowReselect : false,
  1393.     
  1394.     colors : [
  1395.         '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333',
  1396.         '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080',
  1397.         'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696',
  1398.         'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0',
  1399.         'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF'
  1400.     ],
  1401.     
  1402.     
  1403.     
  1404.     
  1405.     initComponent : function(){
  1406.         Ext.ColorPalette.superclass.initComponent.call(this);
  1407.         this.addEvents(
  1408.             
  1409.             'select'
  1410.         );
  1411.         if(this.handler){
  1412.             this.on('select', this.handler, this.scope, true);
  1413.         }    
  1414.     },
  1415.     
  1416.     onRender : function(container, position){
  1417.         this.autoEl = {
  1418.             tag: 'div',
  1419.             cls: this.itemCls
  1420.         };
  1421.         Ext.ColorPalette.superclass.onRender.call(this, container, position);
  1422.         var t = this.tpl || new Ext.XTemplate(
  1423.             '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>'
  1424.         );
  1425.         t.overwrite(this.el, this.colors);
  1426.         this.mon(this.el, this.clickEvent, this.handleClick, this, {delegate: 'a'});
  1427.         if(this.clickEvent != 'click'){
  1428.          this.mon(this.el, 'click', Ext.emptyFn, this, {delegate: 'a', preventDefault: true});
  1429.         }
  1430.     },
  1431.     
  1432.     afterRender : function(){
  1433.         Ext.ColorPalette.superclass.afterRender.call(this);
  1434.         if(this.value){
  1435.             var s = this.value;
  1436.             this.value = null;
  1437.             this.select(s);
  1438.         }
  1439.     },
  1440.     
  1441.     handleClick : function(e, t){
  1442.         e.preventDefault();
  1443.         if(!this.disabled){
  1444.             var c = t.className.match(/(?:^|s)color-(.{6})(?:s|$)/)[1];
  1445.             this.select(c.toUpperCase());
  1446.         }
  1447.     },
  1448.     
  1449.     select : function(color){
  1450.         color = color.replace('#', '');
  1451.         if(color != this.value || this.allowReselect){
  1452.             var el = this.el;
  1453.             if(this.value){
  1454.                 el.child('a.color-'+this.value).removeClass('x-color-palette-sel');
  1455.             }
  1456.             el.child('a.color-'+color).addClass('x-color-palette-sel');
  1457.             this.value = color;
  1458.             this.fireEvent('select', this, color);
  1459.         }
  1460.     }
  1461.     
  1462. });
  1463. Ext.reg('colorpalette', Ext.ColorPalette);
  1464. Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
  1465.     
  1466.     todayText : 'Today',
  1467.     
  1468.     okText : '&#160;OK&#160;',
  1469.     
  1470.     cancelText : 'Cancel',
  1471.     
  1472.      
  1473.     
  1474.     todayTip : '{0} (Spacebar)',
  1475.     
  1476.     minText : 'This date is before the minimum date',
  1477.     
  1478.     maxText : 'This date is after the maximum date',
  1479.     
  1480.     format : 'm/d/y',
  1481.     
  1482.     disabledDaysText : 'Disabled',
  1483.     
  1484.     disabledDatesText : 'Disabled',
  1485.     
  1486.     monthNames : Date.monthNames,
  1487.     
  1488.     dayNames : Date.dayNames,
  1489.     
  1490.     nextText : 'Next Month (Control+Right)',
  1491.     
  1492.     prevText : 'Previous Month (Control+Left)',
  1493.     
  1494.     monthYearText : 'Choose a month (Control+Up/Down to move years)',
  1495.     
  1496.     startDay : 0,
  1497.     
  1498.     showToday : true,
  1499.     
  1500.     
  1501.     
  1502.     
  1503.     
  1504.     
  1505.     
  1506.     
  1507.     focusOnSelect: true,
  1508.     
  1509.     initComponent : function(){
  1510.         Ext.DatePicker.superclass.initComponent.call(this);
  1511.         this.value = this.value ?
  1512.                  this.value.clearTime(true) : new Date().clearTime();
  1513.         this.addEvents(
  1514.             
  1515.             'select'
  1516.         );
  1517.         if(this.handler){
  1518.             this.on('select', this.handler,  this.scope || this);
  1519.         }
  1520.         this.initDisabledDays();
  1521.     },
  1522.     
  1523.     initDisabledDays : function(){
  1524.         if(!this.disabledDatesRE && this.disabledDates){
  1525.             var dd = this.disabledDates,
  1526.                 len = dd.length - 1,
  1527.                 re = '(?:';
  1528.                 
  1529.             Ext.each(dd, function(d, i){
  1530.                 re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
  1531.                 if(i != len){
  1532.                     re += '|';
  1533.                 }
  1534.             }, this);
  1535.             this.disabledDatesRE = new RegExp(re + ')');
  1536.         }
  1537.     },
  1538.     
  1539.     setDisabledDates : function(dd){
  1540.         if(Ext.isArray(dd)){
  1541.             this.disabledDates = dd;
  1542.             this.disabledDatesRE = null;
  1543.         }else{
  1544.             this.disabledDatesRE = dd;
  1545.         }
  1546.         this.initDisabledDays();
  1547.         this.update(this.value, true);
  1548.     },
  1549.     
  1550.     setDisabledDays : function(dd){
  1551.         this.disabledDays = dd;
  1552.         this.update(this.value, true);
  1553.     },
  1554.     
  1555.     setMinDate : function(dt){
  1556.         this.minDate = dt;
  1557.         this.update(this.value, true);
  1558.     },
  1559.     
  1560.     setMaxDate : function(dt){
  1561.         this.maxDate = dt;
  1562.         this.update(this.value, true);
  1563.     },
  1564.     
  1565.     setValue : function(value){
  1566.         this.value = value.clearTime(true);
  1567.         this.update(this.value);
  1568.     },
  1569.     
  1570.     getValue : function(){
  1571.         return this.value;
  1572.     },
  1573.     
  1574.     focus : function(){
  1575.         this.update(this.activeDate);
  1576.     },
  1577.     
  1578.     
  1579.     onEnable: function(initial){
  1580.         Ext.DatePicker.superclass.onEnable.call(this);    
  1581.         this.doDisabled(false);
  1582.         this.update(initial ? this.value : this.activeDate);
  1583.         if(Ext.isIE){
  1584.             this.el.repaint();
  1585.         }
  1586.         
  1587.     },
  1588.     
  1589.     
  1590.     onDisable : function(){
  1591.         Ext.DatePicker.superclass.onDisable.call(this);   
  1592.         this.doDisabled(true);
  1593.         if(Ext.isIE && !Ext.isIE8){
  1594.             
  1595.              Ext.each([].concat(this.textNodes, this.el.query('th span')), function(el){
  1596.                  Ext.fly(el).repaint();
  1597.              });
  1598.         }
  1599.     },
  1600.     
  1601.     
  1602.     doDisabled : function(disabled){
  1603.         this.keyNav.setDisabled(disabled);
  1604.         this.prevRepeater.setDisabled(disabled);
  1605.         this.nextRepeater.setDisabled(disabled);
  1606.         if(this.showToday){
  1607.             this.todayKeyListener.setDisabled(disabled);
  1608.             this.todayBtn.setDisabled(disabled);
  1609.         }
  1610.     },
  1611.     
  1612.     onRender : function(container, position){
  1613.         var m = [
  1614.              '<table cellspacing="0">',
  1615.                 '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',
  1616.                 '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],
  1617.                 dn = this.dayNames,
  1618.                 i;
  1619.         for(i = 0; i < 7; i++){
  1620.             var d = this.startDay+i;
  1621.             if(d > 6){
  1622.                 d = d-7;
  1623.             }
  1624.             m.push('<th><span>', dn[d].substr(0,1), '</span></th>');
  1625.         }
  1626.         m[m.length] = '</tr></thead><tbody><tr>';
  1627.         for(i = 0; i < 42; i++) {
  1628.             if(i % 7 === 0 && i !== 0){
  1629.                 m[m.length] = '</tr><tr>';
  1630.             }
  1631.             m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
  1632.         }
  1633.         m.push('</tr></tbody></table></td></tr>',
  1634.                 this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : '',
  1635.                 '</table><div class="x-date-mp"></div>');
  1636.         var el = document.createElement('div');
  1637.         el.className = 'x-date-picker';
  1638.         el.innerHTML = m.join('');
  1639.         container.dom.insertBefore(el, position);
  1640.         this.el = Ext.get(el);
  1641.         this.eventEl = Ext.get(el.firstChild);
  1642.         this.prevRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'), {
  1643.             handler: this.showPrevMonth,
  1644.             scope: this,
  1645.             preventDefault:true,
  1646.             stopDefault:true
  1647.         });
  1648.         this.nextRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'), {
  1649.             handler: this.showNextMonth,
  1650.             scope: this,
  1651.             preventDefault:true,
  1652.             stopDefault:true
  1653.         });
  1654.         this.monthPicker = this.el.down('div.x-date-mp');
  1655.         this.monthPicker.enableDisplayMode('block');
  1656.         this.keyNav = new Ext.KeyNav(this.eventEl, {
  1657.             'left' : function(e){
  1658.                 if(e.ctrlKey){
  1659.                     this.showPrevMonth();
  1660.                 }else{
  1661.                     this.update(this.activeDate.add('d', -1));    
  1662.                 }
  1663.             },
  1664.             'right' : function(e){
  1665.                 if(e.ctrlKey){
  1666.                     this.showNextMonth();
  1667.                 }else{
  1668.                     this.update(this.activeDate.add('d', 1));    
  1669.                 }
  1670.             },
  1671.             'up' : function(e){
  1672.                 if(e.ctrlKey){
  1673.                     this.showNextYear();
  1674.                 }else{
  1675.                     this.update(this.activeDate.add('d', -7));
  1676.                 }
  1677.             },
  1678.             'down' : function(e){
  1679.                 if(e.ctrlKey){
  1680.                     this.showPrevYear();
  1681.                 }else{
  1682.                     this.update(this.activeDate.add('d', 7));
  1683.                 }
  1684.             },
  1685.             'pageUp' : function(e){
  1686.                 this.showNextMonth();
  1687.             },
  1688.             'pageDown' : function(e){
  1689.                 this.showPrevMonth();
  1690.             },
  1691.             'enter' : function(e){
  1692.                 e.stopPropagation();
  1693.                 return true;
  1694.             },
  1695.             scope : this
  1696.         });
  1697.         this.el.unselectable();
  1698.         this.cells = this.el.select('table.x-date-inner tbody td');
  1699.         this.textNodes = this.el.query('table.x-date-inner tbody span');
  1700.         this.mbtn = new Ext.Button({
  1701.             text: '&#160;',
  1702.             tooltip: this.monthYearText,
  1703.             renderTo: this.el.child('td.x-date-middle', true)
  1704.         });
  1705.         this.mbtn.el.child('em').addClass('x-btn-arrow');
  1706.         if(this.showToday){
  1707.             this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday,  this);
  1708.             var today = (new Date()).dateFormat(this.format);
  1709.             this.todayBtn = new Ext.Button({
  1710.                 renderTo: this.el.child('td.x-date-bottom', true),
  1711.                 text: String.format(this.todayText, today),
  1712.                 tooltip: String.format(this.todayTip, today),
  1713.                 handler: this.selectToday,
  1714.                 scope: this
  1715.             });
  1716.         }
  1717.         this.mon(this.eventEl, 'mousewheel', this.handleMouseWheel, this);
  1718.         this.mon(this.eventEl, 'click', this.handleDateClick,  this, {delegate: 'a.x-date-date'});
  1719.         this.mon(this.mbtn, 'click', this.showMonthPicker, this);
  1720.         this.onEnable(true);
  1721.     },
  1722.     
  1723.     createMonthPicker : function(){
  1724.         if(!this.monthPicker.dom.firstChild){
  1725.             var buf = ['<table border="0" cellspacing="0">'];
  1726.             for(var i = 0; i < 6; i++){
  1727.                 buf.push(
  1728.                     '<tr><td class="x-date-mp-month"><a href="#">', Date.getShortMonthName(i), '</a></td>',
  1729.                     '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', Date.getShortMonthName(i + 6), '</a></td>',
  1730.                     i === 0 ?
  1731.                     '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :
  1732.                     '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'
  1733.                 );
  1734.             }
  1735.             buf.push(
  1736.                 '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',
  1737.                     this.okText,
  1738.                     '</button><button type="button" class="x-date-mp-cancel">',
  1739.                     this.cancelText,
  1740.                     '</button></td></tr>',
  1741.                 '</table>'
  1742.             );
  1743.             this.monthPicker.update(buf.join(''));
  1744.             this.mon(this.monthPicker, 'click', this.onMonthClick, this);
  1745.             this.mon(this.monthPicker, 'dblclick', this.onMonthDblClick, this);
  1746.             this.mpMonths = this.monthPicker.select('td.x-date-mp-month');
  1747.             this.mpYears = this.monthPicker.select('td.x-date-mp-year');
  1748.             this.mpMonths.each(function(m, a, i){
  1749.                 i += 1;
  1750.                 if((i%2) === 0){
  1751.                     m.dom.xmonth = 5 + Math.round(i * 0.5);
  1752.                 }else{
  1753.                     m.dom.xmonth = Math.round((i-1) * 0.5);
  1754.                 }
  1755.             });
  1756.         }
  1757.     },
  1758.     
  1759.     showMonthPicker : function(){
  1760.         if(!this.disabled){
  1761.             this.createMonthPicker();
  1762.             var size = this.el.getSize();
  1763.             this.monthPicker.setSize(size);
  1764.             this.monthPicker.child('table').setSize(size);
  1765.             this.mpSelMonth = (this.activeDate || this.value).getMonth();
  1766.             this.updateMPMonth(this.mpSelMonth);
  1767.             this.mpSelYear = (this.activeDate || this.value).getFullYear();
  1768.             this.updateMPYear(this.mpSelYear);
  1769.             this.monthPicker.slideIn('t', {duration:0.2});
  1770.         }
  1771.     },
  1772.     
  1773.     updateMPYear : function(y){
  1774.         this.mpyear = y;
  1775.         var ys = this.mpYears.elements;
  1776.         for(var i = 1; i <= 10; i++){
  1777.             var td = ys[i-1], y2;
  1778.             if((i%2) === 0){
  1779.                 y2 = y + Math.round(i * 0.5);
  1780.                 td.firstChild.innerHTML = y2;
  1781.                 td.xyear = y2;
  1782.             }else{
  1783.                 y2 = y - (5-Math.round(i * 0.5));
  1784.                 td.firstChild.innerHTML = y2;
  1785.                 td.xyear = y2;
  1786.             }
  1787.             this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');
  1788.         }
  1789.     },
  1790.     
  1791.     updateMPMonth : function(sm){
  1792.         this.mpMonths.each(function(m, a, i){
  1793.             m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');
  1794.         });
  1795.     },
  1796.     
  1797.     selectMPMonth : function(m){
  1798.     },
  1799.     
  1800.     onMonthClick : function(e, t){
  1801.         e.stopEvent();
  1802.         var el = new Ext.Element(t), pn;
  1803.         if(el.is('button.x-date-mp-cancel')){
  1804.             this.hideMonthPicker();
  1805.         }
  1806.         else if(el.is('button.x-date-mp-ok')){
  1807.             var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
  1808.             if(d.getMonth() != this.mpSelMonth){
  1809.                 
  1810.                 d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();
  1811.             }
  1812.             this.update(d);
  1813.             this.hideMonthPicker();
  1814.         }
  1815.         else if((pn = el.up('td.x-date-mp-month', 2))){
  1816.             this.mpMonths.removeClass('x-date-mp-sel');
  1817.             pn.addClass('x-date-mp-sel');
  1818.             this.mpSelMonth = pn.dom.xmonth;
  1819.         }
  1820.         else if((pn = el.up('td.x-date-mp-year', 2))){
  1821.             this.mpYears.removeClass('x-date-mp-sel');
  1822.             pn.addClass('x-date-mp-sel');
  1823.             this.mpSelYear = pn.dom.xyear;
  1824.         }
  1825.         else if(el.is('a.x-date-mp-prev')){
  1826.             this.updateMPYear(this.mpyear-10);
  1827.         }
  1828.         else if(el.is('a.x-date-mp-next')){
  1829.             this.updateMPYear(this.mpyear+10);
  1830.         }
  1831.     },
  1832.     
  1833.     onMonthDblClick : function(e, t){
  1834.         e.stopEvent();
  1835.         var el = new Ext.Element(t), pn;
  1836.         if((pn = el.up('td.x-date-mp-month', 2))){
  1837.             this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));
  1838.             this.hideMonthPicker();
  1839.         }
  1840.         else if((pn = el.up('td.x-date-mp-year', 2))){
  1841.             this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
  1842.             this.hideMonthPicker();
  1843.         }
  1844.     },
  1845.     
  1846.     hideMonthPicker : function(disableAnim){
  1847.         if(this.monthPicker){
  1848.             if(disableAnim === true){
  1849.                 this.monthPicker.hide();
  1850.             }else{
  1851.                 this.monthPicker.slideOut('t', {duration:0.2});
  1852.             }
  1853.         }
  1854.     },
  1855.     
  1856.     showPrevMonth : function(e){
  1857.         this.update(this.activeDate.add('mo', -1));
  1858.     },
  1859.     
  1860.     showNextMonth : function(e){
  1861.         this.update(this.activeDate.add('mo', 1));
  1862.     },
  1863.     
  1864.     showPrevYear : function(){
  1865.         this.update(this.activeDate.add('y', -1));
  1866.     },
  1867.     
  1868.     showNextYear : function(){
  1869.         this.update(this.activeDate.add('y', 1));
  1870.     },
  1871.     
  1872.     handleMouseWheel : function(e){
  1873.         e.stopEvent();
  1874.         if(!this.disabled){
  1875.             var delta = e.getWheelDelta();
  1876.             if(delta > 0){
  1877.                 this.showPrevMonth();
  1878.             } else if(delta < 0){
  1879.                 this.showNextMonth();
  1880.             }
  1881.         }
  1882.     },
  1883.     
  1884.     handleDateClick : function(e, t){
  1885.         e.stopEvent();
  1886.         if(!this.disabled && t.dateValue && !Ext.fly(t.parentNode).hasClass('x-date-disabled')){
  1887.             this.cancelFocus = this.focusOnSelect === false;
  1888.             this.setValue(new Date(t.dateValue));
  1889.             delete this.cancelFocus;
  1890.             this.fireEvent('select', this, this.value);
  1891.         }
  1892.     },
  1893.     
  1894.     selectToday : function(){
  1895.         if(this.todayBtn && !this.todayBtn.disabled){
  1896.             this.setValue(new Date().clearTime());
  1897.             this.fireEvent('select', this, this.value);
  1898.         }
  1899.     },
  1900.     
  1901.     update : function(date, forceRefresh){
  1902.         if(this.rendered){
  1903.         var vd = this.activeDate, vis = this.isVisible();
  1904.         this.activeDate = date;
  1905.         if(!forceRefresh && vd && this.el){
  1906.             var t = date.getTime();
  1907.             if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){
  1908.                 this.cells.removeClass('x-date-selected');
  1909.                 this.cells.each(function(c){
  1910.                    if(c.dom.firstChild.dateValue == t){
  1911.                        c.addClass('x-date-selected');
  1912.                        if(vis && !this.cancelFocus){
  1913.                            Ext.fly(c.dom.firstChild).focus(50);
  1914.                        }
  1915.                        return false;
  1916.                    }
  1917.                 }, this);
  1918.                 return;
  1919.             }
  1920.         }
  1921.         var days = date.getDaysInMonth(),
  1922.             firstOfMonth = date.getFirstDateOfMonth(),
  1923.             startingPos = firstOfMonth.getDay()-this.startDay;
  1924.         if(startingPos < 0){
  1925.             startingPos += 7;
  1926.         }
  1927.         days += startingPos;
  1928.         var pm = date.add('mo', -1),
  1929.             prevStart = pm.getDaysInMonth()-startingPos,
  1930.             cells = this.cells.elements,
  1931.             textEls = this.textNodes,
  1932.             
  1933.             day = 86400000,
  1934.             d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime(),
  1935.             today = new Date().clearTime().getTime(),
  1936.             sel = date.clearTime(true).getTime(),
  1937.             min = this.minDate ? this.minDate.clearTime(true) : Number.NEGATIVE_INFINITY,
  1938.             max = this.maxDate ? this.maxDate.clearTime(true) : Number.POSITIVE_INFINITY,
  1939.             ddMatch = this.disabledDatesRE,
  1940.             ddText = this.disabledDatesText,
  1941.             ddays = this.disabledDays ? this.disabledDays.join('') : false,
  1942.             ddaysText = this.disabledDaysText,
  1943.             format = this.format;
  1944.         if(this.showToday){
  1945.             var td = new Date().clearTime(),
  1946.                 disable = (td < min || td > max ||
  1947.                 (ddMatch && format && ddMatch.test(td.dateFormat(format))) ||
  1948.                 (ddays && ddays.indexOf(td.getDay()) != -1));
  1949.             if(!this.disabled){
  1950.                 this.todayBtn.setDisabled(disable);
  1951.                 this.todayKeyListener[disable ? 'disable' : 'enable']();
  1952.             }
  1953.         }
  1954.         var setCellClass = function(cal, cell){
  1955.             cell.title = '';
  1956.             var t = d.getTime();
  1957.             cell.firstChild.dateValue = t;
  1958.             if(t == today){
  1959.                 cell.className += ' x-date-today';
  1960.                 cell.title = cal.todayText;
  1961.             }
  1962.             if(t == sel){
  1963.                 cell.className += ' x-date-selected';
  1964.                 if(vis){
  1965.                     Ext.fly(cell.firstChild).focus(50);
  1966.                 }
  1967.             }
  1968.             
  1969.             if(t < min) {
  1970.                 cell.className = ' x-date-disabled';
  1971.                 cell.title = cal.minText;
  1972.                 return;
  1973.             }
  1974.             if(t > max) {
  1975.                 cell.className = ' x-date-disabled';
  1976.                 cell.title = cal.maxText;
  1977.                 return;
  1978.             }
  1979.             if(ddays){
  1980.                 if(ddays.indexOf(d.getDay()) != -1){
  1981.                     cell.title = ddaysText;
  1982.                     cell.className = ' x-date-disabled';
  1983.                 }
  1984.             }
  1985.             if(ddMatch && format){
  1986.                 var fvalue = d.dateFormat(format);
  1987.                 if(ddMatch.test(fvalue)){
  1988.                     cell.title = ddText.replace('%0', fvalue);
  1989.                     cell.className = ' x-date-disabled';
  1990.                 }
  1991.             }
  1992.         };
  1993.         var i = 0;
  1994.         for(; i < startingPos; i++) {
  1995.             textEls[i].innerHTML = (++prevStart);
  1996.             d.setDate(d.getDate()+1);
  1997.             cells[i].className = 'x-date-prevday';
  1998.             setCellClass(this, cells[i]);
  1999.         }
  2000.         for(; i < days; i++){
  2001.             var intDay = i - startingPos + 1;
  2002.             textEls[i].innerHTML = (intDay);
  2003.             d.setDate(d.getDate()+1);
  2004.             cells[i].className = 'x-date-active';
  2005.             setCellClass(this, cells[i]);
  2006.         }
  2007.         var extraDays = 0;
  2008.         for(; i < 42; i++) {
  2009.              textEls[i].innerHTML = (++extraDays);
  2010.              d.setDate(d.getDate()+1);
  2011.              cells[i].className = 'x-date-nextday';
  2012.              setCellClass(this, cells[i]);
  2013.         }
  2014.         this.mbtn.setText(this.monthNames[date.getMonth()] + ' ' + date.getFullYear());
  2015.         if(!this.internalRender){
  2016.             var main = this.el.dom.firstChild,
  2017.                 w = main.offsetWidth;
  2018.             this.el.setWidth(w + this.el.getBorderWidth('lr'));
  2019.             Ext.fly(main).setWidth(w);
  2020.             this.internalRender = true;
  2021.             
  2022.             
  2023.             
  2024.             if(Ext.isOpera && !this.secondPass){
  2025.                 main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + 'px';
  2026.                 this.secondPass = true;
  2027.                 this.update.defer(10, this, [date]);
  2028.             }
  2029.         }
  2030.         }
  2031.     },
  2032.     
  2033.     beforeDestroy : function() {
  2034.         if(this.rendered){
  2035.             Ext.destroy(
  2036.                 this.keyNav,
  2037.                 this.monthPicker,
  2038.                 this.eventEl,
  2039.                 this.mbtn,
  2040.                 this.nextRepeater,
  2041.                 this.prevRepeater,
  2042.                 this.cells.el,
  2043.                 this.todayBtn
  2044.             );
  2045.             delete this.textNodes;
  2046.             delete this.cells.elements;
  2047.         }
  2048.     }
  2049.     
  2050. });
  2051. Ext.reg('datepicker', Ext.DatePicker);
  2052. Ext.LoadMask = function(el, config){
  2053.     this.el = Ext.get(el);
  2054.     Ext.apply(this, config);
  2055.     if(this.store){
  2056.         this.store.on({
  2057.             scope: this,
  2058.             beforeload: this.onBeforeLoad,
  2059.             load: this.onLoad,
  2060.             exception: this.onLoad
  2061.         });
  2062.         this.removeMask = Ext.value(this.removeMask, false);
  2063.     }else{
  2064.         var um = this.el.getUpdater();
  2065.         um.showLoadIndicator = false; 
  2066.         um.on({
  2067.             scope: this,
  2068.             beforeupdate: this.onBeforeLoad,
  2069.             update: this.onLoad,
  2070.             failure: this.onLoad
  2071.         });
  2072.         this.removeMask = Ext.value(this.removeMask, true);
  2073.     }
  2074. };
  2075. Ext.LoadMask.prototype = {
  2076.     
  2077.     
  2078.     
  2079.     msg : 'Loading...',
  2080.     
  2081.     msgCls : 'x-mask-loading',
  2082.     
  2083.     disabled: false,
  2084.     
  2085.     disable : function(){
  2086.        this.disabled = true;
  2087.     },
  2088.     
  2089.     enable : function(){
  2090.         this.disabled = false;
  2091.     },
  2092.     
  2093.     onLoad : function(){
  2094.         this.el.unmask(this.removeMask);
  2095.     },
  2096.     
  2097.     onBeforeLoad : function(){
  2098.         if(!this.disabled){
  2099.             this.el.mask(this.msg, this.msgCls);
  2100.         }
  2101.     },
  2102.     
  2103.     show: function(){
  2104.         this.onBeforeLoad();
  2105.     },
  2106.     
  2107.     hide: function(){
  2108.         this.onLoad();
  2109.     },
  2110.     
  2111.     destroy : function(){
  2112.         if(this.store){
  2113.             this.store.un('beforeload', this.onBeforeLoad, this);
  2114.             this.store.un('load', this.onLoad, this);
  2115.             this.store.un('exception', this.onLoad, this);
  2116.         }else{
  2117.             var um = this.el.getUpdater();
  2118.             um.un('beforeupdate', this.onBeforeLoad, this);
  2119.             um.un('update', this.onLoad, this);
  2120.             um.un('failure', this.onLoad, this);
  2121.         }
  2122.     }
  2123. };
  2124. Ext.Slider = Ext.extend(Ext.BoxComponent, {
  2125.     vertical: false,
  2126.     minValue: 0,
  2127.     maxValue: 100,
  2128.     
  2129.     decimalPrecision: 0,
  2130.     keyIncrement: 1,
  2131.     increment: 0,
  2132.     clickRange: [5,15],
  2133.     clickToChange : true,
  2134.     animate: true,
  2135.     
  2136.     dragging: false,
  2137.     
  2138.     initComponent : function(){
  2139.         if(!Ext.isDefined(this.value)){
  2140.             this.value = this.minValue;
  2141.         }
  2142.         Ext.Slider.superclass.initComponent.call(this);
  2143.         this.keyIncrement = Math.max(this.increment, this.keyIncrement);
  2144.         this.addEvents(
  2145.             
  2146. 'beforechange',
  2147. 'change',
  2148. 'changecomplete',
  2149. 'dragstart',
  2150. 'drag',
  2151. 'dragend'
  2152. );
  2153.         if(this.vertical){
  2154.             Ext.apply(this, Ext.Slider.Vertical);
  2155.         }
  2156.     },
  2157.     onRender : function(){
  2158.         this.autoEl = {
  2159.             cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'),
  2160.             cn:{cls:'x-slider-end',cn:{cls:'x-slider-inner',cn:[{cls:'x-slider-thumb'},{tag:'a', cls:'x-slider-focus', href:"#", tabIndex: '-1', hidefocus:'on'}]}}
  2161.         };
  2162.         Ext.Slider.superclass.onRender.apply(this, arguments);
  2163.         this.endEl = this.el.first();
  2164.         this.innerEl = this.endEl.first();
  2165.         this.thumb = this.innerEl.first();
  2166.         this.halfThumb = (this.vertical ? this.thumb.getHeight() : this.thumb.getWidth())/2;
  2167.         this.focusEl = this.thumb.next();
  2168.         this.initEvents();
  2169.     },
  2170.     initEvents : function(){
  2171.         this.thumb.addClassOnOver('x-slider-thumb-over');
  2172.         this.mon(this.el, {
  2173.             scope: this,
  2174.             mousedown: this.onMouseDown,
  2175.             keydown: this.onKeyDown
  2176.         });
  2177.         this.focusEl.swallowEvent("click", true);
  2178.         this.tracker = new Ext.dd.DragTracker({
  2179.             onBeforeStart: this.onBeforeDragStart.createDelegate(this),
  2180.             onStart: this.onDragStart.createDelegate(this),
  2181.             onDrag: this.onDrag.createDelegate(this),
  2182.             onEnd: this.onDragEnd.createDelegate(this),
  2183.             tolerance: 3,
  2184.             autoStart: 300
  2185.         });
  2186.         this.tracker.initEl(this.thumb);
  2187.     },
  2188.     onMouseDown : function(e){
  2189.         if(this.disabled){
  2190.             return;
  2191.         }
  2192.         if(this.clickToChange && e.target != this.thumb.dom){
  2193.             var local = this.innerEl.translatePoints(e.getXY());
  2194.             this.onClickChange(local);
  2195.         }
  2196.         this.focus();
  2197.     },
  2198.     onClickChange : function(local){
  2199.         if(local.top > this.clickRange[0] && local.top < this.clickRange[1]){
  2200.             this.setValue(Ext.util.Format.round(this.reverseValue(local.left), this.decimalPrecision), undefined, true);
  2201.         }
  2202.     },
  2203.     onKeyDown : function(e){
  2204.         if(this.disabled){e.preventDefault();return;}
  2205.         var k = e.getKey();
  2206.         switch(k){
  2207.             case e.UP:
  2208.             case e.RIGHT:
  2209.                 e.stopEvent();
  2210.                 if(e.ctrlKey){
  2211.                     this.setValue(this.maxValue, undefined, true);
  2212.                 }else{
  2213.                     this.setValue(this.value+this.keyIncrement, undefined, true);
  2214.                 }
  2215.             break;
  2216.             case e.DOWN:
  2217.             case e.LEFT:
  2218.                 e.stopEvent();
  2219.                 if(e.ctrlKey){
  2220.                     this.setValue(this.minValue, undefined, true);
  2221.                 }else{
  2222.                     this.setValue(this.value-this.keyIncrement, undefined, true);
  2223.                 }
  2224.             break;
  2225.             default:
  2226.                 e.preventDefault();
  2227.         }
  2228.     },
  2229.     doSnap : function(value){
  2230.         if(!(this.increment && value)){
  2231.             return value;
  2232.         }
  2233.         var newValue = value, 
  2234.             inc = this.increment,
  2235.             m = value % inc;
  2236.         if(m != 0){
  2237.             newValue -= m;
  2238.             if(m * 2 > inc){
  2239.                 newValue += inc;
  2240.             }else if(m * 2 < -inc){
  2241.                 newValue -= inc;
  2242.             }
  2243.         }
  2244.         return newValue.constrain(this.minValue,  this.maxValue);
  2245.     },
  2246.     afterRender : function(){
  2247.         Ext.Slider.superclass.afterRender.apply(this, arguments);
  2248.         if(this.value !== undefined){
  2249.             var v = this.normalizeValue(this.value);
  2250.             if(v !== this.value){
  2251.                 delete this.value;
  2252.                 this.setValue(v, false);
  2253.             }else{
  2254.                 this.moveThumb(this.translateValue(v), false);
  2255.             }
  2256.         }
  2257.     },
  2258.     getRatio : function(){
  2259.         var w = this.innerEl.getWidth(),
  2260.             v = this.maxValue - this.minValue;
  2261.         return v == 0 ? w : (w/v);
  2262.     },
  2263.     normalizeValue : function(v){
  2264.         v = this.doSnap(v);
  2265.         v = Ext.util.Format.round(v, this.decimalPrecision);
  2266.         v = v.constrain(this.minValue, this.maxValue);
  2267.         return v;
  2268.     },
  2269.     setValue : function(v, animate, changeComplete){
  2270.         v = this.normalizeValue(v);
  2271.         if(v !== this.value && this.fireEvent('beforechange', this, v, this.value) !== false){
  2272.             this.value = v;
  2273.             this.moveThumb(this.translateValue(v), animate !== false);
  2274.             this.fireEvent('change', this, v);
  2275.             if(changeComplete){
  2276.                 this.fireEvent('changecomplete', this, v);
  2277.             }
  2278.         }
  2279.     },
  2280.     translateValue : function(v){
  2281.         var ratio = this.getRatio();
  2282.         return (v * ratio) - (this.minValue * ratio) - this.halfThumb;
  2283.     },
  2284. reverseValue : function(pos){
  2285.         var ratio = this.getRatio();
  2286.         return (pos + this.halfThumb + (this.minValue * ratio)) / ratio;
  2287.     },
  2288.     moveThumb: function(v, animate){
  2289.         if(!animate || this.animate === false){
  2290.             this.thumb.setLeft(v);
  2291.         }else{
  2292.             this.thumb.shift({left: v, stopFx: true, duration:.35});
  2293.         }
  2294.     },
  2295.     focus : function(){
  2296.         this.focusEl.focus(10);
  2297.     },
  2298.     onBeforeDragStart : function(e){
  2299.         return !this.disabled;
  2300.     },
  2301.     onDragStart: function(e){
  2302.         this.thumb.addClass('x-slider-thumb-drag');
  2303.         this.dragging = true;
  2304.         this.dragStartValue = this.value;
  2305.         this.fireEvent('dragstart', this, e);
  2306.     },
  2307.     onDrag: function(e){
  2308.         var pos = this.innerEl.translatePoints(this.tracker.getXY());
  2309.         this.setValue(Ext.util.Format.round(this.reverseValue(pos.left), this.decimalPrecision), false);
  2310.         this.fireEvent('drag', this, e);
  2311.     },
  2312.     onDragEnd: function(e){
  2313.         this.thumb.removeClass('x-slider-thumb-drag');
  2314.         this.dragging = false;
  2315.         this.fireEvent('dragend', this, e);
  2316.         if(this.dragStartValue != this.value){
  2317.             this.fireEvent('changecomplete', this, this.value);
  2318.         }
  2319.     },
  2320.     onResize : function(w, h){
  2321.         this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r')));
  2322.         this.syncThumb();
  2323.     },
  2324.     
  2325.     
  2326.     onDisable: function(){
  2327.         Ext.Slider.superclass.onDisable.call(this);
  2328.         this.thumb.addClass(this.disabledClass);
  2329.         if(Ext.isIE){
  2330.             
  2331.             
  2332.             var xy = this.thumb.getXY();
  2333.             this.thumb.hide();
  2334.             this.innerEl.addClass(this.disabledClass).dom.disabled = true;
  2335.             if (!this.thumbHolder){
  2336.                 this.thumbHolder = this.endEl.createChild({cls: 'x-slider-thumb ' + this.disabledClass});    
  2337.             }
  2338.             this.thumbHolder.show().setXY(xy);
  2339.         }
  2340.     },
  2341.     
  2342.     
  2343.     onEnable: function(){
  2344.         Ext.Slider.superclass.onEnable.call(this);
  2345.         this.thumb.removeClass(this.disabledClass);
  2346.         if(Ext.isIE){
  2347.             this.innerEl.removeClass(this.disabledClass).dom.disabled = false;
  2348.             if(this.thumbHolder){
  2349.                 this.thumbHolder.hide();
  2350.             }
  2351.             this.thumb.show();
  2352.             this.syncThumb();
  2353.         }
  2354.     },
  2355.     
  2356.     
  2357.     syncThumb : function(){
  2358.         if(this.rendered){
  2359.             this.moveThumb(this.translateValue(this.value));
  2360.         }
  2361.     },
  2362.     getValue : function(){
  2363.         return this.value;
  2364.     },
  2365.     
  2366.     
  2367.     beforeDestroy : function(){
  2368.         Ext.destroyMembers(this, 'endEl', 'innerEl', 'thumb', 'halfThumb', 'focusEl', 'tracker', 'thumbHolder');
  2369.         Ext.Slider.superclass.beforeDestroy.call(this);
  2370.     }
  2371. });
  2372. Ext.reg('slider', Ext.Slider);
  2373. Ext.Slider.Vertical = {
  2374.     onResize : function(w, h){
  2375.         this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b')));
  2376.         this.syncThumb();
  2377.     },
  2378.     getRatio : function(){
  2379.         var h = this.innerEl.getHeight(),
  2380.             v = this.maxValue - this.minValue;
  2381.         return h/v;
  2382.     },
  2383.     moveThumb: function(v, animate){
  2384.         if(!animate || this.animate === false){
  2385.             this.thumb.setBottom(v);
  2386.         }else{
  2387.             this.thumb.shift({bottom: v, stopFx: true, duration:.35});
  2388.         }
  2389.     },
  2390.     onDrag: function(e){
  2391.         var pos = this.innerEl.translatePoints(this.tracker.getXY()),
  2392.             bottom = this.innerEl.getHeight()-pos.top;
  2393.         this.setValue(this.minValue + Ext.util.Format.round(bottom/this.getRatio(), this.decimalPrecision), false);
  2394.         this.fireEvent('drag', this, e);
  2395.     },
  2396.     onClickChange : function(local){
  2397.         if(local.left > this.clickRange[0] && local.left < this.clickRange[1]){
  2398.             var bottom = this.innerEl.getHeight() - local.top;
  2399.             this.setValue(this.minValue + Ext.util.Format.round(bottom/this.getRatio(), this.decimalPrecision), undefined, true);
  2400.         }
  2401.     }
  2402. };
  2403. Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
  2404.    
  2405.     baseCls : 'x-progress',
  2406.     
  2407.     
  2408.     animate : false,
  2409.     
  2410.     waitTimer : null,
  2411.     
  2412.     initComponent : function(){
  2413.         Ext.ProgressBar.superclass.initComponent.call(this);
  2414.         this.addEvents(
  2415.             
  2416.             "update"
  2417.         );
  2418.     },
  2419.     
  2420.     onRender : function(ct, position){
  2421.         var tpl = new Ext.Template(
  2422.             '<div class="{cls}-wrap">',
  2423.                 '<div class="{cls}-inner">',
  2424.                     '<div class="{cls}-bar">',
  2425.                         '<div class="{cls}-text">',
  2426.                             '<div>&#160;</div>',
  2427.                         '</div>',
  2428.                     '</div>',
  2429.                     '<div class="{cls}-text {cls}-text-back">',
  2430.                         '<div>&#160;</div>',
  2431.                     '</div>',
  2432.                 '</div>',
  2433.             '</div>'
  2434.         );
  2435.         this.el = position ? tpl.insertBefore(position, {cls: this.baseCls}, true)
  2436.          : tpl.append(ct, {cls: this.baseCls}, true);
  2437.         
  2438.         if(this.id){
  2439.             this.el.dom.id = this.id;
  2440.         }
  2441.         var inner = this.el.dom.firstChild;
  2442.         this.progressBar = Ext.get(inner.firstChild);
  2443.         if(this.textEl){
  2444.             
  2445.             this.textEl = Ext.get(this.textEl);
  2446.             delete this.textTopEl;
  2447.         }else{
  2448.             
  2449.             this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
  2450.             var textBackEl = Ext.get(inner.childNodes[1]);
  2451.             this.textTopEl.setStyle("z-index", 99).addClass('x-hidden');
  2452.             this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]);
  2453.             this.textEl.setWidth(inner.offsetWidth);
  2454.         }
  2455.         this.progressBar.setHeight(inner.offsetHeight);
  2456.     },
  2457.     
  2458.     
  2459.     afterRender : function(){
  2460.         Ext.ProgressBar.superclass.afterRender.call(this);
  2461.         if(this.value){
  2462.             this.updateProgress(this.value, this.text);
  2463.         }else{
  2464.             this.updateText(this.text);
  2465.         }
  2466.     },
  2467.     
  2468.     updateProgress : function(value, text, animate){
  2469.         this.value = value || 0;
  2470.         if(text){
  2471.             this.updateText(text);
  2472.         }
  2473.         if(this.rendered){
  2474.             var w = Math.floor(value*this.el.dom.firstChild.offsetWidth);
  2475.             this.progressBar.setWidth(w, animate === true || (animate !== false && this.animate));
  2476.             if(this.textTopEl){
  2477.                 
  2478.                 this.textTopEl.removeClass('x-hidden').setWidth(w);
  2479.             }
  2480.         }
  2481.         this.fireEvent('update', this, value, text);
  2482.         return this;
  2483.     },
  2484.     
  2485.     wait : function(o){
  2486.         if(!this.waitTimer){
  2487.             var scope = this;
  2488.             o = o || {};
  2489.             this.updateText(o.text);
  2490.             this.waitTimer = Ext.TaskMgr.start({
  2491.                 run: function(i){
  2492.                     var inc = o.increment || 10;
  2493.                     i -= 1;
  2494.                     this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01, null, o.animate);
  2495.                 },
  2496.                 interval: o.interval || 1000,
  2497.                 duration: o.duration,
  2498.                 onStop: function(){
  2499.                     if(o.fn){
  2500.                         o.fn.apply(o.scope || this);
  2501.                     }
  2502.                     this.reset();
  2503.                 },
  2504.                 scope: scope
  2505.             });
  2506.         }
  2507.         return this;
  2508.     },
  2509.     
  2510.     isWaiting : function(){
  2511.         return this.waitTimer !== null;
  2512.     },
  2513.     
  2514.     updateText : function(text){
  2515.         this.text = text || '&#160;';
  2516.         if(this.rendered){
  2517.             this.textEl.update(this.text);
  2518.         }
  2519.         return this;
  2520.     },
  2521.     
  2522.     
  2523.     syncProgressBar : function(){
  2524.         if(this.value){
  2525.             this.updateProgress(this.value, this.text);
  2526.         }
  2527.         return this;
  2528.     },
  2529.     
  2530.     setSize : function(w, h){
  2531.         Ext.ProgressBar.superclass.setSize.call(this, w, h);
  2532.         if(this.textTopEl){
  2533.             var inner = this.el.dom.firstChild;
  2534.             this.textEl.setSize(inner.offsetWidth, inner.offsetHeight);
  2535.         }
  2536.         this.syncProgressBar();
  2537.         return this;
  2538.     },
  2539.     
  2540.     reset : function(hide){
  2541.         this.updateProgress(0);
  2542.         if(this.textTopEl){
  2543.             this.textTopEl.addClass('x-hidden');
  2544.         }
  2545.         if(this.waitTimer){
  2546.             this.waitTimer.onStop = null; 
  2547.             Ext.TaskMgr.stop(this.waitTimer);
  2548.             this.waitTimer = null;
  2549.         }
  2550.         if(hide === true){
  2551.             this.hide();
  2552.         }
  2553.         return this;
  2554.     },
  2555.     
  2556.     onDestroy: function(){
  2557.         if(this.rendered){
  2558.             if(this.textEl.isComposite){
  2559.                 this.textEl.clear();
  2560.             }
  2561.             Ext.destroyMembers(this, 'textEl', 'progressBar', 'textTopEl');
  2562.         }
  2563.         Ext.ProgressBar.superclass.onDestroy.call(this);
  2564.     }
  2565. });
  2566. Ext.reg('progress', Ext.ProgressBar);
  2567. (function() {
  2568. var Event=Ext.EventManager;
  2569. var Dom=Ext.lib.Dom;
  2570. Ext.dd.DragDrop = function(id, sGroup, config) {
  2571.     if(id) {
  2572.         this.init(id, sGroup, config);
  2573.     }
  2574. };
  2575. Ext.dd.DragDrop.prototype = {
  2576.     
  2577.     
  2578.     id: null,
  2579.     
  2580.     config: null,
  2581.     
  2582.     dragElId: null,
  2583.     
  2584.     handleElId: null,
  2585.     
  2586.     invalidHandleTypes: null,
  2587.     
  2588.     invalidHandleIds: null,
  2589.     
  2590.     invalidHandleClasses: null,
  2591.     
  2592.     startPageX: 0,
  2593.     
  2594.     startPageY: 0,
  2595.     
  2596.     groups: null,
  2597.     
  2598.     locked: false,
  2599.     
  2600.     lock: function() { this.locked = true; },
  2601.     
  2602.     moveOnly: false,
  2603.     
  2604.     unlock: function() { this.locked = false; },
  2605.     
  2606.     isTarget: true,
  2607.     
  2608.     padding: null,
  2609.     
  2610.     _domRef: null,
  2611.     
  2612.     __ygDragDrop: true,
  2613.     
  2614.     constrainX: false,
  2615.     
  2616.     constrainY: false,
  2617.     
  2618.     minX: 0,
  2619.     
  2620.     maxX: 0,
  2621.     
  2622.     minY: 0,
  2623.     
  2624.     maxY: 0,
  2625.     
  2626.     maintainOffset: false,
  2627.     
  2628.     xTicks: null,
  2629.     
  2630.     yTicks: null,
  2631.     
  2632.     primaryButtonOnly: true,
  2633.     
  2634.     available: false,
  2635.     
  2636.     hasOuterHandles: false,
  2637.     
  2638.     b4StartDrag: function(x, y) { },
  2639.     
  2640.     startDrag: function(x, y) {  },
  2641.     
  2642.     b4Drag: function(e) { },
  2643.     
  2644.     onDrag: function(e) {  },
  2645.     
  2646.     onDragEnter: function(e, id) {  },
  2647.     
  2648.     b4DragOver: function(e) { },
  2649.     
  2650.     onDragOver: function(e, id) {  },
  2651.     
  2652.     b4DragOut: function(e) { },
  2653.     
  2654.     onDragOut: function(e, id) {  },
  2655.     
  2656.     b4DragDrop: function(e) { },
  2657.     
  2658.     onDragDrop: function(e, id) {  },
  2659.     
  2660.     onInvalidDrop: function(e) {  },
  2661.     
  2662.     b4EndDrag: function(e) { },
  2663.     
  2664.     endDrag: function(e) {  },
  2665.     
  2666.     b4MouseDown: function(e) {  },
  2667.     
  2668.     onMouseDown: function(e) {  },
  2669.     
  2670.     onMouseUp: function(e) {  },
  2671.     
  2672.     onAvailable: function () {
  2673.     },
  2674.     
  2675.     defaultPadding : {left:0, right:0, top:0, bottom:0},
  2676.     
  2677.     constrainTo : function(constrainTo, pad, inContent){
  2678.         if(Ext.isNumber(pad)){
  2679.             pad = {left: pad, right:pad, top:pad, bottom:pad};
  2680.         }
  2681.         pad = pad || this.defaultPadding;
  2682.         var b = Ext.get(this.getEl()).getBox(),
  2683.             ce = Ext.get(constrainTo),
  2684.             s = ce.getScroll(),
  2685.             c, 
  2686.             cd = ce.dom;
  2687.         if(cd == document.body){
  2688.             c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
  2689.         }else{
  2690.             var xy = ce.getXY();
  2691.             c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight};
  2692.         }
  2693.         var topSpace = b.y - c.y,
  2694.             leftSpace = b.x - c.x;
  2695.         this.resetConstraints();
  2696.         this.setXConstraint(leftSpace - (pad.left||0), 
  2697.                 c.width - leftSpace - b.width - (pad.right||0), 
  2698. this.xTickSize
  2699.         );
  2700.         this.setYConstraint(topSpace - (pad.top||0), 
  2701.                 c.height - topSpace - b.height - (pad.bottom||0), 
  2702. this.yTickSize
  2703.         );
  2704.     },
  2705.     
  2706.     getEl: function() {
  2707.         if (!this._domRef) {
  2708.             this._domRef = Ext.getDom(this.id);
  2709.         }
  2710.         return this._domRef;
  2711.     },
  2712.     
  2713.     getDragEl: function() {
  2714.         return Ext.getDom(this.dragElId);
  2715.     },
  2716.     
  2717.     init: function(id, sGroup, config) {
  2718.         this.initTarget(id, sGroup, config);
  2719.         Event.on(this.id, "mousedown", this.handleMouseDown, this);
  2720.         
  2721.     },
  2722.     
  2723.     initTarget: function(id, sGroup, config) {
  2724.         
  2725.         this.config = config || {};
  2726.         
  2727.         this.DDM = Ext.dd.DDM;
  2728.         
  2729.         this.groups = {};
  2730.         
  2731.         
  2732.         if (typeof id !== "string") {
  2733.             id = Ext.id(id);
  2734.         }
  2735.         
  2736.         this.id = id;
  2737.         
  2738.         this.addToGroup((sGroup) ? sGroup : "default");
  2739.         
  2740.         
  2741.         this.handleElId = id;
  2742.         
  2743.         this.setDragElId(id);
  2744.         
  2745.         this.invalidHandleTypes = { A: "A" };
  2746.         this.invalidHandleIds = {};
  2747.         this.invalidHandleClasses = [];
  2748.         this.applyConfig();
  2749.         this.handleOnAvailable();
  2750.     },
  2751.     
  2752.     applyConfig: function() {
  2753.         
  2754.         
  2755.         this.padding           = this.config.padding || [0, 0, 0, 0];
  2756.         this.isTarget          = (this.config.isTarget !== false);
  2757.         this.maintainOffset    = (this.config.maintainOffset);
  2758.         this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
  2759.     },
  2760.     
  2761.     handleOnAvailable: function() {
  2762.         this.available = true;
  2763.         this.resetConstraints();
  2764.         this.onAvailable();
  2765.     },
  2766.      
  2767.     setPadding: function(iTop, iRight, iBot, iLeft) {
  2768.         
  2769.         if (!iRight && 0 !== iRight) {
  2770.             this.padding = [iTop, iTop, iTop, iTop];
  2771.         } else if (!iBot && 0 !== iBot) {
  2772.             this.padding = [iTop, iRight, iTop, iRight];
  2773.         } else {
  2774.             this.padding = [iTop, iRight, iBot, iLeft];
  2775.         }
  2776.     },
  2777.     
  2778.     setInitPosition: function(diffX, diffY) {
  2779.         var el = this.getEl();
  2780.         if (!this.DDM.verifyEl(el)) {
  2781.             return;
  2782.         }
  2783.         var dx = diffX || 0;
  2784.         var dy = diffY || 0;
  2785.         var p = Dom.getXY( el );
  2786.         this.initPageX = p[0] - dx;
  2787.         this.initPageY = p[1] - dy;
  2788.         this.lastPageX = p[0];
  2789.         this.lastPageY = p[1];
  2790.         this.setStartPosition(p);
  2791.     },
  2792.     
  2793.     setStartPosition: function(pos) {
  2794.         var p = pos || Dom.getXY( this.getEl() );
  2795.         this.deltaSetXY = null;
  2796.         this.startPageX = p[0];
  2797.         this.startPageY = p[1];
  2798.     },
  2799.     
  2800.     addToGroup: function(sGroup) {
  2801.         this.groups[sGroup] = true;
  2802.         this.DDM.regDragDrop(this, sGroup);
  2803.     },
  2804.     
  2805.     removeFromGroup: function(sGroup) {
  2806.         if (this.groups[sGroup]) {
  2807.             delete this.groups[sGroup];
  2808.         }
  2809.         this.DDM.removeDDFromGroup(this, sGroup);
  2810.     },
  2811.     
  2812.     setDragElId: function(id) {
  2813.         this.dragElId = id;
  2814.     },
  2815.     
  2816.     setHandleElId: function(id) {
  2817.         if (typeof id !== "string") {
  2818.             id = Ext.id(id);
  2819.         }
  2820.         this.handleElId = id;
  2821.         this.DDM.regHandle(this.id, id);
  2822.     },
  2823.     
  2824.     setOuterHandleElId: function(id) {
  2825.         if (typeof id !== "string") {
  2826.             id = Ext.id(id);
  2827.         }
  2828.         Event.on(id, "mousedown",
  2829.                 this.handleMouseDown, this);
  2830.         this.setHandleElId(id);
  2831.         this.hasOuterHandles = true;
  2832.     },
  2833.     
  2834.     unreg: function() {
  2835.         Event.un(this.id, "mousedown",
  2836.                 this.handleMouseDown);
  2837.         this._domRef = null;
  2838.         this.DDM._remove(this);
  2839.     },
  2840.     destroy : function(){
  2841.         this.unreg();
  2842.     },
  2843.     
  2844.     isLocked: function() {
  2845.         return (this.DDM.isLocked() || this.locked);
  2846.     },
  2847.     
  2848.     handleMouseDown: function(e, oDD){
  2849.         if (this.primaryButtonOnly && e.button != 0) {
  2850.             return;
  2851.         }
  2852.         if (this.isLocked()) {
  2853.             return;
  2854.         }
  2855.         this.DDM.refreshCache(this.groups);
  2856.         var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));
  2857.         if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) )  {
  2858.         } else {
  2859.             if (this.clickValidator(e)) {
  2860.                 
  2861.                 this.setStartPosition();
  2862.                 this.b4MouseDown(e);
  2863.                 this.onMouseDown(e);
  2864.                 this.DDM.handleMouseDown(e, this);
  2865.                 this.DDM.stopEvent(e);
  2866.             } else {
  2867.             }
  2868.         }
  2869.     },
  2870.     clickValidator: function(e) {
  2871.         var target = e.getTarget();
  2872.         return ( this.isValidHandleChild(target) &&
  2873.                     (this.id == this.handleElId ||
  2874.                         this.DDM.handleWasClicked(target, this.id)) );
  2875.     },
  2876.     
  2877.     addInvalidHandleType: function(tagName) {
  2878.         var type = tagName.toUpperCase();
  2879.         this.invalidHandleTypes[type] = type;
  2880.     },
  2881.     
  2882.     addInvalidHandleId: function(id) {
  2883.         if (typeof id !== "string") {
  2884.             id = Ext.id(id);
  2885.         }
  2886.         this.invalidHandleIds[id] = id;
  2887.     },
  2888.     
  2889.     addInvalidHandleClass: function(cssClass) {
  2890.         this.invalidHandleClasses.push(cssClass);
  2891.     },
  2892.     
  2893.     removeInvalidHandleType: function(tagName) {
  2894.         var type = tagName.toUpperCase();
  2895.         
  2896.         delete this.invalidHandleTypes[type];
  2897.     },
  2898.     
  2899.     removeInvalidHandleId: function(id) {
  2900.         if (typeof id !== "string") {
  2901.             id = Ext.id(id);
  2902.         }
  2903.         delete this.invalidHandleIds[id];
  2904.     },
  2905.     
  2906.     removeInvalidHandleClass: function(cssClass) {
  2907.         for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
  2908.             if (this.invalidHandleClasses[i] == cssClass) {
  2909.                 delete this.invalidHandleClasses[i];
  2910.             }
  2911.         }
  2912.     },
  2913.     
  2914.     isValidHandleChild: function(node) {
  2915.         var valid = true;
  2916.         
  2917.         var nodeName;
  2918.         try {
  2919.             nodeName = node.nodeName.toUpperCase();
  2920.         } catch(e) {
  2921.             nodeName = node.nodeName;
  2922.         }
  2923.         valid = valid && !this.invalidHandleTypes[nodeName];
  2924.         valid = valid && !this.invalidHandleIds[node.id];
  2925.         for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
  2926.             valid = !Ext.fly(node).hasClass(this.invalidHandleClasses[i]);
  2927.         }
  2928.         return valid;
  2929.     },
  2930.     
  2931.     setXTicks: function(iStartX, iTickSize) {
  2932.         this.xTicks = [];
  2933.         this.xTickSize = iTickSize;
  2934.         var tickMap = {};
  2935.         for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
  2936.             if (!tickMap[i]) {
  2937.                 this.xTicks[this.xTicks.length] = i;
  2938.                 tickMap[i] = true;
  2939.             }
  2940.         }
  2941.         for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
  2942.             if (!tickMap[i]) {
  2943.                 this.xTicks[this.xTicks.length] = i;
  2944.                 tickMap[i] = true;
  2945.             }
  2946.         }
  2947.         this.xTicks.sort(this.DDM.numericSort) ;
  2948.     },
  2949.     
  2950.     setYTicks: function(iStartY, iTickSize) {
  2951.         this.yTicks = [];
  2952.         this.yTickSize = iTickSize;
  2953.         var tickMap = {};
  2954.         for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
  2955.             if (!tickMap[i]) {
  2956.                 this.yTicks[this.yTicks.length] = i;
  2957.                 tickMap[i] = true;
  2958.             }
  2959.         }
  2960.         for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
  2961.             if (!tickMap[i]) {
  2962.                 this.yTicks[this.yTicks.length] = i;
  2963.                 tickMap[i] = true;
  2964.             }
  2965.         }
  2966.         this.yTicks.sort(this.DDM.numericSort) ;
  2967.     },
  2968.     
  2969.     setXConstraint: function(iLeft, iRight, iTickSize) {
  2970.         this.leftConstraint = iLeft;
  2971.         this.rightConstraint = iRight;
  2972.         this.minX = this.initPageX - iLeft;
  2973.         this.maxX = this.initPageX + iRight;
  2974.         if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
  2975.         this.constrainX = true;
  2976.     },
  2977.     
  2978.     clearConstraints: function() {
  2979.         this.constrainX = false;
  2980.         this.constrainY = false;
  2981.         this.clearTicks();
  2982.     },
  2983.     
  2984.     clearTicks: function() {
  2985.         this.xTicks = null;
  2986.         this.yTicks = null;
  2987.         this.xTickSize = 0;
  2988.         this.yTickSize = 0;
  2989.     },
  2990.     
  2991.     setYConstraint: function(iUp, iDown, iTickSize) {
  2992.         this.topConstraint = iUp;
  2993.         this.bottomConstraint = iDown;
  2994.         this.minY = this.initPageY - iUp;
  2995.         this.maxY = this.initPageY + iDown;
  2996.         if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
  2997.         this.constrainY = true;
  2998.     },
  2999.     
  3000.     resetConstraints: function() {
  3001.         
  3002.         if (this.initPageX || this.initPageX === 0) {
  3003.             
  3004.             var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
  3005.             var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
  3006.             this.setInitPosition(dx, dy);
  3007.         
  3008.         } else {
  3009.             this.setInitPosition();
  3010.         }
  3011.         if (this.constrainX) {
  3012.             this.setXConstraint( this.leftConstraint,
  3013.                                  this.rightConstraint,
  3014.                                  this.xTickSize        );
  3015.         }
  3016.         if (this.constrainY) {
  3017.             this.setYConstraint( this.topConstraint,
  3018.                                  this.bottomConstraint,
  3019.                                  this.yTickSize         );
  3020.         }
  3021.     },
  3022.     
  3023.     getTick: function(val, tickArray) {
  3024.         if (!tickArray) {
  3025.             
  3026.             
  3027.             return val;
  3028.         } else if (tickArray[0] >= val) {
  3029.             
  3030.             
  3031.             return tickArray[0];
  3032.         } else {
  3033.             for (var i=0, len=tickArray.length; i<len; ++i) {
  3034.                 var next = i + 1;
  3035.                 if (tickArray[next] && tickArray[next] >= val) {
  3036.                     var diff1 = val - tickArray[i];
  3037.                     var diff2 = tickArray[next] - val;
  3038.                     return (diff2 > diff1) ? tickArray[i] : tickArray[next];
  3039.                 }
  3040.             }
  3041.             
  3042.             
  3043.             return tickArray[tickArray.length - 1];
  3044.         }
  3045.     },
  3046.     
  3047.     toString: function() {
  3048.         return ("DragDrop " + this.id);
  3049.     }
  3050. };
  3051. })();
  3052. if (!Ext.dd.DragDropMgr) {
  3053. Ext.dd.DragDropMgr = function() {
  3054.     var Event = Ext.EventManager;
  3055.     return {
  3056.         
  3057.         ids: {},
  3058.         
  3059.         handleIds: {},
  3060.         
  3061.         dragCurrent: null,
  3062.         
  3063.         dragOvers: {},
  3064.         
  3065.         deltaX: 0,
  3066.         
  3067.         deltaY: 0,
  3068.         
  3069.         preventDefault: true,
  3070.         
  3071.         stopPropagation: true,
  3072.         
  3073.         initialized: false,
  3074.         
  3075.         locked: false,
  3076.         
  3077.         init: function() {
  3078.             this.initialized = true;
  3079.         },
  3080.         
  3081.         POINT: 0,
  3082.         
  3083.         INTERSECT: 1,
  3084.         
  3085.         mode: 0,
  3086.         
  3087.         _execOnAll: function(sMethod, args) {
  3088.             for (var i in this.ids) {
  3089.                 for (var j in this.ids[i]) {
  3090.                     var oDD = this.ids[i][j];
  3091.                     if (! this.isTypeOfDD(oDD)) {
  3092.                         continue;
  3093.                     }
  3094.                     oDD[sMethod].apply(oDD, args);
  3095.                 }
  3096.             }
  3097.         },
  3098.         
  3099.         _onLoad: function() {
  3100.             this.init();
  3101.             Event.on(document, "mouseup",   this.handleMouseUp, this, true);
  3102.             Event.on(document, "mousemove", this.handleMouseMove, this, true);
  3103.             Event.on(window,   "unload",    this._onUnload, this, true);
  3104.             Event.on(window,   "resize",    this._onResize, this, true);
  3105.             
  3106.         },
  3107.         
  3108.         _onResize: function(e) {
  3109.             this._execOnAll("resetConstraints", []);
  3110.         },
  3111.         
  3112.         lock: function() { this.locked = true; },
  3113.         
  3114.         unlock: function() { this.locked = false; },
  3115.         
  3116.         isLocked: function() { return this.locked; },
  3117.         
  3118.         locationCache: {},
  3119.         
  3120.         useCache: true,
  3121.         
  3122.         clickPixelThresh: 3,
  3123.         
  3124.         clickTimeThresh: 350,
  3125.         
  3126.         dragThreshMet: false,
  3127.         
  3128.         clickTimeout: null,
  3129.         
  3130.         startX: 0,
  3131.         
  3132.         startY: 0,
  3133.         
  3134.         regDragDrop: function(oDD, sGroup) {
  3135.             if (!this.initialized) { this.init(); }
  3136.             if (!this.ids[sGroup]) {
  3137.                 this.ids[sGroup] = {};
  3138.             }
  3139.             this.ids[sGroup][oDD.id] = oDD;
  3140.         },
  3141.         
  3142.         removeDDFromGroup: function(oDD, sGroup) {
  3143.             if (!this.ids[sGroup]) {
  3144.                 this.ids[sGroup] = {};
  3145.             }
  3146.             var obj = this.ids[sGroup];
  3147.             if (obj && obj[oDD.id]) {
  3148.                 delete obj[oDD.id];
  3149.             }
  3150.         },
  3151.         
  3152.         _remove: function(oDD) {
  3153.             for (var g in oDD.groups) {
  3154.                 if (g && this.ids[g] && this.ids[g][oDD.id]) {
  3155.                     delete this.ids[g][oDD.id];
  3156.                 }
  3157.             }
  3158.             delete this.handleIds[oDD.id];
  3159.         },
  3160.         
  3161.         regHandle: function(sDDId, sHandleId) {
  3162.             if (!this.handleIds[sDDId]) {
  3163.                 this.handleIds[sDDId] = {};
  3164.             }
  3165.             this.handleIds[sDDId][sHandleId] = sHandleId;
  3166.         },
  3167.         
  3168.         isDragDrop: function(id) {
  3169.             return ( this.getDDById(id) ) ? true : false;
  3170.         },
  3171.         
  3172.         getRelated: function(p_oDD, bTargetsOnly) {
  3173.             var oDDs = [];
  3174.             for (var i in p_oDD.groups) {
  3175.                 for (var j in this.ids[i]) {
  3176.                     var dd = this.ids[i][j];
  3177.                     if (! this.isTypeOfDD(dd)) {
  3178.                         continue;
  3179.                     }
  3180.                     if (!bTargetsOnly || dd.isTarget) {
  3181.                         oDDs[oDDs.length] = dd;
  3182.                     }
  3183.                 }
  3184.             }
  3185.             return oDDs;
  3186.         },
  3187.         
  3188.         isLegalTarget: function (oDD, oTargetDD) {
  3189.             var targets = this.getRelated(oDD, true);
  3190.             for (var i=0, len=targets.length;i<len;++i) {
  3191.                 if (targets[i].id == oTargetDD.id) {
  3192.                     return true;
  3193.                 }
  3194.             }
  3195.             return false;
  3196.         },
  3197.         
  3198.         isTypeOfDD: function (oDD) {
  3199.             return (oDD && oDD.__ygDragDrop);
  3200.         },
  3201.         
  3202.         isHandle: function(sDDId, sHandleId) {
  3203.             return ( this.handleIds[sDDId] &&
  3204.                             this.handleIds[sDDId][sHandleId] );
  3205.         },
  3206.         
  3207.         getDDById: function(id) {
  3208.             for (var i in this.ids) {
  3209.                 if (this.ids[i][id]) {
  3210.                     return this.ids[i][id];
  3211.                 }
  3212.             }
  3213.             return null;
  3214.         },
  3215.         
  3216.         handleMouseDown: function(e, oDD) {
  3217.             if(Ext.QuickTips){
  3218.                 Ext.QuickTips.disable();
  3219.             }
  3220.             if(this.dragCurrent){
  3221.                 
  3222.                 
  3223.                 this.handleMouseUp(e);
  3224.             }
  3225.             
  3226.             this.currentTarget = e.getTarget();
  3227.             this.dragCurrent = oDD;
  3228.             var el = oDD.getEl();
  3229.             
  3230.             this.startX = e.getPageX();
  3231.             this.startY = e.getPageY();
  3232.             this.deltaX = this.startX - el.offsetLeft;
  3233.             this.deltaY = this.startY - el.offsetTop;
  3234.             this.dragThreshMet = false;
  3235.             this.clickTimeout = setTimeout(
  3236.                     function() {
  3237.                         var DDM = Ext.dd.DDM;
  3238.                         DDM.startDrag(DDM.startX, DDM.startY);
  3239.                     },
  3240.                     this.clickTimeThresh );
  3241.         },
  3242.         
  3243.         startDrag: function(x, y) {
  3244.             clearTimeout(this.clickTimeout);
  3245.             if (this.dragCurrent) {
  3246.                 this.dragCurrent.b4StartDrag(x, y);
  3247.                 this.dragCurrent.startDrag(x, y);
  3248.             }
  3249.             this.dragThreshMet = true;
  3250.         },
  3251.         
  3252.         handleMouseUp: function(e) {
  3253.             if(Ext.QuickTips){
  3254.                 Ext.QuickTips.enable();
  3255.             }
  3256.             if (! this.dragCurrent) {
  3257.                 return;
  3258.             }
  3259.             clearTimeout(this.clickTimeout);
  3260.             if (this.dragThreshMet) {
  3261.                 this.fireEvents(e, true);
  3262.             } else {
  3263.             }
  3264.             this.stopDrag(e);
  3265.             this.stopEvent(e);
  3266.         },
  3267.         
  3268.         stopEvent: function(e){
  3269.             if(this.stopPropagation) {
  3270.                 e.stopPropagation();
  3271.             }
  3272.             if (this.preventDefault) {
  3273.                 e.preventDefault();
  3274.             }
  3275.         },
  3276.         
  3277.         stopDrag: function(e) {
  3278.             
  3279.             if (this.dragCurrent) {
  3280.                 if (this.dragThreshMet) {
  3281.                     this.dragCurrent.b4EndDrag(e);
  3282.                     this.dragCurrent.endDrag(e);
  3283.                 }
  3284.                 this.dragCurrent.onMouseUp(e);
  3285.             }
  3286.             this.dragCurrent = null;
  3287.             this.dragOvers = {};
  3288.         },
  3289.         
  3290.         handleMouseMove: function(e) {
  3291.             if (! this.dragCurrent) {
  3292.                 return true;
  3293.             }
  3294.             
  3295.             
  3296.             if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
  3297.                 this.stopEvent(e);
  3298.                 return this.handleMouseUp(e);
  3299.             }
  3300.             if (!this.dragThreshMet) {
  3301.                 var diffX = Math.abs(this.startX - e.getPageX());
  3302.                 var diffY = Math.abs(this.startY - e.getPageY());
  3303.                 if (diffX > this.clickPixelThresh ||
  3304.                             diffY > this.clickPixelThresh) {
  3305.                     this.startDrag(this.startX, this.startY);
  3306.                 }
  3307.             }
  3308.             if (this.dragThreshMet) {
  3309.                 this.dragCurrent.b4Drag(e);
  3310.                 this.dragCurrent.onDrag(e);
  3311.                 if(!this.dragCurrent.moveOnly){
  3312.                     this.fireEvents(e, false);
  3313.                 }
  3314.             }
  3315.             this.stopEvent(e);
  3316.             return true;
  3317.         },
  3318.         
  3319.         fireEvents: function(e, isDrop) {
  3320.             var dc = this.dragCurrent;
  3321.             
  3322.             
  3323.             if (!dc || dc.isLocked()) {
  3324.                 return;
  3325.             }
  3326.             var pt = e.getPoint();
  3327.             
  3328.             var oldOvers = [];
  3329.             var outEvts   = [];
  3330.             var overEvts  = [];
  3331.             var dropEvts  = [];
  3332.             var enterEvts = [];
  3333.             
  3334.             
  3335.             for (var i in this.dragOvers) {
  3336.                 var ddo = this.dragOvers[i];
  3337.                 if (! this.isTypeOfDD(ddo)) {
  3338.                     continue;
  3339.                 }
  3340.                 if (! this.isOverTarget(pt, ddo, this.mode)) {
  3341.                     outEvts.push( ddo );
  3342.                 }
  3343.                 oldOvers[i] = true;
  3344.                 delete this.dragOvers[i];
  3345.             }
  3346.             for (var sGroup in dc.groups) {
  3347.                 if ("string" != typeof sGroup) {
  3348.                     continue;
  3349.                 }
  3350.                 for (i in this.ids[sGroup]) {
  3351.                     var oDD = this.ids[sGroup][i];
  3352.                     if (! this.isTypeOfDD(oDD)) {
  3353.                         continue;
  3354.                     }
  3355.                     if (oDD.isTarget && !oDD.isLocked() && ((oDD != dc) || (dc.ignoreSelf === false))) {
  3356.                         if (this.isOverTarget(pt, oDD, this.mode)) {
  3357.                             
  3358.                             if (isDrop) {
  3359.                                 dropEvts.push( oDD );
  3360.                             
  3361.                             } else {
  3362.                                 
  3363.                                 if (!oldOvers[oDD.id]) {
  3364.                                     enterEvts.push( oDD );
  3365.                                 
  3366.                                 } else {
  3367.                                     overEvts.push( oDD );
  3368.                                 }
  3369.                                 this.dragOvers[oDD.id] = oDD;
  3370.                             }
  3371.                         }
  3372.                     }
  3373.                 }
  3374.             }
  3375.             if (this.mode) {
  3376.                 if (outEvts.length) {
  3377.                     dc.b4DragOut(e, outEvts);
  3378.                     dc.onDragOut(e, outEvts);
  3379.                 }
  3380.                 if (enterEvts.length) {
  3381.                     dc.onDragEnter(e, enterEvts);
  3382.                 }
  3383.                 if (overEvts.length) {
  3384.                     dc.b4DragOver(e, overEvts);
  3385.                     dc.onDragOver(e, overEvts);
  3386.                 }
  3387.                 if (dropEvts.length) {
  3388.                     dc.b4DragDrop(e, dropEvts);
  3389.                     dc.onDragDrop(e, dropEvts);
  3390.                 }
  3391.             } else {
  3392.                 
  3393.                 var len = 0;
  3394.                 for (i=0, len=outEvts.length; i<len; ++i) {
  3395.                     dc.b4DragOut(e, outEvts[i].id);
  3396.                     dc.onDragOut(e, outEvts[i].id);
  3397.                 }
  3398.                 
  3399.                 for (i=0,len=enterEvts.length; i<len; ++i) {
  3400.                     
  3401.                     dc.onDragEnter(e, enterEvts[i].id);
  3402.                 }
  3403.                 
  3404.                 for (i=0,len=overEvts.length; i<len; ++i) {
  3405.                     dc.b4DragOver(e, overEvts[i].id);
  3406.                     dc.onDragOver(e, overEvts[i].id);
  3407.                 }
  3408.                 
  3409.                 for (i=0, len=dropEvts.length; i<len; ++i) {
  3410.                     dc.b4DragDrop(e, dropEvts[i].id);
  3411.                     dc.onDragDrop(e, dropEvts[i].id);
  3412.                 }
  3413.             }
  3414.             
  3415.             if (isDrop && !dropEvts.length) {
  3416.                 dc.onInvalidDrop(e);
  3417.             }
  3418.         },
  3419.         
  3420.         getBestMatch: function(dds) {
  3421.             var winner = null;
  3422.             
  3423.             
  3424.                
  3425.             
  3426.             
  3427.             var len = dds.length;
  3428.             if (len == 1) {
  3429.                 winner = dds[0];
  3430.             } else {
  3431.                 
  3432.                 for (var i=0; i<len; ++i) {
  3433.                     var dd = dds[i];
  3434.                     
  3435.                     
  3436.                     
  3437.                     if (dd.cursorIsOver) {
  3438.                         winner = dd;
  3439.                         break;
  3440.                     
  3441.                     } else {
  3442.                         if (!winner ||
  3443.                             winner.overlap.getArea() < dd.overlap.getArea()) {
  3444.                             winner = dd;
  3445.                         }
  3446.                     }
  3447.                 }
  3448.             }
  3449.             return winner;
  3450.         },
  3451.         
  3452.         refreshCache: function(groups) {
  3453.             for (var sGroup in groups) {
  3454.                 if ("string" != typeof sGroup) {
  3455.                     continue;
  3456.                 }
  3457.                 for (var i in this.ids[sGroup]) {
  3458.                     var oDD = this.ids[sGroup][i];
  3459.                     if (this.isTypeOfDD(oDD)) {
  3460.                     
  3461.                         var loc = this.getLocation(oDD);
  3462.                         if (loc) {
  3463.                             this.locationCache[oDD.id] = loc;
  3464.                         } else {
  3465.                             delete this.locationCache[oDD.id];
  3466.                             
  3467.                             
  3468.                             
  3469.                         }
  3470.                     }
  3471.                 }
  3472.             }
  3473.         },
  3474.         
  3475.         verifyEl: function(el) {
  3476.             if (el) {
  3477.                 var parent;
  3478.                 if(Ext.isIE){
  3479.                     try{
  3480.                         parent = el.offsetParent;
  3481.                     }catch(e){}
  3482.                 }else{
  3483.                     parent = el.offsetParent;
  3484.                 }
  3485.                 if (parent) {
  3486.                     return true;
  3487.                 }
  3488.             }
  3489.             return false;
  3490.         },
  3491.         
  3492.         getLocation: function(oDD) {
  3493.             if (! this.isTypeOfDD(oDD)) {
  3494.                 return null;
  3495.             }
  3496.             var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
  3497.             try {
  3498.                 pos= Ext.lib.Dom.getXY(el);
  3499.             } catch (e) { }
  3500.             if (!pos) {
  3501.                 return null;
  3502.             }
  3503.             x1 = pos[0];
  3504.             x2 = x1 + el.offsetWidth;
  3505.             y1 = pos[1];
  3506.             y2 = y1 + el.offsetHeight;
  3507.             t = y1 - oDD.padding[0];
  3508.             r = x2 + oDD.padding[1];
  3509.             b = y2 + oDD.padding[2];
  3510.             l = x1 - oDD.padding[3];
  3511.             return new Ext.lib.Region( t, r, b, l );
  3512.         },
  3513.         
  3514.         isOverTarget: function(pt, oTarget, intersect) {
  3515.             
  3516.             var loc = this.locationCache[oTarget.id];
  3517.             if (!loc || !this.useCache) {
  3518.                 loc = this.getLocation(oTarget);
  3519.                 this.locationCache[oTarget.id] = loc;
  3520.             }
  3521.             if (!loc) {
  3522.                 return false;
  3523.             }
  3524.             oTarget.cursorIsOver = loc.contains( pt );
  3525.             
  3526.             
  3527.             
  3528.             
  3529.             
  3530.             var dc = this.dragCurrent;
  3531.             if (!dc || !dc.getTargetCoord ||
  3532.                     (!intersect && !dc.constrainX && !dc.constrainY)) {
  3533.                 return oTarget.cursorIsOver;
  3534.             }
  3535.             oTarget.overlap = null;
  3536.             
  3537.             
  3538.             
  3539.             
  3540.             var pos = dc.getTargetCoord(pt.x, pt.y);
  3541.             var el = dc.getDragEl();
  3542.             var curRegion = new Ext.lib.Region( pos.y,
  3543.                                                    pos.x + el.offsetWidth,
  3544.                                                    pos.y + el.offsetHeight,
  3545.                                                    pos.x );
  3546.             var overlap = curRegion.intersect(loc);
  3547.             if (overlap) {
  3548.                 oTarget.overlap = overlap;
  3549.                 return (intersect) ? true : oTarget.cursorIsOver;
  3550.             } else {
  3551.                 return false;
  3552.             }
  3553.         },
  3554.         
  3555.         _onUnload: function(e, me) {
  3556.             Ext.dd.DragDropMgr.unregAll();
  3557.         },
  3558.         
  3559.         unregAll: function() {
  3560.             if (this.dragCurrent) {
  3561.                 this.stopDrag();
  3562.                 this.dragCurrent = null;
  3563.             }
  3564.             this._execOnAll("unreg", []);
  3565.             for (var i in this.elementCache) {
  3566.                 delete this.elementCache[i];
  3567.             }
  3568.             this.elementCache = {};
  3569.             this.ids = {};
  3570.         },
  3571.         
  3572.         elementCache: {},
  3573.         
  3574.         getElWrapper: function(id) {
  3575.             var oWrapper = this.elementCache[id];
  3576.             if (!oWrapper || !oWrapper.el) {
  3577.                 oWrapper = this.elementCache[id] =
  3578.                     new this.ElementWrapper(Ext.getDom(id));
  3579.             }
  3580.             return oWrapper;
  3581.         },
  3582.         
  3583.         getElement: function(id) {
  3584.             return Ext.getDom(id);
  3585.         },
  3586.         
  3587.         getCss: function(id) {
  3588.             var el = Ext.getDom(id);
  3589.             return (el) ? el.style : null;
  3590.         },
  3591.         
  3592.         ElementWrapper: function(el) {
  3593.                 
  3594.                 this.el = el || null;
  3595.                 
  3596.                 this.id = this.el && el.id;
  3597.                 
  3598.                 this.css = this.el && el.style;
  3599.             },
  3600.         
  3601.         getPosX: function(el) {
  3602.             return Ext.lib.Dom.getX(el);
  3603.         },
  3604.         
  3605.         getPosY: function(el) {
  3606.             return Ext.lib.Dom.getY(el);
  3607.         },
  3608.         
  3609.         swapNode: function(n1, n2) {
  3610.             if (n1.swapNode) {
  3611.                 n1.swapNode(n2);
  3612.             } else {
  3613.                 var p = n2.parentNode;
  3614.                 var s = n2.nextSibling;
  3615.                 if (s == n1) {
  3616.                     p.insertBefore(n1, n2);
  3617.                 } else if (n2 == n1.nextSibling) {
  3618.                     p.insertBefore(n2, n1);
  3619.                 } else {
  3620.                     n1.parentNode.replaceChild(n2, n1);
  3621.                     p.insertBefore(n1, s);
  3622.                 }
  3623.             }
  3624.         },
  3625.         
  3626.         getScroll: function () {
  3627.             var t, l, dde=document.documentElement, db=document.body;
  3628.             if (dde && (dde.scrollTop || dde.scrollLeft)) {
  3629.                 t = dde.scrollTop;
  3630.                 l = dde.scrollLeft;
  3631.             } else if (db) {
  3632.                 t = db.scrollTop;
  3633.                 l = db.scrollLeft;
  3634.             } else {
  3635.             }
  3636.             return { top: t, left: l };
  3637.         },
  3638.         
  3639.         getStyle: function(el, styleProp) {
  3640.             return Ext.fly(el).getStyle(styleProp);
  3641.         },
  3642.         
  3643.         getScrollTop: function () { return this.getScroll().top; },
  3644.         
  3645.         getScrollLeft: function () { return this.getScroll().left; },
  3646.         
  3647.         moveToEl: function (moveEl, targetEl) {
  3648.             var aCoord = Ext.lib.Dom.getXY(targetEl);
  3649.             Ext.lib.Dom.setXY(moveEl, aCoord);
  3650.         },
  3651.         
  3652.         numericSort: function(a, b) { return (a - b); },
  3653.         
  3654.         _timeoutCount: 0,
  3655.         
  3656.         _addListeners: function() {
  3657.             var DDM = Ext.dd.DDM;
  3658.             if ( Ext.lib.Event && document ) {
  3659.                 DDM._onLoad();
  3660.             } else {
  3661.                 if (DDM._timeoutCount > 2000) {
  3662.                 } else {
  3663.                     setTimeout(DDM._addListeners, 10);
  3664.                     if (document && document.body) {
  3665.                         DDM._timeoutCount += 1;
  3666.                     }
  3667.                 }
  3668.             }
  3669.         },
  3670.         
  3671.         handleWasClicked: function(node, id) {
  3672.             if (this.isHandle(id, node.id)) {
  3673.                 return true;
  3674.             } else {
  3675.                 
  3676.                 var p = node.parentNode;
  3677.                 while (p) {
  3678.                     if (this.isHandle(id, p.id)) {
  3679.                         return true;
  3680.                     } else {
  3681.                         p = p.parentNode;
  3682.                     }
  3683.                 }
  3684.             }
  3685.             return false;
  3686.         }
  3687.     };
  3688. }();
  3689. Ext.dd.DDM = Ext.dd.DragDropMgr;
  3690. Ext.dd.DDM._addListeners();
  3691. }
  3692. Ext.dd.DD = function(id, sGroup, config) {
  3693.     if (id) {
  3694.         this.init(id, sGroup, config);
  3695.     }
  3696. };
  3697. Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
  3698.     
  3699.     scroll: true,
  3700.     
  3701.     autoOffset: function(iPageX, iPageY) {
  3702.         var x = iPageX - this.startPageX;
  3703.         var y = iPageY - this.startPageY;
  3704.         this.setDelta(x, y);
  3705.     },
  3706.     
  3707.     setDelta: function(iDeltaX, iDeltaY) {
  3708.         this.deltaX = iDeltaX;
  3709.         this.deltaY = iDeltaY;
  3710.     },
  3711.     
  3712.     setDragElPos: function(iPageX, iPageY) {
  3713.         
  3714.         
  3715.         var el = this.getDragEl();
  3716.         this.alignElWithMouse(el, iPageX, iPageY);
  3717.     },
  3718.     
  3719.     alignElWithMouse: function(el, iPageX, iPageY) {
  3720.         var oCoord = this.getTargetCoord(iPageX, iPageY);
  3721.         var fly = el.dom ? el : Ext.fly(el, '_dd');
  3722.         if (!this.deltaSetXY) {
  3723.             var aCoord = [oCoord.x, oCoord.y];
  3724.             fly.setXY(aCoord);
  3725.             var newLeft = fly.getLeft(true);
  3726.             var newTop  = fly.getTop(true);
  3727.             this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
  3728.         } else {
  3729.             fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
  3730.         }
  3731.         this.cachePosition(oCoord.x, oCoord.y);
  3732.         this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
  3733.         return oCoord;
  3734.     },
  3735.     
  3736.     cachePosition: function(iPageX, iPageY) {
  3737.         if (iPageX) {
  3738.             this.lastPageX = iPageX;
  3739.             this.lastPageY = iPageY;
  3740.         } else {
  3741.             var aCoord = Ext.lib.Dom.getXY(this.getEl());
  3742.             this.lastPageX = aCoord[0];
  3743.             this.lastPageY = aCoord[1];
  3744.         }
  3745.     },
  3746.     
  3747.     autoScroll: function(x, y, h, w) {
  3748.         if (this.scroll) {
  3749.             
  3750.             var clientH = Ext.lib.Dom.getViewHeight();
  3751.             
  3752.             var clientW = Ext.lib.Dom.getViewWidth();
  3753.             
  3754.             var st = this.DDM.getScrollTop();
  3755.             
  3756.             var sl = this.DDM.getScrollLeft();
  3757.             
  3758.             var bot = h + y;
  3759.             
  3760.             var right = w + x;
  3761.             
  3762.             
  3763.             
  3764.             var toBot = (clientH + st - y - this.deltaY);
  3765.             
  3766.             var toRight = (clientW + sl - x - this.deltaX);
  3767.             
  3768.             
  3769.             var thresh = 40;
  3770.             
  3771.             
  3772.             
  3773.             var scrAmt = (document.all) ? 80 : 30;
  3774.             
  3775.             
  3776.             if ( bot > clientH && toBot < thresh ) {
  3777.                 window.scrollTo(sl, st + scrAmt);
  3778.             }
  3779.             
  3780.             
  3781.             if ( y < st && st > 0 && y - st < thresh ) {
  3782.                 window.scrollTo(sl, st - scrAmt);
  3783.             }
  3784.             
  3785.             
  3786.             if ( right > clientW && toRight < thresh ) {
  3787.                 window.scrollTo(sl + scrAmt, st);
  3788.             }
  3789.             
  3790.             
  3791.             if ( x < sl && sl > 0 && x - sl < thresh ) {
  3792.                 window.scrollTo(sl - scrAmt, st);
  3793.             }
  3794.         }
  3795.     },
  3796.     
  3797.     getTargetCoord: function(iPageX, iPageY) {
  3798.         var x = iPageX - this.deltaX;
  3799.         var y = iPageY - this.deltaY;
  3800.         if (this.constrainX) {
  3801.             if (x < this.minX) { x = this.minX; }
  3802.             if (x > this.maxX) { x = this.maxX; }
  3803.         }
  3804.         if (this.constrainY) {
  3805.             if (y < this.minY) { y = this.minY; }
  3806.             if (y > this.maxY) { y = this.maxY; }
  3807.         }
  3808.         x = this.getTick(x, this.xTicks);
  3809.         y = this.getTick(y, this.yTicks);
  3810.         return {x:x, y:y};
  3811.     },
  3812.     
  3813.     applyConfig: function() {
  3814.         Ext.dd.DD.superclass.applyConfig.call(this);
  3815.         this.scroll = (this.config.scroll !== false);
  3816.     },
  3817.     
  3818.     b4MouseDown: function(e) {
  3819.         
  3820.         this.autoOffset(e.getPageX(),
  3821.                             e.getPageY());
  3822.     },