/**
 * @author j
 */
function checkInput()
{
	//var allowedChars = "0123456789"
	var input = $F("inputNumber");
	var output = "";
	if(validateChars(input, $F("inputBase")) && isPlausibleResult())
	{
		output = input;
		$("inputNumber").value = output.toUpperCase();
		$("errorIndicator").innerHTML = "";
	}
	else
	{
		if(!(validateChars(input, $F("inputBase"))))
		{
			$("errorIndicator").innerHTML = "Character invalid.";			
		}
		else if(!isPlausibleResult())
		{
			$("errorIndicator").innerHTML = "Number too big.";						
		}
		else
		{
			$("errorIndicator").innerHTML = "Unspecified error.";			
		}
		output = input.substring(0, input.length-1);
		$("inputNumber").value = output.toUpperCase();
		new Effect.Highlight("errorIndicator", {startcolor:'#333333', endcolor:'#FFFFFF', restorecolor:'#FFFFFF'});
	}
	$("outputNumber").innerHTML = calculateResult(output, $F("inputBase"), $F("outputBase"));
	if(!isPlausibleResult())
	{
		$("errorIndicator").innerHTML += "Number too big."
	}
	updateDescription();

}

function calculateResult(num, inBase, outBase)
{
	//mere conversions
	//return decToN(nToDec(num, inBase), outBase);
	//allow for simple calculations involving +, -, *, / as well
	
	//parse for operators
	var part1 = "";
	var part2 = "";
	for(var i = 0; i < num.toString().length; i++)
	{
		var ops = ['+','-','*','/']
	//	ops.each( function(op){
	//		if(num.indexOf(op))
	//	})
	}

	//first, transform input to decimal
	decNum = nToDec(num, inBase);
	
	
	
	//perform calculations
	
	//transform to output base and return
	return decToN(decNum, outBase);
}

function performCalculation(val1, val2, op)
{
	var result;
	switch(op)
	{
		case "+":
			result = val1 + val2;
		break;
		case "-":
			result = val1 - val2;
		break;
		case "*":
			result = val1 * val2;
		break;
		case "/":
			result = val1 / val2;
		break;
	}
	return result;
}

function updateDescription()
{
	$('inBase').innerHTML = $F('inputBase');
	$('outBase').innerHTML = $F('outputBase');
}

function isPlausibleResult()
{
	var iBase = $F("inputBase");
	var oBase = $F("outputBase");
	var iVal = $F("inputNumber").toUpperCase();
	var oVal = $("outputNumber").innerHTML.toUpperCase();
	
	if(iVal == calculateResult(iVal, iBase, iBase) || iVal == "")
	{
		return true;
	}
	return false;
}

function clearInput()
{
	$("inputNumber").value="";
	checkInput();
}

function decToN(input, newBase)
{
	var allChars = "0123456789abcdefghijklmnopqrstuvwxyz";
	var output = "";
	var modulo = "0";
	var tmpOut = input;
	do
	{
		modulo = tmpOut%newBase;
		tmpOut = tmpOut/newBase;
		tmpOut = parseInt(tmpOut).toString();
		modulo = allChars.substr(modulo,1);
		output = output + modulo;
	}
	while(tmpOut!=0)
	return reverseString(output.toUpperCase());
}

function nToDec(num, base)
{
	var allChars = "0123456789abcdefghijklmnopqrstuvwxyz";
	var part;
	var tmpOut = 0;
	for(var i=0; i<num.toString().length; i++)
	{
		part = num.toString().substr(num.toString().length-i-1,1);
		part = allChars.indexOf(part.toLowerCase());
		part = part * Math.pow(base, i);
		tmpOut += part;
	}
	return tmpOut;
}

//checks for illegal characters based on some base. returns true or false.
function validateChars(num, base)
{
	var allChars = "0123456789abcdefghijklmnopqrstuvwxyz";
	var allowedChars = allChars.substr(0,base);
	for(var i=0; i<num.toString().length; i++)
	{
		if(allowedChars.indexOf(num.toString().substr(num.toString().length-1-i,1).toLowerCase())== -1)
		{
			return false;
		}
	}
	return true;
}

function reverseString(input)
{
	var tmp = "";
	for(var i=0; i<input.length; i++)
	{
		tmp += input.substr(input.length-i-1,1);
	}
	return tmp;
}
