// RaceTrack represents the HTMLTableElement but with all the added functionality
// to support the driving.

function RaceTrack()
{
 this.init();
}

RaceTrack.prototype.init = RaceTrack_init;
RaceTrack.prototype.clearTrack = RaceTrack_clearTrack;
RaceTrack.prototype.makeTrack = RaceTrack_makeTrack;
RaceTrack.prototype.insertRaceRow = RaceTrack_insertRaceRow;
RaceTrack.prototype.setOnly = RaceTrack_setOnly;
RaceTrack.prototype.getRaceCells = RaceTrack_getRaceCells;
RaceTrack.prototype.getRaceCell = RaceTrack_getRaceCell;
RaceTrack.prototype.findCell = RaceTrack_findCell;
RaceTrack.prototype.hasStart = RaceTrack_hasStart;
RaceTrack.prototype.hasFinish = RaceTrack_hasFinish;
RaceTrack.prototype.getRowLength = RaceTrack_getRowLength;
RaceTrack.prototype.serialise = RaceTrack_serialise;
RaceTrack.prototype.load = RaceTrack_load;

function RaceTrack_init()
{
	this._rows = 0;
	this._cols = 0;
}

function RaceTrack_clearTrack()
{
 	// remove all rows (and hence cells) from the table
	while(this.firstChild != null)
		this.removeChild(this.firstChild);
}

function RaceTrack_insertRaceRow()
{
	return applyInherit(this.insertRow(-1), new RaceRow());
}

function RaceTrack_makeTrack(rows, cols, setupClickHandler)
{
 // populate the racetrack according to the size specified
 // setupClickHandler is a bool to indicate if the css class of the cell can be changed by clicking
 // on it. True when in design mode. False for driving mode.

 this._rows = rows;
 this._cols = cols;

 for(var i=0;i<rows;i++)
 {
	var row = this.insertRaceRow();

	for(var j=0; j<cols;j++)
	{
		var cell = row.insertRaceCell();

		cell.setX(j);
		cell.setY(i);

		if(i==0 || j==0 || i==(rows-1) || j==(cols-1))
		{
			// border cells must be walls
			// don't attach clickHandler
			cell.className = "wall";
		} else
		{
			if(setupClickHandler)
			{
				cell.attachDefaultClickHandler();
			}
		}
	}
	

 }
}

function RaceTrack_setOnly(cell, strClassOld, strClassNew)
{
 	// make sure RaceTrack has only one cell with a particular css class
 	// e.g. only one finish point and only one car

	var cells = this.getRaceCells();
	
	for(var i=0; i<cells.length; i++)
	{
	  cells[i].setClassNameIf(cell, strClassOld, strClassNew);
	}
}

function RaceTrack_getRaceCells()
{
	return this.getElementsByTagName("td");
}

function RaceTrack_getRaceCell(x, y)
{
	return this.getRaceCells()[y * this._cols + x];
}


function RaceTrack_hasStart()
{
 return (this.findCell("carHoriz road") != null);
}

function RaceTrack_hasFinish()
{
 return (this.findCell("finish") != null);
}

function RaceTrack_findCell(strClassName)
{
 	// search for a RaceCell with a particular css class

	var cells = this.getRaceCells();
	
	for(var i=0; i<cells.length; i++)
	{
		if(cells[i].className==strClassName)
			return cells[i];
	}

	return null;
}

function RaceTrack_getRowLength()
{
	return this._cols;
}

function RaceTrack_serialise()
{
 	// serialise for purposes of passing into driving web-page through querystring

 	var strTrack = "";
 	
 	var cells = this.getRaceCells();
 	
	for(var i=0; i<cells.length; i++)
	{
		strTrack += cells[i].getCode();
	}
	
	return strTrack;
}

function RaceTrack_load(track, rowLength, setupClickHandler)
{
	// de-serialise from querystring
	this.makeTrack(track.length / rowLength, rowLength, setupClickHandler);

	for(var i=0; i<track.length; i++)
	{
		this.getRaceCells()[i].setClassNameFromCode(track.substring(i,i+1));
	}

}

