// This array is used to assign #'s that are greater than 9 a meaningful value
var convert = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

function CheckInput()
{

	var nNumber = document.getElementById('frmConvertBase').txtNumber.value;
	var nBase = document.getElementById('frmConvertBase').txtBase.value;
	var nNewBase = document.getElementById('frmConvertBase').txtNewBase.value;
	var nMaxBase = convert.length;
	var i;
	var x;
	var sChar;
	var bIsInArray;
	var sNumberArray;

	// must have values
	if ((nNumber == "") || (nBase == "") || (nNewBase == ""))
		return false;

	// must have numeric values (numbers include anything in the convert array)
	for (i=0; i<String(nNumber).length; i++)
	{
		bIsInArray = false;
		sChar = String(nNumber).substr(i, 1).toUpperCase();
		for (x=0; x<convert.length; x++)
		{
			if (sChar == convert[x])
			{
				bIsInArray = true;
				if (x >= nBase)
				{
					alert("The number you entered contains characters that are out of bounds of its base.  All characters must be less than the value of the base.");
					document.getElementById('frmConvertBase').txtNumber.focus();
					return false;
				}
			}

			if ((sChar == '-') && (i==0))
				bIsInArray = true;
		}

		if (!bIsInArray)
		{

			for (x=0; x<convert.length; x++)
			{
				if (x==0)
				{
					sNumberArray = convert[x];
				}
				else
				{
					sNumberArray = sNumberArray + ", " + convert[x];
				}
			}

			alert("Please enter a numeric value to translate.  Valid characters include the following:\n" + sNumberArray);
			document.getElementById('frmConvertBase').txtNumber.focus();
			return false;
		}
	}

	if (isNaN(Number(nBase)) || (nBase < 1) || (nBase > nMaxBase))
	{
		alert("Please enter a numeric base for the number you wish to convert.  The base must be between 1 and " + nMaxBase + ".");
		document.getElementById('frmConvertBase').txtBase.focus();
		return false;
	}

	if (isNaN(Number(nNewBase)) || (nNewBase < 1) || (nNewBase > nMaxBase))
	{
		alert("Please enter a numeric base for the number you wish to convert.  The new base must be between 1 and " + nMaxBase + ".");
		document.getElementById('frmConvertBase').txtNewBase.focus();
		return false;
	}

	return true;
}

function ConvertBase()
{
	var nOrigNumber = document.getElementById('frmConvertBase').txtNumber.value;
	var nOrigBase = document.getElementById('frmConvertBase').txtBase.value;
	var nNewBase = document.getElementById('frmConvertBase').txtNewBase.value;
	var bNegative = false;

	var nNewNumber;

	if (!CheckInput())
		return;

	// Negative number?
	if (String(nOrigNumber).substr(0, 1) == '-')
	{
		bNegative = true;
		nOrigNumber = String(nOrigNumber).substr(1, String(nOrigNumber).length - 1)
	}

	//First order of business:  convert to decimal
	if (nOrigBase != 10)
	{
		nNewNumber = ConvertToBase10(nOrigNumber, nOrigBase);
	}
	else
	{
		nNewNumber = nOrigNumber;
	}

	//Now convert to the new base
	nNewNumber = ConvertFromBase10(nNewBase, nNewNumber);
	if (bNegative)
	{
		nNewNumber = '-' + nNewNumber;
	}
	document.getElementById('frmConvertBase').txtNewNumber.value = nNewNumber;
}

function RaiseToPower(nBase, nExp)
{
	return Math.pow(nBase, nExp)
}


function ConvertToBase10(nOrigNumber, nBase)
{
	var nReturn;
	var i;
	var nBaseUnit;
	var nExp;

	nReturn = 0;

	for (i=0;i<String(nOrigNumber).length;i++)
	{
		nBaseUnit = String(nOrigNumber).substr(i, 1).toUpperCase();
		for (var y=0; y<convert.length; y++)
		{
			if (nBaseUnit == convert[y])
			{
				nBaseUnit = y;
				continue;
			}
		}
		nExp = Number(String(nOrigNumber).length) - 1 - i;
		nReturn = nReturn + nBaseUnit * RaiseToPower(nBase, nExp);
	}

	return nReturn;
}

function sdTrunc(nNumber)
{
	var iDecimal;

	iDecimal = String(nNumber).search(/\./);

	if (iDecimal != -1)
	{
		if (iDecimal == 0)
		{
			nNumber = 0
		}
		else
		{
			nNumber = String(nNumber).substr(0, iDecimal);
		}
	}

	return nNumber;
}

function ConvertFromBase10(nNewBase, nOrigNumber)
{
	var iPower;
	var sNewNum;
	var nRemainder;
	var sNewIncrement;

	iPower = 0;

	while (nOrigNumber / RaiseToPower(nNewBase, iPower) > 1)
	{
		iPower++;
	}

	sNewNum = "";
	nRemainder = nOrigNumber;

	for (iPower; iPower>-1; iPower--)
	{
		sNewIncrement = sdTrunc(nRemainder / RaiseToPower(nNewBase, iPower));
		sNewIncrement = convert[sNewIncrement];
		sNewNum = sNewNum + sNewIncrement;
		nRemainder = nRemainder % RaiseToPower(nNewBase, iPower);
	}
	
	// Remove any leading 0's
	while (String(sNewNum).substr(0, 1) == "0")
	{
		sNewNum = String(sNewNum).substr(1, String(sNewNum).length - 1);
	}

	return sNewNum;

}
