Ext.namespace("App");App.version="0.4.0";App.encodeField=function(table,field){vart,f;t=table[0].toUpperCase()+table.slice(1,table.length);f=field[0].toUpperCase()+field.slice(1,field.length);returnt+f};App.getDirectStore=function(storeId){varcfg,store,table;store=Ext.StoreMgr.lookup(storeId);if(!store&&!Ext.isString(storeId)){thrownewError('Fail to instanciate the store: "'+storeId+'"')}if(!store&&Ext.isString(storeId)){table=storeId.slice(0,storeId.search("Store"));cfg=App.storeCfgs[table];store=newApp.data.DirectStore(cfg)}returnstore};App.getTableName=function(store){returnstore.baseParams.tableName};App.isPlugin=function(component,ptype){vari,plugin;if(!component.hasOwnProperty("plugins")){returnfalse}for(i=0;i<component.plugins.length;i+=1){plugin=component.plugins[i];if(plugin===ptype){returntrue}if((typeof (plugin)==="object")&&plugin.hasOwnProperty("ptype")&&(plugin.ptype===ptype)){returntrue}}returnfalse};App.loadMathJax=function(callback,scope){if(App.mathJax){Ext.Loader.load([App.mathJax],callback,scope)}else{callback.call(scope)}};Ext.namespace("App");App.ButtonDownload=Ext.extend(Ext.Button,{url:undefined,initComponent:function(){App.ButtonDownload.superclass.initComponent.call(this);this.on("click",this.onDownload,this)},onDownload:function(button,event){try{Ext.destroy(Ext.get("downloadIframe"))}catch(err){}Ext.DomHelper.append(document.body,{tag:"iframe",id:"downloadIframe",frameBorder:0,width:0,height:0,css:"display:none;visibility:hidden;height:0px;",src:this.url})}});Ext.reg("xbuttondownload",App.ButtonDownload);Ext.namespace("App.form");App.form.ComboBox=Ext.extend(Ext.form.ComboBox,{mode:"remote",editable:false,selectOnFocus:true,triggerAction:"all",typeAhead:true,initComponent:function(){if(this.fieldLabel&&!this.emptyText){this.emptyText="Select a "+this.fieldLabel+" ..."}this.store=App.getDirectStore(this.store);App.form.ComboBox.superclass.initComponent.call(this);if(this.store.getCount()===0){this.store.load()}this.store.on("load",function(){this.setValue(this.initialConfig.value)},this)}});Ext.reg("xcombobox",App.form.ComboBox);Ext.namespace("App.form");App.form.FormPanel=Ext.extend(Ext.form.FormPanel,{store:null,autoScroll:true,bodyStyle:"padding:5px 5px 0",buttons:[{text:"Action",ref:"../buttonAction"},{text:"Reset",ref:"../buttonReset"}],defaults:{anchor:"100%"},defaultType:"textfield",frame:true,currentAction:null,currentRecord:null,textCreate:"Create",textDestroy:"Delete",textDuplicate:"Duplicate",textReset:"Reset",textUpdate:"Update",initComponent:function(){functionresetForm(){this.reset()}App.form.FormPanel.superclass.initComponent.call(this);this.buttonAction.on("click",this.doAction,this);this.buttonReset.on("click",resetForm,this.getForm());this.addFieldToolTipsListeners();this.store=App.getDirectStore(this.store);this.store.on("exception",this.onStoreException,this);this.store.on("write",resetForm,this.getForm());this.setAction("create");this.buttonReset.setText(this.textReset)},addFieldToolTipsListeners:function(){varform;functioncreateToolTip(c){newExt.ToolTip({target:c.getEl(),title:c.fieldLabel,anchor:"left",trackMouse:false,html:Ext.util.Format.htmlEncode(c.tipText)})}form=this.getForm();form.items.each(function(field){if(field.tipText){field.on("render",createToolTip)}})},disableFields:function(bool){varform=this.getForm();form.items.each(function(field){field.setDisabled(bool)})},doAction:function(){varform=this.getForm(),newRecord;if(!form.isValid()){return}if(!this.store){thrownewError("the store is undefined !!!")}switch(this.currentAction){case"create":newRecord=newthis.store.recordType();this.updateRecord(newRecord);this.store.add(newRecord);break;case"destroy":this.store.remove(this.currentRecord);break;case"duplicate":newRecord=newthis.store.recordType();this.updateRecord(newRecord);this.store.add(newRecord);break;case"update":this.currentRecord.beginEdit();this.updateRecord(this.currentRecord);this.currentRecord.endEdit();break}if(this.store.autoSave===false){this.store.save()}},hardReset:function(){varform=this.getForm();form.items.each(function(field){field.originalValue=field.initialConfig.value});form.reset()},onStoreException:function(proxy,type,action,options,response,arg){varfield,fieldName,form=this.getForm(),record;for(fieldNameinresponse.errors){if(response.errors.hasOwnProperty(fieldName)){field=form.findField(fieldName);field.markInvalid(response.errors[fieldName])}}record=arg[0];this.store.remove(record)},setAction:function(action,record){varform=this.getForm(),table,tableId;this.buttonReset.show();this.buttonAction.show();this.disableFields(false);this.currentAction=action;this.currentRecord=record;switch(action){case"create":this.hardReset();this.buttonAction.setText(this.textCreate);break;case"destroy":this.buttonAction.setText(this.textDestroy);form.loadRecord(record);break;case"duplicate":this.buttonAction.setText(this.textDuplicate);this.hardReset();table=App.getTableName(this.store);tableId=App.encodeField(table,"id");deleterecord.data[tableId];form.loadRecord(record);break;case"update":this.buttonAction.setText(this.textUpdate);form.loadRecord(record);break;case"view":this.buttonReset.hide();this.buttonAction.hide();form.loadRecord(record);this.disableFields(true);break}},updateRecord:function(record){varcombo,combos,i,item,rec,values;values=this.getForm().getValues();for(iteminvalues){if(values.hasOwnProperty(item)){record.set(item,values[item])}}combos=this.findByType("xcombobox");for(i=0;i<combos.length;i+=1){combo=combos[i];rec=combo.findRecord(combo.valueField,combo.getValue());record.set(combo.displayField,rec.get(combo.displayField))}}});Ext.reg("xform",App.form.FormPanel);Ext.namespace("App.grid");App.grid.Grid=Ext.extend(Ext.grid.GridPanel,{rowEditor:null,initComponent:function(){this.store=App.getDirectStore(this.store);this.bbar=newExt.PagingToolbar();this.bbar.hide();App.grid.Grid.superclass.initComponent.call(this);if(!this.store.getTotalCount()){if(App.isPlugin(this,"pGridPaging")){this.store.load({params:{start:0,limit:10}})}else{this.store.load()}}}});Ext.reg("xgrid",App.grid.Grid);Ext.namespace("App.grid");App.grid.GridFilter=Ext.extend(Ext.form.FieldSet,{filterConditions:{},initialFilterConditions:[],pagingToolbar:null,store:null,defaults:{anchor:"100%",enableKeyEvents:true},initComponent:function(){varfield,fields,i;App.grid.GridFilter.superclass.initComponent.call(this);fields=this.findByType("field");for(i=0;i<fields.length;i+=1){field=fields[i];if(field.xtype==="xcombobox"){field.on("select",this.onChange,this)}else{field.on("keyup",this.onChange,this,{buffer:500})}}},bind:function(grid){varbaseParams,i;this.store=grid.getStore();if(grid.pagingInitialized){this.pagingToolbar=grid.getBottomToolbar()}baseParams=this.store.baseParams;for(i=0;i<baseParams.where.length;i+=1){this.initialFilterConditions.push(baseParams.where[i])}},onChange:function(field){this.setupCondition(field)},onReset:function(){varfields,i;fields=this.findByType("field");for(i=0;i<fields.length;i+=1){fields[i].reset()}this.filterConditions={};this.store.baseParams.where=this.initialFilterConditions;this.updateStore()},setupCondition:function(field){varconditions=[],i,k,value,where;value=field.getValue();where=field.name+""+field.filterOperator+" '"+value+"'";if(value===""){deletethis.filterConditions[field.name]}else{this.filterConditions[field.name]=where}for(i=0;i<this.initialFilterConditions.length;i+=1){conditions.push(this.initialFilterConditions[i])}for(kinthis.filterConditions){if(this.filterConditions.hasOwnProperty(k)){conditions.push(this.filterConditions[k])}}this.store.baseParams.where=conditions;this.updateStore()},updateStore:function(){if(this.pagingToolbar){this.pagingToolbar.doRefresh()}else{this.store.load()}}});Ext.reg("xgridfilter",App.grid.GridFilter);Ext.namespace("App.grid");App.grid.MathJax=Ext.extend(Object,{init:function(grid){functionprocessMath(){MathJax.Hub.PreProcess();MathJax.Hub.Process()}grid.getView().on("refresh",processMath,grid,{delay:100})}});Ext.preg("pGridMathJax",App.grid.MathJax);Ext.namespace("App.grid");App.grid.Paging=Ext.extend(Object,{ptype:"pGridPaging",textExport:"Export",textSlider:"Rows per page",init:function(grid){varbbar;bbar=grid.getBottomToolbar();bbar.bindStore(grid.store);bbar.add("-",this.textSlider,{xtype:"slider",plugins:newExt.slider.Tip(),listeners:{changecomplete:this.onChangePageSize,scope:bbar},minValue:1,width:100},"->",{xtype:"xbuttondownload",text:this.textExport,url:App.csvUrl+"?tableName="+App.getTableName(grid.store)});bbar.show();if(grid.store.getTotalCount()>0){this.onInit.call(grid,grid.store)}else{grid.store.on("load",this.onInit,grid,{single:true})}grid.store.on("write",this.onWrite,grid)},onChangePageSize:function(slider,newValue,thumb){varbbar=this;bbar.pageSize=newValue;bbar.moveFirst()},onInit:function(store,records,options){varbbar,grid=this,nRows=store.getCount(),slider;bbar=grid.getBottomToolbar();bbar.pageSize=nRows;slider=bbar.findByType("slider")[0];slider.setMaxValue(store.getTotalCount());slider.setValue(nRows)},onWrite:function(){varbbar,grid=this,slider;bbar=grid.getBottomToolbar();slider=bbar.findByType("slider")[0];slider.setMaxValue(grid.store.getTotalCount());slider.setValue(grid.store.getCount())}});Ext.preg("pGridPaging",App.grid.Paging);Ext.namespace("App.grid");App.grid.RowEditor=Ext.extend(Ext.Window,{ptype:"pGridRowEditor",formPanel:null,grid:null,addTitle:"Create a new record...",deleteTitle:"Delete the record...",duplicateTitle:"Duplicate the record...",editTitle:"Update the record...",viewTitle:"View the record...",textMsg:"Select a row please",autoScroll:true,closeAction:"hide",constrainHeader:true,defaults:{autoScroll:true},modal:true,plain:true,init:function(grid){vartable;this.grid=grid;this.grid.rowEditor=this;this.grid.selModel=newExt.grid.RowSelectionModel({singleSelect:true});this.grid.store.on("write",this.onWrite,this);table=App.getTableName(this.grid.store);Dbui.getForm(table,this.addFormPanel,this)},addFormPanel:function(provider,response){varformCfg=response.result;this.formPanel=newApp.form.FormPanel(formCfg);this.add(this.formPanel);this.grid.store.on("exception",this.formPanel.onStoreException,this.formPanel)},getSelected:function(){varrecord=this.grid.getSelectionModel().getSelected();if(!record){Ext.MessageBox.alert("Warning",this.textMsg);returnfalse}returnrecord},onAddRow:function(){this.formPanel.setAction("create");this.setTitle(this.addTitle);this.show()},onDeleteRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("destroy",record);this.setTitle(this.deleteTitle);this.formPanel.doAction()},onDuplicateRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("duplicate",record);this.setTitle(this.duplicateTitle);this.show()},onEditRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("update",record);this.setTitle(this.editTitle);this.show()},onViewRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("view",record);this.setTitle(this.viewTitle);this.show()},onWrite:function(store,action,result,transaction,record){this.hide()}});Ext.preg("pGridRowEditor",App.grid.RowEditor);Ext.namespace("App.grid");App.grid.RowEditorContextMenu=Ext.extend(Object,{ptype:"pGridRowEditorContextMenu",textAdd:"Add",textCreate:"Create",textDestroy:"Delete",textDuplicate:"Duplicate",textUpdate:"Update",textView:"View",init:function(grid){varmenu=newExt.menu.Menu();if(!grid.rowEditor){thrownewError("no grid row editor !!!")}grid.addListener("containercontextmenu",this.onContainerContextMenu,menu);grid.addListener("headercontextmenu",this.onHeaderContextMenu,menu);grid.addListener("rowcontextmenu",this.onRowContextMenu,menu);menu.add({text:this.textAdd,iconCls:"silk-add",handler:grid.rowEditor.onAddRow,scope:grid.rowEditor},"-",{text:this.textDestroy,iconCls:"silk-delete",handler:grid.rowEditor.onDeleteRow,scope:grid.rowEditor},"-",{text:this.textDuplicate,iconCls:"silk-clone",handler:grid.rowEditor.onDuplicateRow,scope:grid.rowEditor},{text:this.textUpdate,iconCls:"silk-update",handler:grid.rowEditor.onEditRow,scope:grid.rowEditor},"-",{text:this.textView,iconCls:"silk-view",handler:grid.rowEditor.onViewRow,scope:grid.rowEditor})},onContainerContextMenu:function(grid,event){varmenu=this;event.stopEvent();menu.showAt(event.getXY())},onHeaderContextMenu:function(grid,columIndex,event){event.stopEvent()},onRowContextMenu:function(grid,rowIndex,event){varmenu=this;event.stopEvent();grid.selModel.selectRow(rowIndex);menu.showAt(event.getXY())}});Ext.preg("pGridRowEditorContextMenu",App.grid.RowEditorContextMenu);Ext.namespace("App.grid");App.grid.RowEditorToolbar=Ext.extend(Object,{ptype:"pGridRowEditorToolbar",init:function(grid){vartoolbar;if(!grid.rowEditor){thrownewError("no grid row editor !!!")}toolbar=grid.getTopToolbar();toolbar.add([{text:"Add",iconCls:"silk-add",handler:grid.rowEditor.onAddRow,scope:grid.rowEditor},"",{text:"Delete",iconCls:"silk-delete",handler:grid.rowEditor.onDeleteRow,scope:grid.rowEditor},"",{text:"Duplicate",iconCls:"silk-clone",handler:grid.rowEditor.onDuplicateRow,scope:grid.rowEditor},"",{text:"Update",iconCls:"silk-update",handler:grid.rowEditor.onEditRow,scope:grid.rowEditor},"",{text:"View",iconCls:"silk-view",handler:grid.rowEditor.onViewRow,scope:grid.rowEditor},"-"])}});Ext.preg("pGridRowEditorToolbar",App.grid.RowEditorToolbar);Ext.namespace("App.data");App.data.DirectStore=Ext.extend(Ext.data.DirectStore,{autoLoad:true,autoSave:true,constructor:function(config){varcfg,cfgWrt;cfg=Ext.apply({},{encode:false,listful:true,writeAllFields:false},config);cfg=Ext.apply(cfg,{api:{create:Dbui.create,destroy:Dbui.destroy,read:Dbui.read,update:Dbui.update}});if(!Ext.isDefined(cfg.writer)){cfgWrt=Ext.copyTo({},cfg,"encode, listful, writeAllFields");cfg.writer=newExt.data.JsonWriter(cfgWrt)}App.data.DirectStore.superclass.constructor.call(this,cfg);this.on("write",this.onWrite)},onWrite:function(store,action){switch(action){case"create":store.totalLength+=1;break;case"destroy":store.totalLength-=1;break}}});Ext.reg("xdirectstore",App.data.DirectStore);Ext.namespace("App");App.Mgr=Ext.extend(Object,{constructor:function(config){Ext.apply(this,config);App.Mgr.superclass.constructor.apply(this);App.loadMathJax(this.configure,this)},configure:function(){Dbui.getViewport(this.launch,this)},launch:function(provider,response){varcfg,vpCfg,treeNode,viewport;treeNode=newExt.tree.TreeNode({id:App.name,text:App.name});vpCfg={layout:"border",title:"Ext Layout Browser",items:[{region:"west",title:App.name,width:200,collapsible:true,autoScroll:true,split:true,xtype:"treepanel",rootVisible:false,root:treeNode,ref:"treePanel"},{region:"center",xtype:"tabpanel",ref:"tabPanel",autoScroll:true,defaults:{layout:"fit"}}]};cfg=response.result;vpCfg=Ext.apply(vpCfg,cfg);viewport=newExt.Viewport(vpCfg);viewport.treePanel.on("contextmenu",function(n,e){e.stopEvent()})}});Ext.namespace("App.panel");App.panel.MathJax=Ext.extend(Object,{init:function(panel){panel.on("render",this.onPanelRender,this,{single:true})},onPanelRender:function(panel){varupdater=panel.body.getUpdater();updater.on("update",this.onProcess)},onProcess:function(e,o){MathJax.Hub.PreProcess();MathJax.Hub.Process()}});Ext.preg("pPanelMathJax",App.panel.MathJax);Ext.namespace("App.form");App.form.SetBox=Ext.extend(Ext.form.ComboBox,{model:null,editable:false,emptyText:"Select...",selectOnFocus:true,triggerAction:"all",typeAhead:true,initComponent:function(){vari,li=[];if(!this.model){thrownewError("the property model is missing !!!")}li=[];for(i=0;i<this.model.setData.length;i+=1){li.push([this.model.setData[i]])}this.store=newExt.data.ArrayStore({fields:[this.model.name],data:li});this.displayField=this.model.name;this.mode="local";App.form.SetBox.superclass.initComponent.call(this)}});Ext.reg("xsetbox",App.form.SetBox);Ext.namespace("App.viewport");App.viewport.InTreePanelBase=Ext.extend(Object,{topNodeName:null,nodesId:null,nodesText:null,tabTitlePrefix:"",viewport:null,constructor:function(config){Ext.apply(this,config);App.viewport.InTreePanelBase.superclass.constructor.apply(this)},init:function(viewport){vari,child,node,root;this.viewport=viewport;node=newExt.tree.TreeNode({id:"/"+App.name+"/"+this.topNodeName,text:this.topNodeName});root=viewport.treePanel.getRootNode();root.appendChild(node);if(!this.nodesText){this.nodesText=this.nodesId}for(i=0;i<this.nodesId.length;i+=1){child=newExt.tree.TreeNode({id:"/"+App.name+"/"+this.topNodeName+"/"+this.nodesId[i],text:this.nodesText[i],leaf:true});node.appendChild(child);child.on("click",this.onCreateTab,this)}viewport.tabPanel.on("beforeadd",this.addWdg,this)},addWdg:function(container,component,index){},getNodeNameFromId:function(id){varli=id.split("/").reverse();returnli[0]},getTopNodeNameFromId:function(id){varli=id.split("/").reverse();returnli[1]},onCreateTab:function(node){varnodeName,pan,tab,tabId;tabId=node.id;if(this.viewport.tabPanel.getItem(tabId)){this.viewport.tabPanel.setActiveTab(tabId);return}nodeName=this.getNodeNameFromId(tabId);pan=newExt.Panel({id:tabId,closable:true,title:this.tabTitlePrefix+""+nodeName});tab=this.viewport.tabPanel.add(pan);this.viewport.tabPanel.setActiveTab(tab.id)}});Ext.preg("pInTreeBase",App.viewport.InTreePanelBase);Ext.namespace("App.viewport");App.viewport.InTreePanelForm=Ext.extend(App.viewport.InTreePanelBase,{addWdg:function(container,component,index){varcfg,table,wdg;if(this.getTopNodeNameFromId(component.id)!==this.topNodeName){return}table=this.getNodeNameFromId(component.id);Dbui.getForm(table,function(provider,response){cfg=response.result;wdg=Ext.ComponentMgr.create(cfg);component.add(wdg);component.doLayout()},this)}});Ext.preg("pInTreeForm",App.viewport.InTreePanelForm);Ext.namespace("App.viewport");App.viewport.InTreePanelGrid=Ext.extend(App.viewport.InTreePanelBase,{textReset:"Reset",addWdg:function(container,component,index){varcfg,grid,gridfilter,table,wdg;functioncreateGrid(provider,response){cfg=response.result;wdg=Ext.ComponentMgr.create(cfg);if(cfg.hasOwnProperty("filterModel")){grid=wdg;gridfilter=Ext.ComponentMgr.create(cfg.filterModel);gridfilter.bind(grid);wdg=newExt.Panel({layout:"border",border:false,items:[{region:"center",layout:"fit",items:[grid]},{region:"east",layout:"form",collapsible:true,collapsed:true,defaults:{anchor:"100%"},frame:true,items:[gridfilter],width:300,split:true,buttons:[{text:this.textReset,ref:"../../resetButton"}]}]});wdg.resetButton.on("click",gridfilter.onReset,gridfilter)}component.add(wdg);component.doLayout()}if(this.getTopNodeNameFromId(component.id)!==this.topNodeName){return}table=this.getNodeNameFromId(component.id);Dbui.getGrid(table,createGrid,this)}});Ext.preg("pInTreeGrid",App.viewport.InTreePanelGrid);
\ No newline at end of file
Ext.namespace("App");App.version="0.4.1";App.encodeField=function(table,field){vart,f;t=table[0].toUpperCase()+table.slice(1,table.length);f=field[0].toUpperCase()+field.slice(1,field.length);returnt+f};App.getDirectStore=function(storeId){varcfg,store,table;store=Ext.StoreMgr.lookup(storeId);if(!store&&!Ext.isString(storeId)){thrownewError('Fail to instanciate the store: "'+storeId+'"')}if(!store&&Ext.isString(storeId)){table=storeId.slice(0,storeId.search("Store"));cfg=App.storeCfgs[table];store=newApp.data.DirectStore(cfg)}returnstore};App.getTableName=function(store){returnstore.baseParams.tableName};App.isPlugin=function(component,ptype){vari,plugin;if(!component.hasOwnProperty("plugins")){returnfalse}for(i=0;i<component.plugins.length;i+=1){plugin=component.plugins[i];if(plugin===ptype){returntrue}if((typeof (plugin)==="object")&&plugin.hasOwnProperty("ptype")&&(plugin.ptype===ptype)){returntrue}}returnfalse};Ext.namespace("App");App.ButtonDownload=Ext.extend(Ext.Button,{url:undefined,initComponent:function(){App.ButtonDownload.superclass.initComponent.call(this);this.on("click",this.onDownload,this)},onDownload:function(button,event){try{Ext.destroy(Ext.get("downloadIframe"))}catch(err){}Ext.DomHelper.append(document.body,{tag:"iframe",id:"downloadIframe",frameBorder:0,width:0,height:0,css:"display:none;visibility:hidden;height:0px;",src:this.url})}});Ext.reg("xbuttondownload",App.ButtonDownload);Ext.namespace("App.form");App.form.ComboBox=Ext.extend(Ext.form.ComboBox,{mode:"remote",editable:false,selectOnFocus:true,triggerAction:"all",typeAhead:true,initComponent:function(){if(this.fieldLabel&&!this.emptyText){this.emptyText="Select a "+this.fieldLabel+" ..."}this.store=App.getDirectStore(this.store);App.form.ComboBox.superclass.initComponent.call(this);if(this.store.getCount()===0){this.store.load()}this.store.on("load",function(){this.setValue(this.initialConfig.value)},this)}});Ext.reg("xcombobox",App.form.ComboBox);Ext.namespace("App.form");App.form.FormPanel=Ext.extend(Ext.form.FormPanel,{store:null,autoScroll:true,bodyStyle:"padding:5px 5px 0",buttons:[{text:"Action",ref:"../buttonAction"},{text:"Reset",ref:"../buttonReset"}],defaults:{anchor:"100%"},defaultType:"textfield",frame:true,currentAction:null,currentRecord:null,textCreate:"Create",textDestroy:"Delete",textDuplicate:"Duplicate",textReset:"Reset",textUpdate:"Update",initComponent:function(){functionresetForm(){this.reset()}App.form.FormPanel.superclass.initComponent.call(this);this.buttonAction.on("click",this.doAction,this);this.buttonReset.on("click",resetForm,this.getForm());this.addFieldToolTipsListeners();this.store=App.getDirectStore(this.store);this.store.on("exception",this.onStoreException,this);this.store.on("write",resetForm,this.getForm());this.setAction("create");this.buttonReset.setText(this.textReset)},addFieldToolTipsListeners:function(){varform;functioncreateToolTip(c){newExt.ToolTip({target:c.getEl(),title:c.fieldLabel,anchor:"left",trackMouse:false,html:Ext.util.Format.htmlEncode(c.tipText)})}form=this.getForm();form.items.each(function(field){if(field.tipText){field.on("render",createToolTip)}})},disableFields:function(bool){varform=this.getForm();form.items.each(function(field){field.setDisabled(bool)})},doAction:function(){varform=this.getForm(),newRecord;if(!form.isValid()){return}if(!this.store){thrownewError("the store is undefined !!!")}switch(this.currentAction){case"create":newRecord=newthis.store.recordType();this.updateRecord(newRecord);this.store.add(newRecord);break;case"destroy":this.store.remove(this.currentRecord);break;case"duplicate":newRecord=newthis.store.recordType();this.updateRecord(newRecord);this.store.add(newRecord);break;case"update":this.currentRecord.beginEdit();this.updateRecord(this.currentRecord);this.currentRecord.endEdit();break}if(this.store.autoSave===false){this.store.save()}},hardReset:function(){varform=this.getForm();form.items.each(function(field){field.originalValue=Ext.value(field.initialConfig.value,"");field.setValue(field.originalValue)})},onStoreException:function(proxy,type,action,options,response,arg){varfield,fieldName,form=this.getForm(),record;for(fieldNameinresponse.errors){if(response.errors.hasOwnProperty(fieldName)){field=form.findField(fieldName);field.markInvalid(response.errors[fieldName])}}record=arg[0];this.store.remove(record)},setAction:function(action,record){varform=this.getForm(),table,tableId;this.buttonReset.show();this.buttonAction.show();this.disableFields(false);this.currentAction=action;this.currentRecord=record;switch(action){case"create":this.hardReset();this.buttonAction.setText(this.textCreate);break;case"destroy":this.buttonAction.setText(this.textDestroy);form.loadRecord(record);break;case"duplicate":this.buttonAction.setText(this.textDuplicate);this.hardReset();table=App.getTableName(this.store);tableId=App.encodeField(table,"id");deleterecord.data[tableId];form.loadRecord(record);break;case"update":this.buttonAction.setText(this.textUpdate);form.loadRecord(record);break;case"view":this.buttonReset.hide();this.buttonAction.hide();form.loadRecord(record);this.disableFields(true);break}},updateRecord:function(record){varcombo,combos,i,item,rec,values;values=this.getForm().getFieldValues();for(iteminvalues){if(values.hasOwnProperty(item)){record.set(item,values[item])}}combos=this.findByType("xcombobox");for(i=0;i<combos.length;i+=1){combo=combos[i];rec=combo.findRecord(combo.valueField,combo.getValue());record.set(combo.displayField,rec.get(combo.displayField))}}});Ext.reg("xform",App.form.FormPanel);Ext.namespace("App.grid");App.grid.Grid=Ext.extend(Ext.grid.GridPanel,{rowEditor:null,initComponent:function(){this.store=App.getDirectStore(this.store);this.bbar=newExt.PagingToolbar();this.bbar.hide();App.grid.Grid.superclass.initComponent.call(this);if(!this.store.getTotalCount()){if(App.isPlugin(this,"pGridPaging")){this.store.load({params:{start:0,limit:10}})}else{this.store.load()}}}});Ext.reg("xgrid",App.grid.Grid);Ext.namespace("App.grid");App.grid.GridFilter=Ext.extend(Ext.form.FieldSet,{filterConditions:{},initialFilterConditions:[],pagingToolbar:null,store:null,defaults:{anchor:"100%",enableKeyEvents:true},initComponent:function(){varfield,fields,i;App.grid.GridFilter.superclass.initComponent.call(this);fields=this.findByType("field");for(i=0;i<fields.length;i+=1){field=fields[i];if(field.xtype==="xcombobox"){field.on("select",this.onChange,this)}else{field.on("keyup",this.onChange,this,{buffer:500})}}},bind:function(grid){varbaseParams,i;this.store=grid.getStore();if(grid.pagingInitialized){this.pagingToolbar=grid.getBottomToolbar()}baseParams=this.store.baseParams;for(i=0;i<baseParams.where.length;i+=1){this.initialFilterConditions.push(baseParams.where[i])}},onChange:function(field){this.setupCondition(field)},onReset:function(){varfields,i;fields=this.findByType("field");for(i=0;i<fields.length;i+=1){fields[i].reset()}this.filterConditions={};this.store.baseParams.where=this.initialFilterConditions;this.updateStore()},setupCondition:function(field){varconditions=[],i,k,value,where;value=field.getValue();where=field.name+""+field.filterOperator+" '"+value+"'";if(value===""){deletethis.filterConditions[field.name]}else{this.filterConditions[field.name]=where}for(i=0;i<this.initialFilterConditions.length;i+=1){conditions.push(this.initialFilterConditions[i])}for(kinthis.filterConditions){if(this.filterConditions.hasOwnProperty(k)){conditions.push(this.filterConditions[k])}}this.store.baseParams.where=conditions;this.updateStore()},updateStore:function(){if(this.pagingToolbar){this.pagingToolbar.doRefresh()}else{this.store.load()}}});Ext.reg("xgridfilter",App.grid.GridFilter);Ext.namespace("App.grid");App.grid.MathJax=Ext.extend(Object,{init:function(grid){functionprocessMath(gridView){vardomEl=Ext.getDom(gridView.el);MathJax.Hub.Queue(["Typeset",MathJax.Hub,domEl])}grid.getView().on("refresh",processMath,grid)}});Ext.preg("pGridMathJax",App.grid.MathJax);Ext.namespace("App.grid");App.grid.Paging=Ext.extend(Object,{ptype:"pGridPaging",textExport:"Export",textSlider:"Rows per page",init:function(grid){varbbar;bbar=grid.getBottomToolbar();bbar.bindStore(grid.store);bbar.add("-",this.textSlider,{xtype:"slider",plugins:newExt.slider.Tip(),listeners:{changecomplete:this.onChangePageSize,scope:bbar},minValue:1,width:100},"->",{xtype:"xbuttondownload",text:this.textExport,url:App.csvUrl+"?tableName="+App.getTableName(grid.store)});bbar.show();if(grid.store.getTotalCount()>0){this.onInit.call(grid,grid.store)}else{grid.store.on("load",this.onInit,grid,{single:true})}grid.store.on("write",this.onWrite,grid)},onChangePageSize:function(slider,newValue,thumb){varbbar=this;bbar.pageSize=newValue;bbar.moveFirst()},onInit:function(store,records,options){varbbar,grid=this,nRows=store.getCount(),slider;bbar=grid.getBottomToolbar();bbar.pageSize=nRows;slider=bbar.findByType("slider")[0];slider.setMaxValue(store.getTotalCount());slider.setValue(nRows)},onWrite:function(){varbbar,grid=this,slider;bbar=grid.getBottomToolbar();slider=bbar.findByType("slider")[0];slider.setMaxValue(grid.store.getTotalCount());slider.setValue(grid.store.getCount())}});Ext.preg("pGridPaging",App.grid.Paging);Ext.namespace("App.grid");App.grid.RowEditor=Ext.extend(Ext.Window,{ptype:"pGridRowEditor",formPanel:null,grid:null,addTitle:"Create a new record...",deleteTitle:"Delete the record...",duplicateTitle:"Duplicate the record...",editTitle:"Update the record...",viewTitle:"View the record...",textMsg:"Select a row please",autoScroll:true,closeAction:"hide",constrainHeader:true,defaults:{autoScroll:true},modal:true,plain:true,init:function(grid){vartable;this.grid=grid;this.grid.rowEditor=this;this.grid.selModel=newExt.grid.RowSelectionModel({singleSelect:true});this.grid.store.on("write",this.onWrite,this);table=App.getTableName(this.grid.store);Dbui.getForm(table,this.addFormPanel,this)},addFormPanel:function(provider,response){varformCfg=response.result;this.formPanel=newApp.form.FormPanel(formCfg);this.add(this.formPanel);this.grid.store.on("exception",this.formPanel.onStoreException,this.formPanel)},getSelected:function(){varrecord=this.grid.getSelectionModel().getSelected();if(!record){Ext.MessageBox.alert("Warning",this.textMsg);returnfalse}returnrecord},onAddRow:function(){this.formPanel.setAction("create");this.setTitle(this.addTitle);this.show()},onDeleteRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("destroy",record);this.setTitle(this.deleteTitle);this.formPanel.doAction()},onDuplicateRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("duplicate",record);this.setTitle(this.duplicateTitle);this.show()},onEditRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("update",record);this.setTitle(this.editTitle);this.show()},onViewRow:function(){varrecord=this.getSelected();if(!record){return}this.formPanel.setAction("view",record);this.setTitle(this.viewTitle);this.show()},onWrite:function(store,action,result,transaction,record){this.hide()}});Ext.preg("pGridRowEditor",App.grid.RowEditor);Ext.namespace("App.grid");App.grid.RowEditorContextMenu=Ext.extend(Object,{ptype:"pGridRowEditorContextMenu",textAdd:"Add",textCreate:"Create",textDestroy:"Delete",textDuplicate:"Duplicate",textUpdate:"Update",textView:"View",init:function(grid){varmenu=newExt.menu.Menu();if(!grid.rowEditor){thrownewError("no grid row editor !!!")}grid.addListener("containercontextmenu",this.onContainerContextMenu,menu);grid.addListener("headercontextmenu",this.onHeaderContextMenu,menu);grid.addListener("rowcontextmenu",this.onRowContextMenu,menu);menu.add({text:this.textAdd,iconCls:"silk-add",handler:grid.rowEditor.onAddRow,scope:grid.rowEditor},"-",{text:this.textDestroy,iconCls:"silk-delete",handler:grid.rowEditor.onDeleteRow,scope:grid.rowEditor},"-",{text:this.textDuplicate,iconCls:"silk-clone",handler:grid.rowEditor.onDuplicateRow,scope:grid.rowEditor},{text:this.textUpdate,iconCls:"silk-update",handler:grid.rowEditor.onEditRow,scope:grid.rowEditor},"-",{text:this.textView,iconCls:"silk-view",handler:grid.rowEditor.onViewRow,scope:grid.rowEditor})},onContainerContextMenu:function(grid,event){varmenu=this;event.stopEvent();menu.showAt(event.getXY())},onHeaderContextMenu:function(grid,columIndex,event){event.stopEvent()},onRowContextMenu:function(grid,rowIndex,event){varmenu=this;event.stopEvent();grid.selModel.selectRow(rowIndex);menu.showAt(event.getXY())}});Ext.preg("pGridRowEditorContextMenu",App.grid.RowEditorContextMenu);Ext.namespace("App.grid");App.grid.RowEditorToolbar=Ext.extend(Object,{ptype:"pGridRowEditorToolbar",init:function(grid){vartoolbar;if(!grid.rowEditor){thrownewError("no grid row editor !!!")}toolbar=grid.getTopToolbar();toolbar.add([{text:"Add",iconCls:"silk-add",handler:grid.rowEditor.onAddRow,scope:grid.rowEditor},"",{text:"Delete",iconCls:"silk-delete",handler:grid.rowEditor.onDeleteRow,scope:grid.rowEditor},"",{text:"Duplicate",iconCls:"silk-clone",handler:grid.rowEditor.onDuplicateRow,scope:grid.rowEditor},"",{text:"Update",iconCls:"silk-update",handler:grid.rowEditor.onEditRow,scope:grid.rowEditor},"",{text:"View",iconCls:"silk-view",handler:grid.rowEditor.onViewRow,scope:grid.rowEditor},"-"])}});Ext.preg("pGridRowEditorToolbar",App.grid.RowEditorToolbar);Ext.namespace("App.data");App.data.DirectStore=Ext.extend(Ext.data.DirectStore,{autoLoad:true,autoSave:true,constructor:function(config){varcfg,cfgWrt;cfg=Ext.apply({},{encode:false,listful:true,writeAllFields:false},config);cfg=Ext.apply(cfg,{api:{create:Dbui.create,destroy:Dbui.destroy,read:Dbui.read,update:Dbui.update}});if(!Ext.isDefined(cfg.writer)){cfgWrt=Ext.copyTo({},cfg,"encode, listful, writeAllFields");cfg.writer=newExt.data.JsonWriter(cfgWrt)}App.data.DirectStore.superclass.constructor.call(this,cfg);this.on("write",this.onWrite)},onWrite:function(store,action){switch(action){case"create":store.totalLength+=1;break;case"destroy":store.totalLength-=1;break}}});Ext.reg("xdirectstore",App.data.DirectStore);Ext.namespace("App");App.Mgr=Ext.extend(Object,{constructor:function(config){Ext.apply(this,config);App.Mgr.superclass.constructor.apply(this);Dbui.getViewport(this.launch,this)},launch:function(provider,response){varcfg,vpCfg,treeNode,viewport;treeNode=newExt.tree.TreeNode({id:App.name,text:App.name});vpCfg={layout:"border",title:"Ext Layout Browser",items:[{region:"west",title:App.name,width:200,collapsible:true,autoScroll:true,split:true,xtype:"treepanel",rootVisible:false,root:treeNode,ref:"treePanel"},{region:"center",xtype:"tabpanel",ref:"tabPanel",autoScroll:true,defaults:{layout:"fit"}}]};cfg=response.result;vpCfg=Ext.apply(vpCfg,cfg);viewport=newExt.Viewport(vpCfg);viewport.treePanel.on("contextmenu",function(n,e){e.stopEvent()})}});Ext.namespace("App.panel");App.panel.MathJax=Ext.extend(Object,{init:function(panel){panel.on("render",this.onPanelRender,this,{single:true})},onPanelRender:function(panel){varupdater=panel.body.getUpdater();updater.on("update",this.onProcess)},onProcess:function(e,o){MathJax.Hub.PreProcess();MathJax.Hub.Process()}});Ext.preg("pPanelMathJax",App.panel.MathJax);Ext.namespace("App.form");App.form.SetBox=Ext.extend(Ext.form.ComboBox,{model:null,editable:false,emptyText:"Select...",selectOnFocus:true,triggerAction:"all",typeAhead:true,initComponent:function(){vari,li=[];if(!this.model){thrownewError("the property model is missing !!!")}li=[];for(i=0;i<this.model.setData.length;i+=1){li.push([this.model.setData[i]])}this.store=newExt.data.ArrayStore({fields:[this.model.name],data:li});this.displayField=this.model.name;this.mode="local";App.form.SetBox.superclass.initComponent.call(this)}});Ext.reg("xsetbox",App.form.SetBox);Ext.namespace("App.viewport");App.viewport.InTreePanelBase=Ext.extend(Object,{topNodeName:null,nodesId:null,nodesText:null,tabTitlePrefix:"",viewport:null,constructor:function(config){Ext.apply(this,config);App.viewport.InTreePanelBase.superclass.constructor.apply(this)},init:function(viewport){vari,child,node,root;this.viewport=viewport;node=newExt.tree.TreeNode({id:"/"+App.name+"/"+this.topNodeName,text:this.topNodeName});root=viewport.treePanel.getRootNode();root.appendChild(node);if(!this.nodesText){this.nodesText=this.nodesId}for(i=0;i<this.nodesId.length;i+=1){child=newExt.tree.TreeNode({id:"/"+App.name+"/"+this.topNodeName+"/"+this.nodesId[i],text:this.nodesText[i],leaf:true});node.appendChild(child);child.on("click",this.onCreateTab,this)}viewport.tabPanel.on("beforeadd",this.addWdg,this)},addWdg:function(container,component,index){},getNodeNameFromId:function(id){varli=id.split("/").reverse();returnli[0]},getTopNodeNameFromId:function(id){varli=id.split("/").reverse();returnli[1]},onCreateTab:function(node){varnodeName,pan,tab,tabId;tabId=node.id;if(this.viewport.tabPanel.getItem(tabId)){this.viewport.tabPanel.setActiveTab(tabId);return}nodeName=this.getNodeNameFromId(tabId);pan=newExt.Panel({id:tabId,closable:true,title:this.tabTitlePrefix+""+nodeName});tab=this.viewport.tabPanel.add(pan);this.viewport.tabPanel.setActiveTab(tab.id)}});Ext.preg("pInTreeBase",App.viewport.InTreePanelBase);Ext.namespace("App.viewport");App.viewport.InTreePanelForm=Ext.extend(App.viewport.InTreePanelBase,{addWdg:function(container,component,index){varcfg,table,wdg;if(this.getTopNodeNameFromId(component.id)!==this.topNodeName){return}table=this.getNodeNameFromId(component.id);Dbui.getForm(table,function(provider,response){cfg=response.result;wdg=Ext.ComponentMgr.create(cfg);component.add(wdg);component.doLayout()},this)}});Ext.preg("pInTreeForm",App.viewport.InTreePanelForm);Ext.namespace("App.viewport");App.viewport.InTreePanelGrid=Ext.extend(App.viewport.InTreePanelBase,{textReset:"Reset",addWdg:function(container,component,index){varcfg,grid,gridfilter,table,wdg;functioncreateGrid(provider,response){cfg=response.result;wdg=Ext.ComponentMgr.create(cfg);if(cfg.hasOwnProperty("filterModel")){grid=wdg;gridfilter=Ext.ComponentMgr.create(cfg.filterModel);gridfilter.bind(grid);wdg=newExt.Panel({layout:"border",border:false,items:[{region:"center",layout:"fit",items:[grid]},{region:"east",layout:"form",collapsible:true,collapsed:true,defaults:{anchor:"100%"},frame:true,items:[gridfilter],width:300,split:true,buttons:[{text:this.textReset,ref:"../../resetButton"}]}]});wdg.resetButton.on("click",gridfilter.onReset,gridfilter)}component.add(wdg);component.doLayout()}if(this.getTopNodeNameFromId(component.id)!==this.topNodeName){return}table=this.getNodeNameFromId(component.id);Dbui.getGrid(table,createGrid,this)}});Ext.preg("pInTreeGrid",App.viewport.InTreePanelGrid);