(function($){
	
$.fn.livegrid = function(columns, options) {
	return new $.livegrid(this, columns, options);
};

$.livegrid = function(container, columns, options) {
	options = $.extend({namespace:'livegrid'},options);
	var showDetails = true;
	var z = this;
	var $table = null;
	
	z.displayDetails = function(display) {
		showDetails = display;
	};
	
	z.setColumns = function(c) {
		columns = c;
	};
	
	z.addRow = function(r, i) {
		var $tbody = $('<tbody/>').addClass((i%2 == 1 ? 'row_odd' : 'row_even') + ' future_' + r.future_id).appendTo($table);
		
		var $row = $('<tr/>').addClass((i%2 == 1 ? 'row_odd' : 'row_even') + ' future_' + r.future_id).data({future: r.future_id, market: r.market_id});
		$.each(columns, function(j,c) {
			var $el = $('<div class="'+options.namespace+'_cell"/>');
			
			if(options.cellRender) {
				options.cellRender($el, r, c.dataIndex);
			}
			if(c.renderer) {
				c.renderer($el, c.dataIndex, r[c.dataIndex], r, $row);
			} else if(c.dataIndex && $.quote.field_func_map[c.dataIndex]) {
				$.quote.field_func_map[c.dataIndex]($el, c.dataIndex, r[c.dataIndex], r, 'ajax');
			}
			var $td = $('<td class="'+(j%2 == 1 ? 'column_odd' : 'column_even')+' column_'+c.dataIndex+((j + 1 == columns.length) ? ' last_column' : '')+'"/>').append( $el ).appendTo($row);
			if(c.visible===false) {
				$td.addClass('hidden');
			}
			
			if(c.always_hide===true) {
				$td.addClass('nevershow');
			}
			
		});
		$tbody.append($row);
		
		if(options.details) {
			$row = $('<tr/>').addClass('detail_row ' + (i%2 == 1 ? 'row_odd' : 'row_even'));
			
			var detail_row = $('<td class="row_details_holder" colspan="'+columns.length+'"><div class="row_details"><div class="summary_more_info"><div class="summary_more_info_inner"><div class="summary_more_info_content"><table><tr></tr></table></div></div></div></div></td>').appendTo($row).find('tr');//.append(options.details, r);
			
			$.each(options.details, function(i, column){
				var $td = $('<td width="'+column.width+'"/>').addClass('detail_column'+(column.cls ? (' '+column.cls) : ''));
				$.each(column.fields, function(j, row){
					var $div = $('<div/>').addClass('clearfix');
					
					$('<label/>').html(row.header+':').appendTo($div);
					var $e = $('<div/>').appendTo($div);
					if(options.cellRender) {
						options.cellRender($e, r, row.dataIndex);
					}
					if($.quote.field_func_map[row.dataIndex]) {
						$.quote.field_func_map[row.dataIndex]($e, row.dataIndex, r[row.dataIndex], r, 'ajax');
					}
				
					$div.appendTo($td);
				});
				detail_row.append($td)
			});
			
			if(!showDetails) {
				$row.hide();
			}
			
			$tbody.append($row);
		}
		
		if(options.tbodyRender) {
			options.tbodyRender($tbody, r, i);
		}
	};
	
	z.draw = function(data) {
		$table = $('<table class="'+options.namespace+' draggable"/>');
		
		if(options.tableRender) {
			options.tableRender($table, columns);
		}
	
		var $row = $('<tr class="'+options.namespace+'_header" />');
	
		$.each(columns, function(j, c) {
			var header = $('<th field="'+c.dataIndex+'" field_id="'+c.id+'" class="'+(j%2 == 1 ? 'column_odd' : 'column_even')+' column_'+c.dataIndex+((j + 1 == columns.length) ? ' last_column' : '')+'"/>').append($('<div class="'+options.namespace+'_cell field_'+c.dataIndex+'"/>').html('<input type="checkbox" name="show_column" class="show_column" '+(c.visible === false ? '' : 'checked')+'/>'+c.header)).appendTo($row);
			if(c.visible===false) {
				header.addClass('hidden');
			}
			
			if(c.always_hide===true) {
				header.addClass('nevershow');
			}
		});
		$table.append('<thead/>').find('thead').append($row);
	
		$.each(data, function(i,r) {
			z.addRow(r, i, $table);
		});
	
		container.html($table);
		
		if(options.onDraw) {
			options.onDraw();
		}
		return z;
	};
};

})(jQuery);