//
// rcmKostenstrukturGrid
// Felix Kosmalla
//
// erbt von r3baseGrid
//
//
// die Tabelle mit den Kostenstrukturen, also "Standard, Benchmark, etc"

var rcmKostenstrukturGrid = Ext.extend(r3baseGrid, {
	
	// loadStructure
	// 
	// config Objekt
	// 
	loadStructure:function(config){
		Ext.apply(this,config);
		this.backend = config.backendUrl;
		// this.tableName = config.tableName;
		

		Ext.Ajax.request({
			url: this.backend + this.tableName + '/Model',
			success: this.checkForComboStores,
			scope:this,
			method:'POST'
		});
		
		
			
	
		
		return this;
	},
	
	
	// checkForComboStores
	// 
	// überprüft ob Comboboxen enthalten sind und lädt die jeweiligen stores
	// 
	checkForComboStores:function(response){
		var tableOptions = Ext.util.JSON.decode(response.responseText);

		//init comboStores
		this.multiStores = new Object();
		this.multiStoresRaw = new Object();
		
		var comboCount = 0;
		
		Ext.each(tableOptions.fields, function(item){
			if(item.r3type == 'combo' || item.r3type == 'select_many' || item.r3type == 'select_one_radio'){
				comboCount++;				
			}
		});
		
		var requestCount = 0;
		
		// für Selectboxen und Multiselects
		Ext.each(tableOptions.fields, function(item){

			if(item.r3type == 'combo' || item.r3type == 'select_many' || item.r3type == 'select_one_radio'){


				Ext.Ajax.request({
					url: this.backend + item.fTable + "/" + item.fTableLabel + '/ComboStore',
					method:'POST',
					scope:this,
					success: function(response){
						requestCount++;
						// SimpleStore für Combobox erstellen
						var crudData = Ext.util.JSON.decode(response.responseText);
						
						this.multiStoresRaw[item.fTable+'_'+item.fTableLabel] = crudData.raw;
						
						var simpleStore = new Ext.data.SimpleStore(crudData);				
						
						this.multiStores[item.fTable+'_'+item.fTableLabel] = simpleStore;
						
						if(requestCount == comboCount){
							this.startGrid(tableOptions);
						}
						
					}
				});


			}
		},this);
		
		if(comboCount==0){
			this.startGrid(tableOptions);				
		}

	},
	
	

	
	
	// startGrid
	// 
	// verarbeitet Ajax Request und initiert die Klasse
	// 
	startGrid:function(tableOptions){
		// var tableOptions = Ext.util.JSON.decode(response.responseText);


		this.init(tableOptions);
		this.eventScope = this.eventScope || this;
		this.onStructureLoaded(this.eventScope);

	},
	
	
	// onStructureLoaded
	// 
	// EVENT
	// 
	onStructureLoaded:function(){
		
	},
	
	
	// onCellclick
	// 
	// EVENT
	// 
	onCellClick:function(e){
		
	},
	
	
	// ==================
	// = MODIFIKATIONEN =
	// ==================
	
	// setToolbarButtons
	// 
	// 
	setToolbarButtons:function(){
		if(Ext.isEmpty(this.toolbarButton)){
			// Standard Toolbar setzen
			this.toolbarButtons = [{
				text:'Eintrag hinzufügen',
				iconCls:'addIcon',
				handler:this.showAddWindow,
				scope:this			
			},{
				text:'Eintrag bearbeiten',
				iconCls:'editIcon',
				handler:this.showEditWindow,
				scope:this,
				id:'tbbEdit'
			},
			{
				text:'Eintrag löschen',
				iconCls:'deleteIcon',
				handler:this.confirmForDeletedLines,
				scope:this,
				id:'tbbDelete'
			}];
			
			
		}
		

	},
	
	selectKostenstruktur:function(){
		return;
		var selections = this.grid.selModel.getSelections();
		
		if(selections.length == 1){
			// das ist nur der interne zeiger der klasse, nicht das STATE objekt
			rcm.Application.Kostenebenen.kostenstruktur = selections[0].json.id;
			rcm.Application.Kostenebenen.kostenstrukturName = selections[0].json.name;
			
			
			
			
			rcm.Application.Kostenebenen.getColumns();
			// Ext.getCmp('')
			
		}
		
		if(selections.length == 0){
			Ext.MessageBox.alert('Fehler','Sie haben keine Kostenstruktur ausgewählt.');
		}
		
		if(selections.length > 1){
			Ext.MessageBox.alert('Fehler','Es darf nur ein Eintrag ausgewählt sein.');
		}
		
	},
	
	// setButtonGrid
	// 
	// 
	setButtonGrid:function(){
		this.buttonGrid = {
			layout:'border',
			border:false,
			
			items:[{
				region:'north',
				height:30,
				border:false,
				// title:'test',
				header:false,
				tbar:this.toolbarButtons
				// iconCls: this.windowIconCls
				
			},
			{
				region:'center',
				id:'grid_view',
				items: this.grid,
				border:false,
				autoScroll:true

			}]
		};
		
		
	},

	
	// registerGridEvents
	// 
	// 
	registerGridEvents:function(){
		this.grid.on('celldblclick',function(){
			this.showEditWindow();			
		},this);
		
		this.grid.on('cellclick',function(grid, cellRow, colRow, e){
			Ext.getCmp('tbbEdit').enable();
			Ext.getCmp('tbbDelete').enable();
			
			// this.onCellClick(grid, cellRow, colRow, e, this.eventScope);
		},this);	
	
	},
	
	
	// resetEditPanel
	// 
	// löscht alle Werte im EditPanel
	//
	/*
		TODO benötigt?
	*/
	resetEditPanel:function(){
		var items = this.editPanel.items.items;
		
		Ext.each(items,function(item, index){
			if(item.getXType() !='panel' && item.getXType() !='gridpanel'){
				item.setValue('');				
			}

		});
	},
	
	
	
	
	// 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);
			if(field){
				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('');				
					break;
				}
				
			}
			
			

		},this);
	},
	
	
	
	
	
	// 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.');
		}
		
		
		
		// rolf: ändern ist nur bei kostenstrukturen ohne daten möglich
		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);
		this.encoded_array = encoded_array;
		Ext.Ajax.request({
			method:'post',
			waitMsg:'Bitte warten..',
			scope:this,
			url:cfg_backend_url + "kostenebenen/checkKostenstrukturIsEmpty",
			params:{
				ebenenIds: encoded_array 
			},
			success:function(response){
		
				if(response.responseText=='1'){

					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);
							if(field){
								var tempValue = eval("data."+item.name);

								field.r3type = field.r3type || '-';

								switch (field.r3type) {
									case "-":
										item.setValue(tempValue);
									break;

									case "textfield":
										item.setValue(tempValue);
									break;	

									default:
										item.setValue(tempValue);
										break;
								}
							}else{
								// die grid laden
								if(!Ext.isEmpty(this.editPanelGrid.items)){
									this.editPanelGrid.remove(this.editPanelGrid.getComponent(0));
								}

								var remoteConfig = {
														backendUrl: cfg_backend_url, 
														tableName: 'bcm_kostenebenen',
														kostenstruktur: data.id,
														onStructureLoaded: function(scope){
															scope.editKostenebenenGrid.load();
															scope.editPanelGrid.add(scope.editKostenebenenGrid.buttonGrid);
															
															scope.editPanelGrid.doLayout();		
						
														},
														eventScope:this
													}
								this.editKostenebenenGrid = new rcmKostenstrukturEintraegeGrid().loadStructure(remoteConfig);
							}
						},this);
						return true;
					}else{
						return false;
					}					
				}else{
					Ext.MessageBox.alert('Fehler','Diese Kostenstruktur kann nicht geändert werden, da bereits Daten in ihr abgelegt wurden.');
					Ext.MessageBox.setIcon(Ext.MessageBox.WARNING);
				}				
			}			
		});
		// rolf
		
		
		
	},
	
	
	
	// compileEditPanelItems
	// 
	// modifiziert die Konfiguration this.editPanelOptions
	// 
	compileEditPanelItems:function(){
		this.editPanelOptions.items = [];
		
		Ext.each(this.fields,function(item, index){

			if(Ext.isEmpty(item.editOptions.xtype)){
				item.editOptions.xtype = 'textfield';
			}
			
			if(Ext.isEmpty(item.editOptions.fieldLabel)){
				item.editOptions.fieldLabel = item.label;
			}
			
			if(Ext.isEmpty(item.editOptions.name)){
				item.editOptions.name = item.column;
			}
			
			if(item.isIndex){
				item.editOptions.isIndex = true;
			}
			

			//Booleanwerte die nicht von YML interpretiert werden können müssen hier neu gesetzt werden
			
			if(item.editOptions.allowBlank == "false"){
				item.editOptions.allowBlank = false;
			}else{
				item.editOptions.allowBlank = true;
			}
			
			
			
			this.editPanelOptions.items.push(item.editOptions);
		},this);
		
		
		// Container für Grid erstellen
		
		this.editPanelGrid = new Ext.Panel({
			title:'Edit Container',
			id:'editPanelGrid',
			header:false,
			layout:'fit',
			height:200
		});	
		
		this.editPanelOptions.items.push(this.editPanelGrid);

	},
	
	
	// compileAddPanelItems
	// 
	// modifiziert die Konfiguration this.addPanelOptions
	// 
	compileAddPanelItems:function(){
		this.addPanelOptions.items = [];
		
		Ext.each(this.fields,function(item, index){
			
			
			
			item.addOptions.xtype = 'textfield';
			
			
			if(Ext.isEmpty(item.addOptions.fieldLabel)){
				item.addOptions.fieldLabel = item.label;
			}
			
			if(Ext.isEmpty(item.addOptions.name)){
				item.addOptions.name = item.column;
			}
			
			if(item.isIndex){
				item.addOptions.isIndex = true;
			}
			
			
			
			
			//Booleanwerte die nicht von YML interpretiert werden können müssen hier neu gesetzt werden
			
			if(item.addOptions.allowBlank == "false"){
				item.addOptions.allowBlank = false;
			}else{
				item.addOptions.allowBlank = true;
			}
			
			
			
			// item.addOptions.allowBlank = false;
			
			this.addPanelOptions.items.push(item.addOptions);
		},this);
		
		
		// Container für Grid erstellen

	},
	
	
	// 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();
		}
		
		// params.defaults = {width:100};

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

	},
	

	
	
	// registerGridEvents
	// 
	// 
	registerGridEvents:function(){
		this.grid.on('celldblclick',function(){
			this.editSelectedLine();
			// this.selectKostenstruktur();
		},this);
		
		this.grid.on('cellclick',function(){
			Ext.getCmp('tbbEdit').enable();
			Ext.getCmp('tbbDelete').enable();
		});	
	
	},
	
	
	
	// 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({
			method:'post',
			waitMsg:'Bitte warten..',
			scope:this,
			url:cfg_backend_url + "kostenebenen/checkKostenstrukturIsEmpty",
			params:{
				ebenenIds: encoded_array 
			},
			success:function(response){

				if(response.responseText=='1'){
				
						// 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: 'Bitte warten',
							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();
									rcm.Application.state.kostenstruktur.name = false;
									rcm.Application.state.kostenstruktur.id = false;
									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.');      
							}
						});
					
					
				}else{
					Ext.MessageBox.alert('Fehler','Die zu löschende Kostenstruktur ist nicht leer.');
					Ext.MessageBox.setIcon(Ext.MessageBox.WARNING);
				}
				
				
				
				
			}
			
			
		});
	}
		
	},
	
	
	
	// updateEntry
	//
	// Schickt alle Werte der (Text)Felder im addPanel an den Server
	updateEntry:function(){


		Ext.Ajax.request({
			method:'post',
			waitMsg:'Bitte warten..',
			scope:this,
			url:cfg_backend_url + "kostenebenen/checkKostenstrukturIsEmpty",
			params:{
				ebenenIds: this.encoded_array
			},
			success:function(response){
		
				if(response.responseText=='1'){

		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')
							rcm.Application.loadCombostores();
							rcm.Application.Kostenebenen.getColumns();
							
							rcm.Application.state.kostenstruktur.name = false;
							rcm.Application.state.kostenstruktur.id = false;
							
							
							this.editWindow.hide();
				            // Ext.MessageBox.alert();
				            this.dataStore.reload();
							this.resetEditPanel();				
				            break;
				          default:
				            Ext.MessageBox.alert('Fehler','Der Eintrag wurde nicht geändert.');
				            break;
				          }        
				        },
				        failure: function(response){
				          var result=response.responseText;
				          Ext.MessageBox.alert('error','could not connect to the database. retry later');          
				        }                      
				      });
			}else{
				Ext.MessageBox.alert('Fehler', "Diese Kostenstruktur kann nicht geändert werden, da bereits Daten in ihr abgelegt wurden.");
				Ext.MessageBox.setIcon(Ext.MessageBox.WARNING);
				
			}
		}
		});	

	},
	
	
	
	// 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');
							rcm.Application.loadCombostores();
				            this.dataStore.reload();
							this.resetAddPanel();	
							this.addWindow.hide();			
				            break;
				          default:
				            Ext.MessageBox.alert('Fehler','Der Eintrag wurde nicht hinzugefügt.');
				            break;
				          }        
				        },
				        failure: function(response){
				          var result=response.responseText;
				          Ext.MessageBox.alert('error','could not connect to the database. retry later');          
				        }                      
				      });

	},
	
	
	
	// 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';
		}
		

		
		Ext.each(params.items,function(item, index){
			if(item.name == 'position'){
				params.items[index].validator = function(value){
				
					// Namen rausfinden
					// form panel
					// var fp = this.
					for(var input in this.ownerCt.items.items){
						input = this.ownerCt.items.items[input];
						// if(input.name == 'id'){
						// 	var entryId = input.getValue();
						// }
						
						if(input.name == "id"){
							var bzggIdAusDb = input.getValue();
						}
						
						if(input.name == 'name'){
							var bzggNamePerInput = input.getValue();
						}
					}
					
					console.log('bzggIdAusDb',bzggIdAusDb);
					
					


					var indexByPosition = rcm.Application.Kostenebenen.kostenstrukturenTable.dataStore.findBy( function(r){  return r.get('position') == value;  }  );
					var recordByPositionIndex = rcm.Application.Kostenebenen.kostenstrukturenTable.dataStore.getAt(indexByPosition);
					
					// console.log('recordByPositionIndex',recordByPositionIndex);
					
					// var 

					
					
					


					if(indexByPosition !=-1 && parseInt(recordByPositionIndex.data.id) != bzggIdAusDb){
						return "Diese Positionsnummer ist schon vergeben";
					}else{
						return true;
					}
				}
			}
		});
		
		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';
		}
		
		Ext.each(params.items,function(item, index){
			if(item.name == 'position'){
				params.items[index].validator = function(value){
				
					// Namen rausfinden
					// form panel
					// var fp = this.
					for(var input in this.ownerCt.items.items){
						input = this.ownerCt.items.items[input];
						// if(input.name == 'id'){
						// 	var entryId = input.getValue();
						// }
						
						if(input.name == "id"){
							var bzggIdAusDb = input.getValue();
						}
						
						if(input.name == 'name'){
							var bzggNamePerInput = input.getValue();
						}
					}
					
					console.log('bzggIdAusDb',bzggIdAusDb);
					
					


					var indexByPosition = rcm.Application.Kostenebenen.kostenstrukturenTable.dataStore.findBy( function(r){  return r.get('position') == value;  }  );
					var recordByPositionIndex = rcm.Application.Kostenebenen.kostenstrukturenTable.dataStore.getAt(indexByPosition);
					
					// console.log('recordByPositionIndex',recordByPositionIndex);
					
					// var 

					
					
					


					if(indexByPosition !=-1 && parseInt(recordByPositionIndex.data.id) != bzggIdAusDb){
						return "Diese Positionsnummer ist schon vergeben";
					}else{
						return true;
					}
				}
			}
		});
		
		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);
	}
	
	
	

	


	
});
