// Table
var TableElement = (
	function(params)
	{
		var default_params = {
			num_rows: 1,
			num_cols: 1
		}
		if ( Object.isUndefined(params) )
		{
			params = {};
		}
		Object.keys(default_params).each( function(key, key_index)
		{
			if ( Object.isUndefined(params[key]) )
			{
				params[key] = default_params[key];
			}
		}.bind(this));
			
		var element = Element.extend(new Element('table'));
		element.num_rows = params['num_rows'];
		element.num_cols = params['num_cols'];
		
		// Extend method
		element.getRow = function(row_pos)
		{
			if (row_pos >= 0 && row_pos < this.rows.length) 
			{
				return Element.extend(this.rows[row_pos]);
			}
			
			return null;
		}
		element.getCell = function(row_pos, col_pos)
		{
			if ( row_pos >= 0 && row_pos < this.rows.length )
			{
				var row_el = this.rows[row_pos];
				if ( col_pos >= 0 && col_pos < row_el.cells.length )
				{
					return Element.extend(row_el.cells[col_pos]);
				}
			}
			
			return null;
		};
		element.setNumRows = function(num_rows)
		{
			if ( num_rows > this.rows.length  )
			{
				// Add extra rows
				for ( var i = this.rows.length; i < num_rows; i++ )
				{
					var tr_el = Element.extend(this.insertRow(i));
					for ( var j = 0; j < this.num_cols; j++ )
					{
						tr_el.insertCell(j);
					}
					
				}
			}
			else if ( num_rows < this.rows.length )
			{
				// Remove rows from bottom
				var length = this.rows.length;
				for ( var i = num_rows; i < length; i++ )
				{
					element.deleteRow(num_rows);
				}
			}
			
			this.num_rows = num_rows;
		};
		element.setNumCols = function(num_cols)
		{
			$A(this.rows).each( function(row_el, row_el_index)
			{
				if ( num_cols > row_el.cells.length )
				{
					// Add extra cells
					for ( var i = row_el.cells.length; i < num_cols; i++  )
					{
						Element.extend(row_el.insertCell(i)).update('&nbsp;');
					}
				}
				else if ( num_cols < row_el.cells.length )
				{
					// Remove cells
					var length = row_el.cells.length;
					for ( var i = num_cols; i < length; i++ )
					{
						Element.extend(row_el.deleteCell(num_cols));
					}
				}
			}.bind(this));
			
			this.num_cols = num_cols;
		};
		
		element.setNumRows(params.num_rows);
		element.setNumCols(params.num_cols);
		return element;
	}
);

/* Select */
var SelectElement = (
	function(params)
	{
		var element = Element.extend(new Element('select'));
		
		element.setSelectedOption = function(option_value)
		{
			$A(element.options).each( function(option_el, option_el_index)
			{
				if ( option_el.value == option_value )
				{
					element.selectedIndex = option_el_index;
					throw $break;
				}
			}.bind(this));

			return element;	
		}
		element.setOptionsFromHash = function (hash)
		{
			hash.keys().each( function(hash_key, hash_key_index)
			{
				element.insert(new Element('option', {value: hash_key}).update(hash.get(hash_key)) );
				
			}.bind(this));
			return element;
		}
		
		return element;
	}
);