var nStoredPoints = 0;
var nStoredDistance = 0;

function SetRaceDistance(nDistance)
{
    if (nDistance == "")
        return;

    nStoredDistance = nDistance;
    document.calc.nDistance.value = nDistance + " km";
    document.calc.nTime.focus();
    document.calc.nTime.select();
}

function CalcPoints()
{
    f = document.calc;

    if (nStoredDistance && f.nTime.value != "")
    {
        nDistance = f.nDistance.value.split(" ");

        if (isNaN(parseFloat(nDistance[0])) || !nDistance[0])
            return;

        nDistanceKM = nStoredDistance

        if (nDistance[1] == "miles")
            nDistanceKM = nDistanceKM * 1.609344;

        nSeconds = GetSeconds();

        if (!isNaN(parseFloat(nSeconds)))
        {
            nStoredPoints = Formula(nDistanceKM,nSeconds);

            if (!isNaN(parseFloat(nStoredPoints)))
            {
                f.nPoints.value = Math.round(nStoredPoints * 10) / 10;
                CalcPaces(nSeconds,nDistanceKM);
            }

            CalcEquivalents();
        }
    }
}

function CalcTime ()
{
    if (nStoredDistance)
    {
        f = document.calc;

        nDistance = f.nDistance.value.split(" ");

        if (nDistance[0] == "")
            return;

        nDistanceKM = nStoredDistance;

        if (nDistance[1] == "miles")
            nDistanceKM = nDistanceKM * 1.609344;

        if (f.nPoints.value == "" || isNaN(f.nPoints.value) || isNaN(nStoredDistance))
            return;

        else
        {
            nStoredPoints = f.nPoints.value
            nSeconds = Formula (nDistanceKM, nStoredPoints);
            f.nTime.value = FormatTime (nSeconds);
            CalcPaces(nSeconds,nDistanceKM);
        }

        CalcEquivalents();
    }
}

function CalcPaces(nSeconds,nDistanceKM)
{
    f = document.calc;

    f.nKPace.value = FormatTime (nSeconds / nDistanceKM);
    f.nMPace.value = FormatTime (nSeconds / nDistanceKM * 1.609344);
}

function ExtendPace (nPaceType)
{
    f = document.calc;

    if (nStoredDistance && f.nDistance.value != "")
    {
        var nPace;

        if (nPaceType == "mi")
        {
            nPace = f.nMPace.value;
            if (nPace == "")
                return;
        }

        else
        {
            nPace = f.nKPace.value;
            if (nPace == "")
                return;
        }


        if (nPace.length == 4)
        {
            nSeconds = (nPace.substring(0,1) * 60);
            nSeconds = nSeconds + (nPace.substring(2,4) * 1);
        }
        else
        {
            if (nPace.length == 5)
            {
                nSeconds = (nPace.substring(0,2) * 60);
                nSeconds = nSeconds + (nPace.substring(3,5) * 1);
            }
            else
                return;
        }

        if (isNaN(nSeconds))
            return;

        if (nPaceType == "mi")
        {
            f.nKPace.value = FormatTime(nSeconds / 1.609344);
            nSeconds = nSeconds / 1.609344;
        }
        else
            f.nMPace.value = FormatTime(nSeconds * 1.609344);

        nDistanceKM = nStoredDistance;

            nDistance = document.calc.nDistance.value.split(" ");

        if (nDistance[1] == "miles")
            nDistanceKM = nDistanceKM * 1.609344;

        nSeconds = nDistanceKM * nSeconds;
        f.nTime.value = FormatTime (nSeconds);
        nStoredPoints = Formula (nDistanceKM, nSeconds);
        f.nPoints.value = Math.round (nStoredPoints);

        CalcEquivalents();
    }
}

function GetSeconds()
{
    nTime = document.calc.nTime.value

    if (!isNaN(nStoredDistance))
    {
        nTimeLength = nTime.length;

        if (!isNaN(parseFloat(nTime.substring(nTimeLength-2,nTimeLength))))
            nSeconds = nTime.substring(nTimeLength-2,nTimeLength) * 1;
        else return 0;

        if (nTimeLength == 4)
            if (!isNaN(parseFloat(nTime.substring(0,1))))
                nSeconds = nSeconds + nTime.substring(0,1) * 60;
            else return 0;

        if (nTimeLength == 5)
            if (!isNaN(parseFloat(nTime.substring(0,2))))
                nSeconds = nSeconds + nTime.substring(0,2) * 60;
            else return 0;

        if (nTimeLength == 7)
            if (!isNaN(parseFloat(nTime.substring(2,4))) && !isNaN(parseFloat(nTime.substring(0,1))))
            {
                nSeconds = nSeconds + nTime.substring(2,4) * 60;
                nSeconds = nSeconds + nTime.substring(0,1) * 3600;
            }
            else return 0;
    }

    return nSeconds;
}

function Formula (nDistance, nDivisor)
{
    if (!isNaN(parseFloat(nDistance)) && !isNaN(parseFloat(nDivisor)))
        return (141113 * Math.pow(nDistance, 1.0689) / nDivisor);
    else
        return 0;
}

