Ext.namespace('dbrui');dbrui.Util=function(){return{loadFile:function(file,success,error,scope){Ext.Ajax.request({url:file,method:'GET',success:function(response,options){var head=document.getElementsByTagName("head")[0];var url=options.url;if(url.indexOf('.js')===url.length-3){var js=document.createElement('script');js.setAttribute("type","text/javascript");js.text=response.responseText;if(!document.all){js.innerHTML=response.responseText;}
head.appendChild(js);}
else if(url.indexOf('.css')===url.length-4){Ext.util.CSS.createStyleSheet(response.responseText);}
if(success){success.defer(50,scope||window,[response,options]);}},failure:function(response,options){if(error){error.call(scope||window);}},disableCaching:false});},randomColor:function(){return'#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6);}}}();Ext.namespace('dbrui');dbrui.ConnectionWindow=Ext.extend(Ext.Window,{layout:'anchor',title:'Database Connection Information',width:400,height:350,modal:true,defaults:{border:false},autoConnect:false,initComponent:function(){var _idpfx=Ext.id();var defaultConn=this.defaultConnection||{};this.items=[{xtype:'panel',anchor:'100%',layout:'column',items:[{columnWidth:0.75,layout:'form',border:false,labelAlign:'top',items:{xtype:'textfield',anchor:'98%',fieldLabel:'Server',id:'sql_server'+_idpfx,allowBlank:false,selectOnFocus:true,enableKeyEvents:true,value:defaultConn.sql_server||'',listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.onTestAndSave();}},scope:this},'change':{fn:function(fld,nv){if(nv!==''){this.refreshDatabaseList();}},scope:this}}}},{columnWidth:0.25,layout:'form',border:false,labelAlign:'top',items:{xtype:'textfield',anchor:'98%',fieldLabel:'Port',id:'sql_port'+_idpfx,value:defaultConn.sql_port||'',enableKeyEvents:true,listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.onTestAndSave();}},scope:this}}}}]},{xtype:'panel',anchor:'100% 100%',layout:'column',items:[{columnWidth:1,layout:'form',border:false,items:[{xtype:'textfield',anchor:'98%',fieldLabel:'User',id:'sql_user'+_idpfx,allowBlank:false,selectOnFocus:true,value:defaultConn.sql_user||'',enableKeyEvents:true,listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.onTestAndSave();}},scope:this}}},{xtype:'textfield',anchor:'98%',inputType:'password',fieldLabel:'Password',selectOnFocus:true,id:'sql_password'+_idpfx,value:defaultConn.sql_password||'',enableKeyEvents:true,listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.onTestAndSave();}},scope:this}}},{xtype:'combo',anchor:'98%',fieldLabel:'Database',id:'sql_database'+_idpfx,allowBlank:true,selectOnFocus:true,typeAhead:true,triggerAction:'all',lazyRender:true,mode:'local',store:new Ext.data.ArrayStore({fields:['name']}),valueField:'name',displayField:'name',value:defaultConn.sql_database||'',enableKeyEvents:true,listeners:{'focus':{fn:function(fld){this.refreshDatabaseList();},scope:this}}},{xtype:'textfield',anchor:'98%',fieldLabel:'Connection Name',selectOnFocus:true,id:'connection_name'+_idpfx,value:defaultConn.connection_name||'va_'+new Date().getTime(),enableKeyEvents:true,listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.onTestAndSave();}},scope:this}}},{xtype:'numberfield',anchor:'50%',selectOnFocus:true,fieldLabel:'Timeout',id:'connection_timeout'+_idpfx,value:defaultConn.connection_timeout||60,enableKeyEvents:true,listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.onTestAndSave();}},scope:this}}},{xtype:'checkbox',fieldLabel:'Pretty Print JSON',id:'flags_pp'+_idpfx}]}]}];this.buttons=[{text:'Test & Save',iconCls:'icon-tick',handler:this.onTestAndSave,scope:this},{text:'Cancel',iconCls:'icon-minus',handler:function(){this.hide()},scope:this},{text:'Documentation',iconCls:'icon-help',handler:function(){window.open('docs/index.html');}}];dbrui.ConnectionWindow.superclass.initComponent.call(this);this.fields={sql_server:this.findById('sql_server'+_idpfx),sql_database:this.findById('sql_database'+_idpfx),sql_port:this.findById('sql_port'+_idpfx),sql_user:this.findById('sql_user'+_idpfx),sql_password:this.findById('sql_password'+_idpfx),connection_name:this.findById('connection_name'+_idpfx),connection_timeout:this.findById('connection_timeout'+_idpfx),flags_pp:this.findById('flags_pp'+_idpfx)};this.on('show',this.refreshDatabaseList,this);if(this.autoConnect){this.on('render',function(){this.onTestAndSave();},this,{single:true});}
this.addEvents({'connectionupdate':true});},refreshDatabaseList:function(){var sql_server=this.fields['sql_server'].getValue();var sql_user=this.fields['sql_user'].getValue();var sql_password=this.fields['sql_password'].getValue();if(sql_server===''||sql_user===''){return;}
var testDb=new sqlDbAccess({sql_server:sql_server,sql_user:sql_user,sql_password:sql_password});testDb.getDatabases(function(dba,dbs){var data=[];for(var i=0,len=dbs.length;i<len;i++){data[i]=[dbs[i]];}
this.fields.sql_database.getStore().loadData(data);},null,this);},onTestAndSave:function(){var fail=false;for(var f in this.fields){if(!this.fields[f].validate()){fail=true;}}
if(!fail){var values={sql_server:this.fields['sql_server'].getValue(),sql_port:this.fields['sql_port'].getValue(),sql_database:this.fields['sql_database'].getValue(),sql_user:this.fields['sql_user'].getValue(),sql_password:this.fields['sql_password'].getValue(),connection_name:this.fields['connection_name'].getValue(),connection_timeout:this.fields['connection_timeout'].getValue(),flags_pp:this.fields['flags_pp'].getValue()};this.connection=values;var testDb=new sqlDbAccess(values);testDb.testConnection(function(dba,success){if(success){if(this.fireEvent('connectionupdate',this,values)){this.hide();}}
else{Ext.Msg.alert('Something Went Wrong','Couldn\'t connect to database.\nPlease make sure the connection information entered is correct.');}},this);}}});Ext.namespace('dbrui');dbrui.StatusWindow=Ext.extend(Ext.Window,{layout:'fit',title:'DBRelay Connection Status',width:700,height:450,modal:false,defaults:{border:false},initComponent:function(){var _idpfx=Ext.id();this.tbar=[{text:'Refresh',iconCls:'icon-refresh',handler:function(){this.refresh();},scope:this},'-',{text:'Kill',iconCls:'icon-disconnect',handler:function(){this.killSelectedConnections();},scope:this}];this.buttons=[{text:'Close',iconCls:'icon-minus',handler:function(){this.hide();},scope:this}];function _inuse(value,metaData,record,rowIndex,colIndex,store){if(record.get('in_use')===0){return'<span style="color:green;">'+val+'</span>';}
return val;}
var sm=new Ext.grid.CheckboxSelectionModel();this.items={xtype:'grid',id:'grid'+_idpfx,store:new Ext.data.JsonStore({autoDestroy:true,root:'connections',fields:[{name:'slot',type:'int'},{name:'pid',type:'int'},{name:'name'},{name:'tm_created',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'tm_accessed',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'connection_timeout',type:'int'},{name:'in_use',type:'int'},{name:'sock_path'},{name:'helper_pid',type:'int'},{name:'sql_server'},{name:'sql_database'},{name:'sql_user'},{name:'sql_port'}]}),columns:[sm,{header:"Slot",id:'slot',width:30,sortable:true,dataIndex:'slot'},{header:"PID",width:50,sortable:true,dataIndex:'pid'},{header:"Name",width:150,sortable:true,dataIndex:'name'},{header:"Created",width:85,sortable:true,renderer:Ext.util.Format.dateRenderer('m/d/Y g:ia'),dataIndex:'tm_created'},{header:"Last Accessed",width:85,sortable:true,renderer:Ext.util.Format.dateRenderer('m/d/Y g:ia'),dataIndex:'tm_accessed'},{header:"SQL Server",width:85,sortable:true,hidden:true,dataIndex:'sql_server'},{header:"SQL Database",width:85,sortable:true,hidden:true,dataIndex:'sql_database'},{header:"SQL User",width:85,sortable:true,hidden:true,dataIndex:'sql_user'},{header:"SQL Port",width:85,sortable:true,hidden:true,dataIndex:'sql_port'},{header:"Timeout",width:50,sortable:true,dataIndex:'connection_timeout'},{header:"In Use",width:50,sortable:true,dataIndex:'in_use'},{header:"Socket",width:100,sortable:true,dataIndex:'sock_path'},{header:"Helper PID",width:50,sortable:true,hidden:true,dataIndex:'helper_pid'}],sm:sm,viewConfig:{forceFit:true},stripeRows:true,autoExpandColumn:'name',listeners:{'render':{fn:function(g){this.refresh();},scope:this}}};this.statusData=[];dbrui.StatusWindow.superclass.initComponent.call(this);this.idpfx=_idpfx;this.grid=this.findById('grid'+_idpfx);},refresh:function(){var data=[];var grid=this.grid;dbrelayStatus(function(json){grid.getStore().loadData(json.status);});},killSelectedConnections:function(){var t=this,rows=this.grid.getSelectionModel().getSelections();for(var i=0,len=rows.length;i<len;i++){var rec=rows[i];dbrelayKillConnection(rec.get('sock_path'),function(json){var status=json.cmd.status;t.refresh();});}}});dbrui.CreateTableWindow=Ext.extend(Ext.Window,{layout:'form',title:'Create Table',width:550,height:400,modal:true,defaults:{border:false},initComponent:function(){var idpfx=Ext.id();this.items=[{fieldLabel:'Table Name',id:'name'+idpfx,xtype:'textfield',anchor:'98%',allowBlank:false},{fieldLabel:'Columns',tooltip:'ex.  id INT PRIMARY KEY, name varchar(50)',id:'columns'+idpfx,xtype:'textarea',anchor:'98% 90%',allowBlank:false,selectOnFocus:true,value:''}];this.buttons=[{text:'OK',iconCls:'icon-tick',id:'okbtn'+idpfx,handler:this.onOK,scope:this},{text:'Cancel',iconCls:'icon-minus',handler:function(){this.hide()},scope:this}];dbrui.CreateTableWindow.superclass.initComponent.call(this);this.fields={table:this.findById('name'+idpfx),columns:this.findById('columns'+idpfx)};this.addEvents({'ok':true});},onOK:function(){var fail=false;for(var f in this.fields){if(!this.fields[f].validate()){fail=true;}}
if(!fail){this.fireEvent('ok',this,this.fields['table'].getValue(),this.fields['columns'].getValue());this.hide();}}});Ext.namespace('dbrui');dbrui.SqlTableEditor=Ext.extend(Ext.Panel,{cls:'dbr-sqltableeditor',layout:'border',sqlTable:null,pkeyColumns:[],pkeyStyle:'color:#00761c;font-weight:bold;',binStyle:'color:#bbbbbb;',DELETE_INDEX:'dbr-deletebox',ADD_INDEX:'dbr-newrow',disableDelete:false,pageSize:50,pageNumber:1,totalPages:1,where:'',orderBy:'',hideFilterOptions:false,serverSidePaging:true,initComponent:function(){var idpfx=Ext.id();Ext.QuickTips.init();this.tbar=[{text:(this.hideFilterOptions?'Show':'Hide')+' Adv Filter',iconCls:'icon-app',enableToggle:true,pressed:!this.hideFilterOptions,tooltip:'More options',handler:function(b,e){var hidden=this.optionsPanel.hidden;b.setText(hidden?'Hide Adv Filter':'Show Adv Filter');b.setIconClass(hidden?'icon-app':'icon-app-split');this.optionsPanel.setVisible(hidden);this.doLayout();},scope:this},'-',{xtype:'button',text:' Refresh',tooltip:'Refresh columns & data from server',iconCls:'icon-refresh',handler:function(){Ext.Msg.confirm('Confirm Refresh?','Refreshing will revert and outstanding edits you may have. Are you sure you want to refresh?',function(btn,text){if(btn=='yes'){this.refresh();}},this);},scope:this},'-',{xtype:'button',text:'Commit',tooltip:'Commit all changes (adds, deletes, edits) to table in database',iconCls:'icon-disk',handler:function(){Ext.Msg.confirm('Confirm Commit?','Are you sure you want to save changes to the server?',function(btn,text){if(btn=='yes'){this.updateSelectedRows();}},this);},scope:this},'-',{text:'Row',tooltip:'Add new row to table',iconCls:'icon-plus',handler:function(){var grid=this.grid,store=grid.getStore(),Row=store.recordType;var newRec=new Row(Ext.apply({},this.addRowDefaults));newRec.set(this.ADD_INDEX,true);grid.stopEditing();store.insert(0,newRec);grid.startEditing(0,1);},scope:this},'-',{text:'Export',iconCls:'icon-tableexport',menu:[{text:'Current page view to HTML',iconCls:'icon-html',handler:function(){this.exportHtml();},scope:this},{text:'Current page view to CSV',iconCls:'icon-excel',handler:function(){this.exportCSV();},scope:this}]},{xtype:'tbfill',},'<b><span id="total'+idpfx+'"></span></b> total','-',{xtype:'numberfield',id:'pagesize'+idpfx,width:30,value:this.pageSize,enableKeyEvents:true,selectOnFocus:true,listeners:{'blur':{fn:this.updatePageView,scope:this},'keyup':{fn:function(b,e){if(e.keyCode===e.ENTER){this.updatePageView();}},scope:this}}},'/page','-',{iconCls:'icon-first',tooltip:'Go to first page',handler:function(){this.showPage(1);},scope:this},{iconCls:'icon-back',tooptip:'Go to previous page',handler:function(){var page=this.pageNumberField.getValue();this.showPage(page===1?1:page-1);},scope:this},'Page',{xtype:'numberfield',id:'page'+idpfx,width:30,value:this.pageNumber,enableKeyEvents:true,selectOnFocus:true,listeners:{'blur':{fn:this.updatePageView,scope:this},'keyup':{fn:function(b,e){if(e.keyCode===e.ENTER){this.updatePageView();}},scope:this}}},'of <span id="totalPages'+idpfx+'"></span>',{iconCls:'icon-next',tooltip:'Go to next page',handler:function(){var page=this.pageNumberField.getValue();this.showPage(page===this.totalPages?page:page+1);},scope:this},{iconCls:'icon-last',tooltip:'Go to last page',handler:function(){this.showPage(this.totalPages);},scope:this}];this.deleteBox=new dbrui.DeleteBox({header:'Del',id:'check',dataIndex:this.DELETE_INDEX,width:25,resizable:false});var gridConfig={region:'center',xtype:'editorgrid',border:false,id:'grid'+idpfx,clicksToEdit:1,stripeRows:true,columnLines:true,viewConfig:{autoFill:true},plugins:[this.deleteBox],store:new Ext.data.Store(),cm:new Ext.grid.ColumnModel([this.deleteBox])};var gridConfig=Ext.apply(gridConfig,this.gridConfig||{});this.items=[{region:'north',id:'options'+idpfx,height:100,split:true,hidden:this.hideFilterOptions,layout:'anchor',border:false,unstyled:true,listeners:{'expand':{fn:function(p){p.doLayout();}},'resize':{fn:function(p,aw,ah){this.whereField.setHeight(ah-35);this.orderByField.setHeight(ah-35);},scope:this}},items:[{layout:'column',border:false,anchor:'100% 100%',unstyled:true,items:[{columnWidth:0.66,layout:'form',border:false,unstyled:true,labelAlign:'top',anchor:'100%',items:[{fieldLabel:"WHERE (ex: color='red' )",xtype:'textarea',id:'where'+idpfx,anchor:'95%',height:80,enableKeyEvents:true,selectOnFocus:true,listeners:{'keyup':{fn:function(fld,e){if(e.ctrlKey&&e.keyCode===e.ENTER){this.refresh();}},scope:this}},value:this.where}]},{columnWidth:0.33,layout:'form',border:false,unstyled:true,labelAlign:'top',items:[{fieldLabel:'ORDER BY (ex: first_name asc)',id:'orderby'+idpfx,xtype:'textarea',anchor:'95%',height:80,enableKeyEvents:true,selectOnFocus:true,listeners:{'keyup':{fn:function(fld,e){if(e.keyCode===e.ENTER){this.refresh();}},scope:this}},value:this.orderBy}]}]}]},gridConfig];dbrui.SqlTableEditor.superclass.initComponent.call(this);this.on('render',function(p){this.pageNumberField=Ext.getCmp('page'+idpfx);this.pageSizeField=Ext.getCmp('pagesize'+idpfx);this.orderByField=Ext.getCmp('orderby'+idpfx);this.whereField=Ext.getCmp('where'+idpfx);this.refresh();},this,{single:true});this.sqlTable=sqlTable(this.tableName,this.sqlDb);this.grid=this.findById('grid'+idpfx);this.optionsPanel=this.findById('options'+idpfx);this.idpfx=idpfx;},updateSelectedRows:function(){var recs=this.grid.getStore().getModifiedRecords();if(recs.length===0){return;}
var updateRows=[],addRows=[],deleteRows=[],updateWhereRows=[],pkeys=this.pkeyColumns;var removedRecs=[],addedRecs=[],updatedRecs=[];for(var i=0,len=recs.length;i<len;i++){var rec=recs[i];var where={};for(var p=0;p<pkeys.length;p++){var k=pkeys[p];where[k]=rec.modified[k]||rec.data[k];}
if(!this.disableDelete&&rec.data[this.DELETE_INDEX]===true){if(rec.data[this.ADD_INDEX]===true){this.grid.getStore().remove(rec);continue;}
else{deleteRows.push(where);removedRecs.push(rec);}}
else if(rec.data[this.ADD_INDEX]===true){var arow=rec.data;if(arow[this.ADD_INDEX]){delete arow[this.ADD_INDEX];}
addRows.push(arow);addedRecs.push(rec);}
else{var mrow=rec.getChanges();updateWhereRows.push(where);if(mrow[this.DELETE_INDEX]){delete mrow[this.DELETE_INDEX];}
updateRows.push(mrow);updatedRecs.push(rec);}}
var sqlTable=this.sqlTable,sqlDb=sqlTable.getQueryHelper(),sqlStatements="";if(!this.disableDelete&&deleteRows.length>0){var batch=sqlTable.setDeleteRowsBatch(deleteRows);sqlStatements+=sqlDb.getBatch(batch)+';';sqlDb.emptyBatch(batch);}
if(addRows.length>0){var batch=sqlTable.setAddRowsBatch(addRows);sqlStatements+=sqlDb.getBatch(batch)+';';sqlDb.emptyBatch(batch);}
if(updateRows.length>0){var batch=sqlTable.setUpdateRowsBatch(updateRows,updateWhereRows);sqlStatements+=sqlDb.getBatch(batch)+';';sqlDb.emptyBatch(batch);}
if(sqlStatements!==''){Ext.Msg.alert("Success","Table was successfully updated");sqlDb.commitTransaction(sqlStatements,function(sdb,resp){for(var i=0;i<removedRecs.length;i++){this.grid.getStore().remove(removedRecs[i]);}
for(var i=0;i<addedRecs.length;i++){addedRecs[i].commit();}
for(var i=0;i<updatedRecs.length;i++){updatedRecs[i].commit();}},this);}},showPage:function(page){this.pageNumberField.suspendEvents();this.pageNumberField.setValue(page);this.pageNumberField.resumeEvents();this.updatePageView();},updatePageView:function(){var pageNumber=this.pageNumberField.getValue();if(pageNumber>this.totalPages){this.pageNumberField.suspendEvents();this.pageNumberField.setValue(this.totalPages);this.pageNumberField.resumeEvents();}
var pageSize=this.pageSizeField.getValue();this.where=this.whereField.getValue();this.orderBy=this.orderByField.getValue();var start=(pageNumber-1)*pageSize;if(this.serverSidePaging){this.displayMask('Fetching Data...');this.sqlTable.fetchPagingRows({pagingSize:pageSize,recordStart:this.pageSize*(pageNumber-1),where:this.where,orderBy:this.orderBy},function(sqlt,resp,ocfg,ncfg){this.hideMask();if(!resp.data){return;}
this.tableData=resp.data[0].rows;this.grid.getStore().loadData({'rows':this.tableData});},function(sqld,err){Ext.Msg.alert("Error","An error occured while trying to fetch the data.  "+err.log.error);this.hideMask();},this);}
else{this.grid.getStore().loadData({'rows':this.tableData.slice(start,start+pageSize)});}
this.pageNumber=pageNumber;this.pageSize=pageSize;this.totalPages=Math.floor((this.totalRows/pageSize)+1);Ext.get('totalPages'+this.idpfx).update(this.totalPages);},displayMask:function(msg){this.body.mask(msg);},hideMask:function(){this.body.unmask();},refresh:function(){this.displayMask('Querying columns...');if(!this.optionsPanel.hidden){this.where=this.whereField.getValue();this.orderBy=this.orderByField.getValue();}
this.sqlTable.queryColumns(function(sqlt,resp,cols){this.displayMask('Querying primary keys...');this.sqlTable.queryPrimaryKeys(function(sqlt,resp2,keys){if(keys.length===0){Ext.Msg.alert('No Primary Keys Found for '+this.tableNam,'No primary keys were found for this table.  As a result, you will not be able to commit any row deletions or edits');this.disableEditing();}
this._finishRefresh(keys,cols);},function(sqlt,resp){Ext.Msg.alert("Error","An error occurred while trying to fetch the primary keys");this.hideMask();},this);},function(sqlt,resp){Ext.Msg.alert("Error","An error occurred while trying to fetch the table columns");this.hideMask();},this);},disableEditing:function(){this.disableDelete=true;this.grid.getColumnModel().setHidden(0,true);},_finishRefresh:function(pkeys,cols){var fm=Ext.form,cmData=[],storeFields=[];this.addRowDefaults={};var pkeystr='~'+pkeys.join('~')+'~';this.pkeyColumns=pkeys;cmData[0]=this.deleteBox;storeFields[0]={name:this.DELETE_INDEX};for(var i=0,len=cols.length;i<len;i++){var col=cols[i],name=col.name,rawtype=col.dataType;var iskey=pkeystr.indexOf('~'+name+'~')!==-1;var cellEditor,simpleType;switch(rawtype){case'binary':case'varbinary':case'image':simpleType='binary';cellEditor=null;break;case'bigint':case'int':case'smallint':case'tinyint':case'bit':simpleType='int';cellEditor=pkeys.length===0?null:new Ext.form.NumberField({allowBlank:col.required?false:true,allowDecimals:false});break;case'numeric':case'decimal':case'money':case'smallmoney':simpleType='float';cellEditor=pkeys.length===0?null:new Ext.form.NumberField({allowBlank:col.required?false:true});break;default:simpleType=rawtype;cellEditor=pkeys.length===0?null:new Ext.form.TextField({allowBlank:true});};if(col.isIdentity){cellEditor=null;};cmData[i+1]={header:name+' '+(iskey?'[KEY]':'')+'['+rawtype+']',sortable:true,id:name,pkey:iskey,css:iskey?this.pkeyStyle:(simpleType==='binary'?this.binStyle:null),dataIndex:name,editor:cellEditor};this.addRowDefaults[name]='';storeFields[i+1]={name:name,type:'string'};}
var store=new Ext.data.JsonStore({autoDestroy:true,data:{rows:[]},root:'rows',fields:storeFields});this.grid.reconfigure(store,new Ext.grid.ColumnModel(cmData));if(this.serverSidePaging){this.sqlTable.queryTotalRows({pkeys:this.pkeyColumns.length>0?this.pkeyColumns[0]:'*',where:this.where},function(sqlt,resp,total){this.setTotalCount(total);this.updatePageView();},function(sqlt,resp){this.hideMask();},this);}
else{this.displayMask('Querying Data...');this.sqlTable.fetchRows({where:this.where,orderBy:this.orderBy},function(sqlt,resp){if(resp&&resp.data){this.displayMask('Preparing Data for Display...');this.tableData=resp.data[0].rows;this.setTotalCount(resp.data[0].count);this.updatePageView();}
this.hideMask();},this);}},setTotalCount:function(n){this.totalRows=n;Ext.get('total'+this.idpfx).update(n);},exportHtml:function(){var rows=this.grid.store.data.items,html='',cols=[];html='<table>';var cm=this.grid.getColumnModel();var numCols=cm.getColumnCount();html+='<thead><tr>';for(var c=0;c<numCols;c++){if(!cm.isHidden(c)){var cname=cm.getDataIndex(c);cols.push(cname);html+='<th>'+cname+'</th>';}}
html+='</tr></thead><tbody>';for(var i=0,len=rows.length;i<len;i++){html+='<tr>';var row=rows[i];for(var c=0;c<cols.length;c++){html+='<td>'+row.data[cols[c]]+'</td>';}
html+='</tr>';}
html+='</tbody></table>';var win=window.open('','','width=600,height=500'
+',menubar=0'
+',toolbar=1'
+',status=0'
+',scrollbars=1'
+',resizable=1');win.document.writeln('<html><head><style>');win.document.writeln('table{width:100%;border-collapse:collapse;padding:0;margin:0;font-family:Arial, Helvetica, "sans serif"}');win.document.writeln('td,th{font-size:11px;text-align:left;border:1px solid black;}');win.document.writeln('</style></head><body>');win.document.writeln(html);win.document.writeln('</body></html>');win.document.close();},exportCSV:function(){var rows=this.grid.store.data.items,csv='',cols=[],temp=[];var cm=this.grid.getColumnModel();var numCols=cm.getColumnCount();function _csv(v){v+="";v=v.replace(/"/g,'"""');return'"'+v+'"';}
for(var c=1;c<numCols;c++){if(!cm.isHidden(c)){var cname=cm.getDataIndex(c);cols.push(cname);temp.push(_csv(cname));}}
csv+=temp.join(',')+'\n';for(var i=0,len=rows.length;i<len;i++){temp=[];var row=rows[i];for(var c=1;c<cols.length;c++){temp.push(_csv(row.data[cols[c]]));}
csv+=temp.join(',')+'\n';}
var win=window.open('','','width=600,height=500'
+',menubar=0'
+',toolbar=1'
+',status=0'
+',scrollbars=1'
+',resizable=1');win.document.writeln('<pre>'+csv+'</pre>');win.document.close();}});Ext.reg('dbrui.SqlTableEditor',dbrui.SqlTableEditor);dbrui.DeleteBox=function(config){Ext.apply(this,config);if(!this.id){this.id=Ext.id();}
this.renderer=this.renderer.createDelegate(this);};dbrui.DeleteBox.prototype={init:function(grid){this.grid=grid;this.grid.on('render',function(){var view=this.grid.getView();view.mainBody.on('mousedown',this.onMouseDown,this);},this);},onMouseDown:function(e,t){if(t.className&&t.className.indexOf('x-grid3-cc-'+this.id)!=-1){e.stopEvent();var index=this.grid.getView().findRowIndex(t);var record=this.grid.store.getAt(index);var tbl=Ext.get(t).findParentNode('.x-grid3-row-table',10,true);tbl.addClass('dbr-deletetablerow');record.set(this.dataIndex,record.data[this.dataIndex]?false:true);}},renderer:function(v,p,record){p.css+=' x-grid3-check-col-td';return'<div class="x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'">&#160;</div>';}};Ext.namespace('dbrui');dbrui.Chart=Ext.extend(Ext.Panel,{nextColorIndex:0,layout:'fit',initComponent:function(){this.items={html:''};dbrui.Chart.superclass.initComponent.call(this);this.colors=['#4572A7','#AA4643','#89A54E','#71588F','#4198AF','#DB843D','#93A9CF','#D19392','#B9CD96','#A99BBD'];if(this.store){this.on('render',function(p){p.refreshChart(p.store);});}
else if(this.data){this.on('render',function(p){p.refreshChart(p.data);});}
else if(this.dbrelay){this.dbrelay.connection_name=this.dbrelay.connection_name||('dbruiChart'+new Date().getTime());this.on('render',function(){this.query(this.dbrelay.sql);},this);}},getChart:function(){return this.chart||null;},mask:function(show){if(!this.body){return;}
if(!this._mask){this._mask=new Ext.LoadMask(this.body,{msg:'Loading'});}
if(show){this._mask.show();}
else{this._mask.hide();}},query:function(sql,connection){var conn=connection||this.dbrelay;if(!conn){return;}
this.mask(true);DbRelay.query(conn,sql,function(response){var data=response.data[response.data.length-1];this.refreshChart(data);},function(response){this.mask(false);Ext.Msg.alert('Error running query',response.log.error||"An unknown error occured when running the query");},this);this.sql=sql;this.dbrelay=conn;},getColor:function(){var idx=this.nextColorIndex++;if(idx===this.colors.length){var color=dbrui.Util.randomColor();this.colors.push(color);}
return this.colors[idx];},data2Store:function(dbrData){var cols=dbrData.fields,rows=dbrData.rows;var storeFields=[];for(var i=0,len=cols.length;i<len;i++){storeFields[i]={name:cols[i].name};}
return new Ext.data.JsonStore({autoDestroy:true,data:{rows:rows},root:'rows',fields:storeFields});},_getNewChart:Ext.emptyFn,refreshChart:function(data){if(!data||data===this.store){return false;}
this.store=data.recordType?data:this.data2Store(data);this.keys=this.store.fields.keys;this.nextColorIndex=0;if(this.keys.length<2){return;}
try{this.remove(this.getComponent(0),true);}catch(e){this.remove(this.getComponent(0),false);}
if(this.chart){delete(this.chart);}
this.chart=this._getNewChart();this.add(this.chart);this.doLayout();this.mask(false);this.fireEvent('chartdraw',this);}});dbrui.Chart.SqlDateRenderer=function(v){var jsDate=Date.parseDate(v,'M j Y h:i:s:uA')||Date.parseDate(v,'M  j Y h:i:s:uA');return jsDate?jsDate.format('M d, Y'):v;}
dbrui.LineChart=Ext.extend(dbrui.Chart,{initComponent:function(){dbrui.LineChart.superclass.initComponent.call(this);this.extraStyle=this.extraStyle||{legend:{display:'top',padding:0,font:{size:10}},xAxis:{labelRotation:0}};},_createSeries:function(){var store=this.store,keys=this.keys,lines=[];for(var k=1;k<keys.length;k++){lines.push({type:'line',displayName:keys[k],yField:keys[k],style:{color:this.getColor(),lineSize:1,size:5}});}
return lines;},_getNewChart:function(){var keys=this.keys;var xLabelFn=this.xAxisLabelFn;var yAxisCfg=Ext.apply({labelRenderer:this.yAxisLabelFn||Ext.util.Format.numberRenderer('0,000')},this.yAxisCfg);return new Ext.chart.LineChart({store:this.store,xField:keys[0],xAxis:new Ext.chart.CategoryAxis({displayName:keys[0],hideOverlappingLabels:false,labelRenderer:function(v){if(xLabelFn){return xLabelFn.call(this,v);}
return v;}}),yAxis:new Ext.chart.NumericAxis(yAxisCfg),extraStyle:this.extraStyle,series:this._createSeries()});}});Ext.reg('dbrui.LineChart',dbrui.LineChart);dbrui.BarChart=Ext.extend(dbrui.Chart,{initComponent:function(){dbrui.BarChart.superclass.initComponent.call(this);this.extraStyle=this.extraStyle||{legend:{display:'top',padding:0,font:{size:10}},xAxis:{labelRotation:0}};},_createSeries:function(){var store=this.store,keys=this.keys,lines=[];for(var k=1;k<keys.length;k++){lines.push({type:'column',displayName:keys[k],yField:keys[k],style:{color:this.getColor()}});}
return lines;},_getNewChart:function(){var store=this.store,keys=this.keys;var xLabelFn=this.xAxisLabelFn;var yAxisCfg=Ext.apply({labelRenderer:this.yAxisLabelFn||Ext.util.Format.numberRenderer('0,000')},this.yAxisCfg);return new Ext.chart.ColumnChart({store:store,xField:keys[0],xAxis:new Ext.chart.CategoryAxis({displayName:keys[0],hideOverlappingLabels:false,labelRenderer:function(v){if(xLabelFn){return xLabelFn.call(this,v);}
return v;}}),yAxis:new Ext.chart.NumericAxis(yAxisCfg),extraStyle:this.extraStyle,series:this._createSeries()});}});Ext.reg('dbrui.BarChart',dbrui.BarChart);dbrui.PieChart=Ext.extend(dbrui.Chart,{initComponent:function(){dbrui.PieChart.superclass.initComponent.call(this);},_getNewChart:function(){var store=this.store,keys=this.keys;return new Ext.chart.PieChart({store:store,dataField:keys[1],categoryField:keys[0],extraStyle:{legend:{display:'top',padding:0,font:{size:10}}}});}});Ext.reg('dbrui.PieChart',dbrui.PieChart);Ext.namespace('dbrui');dbrui.SqlSelectGrid=Ext.extend(Ext.grid.GridPanel,{viewConfig:{autoFill:true,emptyText:'Empty result set',deferEmptyText:false},border:false,pageSize:50,pageNumber:1,totalPages:1,initComponent:function(){var idpfx=Ext.id();this.tbar=['<span id="name'+idpfx+'" style="font-weight:bold;color:green">Viewing '+(this.resultName||'')+'</span>',{xtype:'tbfill',},{text:'Charts',iconCls:'icon-chart',id:'chart_item'+idpfx,handler:function(){this.openChartWindow(this.store);},scope:this},'-',{text:'Export',iconCls:'icon-tableexport',menu:[{text:'All rows as HTML',iconCls:'icon-html',handler:function(){this.exportHtml(true);},scope:this},{text:'Selected rows as HTML',iconCls:'icon-html',handler:function(){this.exportHtml(false)},scope:this},'-',{text:'All rows as CSV',iconCls:'icon-excel',handler:function(){this.exportCSV(true);},scope:this},{text:'Selected rows as CSV',iconCls:'icon-excel',handler:function(){this.exportCSV(false);},scope:this}]},'-','<span id="total'+idpfx+'"></span> total','-',{xtype:'numberfield',id:'pagesize'+idpfx,width:30,enableKeyEvents:true,selectOnFocus:true,listeners:{'blur':{fn:this.updatePageView,scope:this},'keyup':{fn:function(b,e){if(e.keyCode===e.ENTER){this.updatePageView();}},scope:this}}},'/page','-',{iconCls:'icon-first',id:'pagefirst'+idpfx,handler:function(){this.showPage(1);},scope:this},{iconCls:'icon-back',id:'pageback'+idpfx,handler:function(){var page=this.pageNumberField.getValue();this.showPage(page===1?1:page-1);},scope:this},'Page',{xtype:'numberfield',id:'page'+idpfx,width:30,enableKeyEvents:true,selectOnFocus:true,listeners:{'blur':{fn:this.updatePageView,scope:this},'keyup':{fn:function(b,e){if(e.keyCode===e.ENTER){this.updatePageView();}},scope:this}}},'of <span id="totalPages'+idpfx+'"></span>',{iconCls:'icon-next',id:'pagenext'+idpfx,handler:function(){var page=this.pageNumberField.getValue();this.showPage(page===this.totalPages?page:page+1);},scope:this},{iconCls:'icon-last',id:'pagelast'+idpfx,handler:function(){this.showPage(this.totalPages);},scope:this}];this.store=this.store||new Ext.data.Store();this.cm=this.cm||new Ext.grid.ColumnModel([]);dbrui.SqlSelectGrid.superclass.initComponent.call(this);this.idpfx=idpfx;},openChartWindow:function(store){var keys=store.fields.keys;if(keys.length<2){Ext.Msg.alert('Problem','You need at least 2 numeric columns to create a chart');return;}
if(!this.chartWindow){this.chartWindow=new Ext.Window({title:this.sqlTitle+' Charts (BETA)',closable:true,closeAction:'hide',maximizable:true,width:600,height:500,layout:'fit',tbar:[{text:'<div style="font-weight:bold;color:red;font-size:14px">Help</div>',iconCls:'icon-help',handler:function(){Ext.Msg.alert('Charts Help','Charts are currently in BETA mode.  Currently only one result set can be charted at a time.<br/>'
+'<table width="100%" border="1"><tr><td>&nbsp;</td><td><b>Line/Bar Chart</b></td><td><b>Pie Chart</b></td></tr>'
+'<tr><td><b>x</b></td><td>first column</td><td>categories are first column</td></tr>'
+'<tr><td><b>y</b></td><td>each numeric column after the 1st column</td><td>2nd column</td></tr>'
+'</table><br/><br/>'
+'OPEN ISSUES:<br/>'
+'- Time Series chart currently does not refresh its data.  To chart a different time series, open a new SQL query tab.<br/>');}}],items:{xtype:'tabpanel',activeTab:0,layoutOnTabChange:true,deferredRender:true,forceLayout:true,items:[{title:'Line',id:'line'+this.idpfx,iconCls:'icon-linechart',xtype:'dbrui.LineChart'},{title:'Bar',id:'bar'+this.idpfx,iconCls:'icon-barchart',xtype:'dbrui.BarChart'},{title:'Pie',id:'pie'+this.idpfx,iconCls:'icon-piechart',xtype:'dbrui.PieChart'}],listeners:{'tabchange':{fn:function(tp,t){if(t.refreshChart){t.refreshChart(this.store);}},scope:this}}},listeners:{'render':{fn:function(win){win.tabs=win.getComponent(0);this.fireEvent('createchartwindow',this,this.chartWindow);},scope:this}}});}
this.chartWindow.show();this.chartWindow.getComponent(0).activate(0);},getDbrData:function(){return this.dataSet;},refresh:function(data){var cols=data.fields,rows=data.rows;var cmData=[],storeFields=[];for(var i=0,len=cols.length;i<len;i++){var col=cols[i],name=col.name;cmData[i]={header:name,sortable:true,id:name,dataIndex:name};storeFields[i]={name:name};}
var store=new Ext.data.JsonStore({autoDestroy:true,data:{rows:rows},root:'rows',fields:storeFields});var cm=new Ext.grid.ColumnModel(cmData);this.reconfigure(store,cm);if(this.chartWindow&&!this.chartWindow.hidden){this.chartWindow.hide();this.openChartWindow(store);}
this.tableData=rows;this.totalRows=(data.count||rows.length)||'0';Ext.get('total'+this.idpfx).update(this.totalRows);this.pageNumberField=Ext.getCmp('page'+this.idpfx);this.pageSizeField=Ext.getCmp('pagesize'+this.idpfx);this.pageNumberField.setValue(this.pageNumber);this.pageSizeField.setValue(this.pageSize);this.updatePageView();this.dataSet=data;},nextPageSetDisabled:function(disabled){Ext.getCmp('pagenext'+this.idpfx).setDisabled(disabled);Ext.getCmp('pagelast'+this.idpfx).setDisabled(disabled);},prevPageSetDisabled:function(disabled){Ext.getCmp('pageback'+this.idpfx).setDisabled(disabled);Ext.getCmp('pagefirst'+this.idpfx).setDisabled(disabled);},showPage:function(page){this.pageNumberField.suspendEvents();this.pageNumberField.setValue(page);this.pageNumberField.resumeEvents();this.updatePageView();},updatePageView:function(){var pageNumber=this.pageNumberField.getValue();if(pageNumber>this.totalPages){this.pageNumberField.suspendEvents();this.pageNumberField.setValue(this.totalPages);this.pageNumberField.resumeEvents();}
var pageSize=this.pageSizeField.getValue();var start=(pageNumber-1)*pageSize;this.store.loadData({'rows':this.tableData.slice(start,start+pageSize)});this.pageNumber=pageNumber;this.pageSize=pageSize;this.totalPages=Math.ceil(this.totalRows/this.pageSize);Ext.get('totalPages'+this.idpfx).update(this.totalPages);this.nextPageSetDisabled(this.totalPages===1);this.prevPageSetDisabled(pageNumber===1);},setResultName:function(s){Ext.get('name'+this.idpfx).update(s);this.resultName=s;},exportHtml:function(allRows){var rows=allRows?this.tableData:this.getSelectionModel().getSelections(),html='',cols=[];html='<table>';var cm=this.getColumnModel();var numCols=cm.getColumnCount();html+='<thead><tr>';for(var c=0;c<numCols;c++){if(!cm.isHidden(c)){var cname=cm.getDataIndex(c);cols.push(cname);html+='<th>'+cname+'</th>';}}
html+='</tr></thead><tbody>';for(var i=0,len=rows.length;i<len;i++){html+='<tr>';var row=rows[i];for(var c=0;c<cols.length;c++){var v=allRows?row[cols[c]]:row.data[cols[c]];html+='<td>'+(v===null?"":v)+'</td>';}
html+='</tr>';}
html+='</tbody></table>';var win=window.open('','','width=600,height=500'
+',menubar=0'
+',toolbar=1'
+',status=0'
+',scrollbars=1'
+',resizable=1');win.document.writeln('<html><head><style>');win.document.writeln('table{width:100%;border-collapse:collapse;padding:0;margin:0;font-family:Arial, Helvetica, "sans serif"}');win.document.writeln('td,th{font-size:11px;text-align:left;border:1px solid black;}');win.document.writeln('</style></head><body>');win.document.writeln(html);win.document.writeln('</body></html>');win.document.close();},exportCSV:function(allRows){var rows=allRows?this.tableData:this.getSelectionModel().getSelections(),csv='',cols=[],temp=[];var cm=this.getColumnModel();var numCols=cm.getColumnCount();function _csv(v){v+="";v=v.replace(/"/g,'"""');return'"'+v+'"';}
for(var c=0;c<numCols;c++){if(!cm.isHidden(c)){var cname=cm.getDataIndex(c);cols.push(cname);temp.push(_csv(cname));}}
csv+=temp.join(',')+'\n';for(var i=0,len=rows.length;i<len;i++){temp=[];var row=rows[i];for(var c=0;c<cols.length;c++){var v=allRows?row[cols[c]]:row.data[cols[c]];temp.push(_csv((v===null?"":v)));}
csv+=temp.join(',')+'\n';}
var win=window.open('','','width=600,height=500'
+',menubar=0'
+',toolbar=1'
+',status=0'
+',scrollbars=1'
+',resizable=1');win.document.writeln('<pre>'+csv+'</pre>');win.document.close();}});Ext.namespace('dbrui');dbrui.SqlResultPanel=Ext.extend(Ext.Panel,{cls:'dbr-sqlresultpanel',layout:'border',closable:true,directLink:true,autoRun:false,initComponent:function(){var idpfx=Ext.id();this.cm=new Ext.grid.ColumnModel([]);this.store=new Ext.data.Store();this.grids=[];this.tbar=[{text:'Hide Query',iconCls:'icon-app',enableToggle:true,pressed:true,handler:function(b,e){var hidden=this.northRegion.hidden;b.setText(hidden?'Hide Query':'Show Query');b.setIconClass(hidden?'icon-app':'icon-app-split');this.northRegion.setVisible(hidden);this.doLayout();},scope:this},'-',{text:'Run (CTRL + Enter)',iconCls:'icon-tick',id:'run'+idpfx,tooltip:'Execute SQL [CTRL + Enter]',handler:this.execSql,scope:this},{xtype:'tbfill',},{iconCls:'icon-minus',text:'Clear',handler:function(){this.fldSqlCode.setValue('');this.fldUrl.setValue('');this.showMsgPanel('Enter query to execute.');},scope:this}];this.items=[{region:'north',height:140,split:true,collapsible:true,layout:'form',unstyled:true,labelWidth:80,id:'north'+idpfx,items:[{fieldLabel:'SQL',xtype:'textarea',id:'sqlcode'+idpfx,anchor:'98%',allowBlank:false,enableKeyEvents:true,selectOnFocus:true,value:this.defaultSql||'',listeners:{'keyup':{fn:function(fld,e){if(e.ctrlKey&&e.keyCode===e.ENTER){this.execSql();}},scope:this}}},{xtype:'checkbox',boxLabel:'Execute as a single Transaction',id:'xact'+idpfx},{xtype:'displayfield',fieldLabel:'',id:'url'+idpfx,style:'font-size:10px;'}],listeners:{'resize':{fn:function(p,aw,ah){var offset=this.directLink?60:30;this.fldSqlCode.setHeight(ah-offset);},scope:this},'expand':{fn:function(p){p.doLayout();}}}},{region:'center',id:'resultsRegion'+idpfx,border:false,layout:'card',activeItem:0,items:{id:'msg'+idpfx,unstyled:true},tbar:[{text:''}]}];dbrui.SqlResultPanel.superclass.initComponent.call(this);this.fldSqlCode=this.findById('sqlcode'+idpfx);this.msgPanel=this.findById('msg'+idpfx);this.fldUrl=this.findById('url'+idpfx);this.fldXact=this.findById('xact'+idpfx);this.northRegion=Ext.getCmp('north'+idpfx);this.centerRegion=Ext.getCmp('resultsRegion'+idpfx);this.idpfx=idpfx;if(this.autoRun){this.on('afterlayout',function(){this.execSql();},this,{single:true});}},loadMask:function(on){var runBtn=Ext.getCmp('run'+this.idpfx);if(on){this.centerRegion.body.mask('Running Query...Please wait...');if(runBtn){runBtn.setIconClass('icon-loading');}}
else{if(runBtn){runBtn.setIconClass('icon-tick');}
this.centerRegion.body.unmask();}},execSql:function(){if(!this.fldSqlCode.validate()){return;}
this.loadMask(true);this.sqlDb.executeSql(this.fldSqlCode.getValue(),(this.fldXact.getValue()?['xact']:null),function(sqld,resp){if(resp.log.error||!resp.data){this.showMsgPanel('<p style="color:red">Error:</p><pre style="color:red">'+resp.log.error+'</pre>');this.loadMask(false);}
else{var gridify=false,datasets=resp.data;for(var i=0;i<datasets.length;i++){if(datasets[i].rows.length>0&&datasets[i].fields.length>0){gridify=true;break;}}
if(gridify){this.showResultGrids(resp.data);}
else{var msg=(datasets[0]&&datasets[0].rows&&datasets[0].rows.length===0)?'<p style="color:blue">No results returned</p>':'<p style="color:green">Success</p>';this.showMsgPanel(msg);this.loadMask(false);}
this.setUrlLink(this.getDirectUrl());}},function(sqld,resp,err){Ext.Msg.alert('Error',err);this.loadMask(false);},this);},getDirectUrl:function(){var conn=Ext.apply({},this.sqlDb.connection);conn.sql=this.fldSqlCode.getValue();conn.query_tag=null;conn.sql_password=null;if(this.fldXact.getValue()){conn.flags+=',xact';}
return window.location.protocol+'//'+window.location.host+window.location.pathname+'?'
+Ext.urlEncode(conn)+'&'+window.location.hash;},setUrlLink:function(url){if(this.directLink){var title='',cls='';var host=window.location.protocol+'//'+window.location.host+window.location.pathname;if((url.length-host.length)>2083){title='URL is over the 2083 character limit for IE GET requests, and may not run correctly in IE as a result';cls='dbr-directlink-warning';}
this.fldUrl.setValue('<a title="'+title+'" href="'+url+'" target="_blank" class="'+cls+'">'+url+'</a>');}},showMsgPanel:function(msg){this.centerRegion.getLayout().setActiveItem(this.msgPanel);this.msgPanel.body.update(msg);},showResultGrids:function(dataSets){var tb=this.centerRegion.getTopToolbar(),numResults=dataSets.length,count=0;tb.removeAll();for(var i=0;i<numResults;i++){var data=dataSets[i];if(!(data.rows&&data.rows.length>0)){continue;}
var name='Result Set '+(count+1);if(!this.grids[count]){var grid=new dbrui.SqlSelectGrid({resultName:'Viewing '+name,dataSet:data,plugins:this.gridplugins,sqlTitle:this.title||'',listeners:{'afterrender':{fn:function(g){this.doLayout();g.refresh(g.dataSet);},scope:this}}});this.centerRegion.add(grid);this.grids[count]=grid;}
else{var grid=this.grids[count];grid.refresh(data);grid.setResultName(name);}
tb.add({text:name,gridIndex:count,id:'showgrid-'+count+this.idpfx,iconCls:'icon-sql',enableToggle:true,enableDepress:false,toggleGroup:'grids'+this.idpfx,toggleHandler:function(b,st){if(st){this.centerRegion.getLayout().setActiveItem(this.grids[b.gridIndex]);this.centerRegion.doLayout();}},scope:this});tb.addText('&nbsp;&nbsp;');count++;}
tb.el.removeClass('x-toolbar');this.doLayout();tb.findById('showgrid-'+(count-1)+this.idpfx).toggle(true);tb.addText('&nbsp;&nbsp;'+count+' result set'+(count>1?'s':'')+' returned.');this.loadMask(false);}});Ext.reg('dbrui.SqlResultPanel',dbrui.SqlResultPanel);Ext.namespace('dbrui','dbrplugins.meta');dbrui.App=function(){var _viewport;var _numSqls=0;var _NUMCELLS_THRESHOLD=20000;var _tablesMenuOpen=new Ext.menu.Menu();var _tablesMenuDrop=new Ext.menu.Menu();var _appName="DBRelay";var _plugins={tableeditor:[],sqlpanel:[],dbrelayapp:[],sqlgrid:[]};var loadPlugins=function(files,success,error,scope){var loadSuccess=function(response,options){var head=document.getElementsByTagName("head")[0];var url=options.url;if(url.indexOf('.js')===url.length-3){var js=document.createElement('script');js.setAttribute("type","text/javascript");js.text=response.responseText;if(!document.all){js.innerHTML=response.responseText;}
head.appendChild(js);}
else if(url.indexOf('.css')===url.length-4){Ext.util.CSS.createStyleSheet(response.responseText);}
if(success){success.defer(50,scope||window,[response,options]);}};for(var i=0,len=files.length;i<len;i++){Ext.Ajax.request({url:files[i],method:'GET',success:loadSuccess,failure:function(response,options){if(error){error.call(scope||window);}},disableCaching:false});}}
return{sqlDb:null,tables:{},connectionWindow:null,sqlWindow:null,init:function(){var loadedFiles=0,me=this;Ext.chart.Chart.CHART_URL=window.DBRELAYUI_EXTCHART_URL||'js/ext-3.2.1/resources/charts.swf?nocache='+Math.floor(Math.random()*10000);$.get("plugins/",function(data){var files=[],css=[],names={};$(data).find('a').each(function(){var name=$(this).attr('href'),baseUrl='plugins/'+name;if(name!='../'&&name.indexOf('/')===name.length-1){files.push(baseUrl+'plugin.js');css.push(baseUrl+'plugin.css');names[baseUrl+'plugin.js']=name.substring(0,name.length-1);}});var totalFiles=files.length;if(totalFiles>0){loadPlugins(css);loadPlugins(files,function(response,options){loadedFiles++;var name=names[options.url];var pluginFor=dbrplugins.meta[name].pluginFor;if(_plugins[pluginFor]){_plugins[pluginFor].push(name);}
if(loadedFiles===totalFiles){this.loadApp();}},function(response,options){totalFiles--;Ext.Msg.alert("Error","Unable to load plugin script: "+options.url);if(loadedFiles===totalFiles){this.loadApp();}},me);}
else{me.loadApp();}});},getPluginsFor:function(type){var names=_plugins[type],plugins=[];for(var i=0;i<names.length;i++){plugins.push(new dbrplugins[names[i]]);}
return plugins;},loadApp:function(){var _vaApp=this;_viewport=new Ext.Viewport({layout:'border',plugins:_plugins.app,items:[{region:'west',width:55,unstyled:true,layout:'column',border:false,cls:'dbr-dbactions',items:[{columnWidth:1,border:false,layout:'anchor',unstyled:true,defaults:{width:45,iconAlign:'top',scale:'small',arrowAlign:'bottom'},items:[{xtype:'button',text:'Tables',iconCls:'icon-tables',menu:[{text:'Edit Table',iconCls:'icon-opentable',menu:_tablesMenuOpen},{text:'Drop Table',iconCls:'icon-minus',menu:_tablesMenuDrop},'-',{text:'Add Table',iconCls:'icon-plus',handler:function(){this.showCreateTableWindow(true);},scope:this}]},{xtype:'button',text:'SQL',iconCls:'icon-sql',handler:function(){this.addSqlPanel();},scope:this},{xtype:'button',text:'Conn',iconCls:'icon-gear',handler:function(){this.showConnectionWindow(true);},scope:this},{xtype:'button',text:'Log',iconCls:'icon-log',handler:this.openSqlLog,scope:this},{xtype:'button',text:'Docs',iconCls:'icon-help',handler:function(){window.open('docs/index.html');}},{xtype:'button',text:'More',menu:[{text:'Other Documentation',iconCls:'icon-doc',handler:function(){window.open('/docs/index.html');}},{text:'Status Window',iconCls:'icon-monitor',handler:function(){this.showStatusWindow(true);},scope:this}]},{xtype:'button',iconCls:'icon-dbrelay',scale:'large',handler:function(){window.open('http://dbrelay.com/');}}]}]},{region:'center',border:false,layout:'fit',items:{xtype:'tabpanel',id:'maintabs',enableTabScroll:true,deferredRender:false,layoutOnTabChange:true,plain:true,border:false}}]});this.restoredConnection=window.DBRELAYUI_PARAMS?window.DBRELAYUI_PARAMS:Ext.urlDecode(window.location.href.substring(window.location.href.indexOf('?')+1));var loading=Ext.get('dbr-loading');var mask=Ext.get('dbr-loading-mask');mask.setOpacity(.8);mask.shift({xy:loading.getXY(),width:loading.getWidth(),height:loading.getHeight(),remove:true,duration:1,opacity:.3,easing:'bounceOut',callback:function(){loading.fadeOut({duration:.1,remove:true});}});if(Ext.isAir||Ext.isBorderBox||Ext.isGecko2||Ext.isIE6||Ext.isIE7||Ext.isSafari2||Ext.isSafari3){Ext.Msg.alert('WARNING','You are not using a supported browser.\nThis interface supports FF3+, IE8+, Chrome, and Safari 4+.  Using any other browsers may result in problems.',function(){this.showConnectionWindow(true);},this);}
else{this.showConnectionWindow(true);}},showCreateTableWindow:function(show){if(!show&&!this.createTableWindow){return;}
if(!this.createTableWindow){this.createTableWindow=new dbrui.CreateTableWindow({listeners:{'ok':{fn:function(w,table,columns){this.sqlDb.createTable(table,columns,function(sqld,resp){this.refreshTablesMenu();this.showTableEditor(table);},this);},scope:this}}});}
this.createTableWindow.setVisible(show);},showStatusWindow:function(show){if(!show&&!this.statusWindow){return;}
if(!this.statusWindow){this.statusWindow=new dbrui.StatusWindow();}
this.statusWindow.setVisible(show);},showConnectionWindow:function(show){if(!show&&!this.connectionWindow){return;}
if(!this.connectionWindow){this.connectionWindow=new dbrui.ConnectionWindow({defaultConnection:this.restoredConnection||{},autoConnect:this.restoredConnection.run&&this.restoredConnection.run==1?true:false,listeners:{'connectionupdate':{fn:function(w,conncfg){if(!this.sqlDb){this.sqlDb=sqlDbAccess(conncfg);this.sqlDb.setFlag('echosql',true);this.sqlDb.setFlag('pp',conncfg.flags_pp);delete conncfg.flags_pp;var autoRun=this.restoredConnection.run&&this.restoredConnection.run==1?true:false;this.addSqlPanel(this.restoredConnection.sql,autoRun);document.title=(conncfg.sql_database||'default database')+'@'+conncfg.sql_server+'|'+_appName;this.refreshTablesMenu();}
else{var changed=false,oldconn=this.sqlDb.connection;if(conncfg.sql_server!==oldconn.sql_server||conncfg.sql_database!==oldconn.sql_database||conncfg.sql_user!==oldconn.sql_user){changed=true;}
if(!changed){this.sqlDb.connection=Ext.apply(oldconn,conncfg);this.sqlDb.setFlag('echosql',true);this.sqlDb.setFlag('pp',conncfg.flags_pp);delete conncfg.flags_pp;return true;}
else{Ext.Msg.confirm('Confirm connection info change','Changing the connection information will close any open tabs.  Do you want to continue?',function(btn,text){if(btn=='yes'){this.sqlDb.connection=Ext.apply(oldconn,conncfg);this.sqlDb.setFlag('echosql',true);this.sqlDb.setFlag('pp',conncfg.flags_pp);delete conncfg.flags_pp;Ext.getCmp('maintabs').removeAll();this.tables=[];document.title=(conncfg.sql_database||'default database')+'@'+conncfg.sql_server+'|'+_appName;this.refreshTablesMenu();_viewport.doLayout();}
else{return false;}},this);}}
return true;},scope:this}}});}
this.connectionWindow.setVisible(show);},addSqlPanel:function(defaultSql,autoRun){var p=Ext.getCmp('maintabs').add(new dbrui.SqlResultPanel({sqlDb:this.sqlDb,border:false,iconCls:'icon-sql',title:'SQL Query '+(++_numSqls),closable:true,defaultSql:defaultSql||'',plugins:this.getPluginsFor('sqlpanel'),gridplugins:this.getPluginsFor('sqlgrid'),autoRun:autoRun||false}));_viewport.doLayout();Ext.getCmp('maintabs').activate(p);},showTableEditor:function(table){var editor=this.tables[table];if(!editor){editor=new dbrui.SqlTableEditor({tableName:table,iconCls:'icon-table',sqlDb:this.sqlDb,border:false,title:table,closable:true,serverSidePaging:true,pageSize:100,plugins:this.getPluginsFor('tableeditor'),listeners:{'close':{fn:function(w){this.tables[table]=null;},scope:this}}});Ext.getCmp('maintabs').add(editor);_viewport.doLayout();this.tables[table]=editor;}
Ext.getCmp('maintabs').activate(editor);},_freeEditTableHandler:function(fld,e){if(e.keyCode===e.ENTER){var table=fld.getValue();var tableRX=new RegExp(table,"i");var clickies=_tablesMenuOpen.find('isClicky',true);for(var i=0,len=clickies.length;i<len;i++){var item=clickies[i];item.show();if(!tableRX.test(item.text)){item.hide();}}
_tablesMenuOpen.doLayout();}},_freeDropTableHandler:function(fld,e){if(e.keyCode===e.ENTER){var table=fld.getValue();var tableRX=new RegExp(table,"i");var clickies=_tablesMenuDrop.find('isClicky',true);for(var i=0,len=clickies.length;i<len;i++){var item=clickies[i];item.show();if(!tableRX.test(item.text)){item.hide();}}
_tablesMenuDrop.doLayout();}},refreshTablesMenu:function(){this.sqlDb.getAllCellCounts(function(sqld,resp,cellcounts){_tablesMenuOpen.removeAll();_tablesMenuDrop.removeAll();_tablesMenuOpen.add('Table Name + Enter');_tablesMenuOpen.addMenuItem({xtype:'textfield',width:140,enableKeyEvents:true,selectOnFocus:true,listeners:{'keyup':{fn:this._freeEditTableHandler,scope:this}}});_tablesMenuOpen.addSeparator();_tablesMenuOpen.add('<b>Select to Edit (#cells)</b>');_tablesMenuDrop.add('Table Name + Enter');_tablesMenuDrop.addMenuItem({xtype:'textfield',width:140,enableKeyEvents:true,selectOnFocus:true,listeners:{'keyup':{fn:this._freeDropTableHandler,scope:this}}});_tablesMenuDrop.addSeparator();_tablesMenuDrop.add('<b>Select to Drop (#cells)</b>');function openTableHandler(item,e){if(item.largeTable){Ext.Msg.confirm('Are you sure?','This table has a very large amount of data.  Opening this table for editing may be costly to the database server.  Do you want to continue?',function(btn,text){if(btn=='yes'){this.showTableEditor(item.tableName);}
else{return false;}},this);}else{this.showTableEditor(item.tableName);}}
function dropTableHandler(item,e){var n=item.tableName;Ext.Msg.confirm('Confirm Commit?','Are you sure you want to drop table '+n,function(btn,text){if(btn=='yes'){this.sqlDb.dropTable(n,function(resp){if(resp.data){if(this.tables[n]){this.tables[n].ownerCt.remove(this.tables[n]);this.tables[n]=null;}
this.refreshTablesMenu();}},this);}},this);}
var tableNames=[];for(var name in cellcounts){var cells=cellcounts[name];var label='<span '+
(cells>=_NUMCELLS_THRESHOLD?'class="dbr-largetable"':'')
+'>'+name+
(isNaN(cells)?'':' ('+cells+')')
+'</span>';_tablesMenuOpen.addMenuItem({text:label,tableName:name,largeTable:cells>=_NUMCELLS_THRESHOLD,iconCls:'icon-table',handler:openTableHandler,isClicky:true,scope:this});_tablesMenuDrop.addMenuItem({text:label,tableName:name,iconCls:'icon-table',handler:dropTableHandler,isClicky:true,scope:this});tableNames.push(name);}
_tablesMenuOpen.doLayout();_tablesMenuDrop.doLayout();this.tableNames=tableNames;},function(sqld,resp){Ext.Msg.alert('Something went wrong',(resp.log.error||'Unknown error occured when retrieving row counts'));},this);},openSqlLog:function(){if(!this.sqlLogWindow){this.sqlLogWindow=new Ext.Window({title:'SQL History',closable:true,closeAction:'hide',width:450,height:400,autoScroll:true,html:'',listeners:{'show':{fn:function(w){w.body.update(this.sqlDb.getLog().join('<hr/>'));},scope:this}},buttons:[{text:'Refresh',iconCls:'icon-refresh',handler:function(){this.sqlLogWindow.body.update(this.sqlDb.getLog().join('<hr/>'));},scope:this},{text:'Clear Log',iconCls:'icon-minus',handler:function(){this.sqlDb.clearLog();this.sqlLogWindow.body.update('');},scope:this}]});}
this.sqlLogWindow.show();}};}();Ext.onReady(dbrui.App.init,dbrui.App,true);
