function formatUrl(elCell, oRecord, oColumn, sData)
{
	elCell.innerHTML = '<a href="song.php?id=' + oRecord.getData('songId') + '">' + sData + '</a>';
}

function buildQueryString(state, dt)
{
	return 'offset=' + state.pagination.recordOffset +
		   '&limit=' + state.pagination.rowsPerPage +
		   '&sortKey=' + state.sorting.key +
		   '&sortDir=' + ((state.sorting.dir === YAHOO.widget.DataTable.CLASS_DESC) ? 'desc' : 'asc');
}

function handlePagination(state, dt)
{
	var sortedBy  = dt.get('sortedBy');

	// Define the new state
	var newState =
	{
		startIndex: state.recordOffset, 
		sorting:
		{
			key: sortedBy.key,
			dir: ((sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? 'desc' : 'asc')
		},
		pagination :
		{
			recordOffset: state.recordOffset, // Default to first page when sorting
			rowsPerPage: dt.get('paginator').getRowsPerPage() // Keep current setting
		}
	};

	// Create callback object for the request
	var oCallback =
	{
		success: dt.onDataReturnSetRows,
		failure: dt.onDataReturnSetRows,
		scope: dt,
		argument: newState // Pass in new state as data payload for callback function to use
	};
	
	// Send the request
	dt.getDataSource().sendRequest(buildQueryString(newState), oCallback);
}

function handleSort(oColumn)
{
	// Default ascending
	var sDir = 'asc';
	
	// If already sorted, sort in opposite direction
	if(oColumn.key === this.get('sortedBy').key)
	{
		sDir = (this.get('sortedBy').dir === YAHOO.widget.DataTable.CLASS_ASC) ?
				'desc' : 'asc';
	}

	// Define the new state
	var newState =
	{
		startIndex: 0,
		sorting:
		{
			key: oColumn.key,
			dir: (sDir === 'desc') ? YAHOO.widget.DataTable.CLASS_DESC : YAHOO.widget.DataTable.CLASS_ASC
		},
		pagination :
		{
			recordOffset: 0, // Default to first page when sorting
			rowsPerPage: this.get('paginator').getRowsPerPage() // Keep current setting
		}
	};

	// Create callback object for the request
	var oCallback =
	{
		success: this.onDataReturnSetRows,
		failure: this.onDataReturnSetRows,
		scope: this,
		argument: newState // Pass in new state as data payload for callback function to use
	};
	
	// Send the request
	this.getDataSource().sendRequest(buildQueryString(newState), oCallback);
}

function initializeSongTable()
{
	var tableId = 'songTable';
	var containerId = tableId + 'Container';
	var resultsPerPage = 20;
	
	var columnDefinitions =
	[
		{ key:'songId', label:'songId', sortable:true, formatter:YAHOO.widget.DataTable.formatNumber },
		{ key:'title', label:'Title', sortable:true, formatter:formatUrl },
		{ key:'song', label:'Original Song', sortable:true },
		{ key:'year', label:'Year', sortable:true, formatter:YAHOO.widget.DataTable.formatNumber },
		{ key:'term', label:'Term', sortable:true }
	];
	var responseSchemaFields =
	[
		{ key: 'songId' },
		{ key: 'title' },
		{ key: 'memberString' },
		{ key: 'song' },
		{ key: 'artist' },
		{ key: 'year', parser:YAHOO.util.DataSource.parseNumber },
		{ key: 'term' }
	];
	var tableConfig =
	{
		initialRequest			: 'offset=0&limit=' + resultsPerPage + '&sortKey=songId&sortDir=asc',
		generateRequest			: buildQueryString,
		paginator				: new YAHOO.widget.Paginator
									({
										rowsPerPage			: resultsPerPage,
										containers			: 'songTablePaginator',
										template			: '<strong>Navigation:</strong> {PageLinks}',
										pageLinks			: YAHOO.widget.Paginator.VALUE_UNLIMITED,
										pageLabelBuilder	: function (page,paginator)
										{
											var recs = paginator.getPageRecords(page);
											return (recs[0] + 1) + ' - ' + (recs[1] + 1);
										}
									}),
		paginationEventHandler	: handlePagination,
		sortedBy				: { key:'songId', dir:YAHOO.widget.DataTable.CLASS_ASC }
	};
	
	var dataSource = new YAHOO.util.DataSource('include/phpScripts/fetchSongs.php?');
	dataSource.connMethodPost = true;
	dataSource.responseType = YAHOO.util.DataSource.TYPE_XML;
	dataSource.responseSchema =
	{
		resultNode: 'result',
		fields: responseSchemaFields,
		metaNode: 'resultset',
		metaFields: 
		{
			totalRecords: 'totalNumberOfSongs'
		}
	};
	
	var dataTable = new YAHOO.widget.DataTable(
		containerId,
		columnDefinitions,
		dataSource,
		tableConfig
	);
	dataTable.sortColumn = handleSort;
}

function initializeDataTable()
{
	var tableId = 'songTable';
	var containerId = tableId + 'Container';
	
	var columnDefinitions =
	[
		{ key: 'title', label: 'Title', sortable: true },
		{ key: 'song', label: 'Original Song', sortable: true },
		{ key: 'year', label: 'Year', sortable: true, formatter: YAHOO.widget.DataTable.formatNumber },
		{ key: 'term', label: 'Term', sortable: true }
	];
	var responseSchemaFields =
	[
		{ key: 'title' },
		{ key: 'song' },
		{ key: 'year', parser:YAHOO.util.DataSource.parseNumber },
		{ key: 'term' }
	];
	
	var dataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get(tableId));
	dataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
	dataSource.responseSchema =
	{
		fields: responseSchemaFields
	};
	
	var dataTable = new YAHOO.widget.DataTable(
		containerId,
		columnDefinitions,
		dataSource,
		{ }
	);
}