function Convert(sUnit)
{
    nDistance = document.calc.nDistance.value.split(" ");

    if (nDistance[1] != sUnit && nDistance[0] != "")
    {

        if (sUnit == "km")
        {
            document.calc.nDistance.value = Math.round(nStoredDistance * 1.609344 * 100000)/100000 + " km"
            nStoredDistance = nStoredDistance * 1.609344;
        }

        else
        {
            document.calc.nDistance.value = Math.round(nStoredDistance / 1.609344 * 100000)/100000 + " miles"
            nStoredDistance = nStoredDistance / 1.609344;
        }

        document.calc.nTime.focus();
        document.calc.nTime.select();
    }
}

function ValidateInput()
{
    oDistance = document.calc.nDistance;

    while(oDistance.value.charAt(0) == ' ')
        oDistance.value = oDistance.value.substring(1,oDistance.value.length);

    nDistance = oDistance.value.split(" ");

    if (isNaN(parseFloat(nDistance[0])) || !nDistance[0])
        oDistance.value = "";

    else
    {
        nStoredDistance = parseFloat(nDistance[0]);

        if (nDistance[1] && nDistance[1].substring(0,1) == "m")
            oDistance.value = parseFloat(nDistance[0]) + " miles";
        else
            oDistance.value = parseFloat(nDistance[0]) + " km";
    }
}

function FormatTime (nSeconds)
{
    if (!isNaN(parseFloat(nSeconds)) && nSeconds != 0)
    {
        sTime = "";
        nSeconds = Math.round(nSeconds);

        if (nSeconds >= 3600)
        {
            sTime = Math.floor (nSeconds / 3600) + ":";
            nSeconds = nSeconds - Math.floor (nSeconds / 3600) * 3600
        }

        if (nSeconds >= 60)
        {
            if ((nSeconds < 600) && (sTime != ""))
                sTime = sTime + "0";

            sTime = sTime + Math.floor (nSeconds / 60) + ":";
            nSeconds = nSeconds - Math.floor (nSeconds / 60) * 60;
        }

        else
            sTime = sTime + "00:";

        if (Math.round(nSeconds) < 10)
            sTime = sTime + "0";

        sTime = sTime + Math.round (nSeconds);

        return sTime;
    }
    else
        return "";
}

function CalcEquivalents()
{
    f = document.calc;

    f.nK3.value = FormatTime (Formula (3, nStoredPoints));
    f.nK4.value = FormatTime (Formula (4, nStoredPoints));
    f.nK5.value = FormatTime (Formula (5, nStoredPoints));
    f.nK6.value = FormatTime (Formula (6, nStoredPoints));
    f.nK8.value = FormatTime (Formula (8, nStoredPoints));
    f.nK10.value = FormatTime (Formula (10, nStoredPoints));
    f.nK12.value = FormatTime (Formula (12, nStoredPoints));
    f.nK15.value = FormatTime (Formula (15, nStoredPoints));
    f.nK20.value = FormatTime (Formula (20, nStoredPoints));
    f.nHalf.value = FormatTime (Formula (21.0975, nStoredPoints));
    f.nMarathon.value = FormatTime (Formula (42.195, nStoredPoints));
    if (!isNaN(parseFloat(nStoredPoints)))
    {
        f.nVO2400.value = FormatTime (GetVO2 (nStoredPoints, 0.4)) + " per 400m";
        f.nVO2.value = FormatTime (GetVO2 (nStoredPoints, 1.0)) + " per km";
        f.nLTkm.value = FormatTime (GetLT (nStoredPoints, 1.0)) + " per km";
        f.nLTMile.value = FormatTime (GetLT (nStoredPoints, 1.609344)) + " per mile";
        ListSplits();
    }
}

function GetVO2 (nPoints, nDistance)
{
    return (((10 / Math.pow((nPoints / 235.188333),0.93554121)) * nDistance * 60));
}

function GetLT (nPoints, nDistance)
{
    return (((60 / Math.pow((nPoints / 39.198),0.93554121)) * nDistance * 60));
}

function ListSplits()
{
    f = document.calc;
    sMsg = "Split Times\n";

    nDistance = f.nDistance.value.split(" ");

    for (i=1;i<=parseFloat(nDistance[0]);i++)
    {
        sUnit = nDistance[1];

        if (sUnit == "miles" && i == 1)
            sUnit = "mile ";

        sMsg += ("\n" + i + " " + sUnit + ": " + FormatTime(GetSeconds() / nStoredDistance * i));
    }

    f.sSplits.value = sMsg;
    if (nDistance[1] == "km")
        f.sChangeSplits.value = "Convert to miles";
    else
        f.sChangeSplits.value = "Convert to km";
}

function ChangeSplits()
{
    f = document.calc;

    nDistance = f.nDistance.value.split(" ");

    if (nDistance[1] == "km")
    {
        Convert("miles");
        CalcPoints();
        f.sChangeSplits.value = "Convert to km";
    }
    else if (nDistance[1] == "miles")
    {
        Convert("km");
        CalcPoints();
        f.sChangeSplits.value = "Convert to miles";
    }
}
