Ext.ns('Ext.ux.grid');Ext.ux.grid.TableGrid=function(table,config){config=config||{};Ext.apply(this,config);var cf=config.fields||[],ch=config.columns||[];table=Ext.get(table);var ct=table.insertSibling();var fields=[],cols=[];var headers=table.query("thead th");for(var i=0,h;h=headers[i];i++){var text=h.innerHTML;var name='tcol-'+i;fields.push(Ext.applyIf(cf[i]||{},{name:name,mapping:'td:nth('+(i+1)+')/@innerHTML'}));cols.push(Ext.applyIf(ch[i]||{},{'header':text,'dataIndex':name,'width':h.offsetWidth,'tooltip':h.title,'sortable':true}))}var ds=new Ext.data.Store({reader:new Ext.data.XmlReader({record:'tbody tr'},fields)});ds.loadData(table.dom);var cm=new Ext.grid.ColumnModel(cols);if(config.width||config.height){ct.setSize(config.width||'auto',config.height||'auto')}else{ct.setWidth(table.getWidth())}if(config.remove!==false){table.remove()}Ext.applyIf(this,{'ds':ds,'cm':cm,'sm':new Ext.grid.RowSelectionModel(),autoHeight:true,autoWidth:false});Ext.ux.grid.TableGrid.superclass.constructor.call(this,ct,{})};Ext.extend(Ext.ux.grid.TableGrid,Ext.grid.GridPanel);Ext.grid.TableGrid=Ext.ux.grid.TableGrid;Ext.ux.grid.RowEditor=Ext.extend(Ext.Panel,{floating:true,shadow:false,layout:'hbox',cls:'x-small-editor',buttonAlign:'center',baseCls:'x-row-editor',elements:'header,footer,body',frameWidth:5,buttonPad:3,clicksToEdit:'auto',monitorValid:true,focusDelay:250,errorSummary:true,saveText:'Save',cancelText:'Cancel',commitChangesText:'You need to commit or cancel your changes',errorText:'Errors',defaults:{normalWidth:true},initComponent:function(){Ext.ux.grid.RowEditor.superclass.initComponent.call(this);this.addEvents('beforeedit','canceledit','validateedit','afteredit')},init:function(grid){this.grid=grid;this.ownerCt=grid;if(this.clicksToEdit===2){grid.on('rowdblclick',this.onRowDblClick,this)}else{grid.on('rowclick',this.onRowClick,this);if(Ext.isIE){grid.on('rowdblclick',this.onRowDblClick,this)}}grid.getStore().on('remove',function(){this.stopEditing(false)},this);grid.on({scope:this,keydown:this.onGridKey,columnresize:this.verifyLayout,columnmove:this.refreshFields,reconfigure:this.refreshFields,beforedestroy:this.beforedestroy,destroy:this.destroy,bodyscroll:{buffer:250,fn:this.positionButtons}});grid.getColumnModel().on('hiddenchange',this.verifyLayout,this,{delay:1});grid.getView().on('refresh',this.stopEditing.createDelegate(this,[]))},beforedestroy:function(){this.grid.getStore().un('remove',this.onStoreRemove,this);this.stopEditing(false);Ext.destroy(this.btns)},refreshFields:function(){this.initFields();this.verifyLayout()},isDirty:function(){var dirty;this.items.each(function(f){if(String(this.values[f.id])!==String(f.getValue())){dirty=true;return false}},this);return dirty},startEditing:function(rowIndex,doFocus){if(this.editing&&this.isDirty()){this.showTooltip(this.commitChangesText);return}if(Ext.isObject(rowIndex)){rowIndex=this.grid.getStore().indexOf(rowIndex)}if(this.fireEvent('beforeedit',this,rowIndex)!==false){this.editing=true;var g=this.grid,view=g.getView(),row=view.getRow(rowIndex),record=g.store.getAt(rowIndex);this.record=record;this.rowIndex=rowIndex;this.values={};if(!this.rendered){this.render(view.getEditorParent())}var w=Ext.fly(row).getWidth();this.setSize(w);if(!this.initialized){this.initFields()}var cm=g.getColumnModel(),fields=this.items.items,f,val;for(var i=0,len=cm.getColumnCount();i<len;i++){val=this.preEditValue(record,cm.getDataIndex(i));f=fields[i];f.setValue(val);this.values[f.id]=Ext.isEmpty(val)?'':val}this.verifyLayout(true);if(!this.isVisible()){this.setPagePosition(Ext.fly(row).getXY())}else{this.el.setXY(Ext.fly(row).getXY(),{duration:0.15})}if(!this.isVisible()){this.show().doLayout()}if(doFocus!==false){this.doFocus.defer(this.focusDelay,this)}}},stopEditing:function(saveChanges){this.editing=false;if(!this.isVisible()){return}if(saveChanges===false||!this.isValid()){this.hide();this.fireEvent('canceledit',this,saveChanges===false);return}var changes={},r=this.record,hasChange=false,cm=this.grid.colModel,fields=this.items.items;for(var i=0,len=cm.getColumnCount();i<len;i++){if(!cm.isHidden(i)){var dindex=cm.getDataIndex(i);if(!Ext.isEmpty(dindex)){var oldValue=r.data[dindex],value=this.postEditValue(fields[i].getValue(),oldValue,r,dindex);if(String(oldValue)!==String(value)){changes[dindex]=value;hasChange=true}}}}if(hasChange&&this.fireEvent('validateedit',this,changes,r,this.rowIndex)!==false){r.beginEdit();Ext.iterate(changes,function(name,value){r.set(name,value)});r.endEdit();this.fireEvent('afteredit',this,changes,r,this.rowIndex)}this.hide()},verifyLayout:function(force){if(this.el&&(this.isVisible()||force===true)){var row=this.grid.getView().getRow(this.rowIndex);this.setSize(Ext.fly(row).getWidth(),Ext.fly(row).getHeight()+9);var cm=this.grid.colModel,fields=this.items.items;for(var i=0,len=cm.getColumnCount();i<len;i++){if(!cm.isHidden(i)){var adjust=0;if(i===(len-1)){adjust+=3}else{adjust+=1}fields[i].show();fields[i].setWidth(cm.getColumnWidth(i)-adjust)}else{fields[i].hide()}}this.doLayout();this.positionButtons()}},slideHide:function(){this.hide()},initFields:function(){var cm=this.grid.getColumnModel(),pm=Ext.layout.ContainerLayout.prototype.parseMargins;this.removeAll(false);for(var i=0,len=cm.getColumnCount();i<len;i++){var c=cm.getColumnAt(i),ed=c.getEditor();if(!ed){ed=c.displayEditor||new Ext.form.DisplayField()}if(i==0){ed.margins=pm('0 1 2 1')}else if(i==len-1){ed.margins=pm('0 0 2 1')}else{ed.margins=pm('0 1 2')}ed.setWidth(cm.getColumnWidth(i));ed.column=c;if(ed.ownerCt!==this){ed.on('focus',this.ensureVisible,this);ed.on('specialkey',this.onKey,this)}this.insert(i,ed)}this.initialized=true},onKey:function(f,e){if(e.getKey()===e.ENTER){this.stopEditing(true);e.stopPropagation()}},onGridKey:function(e){if(e.getKey()===e.ENTER&&!this.isVisible()){var r=this.grid.getSelectionModel().getSelected();if(r){var index=this.grid.store.indexOf(r);this.startEditing(index);e.stopPropagation()}}},ensureVisible:function(editor){if(this.isVisible()){this.grid.getView().ensureVisible(this.rowIndex,this.grid.colModel.getIndexById(editor.column.id),true)}},onRowClick:function(g,rowIndex,e){if(this.clicksToEdit=='auto'){var li=this.lastClickIndex;this.lastClickIndex=rowIndex;if(li!=rowIndex&&!this.isVisible()){return}}this.startEditing(rowIndex,false);this.doFocus.defer(this.focusDelay,this,[e.getPoint()])},onRowDblClick:function(g,rowIndex,e){this.startEditing(rowIndex,false);this.doFocus.defer(this.focusDelay,this,[e.getPoint()])},onRender:function(){Ext.ux.grid.RowEditor.superclass.onRender.apply(this,arguments);this.el.swallowEvent(['keydown','keyup','keypress']);this.btns=new Ext.Panel({baseCls:'x-plain',cls:'x-btns',elements:'body',layout:'table',width:(this.minButtonWidth*2)+(this.frameWidth*2)+(this.buttonPad*4),items:[{ref:'saveBtn',itemId:'saveBtn',xtype:'button',text:this.saveText,width:this.minButtonWidth,handler:this.stopEditing.createDelegate(this,[true])},{xtype:'button',text:this.cancelText,width:this.minButtonWidth,handler:this.stopEditing.createDelegate(this,[false])}]});this.btns.render(this.bwrap)},afterRender:function(){Ext.ux.grid.RowEditor.superclass.afterRender.apply(this,arguments);this.positionButtons();if(this.monitorValid){this.startMonitoring()}},onShow:function(){if(this.monitorValid){this.startMonitoring()}Ext.ux.grid.RowEditor.superclass.onShow.apply(this,arguments)},onHide:function(){Ext.ux.grid.RowEditor.superclass.onHide.apply(this,arguments);this.stopMonitoring();this.grid.getView().focusRow(this.rowIndex)},positionButtons:function(){if(this.btns){var g=this.grid,h=this.el.dom.clientHeight,view=g.getView(),scroll=view.scroller.dom.scrollLeft,bw=this.btns.getWidth(),width=Math.min(g.getWidth(),g.getColumnModel().getTotalWidth());this.btns.el.shift({left:(width/2)-(bw/2)+scroll,top:h-2,stopFx:true,duration:0.2})}},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},doFocus:function(pt){if(this.isVisible()){var index=0,cm=this.grid.getColumnModel(),c;if(pt){index=this.getTargetColumnIndex(pt)}for(var i=index||0,len=cm.getColumnCount();i<len;i++){c=cm.getColumnAt(i);if(!c.hidden&&c.getEditor()){c.getEditor().focus();break}}}},getTargetColumnIndex:function(pt){var grid=this.grid,v=grid.view,x=pt.left,cms=grid.colModel.config,i=0,match=false;for(var len=cms.length,c;c=cms[i];i++){if(!c.hidden){if(Ext.fly(v.getHeaderCell(i)).getRegion().right>=x){match=i;break}}}return match},startMonitoring:function(){if(!this.bound&&this.monitorValid){this.bound=true;Ext.TaskMgr.start({run:this.bindHandler,interval:this.monitorPoll||200,scope:this})}},stopMonitoring:function(){this.bound=false;if(this.tooltip){this.tooltip.hide()}},isValid:function(){var valid=true;this.items.each(function(f){if(!f.isValid(true)){valid=false;return false}});return valid},bindHandler:function(){if(!this.bound){return false}var valid=this.isValid();if(!valid&&this.errorSummary){this.showTooltip(this.getErrorText().join(''))}this.btns.saveBtn.setDisabled(!valid);this.fireEvent('validation',this,valid)},showTooltip:function(msg){var t=this.tooltip;if(!t){t=this.tooltip=new Ext.ToolTip({maxWidth:600,cls:'errorTip',width:300,title:this.errorText,autoHide:false,anchor:'left',anchorToTarget:true,mouseOffset:[40,0]})}var v=this.grid.getView(),top=parseInt(this.el.dom.style.top,10),scroll=v.scroller.dom.scrollTop,h=this.el.getHeight();if(top+h>=scroll){t.initTarget(this.items.last().getEl());if(!t.rendered){t.show();t.hide()}t.body.update(msg);t.doAutoWidth();t.show()}else if(t.rendered){t.hide()}},getErrorText:function(){var data=['<ul>'];this.items.each(function(f){if(!f.isValid(true)){data.push('<li>',f.activeError,'</li>')}});data.push('</ul>');return data}});Ext.preg('roweditor',Ext.ux.grid.RowEditor);Ext.override(Ext.form.Field,{markInvalid:function(msg){if(!this.rendered||this.preventMark){return}msg=msg||this.invalidText;var mt=this.getMessageHandler();if(mt){mt.mark(this,msg)}else if(this.msgTarget){this.el.addClass(this.invalidClass);var t=Ext.getDom(this.msgTarget);if(t){t.innerHTML=msg;t.style.display=this.msgDisplay}}this.activeError=msg;this.fireEvent('invalid',this,msg)}});Ext.override(Ext.ToolTip,{doAutoWidth:function(){var bw=this.body.getTextWidth();if(this.title){bw=Math.max(bw,this.header.child('span').getTextWidth(this.title))}bw+=this.getFrameWidth()+(this.closable?20:0)+this.body.getPadding("lr")+20;this.setWidth(bw.constrain(this.minWidth,this.maxWidth));if(Ext.isIE7&&!this.repainted){this.el.repaint();this.repainted=true}}});Ext.ux.SliderTip=Ext.extend(Ext.Tip,{minWidth:10,offsets:[0,-10],init:function(slider){slider.on('dragstart',this.onSlide,this);slider.on('drag',this.onSlide,this);slider.on('dragend',this.hide,this);slider.on('destroy',this.destroy,this)},onSlide:function(slider){this.show();this.body.update(this.getText(slider));this.doAutoWidth();this.el.alignTo(slider.thumb,'b-t?',this.offsets)},getText:function(slider){return String(slider.getValue())}});Ext.ux.Portal=Ext.extend(Ext.Panel,{layout:'column',autoScroll:true,cls:'x-portal',defaultType:'portalcolumn',initComponent:function(){Ext.ux.Portal.superclass.initComponent.call(this);this.addEvents({validatedrop:true,beforedragover:true,dragover:true,beforedrop:true,drop:true})},initEvents:function(){Ext.ux.Portal.superclass.initEvents.call(this);this.dd=new Ext.ux.Portal.DropZone(this,this.dropConfig)},beforeDestroy:function(){if(this.dd){this.dd.unreg()}Ext.ux.Portal.superclass.beforeDestroy.call(this)}});Ext.reg('portal',Ext.ux.Portal);Ext.ux.Portal.DropZone=function(portal,cfg){this.portal=portal;Ext.dd.ScrollManager.register(portal.body);Ext.ux.Portal.DropZone.superclass.constructor.call(this,portal.bwrap.dom,cfg);portal.body.ddScrollConfig=this.ddScrollConfig};Ext.extend(Ext.ux.Portal.DropZone,Ext.dd.DropTarget,{ddScrollConfig:{vthresh:50,hthresh:-1,animate:true,increment:200},createEvent:function(dd,e,data,col,c,pos){return{portal:this.portal,panel:data.panel,columnIndex:col,column:c,position:pos,data:data,source:dd,rawEvent:e,status:this.dropAllowed}},notifyOver:function(dd,e,data){var xy=e.getXY(),portal=this.portal,px=dd.proxy;if(!this.grid){this.grid=this.getGrid()}var cw=portal.body.dom.clientWidth;if(!this.lastCW){this.lastCW=cw}else if(this.lastCW!=cw){this.lastCW=cw;portal.doLayout();this.grid=this.getGrid()}var col=0,xs=this.grid.columnX,cmatch=false;for(var len=xs.length;col<len;col++){if(xy[0]<(xs[col].x+xs[col].w)){cmatch=true;break}}if(!cmatch){col--}var p,match=false,pos=0,c=portal.items.itemAt(col),items=c.items.items,overSelf=false;for(var len=items.length;pos<len;pos++){p=items[pos];var h=p.el.getHeight();if(h===0){overSelf=true}else if((p.el.getY()+(h/2))>xy[1]){match=true;break}}pos=(match&&p?pos:c.items.getCount())+(overSelf?-1:0);var overEvent=this.createEvent(dd,e,data,col,c,pos);if(portal.fireEvent('validatedrop',overEvent)!==false&&portal.fireEvent('beforedragover',overEvent)!==false){px.getProxy().setWidth('auto');if(p){px.moveProxy(p.el.dom.parentNode,match?p.el.dom:null)}else{px.moveProxy(c.el.dom,null)}this.lastPos={c:c,col:col,p:overSelf||(match&&p)?pos:false};this.scrollPos=portal.body.getScroll();portal.fireEvent('dragover',overEvent);return overEvent.status}else{return overEvent.status}},notifyOut:function(){delete this.grid},notifyDrop:function(dd,e,data){delete this.grid;if(!this.lastPos){return}var c=this.lastPos.c,col=this.lastPos.col,pos=this.lastPos.p;var dropEvent=this.createEvent(dd,e,data,col,c,pos!==false?pos:c.items.getCount());if(this.portal.fireEvent('validatedrop',dropEvent)!==false&&this.portal.fireEvent('beforedrop',dropEvent)!==false){dd.proxy.getProxy().remove();dd.panel.el.dom.parentNode.removeChild(dd.panel.el.dom);if(pos!==false){if(c==dd.panel.ownerCt&&(c.items.items.indexOf(dd.panel)<=pos)){pos++}c.insert(pos,dd.panel)}else{c.add(dd.panel)}c.doLayout();this.portal.fireEvent('drop',dropEvent);var st=this.scrollPos.top;if(st){var d=this.portal.body.dom;setTimeout(function(){d.scrollTop=st},10)}}delete this.lastPos},getGrid:function(){var box=this.portal.bwrap.getBox();box.columnX=[];this.portal.items.each(function(c){box.columnX.push({x:c.el.getX(),w:c.el.getWidth()})});return box},unreg:function(){Ext.ux.Portal.DropZone.superclass.unreg.call(this)}});Ext.ux.PortalColumn=Ext.extend(Ext.Container,{layout:'anchor',defaultType:'portlet',cls:'x-portal-column'});Ext.reg('portalcolumn',Ext.ux.PortalColumn);Ext.ux.Portlet=Ext.extend(Ext.Panel,{anchor:'100%',frame:true,collapsible:true,draggable:true,cls:'x-portlet'});Ext.reg('portlet',Ext.ux.Portlet);Ext.ns('Ext.ux.tree');Ext.ux.tree.ColumnTree=Ext.extend(Ext.tree.TreePanel,{lines:false,borderWidth:Ext.isBorderBox?0:2,cls:'x-column-tree',onRender:function(){Ext.tree.ColumnTree.superclass.onRender.apply(this,arguments);this.headers=this.header.createChild({cls:'x-tree-headers'});var cols=this.columns,c;var totalWidth=0;var scrollOffset=19;for(var i=0,len=cols.length;i<len;i++){c=cols[i];totalWidth+=c.width;this.headers.createChild({cls:'x-tree-hd '+(c.cls?c.cls+'-hd':''),cn:{cls:'x-tree-hd-text',html:c.header},style:'width:'+(c.width-this.borderWidth)+'px;'})}this.headers.createChild({cls:'x-clear'});this.headers.setWidth(totalWidth+scrollOffset);this.innerCt.setWidth(totalWidth)}});Ext.reg('columntree',Ext.ux.tree.ColumnTree);Ext.tree.ColumnTree=Ext.ux.tree.ColumnTree;Ext.ux.tree.ColumnNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{focus:Ext.emptyFn,renderElements:function(n,a,targetNode,bulkRender){this.indentMarkup=n.parentNode?n.parentNode.ui.getChildIndent():'';var t=n.getOwnerTree();var cols=t.columns;var bw=t.borderWidth;var c=cols[0];var buf=['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf ',a.cls,'">','<div class="x-tree-col" style="width:',c.width-bw,'px;">','<span class="x-tree-node-indent">',this.indentMarkup,"</span>",'<img src="',this.emptyIcon,'" class="x-tree-ec-icon x-tree-elbow">','<img src="',a.icon||this.emptyIcon,'" class="x-tree-node-icon',(a.icon?" x-tree-node-inline-icon":""),(a.iconCls?" "+a.iconCls:""),'" unselectable="on">','<a hidefocus="on" class="x-tree-node-anchor" href="',a.href?a.href:"#",'" tabIndex="1" ',a.hrefTarget?' target="'+a.hrefTarget+'"':"",'>','<span unselectable="on">',n.text||(c.renderer?c.renderer(a[c.dataIndex],n,a):a[c.dataIndex]),"</span></a>","</div>"];for(var i=1,len=cols.length;i<len;i++){c=cols[i];buf.push('<div class="x-tree-col ',(c.cls?c.cls:''),'" style="width:',c.width-bw,'px;">','<div class="x-tree-col-text">',(c.renderer?c.renderer(a[c.dataIndex],n,a):a[c.dataIndex]),"</div>","</div>")}buf.push('<div class="x-clear"></div></div>','<ul class="x-tree-node-ct" style="display:none;"></ul>',"</li>");if(bulkRender!==true&&n.nextSibling&&n.nextSibling.ui.getEl()){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",n.nextSibling.ui.getEl(),buf.join(""))}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",targetNode,buf.join(""))}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var cs=this.elNode.firstChild.childNodes;this.indentNode=cs[0];this.ecNode=cs[1];this.iconNode=cs[2];this.anchor=cs[3];this.textNode=cs[3].firstChild}});Ext.tree.ColumnNodeUI=Ext.ux.tree.ColumnNodeUI;Ext.ux.Printer=function(){return{renderers:{},registerRenderer:function(xtype,renderer){this.renderers[xtype]=new(renderer)()},getRenderer:function(xtype){return this.renderers[xtype]},print:function(component){var xtypes=component.getXTypes().split('/');for(var i=xtypes.length-1;i>=0;i--){var xtype=xtypes[i],renderer=this.getRenderer(xtype);if(renderer!=undefined){renderer.print(component);break}}}}}();Ext.override(Ext.Component,{getXTypes:function(){var tc=this.constructor;if(!tc.xtypes){var c=[],sc=this;while(sc){var xtype=sc.constructor.xtype;if(xtype!=undefined)c.unshift(xtype);sc=sc.constructor.superclass}tc.xtypeChain=c;tc.xtypes=c.join('/')}return tc.xtypes}});Ext.ux.Printer.BaseRenderer=Ext.extend(Object,{print:function(component){var name=component&&component.getXType?String.format("print_{0}_{1}",component.getXType(),component.id):"print";var iframe;if(!document.getElementById('print_view')){var win=document.createElement('iframe');win.id='print_view';win.style.position='absolute';win.style.top='-500px';iframe=document.body.appendChild(win)}else{iframe=document.getElementById('print_view')}if(iframe.contentDocument)doc=iframe.contentDocument;else if(iframe.contentWindow)doc=iframe.contentWindow.document;else if(iframe.document)doc=iframe.document;doc.open();doc.write(this.generateHTML(component));doc.close()},generateHTML:function(component){return new Ext.XTemplate('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">','<html>','<head>','<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />','<link href="'+this.stylesheetPath+'" rel="stylesheet" type="text/css" media="screen,print" />','<title>'+this.getTitle(component)+'</title>','</head>','<body onload="this.focus(); this.print();">',this.generateBody(component),'</body>','</html>').apply(this.prepareData(component))},generateBody:Ext.emptyFn,prepareData:function(component){return component},getTitle:function(component){return typeof component.getTitle=='function'?component.getTitle():(component.title||"Printing")},stylesheetPath:'css/print.css'});Ext.ux.Printer.GridPanelRenderer=Ext.extend(Ext.ux.Printer.BaseRenderer,{generateBody:function(grid){var columns=this.getColumns(grid);var headings=this.headerTpl.apply(columns);var body=this.bodyTpl.apply(columns);return String.format('<table>{0}<tpl for=".">{1}</tpl></table>',headings,body)},prepareData:function(grid){var columns=this.getColumns(grid);var data=[];grid.store.data.each(function(item){var convertedData={};Ext.iterate(item.data,function(key,value){Ext.each(columns,function(column){if(column.dataIndex==key){convertedData[key]=column.renderer?column.renderer(value,null,item):value;return false}},this)});data.push(convertedData)});return data},getColumns:function(grid){var columns=[];Ext.each(grid.getColumnModel().config,function(col){if(col.hidden!=true)columns.push(col)},this);return columns},headerTpl:new Ext.XTemplate('<tr>','<tpl for=".">','<th>{header}</th>','</tpl>','</tr>'),bodyTpl:new Ext.XTemplate('<tr>','<tpl for=".">','<td>\{{dataIndex}\}</td>','</tpl>','</tr>')});Ext.ux.Printer.registerRenderer('grid',Ext.ux.Printer.GridPanelRenderer);