var Table = Class.create(
{
	initialize: function(inElement, inOptions)
	{
		this.element = $(inElement);
		
		if(!this.element)
		{
			return;
		}
		
		this.options = {
			select: 'row',
			oddClass: 'odd',
			evenClass: 'even',
			alternate: false,
			columns: [],
			columnClass: 'col',
			groupClass: 'group'
		};
		
		Object.extend(this.options, inOptions);
				
		this.element.observe('behavior:update', this.update.bindAsEventListener(this));
		
		// ---------
		
		var groups = this.element.select('.' + this.options.groupClass);
		
		for(var i = 0; i < groups.length; i++)
		{
			groups[i].child = groups[i].next();
		}
		
		var columns = [];
		
		for(var i = 0; i < this.options.columns.length; i++)
		{
			columns[i] = {width: this.options.columns[i], elements: this.element.select('.' + this.options.columnClass + i)};
		}
		
		Table.CalculateDimensions(this.element, columns);
		
		this.update();
	},
	
	update: function()
	{
		if(this.options.alternate)
		{
			var rows = this.element.select('.' + this.options.select);
	
			for(var i = 0; i < rows.length; i++)
			{
				if(i % 2 == 0)
				{
					rows[i].removeClassName(this.options.oddClass);
					rows[i].addClassName(this.options.evenClass);
				}
				else
				{
					rows[i].removeClassName(this.options.evenClass);
					rows[i].addClassName(this.options.oddClass);
				}
			}
		}
	}
});
	
Table.CalculateDimensions = function(inElement, columns)
{
	var tables = inElement.select('table');
	
	for(var i = 0; i < tables.length; i++)
	{
		tables[i].setStyle({width:"1px"});
	}
	
	var hidden = [];

	for(var i = 0; i < columns.length; i++)
	{
		if(columns[i].elements.length == 0)
		{
			columns[i] = null;
			
			continue;
		}
	
		columns[i].widest = 0;

		for(var j = 0; j < columns[i].elements.length; j++)
		{
			if(j == 0)
			{
				var ancestors = columns[i].elements[j].ancestors();

				for(k = 0; k < ancestors.length; k++)
				{
						if(ancestors[k].getStyle("display") == "none")
						{
							hidden.push(ancestors[k]);
							
							ancestors[k].setStyle({display:""});
						}
				}
				
				columns[i].padding = parseInt(columns[i].elements[j].getStyle("paddingRight")) + parseInt(columns[i].elements[j].getStyle("paddingLeft"));
			}

			var width = columns[i].elements[j].getWidth();
			
			if(width > columns[i].widest)
			{
				columns[i].widest = width;
			}
		}
	}
	
	for(var i = 0; i < hidden.length; i++)
	{
		hidden[i].setStyle({display:"none"});
	}
	
	columns = columns.compact();
	
	// ------

	var totalUnspecified = 0;
	var totalPercentageWidth = 0;
	var totalWidestWidth = 0;
	var lastUnspecified = -1;

	for(var i = 0; i < columns.length; i++)
	{
		var width = columns[i].width;
	
		if(width.endsWith("%"))
		{
			columns[i].widthPercentage = parseInt(width.substring(0, width.length - 1));

			totalPercentageWidth += columns[i].widthPercentage;
		}
		else if(width.endsWith("px"))
		{
			columns[i].widthPercentage = -1;
		}
		else
		{
			columns[i].widthPercentage = 0;

			totalUnspecified++;

			lastUnspecified = i;
			
			totalWidestWidth += columns[i].widest;
		}
	}

	if(totalPercentageWidth == 100)
	{
		for(var i = 0; i < columns.length; i++)
		{
			if(columns[i].widthPercentage == 0)
			{
				columns[i].widthPercentage = -1;
				columns[i].width = 0;
			}
		}
	}
	else if(totalPercentageWidth > 100)
	{
		totalPercentageWidth = 0;
		
		totalUnspecified = 0;
		
		lastUnspecified = -1;
		
		totalWidestWidth = 0;
		
		for(var i = 0; i < columns.length; i++)
		{
			if(columns[i].widthPercentage > 0)
			{
				columns[i].widthPercentage = 0;
				
				totalUnspecified++;

				lastUnspecified = i;
				
				totalWidestWidth += columns[i].widest;
			}
		}
	}

	if(totalUnspecified > 0)
	{
		var average = (100 - totalPercentageWidth) / totalUnspecified;
		
		for(var i = 0; i < columns.length; i++)
		{
			if(i == lastUnspecified)
			{
				columns[i].widthPercentage = 100;
			}
			else if(columns[i].widthPercentage == 0)
			{
				var weightedPercentage = average;
			
				columns[i].widthPercentage = weightedPercentage;
				
				totalPercentageWidth += weightedPercentage;
			}
		}
	}
	
	for(var i = 0; i < columns.length; i++)
	{
		if(columns[i].elements.length > 0)
		{
			if(columns[i].widthPercentage > 0)
			{
				columns[i].width = columns[i].widthPercentage + "%";
				columns[i].minWidth = (columns[i].widest - columns[i].padding) + "px";
			}
			else
			{
				var width = parseInt(columns[i].width);
				
				if(width < columns[i].widest)
				{
					columns[i].width = null; 
					columns[i].minWidth = (columns[i].widest - columns[i].padding) + "px";
				}
				else
				{
					columns[i].width = null; 
					columns[i].minWidth = width + "px";
				}
			}
		}
	}
	
	// --------
		
	for(var i = 0; i < columns.length; i++)
	{
		var styles = {minWidth: columns[i].minWidth, width: columns[i].width};
		
		var lastField = null;

		for(var j = 0; j < columns[i].elements.length; j++)
		{
			columns[i].elements[j].setStyle(styles);
		}
	}
	
	for(var i = 0; i < tables.length; i++)
	{
		tables[i].setStyle({width:""});
	}
};