k_no_wall = 0x00;
k_top_wall = k_north_mask = 0x01;
k_right_wall = k_east_mask = 0x02;
k_bottom_wall = k_south_mask = 0x04;
k_left_wall = k_west_mask = 0x08;



lab_grid = new Array(
	new Array(
		k_top_wall | k_bottom_wall | k_left_wall, k_top_wall | k_bottom_wall, k_top_wall, k_top_wall, k_top_wall | k_right_wall, k_top_wall | k_left_wall, k_top_wall | k_bottom_wall, k_top_wall, k_top_wall | k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall
	),

	new Array(
		k_top_wall | k_bottom_wall | k_left_wall, k_top_wall, k_right_wall, k_right_wall | k_bottom_wall | k_left_wall, k_right_wall | k_left_wall, k_bottom_wall | k_left_wall, k_top_wall | k_right_wall | k_bottom_wall, k_left_wall, k_top_wall | k_bottom_wall, k_top_wall | k_right_wall
	),

	new Array(
		k_top_wall | k_right_wall | k_left_wall, k_right_wall | k_left_wall, k_bottom_wall | k_left_wall, k_top_wall | k_right_wall, k_right_wall | k_left_wall, k_top_wall | k_left_wall, k_top_wall | k_bottom_wall, k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_right_wall | k_left_wall
	),

	new Array(
		k_right_wall | k_left_wall, k_right_wall | k_left_wall, k_top_wall | k_right_wall | k_left_wall, k_right_wall | k_bottom_wall | k_left_wall, k_right_wall | k_left_wall, k_left_wall, k_top_wall | k_bottom_wall, k_top_wall | k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_right_wall | k_left_wall
	),

	new Array(
		k_bottom_wall | k_left_wall, k_right_wall | k_bottom_wall, k_left_wall, k_top_wall | k_bottom_wall, k_no_wall, k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_top_wall | k_left_wall, k_top_wall | k_right_wall, k_right_wall | k_bottom_wall | k_left_wall
	),

	new Array(
		k_top_wall | k_right_wall | k_left_wall, k_top_wall | k_left_wall, k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_left_wall, k_top_wall | k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_right_wall | k_left_wall, k_right_wall | k_left_wall, k_top_wall | k_right_wall | k_left_wall
	),

	new Array(
		k_right_wall | k_left_wall, k_right_wall | k_left_wall, k_top_wall | k_bottom_wall | k_left_wall, k_top_wall | k_bottom_wall, k_bottom_wall, k_top_wall, k_top_wall | k_bottom_wall, k_right_wall, k_right_wall | k_bottom_wall | k_left_wall, k_right_wall | k_left_wall
	),

	new Array(
		k_right_wall | k_left_wall, k_right_wall | k_left_wall, k_top_wall | k_bottom_wall | k_left_wall, k_top_wall | k_bottom_wall, k_top_wall | k_bottom_wall, k_right_wall | k_bottom_wall, k_top_wall | k_left_wall, k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_right_wall | k_left_wall
	),

	new Array(
		k_right_wall | k_left_wall, k_bottom_wall | k_left_wall, k_top_wall | k_right_wall, k_top_wall | k_bottom_wall | k_left_wall, k_top_wall | k_bottom_wall, k_top_wall, k_bottom_wall, k_top_wall | k_bottom_wall, k_top_wall | k_bottom_wall, k_right_wall
	),

	new Array(
		k_bottom_wall | k_left_wall, k_top_wall | k_bottom_wall, k_bottom_wall, k_top_wall | k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_bottom_wall | k_left_wall, k_top_wall | k_bottom_wall, k_top_wall | k_bottom_wall, k_top_wall | k_right_wall | k_bottom_wall, k_right_wall | k_bottom_wall | k_left_wall
	)
);


m_pos = new Array(0, 4);
t_pos = new Array(9, 4);
//m_pos = new Array(8, 8);
//t_pos = new Array(2, 8);

m_dest = new Array(9, 5);
t_dest = new Array(0, 5);


labyrinth_finished = false;
labyrinth_success = false;


