
var Matrix = {
	ROW_COUNT: 0,
	COL_COUNT: 0,
	
	CURRENT_ROW: 0,
	CURRENT_COL: 0,
	
	init: function()
	{
		var matrix = document.getElementById('matrix');
		Util.addCssClass(matrix, 'matrix-js-enabled'); 
	},
	
	getComponent: function(id)
	{
		return document.getElementById(id).getElementsByTagName('span')[0];
	},
	
	cellOver: function(element, rowNum, colNum)
	{
		Util.addCssClass(element, 'hover');
		
		for ( var c = 1; c <= this.COL_COUNT; c++ )
		{
			var header = this.getComponent('matrix_top_header_' + c);
			var isAfter = c == colNum + 1;
			var isCurrent = c == colNum;
			var className = isAfter ? 'hover-after' : ( isCurrent ? 'hover-current' : 'hover-other' );
			Util.addCssClass(header, className);
		}
		
		for ( var r = 1; r <= this.ROW_COUNT; r++ )
		{
			var header = this.getComponent('matrix_side_header_' + r);
			var firstCell = this.getComponent('matrix_cell_' + r + '_1');
			var isBefore = r < rowNum;
			var isCurrent = r == rowNum;
			var className = isBefore ? 'hover-before' : ( isCurrent ? 'hover-current' : 'hover-after' );
			Util.addCssClass(header, className);
			Util.addCssClass(firstCell, className);
		}
	},
	
	cellOut: function(element)
	{
		Util.removeCssClass(element, 'hover');
		
		for ( var c = 1; c <= this.COL_COUNT; c++ )
		{
			var header = this.getComponent('matrix_top_header_' + c);
			Util.removeCssClass(header, 'hover-current');
			Util.removeCssClass(header, 'hover-after');
			Util.removeCssClass(header, 'hover-other');
		}
		
		for ( var r = 1; r <= this.ROW_COUNT; r++ )
		{
			var header = this.getComponent('matrix_side_header_' + r);
			var firstCell = this.getComponent('matrix_cell_' + r + '_1');
			Util.removeCssClass(header, 'hover-before');
			Util.removeCssClass(header, 'hover-current');
			Util.removeCssClass(header, 'hover-after');
			Util.removeCssClass(firstCell, 'hover-before');
			Util.removeCssClass(firstCell, 'hover-current');
			Util.removeCssClass(firstCell, 'hover-after');
		}
	},
	
	rowOver: function(rowNum)
	{
		for ( var r = 1; r <= this.ROW_COUNT; r++ )
		{
			var isBefore = r < rowNum;
			var isCurrent = r == rowNum;
			var className = isBefore ? 'hover-before' : ( isCurrent ? 'hover-current' : 'hover-after' );
			
			var header = this.getComponent('matrix_side_header_' + r);
			if ( !Util.hasCssClass(header, className) )
			{
				var firstCell = this.getComponent('matrix_cell_' + r + '_1');
				
				Util.removeCssClass(header, 'hover-before');
				Util.removeCssClass(header, 'hover-current');
				Util.removeCssClass(header, 'hover-after');
				
				Util.removeCssClass(firstCell, 'hover-before');
				Util.removeCssClass(firstCell, 'hover-current');
				Util.removeCssClass(firstCell, 'hover-after');
				
				Util.addCssClass(header, className);
				Util.addCssClass(firstCell, className);
			}
		}
	},
	
	rowOut: function()
	{
		this.rowOver(this.CURRENT_ROW);
	},
	
	colOver: function(colNum)
	{
		for ( var c = 1; c <= this.COL_COUNT; c++ )
		{
			var isAfter = c == colNum + 1;
			var isCurrent = c == colNum;
			var className = isAfter ? 'hover-after' : ( isCurrent ? 'hover-current' : 'hover-other' );
			
			var header = this.getComponent('matrix_top_header_' + c);
			if ( !Util.hasCssClass(header, className) )
			{
				Util.removeCssClass(header, 'hover-current');
				Util.removeCssClass(header, 'hover-after');
				Util.removeCssClass(header, 'hover-other');
				
				Util.addCssClass(header, className);
			}
		}
	},
	
	colOut: function()
	{
		this.colOver(this.CURRENT_COL);
	}
};
