var tableRangeSummator = {
	row_1:0,
	row_2:0,
	HEAD_MARGIN:0
};

tableRangeSummator.grow = function(idx) {
	for(j=0; j<this.table.rows[idx].cells.length; j++)
		this.table.rows[idx+this.HEAD_MARGIN].cells[j].bgColor = this.colors.select;
}

tableRangeSummator.wharay = function() {
	for(r=1; r<this.table.rows.length-this.HEAD_MARGIN; r++)
		for(c=0; c<this.table.rows[r].cells.length; c++)
			this.table.rows[r+this.HEAD_MARGIN].cells[c].bgColor = this.colors.bg;
}

tableRangeSummator.update = function(columns) {
	if ((this.row_1 != 0) && (this.row_2 != 0))
	{
		for (c = 0; c < this.cols.to_sum.length; c++)
		{
			column = this.cols.to_sum[c];
			if (!column.direct_func) column.direct_func = parseInt;
			if (!column.inverse_func) column.inverse_func = parseInt;
			if (!column.default_value) column.default_value = 0;
			with (column) {
				this.sum_row.cells[idx].innerHTML = sum_func(this.table, idx, this.row_1, this.row_2, direct_func, inverse_func, default_value);
			}
		}
	}
}

tableRangeSummator.clear_sum = function() {
	this.sum_row.cells[this.cols.idx].innerHTML = "&sum;";
	for (i = 0; i < this.cols.to_sum.length; i++)
		this.sum_row.cells[this.cols.to_sum[i].idx].innerHTML = "";
}

tableRangeSummator.select_row = function(row_idx) {
	s1 = (this.row_1 == 0);
	s2 = (this.row_2 == 0);
	if ((s1 && s2) || !(s1 || s2)) {
		this.wharay(this.table);
		this.grow(row_idx);
		this.row_1 = row_idx;
		this.row_2 = 0;
		this.clear_sum();
	} else {
		this.row_2 = row_idx;
		if (this.row_1 > this.row_2) {
			var tmp = this.row_1;
			this.row_1 = this.row_2;
			this.row_2 = tmp;
		}
		this.sum_row.cells[this.cols.idx].innerHTML =
			"&sum;" + (this.row_1 + '-' + this.row_2).sub();
		for(r = this.row_1; r <= this.row_2; r++) {
			this.grow(r);
		}
		this.update();
	}
}

tableRangeSummator.clear_selection = function() {
	this.row_1 = 0;
	this.row_2 = 0;
	this.wharay(this.table);
}

getCellValue = function(t,r,c) {
	return t.rows[r].cells[c].innerHTML;
}

diff_sum = function(tbl, col_idx, r1, r2, direct_func, inverse_func, default_value) {
	return inverse_func(
		direct_func(getCellValue(tbl, tableRangeSummator.HEAD_MARGIN+r2,col_idx))
	-	((r1 == 1) ? default_value : direct_func(getCellValue(tbl, tableRangeSummator.HEAD_MARGIN+r1-1,col_idx)))
	);
}

just_sum = function(tbl, col_idx, r1, r2, direct_func, inverse_func, default_value) {
	val = default_value;
	for(r = r1; r <= r2; r++) {
		val += direct_func(getCellValue(tbl, tableRangeSummator.HEAD_MARGIN+r,col_idx));
	}		
	return inverse_func(val);
}