Ext.grid.TableGrid = function(table, config, group) {
	config = config || {};
	Ext.apply(this, config);

	if (table.dom.getAttribute('title') != undefined && table.dom.getAttribute('title') != ''){
		title = table.dom.getAttribute('title');
	}else title = 'Items';
	
	var cf = config.fields || [], ch = config.columns || [];
	
	var ct = table.insertSibling();

	var fields = [], cols = [], aligns = [];
	
	var td = table.query("tbody td");
	var tdSize = 0;
	reUrl = /<a (.)*href="([^"]+)"(.)*>([^<]+)<\/a>/i;
	for (var i = 0, t; t = td[i]; i++){ 
		aligns.push(t.align);
		if (reUrl.test(t.innerHTML)){ 
			a = reUrl.exec(t.innerHTML);
			t.innerHTML = a[4] + "<url:"+escape(a[2]).split('/').join('|')+">";
		}
		tdSize++;
	}
	
	var universalFmt = function(data,cell,record,rowIndex,columnModel,store){
		var reUrl = /([^<]+)(<url:)([^>]+)(>)/i;
		if (reUrl.test(data)){
			a = reUrl.exec(data);
			return '<a href="' + unescape(a[3].split('|').join('/')) + '">' + a[0] + '</a>';
		}else if (data==''){
			return '&nbsp;';
		}else return data;
	};
	
	var headers = table.query("thead th");
	for (var i = 0, h; h = headers[i]; i++) {
		var text = h.innerHTML;
		var name = 'tcol-'+i;
		
		fields.push(Ext.applyIf(cf[i] || {}, {
			name: name,
			mapping: 'td:nth('+(i+1)+')/@innerHTML'
		}));

		cols.push(Ext.applyIf(ch[i] || {}, {
			'header': text,
			'dataIndex': name,
			'width': h.offsetWidth,
			'align': aligns[i],
			'tooltip': h.title,
			'renderer': universalFmt,
			'sortable': true
		}));
	}
  
	reader = new Ext.data.XmlReader({
		  record:'tbody tr'
		}, fields);

	if (group && !Ext.isIE6 && tdSize > fields.length){
		var ds  = new Ext.data.GroupingStore({
			reader: reader,
			sortInfo:{field: fields[0].name, direction: "ASC"},
			groupField:fields[0].name
		});	  
		Ext.apply(this, {view: new Ext.grid.GroupingView({
				hideGroupedColumn:true,
				forceFit:true,
				startCollapsed: table.hasClass('dfCollapse'),
				groupTextTpl: '{text} [{[values.rs.length]} {[values.rs.length > 1 ? "' + title.toLowerCase() + '" : "' + title.toLowerCase().substr(0,title.length-1) + '"]}]'
			})});
	}else{
		var ds  = new Ext.data.Store({
			reader: reader
		});
	}

	ds.loadData(table.dom);

	var cm = new Ext.grid.ColumnModel(cols);
	
	if (config.width || config.height) {
		ct.setSize(config.width || 'auto', config.height || 'auto');
	} else {
		ct.setWidth(table.getWidth());
	}
	
	if (config.remove !== false) {
		table.remove();
	}				

	Ext.applyIf(this, {
		'ds': ds,
		'cm': cm,
		'sm': new Ext.grid.RowSelectionModel(),
		autoHeight: true,
		autoWidth: false,
		layout:'fit'
	});
	Ext.grid.TableGrid.superclass.constructor.call(this, ct, {});
};
