//we need to iterate through object keys - add for old browser support
if(!Object.keys) Object.keys = function(o){

	if (o !== Object(o))

		throw new TypeError('Object.keys called on non-object');

	var ret=[],p;

	for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);

	return ret;

}

	function SortLeadersByName(leader1,leader2)
	{

		var teamName1 = leader1["team"].replace(/\d+\s-\s/, "").toLowerCase();

		var teamName2 = leader2["team"].replace(/\d+\s-\s/, "").toLowerCase();

		if (teamName1  < teamName2 ) {return -1;}

		if (teamName1  > teamName2 ) {return 1;}

		return 0;


	}

function GetMiniLeaderboardTableRow(leader){

	//if (leader["rank"] != undefined && leader["rank"] != "") {

		var leaderKeys = Object.keys(leader);

		var isFull = false;
   		if(leader["category"] != null)
   		{
   			isFull = (leader["category"].toLowerCase().indexOf("full") != -1);
		}


		var rowHtml = '<tr>';

		//rank cell
			//rank cell
       	if ( leader["rank"] != undefined && leader["rank"] != "" && leader["rank"] != null) {
       		rowHtml += '<td>' + leader["rank"] + '</td>';
       	}
       	else
       	{
       		rowHtml += '<td>Unranked</td>';
		}




		var teamName = leader["team"].replace(/\d+\s-\s/, "");





		var lastCheckpoint = GetLastCheckpoint(leader);


		var leaderDescription = ' ';

		if(lastCheckpoint != undefined)
		{
			if(lastCheckpoint.Label != 'started' || lastCheckpoint.Label != 'ended')
				leaderDescription +=  'through ' + lastCheckpoint.Label;
			else
				leaderDescription += lastCheckpoint.Label;

			leaderDescription += " at " + lastCheckpoint.datetime_in;

		}


		rowHtml += '<td>' + teamName + leaderDescription + '</td>';



		if ( leader["category"] != undefined && leader["category"] != "" && leader["category"] != null) {
       		rowHtml += '<td>' + GetCategoryName(leader["category"]) + '</td>';
       	}
       	else
       	{
       		rowHtml += '<td>Unknown</td>';
		}



		rowHtml += '</tr>';

		return rowHtml;
	//}

	//return '';

}


function GetLastCheckpoint(leader){

	var lastCheckpoint = undefined;

	if(leader["START"] != undefined)
	{

		lastCheckpoint = leader["START"]
		lastCheckpoint.Label = "started";

	}


	var leaderKeys = Object.keys(leader);

	//loop through 25 checkpoints
	//for(var i=1; i <= 25; i++)

	for(var i=1; i <= 22; i++)
	{
		var checkpoint = GetCheckpoint(leaderKeys, leader, i);

		if(checkpoint != undefined)
		{
			lastCheckpoint = checkpoint;
			lastCheckpoint.Label = "CP #" + i;
		}
	}

	if(leader["FINISH"] != undefined)
	{
		lastCheckpoint = leader["FINISH"];
		lastCheckpoint.Label = "ended";
	}

	return lastCheckpoint;

}


function GetLeaderboardTableRow(leader){


	//if (leader["rank"] != undefined && leader["rank"] != "") {

   		var leaderKeys = Object.keys(leader);

   		var isFull = false;
   		if(leader["category"] != null)
   		{
   			isFull = (leader["category"].toLowerCase().indexOf("full") != -1);
		}



   		var rowHtml = '<tr>';

       	//rank cell
       	if ( leader["rank"] != undefined && leader["rank"] != "" && leader["rank"] != null) {
       		rowHtml += '<td>' + leader["rank"] + '</td>';
       	}
       	else
       	{
       		rowHtml += '<td>Unranked</td>';
		}


       	//team cell
       	//rowHtml += '<td>' + leader["team"].replace(/\d+\s-\s/, "") + '</td>'; //get rid of number prefix on team name
		rowHtml += '<td>' + leader["team"] + '</td>';


       	//course cell -"
       	if ( leader["category"] != undefined && leader["category"] != ""  && leader["category"] != null) {
       		rowHtml += '<td>' + GetCategoryName(leader["category"]) + '</td>';
       	}
       	else
       	{
       		rowHtml += '<td>Unknown</td>';
		}





         	//start
		rowHtml +=  GetLeadboardCheckpointCell(leader["START"],0,isFull);



		//loop through all checkpoints

		//for(var i=1; i <= 25; i++)
		for(var i=1; i <= 22; i++)
		{
			var checkpoint = GetCheckpoint(leaderKeys, leader, i);

			rowHtml +=  GetLeadboardCheckpointCell(checkpoint,i,isFull);
		}


		//end
		rowHtml +=  GetLeadboardCheckpointCell(leader["FINISH"],26,isFull);


		rowHtml += '</tr>';

		return rowHtml;
	//}


	return '';


}

