//
// r3superBaseGrid
// Felix Kosmalla
//
//
// Klasse zum erstellen von Tabellen
//
// NICHT ZU VERWENDEN
// 
//
//

// Parameter
//

// obligatorische
// 
// columns				Array mit Objekten; 	die Spaltennamen wie sie von PHP kommen										LINK: http://extjs.com/deploy/dev/docs/?class=Ext.data.Record      -> create
// backend				String					Die URL zum Backend
// model				Array mit Objekten; 	Überschriften der Spalten mit Referenz zu Spaltennamen der Datenabnk 		LINK: http://extjs.com/deploy/dev/docs/?class=Ext.grid.ColumnModel
// tableNtableNameame			String
//
//

// optionale
//
// gridOptions			Objekt					Tabellen Optionen															LINK: http://extjs.com/deploy/dev/docs/?class=Ext.grid.GridPanel
// jsonReaderOptions	Objekt					Reader Optionen																LINK: http://extjs.com/deploy/dev/docs/?class=Ext.data.JsonReader
// dataProxyOptions		Objekt					Data Proxy Optionen															LINK: http://extjs.com/deploy/dev/docs/?class=Ext.data.DataProxy
// dataStoreOptions		Objekt					Data Store Optionen															LINK: http://extjs.com/deploy/dev/docs/?class=Ext.data.Store
// addPanelOptions		Objekt					Optionen vom AddPanel							
// editPanelOptions		Objekt					Optionen vom EditPanel
// pagination			Bool					default : false
// paginationEPP		Integer					Anzahl der Einträge pro Seite; default : 5
// toolbarButtons	
//

// Funktionen
// editSelectedLine 			Zeile wird ins editPanel geladen
// confirmForDeletedLines		Zeilen werden nach Abfrage gelöscht



// Hinweise
//
// Die Parameter beim Listing der Tabelle stehen NICHT im Proxy sondern im Data Store


//Todos
/*
	TODO Validation berücksichtigen
*/


