pcwa.core.scope('pcwa.ext.view');

/***
 * pcwa.ext.view.ViewProvider - abstract base class for ViewProvider implementations
 */
pcwa.ext.view.ViewProvider = function ViewProvider(parent){
	this.vm = parent;
};
pcwa.ext.view.ViewProvider.prototype = {};

/***
 * pcwa.ext.view.AbstractGridViewProvider - Abstract base class for GridViewProvider implementations
 */
pcwa.ext.view.AbstractGridViewProvider = function AbstractGridViewProvider(parent){
	pcwa.ext.view.AbstractGridViewProvider.superclass.constructor.call(this, parent);

	this.gp = null;
	this.sm = null;
    this.cm = null;
};
Ext.extend(pcwa.ext.view.AbstractGridViewProvider, pcwa.ext.view.ViewProvider, {
    deleteSelected:	function deleteSelected(prompt){            
        var records = this.sm.getSelections();
        if( records.length > 0){
        	if( prompt == true ){
	        	Ext.MessageBox.confirm(	'Message',
	        							'Do you really want to delete the selected ' +
	        								this.vm.model.title + '?',
	        							function(btn){
							            	if (btn=='yes'){
							         			this.deleteSelected(false);
							         	  	}
							            },
							            this
							          );               
        	}else{
        		for( var i = 0; i < records.length; i++ ){
        			this.vm.model.deleteRecord(records[i], this.gp.getEl());
	        	}
        	}
        }else{
            Ext.MessageBox.alert('Message','Please select a ' + this.vm.model.title + ' to delete');
        }
    },
    getColumnModel: function getColumnModel(){
    	if ( !this.cm ){ this.cm = this.createColumnModel(); }
   		return this.cm;
    },
    getGridPanel: function getGridPanel(config){
    	config = config || {};
    	if ( !this.gp ){ this.gp = this.createGridPanel(config); }
    	return this.gp;
    },
    getSelectionModel: function getSelectionModel(){
    	if ( !this.sm ){ this.sm = this.createSelectionModel(); }
   		return this.sm;
    },
	createColumnModel: function createColumnModel(){ return this.cm; },
	createSelectionModel: function createSelectionModel(){ return this.sm; },
	createGridPanel: function createGridPanel(){ return this.gp; }
});

/***
 * pcwa.ext.view.GridViewProvider - ViewProvider implementation for GridPanels
 */
pcwa.ext.view.GridViewProvider = function GridViewProvider(parent){
	pcwa.ext.view.GridViewProvider.superclass.constructor.call(this, parent);

    this.enableFormEdit = false;
};
Ext.extend(pcwa.ext.view.GridViewProvider, pcwa.ext.view.AbstractGridViewProvider, {
    getGridPanel: function getGridPanel(config){
    	config = config || {};
    	pcwa.ext.view.GridViewProvider.superclass.getGridPanel.call(this, config);
    	if ( this.enableFormEdit === true && this.vm.formView ){
		   	this.gp.on({'rowdblclick':	this.onRowDblClick,
		   				scope:			this
    		});
    		this.vm.formView.onUpdate = this.onEditFormUpdate;
    		this.vm.formView.scope = this;
    	}
    	return this.gp;
    },
	onRowDblClick: function onRowDblClick ( grid, row, event ){
		this.vm.formView.editRecord( grid.getStore().getAt(row).id, grid.getEl() );
	},
    onEditFormUpdate: function onEditFormUpdate(record, store, lastOp){
		if ( lastOp == 'insert' ){
			record.commit();
			store.addSorted(record);
			var index = store.indexOf(record);
			this.sm.selectRow(index);
			this.gp.getView().focusRow(index);
		}else{
			this.vm.model.updateRecord(record);
		}
	},
	addNew: function addNew(){
    	if ( this.vm.formView ){
    		this.vm.formView.onUpdate = this.onEditFormUpdate;
    		this.vm.formView.scope = this;
    		this.vm.formView.editNew(this.gp.getEl());
    	}
	}
});

/***
 * pcwa.ext.view.EditorGridViewProvider - ViewProvider implementation for EditGridPanels
 */
pcwa.ext.view.EditorGridViewProvider = function EditorGridViewProvider(parent){
	pcwa.ext.view.EditorGridViewProvider.superclass.constructor.call(this, parent);
	
	this.autoUpdate = false;
};
Ext.extend(pcwa.ext.view.EditorGridViewProvider, pcwa.ext.view.AbstractGridViewProvider, {
    getGridPanel: function getGridPanel(config){
    	config = config || {};
    	pcwa.ext.view.GridViewProvider.superclass.getGridPanel.call(this, config);
    	if ( this.autoUpdate === true ){
    	}
    	return this.gp;
    }
});