//created this function because had no idea what the key would be except for cp# pattern
function GetCheckpoint(leaderKeys, leader, cpNumber)
{
	var regEx = new RegExp("CP(\\d+)","i");


	for(var k=0; k < leaderKeys.length; k++)
	{
		var match = regEx.exec(leaderKeys[k]);

		if(match != null) //
		{
			var cpNumberFound = match[1]; //number portion of match

			if(cpNumberFound == cpNumber)
				return leader[leaderKeys[k]];
		}


	}


	return undefined;

}


function GetLeadboardCheckpointCell(checkpoint, cpNumber, isFull ){



	if(checkpoint != undefined)
	{
		var cpCellHtml = '<td>';

		var title = "Time in: " + checkpoint.datetime_in;

		if(checkpoint.datetime_out != null)
		{
			title += "<br />Time out: " + checkpoint.datetime_out;
		}

		cpCellHtml += '<a class="tiptipClass" title="' + title + '">';

		switch(cpNumber)
		{
			case 0:
			case 1:
			case 2:
				cpCellHtml += GetCheckpointIconImage('Trek');
				break;
			case 3:
			case 4:
			case 5:
				cpCellHtml += GetCheckpointIconImage('MTB');
				break;

			case 6:
				cpCellHtml += GetCheckpointIconImage('Paddling');
				break;
			case 7:
			case 8:
			case 9:
				cpCellHtml += GetCheckpointIconImage('Trek');
				break;
			//case 9:
			//	cpCellHtml += GetCheckpointIconImage('Rappel');
			//	break;
			case 10:
			case 11:
			case 12:
				cpCellHtml += GetCheckpointIconImage('MTB');
				break;
			case 13:
			case 14:
				cpCellHtml += GetCheckpointIconImage('Paddling');
				break;
			case 15:
			case 16:
				cpCellHtml += GetCheckpointIconImage('MTB');
				break;
			case 17:
			case 18:
				cpCellHtml += GetCheckpointIconImage('Trek');
				break;
			case 19:
			case 20:
				cpCellHtml += GetCheckpointIconImage('MTB');
				break;
			case 21:
				cpCellHtml += GetCheckpointIconImage('Trek');
				break;
				//if(isFull)
				//	cpCellHtml += GetCheckpointIconImage('Trek');
				//else
				//	cpCellHtml += GetCheckpointIconImage('MTB');
				//break;
			case 22:
				cpCellHtml += GetCheckpointIconImage('MTB');
				break;
			case 23:
			case 24:
			case 25:
			case 26:
				cpCellHtml += GetCheckpointIconImage('End');
				break;
			default:
				cpCellHtml += '&nbsp;';
				break;

		}


		cpCellHtml += '</a>';

		cpCellHtml += '</td>';


		//tooltip logic

		return cpCellHtml;

	}

	return '<td>&nbsp;</td>';


}


function GetCheckpointIconImage(iconType){

	switch(iconType)
	{
		case 'Trek':
			return '<img src="/RTNx/Images/icon-trekking.gif" alt="Trek" />';
		case 'MTB':
			return '<img src="/RTNx/Images/icon-cycling.gif" alt="MTB" />';
		case 'Paddling':
			return '<img src="/RTNx/Images/icon-paddling.gif" alt="Paddling" />';
		case 'Rappel':
			return '<img src="/RTNx/Images/icon-rappel.gif" alt="Rappel" />';
		case 'End':
			return '<img src="/RTNx/Images/icon-finish.gif" alt="Finish" />';

	}


	return '';
}


function GetCategoryName(rawName) {

      	//get rid of number prefix and make lowercase
      	var name = rawName.replace(/\d{2}\s-\s/, "").toLowerCase();

      	//make each word capital
      	return name.replace(/(^|\s)([a-z])/g, function (m, p1, p2) { return p1 + p2.toUpperCase(); });


}
