// Source code is copyright 2004 USA Track & Field, Inc.

// All times are automatic; add 0.24 for hand times for events shorter than 400m; add 0.14 for hand times in the 400m


function calculateScoring(combinedEvent, subEvent, mark)
{
	if (mark != '')
	{
		if (! ( isValidMetricMark(mark) || isValidTime(mark) ))
			alert('Invalid mark (please use the format 0.00 for metric marks or mm:ss.ss for times)');
		else
		{
			document.getElementById(combinedEvent + '_' + subEvent).innerHTML = doCalculation(combinedEvent.charAt(0), subEvent, mark);
			document.getElementById(combinedEvent + '_total').innerHTML = getTotalPts(combinedEvent);
		}
	}
	else
	{
		document.getElementById(combinedEvent + '_' + subEvent).innerHTML = '';
		document.getElementById(combinedEvent + '_total').innerHTML = getTotalPts(combinedEvent);
	}
}


// ---------------


function getTotalPts(combinedEvent)
{
	var totalPts = 0;
	var eventsArray = getSubEvents(combinedEvent);
	
	for (var i = 0; i < eventsArray.length; i++)
	{
		if (document.getElementById(combinedEvent + '_' + eventsArray[i]).innerHTML)
			totalPts += parseInt(document.getElementById(combinedEvent + '_' + eventsArray[i]).innerHTML);
	}
	
	return totalPts;
}


function getSubEvents(combinedEvent)
{
	var eventsArray;
	
	switch (combinedEvent)
	{
		case 'modec' :
			eventsArray = new Array('100', 'LJ', 'SP', 'HJ', '400', '110H', 'DT', 'PV', 'JT', '1500');
			break;
		case 'mopent' :
			eventsArray = new Array('LJ', 'JT', '200', 'DT', '1500');
			break;
		case 'mihept' :
			eventsArray = new Array('60', 'LJ', 'SP', 'HJ', '60H', 'PV', '1000');
			break;
		case 'mipent' :
			eventsArray = new Array('60H', 'LJ', 'SP', 'HJ', '1000');
			break;
		case 'wohept' :
			eventsArray = new Array('100H', 'HJ', 'SP', '200', 'LJ', 'JT', '800');
			break;
		case 'wodec' :
			eventsArray = new Array('100', 'DT', 'PV', 'JT', '400', '100H', 'LJ', 'SP', 'HJ', '1500');
			break;
		case 'wipent' :
			eventsArray = new Array('60H', 'HJ', 'SP', 'LJ', '800');
			break;
	}
	
	return eventsArray;
}


// ---------------


function doCalculation(sex, eventName, mark)
{
	var a, b, c;
	
	if (sex == 'm')
	{
		switch (eventName)
		{
			// Indoor
			case '60' :
				a = 58.0150;
				b = 11.5;
				c = 1.81;
					return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '1000' :
				a = 0.08713;
				b = 305.5;
				c = 1.85;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '60H' :
				a = 20.5173;
				b = 15.5;
				c = 1.92;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			
			// Outdoor
			case '100' :
				a = 25.4347;
				b = 18;
				c = 1.81;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '200' :
				a = 5.8425;
				b = 38;
				c = 1.81;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '400' :
				a = 1.53775;
				b = 82;
				c = 1.81;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '1500' :
				a = 0.03768;
				b = 480;
				c = 1.85;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '110H' :
				a = 5.74352;
				b = 28.5;
				c = 1.92;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case 'HJ' :
				a = 0.8465;
				b = 75;
				c = 1.42;
				return calculateField(getCentimeters(mark), a, b, c);
				break;
			case 'PV' :
				a = 0.2797;
				b = 100;
				c = 1.35;
				return calculateField(getCentimeters(mark), a, b, c);
				break;
			case 'LJ' :
				a = 0.14354;
				b = 220;
				c = 1.40;
				return calculateField(getCentimeters(mark), a, b, c);
				break;
			case 'SP' :
				a = 51.39;
				b = 1.5;
				c = 1.05;
				return calculateField(getMeters(mark), a, b, c);
				break;
			case 'DT' :
				a = 12.91;
				b = 4;
				c = 1.10;
				return calculateField(getMeters(mark), a, b, c);
				break;
			case 'JT' :
				a = 10.14;
				b = 7;
				c = 1.08;
				return calculateField(getMeters(mark), a, b, c);
				break;
			default :
				return null;
				break;
		}
	}
	else if (sex == 'w')
	{
		switch (eventName)
		{
			//Indoor
			case '60H' :
				a = 20.0479;
				b = 17;
				c = 1.835;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			
			// Outdoor
			case '100' :
				a = 17.8570;
				b = 21;
				c = 1.81;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '200' :
				a = 4.99087;
				b = 42.5;
				c = 1.81;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '400' :
				a = 1.34285;
				b = 91.7;
				c = 1.81;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '800' :
				a = 0.11193;
				b = 254;
				c = 1.88;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '1500' :
				a = 0.02883;
				b = 535;
				c = 1.88;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case '100H' :
				a = 9.23076;
				b = 26.7;
				c = 1.835;
				return calculateRunning(getSeconds(mark), a, b, c);
				break;
			case 'HJ' :
				a = 1.84523;
				b = 75;
				c = 1.348;
				return calculateField(getCentimeters(mark), a, b, c);
				break;
			case 'PV' :
				a = 0.44125;
				b = 100;
				c = 1.35;
				return calculateField(getCentimeters(mark), a, b, c);
				break;
			case 'LJ' :
				a = 0.188807;
				b = 210;
				c = 1.41;
				return calculateField(getCentimeters(mark), a, b, c);
				break;
			case 'SP' :
				a = 56.0211;
				b = 1.5;
				c = 1.05;
				return calculateField(getMeters(mark), a, b, c);
				break;
			case 'DT' :
				a = 12.3311;
				b = 3;
				c = 1.10;
				return calculateField(getMeters(mark), a, b, c);
				break;
			case 'JT' :
				a = 15.9803;
				b = 3.8;
				c = 1.04;
				return calculateField(getMeters(mark), a, b, c);
				break;
			default :
				return null;
				break;
		}
	}
	else
		return null;
}


// ---------------


function calculateRunning(mark, a, b, c)
{
	return Math.floor(a * Math.pow(b - mark, c));
}


function calculateField(mark, a, b, c)
{
	return Math.floor(a * Math.pow(mark - b, c));
}


// ---------------


function getSeconds(mark)
{
	var i;
	var mySeconds = 0;
	var tempTime = StrReverse(mark);
	var timeArray = tempTime.split(':')		// reverse the time string and split it at the colons
	
	for (i = 0; i < timeArray.length; i++)
		mySeconds += StrReverse(timeArray[i]) * Math.pow(60, i)
	
	return mySeconds;
}


function getMeters(mark)
{
	return mark;
}


function getCentimeters(mark)
{
	return mark * 100;
}


// ---------------


function isValidMetricMark(mark)
{
	return (/^[0-9]{1,3}(\.[0-9]{1,2}){0,1}$/).test(mark);
}


function isValidTime(mark)
{
	return (/(^([0-9]{1,2}\:){0,1}[0-9]{2}(\.[0-9]{1,2}){0,1}$)|(^[0-9]{1,2}(\.[0-9]{1,2}){0,1}$)/).test(mark);
}


// ---------------


function StrReverse(str)
{
	if (! str)
		return '';
	else
	{
		var revstr = '';
		for (i = str.length - 1; i >= 0; i--)
			revstr += str.charAt(i)
		
		return revstr;
	}
}