﻿// * * * * * * * * * * * * *
// Pace Calculator 1.0
// created by: Keith Jenci
// http://www.mredkj.com
// * * * * * * * * * * * * *

// constants
var TIME = 0;
var DISTANCE = 1;
var PACE = 2;
var MILES = 0;
var METERS = 1;
var KILOMETERS = 2;

// preload images
var distOff = new Image;
distOff.src="images/calc/runDistOff.gif";
var distOn = new Image;
distOn.src="images/calc/runDistOn.gif";
var paceOff = new Image;
paceOff.src="images/calc/runPaceOff.gif";
var paceOn = new Image;
paceOn.src="images/calc/runPaceOn.gif";
var timeOff = new Image;
timeOff.src="images/calc/runTimeOff.gif";
var timeOn = new Image;
timeOn.src="images/calc/runTimeOn.gif";

function changePics(calculateFor)
{
	document.aspnetForm.timePic.src=timeOn.src;
	document.aspnetForm.distPic.src=distOn.src;
	document.aspnetForm.pacePic.src=paceOn.src;

	if (calculateFor==TIME)
	{	document.aspnetForm.timePic.src=timeOff.src; }
	else if (calculateFor==DISTANCE)
	{	document.aspnetForm.distPic.src=distOff.src; }
	else if (calculateFor==PACE)
	{	document.aspnetForm.pacePic.src=paceOff.src; }
}

function calcIT()
{
	// Time
	var hour=document.aspnetForm.timeH.value;
	var min=document.aspnetForm.timeM.value;
	var sec=document.aspnetForm.timeS.value;
	var t= (min*1) + (sec/60) + (hour * 60);

	// Distance
	var d=document.aspnetForm.distance.value;

	// Pace
	var minP=document.aspnetForm.paceM.value;
	var secP=document.aspnetForm.paceS.value;
	var p = (minP*1) + (secP/60);

	// Which result
	var resultValue=document.aspnetForm.CalcWhat.options[document.aspnetForm.CalcWhat.selectedIndex].value;

	if (resultValue==TIME)
	{
		// conversions (both to meters)
		d = distConversion(d, true);
		p = paceConversion(p, true);

		// calculate TIME and round
		t=d*p;
		min=Math.floor(t);
		sec=Math.round(60*(t-min));
		if (sec == 60)
		{
			// to prevent 60 seconds from showing up in the seconds field
			min++;
			sec=0;
		}
		
		// floor: next LOWEST integer
		var totalHours = Math.floor(min / 60);
		
		document.aspnetForm.timeH.value = totalHours;
		document.aspnetForm.timeM.value= (min - (totalHours * 60));
		document.aspnetForm.timeS.value=sec;
	}
	else if (resultValue==DISTANCE)
	{
		// conversion before (pace to meters)
		p = paceConversion(p, true);

		// calculate DISTANCE
		d=t/p;

		// conversion after (distance to desired)
		d = distConversion(d, false);

		// rounding
		document.aspnetForm.distance.value=decimalPlaces(d,2);
	}
	else if (resultValue==PACE)
	{
		// conversion before (distance to meters)
		d = distConversion(d, true);

		// calculate PACE
		p=t/d;

		// conversion after (pace to desired)
		p = paceConversion(p, false);

		// rounding
		minP=Math.floor(p);

		secP=Math.round(60*(p-minP));

		if (secP == 60)
		{
			// to prevent 60 seconds from showing up in the seconds field
			minP++;
			secP = 0;
		}
		document.aspnetForm.paceM.value=minP;
		document.aspnetForm.paceS.value=secP;
	}
}

// when converting distance to meters, multiply by conversion constant
function distConversion(d, toMeters)
{
	if (document.aspnetForm.optDist[MILES].checked)
	{
		// convert miles
		d = (toMeters) ? (d*1609) : (d/1609); 
	}
	else if (document.aspnetForm.optDist[METERS].checked)
	{
		// already in meters
	}
	else if (document.aspnetForm.optDist[KILOMETERS].checked)
	{
		// convert kilometers
		d = (toMeters) ? (d*1000) : (d/1000);
	}
	
	return d;
}

// when converting pace to meters, divide by conversion constant
function paceConversion(p, toMeters)
{
	if (document.aspnetForm.optPace[MILES].checked)
	{	
		// convert miles
		p = (toMeters) ? (p/1609) : (p*1609); 
	}
	else if (document.aspnetForm.optPace[METERS].checked)
	{
		// convert 400 meters
		p = (toMeters) ? (p/400) : (p*400);
	}
	else if (document.aspnetForm.optPace[KILOMETERS].checked)
	{
		// convert kilometers
		p = (toMeters) ? (p/1000) : (p*1000);
	}

	return p;
}

function clearNums()
{
	document.aspnetForm.timeM.value=0;
	document.aspnetForm.timeS.value=0;
	document.aspnetForm.distance.value=0;
	document.aspnetForm.paceM.value=0;
	document.aspnetForm.paceS.value=0;
}

function decimalPlaces(val, places)
{
	// This function returns the value
	// with the number of decimal places requested
	factor = 1;
	for (i=0; i<places; i++)
	{	factor *= 10; }
	val *= factor;
	val = Math.round(val);
	val /= factor;
	return val;
}

function defaultStuff()
{
	// set list box default to PACE
	document.aspnetForm.CalcWhat.selectedIndex=2;
	
	// set option buttons to defaults
	document.aspnetForm.optDist[0].checked=true;
	document.aspnetForm.optPace[0].checked=true;
}