//############################################################
//# VALIDATION
//############################################################

function isnumeric(n) {
	var validchars = "-0123456789.";
	var isnumber = true;
	for (i=0;i < n.length && isnumber == true;i++) { 
		if (validchars.indexOf(n.charAt(i)) == -1) {
			isnumber = false;
		}
	}
	return isnumber;
}

//############################################################
//# FRACTIONS
//############################################################


function dectofrac(decimal) {
	var maxdenominator = 32;
	var approx = 0;
	var error = 0;
	var best = 0;
	var besterror = 0;
	for (i=1; i <= maxdenominator; i++) {
		approx = Math.round(decimal/(1/i));
		error = (decimal - (approx/i))
		if (i==1) {
			best = i;
			besterror = error;
		}
		if (Math.abs(error) < Math.abs(besterror)) {
			best = i;
			besterror = error;
		}
	}
	return(Math.round(decimal/(1/best)) + "/" + best);
}

function fractodec(fraction) {
	var fractionarray = fraction.split("/");
	var numerator = 1;
	var denominator = 1;
	var number = 0;
	var decimal = fraction;
	if (fractionarray.length == 2) {
		var numeratorarray = fractionarray[0].split(" ");
		if (numeratorarray.length == 2) {
			number = numeratorarray[0];
		}
		numerator = numeratorarray[numeratorarray.length-1];
		denominator = fractionarray[1];
		if (isnumeric(number) && isnumeric(numerator) && isnumeric(denominator)) {
			decimal = parseInt(number) + parseFloat(numerator/denominator);
		}
	}
	return(decimal);
}