var r3superBaseGrid = fClass({
	
	initSuper:function(){
		// var config = config || {};		
		// Ext.apply(this,config);
		
		this.initRenderer();
				
		// ====================
		// = Table Listing =
		// ====================		
				
		// dataRecord erstellen 
		this.createRecord(this.columns);  	
	

		// colModel erstellen
		this.setColModel(this.model); 		
	
				
		// dataReader erstellen
		this.setDataReader(this.jsonReaderOptions);  
	
		
		// dataProxy erstellen
		this.setDataProxy(this.dataProxyOptions); 
	

		// dataStore erstellen
		this.setDataStore(this.dataStoreOptions);
	



		// Toolbar

		
		
		// ==================
		// = Table Editing =
		// ==================
		
		//createAddPanel
		this.createAddPanel(this.addPanelOptions);
	
		
		//createEditPanel
		this.createEditPanel(this.editPanelOptions);
	
		this.createWindows();	
		
		this.setToolbarButtons();		
		
		
		// // ==============
		// // = Pagination =  funktioniert irgenwie noch nicht
		// // ==============
		// 
		// if(this.pagination){
		// 	this.paginationEPP = this.paginationEPP || 5;
		// 	
		// 	this.gridOptions.bbar = new Ext.PagingToolbar({
		// 	                pageSize: this.paginationEPP,
		// 	                store: this.dataStore,
		// 	                displayInfo: true
		// 	            });
		// 	
		// }


		// grid erstellen
		this.setGrid(this.gridOptions);

 		this.setButtonGrid();	
		
		//Kontext menu erstellen und registrieren
		this.registerContextMenu();	
	
		this.registerGridEvents();
		
		return this;										
	},

	//table listing
	dataRecord: 	null,
	dataReader: 	null,
	dataProxy: 		null,
	dataStore: 		null,
	colModel: 		null,
	grid: 			null,
	buttonGrid: 	null,
	renderer: 	 	null,
	
	
	addPanel:		null,
	editPanel:     	null, 
	
	selectedRow: 	null,   //momentan nur fürs Kontextmenü
	contextMenu: 	null,
	
	multiStores: 	null,  //hier werden die Stores für die Comboboxen usw gelagert
	multiStoresRaw: null,  //hier werden die Stores für das Rendering gelager
	
	
	//Funktionen
	
	// ==========
	// = PUBLIC =
	// ==========
	
	// load
	// 
	// gibt dem Datastore den Befehl zum Laden der Daten
	//
	load:function(){

		Ext.Msg.wait('Daten werden geladen...',false,waitDialogConfig);
		this.dataStore.load();
	},
	
	
	
	
	// ===========
	// = PRIVATE =
	// ===========
	
	
	
	// createRecord
	//
	createRecord:function(params){

		this.dataRecord = new Ext.data.Record.create(params);		
	},
	
	
	
	//setDataReader
	//
	setDataReader:function(params){
		var params = params || {};
		
		if(Ext.isEmpty(params.root)){
			params.root = 'results';
		}
		


		this.dataReader = new Ext.data.JsonReader(params, this.dataRecord);
	},
	
	
	
	//setDataProxy
	//
	setDataProxy:function(params){
		var params = params || {};
		
		if(Ext.isEmpty(params.method)){
			params.method = 'POST';
		}

		if(Ext.isEmpty(params.url)){
			params.url = this.backend + this.tableName + "/Data";
		}
		

		
		this.dataProxy = new Ext.data.HttpProxy(params);		
	},
	
	
	
	//setDataStore
	//
	setDataStore:function(params){
		var params = params || {};
		
		if(Ext.isEmpty(params.proxy)){
			params.proxy = this.dataProxy;
		}

		if(Ext.isEmpty(params.reader)){
			params.reader = this.dataReader;
		}
		
		if(Ext.isEmpty(params.remoteSort)){
			params.remoteSort = true;
		}
		
		if(!Ext.isEmpty(this.orderBy)){
			params.sortInfo = {field:this.orderBy, direction:this.orderDir};
			// console.log('params.sortInfo',params.sortInfo);
		}
		
		this.dataStore = new Ext.data.Store(params);
		
		
		this.dataStore.on('exception',function(misc){
			alert('exception:');
			
			console.log(misc);
		});
		
		this.dataStore.on('load',function(){
			Ext.MessageBox.hide();
			if(!Ext.isEmpty(Ext.getCmp('tbbEdit'))){
				Ext.getCmp('tbbEdit').disable();
				Ext.getCmp('tbbDelete').disable();
			}
		});
	},
	
	
	//setColModel
	//
	setColModel:function(params){
		this.colModel = new Ext.grid.ColumnModel(this.model);	
		
		Ext.each(this.fields,function(item, index){
			if(item.isPassword){
				this.colModel.setRenderer(index,this.renderer.makeRenderPassword);
			}else{
				this.colModel.setRenderer(index,this.renderer.getRenderer(item,this));				
			}

		},this);
		
		// this.colModel.setRenderer(9,this.renderer.getRenderer(field));
	},
	
	
	//setGrid
	setGrid:function(params){
		var params = params || {};
		
		if(Ext.isEmpty(params.store)){
			params.store = this.dataStore;
		}
		
		if(Ext.isEmpty(params.cm)){
			params.cm = this.colModel;
		}
		
		params.cls = 'vline-on';
		
		params.border = false;
		
		params.enableHdMenu = false;
		

				
		this.grid = new Ext.grid.GridPanel(params);
	},
	
	
	
	
	// =================
	// = Table Adding =
	// =================



	
	
	//createAddPanelButtons
	//
	// wird i.d.R. von createAddPanel aufgerufen
	//
	// Konfiguriert die Buttons für das AddPanel (z.B. speichern, abbrechen, etc.)
	//
	createAddPanelButtons:function(){
		var buttons = [
			{
				text:'Abbrechen',
				scope:this,
				iconCls:'cancelIcon',
				handler:function(){
					this.resetAddPanel();
					this.addWindow.hide();
				}
			},
			{
				text:'Speichern',
				scope:this,
				iconCls:'acceptIcon',
				handler:function(){
						if(this.checkAddPanelIsValid()){
							this.createEntry();							
						}else{
							Ext.MessageBox.alert('Fehler','Bitte überprüfen Sie die markierten Felder');
						}

						
					}
			}
		
		];

		return buttons;
	},
	
	
	
	// createEntry
	// 
	// wird i.d.R. von dem Speichern Button aufgerufen (createAddPanelButtons)
	//
	// Schickt alles Werte der (Text)Felder im addPanel an den Server
	createEntry:function(){

		var values = this.getAddFieldsValues();
		
		
		Ext.Ajax.request({   
				        waitMsg: 'Bitte warten...',
				        url: this.backend + this.tableName + "/Data/create",
				        params: {
				          task: "ADD",
				          values:   Ext.util.JSON.encode(values)
				        }, 
						scope:this,
				        success: function(response){              
				          var result=eval(response.responseText);
				          switch(result){
				          case 1:
				            // Ext.MessageBox.alert('OK','Eintrag hinzugefügt');
				            this.dataStore.reload();
							this.resetAddPanel();	
							this.addWindow.hide();	
							rcm.Application.loadCombostores(null,null,true);		
				            break;
				          default:
				            Ext.MessageBox.alert('Fehler','Eintrag nicht hinzugefügt');
				            break;
				          }        
				        },
				        failure: function(response){
				          var result=response.responseText;
				          Ext.MessageBox.alert('error','could not connect to the database. retry later');          
				        }                      
				      });

	},
	
	
	// getAddFieldsValues
	//
	// gibt einen Array in der Form 'name'=>'value' aus allen Textfeldern aus dem AddPanel aus
	//
	// Felder mit der Option isIndex werden nich berücksichtigt
	//
	getAddFieldsValues:function(){
		var items = this.addPanel.items.items;
		
		var valuePairs = new Object();  // new Object weil new Array keine Strings als Keys erlaubt
		
		Ext.each(items,function(item, index){
			if(!item.isIndex){
				var field = this.getFieldByName(item.name);
				switch(field.r3type){
					case "select_many":
						//checkboxen durchgehen
						var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
						var checkboxes = new Array();
						
						for(var box in dataStore){
							if(Ext.getCmp('cb_add_'+field.fTable+'_'+field.fTableLabel+'_'+box).getValue()){

								checkboxes.push(Ext.getCmp('cb_add_'+field.fTable+'_'+field.fTableLabel+'_'+box).getRawValue());
							}
						}
		
						valuePairs[item.name] = checkboxes;
					break;
					case "select_one_radio":
						//checkboxen durchgehen
						var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
						var  i = 0;
						for(var box in dataStore){
							i++;
							if(i == 1){ //erstes Element abgreifen
								var value = Ext.getCmp('rd_add_'+field.fTable+'_'+field.fTableLabel+'_'+box).getGroupValue();
							}
						}
							
						valuePairs[item.name] = value;
					break;
					
					default:
						valuePairs[item.name] = item.getValue();					
					break;
				}
				
				
				
				// valuePairs[item.name] = item.getValue();				
			}
		},this);
		
		return valuePairs;
	},
	
	// resetAddPanel
	// 
	// löscht alle Werte im AddPanel
	//
	resetAddPanel:function(){
		var items = this.addPanel.items.items;
		
		
		
		
		Ext.each(items,function(item, index){
			
			var field = this.getFieldByName(item.name);
			
			switch(field.r3type){
				case "select_many":
					//alle boxen demarkieren
					var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
					for( var box in dataStore ) {

						var cb_id = "cb_add_"+field.fTable+'_'+field.fTableLabel+'_'+box;
						Ext.getCmp(cb_id).setValue(false);							
					}
				
				break;
				case "select_one_radio":
					//alle radios demarkieren
					var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
					for( var box in dataStore ) {
						var rd_id = "rd_add_"+field.fTable+'_'+field.fTableLabel+'_'+box;
						Ext.getCmp(rd_id).setValue(false);							
					}
				
				break;
				default:
					item.setValue('');			
					item.clearInvalid();	
				break;
			}
			

		},this);
	},
	
	
	
	// =================
	// = Table Editing =
	// =================
	
	
	
	// createEditPanel
	//
	// siehe createAddPanel
	//	
	createEditPanel:function(params){

		
		var params = params || {};
		
		if(Ext.isEmpty(params.labelAlign)){
			params.labelAlign = 'left';
		}
		
		if(Ext.isEmpty(params.bodyStyle)){
			params.bodyStyle = 'padding:5px';
		}
		
		if(Ext.isEmpty(params.items)){
			params.items = {};
		}
		
		if(Ext.isEmpty(params.buttons)){
			params.buttons = this.createEditPanelButtons();
		}
		
		if(Ext.isEmpty(params.labelWidth)){
			params.labelWidth = 175;
		}
		
		

		
		
		params.defaults = {width:300};
		


		this.editPanel = new Ext.FormPanel(params);	

	},
	
	
	//createAddPanel
	//
	// erstellt das AddPanel und legt es unter this.addPanel ab
	//
	createAddPanel:function(params){

		var params = params || {};
		
		if(Ext.isEmpty(params.labelAlign)){
			params.labelAlign = 'left';
		}
		
		if(Ext.isEmpty(params.bodyStyle)){
			params.bodyStyle = 'padding:5px';
		}
		
		if(Ext.isEmpty(params.items)){
			params.items = {};
		}
		
		if(Ext.isEmpty(params.buttons)){
			params.buttons = this.createAddPanelButtons();
		}
		
		
		if(Ext.isEmpty(params.labelWidth)){
			params.labelWidth = 175;
		}
		
		
		
		params.defaults = {width:300};
		
		
		this.addPanel = new Ext.FormPanel(params);
	},
	
	
	
	//createEditPanelButtons
	//
	// wird i.d.R. von createEditPanel aufgerufen
	//
	// Konfiguriert die Buttons für das EditPanel (z.B. speichern, abbrechen, etc.)
	//
	createEditPanelButtons:function(){
		var buttons = [
			{
				text:'Abbrechen',
				scope:this,
				iconCls:'cancelIcon',
				handler:function(){
					this.resetEditPanel();
					this.editWindow.hide();
				}
			},
			{
				text:'Speichern',
				scope:this,
				iconCls:'acceptIcon',
				handler:function(){
					if(this.checkEditPanelIsValid()){
						this.updateEntry();						
					}else{
						Ext.MessageBox.alert('Fehler','Bitte überprüfen Sie die markierten Felder');
					}

					}
			}
		
		];
		
		return buttons;
	},
	
	
	// resetEditPanel
	// 
	// löscht alle Werte im EditPanel
	//
	/*
		TODO benötigt?
	*/
	resetEditPanel:function(){
		var items = this.editPanel.items.items;
		
		Ext.each(items,function(item, index){
			item.setValue('');
		});
	},
	
	
	
	// updateEntry
	//
	// Schickt alle Werte der (Text)Felder im addPanel an den Server
	updateEntry:function(){

		var values = this.getEditFieldsValues();
		
		
		Ext.Ajax.request({   
				        waitMsg: 'Bitte warten...',
				        url:this.backend+ this.tableName + "/Data/update",
				        params: {
				          task: 	"UPDATE",
				          values:   Ext.util.JSON.encode(values),
						  index: 	this.getIndexFromEditField()
				        }, 
						scope:this,
				        success: function(response){              
				          var result=eval(response.responseText);
				          switch(result){
				          case 1:
							// this.growl('OK','Eintrag geändert')
							this.editWindow.hide();
				            // Ext.MessageBox.alert();
				            this.dataStore.reload();
							this.resetEditPanel();		
							rcm.Application.loadCombostores(null,null,true);		
				            break;
				          default:
				            Ext.MessageBox.alert('Fehler','Eintrag nicht geändert');
				            break;
				          }        
				        },
				        failure: function(response){
				          var result=response.responseText;
				          Ext.MessageBox.alert('error','could not connect to the database. retry later');          
				        }                      
				      });

	},
	
	
	// getEditFieldsValues
	//
	// gibt einen Array in der Form 'name'=>'value' aus allen Textfeldern aus dem AddPanel aus
	//
	// Felder mit der Option isIndex werden NICHT berücksichtigt
	//
	getEditFieldsValues:function(){
		var items = this.editPanel.items.items;
		
		var valuePairs = new Object();  // new Object weil new Array keine Strings als Keys erlaubt
		
		Ext.each(items,function(item, index){
			if(!item.isIndex){
				var field = this.getFieldByName(item.name);
				if(field){
					switch(field.r3type){
						case "select_many":
							//checkboxen durchgehen
							var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
							var checkboxes = new Array();

							for(var box in dataStore){
								if(Ext.getCmp('cb_edit_'+field.fTable+'_'+field.fTableLabel+'_'+box).getValue()){

									checkboxes.push(Ext.getCmp('cb_edit_'+field.fTable+'_'+field.fTableLabel+'_'+box).getRawValue());
								}
							}

							valuePairs[item.name] = checkboxes;

						break;
						case "select_one_radio":
							//checkboxen durchgehen
							var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
							var  i = 0;
							for(var box in dataStore){
								i++;
								if(i == 1){ //erstes Element abgreifen
									var value = Ext.getCmp('rd_edit_'+field.fTable+'_'+field.fTableLabel+'_'+box).getGroupValue();
								}
							}

							valuePairs[item.name] = value;
						break;

						default:
							valuePairs[item.name] = item.getValue();					
						break;
					}					
				}
				

				

												
			}
		},this);
		
		return valuePairs;
	},
	
	// getFieldByName
	// 
	// gibt das entsprechende Feld aus dem Model zurück 
	// 
	getFieldByName:function(fieldName){
		var returner = false;
		
		Ext.each(this.fields, function(field,index){
			if(field.column == fieldName){
				returner = field;
			}
		});
		
		return returner;
	},
	
	// editSelectedLine
	//
	// lädt die Daten der ausgewählten Zeile in das Edit Panel
	//
	editSelectedLine:function(){
		var selections = this.grid.selModel.getSelections();
		var valid = true;
		
		//die folgenden IF Abfragen machen nur Sinn, wenn das Event zum Editieren nicht auf dem Doppelklick auf eine Zeile liegt
		
		if(selections.length > 1){
			valid = false;
			Ext.MessageBox.alert('Fehler','Es kann nur ein Datensatz auf einmal bearbeitet werden');
		}
		if(selections.length == 0){
			valid = false;
			Ext.MessageBox.alert('Fehler','Es muss ein Datensatz ausgewählt sein');
		}
		
		if(valid){
			this.editWindow.show();
			var editPanelFields = this.editPanel.items.items;
			var data = selections[0].json;

			
			Ext.each(editPanelFields,function(item,index){
				var field = this.getFieldByName(item.name);
				var tempValue = eval("data."+item.name);


				
				field.r3type = field.r3type || '-';
																				
				switch (field.r3type) {
					case "-":
						item.setValue(tempValue);
					break;
					case "textarea":
						item.setValue(tempValue);
					case "textfield":
						item.setValue(tempValue);
					case "datefield":
						item.setValue(tempValue);
					break;
					case "checkbox":
						if(tempValue == 1){
							item.setValue(1);
						}else{
							item.setValue('0');
						}
					break;
					case "numberfield":
						item.setValue(parseInt(tempValue));
					break;
					case "datetimefield":
						item.setValue(tempValue);
					break;
					case "select_many":
						//alle boxen demarkieren
						var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
						for( var box in dataStore ) {
							var cb_id = "cb_edit_"+field.fTable+'_'+field.fTableLabel+'_'+box;
							Ext.getCmp(cb_id).setValue(false);							
						}

						var ids = Ext.util.JSON.decode(tempValue);
						
						Ext.each(ids,function(id){
							var cb_id = "cb_edit_"+field.fTable+'_'+field.fTableLabel+'_'+id;
							Ext.getCmp(cb_id).setValue(true);
						},this);					


					break;
					case "select_one_radio":
						//alle boxen demarkieren
						var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
						for( var box in dataStore ) {
							var cb_id = "rd_edit_"+field.fTable+'_'+field.fTableLabel+'_'+box;
							Ext.getCmp(cb_id).setValue(false);							
						}

						//checkboxen durchgehen
						var dataStore = this.multiStoresRaw[field.fTable+'_'+field.fTableLabel];
						var  i = 0;
						for(var box in dataStore){
							i++;
							if(i == 1){//erstes Element abgreifen
								var value = Ext.getCmp('rd_edit_'+field.fTable+'_'+field.fTableLabel+'_'+box).setValue(tempValue);
							}
						}
						
					break;
					case "combo":
						item.setValue(tempValue);
					break;
					default:
						item.setValue(tempValue);
						break;

				}
				
				
				if(field.isPassword){
					item.setValue('');
				}
				
				item.clearInvalid();
								
			},this);

			return true;
		}else{
			return false;
		}
	},
	
	
	
	// getIndexFromEditField
	// 
	// gibt den Wert des Index Felds aus
	// gibt bei nicht existierendem Index Feld false aus
	//
	// Hinweis: das index Feld ist das Feld mit der Eigenschaft isIndex
	// 
	getIndexFromEditField:function(){
		var editPanelFields = this.editPanel.items.items;
		var returner = false;

		Ext.each(editPanelFields,function(item){
			if(item.isIndex){
				returner = item.getValue();
			}
		});
		
		return returner;
	},
	
	
	
	
	
	
	
	// ================
	// = Context Menu =
	// ================
	
	
	registerContextMenu:function(){
		this.contextMenu = new Ext.menu.Menu({
		      id: 'contextMenu',
		      items: [
		      { text: 'Datensatz bearbeiten', handler: this.editSelectedLine, scope:this, iconCls:'editIcon'},
		      { text: 'Datensatz löschen', handler: this.confirmForDeletedLines, scope:this, iconCls:'deleteIcon' }
		      ]
		   });
		if(!this.disableButtons){
			this.grid.addListener('rowcontextmenu', this.onGridContextMenu,this);			
		}

	},
	
	onGridContextMenu:function(grid, rowIndex, e) {
	    e.stopEvent();
	    var coords = e.getXY();
	    this.contextMenu.rowRecord = grid.store.getAt(rowIndex);
	    this.grid.selModel.selectRow(rowIndex);
	    this.selectedRow=rowIndex;
	    this.contextMenu.showAt([coords[0], coords[1]]);
	 },
	
	
	
	// =====================
	// = Datensatz löschen =
	// =====================
	
	
	
	// getNameOfIndexColumn
	// 
	// gibt den Namen der Index Spalte aus
	// läuft über die columns Funktion von this.init
	/*
		TODO wo könnte man isIndex noch unterbringen / auslesen?
	*/ 
	getNameOfIndexColumn:function(){
		var returner = false;
		
		Ext.each(this.columns,function(item){
			if(!Ext.isEmpty(item.isIndex)){
				returner = item.name;
			}
		});	
		
		return returner;
	},
	
	
	
	// deleteSelectedLine
	// 
	// löscht nach Confirm den ausgewählten Datensätze
	// 
	//
	/*
		TODO hier wird this.selectedRow benutzt, is das okay?
	*/
	/*
		TODO vielleicht noch unterschied zwischen einem und mehreren datensätzen?
	*/
	//
	confirmForDeletedLines:function(){
		Ext.MessageBox.confirm('Bestätigung','Datensätze wirklich löschen?', this.sendDeleteRequest, this);				
	},
	
	
	// sendDeleteRequest
	// 
	// Löscht den Eintrag in der Datenbank
	// 
	sendDeleteRequest:function(btn){
		if(btn=='yes'){
			var selections = this.grid.selModel.getSelections();
			var entries = [];
			for(i = 0; i< this.grid.selModel.getCount(); i++){
				var sel = selections[i].json;
				var indexCol = this.getNameOfIndexColumn();
				entries.push(eval("sel."+indexCol));
			}
			var encoded_array = Ext.encode(entries);

			Ext.Ajax.request({  
				waitMsg: 'Please Wait',
				url: this.backend + this.tableName +  '/Data/delete', 
				scope:this,
				params: { 
					task: "DELETE", 
					ids:  encoded_array,
					index: this.getNameOfIndexColumn()
				}, 
				success: function(response){
					var result=eval(response.responseText);
					switch(result){
						case 1:  // Success : simply reload
						this.dataStore.reload();  
						rcm.Application.loadCombostores(null,null,true);
						break;
						default:
						Ext.MessageBox.alert('Warnung','Es konnten nicht alle Datensätze gelöscht werden.');
						break;
					}
				},
				failure: function(response){
					var result=response.responseText;
					Ext.MessageBox.alert('Fehler','Es konnte keine Verbindung zur Datenbank aufgebaut werden.');      
				}
			});
		}
	},
	
	
	// growl
	// 
	// ein Alert mit zeitlicher Verzögerung
	growl:function(title,message,delay){
		var delay = delay || 750;
		Ext.MessageBox.alert(title,message);
		var alertDelay = new Ext.util.DelayedTask();
		alertDelay.delay(delay,function(){
			Ext.MessageBox.hide();
		});
	},
	
	
	// setButtonGrid
	// 
	// 
	setButtonGrid:function(){
		this.buttonGrid = {
			layout:'border',
			border:false,
			width:'auto',
			items:[{
				region:'north',
				height:50,
				border:false,
				title:this.moduleTitle,
				tbar:this.toolbarButtons,
				iconCls: this.windowIconCls
				
			},
			{
				region:'center',
				id:'grid_view',
				items: this.grid,
				border:false,
				autoScroll:true

			}]
		};
		
		
	},
	
	
	// createWindows
	// 
	// erstellt das Ändern- und Erstellenfenster und legt es in addWindow und editWindow ab
	createWindows:function(){
		this.addWindow = new Ext.Window({
			autoScroll:true,
			width:515,
			iconCls: 'addIcon',
			modal:true,
			title:'Eintrag hinzufügen',
			items:this.addPanel,
			closeAction:'hide',
			y:50
		});
		
		this.addWindow.on('show',function(){
			selectFirstInput(this);
		});
		
		this.editWindow = new Ext.Window({
			autoScroll:true,
			width:515,
			modal:true,
			iconCls:'editIcon',
			title:'Eintrag ändern',
			items:this.editPanel,
			closeAction:'hide',
			y:50
		});
		
		this.editWindow.on('show',function(){
			selectFirstInput(this);
		});
		
		
	},
	
	
	showAddWindow:function(){

		this.addWindow.show();
		this.resetAddPanel();
	},
	
	showEditWindow:function(){
		
		this.editSelectedLine();
		// this.editWindow.show();	
		// 
		// 	console.log('show');
		// }

	},
	
	
	// setToolbarButtons
	// 
	// 
	setToolbarButtons:function(){
		if(Ext.isEmpty(this.toolbarButton)){
			// Standard Toolbar setzen
			this.toolbarButtons = [{
				text:'Eintrag hinzufügen',
				iconCls:'addIcon',
				handler:this.showAddWindow,
				scope:this,
				disabled: this.disableButtons
			},{
				text:'Eintrag bearbeiten',
				iconCls:'editIcon',
				handler:this.showEditWindow,
				scope:this,
				id:'tbbEdit'
			},
			{
				text:'ausgwählte Einträge löschen',
				iconCls:'deleteIcon',
				handler:this.confirmForDeletedLines,
				scope:this,
				id:'tbbDelete'
			}];
			
			
		}
		

	},
	
	// registerGridEvents
	// 
	// 
	registerGridEvents:function(){
		this.grid.on('celldblclick',function(){
			if(!this.disableButtons){
				this.showEditWindow();							
			}

		},this);
		
		this.grid.on('cellclick',function(){
			if(!this.disableButtons){

				if(!Ext.isEmpty(Ext.getCmp('tbbEdit'))){

					Ext.getCmp('tbbEdit').enable();				
				}

				if(!Ext.isEmpty(Ext.getCmp('tbbDelete'))){
					Ext.getCmp('tbbDelete').enable();				
				}
				
				
			}

			
		},this);	
	
	},
	
	
	initRenderer:function(){
		
		this.renderer = new r3fieldRenderer();
		
	},
	
	
	// ===============
	// = Validierung =
	// ===============
	
	checkAddPanelIsValid:function(){
		var addPanelFields = this.addPanel.items.items;
		var valid = true;

		
		Ext.each(addPanelFields,function(item,index){
			if(this.getFieldByName(item.name)){
				if(!item.isValid()){

					valid = false;
				}
			}
		},this);
		
		// return false;
		return valid;
		
	},
	
	checkEditPanelIsValid:function(){
		var editPanelFields = this.editPanel.items.items;
		var valid = true;

		
		Ext.each(editPanelFields,function(item,index){
			if(this.getFieldByName(item.name)){
				if(!item.isValid()){
					valid = false;
				}
			}
		},this);
		
		return valid;
	}
	
	
	
});





//PLAY!








