GridBuilder = function(){
	var globalPageSize=10;
	
	return{
		init : function(){
			
		},
		
		gridCreate : function(config){
			//set the global pagesize
			if(config.PageSize){
				globalPageSize = config.PageSize;
			}
			
			//Create the data store
			var ds = new Ext.data.Store({
				proxy: new Ext.data.HttpProxy({url: config.HttpProxy}),
				reader: new Ext.data.JsonReader({
					root: 'data',
					totalProperty: 'recordcount'
				},config.RecordDefinitions),
				remoteSort: true
			});
			
			//Set Base Params
			ds.baseParams = {sc:config.sc};
			
			//Set default Sort Column
			ds.setDefaultSort(config.DefaultSortCol, config.DefaultSortDir);
			
			//set the column model to the passed object
			var cm = config.ColumnModel;

			//Make columns sortable
			cm.defaultSortable = true;
			
			//Create SelectionModel
			sm = new Ext.grid.RowSelectionModel({singleSelect:true});
					
			// add a paging toolbar to the grid's footer 
			var paging = new Ext.PagingToolbar({
			store:ds,
			pageSize: globalPageSize,
			displayInfo: true,
			displayMsg: 'Displaying records {0} - {1} of {2}',
			emptyMsg: "No Records to display"
			});
			
			//create Grid
			var grid = new Ext.grid.GridPanel({
			    store				: 		ds,
			    cm					: 		cm,
			    width				:		(config.Width) ? config.Width:'auto',
				height				:		(config.height) ? config.height:'auto',
		    	sm					: 		sm,
			    autoHeight			: 		false,
			    frame				:		false,
			    border				:		false,
			    loadMask			: 		{msg: ''},
			    title				:		null,
			    enableColumnHide	:		false,
		    	enableHdMenu		:		false,
				bbar				:		(config.Paging && config.Paging) == false ? null:paging,
				stripeRows			:		true,
				autoScroll			:		false,
				minColumnWidth		:		75,
				enableColumnResize	:		false
			});
						
					
			//Render the grid
			grid.render(config.ElementID);

			// trigger the data store load before rendering to avoild inital load mask
			ds.load({
		            params: {
		            	start:0,
		            	limit:globalPageSize,
		            	sc:config.sc
		            }
		    });

			//Check if we want a click listener on rows to open options window
			if(config.win){
				grid.on('rowclick',function(grid, rowIndex, e){
					var params = buildParamList(grid,rowIndex,'win');
					WindowBuilder.windowCreate({
							Parameters: params,
							TitleParameters: (config.winTitleParameters) ? buildParamList(grid,rowIndex,'title'):null,
							Title: (config.winTitle) ? config.winTitle:'Options', 
							winType : (config.winType) ? config.winType:'Default',
							URL: config.winURL,
							Width: (config.winWidth)?config.winWidth:700,
							Height: (config.winHeight)?config.winHeight:500,
							Anim_Target: null
						});
				}
				)
			}
			
			function buildParamList(grid,rowIndex,Type){
				var params=[];
				if(Type == 'win'){
					for (var i = 0; i < config.winParameters.length; i++) {
						params[i] = {ParameterName:config.winParameters[i],ParameterValue:grid.store.getAt(rowIndex).get(config.winParameters[i])};
		   			}
				}
				else{
					for (var i = 0; i < config.winTitleParameters.length; i++) {
						params[i] = {ParameterName:config.winTitleParameters[i],ParameterValue:grid.store.getAt(rowIndex).get(config.winTitleParameters[i])};
		   			}
				}
				return params;
			}
		},
		
		gridRefresh : function(ElementID){
			var grid = Ext.get(ElementID);
			//alert(grid);
			//alert(globalPageSize);
			var ds = grid.getDataSource();
			ds.baseParams = {
		            	limit:globalPageSize
		            };
			ds.load({
		            params: {
		            	start:0,
		            	limit:globalPageSize
		            }
		    });
		    grid.getView().refresh(); 
		}
	};
}();