function get_colored_text(color, text)
{
	span_obj = document.createElement('span');
	span_obj.style.color = color;
	span_obj.appendChild(document.createTextNode(text));
	
	return span_obj;
}


function display_ships()
{
	tbody_obj = document.getElementById('labyrinth_table').tBodies[0];

	for(i = 0; i < lab_grid.length; i++)
		{
		tr_obj = tbody_obj.rows[i];
		lab_row = lab_grid[i];
		
		for(j = 0; j < lab_row.length; j++)
			{
			td_obj = tr_obj.cells[j];

			while(td_obj.hasChildNodes())
				td_obj.removeChild(td_obj.childNodes[0]);

			if(m_dest[0] == j && m_dest[1] == i)
				td_obj.appendChild(get_colored_text('#999', 'M'));
			else if(t_dest[0] == j && t_dest[1] == i)
				td_obj.appendChild(get_colored_text('#999', 'T'));
			else if(m_pos[0] == j && m_pos[1] == i)
				td_obj.appendChild(get_colored_text('blue', 'M'));
			else if(t_pos[0] == j && t_pos[1] == i)
				td_obj.appendChild(get_colored_text('blue', 'T'));
			else
				td_obj.appendChild(document.createTextNode(' '));
			}
		}

	if(labyrinth_finished)
		{
		td_obj = document.getElementById('labyrinth_result');
		
		if(!td_obj.hasChildNodes())
			{
			if(labyrinth_success)
				td_obj.appendChild(document.createTextNode('Success!'));
			else
				td_obj.appendChild(document.createTextNode('Try again.'));
			}
		}
}


function create_labyrinth()
{
	table_obj = document.createElement('table');
	table_obj.id = 'labyrinth_table';
	tbody_obj = document.createElement('tbody');
	table_obj.appendChild(tbody_obj);

	for(i = 0; i < lab_grid.length; i++)
		{
		tr_obj = document.createElement('tr');
		lab_row = lab_grid[i];
		
		for(j = 0; j < lab_row.length; j++)
			{
			td_obj = document.createElement('td');
			td_obj.align = 'center';
			td_obj.vAlign = 'middle';
			
			className = 'labyrinth_tool_cell';
			cell_mask = lab_row[j];
			if(cell_mask & k_top_wall)
				className += ' top_wall';
			if(cell_mask & k_right_wall)
				className += ' right_wall';
			if(cell_mask & k_bottom_wall)
				className += ' bottom_wall';
			if(cell_mask & k_left_wall)
				className += ' left_wall';
			
			td_obj.className = className;
			tr_obj.appendChild(td_obj);
			}
		
		tbody_obj.appendChild(tr_obj);
		}

	return table_obj;
}


function move_ship_one_cell(ship_pos, direction)
{
	switch(direction)
		{
		case k_north_mask:
			ship_pos[1]--;
			break;
		
		case k_east_mask:
			ship_pos[0]++;
			break;
		
		case k_south_mask:
			ship_pos[1]++;
			break;
		
		case k_west_mask:
			ship_pos[0]--;
			break;
		}
}


function move_one_ship(ship_pos, ship_dest, direction_mask)
{
	if(ship_pos[0] < 0 || ship_pos[1] < 0)
		return;

	while(!(lab_grid[ship_pos[1]][ship_pos[0]] & direction_mask))
		move_ship_one_cell(ship_pos, direction_mask);

	// When a ship reaches its destination, remove it from the map.
	if(ship_pos[0] == ship_dest[0] && ship_pos[1] == ship_dest[1])
		{
		ship_pos[0] = ship_pos[1] = -1;
		}
}


function move_ships(direction_mask)
{
	move_one_ship(m_pos, m_dest, direction_mask);
	move_one_ship(t_pos, t_dest, direction_mask);

	if(!labyrinth_finished && m_pos[0] < 0 && t_pos[0] < 0)
		labyrinth_success = true;

	if(m_pos[0] < 0 || t_pos[0] < 0)
		labyrinth_finished = true;

	display_ships();
}


function labyrinth_init()
{
	tool_div = document.getElementById('labyrinth_map');

	labyrinth_table = create_labyrinth();

	tool_div.appendChild(labyrinth_table);
	
	display_ships();
}