
Ext.namespace('myNameSpace');
myNameSpace.myModule = function(){
    var colModel;    
	var ds;     
	var grid;        
    var myReader;    
    var myRecordObj; 
    var primaryKey='id';
    var controller = '/lender_worksheet/lender_worksheet_ajax/';
    var setupDataSource = function(){
        myRecordObj = Ext.data.Record.create([
            {name: primaryKey, sortType: 'asInt'},
            {name: 'label', mapping: 'label', sortDir: 'ASC', sortType: 'asUCString'},
			{name: 'data_type'}, // possible values: 
			{name: 'is_category'},
			{name: 'category_id'},
            {name: 'lender1'},
            {name: 'lender2'},  
            {name: 'lender3'},
            {name: 'lender4'},
            {name: 'lender5'}
        ]);

        myReader = new Ext.data.JsonReader( 		
		{   root: 'results', 		
            totalProperty: 'total',      
            id: primaryKey            
        },
            myRecordObj
        );
		
        ds = new Ext.data.Store({
            proxy: new Ext.data.HttpProxy({
                url: controller,
                method: 'POST'
            }),   
            baseParams:{task: "read"},			
            reader: myReader
        });
	};

	var ttRenderer = function(value,metadata,record,rowIndex,colIndex,store)
	{
		// if record is category set formatting and tooltip
		if(record.data.is_category == 1)
		{
			// glossary_value = value.replace(/\s+/g, '-');
			// return '<a class="glossary_term" href="/glossary/' + glossary_value + '.htm" rel="/glossary/index/get_update_term/' + glossary_value + '">' + value + '</a>';
			return '<h3 ext:qtitle="Definition" ext:qtip="' + value + '">' + value + '</h3>';
		}
		else
		{
			// record.data.label.search(/total/i) > -1
			if (record.data.id == 23 || record.data.id == 33)
			{
				return '<span class="grid-label grid-total" ext:qtitle="Definition" ext:qtip="' + value + '">' + value + '</span>';
			}
			else
			{
				return '<span class="grid-label" ext:qtitle="Definition" ext:qtip="' + value + '">' + value + '</span>';
			}
		}
	}
	
    var getColumnModel = function(){
        if(!colModel) {
			// instantiate ColumnModel
            colModel = new Ext.grid.ColumnModel([
				{dataIndex: 'label',   header: 'Information', id: 'classLabel', sortable: false, width: 200, menuDisabled: true, resizable: false},
				{dataIndex: 'lender1', header: 'Vendor 1', sortable: false, width: 105, menuDisabled: true, fixed: true, resizable: false, editor: new Ext.form.TextField({allowBlank: true})},
				{dataIndex: 'lender2', header: 'Vendor 2', sortable: false, width: 105, menuDisabled: true, fixed: true, resizable: false, editor: new Ext.form.TextField({allowBlank: true})},
				{dataIndex: 'lender3', header: 'Vendor 3', sortable: false, width: 105, menuDisabled: true, fixed: true, resizable: false, editor: new Ext.form.TextField({allowBlank: true})},
				{dataIndex: 'lender4', header: 'Vendor 4', sortable: false, width: 105, menuDisabled: true, fixed: true, resizable: false, editor: new Ext.form.TextField({allowBlank: true})},
				{dataIndex: 'lender5', header: 'Vendor 5', sortable: false, width: 105, menuDisabled: true, fixed: true, resizable: false, editor: new Ext.form.TextField({allowBlank: true})}
			]);
        }
		colModel.setRenderer(0, ttRenderer);
		return colModel;
    };

	var total_record_ids = [16,17,18,19,20,21,22,25,26,27,28,29,30,31];
	function updateTotals(rec,field)
	{
		total = 0;
		totalCol = 0;
		total = new Number();
		if(rec.id < 25)
		{
			totalRowId = 24;
			totalCols = ds.getRange(17,23);
		}
		else
		{
			totalRowId = 33;
			totalCols = ds.getRange(25,32);
		}

		for(i=0; i<totalCols.length; i++)
		{
			val = totalCols[i].get(field);
			// check for not null val
			// check for parseInt not a number
			// check for invalid characters
			total += (val !== null && isNaN(parseInt(val)) !== true && val.search(/[a-z\/\?\*\#\$\!\@\^\&\(\)]/ig) == -1) ? Number(val) : 0;
		}
		total_record = ds.getAt(totalRowId);
		total_record.beginEdit();
		total_record.set(field, '$' + total);
		total_record.endEdit();
	}
	
    var buildGrid = function()
	{
		var editNumber = 0;
		function handleEdit(e) 
		{
			// console.log(e.record.id);
			if(jQuery.inArray(e.record.id,total_record_ids) > -1)
			{
				updateTotals(e.record,e.field);
			}
			if(editNumber < 4)
			{	
				if(e.value != '')
				{
					editNumber = editNumber + 1;
				}
			}
			else
			{
				// update db
				db(ds.getModifiedRecords());
				// reset editNumber
				editNumber = 0;
			}
		};
		
		function refreshGrid() {
			ds.reload();
		};
		
		db = function updateDB(modifiedRecords) {
			var jsonModifiedRecords = [];
			for(i=0; i<modifiedRecords.length; i++)
			{
				jsonModifiedRecords[i] = modifiedRecords[i].data;			
			}
			jsonModifiedRecords = Ext.util.JSON.encode(jsonModifiedRecords);
			Ext.Ajax.request({
				waitMsg: 'Saving changes...',
				url: controller, 
				params: { 
					task: "update", 
					records: jsonModifiedRecords
				},
				failure:function(response,options){
					Ext.MessageBox.alert('Warning','There was a server error, please try your update again later.');
					ds.rejectChanges();
				},
				success:function(response,options){ 
					ds.commitChanges(); 
				}
			});
		};

        grid = new Ext.grid.EditorGridPanel({
            autoExpandColumn: 'classLabel',
			autoHeight: true, 
			autoScroll: true,
            clicksToEdit: 1, 
            colModel: getColumnModel(), 
			id: 'lw-grid', 
			loadMask: true, 
            selModel: new Ext.grid.RowSelectionModel({singleSelect:false}), 
            store: ds,        
			stripeRows: true, 
            tbar: gridToolBar1,
			title: getTitle(),
			trackMouseOver: true,
			width: 725,
            viewConfig: new Ext.grid.GridView({
				//autoFill: true,
                forceFit: true,
				getRowClass: function(record, rowIndex, rowParams, dataStore){
					if (record.data.is_category == 1){
						return 'grid-category';
					}
					if (record.data.id == 23 || record.data.id == 33)
					{
						return 'grid-total';
					}
				}
            }),
			listeners:{
				'beforeedit': function(e){if(e.record.data.is_category == 1 || e.record.data.id == 23 || e.record.data.id == 33){e.cancel = true;}},
				'afteredit': handleEdit
			}
        });
		// setting scrollOffset eliminates extra spacing to the right of grid, causes headers to disappear on rollover in IE6
		// grid.viewConfig.scrollOffset = 0;
    };

    var renderGrid = function() {  
        grid.render('grid-lender');
	};

    var loadStore = function() {  
		ds.load({
			params: { 
				start: 0 ,
				limit: myNameSpace.myModule.perPage
			}
		}); 
        // grid.getSelectionModel().selectFirstRow();
	};

    return {
		// returns an object=myNameSpace.myModule with the following properties:
        perPage: 300,
    	// Public Methods specific to this module
		init : function() {
			// Clear grid div pre render
			Ext.get('grid-lender').update('',false);
			gTb();
			Ext.QuickTips.init();
			// apply config to quicktips
			Ext.apply(Ext.QuickTips.getQuickTip(), {
			    maxWidth: 300,
				minWidth: 200
			});			
			setupDataSource();
			buildGrid();
			renderGrid();
			gridToolBar2.hidden = true;
			gridToolBar2.render(grid.tbar);		
			loadStore();
        },
		// Method to check what is in our Data Store
		// You might call this method from the firebug console for example
        getDataSource: function(){
            return ds;
        },
		publicRefreshGrid: function(){
			ds.reload();
        },
		publicSwapTopToolBar: function(){
			gridToolBar1.hide();
			gridToolBar2.show();
			grid.topToolbar = gridToolBar2;	
		},
		publicSwapTopToolBar2: function(){
			gridToolBar2.hide();
			gridToolBar1.show();
			grid.topToolbar = gridToolBar1;	
		},
		saveGrid: function()
		{
			db(ds.getModifiedRecords());
		}
    }
}();
Ext.onReady(myNameSpace.myModule.init, myNameSpace.myModule, true);
