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

Jsp/Servlet

开发平台:

Java

  1.     
  2.     
  3.     
  4.     
  5. });
  6. Ext.reg('timefield', Ext.form.TimeField); Ext.form.Label = Ext.extend(Ext.BoxComponent, {                        onRender : function(ct, position){         if(!this.el){             this.el = document.createElement('label');             this.el.id = this.getId();             this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || '');             if(this.forId){                 this.el.setAttribute('htmlFor', this.forId);             }         }         Ext.form.Label.superclass.onRender.call(this, ct, position);     },               setText: function(t, encode){         this.text = t;         if(this.rendered){             this.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(t) : t;         }         return this;     } }); Ext.reg('label', Ext.form.Label); Ext.form.Action = function(form, options){     this.form = form;     this.options = options || {}; }; Ext.form.Action.CLIENT_INVALID = 'client'; Ext.form.Action.SERVER_INVALID = 'server'; Ext.form.Action.CONNECT_FAILURE = 'connect'; Ext.form.Action.LOAD_FAILURE = 'load'; Ext.form.Action.prototype = {     type : 'default',         run : function(options){     },         success : function(response){     },         handleResponse : function(response){     },         failure : function(response){         this.response = response;         this.failureType = Ext.form.Action.CONNECT_FAILURE;         this.form.afterAction(this, false);     },         processResponse : function(response){         this.response = response;         if(!response.responseText){             return true;         }         this.result = this.handleResponse(response);         return this.result;     },         getUrl : function(appendParams){         var url = this.options.url || this.form.url || this.form.el.dom.action;         if(appendParams){             var p = this.getParams();             if(p){                 url += (url.indexOf('?') != -1 ? '&' : '?') + p;             }         }         return url;     },         getMethod : function(){         return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();     },         getParams : function(){         var bp = this.form.baseParams;         var p = this.options.params;         if(p){             if(typeof p == "object"){                 p = Ext.urlEncode(Ext.applyIf(p, bp));             }else if(typeof p == 'string' && bp){                 p += '&' + Ext.urlEncode(bp);             }         }else if(bp){             p = Ext.urlEncode(bp);         }         return p;     },         createCallback : function(opts){ var opts = opts || {};         return {             success: this.success,             failure: this.failure,             scope: this,             timeout: (opts.timeout*1000) || (this.form.timeout*1000),             upload: this.form.fileUpload ? this.success : undefined         };     } }; Ext.form.Action.Submit = function(form, options){     Ext.form.Action.Submit.superclass.constructor.call(this, form, options); }; Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {               type : 'submit',         run : function(){         var o = this.options;         var method = this.getMethod();         var isGet = method == 'GET';         if(o.clientValidation === false || this.form.isValid()){             Ext.Ajax.request(Ext.apply(this.createCallback(o), {                 form:this.form.el.dom,                 url:this.getUrl(isGet),                 method: method,                 headers: o.headers,                 params:!isGet ? this.getParams() : null,                 isUpload: this.form.fileUpload             }));         }else if (o.clientValidation !== false){             this.failureType = Ext.form.Action.CLIENT_INVALID;             this.form.afterAction(this, false);         }     },         success : function(response){         var result = this.processResponse(response);         if(result === true || result.success){             this.form.afterAction(this, true);             return;         }         if(result.errors){             this.form.markInvalid(result.errors);             this.failureType = Ext.form.Action.SERVER_INVALID;         }         this.form.afterAction(this, false);     },         handleResponse : function(response){         if(this.form.errorReader){             var rs = this.form.errorReader.read(response);             var errors = [];             if(rs.records){                 for(var i = 0, len = rs.records.length; i < len; i++) {                     var r = rs.records[i];                     errors[i] = r.data;                 }             }             if(errors.length < 1){                 errors = null;             }             return {                 success : rs.success,                 errors : errors             };         }         return Ext.decode(response.responseText);     } }); Ext.form.Action.Load = function(form, options){     Ext.form.Action.Load.superclass.constructor.call(this, form, options);     this.reader = this.form.reader; }; Ext.extend(Ext.form.Action.Load, Ext.form.Action, {         type : 'load',         run : function(){         Ext.Ajax.request(Ext.apply(                 this.createCallback(this.options), {                     method:this.getMethod(),                     url:this.getUrl(false),                     headers: this.options.headers,                     params:this.getParams()         }));     },         success : function(response){         var result = this.processResponse(response);         if(result === true || !result.success || !result.data){             this.failureType = Ext.form.Action.LOAD_FAILURE;             this.form.afterAction(this, false);             return;         }         this.form.clearInvalid();         this.form.setValues(result.data);         this.form.afterAction(this, true);     },         handleResponse : function(response){         if(this.form.reader){             var rs = this.form.reader.read(response);             var data = rs.records && rs.records[0] ? rs.records[0].data : null;             return {                 success : rs.success,                 data : data             };         }         return Ext.decode(response.responseText);     } }); Ext.form.Action.ACTION_TYPES = {     'load' : Ext.form.Action.Load,     'submit' : Ext.form.Action.Submit }; Ext.form.VTypes = function(){         var alpha = /^[a-zA-Z_]+$/;     var alphanum = /^[a-zA-Z0-9_]+$/;     var email = /^([w]+)(.[w]+)*@([w-]+.){1,5}([A-Za-z]){2,4}$/;     var url = /(((https?)|(ftp))://([-w]+.)+w{2,3}(/[%-w]+(.w{2,})?)*(([w-.?\/+@&#;`~=%!]*)(.w{2,})?)*/?)/i;         return {                  'email' : function(v){             return email.test(v);         },                  'emailText' : 'This field should be an e-mail address in the format "user@domain.com"',                  'emailMask' : /[a-z0-9_.-@]/i,                  'url' : function(v){             return url.test(v);         },                  'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"',                           'alpha' : function(v){             return alpha.test(v);         },                  'alphaText' : 'This field should only contain letters and _',                  'alphaMask' : /[a-z_]/i,                  'alphanum' : function(v){             return alphanum.test(v);         },                  'alphanumText' : 'This field should only contain letters, numbers and _',                  'alphanumMask' : /[a-z0-9_]/i     }; }();
  7. Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
  8.     
  9.     
  10.     
  11.     
  12.     
  13.     
  14.     
  15.     
  16.     
  17.     
  18.     
  19.     
  20.     
  21.     ddText : "{0} selected row{1}",
  22.     
  23.     minColumnWidth : 25,
  24.     
  25.     trackMouseOver : true,
  26.     
  27.     enableDragDrop : false,
  28.     
  29.     enableColumnMove : true,
  30.     
  31.     enableColumnHide : true,
  32.     
  33.     enableHdMenu : true,
  34.     
  35.     stripeRows : false,
  36.     
  37.     autoExpandColumn : false,
  38.     
  39.     autoExpandMin : 50,
  40.     
  41.     autoExpandMax : 1000,
  42.     
  43.     view : null,
  44.     
  45.     loadMask : false,
  46.     
  47.     deferRowRender : true,
  48.          rendered : false,
  49.          viewReady: false,
  50.          stateEvents: ["columnmove", "columnresize", "sortchange"],
  51.          initComponent : function(){
  52.         Ext.grid.GridPanel.superclass.initComponent.call(this);
  53.                           this.autoScroll = false;
  54.         this.autoWidth = false;
  55.         if(Ext.isArray(this.columns)){
  56.             this.colModel = new Ext.grid.ColumnModel(this.columns);
  57.             delete this.columns;
  58.         }
  59.                  if(this.ds){
  60.             this.store = this.ds;
  61.             delete this.ds;
  62.         }
  63.         if(this.cm){
  64.             this.colModel = this.cm;
  65.             delete this.cm;
  66.         }
  67.         if(this.sm){
  68.             this.selModel = this.sm;
  69.             delete this.sm;
  70.         }
  71.         this.store = Ext.StoreMgr.lookup(this.store);
  72.         this.addEvents(
  73.                          
  74.             "click",
  75.             
  76.             "dblclick",
  77.             
  78.             "contextmenu",
  79.             
  80.             "mousedown",
  81.             
  82.             "mouseup",
  83.             
  84.             "mouseover",
  85.             
  86.             "mouseout",
  87.             
  88.             "keypress",
  89.             
  90.             "keydown",
  91.                          
  92.             "cellmousedown",
  93.             
  94.             "rowmousedown",
  95.             
  96.             "headermousedown",
  97.             
  98.             "cellclick",
  99.             
  100.             "celldblclick",
  101.             
  102.             "rowclick",
  103.             
  104.             "rowdblclick",
  105.             
  106.             "headerclick",
  107.             
  108.             "headerdblclick",
  109.             
  110.             "rowcontextmenu",
  111.             
  112.             "cellcontextmenu",
  113.             
  114.             "headercontextmenu",
  115.             
  116.             "bodyscroll",
  117.             
  118.             "columnresize",
  119.             
  120.             "columnmove",
  121.             
  122.             "sortchange"
  123.         );
  124.     },
  125.          onRender : function(ct, position){
  126.         Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
  127.         var c = this.body;
  128.         this.el.addClass('x-grid-panel');
  129.         var view = this.getView();
  130.         view.init(this);
  131.         c.on("mousedown", this.onMouseDown, this);
  132.         c.on("click", this.onClick, this);
  133.         c.on("dblclick", this.onDblClick, this);
  134.         c.on("contextmenu", this.onContextMenu, this);
  135.         c.on("keydown", this.onKeyDown, this);
  136.         this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]);
  137.         this.getSelectionModel().init(this);
  138.         this.view.render();
  139.     },
  140.          initEvents : function(){
  141.         Ext.grid.GridPanel.superclass.initEvents.call(this);
  142.         if(this.loadMask){
  143.             this.loadMask = new Ext.LoadMask(this.bwrap,
  144.                     Ext.apply({store:this.store}, this.loadMask));
  145.         }
  146.     },
  147.     initStateEvents : function(){
  148.         Ext.grid.GridPanel.superclass.initStateEvents.call(this);
  149.         this.colModel.on('hiddenchange', this.saveState, this, {delay: 100});
  150.     },
  151.     applyState : function(state){
  152.         var cm = this.colModel;
  153.         var cs = state.columns;
  154.         if(cs){
  155.             for(var i = 0, len = cs.length; i < len; i++){
  156.                 var s = cs[i];
  157.                 var c = cm.getColumnById(s.id);
  158.                 if(c){
  159.                     c.hidden = s.hidden;
  160.                     c.width = s.width;
  161.                     var oldIndex = cm.getIndexById(s.id);
  162.                     if(oldIndex != i){
  163.                         cm.moveColumn(oldIndex, i);
  164.                     }
  165.                 }
  166.             }
  167.         }
  168.         if(state.sort){
  169.             this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction);
  170.         }
  171.     },
  172.     getState : function(){
  173.         var o = {columns: []};
  174.         for(var i = 0, c; c = this.colModel.config[i]; i++){
  175.             o.columns[i] = {
  176.                 id: c.id,
  177.                 width: c.width
  178.             };
  179.             if(c.hidden){
  180.                 o.columns[i].hidden = true;
  181.             }
  182.         }
  183.         var ss = this.store.getSortState();
  184.         if(ss){
  185.             o.sort = ss;
  186.         }
  187.         return o;
  188.     },
  189.          afterRender : function(){
  190.         Ext.grid.GridPanel.superclass.afterRender.call(this);
  191.         this.view.layout();
  192.         if(this.deferRowRender){
  193.             this.view.afterRender.defer(10, this.view);
  194.         }else{
  195.             this.view.afterRender();
  196.         }
  197.         this.viewReady = true;
  198.     },
  199.     
  200.     reconfigure : function(store, colModel){
  201.         if(this.loadMask){
  202.             this.loadMask.destroy();
  203.             this.loadMask = new Ext.LoadMask(this.bwrap,
  204.                     Ext.apply({store:store}, this.initialConfig.loadMask));
  205.         }
  206.         this.view.bind(store, colModel);
  207.         this.store = store;
  208.         this.colModel = colModel;
  209.         if(this.rendered){
  210.             this.view.refresh(true);
  211.         }
  212.     },
  213.          onKeyDown : function(e){
  214.         this.fireEvent("keydown", e);
  215.     },
  216.          onDestroy : function(){
  217.         if(this.rendered){
  218.             if(this.loadMask){
  219.                 this.loadMask.destroy();
  220.             }
  221.             var c = this.body;
  222.             c.removeAllListeners();
  223.             this.view.destroy();
  224.             c.update("");
  225.         }
  226.         this.colModel.purgeListeners();
  227.         Ext.grid.GridPanel.superclass.onDestroy.call(this);
  228.     },
  229.          processEvent : function(name, e){
  230.         this.fireEvent(name, e);
  231.         var t = e.getTarget();
  232.         var v = this.view;
  233.         var header = v.findHeaderIndex(t);
  234.         if(header !== false){
  235.             this.fireEvent("header" + name, this, header, e);
  236.         }else{
  237.             var row = v.findRowIndex(t);
  238.             var cell = v.findCellIndex(t);
  239.             if(row !== false){
  240.                 this.fireEvent("row" + name, this, row, e);
  241.                 if(cell !== false){
  242.                     this.fireEvent("cell" + name, this, row, cell, e);
  243.                 }
  244.             }
  245.         }
  246.     },
  247.          onClick : function(e){
  248.         this.processEvent("click", e);
  249.     },
  250.          onMouseDown : function(e){
  251.         this.processEvent("mousedown", e);
  252.     },
  253.          onContextMenu : function(e, t){
  254.         this.processEvent("contextmenu", e);
  255.     },
  256.          onDblClick : function(e){
  257.         this.processEvent("dblclick", e);
  258.     },
  259.          walkCells : function(row, col, step, fn, scope){
  260.         var cm = this.colModel, clen = cm.getColumnCount();
  261.         var ds = this.store, rlen = ds.getCount(), first = true;
  262.         if(step < 0){
  263.             if(col < 0){
  264.                 row--;
  265.                 first = false;
  266.             }
  267.             while(row >= 0){
  268.                 if(!first){
  269.                     col = clen-1;
  270.                 }
  271.                 first = false;
  272.                 while(col >= 0){
  273.                     if(fn.call(scope || this, row, col, cm) === true){
  274.                         return [row, col];
  275.                     }
  276.                     col--;
  277.                 }
  278.                 row--;
  279.             }
  280.         } else {
  281.             if(col >= clen){
  282.                 row++;
  283.                 first = false;
  284.             }
  285.             while(row < rlen){
  286.                 if(!first){
  287.                     col = 0;
  288.                 }
  289.                 first = false;
  290.                 while(col < clen){
  291.                     if(fn.call(scope || this, row, col, cm) === true){
  292.                         return [row, col];
  293.                     }
  294.                     col++;
  295.                 }
  296.                 row++;
  297.             }
  298.         }
  299.         return null;
  300.     },
  301.          getSelections : function(){
  302.         return this.selModel.getSelections();
  303.     },
  304.          onResize : function(){
  305.         Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);
  306.         if(this.viewReady){
  307.             this.view.layout();
  308.         }
  309.     },
  310.     
  311.     getGridEl : function(){
  312.         return this.body;
  313.     },
  314.          stopEditing : function(){},
  315.     
  316.     getSelectionModel : function(){
  317.         if(!this.selModel){
  318.             this.selModel = new Ext.grid.RowSelectionModel(
  319.                     this.disableSelection ? {selectRow: Ext.emptyFn} : null);
  320.         }
  321.         return this.selModel;
  322.     },
  323.     
  324.     getStore : function(){
  325.         return this.store;
  326.     },
  327.     
  328.     getColumnModel : function(){
  329.         return this.colModel;
  330.     },
  331.     
  332.     getView : function(){
  333.         if(!this.view){
  334.             this.view = new Ext.grid.GridView(this.viewConfig);
  335.         }
  336.         return this.view;
  337.     },
  338.     
  339.     getDragDropText : function(){
  340.         var count = this.selModel.getCount();
  341.         return String.format(this.ddText, count, count == 1 ? '' : 's');
  342.     }
  343.     
  344.     
  345.     
  346.     
  347.     
  348.     
  349.     
  350.     
  351.     
  352.     
  353.     
  354.     
  355.     
  356.     
  357.     
  358.     
  359.     
  360.     
  361.     
  362.     
  363.     
  364.     
  365.     
  366.     
  367.     
  368.     
  369.     
  370.     
  371.     
  372.     
  373.     
  374.     
  375.     
  376.     
  377.     
  378.     
  379.     
  380.     
  381.     
  382.     
  383.     
  384.     
  385.     
  386.     
  387.     
  388.     
  389. });
  390. Ext.reg('grid', Ext.grid.GridPanel); Ext.grid.GridView = function(config){     Ext.apply(this, config);         this.addEvents(              "beforerowremoved",              "beforerowsinserted",              "beforerefresh",              "rowremoved",              "rowsinserted",              "rowupdated",              "refresh"   );     Ext.grid.GridView.superclass.constructor.call(this); }; Ext.extend(Ext.grid.GridView, Ext.util.Observable, {                              deferEmptyText: true,          scrollOffset: 19,          autoFill: false,          forceFit: false,          sortClasses : ["sort-asc", "sort-desc"],          sortAscText : "Sort Ascending",          sortDescText : "Sort Descending",          columnsText : "Columns",         borderWidth: 2,     tdClass: 'x-grid3-cell',     hdCls: 'x-grid3-hd',          cellSelectorDepth: 4,          rowSelectorDepth: 10,          cellSelector: 'td.x-grid3-cell',          rowSelector: 'div.x-grid3-row',              initTemplates : function(){         var ts = this.templates || {};         if(!ts.master){             ts.master = new Ext.Template(                     '<div class="x-grid3" hidefocus="true">',                         '<div class="x-grid3-viewport">',                             '<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset">{header}</div></div><div class="x-clear"></div></div>',                             '<div class="x-grid3-scroller"><div class="x-grid3-body">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>',                         "</div>",                         '<div class="x-grid3-resize-marker">&#160;</div>',                         '<div class="x-grid3-resize-proxy">&#160;</div>',                     "</div>"                     );         }         if(!ts.header){             ts.header = new Ext.Template(                     '<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',                     '<thead><tr class="x-grid3-hd-row">{cells}</tr></thead>',                     "</table>"                     );         }         if(!ts.hcell){             ts.hcell = new Ext.Template(                     '<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id}" style="{style}"><div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '',                     '{value}<img class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />',                     "</div></td>"                     );         }         if(!ts.body){             ts.body = new Ext.Template('{rows}');         }         if(!ts.row){             ts.row = new Ext.Template(                     '<div class="x-grid3-row {alt}" style="{tstyle}"><table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',                     '<tbody><tr>{cells}</tr>',                     (this.enableRowBody ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>' : ''),                     '</tbody></table></div>'                     );         }         if(!ts.cell){             ts.cell = new Ext.Template(                     '<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>',                     '<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>',                     "</td>"                     );         }         for(var k in ts){             var t = ts[k];             if(t && typeof t.compile == 'function' && !t.compiled){                 t.disableFormats = true;                 t.compile();             }         }         this.templates = ts;         this.colRe = new RegExp("x-grid3-td-([^\s]+)", "");     },         fly : function(el){         if(!this._flyweight){             this._flyweight = new Ext.Element.Flyweight(document.body);         }         this._flyweight.dom = el;         return this._flyweight;     },         getEditorParent : function(ed){         return this.scroller.dom;     },         initElements : function(){         var E = Ext.Element;         var el = this.grid.getGridEl().dom.firstChild;         var cs = el.childNodes;         this.el = new E(el);         this.mainWrap = new E(cs[0]);         this.mainHd = new E(this.mainWrap.dom.firstChild);         if(this.grid.hideHeaders){             this.mainHd.setDisplayed(false);         }         this.innerHd = this.mainHd.dom.firstChild;         this.scroller = new E(this.mainWrap.dom.childNodes[1]);         if(this.forceFit){             this.scroller.setStyle('overflow-x', 'hidden');         }         this.mainBody = new E(this.scroller.dom.firstChild);         this.focusEl = new E(this.scroller.dom.childNodes[1]);         this.focusEl.swallowEvent("click", true);         this.resizeMarker = new E(cs[1]);         this.resizeProxy = new E(cs[2]);     },         getRows : function(){         return this.hasRows() ? this.mainBody.dom.childNodes : [];     },              findCell : function(el){         if(!el){             return false;         }         return this.fly(el).findParent(this.cellSelector, this.cellSelectorDepth);     },         findCellIndex : function(el, requiredCls){         var cell = this.findCell(el);         if(cell && (!requiredCls || this.fly(cell).hasClass(requiredCls))){             return this.getCellIndex(cell);         }         return false;     },         getCellIndex : function(el){         if(el){             var m = el.className.match(this.colRe);             if(m && m[1]){                 return this.cm.getIndexById(m[1]);             }         }         return false;     },         findHeaderCell : function(el){         var cell = this.findCell(el);         return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null;     },         findHeaderIndex : function(el){         return this.findCellIndex(el, this.hdCls);     },         findRow : function(el){         if(!el){             return false;         }         return this.fly(el).findParent(this.rowSelector, this.rowSelectorDepth);     },         findRowIndex : function(el){         var r = this.findRow(el);         return r ? r.rowIndex : false;     },          getRow : function(row){         return this.getRows()[row];     },     getCell : function(row, col){         return this.getRow(row).getElementsByTagName('td')[col];     },     getHeaderCell : function(index){       return this.mainHd.dom.getElementsByTagName('td')[index];     },              addRowClass : function(row, cls){         var r = this.getRow(row);         if(r){             this.fly(r).addClass(cls);         }     },         removeRowClass : function(row, cls){         var r = this.getRow(row);         if(r){             this.fly(r).removeClass(cls);         }     },         removeRow : function(row){         Ext.removeNode(this.getRow(row));         this.focusRow(row);     },              removeRows : function(firstRow, lastRow){         var bd = this.mainBody.dom;         for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){             Ext.removeNode(bd.childNodes[firstRow]);         }         this.focusRow(firstRow);     },              getScrollState : function(){         var sb = this.scroller.dom;         return {left: sb.scrollLeft, top: sb.scrollTop};     },         restoreScroll : function(state){         var sb = this.scroller.dom;         sb.scrollLeft = state.left;         sb.scrollTop = state.top;     },          scrollToTop : function(){         this.scroller.dom.scrollTop = 0;         this.scroller.dom.scrollLeft = 0;     },         syncScroll : function(){       this.syncHeaderScroll();       var mb = this.scroller.dom;         this.grid.fireEvent("bodyscroll", mb.scrollLeft, mb.scrollTop);     },         syncHeaderScroll : function(){         var mb = this.scroller.dom;         this.innerHd.scrollLeft = mb.scrollLeft;         this.innerHd.scrollLeft = mb.scrollLeft;     },         updateSortIcon : function(col, dir){         var sc = this.sortClasses;         var hds = this.mainHd.select('td').removeClass(sc);         hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);     },         updateAllColumnWidths : function(){         var tw = this.getTotalWidth();         var clen = this.cm.getColumnCount();         var ws = [];         for(var i = 0; i < clen; i++){             ws[i] = this.getColumnWidth(i);         }         this.innerHd.firstChild.firstChild.style.width = tw;         for(var i = 0; i < clen; i++){             var hd = this.getHeaderCell(i);             hd.style.width = ws[i];         }         var ns = this.getRows();         for(var i = 0, len = ns.length; i < len; i++){             ns[i].style.width = tw;             ns[i].firstChild.style.width = tw;             var row = ns[i].firstChild.rows[0];             for(var j = 0; j < clen; j++){                 row.childNodes[j].style.width = ws[j];             }         }         this.onAllColumnWidthsUpdated(ws, tw);     },         updateColumnWidth : function(col, width){         var w = this.getColumnWidth(col);         var tw = this.getTotalWidth();         this.innerHd.firstChild.firstChild.style.width = tw;         var hd = this.getHeaderCell(col);         hd.style.width = w;         var ns = this.getRows();         for(var i = 0, len = ns.length; i < len; i++){             ns[i].style.width = tw;             ns[i].firstChild.style.width = tw;             ns[i].firstChild.rows[0].childNodes[col].style.width = w;         }         this.onColumnWidthUpdated(col, w, tw);     },         updateColumnHidden : function(col, hidden){         var tw = this.getTotalWidth();         this.innerHd.firstChild.firstChild.style.width = tw;         var display = hidden ? 'none' : '';         var hd = this.getHeaderCell(col);         hd.style.display = display;         var ns = this.getRows();         for(var i = 0, len = ns.length; i < len; i++){             ns[i].style.width = tw;             ns[i].firstChild.style.width = tw;             ns[i].firstChild.rows[0].childNodes[col].style.display = display;         }         this.onColumnHiddenUpdated(col, hidden, tw);         delete this.lastViewWidth;         this.layout();     },         doRender : function(cs, rs, ds, startRow, colCount, stripe){         var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;         var tstyle = 'width:'+this.getTotalWidth()+';';                 var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;         for(var j = 0, len = rs.length; j < len; j++){             r = rs[j]; cb = [];             var rowIndex = (j+startRow);             for(var i = 0; i < colCount; i++){                 c = cs[i];                 p.id = c.id;                 p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');                 p.attr = p.cellAttr = "";                 p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);                 p.style = c.style;                 if(p.value == undefined || p.value === "") p.value = "&#160;";                 if(r.dirty && typeof r.modified[c.name] !== 'undefined'){                     p.css += ' x-grid3-dirty-cell';                 }                 cb[cb.length] = ct.apply(p);             }             var alt = [];             if(stripe && ((rowIndex+1) % 2 == 0)){                 alt[0] = "x-grid3-row-alt";             }             if(r.dirty){                 alt[1] = " x-grid3-dirty-row";             }             rp.cols = colCount;             if(this.getRowClass){                 alt[2] = this.getRowClass(r, rowIndex, rp, ds);             }             rp.alt = alt.join(" ");             rp.cells = cb.join("");             buf[buf.length] =  rt.apply(rp);         }         return buf.join("");     },         processRows : function(startRow, skipStripe){         if(this.ds.getCount() < 1){             return;         }         skipStripe = skipStripe || !this.grid.stripeRows;         startRow = startRow || 0;         var rows = this.getRows();         var cls = ' x-grid3-row-alt ';         for(var i = startRow, len = rows.length; i < len; i++){             var row = rows[i];             row.rowIndex = i;             if(!skipStripe){                 var isAlt = ((i+1) % 2 == 0);                 var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1;                 if(isAlt == hasAlt){                     continue;                 }                 if(isAlt){                     row.className += " x-grid3-row-alt";                 }else{                     row.className = row.className.replace("x-grid3-row-alt", "");                 }             }         }     },     afterRender: function(){         this.mainBody.dom.innerHTML = this.renderRows();         this.processRows(0, true);         if(this.deferEmptyText !== true){             this.applyEmptyText();         }     },         renderUI : function(){         var header = this.renderHeaders();         var body = this.templates.body.apply({rows:''});         var html = this.templates.master.apply({             body: body,             header: header         });         var g = this.grid;         g.getGridEl().dom.innerHTML = html;         this.initElements();                 Ext.fly(this.innerHd).on("click", this.handleHdDown, this);         this.mainHd.on("mouseover", this.handleHdOver, this);         this.mainHd.on("mouseout", this.handleHdOut, this);         this.mainHd.on("mousemove", this.handleHdMove, this);         this.scroller.on('scroll', this.syncScroll,  this);         if(g.enableColumnResize !== false){             this.splitone = new Ext.grid.GridView.SplitDragZone(g, this.mainHd.dom);         }         if(g.enableColumnMove){             this.columnDrag = new Ext.grid.GridView.ColumnDragZone(g, this.innerHd);             this.columnDrop = new Ext.grid.HeaderDropZone(g, this.mainHd.dom);         }         if(g.enableHdMenu !== false){             if(g.enableColumnHide !== false){                 this.colMenu = new Ext.menu.Menu({id:g.id + "-hcols-menu"});                 this.colMenu.on("beforeshow", this.beforeColMenuShow, this);                 this.colMenu.on("itemclick", this.handleHdMenuClick, this);             }             this.hmenu = new Ext.menu.Menu({id: g.id + "-hctx"});             this.hmenu.add(                 {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"},                 {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"}             );             if(g.enableColumnHide !== false){                 this.hmenu.add('-',                     {id:"columns", text: this.columnsText, menu: this.colMenu, iconCls: 'x-cols-icon'}                 );             }             this.hmenu.on("itemclick", this.handleHdMenuClick, this);                     }         if(g.enableDragDrop || g.enableDrag){             this.dragZone = new Ext.grid.GridDragZone(g, {                 ddGroup : g.ddGroup || 'GridDD'             });         }         this.updateHeaderSortState();     },         layout : function(){         if(!this.mainBody){             return;         }         var g = this.grid;         var c = g.getGridEl();         var csize = c.getSize(true);         var vw = csize.width;         if(vw < 20 || csize.height < 20){             return;         }         if(g.autoHeight){             this.scroller.dom.style.overflow = 'visible';         }else{             this.el.setSize(csize.width, csize.height);             var hdHeight = this.mainHd.getHeight();             var vh = csize.height - (hdHeight);             this.scroller.setSize(vw, vh);             if(this.innerHd){                 this.innerHd.style.width = (vw)+'px';             }         }         if(this.forceFit){             if(this.lastViewWidth != vw){                 this.fitColumns(false, false);                 this.lastViewWidth = vw;             }         }else {             this.autoExpand();             this.syncHeaderScroll();         }         this.onLayout(vw, vh);     },             onLayout : function(vw, vh){             },     onColumnWidthUpdated : function(col, w, tw){             },     onAllColumnWidthsUpdated : function(ws, tw){             },     onColumnHiddenUpdated : function(col, hidden, tw){             },     updateColumnText : function(col, text){             },     afterMove : function(colIndex){             },              init: function(grid){         this.grid = grid;         this.initTemplates();         this.initData(grid.store, grid.colModel);         this.initUI(grid);     },         getColumnId : function(index){       return this.cm.getColumnId(index);     },         renderHeaders : function(){         var cm = this.cm, ts = this.templates;         var ct = ts.hcell;         var cb = [], sb = [], p = {};         for(var i = 0, len = cm.getColumnCount(); i < len; i++){             p.id = cm.getColumnId(i);             p.value = cm.getColumnHeader(i) || "";             p.style = this.getColumnStyle(i, true);             p.tooltip = this.getColumnTooltip(i);             if(cm.config[i].align == 'right'){                 p.istyle = 'padding-right:16px';             } else {                 delete p.istyle;             }             cb[cb.length] = ct.apply(p);         }         return ts.header.apply({cells: cb.join(""), tstyle:'width:'+this.getTotalWidth()+';'});     },         getColumnTooltip : function(i){         var tt = this.cm.getColumnTooltip(i);         if(tt){             if(Ext.QuickTips.isEnabled()){                 return 'ext:qtip="'+tt+'"';             }else{                 return 'title="'+tt+'"';             }         }         return "";     },         beforeUpdate : function(){         this.grid.stopEditing(true);     },         updateHeaders : function(){         this.innerHd.firstChild.innerHTML = this.renderHeaders();     },          focusRow : function(row){         this.focusCell(row, 0, false);     },          focusCell : function(row, col, hscroll){         row = Math.min(row, Math.max(0, this.getRows().length-1));         var xy = this.ensureVisible(row, col, hscroll);         this.focusEl.setXY(xy||this.scroller.getXY());                  if(Ext.isGecko){             this.focusEl.focus();         }else{             this.focusEl.focus.defer(1, this.focusEl);         }     },         ensureVisible : function(row, col, hscroll){         if(typeof row != "number"){             row = row.rowIndex;         }         if(!this.ds){             return;         }         if(row < 0 || row >= this.ds.getCount()){             return;         }         col = (col !== undefined ? col : 0);         var rowEl = this.getRow(row), cellEl;         if(!(hscroll === false && col === 0)){             while(this.cm.isHidden(col)){                 col++;             }             cellEl = this.getCell(row, col);         }         if(!rowEl){             return;         }         var c = this.scroller.dom;         var ctop = 0;         var p = rowEl, stop = this.el.dom;         while(p && p != stop){             ctop += p.offsetTop;             p = p.offsetParent;         }         ctop -= this.mainHd.dom.offsetHeight;         var cbot = ctop + rowEl.offsetHeight;         var ch = c.clientHeight;         var stop = parseInt(c.scrollTop, 10);         var sbot = stop + ch;         if(ctop < stop){           c.scrollTop = ctop;         }else if(cbot > sbot){             c.scrollTop = cbot-ch;         }         if(hscroll !== false){             var cleft = parseInt(cellEl.offsetLeft, 10);             var cright = cleft + cellEl.offsetWidth;             var sleft = parseInt(c.scrollLeft, 10);             var sright = sleft + c.clientWidth;             if(cleft < sleft){                 c.scrollLeft = cleft;             }else if(cright > sright){                 c.scrollLeft = cright-c.clientWidth;             }         }         return cellEl ? Ext.fly(cellEl).getXY() : [c.scrollLeft+this.el.getX(), Ext.fly(rowEl).getY()];     },         insertRows : function(dm, firstRow, lastRow, isUpdate){         if(!isUpdate && firstRow === 0 && lastRow >= dm.getCount()-1){             this.refresh();         }else{             if(!isUpdate){                 this.fireEvent("beforerowsinserted", this, firstRow, lastRow);             }             var html = this.renderRows(firstRow, lastRow);             var before = this.getRow(firstRow);             if(before){                 Ext.DomHelper.insertHtml('beforeBegin', before, html);             }else{                 Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html);             }             if(!isUpdate){                 this.fireEvent("rowsinserted", this, firstRow, lastRow);                 this.processRows(firstRow);             }         }         this.focusRow(firstRow);     },         deleteRows : function(dm, firstRow, lastRow){         if(dm.getRowCount()<1){             this.refresh();         }else{             this.fireEvent("beforerowsdeleted", this, firstRow, lastRow);             this.removeRows(firstRow, lastRow);             this.processRows(firstRow);             this.fireEvent("rowsdeleted", this, firstRow, lastRow);         }     },         getColumnStyle : function(col, isHeader){         var style = !isHeader ? (this.cm.config[col].css || '') : '';         style += 'width:'+this.getColumnWidth(col)+';';         if(this.cm.isHidden(col)){             style += 'display:none;';         }         var align = this.cm.config[col].align;         if(align){             style += 'text-align:'+align+';';         }         return style;     },         getColumnWidth : function(col){         var w = this.cm.getColumnWidth(col);         if(typeof w == 'number'){             return (Ext.isBorderBox ? w : (w-this.borderWidth > 0 ? w-this.borderWidth:0)) + 'px';         }         return w;     },         getTotalWidth : function(){         return this.cm.getTotalWidth()+'px';     },         fitColumns : function(preventRefresh, onlyExpand, omitColumn){         var cm = this.cm, leftOver, dist, i;         var tw = cm.getTotalWidth(false);         var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset;         if(aw < 20){             return;         }         var extra = aw - tw;         if(extra === 0){             return false;         }         var vc = cm.getColumnCount(true);         var ac = vc-(typeof omitColumn == 'number' ? 1 : 0);         if(ac === 0){             ac = 1;             omitColumn = undefined;         }         var colCount = cm.getColumnCount();         var cols = [];         var extraCol = 0;         var width = 0;         var w;         for (i = 0; i < colCount; i++){             if(!cm.isHidden(i) && !cm.isFixed(i) && i !== omitColumn){                 w = cm.getColumnWidth(i);                 cols.push(i);                 extraCol = i;                 cols.push(w);                 width += w;             }         }         var frac = (aw - cm.getTotalWidth())/width;         while (cols.length){             w = cols.pop();             i = cols.pop();             cm.setColumnWidth(i, Math.max(this.grid.minColumnWidth, Math.floor(w + w*frac)), true);         }         if((tw = cm.getTotalWidth(false)) > aw){             var adjustCol = ac != vc ? omitColumn : extraCol;              cm.setColumnWidth(adjustCol, Math.max(1,                      cm.getColumnWidth(adjustCol)- (tw-aw)), true);         }         if(preventRefresh !== true){             this.updateAllColumnWidths();         }         return true;     },         autoExpand : function(preventUpdate){         var g = this.grid, cm = this.cm;         if(!this.userResized && g.autoExpandColumn){             var tw = cm.getTotalWidth(false);             var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset;             if(tw != aw){                 var ci = cm.getIndexById(g.autoExpandColumn);                 var currentWidth = cm.getColumnWidth(ci);                 var cw = Math.min(Math.max(((aw-tw)+currentWidth), g.autoExpandMin), g.autoExpandMax);                 if(cw != currentWidth){                     cm.setColumnWidth(ci, cw, true);                     if(preventUpdate !== true){                         this.updateColumnWidth(ci, cw);                     }                 }             }         }     },         getColumnData : function(){                 var cs = [], cm = this.cm, colCount = cm.getColumnCount();         for(var i = 0; i < colCount; i++){             var name = cm.getDataIndex(i);             cs[i] = {                 name : (typeof name == 'undefined' ? this.ds.fields.get(i).name : name),                 renderer : cm.getRenderer(i),                 id : cm.getColumnId(i),                 style : this.getColumnStyle(i)             };         }         return cs;     },         renderRows : function(startRow, endRow){                 var g = this.grid, cm = g.colModel, ds = g.store, stripe = g.stripeRows;         var colCount = cm.getColumnCount();         if(ds.getCount() < 1){             return "";         }         var cs = this.getColumnData();         startRow = startRow || 0;         endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow;                 var rs = ds.getRange(startRow, endRow);         return this.doRender(cs, rs, ds, startRow, colCount, stripe);     },         renderBody : function(){         var markup = this.renderRows();         return this.templates.body.apply({rows: markup});     },         refreshRow : function(record){         var ds = this.ds, index;         if(typeof record == 'number'){             index = record;             record = ds.getAt(index);         }else{             index = ds.indexOf(record);         }         var cls = [];         this.insertRows(ds, index, index, true);         this.getRow(index).rowIndex = index;         this.onRemove(ds, record, index+1, true);         this.fireEvent("rowupdated", this, index, record);     },          refresh : function(headersToo){         this.fireEvent("beforerefresh", this);         this.grid.stopEditing(true);         var result = this.renderBody();         this.mainBody.update(result);         if(headersToo === true){             this.updateHeaders();             this.updateHeaderSortState();         }         this.processRows(0, true);         this.layout();         this.applyEmptyText();         this.fireEvent("refresh", this);     },         applyEmptyText : function(){         if(this.emptyText && !this.hasRows()){             this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + '</div>');         }     },         updateHeaderSortState : function(){         var state = this.ds.getSortState();         if(!state){             return;         }         if(!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)){             this.grid.fireEvent('sortchange', this.grid, state);         }         this.sortState = state;         var sortColumn = this.cm.findColumnIndex(state.field);         if(sortColumn != -1){             var sortDir = state.direction;             this.updateSortIcon(sortColumn, sortDir);         }     },         destroy : function(){         if(this.colMenu){             this.colMenu.removeAll();             Ext.menu.MenuMgr.unregister(this.colMenu);             this.colMenu.getEl().remove();             delete this.colMenu;         }         if(this.hmenu){             this.hmenu.removeAll();             Ext.menu.MenuMgr.unregister(this.hmenu);             this.hmenu.getEl().remove();             delete this.hmenu;         }         if(this.grid.enableColumnMove){             var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id];             if(dds){                 for(var dd in dds){                     if(!dds[dd].config.isTarget && dds[dd].dragElId){                         var elid = dds[dd].dragElId;                         dds[dd].unreg();                         Ext.get(elid).remove();                     } else if(dds[dd].config.isTarget){                         dds[dd].proxyTop.remove();                         dds[dd].proxyBottom.remove();                         dds[dd].unreg();                     }                     if(Ext.dd.DDM.locationCache[dd]){                         delete Ext.dd.DDM.locationCache[dd];                     }                 }                 delete Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id];             }         }         Ext.destroy(this.resizeMarker, this.resizeProxy);         if(this.dragZone){             this.dragZone.unreg();         }         this.initData(null, null);         Ext.EventManager.removeResizeListener(this.onWindowResize, this);     },         onDenyColumnHide : function(){     },         render : function(){         if(this.autoFill){             this.fitColumns(true, true);         }else if(this.forceFit){             this.fitColumns(true, false);         }else if(this.grid.autoExpandColumn){             this.autoExpand(true);         }         this.renderUI();     },              initData : function(ds, cm){         if(this.ds){             this.ds.un("load", this.onLoad, this);             this.ds.un("datachanged", this.onDataChange, this);             this.ds.un("add", this.onAdd, this);             this.ds.un("remove", this.onRemove, this);             this.ds.un("update", this.onUpdate, this);             this.ds.un("clear", this.onClear, this);         }         if(ds){             ds.on("load", this.onLoad, this);             ds.on("datachanged", this.onDataChange, this);             ds.on("add", this.onAdd, this);             ds.on("remove", this.onRemove, this);             ds.on("update", this.onUpdate, this);             ds.on("clear", this.onClear, this);         }         this.ds = ds;         if(this.cm){             this.cm.un("configchange", this.onColConfigChange, this);             this.cm.un("widthchange", this.onColWidthChange, this);             this.cm.un("headerchange", this.onHeaderChange, this);             this.cm.un("hiddenchange", this.onHiddenChange, this);             this.cm.un("columnmoved", this.onColumnMove, this);             this.cm.un("columnlockchange", this.onColumnLock, this);         }         if(cm){             delete this.lastViewWidth;             cm.on("configchange", this.onColConfigChange, this);             cm.on("widthchange", this.onColWidthChange, this);             cm.on("headerchange", this.onHeaderChange, this);             cm.on("hiddenchange", this.onHiddenChange, this);             cm.on("columnmoved", this.onColumnMove, this);             cm.on("columnlockchange", this.onColumnLock, this);         }         this.cm = cm;     },         onDataChange : function(){         this.refresh();         this.updateHeaderSortState();     },         onClear : function(){         this.refresh();     },         onUpdate : function(ds, record){         this.refreshRow(record);     },         onAdd : function(ds, records, index){         this.insertRows(ds, index, index + (records.length-1));     },         onRemove : function(ds, record, index, isUpdate){         if(isUpdate !== true){             this.fireEvent("beforerowremoved", this, index, record);         }         this.removeRow(index);         if(isUpdate !== true){             this.processRows(index);             this.applyEmptyText();             this.fireEvent("rowremoved", this, index, record);         }     },         onLoad : function(){         this.scrollToTop();     },         onColWidthChange : function(cm, col, width){         this.updateColumnWidth(col, width);     },         onHeaderChange : function(cm, col, text){         this.updateHeaders();     },         onHiddenChange : function(cm, col, hidden){         this.updateColumnHidden(col, hidden);     },         onColumnMove : function(cm, oldIndex, newIndex){         this.indexMap = null;         var s = this.getScrollState();         this.refresh(true);         this.restoreScroll(s);         this.afterMove(newIndex);     },         onColConfigChange : function(){         delete this.lastViewWidth;         this.indexMap = null;         this.refresh(true);     },              initUI : function(grid){         grid.on("headerclick", this.onHeaderClick, this);         if(grid.trackMouseOver){             grid.on("mouseover", this.onRowOver, this);           grid.on("mouseout", this.onRowOut, this);       }     },         initEvents : function(){     },         onHeaderClick : function(g, index){         if(this.headersDisabled || !this.cm.isSortable(index)){             return;         }         g.stopEditing(true);         g.store.sort(this.cm.getDataIndex(index));     },         onRowOver : function(e, t){         var row;         if((row = this.findRowIndex(t)) !== false){             this.addRowClass(row, "x-grid3-row-over");         }     },         onRowOut : function(e, t){         var row;         if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){             this.removeRowClass(row, "x-grid3-row-over");         }     },         handleWheel : function(e){         e.stopPropagation();     },         onRowSelect : function(row){         this.addRowClass(row, "x-grid3-row-selected");     },         onRowDeselect : function(row){         this.removeRowClass(row, "x-grid3-row-selected");     },         onCellSelect : function(row, col){         var cell = this.getCell(row, col);         if(cell){             this.fly(cell).addClass("x-grid3-cell-selected");         }     },         onCellDeselect : function(row, col){         var cell = this.getCell(row, col);         if(cell){             this.fly(cell).removeClass("x-grid3-cell-selected");         }     },         onColumnSplitterMoved : function(i, w){         this.userResized = true;         var cm = this.grid.colModel;         cm.setColumnWidth(i, w, true);         if(this.forceFit){             this.fitColumns(true, false, i);             this.updateAllColumnWidths();         }else{             this.updateColumnWidth(i, w);         }         this.grid.fireEvent("columnresize", i, w);     },         handleHdMenuClick : function(item){         var index = this.hdCtxIndex;         var cm = this.cm, ds = this.ds;         switch(item.id){             case "asc":                 ds.sort(cm.getDataIndex(index), "ASC");                 break;             case "desc":                 ds.sort(cm.getDataIndex(index), "DESC");                 break;             default:                 index = cm.getIndexById(item.id.substr(4));                 if(index != -1){                     if(item.checked && cm.getColumnsBy(this.isHideableColumn, this).length <= 1){                         this.onDenyColumnHide();                         return false;                     }                     cm.setHidden(index, item.checked);                 }         }         return true;     },         isHideableColumn : function(c){         return !c.hidden && !c.fixed;     },         beforeColMenuShow : function(){         var cm = this.cm,  colCount = cm.getColumnCount();         this.colMenu.removeAll();         for(var i = 0; i < colCount; i++){             if(cm.config[i].fixed !== true && cm.config[i].hideable !== false){                 this.colMenu.add(new Ext.menu.CheckItem({                     id: "col-"+cm.getColumnId(i),                     text: cm.getColumnHeader(i),                     checked: !cm.isHidden(i),                     hideOnClick:false,                     disabled: cm.config[i].hideable === false                 }));             }         }     },         handleHdDown : function(e, t){         if(Ext.fly(t).hasClass('x-grid3-hd-btn')){             e.stopEvent();             var hd = this.findHeaderCell(t);             Ext.fly(hd).addClass('x-grid3-hd-menu-open');             var index = this.getCellIndex(hd);             this.hdCtxIndex = index;             var ms = this.hmenu.items, cm = this.cm;             ms.get("asc").setDisabled(!cm.isSortable(index));             ms.get("desc").setDisabled(!cm.isSortable(index));             this.hmenu.on("hide", function(){                 Ext.fly(hd).removeClass('x-grid3-hd-menu-open');             }, this, {single:true});             this.hmenu.show(t, "tl-bl?");         }     },         handleHdOver : function(e, t){         var hd = this.findHeaderCell(t);         if(hd && !this.headersDisabled){             this.activeHd = hd;             this.activeHdIndex = this.getCellIndex(hd);             var fly = this.fly(hd);             this.activeHdRegion = fly.getRegion();             if(!this.cm.isMenuDisabled(this.activeHdIndex)){                 fly.addClass("x-grid3-hd-over");                 this.activeHdBtn = fly.child('.x-grid3-hd-btn');                 if(this.activeHdBtn){                     this.activeHdBtn.dom.style.height = (hd.firstChild.offsetHeight-1)+'px';                 }             }         }     },         handleHdMove : function(e, t){         if(this.activeHd && !this.headersDisabled){             var hw = this.splitHandleWidth || 5;             var r = this.activeHdRegion;             var x = e.getPageX();             var ss = this.activeHd.style;             if(x - r.left <= hw && this.cm.isResizable(this.activeHdIndex-1)){                 ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'e-resize' : 'col-resize';             }else if(r.right - x <= (!this.activeHdBtn ? hw : 2) && this.cm.isResizable(this.activeHdIndex)){                 ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'w-resize' : 'col-resize';             }else{                 ss.cursor = '';             }         }     },         handleHdOut : function(e, t){         var hd = this.findHeaderCell(t);         if(hd && (!Ext.isIE || !e.within(hd, true))){             this.activeHd = null;             this.fly(hd).removeClass("x-grid3-hd-over");             hd.style.cursor = '';         }     },         hasRows : function(){         var fc = this.mainBody.dom.firstChild;         return fc && fc.className != 'x-grid-empty';     },         bind : function(d, c){         this.initData(d, c);     } }); Ext.grid.GridView.SplitDragZone = function(grid, hd){     this.grid = grid;     this.view = grid.getView();     this.marker = this.view.resizeMarker;     this.proxy = this.view.resizeProxy;     Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd,         "gridSplitters" + this.grid.getGridEl().id, {         dragElId : Ext.id(this.proxy.dom), resizeFrame:false     });     this.scroll = false;     this.hw = this.view.splitHandleWidth || 5; }; Ext.extend(Ext.grid.GridView.SplitDragZone, Ext.dd.DDProxy, {     b4StartDrag : function(x, y){         this.view.headersDisabled = true;         var h = this.view.mainWrap.getHeight();         this.marker.setHeight(h);         this.marker.show();         this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]);         this.proxy.setHeight(h);         var w = this.cm.getColumnWidth(this.cellIndex);         var minw = Math.max(w-this.grid.minColumnWidth, 0);         this.resetConstraints();         this.setXConstraint(minw, 1000);         this.setYConstraint(0, 0);         this.minX = x - minw;         this.maxX = x + 1000;         this.startPos = x;         Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);     },     handleMouseDown : function(e){         var t = this.view.findHeaderCell(e.getTarget());         if(t){             var xy = this.view.fly(t).getXY(), x = xy[0], y = xy[1];             var exy = e.getXY(), ex = exy[0], ey = exy[1];             var w = t.offsetWidth, adjust = false;             if((ex - x) <= this.hw){                 adjust = -1;             }else if((x+w) - ex <= this.hw){                 adjust = 0;             }             if(adjust !== false){                 this.cm = this.grid.colModel;                 var ci = this.view.getCellIndex(t);                 if(adjust == -1){                   if (ci + adjust < 0) {                     return;                   }                     while(this.cm.isHidden(ci+adjust)){                         --adjust;                         if(ci+adjust < 0){                             return;                         }                     }                 }                 this.cellIndex = ci+adjust;                 this.split = t.dom;                 if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){                     Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);                 }             }else if(this.view.columnDrag){                 this.view.columnDrag.callHandleMouseDown(e);             }         }     },     endDrag : function(e){         this.marker.hide();         var v = this.view;         var endX = Math.max(this.minX, e.getPageX());         var diff = endX - this.startPos;         v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);         setTimeout(function(){             v.headersDisabled = false;         }, 50);     },     autoOffset : function(){         this.setDelta(0,0);     } });
  391. Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {
  392.     
  393.     hideGroupedColumn:false,
  394.     
  395.     showGroupName:true,
  396.     
  397.     startCollapsed:false,
  398.     
  399.     enableGrouping:true,
  400.     
  401.     enableGroupingMenu:true,
  402.     
  403.     enableNoGroups:true,
  404.     
  405.     emptyGroupText : '(None)',
  406.     
  407.     ignoreAdd: false,
  408.     
  409.     groupTextTpl : '{text}',
  410.     
  411.     
  412.          gidSeed : 1000,
  413.          initTemplates : function(){
  414.         Ext.grid.GroupingView.superclass.initTemplates.call(this);
  415.         this.state = {};
  416.         var sm = this.grid.getSelectionModel();
  417.         sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect',
  418.                 this.onBeforeRowSelect, this);
  419.         if(!this.startGroup){
  420.             this.startGroup = new Ext.XTemplate(
  421.                 '<div id="{groupId}" class="x-grid-group {cls}">',
  422.                     '<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div>', this.groupTextTpl ,'</div></div>',
  423.                     '<div id="{groupId}-bd" class="x-grid-group-body">'
  424.             );
  425.         }
  426.         this.startGroup.compile();
  427.         this.endGroup = '</div></div>';
  428.     },
  429.          findGroup : function(el){
  430.         return Ext.fly(el).up('.x-grid-group', this.mainBody.dom);
  431.     },
  432.          getGroups : function(){
  433.         return this.hasRows() ? this.mainBody.dom.childNodes : [];
  434.     },
  435.          onAdd : function(){
  436.         if(this.enableGrouping && !this.ignoreAdd){
  437.             var ss = this.getScrollState();
  438.             this.refresh();
  439.             this.restoreScroll(ss);
  440.         }else if(!this.enableGrouping){
  441.             Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments);
  442.         }
  443.     },
  444.          onRemove : function(ds, record, index, isUpdate){
  445.         Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);
  446.         var g = document.getElementById(record._groupId);
  447.         if(g && g.childNodes[1].childNodes.length < 1){
  448.             Ext.removeNode(g);
  449.         }
  450.         this.applyEmptyText();
  451.     },
  452.          refreshRow : function(record){
  453.         if(this.ds.getCount()==1){
  454.             this.refresh();
  455.         }else{
  456.             this.isUpdating = true;
  457.             Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);
  458.             this.isUpdating = false;
  459.         }
  460.     },
  461.          beforeMenuShow : function(){
  462.         var field = this.getGroupField();
  463.         var g = this.hmenu.items.get('groupBy');
  464.         if(g){
  465.             g.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false);
  466.         }
  467.         var s = this.hmenu.items.get('showGroups');
  468.         if(s){
  469.            s.setDisabled(!field && this.cm.config[this.hdCtxIndex].groupable === false);
  470. s.setChecked(!!field, true);
  471.         }
  472.     },
  473.          renderUI : function(){
  474.         Ext.grid.GroupingView.superclass.renderUI.call(this);
  475.         this.mainBody.on('mousedown', this.interceptMouse, this);
  476.         if(this.enableGroupingMenu && this.hmenu){
  477.             this.hmenu.add('-',{
  478.                 id:'groupBy',
  479.                 text: this.groupByText,
  480.                 handler: this.onGroupByClick,
  481.                 scope: this,
  482.                 iconCls:'x-group-by-icon'
  483.             });
  484.             if(this.enableNoGroups){
  485.                 this.hmenu.add({
  486.                     id:'showGroups',
  487.                     text: this.showGroupsText,
  488.                     checked: true,
  489.                     checkHandler: this.onShowGroupsClick,
  490.                     scope: this
  491.                 });
  492.             }
  493.             this.hmenu.on('beforeshow', this.beforeMenuShow, this);
  494.         }
  495.     },
  496.          onGroupByClick : function(){
  497.         this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
  498.         this.beforeMenuShow();      },
  499.          onShowGroupsClick : function(mi, checked){
  500.         if(checked){
  501.             this.onGroupByClick();
  502.         }else{
  503.             this.grid.store.clearGrouping();
  504.         }
  505.     },
  506.     
  507.     toggleGroup : function(group, expanded){
  508.         this.grid.stopEditing(true);
  509.         group = Ext.getDom(group);
  510.         var gel = Ext.fly(group);
  511.         expanded = expanded !== undefined ?
  512.                 expanded : gel.hasClass('x-grid-group-collapsed');
  513.         this.state[gel.dom.id] = expanded;
  514.         gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed');
  515.     },
  516.     
  517.     toggleAllGroups : function(expanded){
  518.         var groups = this.getGroups();
  519.         for(var i = 0, len = groups.length; i < len; i++){
  520.             this.toggleGroup(groups[i], expanded);
  521.         }
  522.     },
  523.     
  524.     expandAllGroups : function(){
  525.         this.toggleAllGroups(true);
  526.     },
  527.     
  528.     collapseAllGroups : function(){
  529.         this.toggleAllGroups(false);
  530.     },
  531.          interceptMouse : function(e){
  532.         var hd = e.getTarget('.x-grid-group-hd', this.mainBody);
  533.         if(hd){
  534.             e.stopEvent();
  535.             this.toggleGroup(hd.parentNode);
  536.         }
  537.     },
  538.          getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){
  539.         var g = groupRenderer ? groupRenderer(v, {}, r, rowIndex, colIndex, ds) : String(v);
  540.         if(g === ''){
  541.             g = this.cm.config[colIndex].emptyGroupText || this.emptyGroupText;
  542.         }
  543.         return g;
  544.     },
  545.          getGroupField : function(){
  546.         return this.grid.store.getGroupState();
  547.     },
  548.          renderRows : function(){
  549.         var groupField = this.getGroupField();
  550.         var eg = !!groupField;
  551.                  if(this.hideGroupedColumn) {
  552.             var colIndex = this.cm.findColumnIndex(groupField);
  553.             if(!eg && this.lastGroupField !== undefined) {
  554.                 this.mainBody.update('');
  555.                 this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);
  556.                 delete this.lastGroupField;
  557.             }else if (eg && this.lastGroupField === undefined) {
  558.                 this.lastGroupField = groupField;
  559.                 this.cm.setHidden(colIndex, true);
  560.             }else if (eg && this.lastGroupField !== undefined && groupField !== this.lastGroupField) {
  561.                 this.mainBody.update('');
  562.                 var oldIndex = this.cm.findColumnIndex(this.lastGroupField);
  563.                 this.cm.setHidden(oldIndex, false);
  564.                 this.lastGroupField = groupField;
  565.                 this.cm.setHidden(colIndex, true);
  566.             }
  567.         }
  568.         return Ext.grid.GroupingView.superclass.renderRows.apply(
  569.                     this, arguments);
  570.     },
  571.          doRender : function(cs, rs, ds, startRow, colCount, stripe){
  572.         if(rs.length < 1){
  573.             return '';
  574.         }
  575.         var groupField = this.getGroupField();
  576.         var colIndex = this.cm.findColumnIndex(groupField);
  577.         this.enableGrouping = !!groupField;
  578.         if(!this.enableGrouping || this.isUpdating){
  579.             return Ext.grid.GroupingView.superclass.doRender.apply(
  580.                     this, arguments);
  581.         }
  582.         var gstyle = 'width:'+this.getTotalWidth()+';';
  583.         var gidPrefix = this.grid.getGridEl().id;
  584.         var cfg = this.cm.config[colIndex];
  585.         var groupRenderer = cfg.groupRenderer || cfg.renderer;
  586.         var prefix = this.showGroupName ?
  587.                      (cfg.groupName || cfg.header)+': ' : '';
  588.         var groups = [], curGroup, i, len, gid;
  589.         for(i = 0, len = rs.length; i < len; i++){
  590.             var rowIndex = startRow + i;
  591.             var r = rs[i],
  592.                 gvalue = r.data[groupField],
  593.                 g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds);
  594.             if(!curGroup || curGroup.group != g){
  595.                 gid = gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(g);
  596.                 var isCollapsed  = typeof this.state[gid] !== 'undefined' ? !this.state[gid] : this.startCollapsed;
  597. var gcls = isCollapsed ? 'x-grid-group-collapsed' : '';
  598.                 curGroup = {
  599.                     group: g,
  600.                     gvalue: gvalue,
  601.                     text: prefix + g,
  602.                     groupId: gid,
  603.                     startRow: rowIndex,
  604.                     rs: [r],
  605.                     cls: gcls,
  606.                     style: gstyle
  607.                 };
  608.                 groups.push(curGroup);
  609.             }else{
  610.                 curGroup.rs.push(r);
  611.             }
  612.             r._groupId = gid;
  613.         }
  614.         var buf = [];
  615.         for(i = 0, len = groups.length; i < len; i++){
  616.             var g = groups[i];
  617.             this.doGroupStart(buf, g, cs, ds, colCount);
  618.             buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call(
  619.                     this, cs, g.rs, ds, g.startRow, colCount, stripe);
  620.             this.doGroupEnd(buf, g, cs, ds, colCount);
  621.         }
  622.         return buf.join('');
  623.     },
  624.     
  625.     getGroupId : function(value){
  626.         var gidPrefix = this.grid.getGridEl().id;
  627.         var groupField = this.getGroupField();
  628.         var colIndex = this.cm.findColumnIndex(groupField);
  629.         var cfg = this.cm.config[colIndex];
  630.         var groupRenderer = cfg.groupRenderer || cfg.renderer;
  631.         var gtext = this.getGroup(value, {data:{}}, groupRenderer, 0, colIndex, this.ds);
  632.         return gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(value);
  633.     },
  634.          doGroupStart : function(buf, g, cs, ds, colCount){
  635.         buf[buf.length] = this.startGroup.apply(g);
  636.     },
  637.          doGroupEnd : function(buf, g, cs, ds, colCount){
  638.         buf[buf.length] = this.endGroup;
  639.     },
  640.          getRows : function(){
  641.         if(!this.enableGrouping){
  642.             return Ext.grid.GroupingView.superclass.getRows.call(this);
  643.         }
  644.         var r = [];
  645.         var g, gs = this.getGroups();
  646.         for(var i = 0, len = gs.length; i < len; i++){
  647.             g = gs[i].childNodes[1].childNodes;
  648.             for(var j = 0, jlen = g.length; j < jlen; j++){
  649.                 r[r.length] = g[j];
  650.             }
  651.         }
  652.         return r;
  653.     },
  654.          updateGroupWidths : function(){
  655.         if(!this.enableGrouping || !this.hasRows()){
  656.             return;
  657.         }
  658.         var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.scrollOffset) +'px';
  659.         var gs = this.getGroups();
  660.         for(var i = 0, len = gs.length; i < len; i++){
  661.             gs[i].firstChild.style.width = tw;
  662.         }
  663.     },
  664.          onColumnWidthUpdated : function(col, w, tw){
  665.         this.updateGroupWidths();
  666.     },
  667.          onAllColumnWidthsUpdated : function(ws, tw){
  668.         this.updateGroupWidths();
  669.     },
  670.          onColumnHiddenUpdated : function(col, hidden, tw){
  671.         this.updateGroupWidths();
  672.     },
  673.          onLayout : function(){
  674.         this.updateGroupWidths();
  675.     },
  676.          onBeforeRowSelect : function(sm, rowIndex){
  677.         if(!this.enableGrouping){
  678.             return;
  679.         }
  680.         var row = this.getRow(rowIndex);
  681.         if(row && !row.offsetParent){
  682.             var g = this.findGroup(row);
  683.             this.toggleGroup(g, true);
  684.         }
  685.     },
  686.     
  687.     groupByText: 'Group By This Field',
  688.     
  689.     showGroupsText: 'Show in Groups'
  690. });
  691. Ext.grid.GroupingView.GROUP_ID = 1000; Ext.grid.HeaderDragZone = function(grid, hd, hd2){
  692.     this.grid = grid;
  693.     this.view = grid.getView();
  694.     this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
  695.     Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd);
  696.     if(hd2){
  697.         this.setHandleElId(Ext.id(hd));
  698.         this.setOuterHandleElId(Ext.id(hd2));
  699.     }
  700.     this.scroll = false;
  701. };
  702. Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, {
  703.     maxDragWidth: 120,
  704.     getDragData : function(e){
  705.         var t = Ext.lib.Event.getTarget(e);
  706.         var h = this.view.findHeaderCell(t);
  707.         if(h){
  708.             return {ddel: h.firstChild, header:h};
  709.         }
  710.         return false;
  711.     },
  712.     onInitDrag : function(e){
  713.         this.view.headersDisabled = true;
  714.         var clone = this.dragData.ddel.cloneNode(true);
  715.         clone.id = Ext.id();
  716.         clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px";
  717.         this.proxy.update(clone);
  718.         return true;
  719.     },
  720.     afterValidDrop : function(){
  721.         var v = this.view;
  722.         setTimeout(function(){
  723.             v.headersDisabled = false;
  724.         }, 50);
  725.     },
  726.     afterInvalidDrop : function(){
  727.         var v = this.view;
  728.         setTimeout(function(){
  729.             v.headersDisabled = false;
  730.         }, 50);
  731.     }
  732. });
  733. Ext.grid.HeaderDropZone = function(grid, hd, hd2){
  734.     this.grid = grid;
  735.     this.view = grid.getView();
  736.          this.proxyTop = Ext.DomHelper.append(document.body, {
  737.         cls:"col-move-top", html:"&#160;"
  738.     }, true);
  739.     this.proxyBottom = Ext.DomHelper.append(document.body, {
  740.         cls:"col-move-bottom", html:"&#160;"
  741.     }, true);
  742.     this.proxyTop.hide = this.proxyBottom.hide = function(){
  743.         this.setLeftTop(-100,-100);
  744.         this.setStyle("visibility", "hidden");
  745.     };
  746.     this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
  747.               Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom);
  748. };
  749. Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, {
  750.     proxyOffsets : [-4, -9],
  751.     fly: Ext.Element.fly,
  752.     getTargetFromEvent : function(e){
  753.         var t = Ext.lib.Event.getTarget(e);
  754.         var cindex = this.view.findCellIndex(t);
  755.         if(cindex !== false){
  756.             return this.view.getHeaderCell(cindex);
  757.         }
  758.     },
  759.     nextVisible : function(h){
  760.         var v = this.view, cm = this.grid.colModel;
  761.         h = h.nextSibling;
  762.         while(h){
  763.             if(!cm.isHidden(v.getCellIndex(h))){
  764.                 return h;
  765.             }
  766.             h = h.nextSibling;
  767.         }
  768.         return null;
  769.     },
  770.     prevVisible : function(h){
  771.         var v = this.view, cm = this.grid.colModel;
  772.         h = h.prevSibling;
  773.         while(h){
  774.             if(!cm.isHidden(v.getCellIndex(h))){
  775.                 return h;
  776.             }
  777.             h = h.prevSibling;
  778.         }
  779.         return null;
  780.     },
  781.     positionIndicator : function(h, n, e){
  782.         var x = Ext.lib.Event.getPageX(e);
  783.         var r = Ext.lib.Dom.getRegion(n.firstChild);
  784.         var px, pt, py = r.top + this.proxyOffsets[1];
  785.         if((r.right - x) <= (r.right-r.left)/2){
  786.             px = r.right+this.view.borderWidth;
  787.             pt = "after";
  788.         }else{
  789.             px = r.left;
  790.             pt = "before";
  791.         }
  792.         var oldIndex = this.view.getCellIndex(h);
  793.         var newIndex = this.view.getCellIndex(n);
  794.         if(this.grid.colModel.isFixed(newIndex)){
  795.             return false;
  796.         }
  797.         var locked = this.grid.colModel.isLocked(newIndex);
  798.         if(pt == "after"){
  799.             newIndex++;
  800.         }
  801.         if(oldIndex < newIndex){
  802.             newIndex--;
  803.         }
  804.         if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){
  805.             return false;
  806.         }
  807.         px +=  this.proxyOffsets[0];
  808.         this.proxyTop.setLeftTop(px, py);
  809.         this.proxyTop.show();
  810.         if(!this.bottomOffset){
  811.             this.bottomOffset = this.view.mainHd.getHeight();
  812.         }
  813.         this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset);
  814.         this.proxyBottom.show();
  815.         return pt;
  816.     },
  817.     onNodeEnter : function(n, dd, e, data){
  818.         if(data.header != n){
  819.             this.positionIndicator(data.header, n, e);
  820.         }
  821.     },
  822.     onNodeOver : function(n, dd, e, data){
  823.         var result = false;
  824.         if(data.header != n){
  825.             result = this.positionIndicator(data.header, n, e);
  826.         }
  827.         if(!result){
  828.             this.proxyTop.hide();
  829.             this.proxyBottom.hide();
  830.         }
  831.         return result ? this.dropAllowed : this.dropNotAllowed;
  832.     },
  833.     onNodeOut : function(n, dd, e, data){
  834.         this.proxyTop.hide();
  835.         this.proxyBottom.hide();
  836.     },
  837.     onNodeDrop : function(n, dd, e, data){
  838.         var h = data.header;
  839.         if(h != n){
  840.             var cm = this.grid.colModel;
  841.             var x = Ext.lib.Event.getPageX(e);
  842.             var r = Ext.lib.Dom.getRegion(n.firstChild);
  843.             var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before";
  844.             var oldIndex = this.view.getCellIndex(h);
  845.             var newIndex = this.view.getCellIndex(n);
  846.             var locked = cm.isLocked(newIndex);
  847.             if(pt == "after"){
  848.                 newIndex++;
  849.             }
  850.             if(oldIndex < newIndex){
  851.                 newIndex--;
  852.             }
  853.             if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){
  854.                 return false;
  855.             }
  856.             cm.setLocked(oldIndex, locked, true);
  857.             cm.moveColumn(oldIndex, newIndex);
  858.             this.grid.fireEvent("columnmove", oldIndex, newIndex);
  859.             return true;
  860.         }
  861.         return false;
  862.     }
  863. });
  864. Ext.grid.GridView.ColumnDragZone = function(grid, hd){
  865.     Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null);
  866.     this.proxy.el.addClass('x-grid3-col-dd');
  867. };
  868. Ext.extend(Ext.grid.GridView.ColumnDragZone, Ext.grid.HeaderDragZone, {
  869.     handleMouseDown : function(e){
  870.     },
  871.     callHandleMouseDown : function(e){
  872.         Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e);
  873.     }
  874. }); Ext.grid.SplitDragZone = function(grid, hd, hd2){     this.grid = grid;     this.view = grid.getView();     this.proxy = this.view.resizeProxy;     Ext.grid.SplitDragZone.superclass.constructor.call(this, hd,         "gridSplitters" + this.grid.getGridEl().id, {         dragElId : Ext.id(this.proxy.dom), resizeFrame:false     });     this.setHandleElId(Ext.id(hd));     this.setOuterHandleElId(Ext.id(hd2));     this.scroll = false; }; Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, {     fly: Ext.Element.fly,     b4StartDrag : function(x, y){         this.view.headersDisabled = true;         this.proxy.setHeight(this.view.mainWrap.getHeight());         var w = this.cm.getColumnWidth(this.cellIndex);         var minw = Math.max(w-this.grid.minColumnWidth, 0);         this.resetConstraints();         this.setXConstraint(minw, 1000);         this.setYConstraint(0, 0);         this.minX = x - minw;         this.maxX = x + 1000;         this.startPos = x;         Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);     },     handleMouseDown : function(e){         ev = Ext.EventObject.setEvent(e);         var t = this.fly(ev.getTarget());         if(t.hasClass("x-grid-split")){             this.cellIndex = this.view.getCellIndex(t.dom);             this.split = t.dom;             this.cm = this.grid.colModel;             if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){                 Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);             }         }     },     endDrag : function(e){         this.view.headersDisabled = false;         var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e));         var diff = endX - this.startPos;         this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);     },     autoOffset : function(){         this.setDelta(0,0);     } }); Ext.grid.GridDragZone = function(grid, config){     this.view = grid.getView();     Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config);     if(this.view.lockedBody){         this.setHandleElId(Ext.id(this.view.mainBody.dom));         this.setOuterHandleElId(Ext.id(this.view.lockedBody.dom));     }     this.scroll = false;     this.grid = grid;     this.ddel = document.createElement('div');     this.ddel.className = 'x-grid-dd-wrap'; }; Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {     ddGroup : "GridDD",          getDragData : function(e){         var t = Ext.lib.Event.getTarget(e);         var rowIndex = this.view.findRowIndex(t);         if(rowIndex !== false){             var sm = this.grid.selModel;             if(!sm.isSelected(rowIndex) || e.hasModifier()){                 sm.handleMouseDown(this.grid, rowIndex, e);             }             return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()};         }         return false;     },          onInitDrag : function(e){         var data = this.dragData;         this.ddel.innerHTML = this.grid.getDragDropText();         this.proxy.update(this.ddel);             },          afterRepair : function(){         this.dragging = false;     },          getRepairXY : function(e, data){         return false;     },     onEndDrag : function(data, e){             },     onValidDrop : function(dd, e, id){                 this.hideProxy();     },     beforeInvalidDrop : function(e, id){     } }); Ext.grid.ColumnModel = function(config){     this.defaultWidth = 100;          this.defaultSortable = false;          if(config.columns){         Ext.apply(this, config);         this.setConfig(config.columns, true);     }else{         this.setConfig(config, true);     }     this.addEvents(              "widthchange",              "headerchange",              "hiddenchange",              "columnmoved",                 "columnlockchange",                  "configchange"     );     Ext.grid.ColumnModel.superclass.constructor.call(this); }; Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, {                                                                                     getColumnId : function(index){         return this.config[index].id;     },          setConfig : function(config, initial){         if(!initial){             delete this.totalWidth;             for(var i = 0, len = this.config.length; i < len; i++){                 var c = this.config[i];                 if(c.editor){                     c.editor.destroy();                 }             }         }         this.config = config;         this.lookup = {};                 for(var i = 0, len = config.length; i < len; i++){             var c = config[i];             if(typeof c.renderer == "string"){                 c.renderer = Ext.util.Format[c.renderer];             }             if(typeof c.id == "undefined"){                 c.id = i;             }             if(c.editor && c.editor.isFormField){                 c.editor = new Ext.grid.GridEditor(c.editor);             }             this.lookup[c.id] = c;         }         if(!initial){             this.fireEvent('configchange', this);         }     },          getColumnById : function(id){         return this.lookup[id];     },          getIndexById : function(id){         for(var i = 0, len = this.config.length; i < len; i++){             if(this.config[i].id == id){                 return i;             }         }         return -1;     },          moveColumn : function(oldIndex, newIndex){         var c = this.config[oldIndex];         this.config.splice(oldIndex, 1);         this.config.splice(newIndex, 0, c);         this.dataMap = null;         this.fireEvent("columnmoved", this, oldIndex, newIndex);     },         isLocked : function(colIndex){         return this.config[colIndex].locked === true;     },         setLocked : function(colIndex, value, suppressEvent){         if(this.isLocked(colIndex) == value){             return;         }         this.config[colIndex].locked = value;         if(!suppressEvent){             this.fireEvent("columnlockchange", this, colIndex, value);         }     },         getTotalLockedWidth : function(){         var totalWidth = 0;         for(var i = 0; i < this.config.length; i++){             if(this.isLocked(i) && !this.isHidden(i)){                 this.totalWidth += this.getColumnWidth(i);             }         }         return totalWidth;     },         getLockedCount : function(){         for(var i = 0, len = this.config.length; i < len; i++){             if(!this.isLocked(i)){                 return i;             }         }     },          getColumnCount : function(visibleOnly){         if(visibleOnly === true){             var c = 0;             for(var i = 0, len = this.config.length; i < len; i++){                 if(!this.isHidden(i)){                     c++;                 }             }             return c;         }         return this.config.length;     },          getColumnsBy : function(fn, scope){         var r = [];         for(var i = 0, len = this.config.length; i < len; i++){             var c = this.config[i];             if(fn.call(scope||this, c, i) === true){                 r[r.length] = c;             }         }         return r;     },          isSortable : function(col){         if(typeof this.config[col].sortable == "undefined"){             return this.defaultSortable;         }         return this.config[col].sortable;     },          isMenuDisabled : function(col){         return !!this.config[col].menuDisabled;     },          getRenderer : function(col){         if(!this.config[col].renderer){             return Ext.grid.ColumnModel.defaultRenderer;         }         return this.config[col].renderer;     },          setRenderer : function(col, fn){         this.config[col].renderer = fn;     },          getColumnWidth : function(col){         return this.config[col].width || this.defaultWidth;     },          setColumnWidth : function(col, width, suppressEvent){         this.config[col].width = width;         this.totalWidth = null;         if(!suppressEvent){              this.fireEvent("widthchange", this, col, width);         }     },          getTotalWidth : function(includeHidden){         if(!this.totalWidth){             this.totalWidth = 0;             for(var i = 0, len = this.config.length; i < len; i++){                 if(includeHidden || !this.isHidden(i)){                     this.totalWidth += this.getColumnWidth(i);                 }             }         }         return this.totalWidth;     },          getColumnHeader : function(col){         return this.config[col].header;     },          setColumnHeader : function(col, header){         this.config[col].header = header;         this.fireEvent("headerchange", this, col, header);     },          getColumnTooltip : function(col){             return this.config[col].tooltip;     },          setColumnTooltip : function(col, tooltip){             this.config[col].tooltip = tooltip;     },          getDataIndex : function(col){         return this.config[col].dataIndex;     },          setDataIndex : function(col, dataIndex){         this.config[col].dataIndex = dataIndex;     },          findColumnIndex : function(dataIndex){         var c = this.config;         for(var i = 0, len = c.length; i < len; i++){             if(c[i].dataIndex == dataIndex){                 return i;             }         }         return -1;     },          isCellEditable : function(colIndex, rowIndex){         return (this.config[colIndex].editable || (typeof this.config[colIndex].editable == "undefined" && this.config[colIndex].editor)) ? true : false;     },          getCellEditor : function(colIndex, rowIndex){         return this.config[colIndex].editor;     },          setEditable : function(col, editable){         this.config[col].editable = editable;     },          isHidden : function(colIndex){         return this.config[colIndex].hidden;     },          isFixed : function(colIndex){         return this.config[colIndex].fixed;     },          isResizable : function(colIndex){         return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true;     },          setHidden : function(colIndex, hidden){         var c = this.config[colIndex];         if(c.hidden !== hidden){             c.hidden = hidden;             this.totalWidth = null;             this.fireEvent("hiddenchange", this, colIndex, hidden);         }     },          setEditor : function(col, editor){         this.config[col].editor = editor;     } }); Ext.grid.ColumnModel.defaultRenderer = function(value){ if(typeof value == "string" && value.length < 1){     return "&#160;"; } return value; }; Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel;
  875. Ext.grid.AbstractSelectionModel = function(){
  876.     this.locked = false;
  877.     Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);
  878. };
  879. Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable,  {
  880.     
  881.     init : function(grid){
  882.         this.grid = grid;
  883.         this.initEvents();
  884.     },
  885.     
  886.     lock : function(){
  887.         this.locked = true;
  888.     },
  889.     
  890.     unlock : function(){
  891.         this.locked = false;
  892.     },
  893.     
  894.     isLocked : function(){
  895.         return this.locked;
  896.     }
  897. }); Ext.grid.RowSelectionModel = function(config){     Ext.apply(this, config);     this.selections = new Ext.util.MixedCollection(false, function(o){         return o.id;     });     this.last = false;     this.lastActive = false;     this.addEvents(              "selectionchange",              "beforerowselect",              "rowselect",              "rowdeselect"     );     Ext.grid.RowSelectionModel.superclass.constructor.call(this); }; Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel,  {          singleSelect : false,         initEvents : function(){         if(!this.grid.enableDragDrop && !this.grid.enableDrag){             this.grid.on("rowmousedown", this.handleMouseDown, this);         }else{             this.grid.on("rowclick", function(grid, rowIndex, e) {                 if(e.button === 0 && !e.shiftKey && !e.ctrlKey) {                     this.selectRow(rowIndex, false);                     grid.view.focusRow(rowIndex);                 }             }, this);         }         this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {             "up" : function(e){                 if(!e.shiftKey){                     this.selectPrevious(e.shiftKey);                 }else if(this.last !== false && this.lastActive !== false){                     var last = this.last;                     this.selectRange(this.last,  this.lastActive-1);                     this.grid.getView().focusRow(this.lastActive);                     if(last !== false){                         this.last = last;                     }                 }else{                     this.selectFirstRow();                 }             },             "down" : function(e){                 if(!e.shiftKey){                     this.selectNext(e.shiftKey);                 }else if(this.last !== false && this.lastActive !== false){                     var last = this.last;                     this.selectRange(this.last,  this.lastActive+1);                     this.grid.getView().focusRow(this.lastActive);                     if(last !== false){                         this.last = last;                     }                 }else{                     this.selectFirstRow();                 }             },             scope: this         });         var view = this.grid.view;         view.on("refresh", this.onRefresh, this);         view.on("rowupdated", this.onRowUpdated, this);         view.on("rowremoved", this.onRemove, this);     },         onRefresh : function(){         var ds = this.grid.store, index;         var s = this.getSelections();         this.clearSelections(true);         for(var i = 0, len = s.length; i < len; i++){             var r = s[i];             if((index = ds.indexOfId(r.id)) != -1){                 this.selectRow(index, true);             }         }         if(s.length != this.selections.getCount()){             this.fireEvent("selectionchange", this);         }     },         onRemove : function(v, index, r){         if(this.selections.remove(r) !== false){             this.fireEvent('selectionchange', this);         }     },         onRowUpdated : function(v, index, r){         if(this.isSelected(r)){             v.onRowSelect(index);         }     },          selectRecords : function(records, keepExisting){         if(!keepExisting){             this.clearSelections();         }         var ds = this.grid.store;         for(var i = 0, len = records.length; i < len; i++){             this.selectRow(ds.indexOf(records[i]), true);         }     },          getCount : function(){         return this.selections.length;     },          selectFirstRow : function(){         this.selectRow(0);     },          selectLastRow : function(keepExisting){         this.selectRow(this.grid.store.getCount() - 1, keepExisting);     },          selectNext : function(keepExisting){         if(this.hasNext()){             this.selectRow(this.last+1, keepExisting);             this.grid.getView().focusRow(this.last); return true;         } return false;     },          selectPrevious : function(keepExisting){         if(this.hasPrevious()){             this.selectRow(this.last-1, keepExisting);             this.grid.getView().focusRow(this.last); return true;         } return false;     },          hasNext : function(){         return this.last !== false && (this.last+1) < this.grid.store.getCount();     },          hasPrevious : function(){         return !!this.last;     },          getSelections : function(){         return [].concat(this.selections.items);     },          getSelected : function(){         return this.selections.itemAt(0);     },          each : function(fn, scope){         var s = this.getSelections();         for(var i = 0, len = s.length; i < len; i++){             if(fn.call(scope || this, s[i], i) === false){                 return false;             }         }         return true;     },          clearSelections : function(fast){         if(this.locked) return;         if(fast !== true){             var ds = this.grid.store;             var s = this.selections;             s.each(function(r){                 this.deselectRow(ds.indexOfId(r.id));             }, this);             s.clear();         }else{             this.selections.clear();         }         this.last = false;     },          selectAll : function(){         if(this.locked) return;         this.selections.clear();         for(var i = 0, len = this.grid.store.getCount(); i < len; i++){             this.selectRow(i, true);         }     },          hasSelection : function(){         return this.selections.length > 0;     },          isSelected : function(index){         var r = typeof index == "number" ? this.grid.store.getAt(index) : index;         return (r && this.selections.key(r.id) ? true : false);     },          isIdSelected : function(id){         return (this.selections.key(id) ? true : false);     },         handleMouseDown : function(g, rowIndex, e){         if(e.button !== 0 || this.isLocked()){             return;         };         var view = this.grid.getView();         if(e.shiftKey && this.last !== false){             var last = this.last;             this.selectRange(last, rowIndex, e.ctrlKey);             this.last = last;             view.focusRow(rowIndex);         }else{             var isSelected = this.isSelected(rowIndex);             if(e.ctrlKey && isSelected){                 this.deselectRow(rowIndex);             }else if(!isSelected || this.getCount() > 1){                 this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);                 view.focusRow(rowIndex);             }         }     },          selectRows : function(rows, keepExisting){         if(!keepExisting){             this.clearSelections();         }         for(var i = 0, len = rows.length; i < len; i++){             this.selectRow(rows[i], true);         }     },          selectRange : function(startRow, endRow, keepExisting){         if(this.locked) return;         if(!keepExisting){             this.clearSelections();         }         if(startRow <= endRow){             for(var i = startRow; i <= endRow; i++){                 this.selectRow(i, true);             }         }else{             for(var i = startRow; i >= endRow; i--){                 this.selectRow(i, true);             }         }     },          deselectRange : function(startRow, endRow, preventViewNotify){         if(this.locked) return;         for(var i = startRow; i <= endRow; i++){             this.deselectRow(i, preventViewNotify);         }     },          selectRow : function(index, keepExisting, preventViewNotify){         if(this.locked || (index < 0 || index >= this.grid.store.getCount()) || this.isSelected(index)) return;         var r = this.grid.store.getAt(index);         if(r && this.fireEvent("beforerowselect", this, index, keepExisting, r) !== false){             if(!keepExisting || this.singleSelect){                 this.clearSelections();             }             this.selections.add(r);             this.last = this.lastActive = index;             if(!preventViewNotify){                 this.grid.getView().onRowSelect(index);             }             this.fireEvent("rowselect", this, index, r);             this.fireEvent("selectionchange", this);         }     },          deselectRow : function(index, preventViewNotify){         if(this.locked) return;         if(this.last == index){             this.last = false;         }         if(this.lastActive == index){             this.lastActive = false;         }         var r = this.grid.store.getAt(index);         if(r){             this.selections.remove(r);             if(!preventViewNotify){                 this.grid.getView().onRowDeselect(index);             }             this.fireEvent("rowdeselect", this, index, r);             this.fireEvent("selectionchange", this);         }     },         restoreLast : function(){         if(this._last){             this.last = this._last;         }     },         acceptsNav : function(row, col, cm){         return !cm.isHidden(col) && cm.isCellEditable(col, row);     },         onEditorKey : function(field, e){         var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;         var shift = e.shiftKey;         if(k == e.TAB){             e.stopEvent();             ed.completeEdit();             if(shift){                 newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);             }else{                 newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);             }         }else if(k == e.ENTER){             e.stopEvent();             ed.completeEdit(); if(this.moveEditorOnEnter !== false){ if(shift){ newCell = g.walkCells(ed.row - 1, ed.col, -1, this.acceptsNav, this); }else{ newCell = g.walkCells(ed.row + 1, ed.col, 1, this.acceptsNav, this); } }         }else if(k == e.ESC){             ed.cancelEdit();         }         if(newCell){             g.startEditing(newCell[0], newCell[1]);         }     } }); Ext.grid.CellSelectionModel = function(config){     Ext.apply(this, config);     this.selection = null;     this.addEvents(              "beforecellselect",              "cellselect",              "selectionchange"     );     Ext.grid.CellSelectionModel.superclass.constructor.call(this); }; Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel,  {          initEvents : function(){         this.grid.on("cellmousedown", this.handleMouseDown, this);         this.grid.getGridEl().on(Ext.isIE || Ext.isSafari3 ? "keydown" : "keypress", this.handleKeyDown, this);         var view = this.grid.view;         view.on("refresh", this.onViewChange, this);         view.on("rowupdated", this.onRowUpdated, this);         view.on("beforerowremoved", this.clearSelections, this);         view.on("beforerowsinserted", this.clearSelections, this);         if(this.grid.isEditor){             this.grid.on("beforeedit", this.beforeEdit,  this);         }     },     beforeEdit : function(e){         this.select(e.row, e.column, false, true, e.record);     },     onRowUpdated : function(v, index, r){         if(this.selection && this.selection.record == r){             v.onCellSelect(index, this.selection.cell[1]);         }     },     onViewChange : function(){         this.clearSelections(true);     },     getSelectedCell : function(){         return this.selection ? this.selection.cell : null;     },          clearSelections : function(preventNotify){         var s = this.selection;         if(s){             if(preventNotify !== true){                 this.grid.view.onCellDeselect(s.cell[0], s.cell[1]);             }             this.selection = null;             this.fireEvent("selectionchange", this, null);         }     },          hasSelection : function(){         return this.selection ? true : false;     },          handleMouseDown : function(g, row, cell, e){         if(e.button !== 0 || this.isLocked()){             return;         };         this.select(row, cell);     },          select : function(rowIndex, colIndex, preventViewNotify, preventFocus,  r){         if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){             this.clearSelections();             r = r || this.grid.store.getAt(rowIndex);             this.selection = {                 record : r,                 cell : [rowIndex, colIndex]             };             if(!preventViewNotify){                 var v = this.grid.getView();                 v.onCellSelect(rowIndex, colIndex);                 if(preventFocus !== true){                     v.focusCell(rowIndex, colIndex);                 }             }             this.fireEvent("cellselect", this, rowIndex, colIndex);             this.fireEvent("selectionchange", this, this.selection);         }     },     isSelectable : function(rowIndex, colIndex, cm){         return !cm.isHidden(colIndex);     },          handleKeyDown : function(e){         if(!e.isNavKeyPress()){             return;         }         var g = this.grid, s = this.selection;         if(!s){             e.stopEvent();             var cell = g.walkCells(0, 0, 1, this.isSelectable,  this);             if(cell){                 this.select(cell[0], cell[1]);             }             return;         }         var sm = this;         var walk = function(row, col, step){             return g.walkCells(row, col, step, sm.isSelectable,  sm);         };         var k = e.getKey(), r = s.cell[0], c = s.cell[1];         var newCell;         switch(k){              case e.TAB:                  if(e.shiftKey){                      newCell = walk(r, c-1, -1);                  }else{                      newCell = walk(r, c+1, 1);                  }              break;              case e.DOWN:                  newCell = walk(r+1, c, 1);              break;              case e.UP:                  newCell = walk(r-1, c, -1);              break;              case e.RIGHT:                  newCell = walk(r, c+1, 1);              break;              case e.LEFT:                  newCell = walk(r, c-1, -1);              break;              case e.ENTER:                  if(g.isEditor && !g.editing){                     g.startEditing(r, c);                     e.stopEvent();                     return;                 }              break;         };         if(newCell){             this.select(newCell[0], newCell[1]);             e.stopEvent();         }     },     acceptsNav : function(row, col, cm){         return !cm.isHidden(col) && cm.isCellEditable(col, row);     },     onEditorKey : function(field, e){         var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;         if(k == e.TAB){             if(e.shiftKey){                 newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);             }else{                 newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);             }             e.stopEvent();         }else if(k == e.ENTER){             ed.completeEdit();             e.stopEvent();         }else if(k == e.ESC){          e.stopEvent();             ed.cancelEdit();         }         if(newCell){             g.startEditing(newCell[0], newCell[1]);         }     } }); Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {          clicksToEdit: 2,         isEditor : true,         detectEdit: false, autoEncode : false,         trackMouseOver: false,              initComponent : function(){         Ext.grid.EditorGridPanel.superclass.initComponent.call(this);         if(!this.selModel){                          this.selModel = new Ext.grid.CellSelectionModel();         }         this.activeEditor = null;     this.addEvents(                          "beforeedit",                          "afteredit",                          "validateedit"         );     },         initEvents : function(){         Ext.grid.EditorGridPanel.superclass.initEvents.call(this);                  this.on("bodyscroll", this.stopEditing, this, [true]);         if(this.clicksToEdit == 1){             this.on("cellclick", this.onCellDblClick, this);         }else {             if(this.clicksToEdit == 'auto' && this.view.mainBody){                 this.view.mainBody.on("mousedown", this.onAutoEditClick, this);             }             this.on("celldblclick", this.onCellDblClick, this);         }         this.getGridEl().addClass("xedit-grid");     },         onCellDblClick : function(g, row, col){         this.startEditing(row, col);     },         onAutoEditClick : function(e, t){         if(e.button !== 0){             return;         }         var row = this.view.findRowIndex(t);         var col = this.view.findCellIndex(t);         if(row !== false && col !== false){             this.stopEditing();             if(this.selModel.getSelectedCell){                 var sc = this.selModel.getSelectedCell();                 if(sc && sc.cell[0] === row && sc.cell[1] === col){                     this.startEditing(row, col);                 }             }else{                 if(this.selModel.isSelected(row)){                     this.startEditing(row, col);                 }             }         }     },         onEditComplete : function(ed, value, startValue){         this.editing = false;         this.activeEditor = null;         ed.un("specialkey", this.selModel.onEditorKey, this.selModel); var r = ed.record;         var field = this.colModel.getDataIndex(ed.col);         value = this.postEditValue(value, startValue, r, field);         if(String(value) !== String(startValue)){             var e = {                 grid: this,                 record: r,                 field: field,                 originalValue: startValue,                 value: value,                 row: ed.row,                 column: ed.col,                 cancel:false             };             if(this.fireEvent("validateedit", e) !== false && !e.cancel){                 r.set(field, e.value);                 delete e.cancel;                 this.fireEvent("afteredit", e);             }         }         this.view.focusCell(ed.row, ed.col);     },          startEditing : function(row, col){         this.stopEditing();         if(this.colModel.isCellEditable(col, row)){             this.view.ensureVisible(row, col, true);             var r = this.store.getAt(row);             var field = this.colModel.getDataIndex(col);             var e = {                 grid: this,                 record: r,                 field: field,                 value: r.data[field],                 row: row,                 column: col,                 cancel:false             };             if(this.fireEvent("beforeedit", e) !== false && !e.cancel){                 this.editing = true;                 var ed = this.colModel.getCellEditor(col, row);                 if(!ed.rendered){                     ed.render(this.view.getEditorParent(ed));                 }                 (function(){                     ed.row = row;                     ed.col = col;                     ed.record = r;                     ed.on("complete", this.onEditComplete, this, {single: true});                     ed.on("specialkey", this.selModel.onEditorKey, this.selModel);                     this.activeEditor = ed;                     var v = this.preEditValue(r, field);                     ed.startEdit(this.view.getCell(row, col).firstChild, v);                 }).defer(50, this);             }         }     },           preEditValue : function(r, field){         var value = r.data[field]; return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlDecode(value) : value; },      postEditValue : function(value, originalValue, r, field){ return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value; },               stopEditing : function(cancel){         if(this.activeEditor){             this.activeEditor[cancel === true ? 'cancelEdit' : 'completeEdit']();         }         this.activeEditor = null;     },              onDestroy: function() {         if(this.rendered){             var cols = this.colModel.config;             for(var i = 0, len = cols.length; i < len; i++){                 var c = cols[i];                 Ext.destroy(c.editor);             }         }         Ext.grid.EditorGridPanel.superclass.onDestroy.call(this);     } }); Ext.reg('editorgrid', Ext.grid.EditorGridPanel); Ext.grid.GridEditor = function(field, config){     Ext.grid.GridEditor.superclass.constructor.call(this, field, config);     field.monitorTab = false; }; Ext.extend(Ext.grid.GridEditor, Ext.Editor, {     alignment: "tl-tl",     autoSize: "width",     hideEl : false,     cls: "x-small-editor x-grid-editor",     shim:false,     shadow:false }); Ext.grid.PropertyRecord = Ext.data.Record.create([     {name:'name',type:'string'}, 'value' ]); Ext.grid.PropertyStore = function(grid, source){     this.grid = grid;     this.store = new Ext.data.Store({         recordType : Ext.grid.PropertyRecord     });     this.store.on('update', this.onUpdate,  this);     if(source){         this.setSource(source);     }     Ext.grid.PropertyStore.superclass.constructor.call(this); }; Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, {         setSource : function(o){         this.source = o;         this.store.removeAll();         var data = [];         for(var k in o){             if(this.isEditableValue(o[k])){                 data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k));             }         }         this.store.loadRecords({records: data}, {}, true);     },         onUpdate : function(ds, record, type){         if(type == Ext.data.Record.EDIT){             var v = record.data['value'];             var oldValue = record.modified['value'];             if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){                 this.source[record.id] = v;                 record.commit();                 this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue);             }else{                 record.reject();             }         }     },         getProperty : function(row){        return this.store.getAt(row);     },         isEditableValue: function(val){         if(Ext.isDate(val)){             return true;         }else if(typeof val == 'object' || typeof val == 'function'){             return false;         }         return true;     },         setValue : function(prop, value){         this.source[prop] = value;         this.store.getById(prop).set('value', value);     },         getSource : function(){         return this.source;     } }); Ext.grid.PropertyColumnModel = function(grid, store){     this.grid = grid;     var g = Ext.grid;     g.PropertyColumnModel.superclass.constructor.call(this, [         {header: this.nameText, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true},         {header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true}     ]);     this.store = store;     this.bselect = Ext.DomHelper.append(document.body, {         tag: 'select', cls: 'x-grid-editor x-hide-display', children: [             {tag: 'option', value: 'true', html: 'true'},             {tag: 'option', value: 'false', html: 'false'}         ]     });     var f = Ext.form;     var bfield = new f.Field({         el:this.bselect,         bselect : this.bselect,         autoShow: true,         getValue : function(){             return this.bselect.value == 'true';         }     });     this.editors = {         'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})),         'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})),         'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})),         'boolean' : new g.GridEditor(bfield)     };     this.renderCellDelegate = this.renderCell.createDelegate(this);     this.renderPropDelegate = this.renderProp.createDelegate(this); }; Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, {         nameText : 'Name',     valueText : 'Value',     dateFormat : 'm/j/Y',         renderDate : function(dateVal){         return dateVal.dateFormat(this.dateFormat);     },         renderBool : function(bVal){         return bVal ? 'true' : 'false';     },         isCellEditable : function(colIndex, rowIndex){         return colIndex == 1;     },         getRenderer : function(col){         return col == 1 ?             this.renderCellDelegate : this.renderPropDelegate;     },         renderProp : function(v){         return this.getPropertyName(v);     },         renderCell : function(val){         var rv = val;         if(Ext.isDate(val)){             rv = this.renderDate(val);         }else if(typeof val == 'boolean'){             rv = this.renderBool(val);         }         return Ext.util.Format.htmlEncode(rv);     },         getPropertyName : function(name){         var pn = this.grid.propertyNames;         return pn && pn[name] ? pn[name] : name;     },         getCellEditor : function(colIndex, rowIndex){         var p = this.store.getProperty(rowIndex);         var n = p.data['name'], val = p.data['value'];         if(this.grid.customEditors[n]){             return this.grid.customEditors[n];         }         if(Ext.isDate(val)){             return this.editors['date'];         }else if(typeof val == 'number'){             return this.editors['number'];         }else if(typeof val == 'boolean'){             return this.editors['boolean'];         }else{             return this.editors['string'];         }     } }); Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {                   enableColumnMove:false,     stripeRows:false,     trackMouseOver: false,     clicksToEdit:1,     enableHdMenu : false,     viewConfig : {         forceFit:true     },         initComponent : function(){         this.customEditors = this.customEditors || {};         this.lastEditRow = null;         var store = new Ext.grid.PropertyStore(this);         this.propStore = store;         var cm = new Ext.grid.PropertyColumnModel(this, store);         store.store.sort('name', 'ASC');         this.addEvents(                          'beforepropertychange',                          'propertychange'         );         this.cm = cm;         this.ds = store.store;         Ext.grid.PropertyGrid.superclass.initComponent.call(this);         this.selModel.on('beforecellselect', function(sm, rowIndex, colIndex){             if(colIndex === 0){                 this.startEditing.defer(200, this, [rowIndex, 1]);                 return false;             }         }, this);     },         onRender : function(){         Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);         this.getGridEl().addClass('x-props-grid');     },         afterRender: function(){         Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);         if(this.source){             this.setSource(this.source);         }     },          setSource : function(source){         this.propStore.setSource(source);     },          getSource : function(){         return this.propStore.getSource();     } }); Ext.reg("propertygrid", Ext.grid.PropertyGrid);
  898. Ext.grid.RowNumberer = function(config){
  899.     Ext.apply(this, config);
  900.     if(this.rowspan){
  901.         this.renderer = this.renderer.createDelegate(this);
  902.     }
  903. };
  904. Ext.grid.RowNumberer.prototype = {
  905.     
  906.     header: "",
  907.     
  908.     width: 23,
  909.     
  910.     sortable: false,
  911.          fixed:true,
  912.     menuDisabled:true,
  913.     dataIndex: '',
  914.     id: 'numberer',
  915.     rowspan: undefined,
  916.          renderer : function(v, p, record, rowIndex){
  917.         if(this.rowspan){
  918.             p.cellAttr = 'rowspan="'+this.rowspan+'"';
  919.         }
  920.         return rowIndex+1;
  921.     }
  922. };
  923. Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
  924.     
  925.     header: '<div class="x-grid3-hd-checker">&#160;</div>',
  926.     
  927.     width: 20,
  928.     
  929.     sortable: false,
  930.          menuDisabled:true,
  931.     fixed:true,
  932.     dataIndex: '',
  933.     id: 'checker',
  934.          initEvents : function(){
  935.         Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
  936.         this.grid.on('render', function(){
  937.             var view = this.grid.getView();
  938.             view.mainBody.on('mousedown', this.onMouseDown, this);
  939.             Ext.fly(view.innerHd).on('mousedown', this.onHdMouseDown, this);
  940.         }, this);
  941.     },
  942.          onMouseDown : function(e, t){
  943.         if(e.button === 0 && t.className == 'x-grid3-row-checker'){              e.stopEvent();
  944.             var row = e.getTarget('.x-grid3-row');
  945.             if(row){
  946.                 var index = row.rowIndex;
  947.                 if(this.isSelected(index)){
  948.                     this.deselectRow(index);
  949.                 }else{
  950.                     this.selectRow(index, true);
  951.                 }
  952.             }
  953.         }
  954.     },
  955.          onHdMouseDown : function(e, t){
  956.         if(t.className == 'x-grid3-hd-checker'){
  957.             e.stopEvent();
  958.             var hd = Ext.fly(t.parentNode);
  959.             var isChecked = hd.hasClass('x-grid3-hd-checker-on');
  960.             if(isChecked){
  961.                 hd.removeClass('x-grid3-hd-checker-on');
  962.                 this.clearSelections();
  963.             }else{
  964.                 hd.addClass('x-grid3-hd-checker-on');
  965.                 this.selectAll();
  966.             }
  967.         }
  968.     },
  969.          renderer : function(v, p, record){
  970.         return '<div class="x-grid3-row-checker">&#160;</div>';
  971.     }
  972. }); Ext.LoadMask = function(el, config){     this.el = Ext.get(el);     Ext.apply(this, config);     if(this.store){         this.store.on('beforeload', this.onBeforeLoad, this);         this.store.on('load', this.onLoad, this);         this.store.on('loadexception', this.onLoad, this);         this.removeMask = Ext.value(this.removeMask, false);     }else{         var um = this.el.getUpdater();         um.showLoadIndicator = false;         um.on('beforeupdate', this.onBeforeLoad, this);         um.on('update', this.onLoad, this);         um.on('failure', this.onLoad, this);         this.removeMask = Ext.value(this.removeMask, true);     } }; Ext.LoadMask.prototype = {                    msg : 'Loading...',          msgCls : 'x-mask-loading',          disabled: false,          disable : function(){        this.disabled = true;     },          enable : function(){         this.disabled = false;     },         onLoad : function(){         this.el.unmask(this.removeMask);     },         onBeforeLoad : function(){         if(!this.disabled){             this.el.mask(this.msg, this.msgCls);         }     },          show: function(){         this.onBeforeLoad();     },          hide: function(){         this.onLoad();         },         destroy : function(){         if(this.store){             this.store.un('beforeload', this.onBeforeLoad, this);             this.store.un('load', this.onLoad, this);             this.store.un('loadexception', this.onLoad, this);         }else{             var um = this.el.getUpdater();             um.un('beforeupdate', this.onBeforeLoad, this);             um.un('update', this.onLoad, this);             um.un('failure', this.onLoad, this);         }     } };
  973. Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
  974.    
  975.     baseCls : 'x-progress',
  976.          waitTimer : null,
  977.          initComponent : function(){
  978.         Ext.ProgressBar.superclass.initComponent.call(this);
  979.         this.addEvents(
  980.             
  981.             "update"
  982.         );
  983.     },
  984.          onRender : function(ct, position){
  985.         Ext.ProgressBar.superclass.onRender.call(this, ct, position);
  986.         var tpl = new Ext.Template(
  987.             '<div class="{cls}-wrap">',
  988.                 '<div class="{cls}-inner">',
  989.                     '<div class="{cls}-bar">',
  990.                         '<div class="{cls}-text">',
  991.                             '<div>&#160;</div>',
  992.                         '</div>',
  993.                     '</div>',
  994.                     '<div class="{cls}-text {cls}-text-back">',
  995.                         '<div>&#160;</div>',
  996.                     '</div>',
  997.                 '</div>',
  998.             '</div>'
  999.         );
  1000.         if(position){
  1001.             this.el = tpl.insertBefore(position, {cls: this.baseCls}, true);
  1002.         }else{
  1003.             this.el = tpl.append(ct, {cls: this.baseCls}, true);
  1004.         }
  1005.         if(this.id){
  1006.             this.el.dom.id = this.id;
  1007.         }
  1008.         var inner = this.el.dom.firstChild;
  1009.         this.progressBar = Ext.get(inner.firstChild);
  1010.         if(this.textEl){
  1011.                          this.textEl = Ext.get(this.textEl);
  1012.             delete this.textTopEl;
  1013.         }else{
  1014.                          this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
  1015.             var textBackEl = Ext.get(inner.childNodes[1]);
  1016.             this.textTopEl.setStyle("z-index", 99).addClass('x-hidden');
  1017.             this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]);
  1018.             this.textEl.setWidth(inner.offsetWidth);
  1019.         }
  1020.         this.progressBar.setHeight(inner.offsetHeight);
  1021.     },
  1022.     
  1023.      afterRender : function(){
  1024. Ext.ProgressBar.superclass.afterRender.call(this);
  1025. if(this.value){
  1026. this.updateProgress(this.value, this.text);
  1027. }else{
  1028. this.updateText(this.text);
  1029. }
  1030. },
  1031.     
  1032.     updateProgress : function(value, text){
  1033.         this.value = value || 0;
  1034.         if(text){
  1035.             this.updateText(text);
  1036.         }
  1037.         if(this.rendered){
  1038.         var w = Math.floor(value*this.el.dom.firstChild.offsetWidth);
  1039.         this.progressBar.setWidth(w);
  1040.         if(this.textTopEl){
  1041.                          this.textTopEl.removeClass('x-hidden').setWidth(w);
  1042.         }
  1043.         }
  1044.         this.fireEvent('update', this, value, text);
  1045.         return this;
  1046.     },
  1047.     
  1048.     wait : function(o){
  1049.         if(!this.waitTimer){
  1050.             var scope = this;
  1051.             o = o || {};
  1052.             this.updateText(o.text);
  1053.             this.waitTimer = Ext.TaskMgr.start({
  1054.                 run: function(i){
  1055.                     var inc = o.increment || 10;
  1056.                     this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*.01);
  1057.                 },
  1058.                 interval: o.interval || 1000,
  1059.                 duration: o.duration,
  1060.                 onStop: function(){
  1061.                     if(o.fn){
  1062.                         o.fn.apply(o.scope || this);
  1063.                     }
  1064.                     this.reset();
  1065.                 },
  1066.                 scope: scope
  1067.             });
  1068.         }
  1069.         return this;
  1070.     },
  1071.     
  1072.     isWaiting : function(){
  1073.         return this.waitTimer != null;
  1074.     },
  1075.     
  1076.     updateText : function(text){
  1077.         this.text = text || '&#160;';
  1078.         if(this.rendered){
  1079.             this.textEl.update(this.text);
  1080.         }
  1081.         return this;
  1082.     },
  1083.     
  1084.     
  1085.     syncProgressBar : function(){
  1086.         if(this.value){
  1087.             this.updateProgress(this.value, this.text);
  1088.         }
  1089.         return this;
  1090.     },
  1091.     
  1092.     setSize : function(w, h){
  1093.         Ext.ProgressBar.superclass.setSize.call(this, w, h);
  1094.         if(this.textTopEl){
  1095.             var inner = this.el.dom.firstChild;
  1096.             this.textEl.setSize(inner.offsetWidth, inner.offsetHeight);
  1097.         }
  1098.         this.syncProgressBar();
  1099.         return this;
  1100.     },
  1101.     
  1102.     reset : function(hide){
  1103.         this.updateProgress(0);
  1104.         if(this.textTopEl){
  1105.             this.textTopEl.addClass('x-hidden');
  1106.         }
  1107.         if(this.waitTimer){
  1108.             this.waitTimer.onStop = null;              Ext.TaskMgr.stop(this.waitTimer);
  1109.             this.waitTimer = null;
  1110.         }
  1111.         if(hide === true){
  1112.             this.hide();
  1113.         }
  1114.         return this;
  1115.     }
  1116. });
  1117. Ext.reg('progress', Ext.ProgressBar);
  1118. Ext.Slider = Ext.extend(Ext.BoxComponent, {
  1119.     vertical: false,
  1120.     minValue: 0,
  1121.     maxValue: 100,
  1122.     keyIncrement: 1,
  1123.     increment: 0,
  1124.     clickRange: [5,15],
  1125.     clickToChange : true,
  1126.     animate: true,
  1127.     
  1128.     dragging: false,
  1129.          initComponent : function(){
  1130.         if(this.value === undefined){
  1131.             this.value = this.minValue;
  1132.         }
  1133.         Ext.Slider.superclass.initComponent.call(this);
  1134.         this.keyIncrement = Math.max(this.increment, this.keyIncrement); 
  1135.         this.addEvents(
  1136.             
  1137. 'beforechange', 
  1138. 'change',
  1139. 'changecomplete',
  1140. 'dragstart', 
  1141. 'drag', 
  1142. 'dragend'
  1143. );
  1144.         if(this.vertical){
  1145.             Ext.apply(this, Ext.Slider.Vertical);
  1146.         }
  1147.     },
  1148.     onRender : function(){
  1149.         this.autoEl = {
  1150.             cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'),
  1151.             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'}]}}
  1152.         };
  1153.         Ext.Slider.superclass.onRender.apply(this, arguments);
  1154.         this.endEl = this.el.first();
  1155.         this.innerEl = this.endEl.first();
  1156.         this.thumb = this.innerEl.first();
  1157.         this.halfThumb = (this.vertical ? this.thumb.getHeight() : this.thumb.getWidth())/2;
  1158.         this.focusEl = this.thumb.next();
  1159.         this.initEvents();
  1160.     },
  1161.     initEvents : function(){
  1162.         this.thumb.addClassOnOver('x-slider-thumb-over');
  1163.         this.mon(this.el, 'mousedown', this.onMouseDown, this);
  1164.         this.mon(this.el, 'keydown', this.onKeyDown, this);
  1165.         this.focusEl.swallowEvent("click", true);
  1166.         this.tracker = new Ext.dd.DragTracker({
  1167.             onBeforeStart: this.onBeforeDragStart.createDelegate(this),
  1168.             onStart: this.onDragStart.createDelegate(this),
  1169.             onDrag: this.onDrag.createDelegate(this),
  1170.             onEnd: this.onDragEnd.createDelegate(this),
  1171.             tolerance: 3,
  1172.             autoStart: 300
  1173.         });
  1174.         this.tracker.initEl(this.thumb);
  1175.         this.on('beforedestroy', this.tracker.destroy, this.tracker);
  1176.     },
  1177.     onMouseDown : function(e){
  1178.         if(this.disabled) {return;}
  1179.         if(this.clickToChange && e.target != this.thumb.dom){
  1180.             var local = this.innerEl.translatePoints(e.getXY());
  1181.             this.onClickChange(local);
  1182.         }
  1183.         this.focus();
  1184.     },
  1185.     onClickChange : function(local){
  1186.         if(local.top > this.clickRange[0] && local.top < this.clickRange[1]){
  1187.             this.setValue(Math.round(this.reverseValue(local.left)), undefined, true);
  1188.         }
  1189.     },
  1190.     onKeyDown : function(e){
  1191.         if(this.disabled){e.preventDefault();return;}
  1192.         var k = e.getKey();
  1193.         switch(k){
  1194.             case e.UP:
  1195.             case e.RIGHT:
  1196.                 e.stopEvent();
  1197.                 if(e.ctrlKey){
  1198.                     this.setValue(this.maxValue, undefined, true);
  1199.                 }else{
  1200.                     this.setValue(this.value+this.keyIncrement, undefined, true);
  1201.                 }
  1202.             break;
  1203.             case e.DOWN:
  1204.             case e.LEFT:
  1205.                 e.stopEvent();
  1206.                 if(e.ctrlKey){
  1207.                     this.setValue(this.minValue, undefined, true);
  1208.                 }else{
  1209.                     this.setValue(this.value-this.keyIncrement, undefined, true);
  1210.                 }
  1211.             break;
  1212.             default:
  1213.                 e.preventDefault();
  1214.         }
  1215.     },
  1216.     doSnap : function(value){
  1217.         if(!this.increment || this.increment == 1 || !value) {
  1218.             return value;
  1219.         }
  1220.         var newValue = value, inc = this.increment;
  1221.         var m = value % inc;
  1222.         if(m > 0){
  1223.             if(m > (inc/2)){
  1224.                 newValue = value + (inc-m);
  1225.             }else{
  1226.                 newValue = value - m;
  1227.             }
  1228.         }
  1229.         return newValue.constrain(this.minValue,  this.maxValue);
  1230.     },
  1231.     afterRender : function(){
  1232.         Ext.Slider.superclass.afterRender.apply(this, arguments);
  1233.         if(this.value !== undefined){
  1234.             var v = this.normalizeValue(this.value);
  1235.             if(v !== this.value){
  1236.                 delete this.value;
  1237.                 this.setValue(v, false);
  1238.             }else{
  1239.                 this.moveThumb(this.translateValue(v), false);
  1240.             }
  1241.         }
  1242.     },
  1243.     getRatio : function(){
  1244.         var w = this.innerEl.getWidth();
  1245.         var v = this.maxValue - this.minValue;
  1246.         return v == 0 ? w : (w/v);
  1247.     },
  1248.     normalizeValue : function(v){
  1249.        if(typeof v != 'number'){
  1250.             v = parseInt(v);
  1251.         }
  1252.         v = Math.round(v);
  1253.         v = this.doSnap(v);
  1254.         v = v.constrain(this.minValue, this.maxValue);
  1255.         return v;
  1256.     },
  1257.     setValue : function(v, animate, changeComplete){
  1258.         v = this.normalizeValue(v);
  1259.         if(v !== this.value && this.fireEvent('beforechange', this, v, this.value) !== false){
  1260.             this.value = v;
  1261.             this.moveThumb(this.translateValue(v), animate !== false);
  1262.             this.fireEvent('change', this, v);
  1263.             if(changeComplete){
  1264.                 this.fireEvent('changecomplete', this, v);
  1265.             }
  1266.         }
  1267.     },
  1268.     translateValue : function(v){
  1269.         var ratio = this.getRatio();
  1270.         return (v * ratio)-(this.minValue * ratio)-this.halfThumb;
  1271.     },
  1272. reverseValue : function(pos){
  1273.         var ratio = this.getRatio();
  1274.         return (pos+this.halfThumb+(this.minValue * ratio))/ratio;
  1275.     },
  1276.     moveThumb: function(v, animate){
  1277.         if(!animate || this.animate === false){
  1278.             this.thumb.setLeft(v);
  1279.         }else{
  1280.             this.thumb.shift({left: v, stopFx: true, duration:.35});
  1281.         }
  1282.     },
  1283.     focus : function(){
  1284.         this.focusEl.focus(10);
  1285.     },
  1286.     onBeforeDragStart : function(e){
  1287.         return !this.disabled;
  1288.     },
  1289.     onDragStart: function(e){
  1290.         this.thumb.addClass('x-slider-thumb-drag');
  1291.         this.dragging = true;
  1292.         this.dragStartValue = this.value;
  1293.         this.fireEvent('dragstart', this, e);
  1294.     },
  1295.     onDrag: function(e){
  1296.         var pos = this.innerEl.translatePoints(this.tracker.getXY());
  1297.         this.setValue(Math.round(this.reverseValue(pos.left)), false);
  1298.         this.fireEvent('drag', this, e);
  1299.     },
  1300.     onDragEnd: function(e){
  1301.         this.thumb.removeClass('x-slider-thumb-drag');
  1302.         this.dragging = false;
  1303.         this.fireEvent('dragend', this, e);
  1304.         if(this.dragStartValue != this.value){
  1305.             this.fireEvent('changecomplete', this, this.value);
  1306.         }
  1307.     },
  1308.          onResize : function(w, h){
  1309.         this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r')));
  1310.         this.syncThumb();
  1311.     },
  1312.     
  1313.     
  1314.     syncThumb : function(){
  1315.         if(this.rendered){
  1316.             this.moveThumb(this.translateValue(this.value));
  1317.         }
  1318.     },
  1319.     getValue : function(){
  1320.         return this.value;
  1321.     }
  1322. });
  1323. Ext.reg('slider', Ext.Slider);
  1324. Ext.Slider.Vertical = {
  1325.     onResize : function(w, h){
  1326.         this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b')));
  1327.         this.syncThumb();
  1328.     },
  1329.     getRatio : function(){
  1330.         var h = this.innerEl.getHeight();
  1331.         var v = this.maxValue - this.minValue;
  1332.         return h/v;
  1333.     },
  1334.     moveThumb: function(v, animate){
  1335.         if(!animate || this.animate === false){
  1336.             this.thumb.setBottom(v);
  1337.         }else{
  1338.             this.thumb.shift({bottom: v, stopFx: true, duration:.35});
  1339.         }
  1340.     },
  1341.     onDrag: function(e){
  1342.         var pos = this.innerEl.translatePoints(this.tracker.getXY());
  1343.         var bottom = this.innerEl.getHeight()-pos.top;
  1344.         this.setValue(Math.round(bottom/this.getRatio()), false);
  1345.         this.fireEvent('drag', this, e);
  1346.     },
  1347.     onClickChange : function(local){
  1348.         if(local.left > this.clickRange[0] && local.left < this.clickRange[1]){
  1349.             var bottom = this.innerEl.getHeight()-local.top;
  1350.             this.setValue(Math.round(bottom/this.getRatio()), undefined, true);
  1351.         }
  1352.     }
  1353. }; Ext.StatusBar = Ext.extend(Ext.Toolbar, {                                        cls : 'x-statusbar',          busyIconCls : 'x-status-busy',          busyText : 'Loading...',          autoClear : 5000,              activeThreadId : 0,              initComponent : function(){         if(this.statusAlign=='right'){             this.cls += ' x-status-right';         }         Ext.StatusBar.superclass.initComponent.call(this);     },              afterRender : function(){         Ext.StatusBar.superclass.afterRender.call(this);                  var right = this.statusAlign=='right',             td = Ext.get(this.nextBlock());                  if(right){             this.tr.appendChild(td.dom);         }else{             td.insertBefore(this.tr.firstChild);         }                  this.statusEl = td.createChild({             cls: 'x-status-text ' + (this.iconCls || this.defaultIconCls || ''),             html: this.text || this.defaultText || ''         });         this.statusEl.unselectable();                  this.spacerEl = td.insertSibling({             tag: 'td',             style: 'width:100%',             cn: [{cls:'ytb-spacer'}]         }, right ? 'before' : 'after');     },          setStatus : function(o){         o = o || {};                  if(typeof o == 'string'){             o = {text:o};         }         if(o.text !== undefined){             this.setText(o.text);         }         if(o.iconCls !== undefined){             this.setIcon(o.iconCls);         }                  if(o.clear){             var c = o.clear,                 wait = this.autoClear,                 defaults = {useDefaults: true, anim: true};                          if(typeof c == 'object'){                 c = Ext.applyIf(c, defaults);                 if(c.wait){                     wait = c.wait;                 }             }else if(typeof c == 'number'){                 wait = c;                 c = defaults;             }else if(typeof c == 'boolean'){                 c = defaults;             }                          c.threadId = this.activeThreadId;             this.clearStatus.defer(wait, this, [c]);         }         return this;     },                clearStatus : function(o){         o = o || {};                  if(o.threadId && o.threadId !== this.activeThreadId){                                                 return this;         }                  var text = o.useDefaults ? this.defaultText : '',             iconCls = o.useDefaults ? (this.defaultIconCls ? this.defaultIconCls : '') : '';                      if(o.anim){             this.statusEl.fadeOut({                 remove: false,                 useDisplay: true,                 scope: this,                 callback: function(){                     this.setStatus({                     text: text,                      iconCls: iconCls                 });                     this.statusEl.show();                 }             });         }else{                         this.statusEl.hide();         this.setStatus({             text: text,             iconCls: iconCls         });             this.statusEl.show();         }         return this;     },               setText : function(text){         this.activeThreadId++;         this.text = text || '';         if(this.rendered){             this.statusEl.update(this.text);         }         return this;     },               getText : function(){         return this.text;     },          setIcon : function(cls){         this.activeThreadId++;         cls = cls || '';                  if(this.rendered){         if(this.currIconCls){             this.statusEl.removeClass(this.currIconCls);             this.currIconCls = null;         }         if(cls.length > 0){             this.statusEl.addClass(cls);             this.currIconCls = cls;         }         }else{             this.currIconCls = cls;         }         return this;     },               showBusy : function(o){         if(typeof o == 'string'){             o = {text:o};         }         o = Ext.applyIf(o || {}, {             text: this.busyText,             iconCls: this.busyIconCls         });         return this.setStatus(o);     } }); Ext.reg('statusbar', Ext.StatusBar);
  1354. Ext.History = (function () {
  1355.     var iframe, hiddenField;
  1356.     var ready = false;
  1357.     var currentToken;
  1358.     function getHash() {
  1359.         var href = top.location.href, i = href.indexOf("#");
  1360.         return i >= 0 ? href.substr(i + 1) : null;
  1361.     }
  1362.     function doSave() {
  1363.         hiddenField.value = currentToken;
  1364.     }
  1365.     function handleStateChange(token) {
  1366.         currentToken = token;
  1367.         Ext.History.fireEvent('change', token);
  1368.     }
  1369.     function updateIFrame (token) {
  1370.         var html = ['<html><body><div id="state">',token,'</div></body></html>'].join('');
  1371.         try {
  1372.             var doc = iframe.contentWindow.document;
  1373.             doc.open();
  1374.             doc.write(html);
  1375.             doc.close();
  1376.             return true;
  1377.         } catch (e) {
  1378.             return false;
  1379.         }
  1380.     }
  1381.     function checkIFrame() {
  1382.         if (!iframe.contentWindow || !iframe.contentWindow.document) {
  1383.             setTimeout(checkIFrame, 10);
  1384.             return;
  1385.         }
  1386.         var doc = iframe.contentWindow.document;
  1387.         var elem = doc.getElementById("state");
  1388.         var token = elem ? elem.innerText : null;
  1389.         var hash = getHash();
  1390.         setInterval(function () {
  1391.             doc = iframe.contentWindow.document;
  1392.             elem = doc.getElementById("state");
  1393.             var newtoken = elem ? elem.innerText : null;
  1394.             var newHash = getHash();
  1395.             if (newtoken !== token) {
  1396.                 token = newtoken;
  1397.                 handleStateChange(token);
  1398.                 top.location.hash = token;
  1399.                 hash = token;
  1400.                 doSave();
  1401.             } else if (newHash !== hash) {
  1402.                 hash = newHash;
  1403.                 updateIFrame(newHash);
  1404.             }
  1405.         }, 50);
  1406.         ready = true;
  1407.         Ext.History.fireEvent('ready', Ext.History);
  1408.     }
  1409.     function startUp() {
  1410.         currentToken = hiddenField.value;
  1411.         if (Ext.isIE) {
  1412.             checkIFrame();
  1413.         } else {
  1414.             var hash = getHash();
  1415.             setInterval(function () {
  1416.                 var newHash = getHash();
  1417.                 if (newHash !== hash) {
  1418.                     hash = newHash;
  1419.                     handleStateChange(hash);
  1420.                     doSave();
  1421.                 }
  1422.             }, 50);
  1423.             ready = true;
  1424.             Ext.History.fireEvent('ready', Ext.History);
  1425.         }
  1426.     }
  1427.     return {
  1428.         
  1429.         fieldId: 'x-history-field',
  1430.         
  1431.         iframeId: 'x-history-frame',
  1432.         
  1433.         events:{},
  1434.         
  1435.         init: function (onReady, scope) {
  1436.             if(ready) {
  1437.                 Ext.callback(onReady, scope, [this]);
  1438.                 return;
  1439.             }
  1440.             if(!Ext.isReady){
  1441.                 Ext.onReady(function(){
  1442.                     Ext.History.init(onReady, scope);
  1443.                 });
  1444.                 return;
  1445.             }
  1446.             hiddenField = Ext.getDom(Ext.History.fieldId);
  1447. if (Ext.isIE) {
  1448.                 iframe = Ext.getDom(Ext.History.iframeId);
  1449.             }
  1450.             this.addEvents('ready', 'change');
  1451.             if(onReady){
  1452.                 this.on('ready', onReady, scope, {single:true});
  1453.             }
  1454.             startUp();
  1455.         },
  1456.         
  1457.         add: function (token, preventDup) {
  1458.             if(preventDup !== false){
  1459.                 if(this.getToken() == token){
  1460.                     return true;
  1461.                 }
  1462.             }
  1463.             if (Ext.isIE) {
  1464.                 return updateIFrame(token);
  1465.             } else {
  1466.                 top.location.hash = token;
  1467.                 return true;
  1468.             }
  1469.         },
  1470.         
  1471.         back: function(){
  1472.             history.go(-1);
  1473.         },
  1474.         
  1475.         forward: function(){
  1476.             history.go(1);
  1477.         },
  1478.         
  1479.         getToken: function() {
  1480.             return ready ? currentToken : getHash();
  1481.         }
  1482.     };
  1483. })();
  1484. Ext.apply(Ext.History, new Ext.util.Observable()); Ext.debug = {}; (function(){ var cp; function createConsole(){     var scriptPanel = new Ext.debug.ScriptsPanel();     var logView = new Ext.debug.LogPanel();     var tree = new Ext.debug.DomTree();     var tabs = new Ext.TabPanel({         activeTab: 0,         border: false,         tabPosition: 'bottom',         items: [{             title: 'Debug Console',             layout:'border',             items: [logView, scriptPanel]         },{             title: 'DOM Inspector',             layout:'border',             items: [tree]         }]     });     cp = new Ext.Panel({         id: 'x-debug-browser',         title: 'Console',         collapsible: true,         animCollapse: false,         style: 'position:absolute;left:0;bottom:0;',         height:200,         logView: logView,         layout: 'fit',                  tools:[{             id: 'close',             handler: function(){                 cp.destroy();                 cp = null;                 Ext.EventManager.removeResizeListener(handleResize);             }         }],         items: tabs     });     cp.render(document.body);     cp.resizer = new Ext.Resizable(cp.el, {         minHeight:50,         handles: "n",         pinned: true,         transparent:true,         resizeElement : function(){             var box = this.proxy.getBox();             this.proxy.hide();             cp.setHeight(box.height);             return box;         }     });     function handleResize(){         cp.setWidth(Ext.getBody().getViewSize().width);     }     Ext.EventManager.onWindowResize(handleResize);     handleResize(); } Ext.apply(Ext, {     log : function(){         if(!cp){             createConsole();         }         cp.logView.log.apply(cp.logView, arguments);     },     logf : function(format, arg1, arg2, etc){         Ext.log(String.format.apply(String, arguments));     },     dump : function(o){         if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || Ext.isDate(o)){             Ext.log(o);         }else if(!o){             Ext.log("null");         }else if(typeof o != "object"){             Ext.log('Unknown return type');         }else if(Ext.isArray(o)){             Ext.log('['+o.join(',')+']');         }else{             var b = ["{n"];             for(var key in o){                 var to = typeof o[key];                 if(to != "function" && to != "object"){                     b.push(String.format("  {0}: {1},n", key, o[key]));                 }             }             var s = b.join("");             if(s.length > 3){                 s = s.substr(0, s.length-2);             }             Ext.log(s + "n}");         }     },     _timers : {},     time : function(name){         name = name || "def";         Ext._timers[name] = new Date().getTime();     },     timeEnd : function(name, printResults){         var t = new Date().getTime();         name = name || "def";         var v = String.format("{0} ms", t-Ext._timers[name]);         Ext._timers[name] = new Date().getTime();         if(printResults !== false){             Ext.log('Timer ' + (name == "def" ? v : name + ": " + v));         }         return v;     } }); })(); Ext.debug.ScriptsPanel = Ext.extend(Ext.Panel, {     id:'x-debug-scripts',     region: 'east',     minWidth: 200,     split: true,     width: 350,     border: false,     layout:'anchor',     style:'border-width:0 0 0 1px;',     initComponent : function(){         this.scriptField = new Ext.form.TextArea({             anchor: '100% -26',             style:'border-width:0;'         });         this.trapBox = new Ext.form.Checkbox({             id: 'console-trap',             boxLabel: 'Trap Errors',             checked: true         });         this.toolbar = new Ext.Toolbar([{                 text: 'Run',                 scope: this,                 handler: this.evalScript             },{                 text: 'Clear',                 scope: this,                 handler: this.clear             },             '->',             this.trapBox,             ' ', ' '         ]);         this.items = [this.toolbar, this.scriptField];         Ext.debug.ScriptsPanel.superclass.initComponent.call(this);     },     evalScript : function(){         var s = this.scriptField.getValue();         if(this.trapBox.getValue()){             try{                 var rt = eval(s);                 Ext.dump(rt === undefined? '(no return)' : rt);             }catch(e){                 Ext.log(e.message || e.descript);             }         }else{             var rt = eval(s);             Ext.dump(rt === undefined? '(no return)' : rt);         }     },     clear : function(){         this.scriptField.setValue('');         this.scriptField.focus();     } }); Ext.debug.LogPanel = Ext.extend(Ext.Panel, {     autoScroll: true,     region: 'center',     border: false,     style:'border-width:0 1px 0 0',     log : function(){         var markup = [  '<div style="padding:5px !important;border-bottom:1px solid #ccc;">',                     Ext.util.Format.htmlEncode(Array.prototype.join.call(arguments, ', ')).replace(/n/g, '<br />').replace(/s/g, '&#160;'),                     '</div>'].join('');         this.body.insertHtml('beforeend', markup);         this.body.scrollTo('top', 100000);     },     clear : function(){         this.body.update('');         this.body.dom.scrollTop = 0;     } }); Ext.debug.DomTree = Ext.extend(Ext.tree.TreePanel, {     enableDD:false ,     lines:false,     rootVisible:false,     animate:false,     hlColor:'ffff9c',     autoScroll: true,     region:'center',     border:false,     initComponent : function(){         Ext.debug.DomTree.superclass.initComponent.call(this);                          var styles = false, hnode;         var nonSpace = /^s*$/;         var html = Ext.util.Format.htmlEncode;         var ellipsis = Ext.util.Format.ellipsis;         var styleRe = /s?([a-z-]*):([^;]*)(?:[;snr]*)/gi;         function findNode(n){             if(!n || n.nodeType != 1 || n == document.body || n == document){                 return false;             }             var pn = [n], p = n;             while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){                 pn.unshift(p);             }             var cn = hnode;             for(var i = 0, len = pn.length; i < len; i++){                 cn.expand();                 cn = cn.findChild('htmlNode', pn[i]);                 if(!cn){                     return false;                 }             }             cn.select();             var a = cn.ui.anchor;             treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10);                         cn.highlight();             return true;         }         function nodeTitle(n){             var s = n.tagName;             if(n.id){                 s += '#'+n.id;             }else if(n.className){                 s += '.'+n.className;             }             return s;         }         function onNodeSelect(t, n, last){             return;             if(last && last.unframe){                 last.unframe();             }             var props = {};             if(n && n.htmlNode){                 if(frameEl.pressed){                     n.frame();                 }                 if(inspecting){                     return;                 }                 addStyle.enable();                 reload.setDisabled(n.leaf);                 var dom = n.htmlNode;                 stylePanel.setTitle(nodeTitle(dom));                 if(styles && !showAll.pressed){                     var s = dom.style ? dom.style.cssText : '';                     if(s){                         var m;                         while ((m = styleRe.exec(s)) != null){                             props[m[1].toLowerCase()] = m[2];                         }                     }                 }else if(styles){                     var cl = Ext.debug.cssList;                     var s = dom.style, fly = Ext.fly(dom);                     if(s){                         for(var i = 0, len = cl.length; i<len; i++){                             var st = cl[i];                             var v = s[st] || fly.getStyle(st);                             if(v != undefined && v !== null && v !== ''){                                 props[st] = v;                             }                         }                     }                 }else{                     for(var a in dom){                         var v = dom[a];                         if((isNaN(a+10)) && v != undefined && v !== null && v !== '' && !(Ext.isGecko && a[0] == a[0].toUpperCase())){                             props[a] = v;                         }                     }                 }             }else{                 if(inspecting){                     return;                 }                 addStyle.disable();                 reload.disabled();             }             stylesGrid.setSource(props);             stylesGrid.treeNode = n;             stylesGrid.view.fitColumns();         }         this.loader = new Ext.tree.TreeLoader();         this.loader.load = function(n, cb){             var isBody = n.htmlNode == document.body;             var cn = n.htmlNode.childNodes;             for(var i = 0, c; c = cn[i]; i++){                 if(isBody && c.id == 'x-debug-browser'){                     continue;                 }                 if(c.nodeType == 1){                     n.appendChild(new Ext.debug.HtmlNode(c));                 }else if(c.nodeType == 3 && !nonSpace.test(c.nodeValue)){                     n.appendChild(new Ext.tree.TreeNode({                         text:'<em>' + ellipsis(html(String(c.nodeValue)), 35) + '</em>',                         cls: 'x-tree-noicon'                     }));                 }             }             cb();         };                  this.root = this.setRootNode(new Ext.tree.TreeNode('Ext'));         hnode = this.root.appendChild(new Ext.debug.HtmlNode(                 document.getElementsByTagName('html')[0]         ));     } }); Ext.debug.HtmlNode = function(){     var html = Ext.util.Format.htmlEncode;     var ellipsis = Ext.util.Format.ellipsis;     var nonSpace = /^s*$/;     var attrs = [         {n: 'id', v: 'id'},         {n: 'className', v: 'class'},         {n: 'name', v: 'name'},         {n: 'type', v: 'type'},         {n: 'src', v: 'src'},         {n: 'href', v: 'href'}     ];     function hasChild(n){         for(var i = 0, c; c = n.childNodes[i]; i++){             if(c.nodeType == 1){                 return true;             }         }         return false;     }     function renderNode(n, leaf){         var tag = n.tagName.toLowerCase();         var s = '&lt;' + tag;         for(var i = 0, len = attrs.length; i < len; i++){             var a = attrs[i];             var v = n[a.n];             if(v && !nonSpace.test(v)){                 s += ' ' + a.v + '=&quot;<i>' + html(v) +'</i>&quot;';             }         }         var style = n.style ? n.style.cssText : '';         if(style){             s += ' style=&quot;<i>' + html(style.toLowerCase()) +'</i>&quot;';         }         if(leaf && n.childNodes.length > 0){             s+='&gt;<em>' + ellipsis(html(String(n.innerHTML)), 35) + '</em>&lt;/'+tag+'&gt;';         }else if(leaf){             s += ' /&gt;';         }else{             s += '&gt;';         }         return s;     }     var HtmlNode = function(n){         var leaf = !hasChild(n);         this.htmlNode = n;         this.tagName = n.tagName.toLowerCase();         var attr = {             text : renderNode(n, leaf),             leaf : leaf,             cls: 'x-tree-noicon'         };         HtmlNode.superclass.constructor.call(this, attr);         this.attributes.htmlNode = n;         if(!leaf){             this.on('expand', this.onExpand,  this);             this.on('collapse', this.onCollapse,  this);         }     };     Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, {         cls: 'x-tree-noicon',         preventHScroll: true,         refresh : function(highlight){             var leaf = !hasChild(this.htmlNode);             this.setText(renderNode(this.htmlNode, leaf));             if(highlight){                 Ext.fly(this.ui.textNode).highlight();             }         },         onExpand : function(){             if(!this.closeNode && this.parentNode){                 this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({                     text:'&lt;/' + this.tagName + '&gt;',                     cls: 'x-tree-noicon'                 }), this.nextSibling);             }else if(this.closeNode){                 this.closeNode.ui.show();             }         },         onCollapse : function(){             if(this.closeNode){                 this.closeNode.ui.hide();             }         },         render : function(bulkRender){             HtmlNode.superclass.render.call(this, bulkRender);         },         highlightNode : function(){                     },         highlight : function(){                     },         frame : function(){             this.htmlNode.style.border = '1px solid #0000ff';                     },         unframe : function(){                         this.htmlNode.style.border = '';         }     });     return HtmlNode; }();