Ext.ns('Mk');
/**
 * Uniwersalny obiekt grida
 * 
 * @class Mk.Grid
 * @extends Ext.grid.GridPanel
 * @xtype mkgrid
 * 
 * @param {Object} config - konfiguracja indywidualna grida (m.in. datastore i columnmodel)
 * 	paging	:	{Boolean} - czy ma byc dolaczone stronnicowanie w bbarze
 * 	search	:	{Boolean} - czy ma byc dolaczona wyszukiwarka w tbarze
 *	rowExpander	:	{Ext.ux.grid.RowExpander} - tplka do rowexpandera\
 *		Przykład użycia w gridzie jako "plugins:[]" :
 *			new Ext.ux.grid.RowExpander({
 *				tpl: new Ext.Template('<div style="padding:10px;">'+
 *					'<span><b>Opis bieżący:</b> {btdescription}</span><br/>'+
 *				'</div>')
 *				,module: 'rowexpander'
 *			})	 
 *	qtip	:	{String} - Nazwa kolumny z jsona której wartość będzie przypisana i wyświetlona jako podpowiedź
 *		Przykład uzycia w gridzie jako parametr:
 *			qtip:'description' 
 * 
 */
Mk.Grid = Ext.extend(Ext.grid.GridPanel, {
	constructor: function(config){
		
		//standardowe ustawienia gridow
		this.stripeRows = true;
		this.plain = true;
		this.loadMask = true;
		this.extendedSearch = false;

		
		config.viewConfig = config.viewConfig || {}
		
		Ext.applyIf(config.viewConfig,{
			emptyText: 'Brak elementów'
            ,forceFit:true
        });
	        
		if(Ext.isDefined(config.qtip) && Ext.isString(config.qtip))
			config.plugins = new Ext.ux.DataTip({
		    	tpl: '<div class="spirb-qtip">{'+config.qtip+'}</div>'
			});        
	        
        
        /**
         * Do dynamicznych gridów reszta funkcjonalności znajduje się w GridDatastores.js Spirb.Ds()
         */
		if(Ext.isDefined(config.store.metaData) && config.store.metaData==true){		
			config.viewConfig.onDataChange = function(){
				this.cm.config = [];
				this.cm.setConfig(this.grid.store.reader.jsonData.metaData.fields);
		      	this.syncFocusEl(0);
		    };
		}
		
        
		this.listeners = {
			afterlayout: function(p){
				this.view.refresh();
			}
		};
		
		config.plugins = config.plugins || [];		
		
		if (config.paging){
			
			var pagingToolbar = new Ext.PagingToolbar({
		         displayInfo: true
		        ,store: config.store
				,autoHeight: true
				,pageSize: Ext.isDefined(config.store) && Ext.isDefined(config.store.baseParams) && Ext.isDefined(config.store.baseParams.limit) ? config.store.baseParams.limit : Mk.Config.gridPageSort
				,displayMsg: 'Wyświetlam  {0} - {1} z {2} rekordów'
				,emptyMsg: 'Nie ma rekordów'
				,items: Ext.isDefined(config.pagingItems) ? config.pagingItems : [] 
			});
			
			
			if (Ext.isDefined(config.bbar) && config.bbar.constructor == Array){
				config.bbar.unshift(pagingToolbar);
			}
			else {
				this.bbar = pagingToolbar;
			}
		}
		
	
		if (config.search){
			
			if (!Ext.isDefined(config.tbar) && !Ext.isDefined(this.tbar)){
				this.tbar = [];
				this.tbar.push('->');
			}
			else {
				config.tbar.push('->');
			}
			
			
			try {
				var searchPlugin;
				
				if(Ext.isObject(config.search)){
					searchPlugin = new Mk.grid.Search(config.search);
				}
				else {
					searchPlugin = new Mk.grid.Search({
						width: Ext.isDefined(config.searchWidth) ? config.searchWidth : 350
						,autoFocus: Ext.isDefined(config.searchAutoFocus) ? config.searchAutoFocus : false
						,extendedSearch: Ext.isDefined(config.extendedSearch) ? config.extendedSearch : this.extendedSearch 						
					});
				}								
				config.plugins.push(searchPlugin);
			}
			catch(e) {
				Mk.Exceptions.log('Nie ma pluginu: ' + e);
			}
			
		}		
		
		if (Ext.isObject(config.rowExpander)) {			
			try {
				config.plugins.push(config.rowExpander);
			}
			catch(e) {
				Mk.Exceptions.log('Nie ma pluginu: ' + e);
			}				
		}
		
		
		if (Ext.isDefined(config.groupHeader)){
			try {
				config.plugins.push(config.groupHeader);
			}
			catch(e) {
				Mk.Exceptions.log('Nie ma pluginu: ' + e);
			}			
		}
		
		
		/**
		 * Przeładowuje grida i zaznacza wiersz na podstawie podanego id 
		 * @param {int} id
		 * @param {String} module - nazwa modułu w którym znajduje się metoda pobierająca informacje o tym od którego wiersza
		 * 	grid ma pobrać wiersze
		 * @param {String} method - nazwa metody która pobiera numer wiersza od którego grid ma pobrac wiersze
		 */
		this.loadAndSelectRowById = function(id, module, method) {
			
			var sort = this.getStore().getSortState(),
				params = {
					module: module
					,method: method
					,id: id
					,dir: Ext.isDefined(sort) && Ext.isDefined(sort.direction) ? sort.direction : ''
					,sort: Ext.isDefined(sort) && Ext.isDefined(sort.field) ? sort.field : ''
				};
			
			Ext.applyIf(params,this.getStore().baseParams);
			
			Mk.Ajax({
				url: Spirb.Config.url
				,params: params
				,displayMsg: false
				,scope: this
				,success: function(resp) {
					this.store.load({
						rowId: params.id
						,grid: this
						,params: {
							start: parseInt(resp.start)
						}
					});
				}
			});
		}

		Mk.Grid.superclass.constructor.call(this, config);
	}
});

/**
 * Rejestrujemy obiekcik aby była możliwość wykorzystywania go w  prosty sposób
 */
Ext.reg('mkgrid',Mk.Grid);