/***
 * pcwa.ext.view.FormViewProvider - ViewProvider implementation for DataForms hosted in FormWindow
 */
pcwa.ext.view.FormViewProvider = function FormViewProvider(parent){
	pcwa.ext.view.FormViewProvider.superclass.constructor.call(this, parent);

	this.closeOnUpdate = false;
	this.width = 400;
	this.height = 150;

	this.onUpdate = null;
	this.onClose = null;
	this.scope = null;
};
Ext.extend(pcwa.ext.view.FormViewProvider, pcwa.ext.view.ViewProvider, {
	getFormPanel : function getFormPanel(config){
		config = config || {};
		return this.createFormPanel(config);
	},
	createFormPanel : function createFormPanel(config){ return null;},
	
	editNew : function editNew(animateTarget){
 		var editWin = new pcwa.ext.view.FormWindow({
 			title:			'Create',
            width:			this.width,
            height:			this.height,
            animateTarget:	animateTarget,
            focusField:		this.focusField,
            formPanel:		this.getFormPanel().setData	({
            												store:		this.vm.model.getStore(),
            												newRecord:	this.vm.model.getNewRecord()
            											}),
			onUpdate:		this.onUpdate,
			onClose:		this.onClose,
			scope:			this.scope,
			closeOnUpdate:	this.closeOnUpdate
		});
    	editWin.show();
	},

	editRecord : function editRecord(id, animateTarget){
		var editWin = new pcwa.ext.view.FormWindow({
            width:			this.width,
            height:			this.height,
            animateTarget:	animateTarget,
            focusField:		this.focusField,
            formPanel:		this.getFormPanel().setData	({
        													store:	this.vm.model.getStore(),
            												record:	this.vm.model.getStore().getById(id)
            											}),
			onUpdate:		this.onUpdate,
			onClose:		this.onClose,
			scope:			this.scope,
			closeOnUpdate:	this.closeOnUpdate
		});
    	editWin.show();
	}
});

/***
 * pcwa.ext.view.PanelRepeaterViewProvider - ViewProvider implementation for PanelRepeaters (experimental)
 */
pcwa.ext.view.PanelRepeaterViewProvider = function PanelRepeaterViewProvider(parent){
	pcwa.ext.view.PanelRepeaterViewProvider.superclass.constructor.call(this, parent);
};
Ext.extend(pcwa.ext.view.PanelRepeaterViewProvider, pcwa.ext.view.ViewProvider, {
		getPanelRepeater :			function getPanelRepeater(){
										var c = this.getPanelRepeaterConfig();
										var p = new pcwa.ext.view.PanelRepeater(c);
										return p;
									},
		getPanelRepeaterConfig :	function getPanelRepeaterConfig(){ return null;}		
});

/***
 * pcwa.ext.view.RepeatPanelViewProvider - ViewProvider implementation for RepeatPanels (experimental)
 */
pcwa.ext.view.RepeatPanelViewProvider = function RepeatPanelViewProvider(parent){
	pcwa.ext.view.RepeatPanelViewProvider.superclass.constructor.call(this, parent);
};
Ext.extend(pcwa.ext.view.RepeatPanelViewProvider, pcwa.ext.view.ViewProvider, {
	getRepeatPanel :		function getRepeatPanel(){ return new pcwa.ext.view.RepeaterForm(this.getRepeatPanelConfig());},
	getRepeatPanelConfig :	function getRepeatPanelConfig(){ return {};}		
});

/***
 * pcwa.ext.view.TreeViewProvider - ViewProvider implementation for TreePanels (experimental)
 */
pcwa.ext.view.TreeViewProvider = function TreeViewProvider(parent){
	pcwa.ext.view.TreeViewProvider.superclass.constructor.call(this, parent);
};
Ext.extend(pcwa.ext.view.TreeViewProvider, pcwa.ext.view.ViewProvider, {
	getTreePanel :			function getTreePanel(config){ return null;},
	getChildNodeConfig :	function getChildNodeConfig(record, node){ return {};}		
});


/***
 * pcwa.ext.view.ViewManager
 */
pcwa.ext.view.ViewManager = function ViewManager(model){
	this.model = model;
	this.gridView = new pcwa.ext.view.GridViewProvider(this);
	this.formView = new pcwa.ext.view.FormViewProvider(this);
	this.panelRepeaterView = new pcwa.ext.view.PanelRepeaterViewProvider(this);	
	this.repeatPanelView = new pcwa.ext.view.RepeatPanelViewProvider(this);
	this.treeView = new pcwa.ext.view.TreeViewProvider(this);
};
pcwa.ext.view.ViewManager.prototype = {};

