// Javascript to convert times and frequencies between Earth and model

var sec_per_min = 60;
var sec_per_hour = 3600;
var sec_per_day = 86400;
var sec_per_week = sec_per_day * 7;
var sec_per_month = sec_per_day * 30;
var sec_per_year = sec_per_day * 365;

function getButton(button) {
	var result = "undefined";
	for (var i=0;i<button.length;i++) {
		if (button[i].checked) {
			result = button[i].value;
			break;
		}
	}
	return result;
}

// better version: accepts radio buttons to select the geometry
function DoScaling(theForm) {
	var form = normalInput(theForm);
	var units = getButton(form.units);
	var direction = getButton(form.a_or_d);
	
	// first convert the input to seconds
	var the_secs;
	if (the_secs < 0) {
		the_secs = -the_secs;
	}
	switch (units) {
	case "Hz":
		if (form.input_val.value == 0) {
			the_secs = 0;
		} else {
			the_secs = 1./form.input_val.value;
		}
		break;
	case "secs":
		the_secs = form.input_val.value;
		break;
	case "mins":
		the_secs = form.input_val.value * sec_per_min;
		break;
	case "hours":
		the_secs = form.input_val.value * sec_per_hour;
		break;
	case "days":
		the_secs = form.input_val.value * sec_per_day;
		break;
	case "weeks":
		the_secs = form.input_val.value * sec_per_week;
		break;
	case "months":
		the_secs = form.input_val.value * sec_per_month;
		break;
	case "years":
		the_secs = form.input_val.value * sec_per_year;
		break;
	default:
		the_secs = 0;
		break;
	}
	
	// scale it
	if (form.scale_factor.value < 0) {
		form.scale_factor.value = 0;
	};
	switch (direction) {
	case "accel":
		the_secs /= form.scale_factor.value;
		break;
	case "decel":
		the_secs *= form.scale_factor.value;
		break;
	default:
		the_secs=0;
		break;
	}
	
	form.Hz.value = ( (the_secs == 0) ? 0 : 1/the_secs);
	form.secs.value = the_secs;
	form.mins.value = the_secs	/ sec_per_min;
	form.hours.value = the_secs	/ sec_per_hour;
	form.days.value = the_secs	/ sec_per_day;
	form.weeks.value = the_secs	/ sec_per_week;
	form.months.value = the_secs/ sec_per_month;
	form.years.value = the_secs	/ sec_per_year;
	theForm = normalOutput(form);
}


// Tidy up the input values
function normalInput(x) {
	x.scale_factor.value = normz(3,x.scale_factor.value);
	x.input_val.value = normz(3,x.input_val.value);
	return x;
}

// Tidy up the output values
function normalOutput(x) {
	x.Hz.value 	= tidyVal(x.Hz.value);
	x.secs.value 	= tidyVal(x.secs.value);
	x.mins.value 	= tidyVal(x.mins.value);
	x.hours.value 	= tidyVal(x.hours.value);
	x.days.value 	= tidyVal(x.days.value);
	x.weeks.value 	= tidyVal(x.weeks.value);
	x.months.value 	= tidyVal(x.months.value);
	x.years.value 	= tidyVal(x.years.value);
	return x;
}


function tidyVal(x) {
	var result = roundFixedToPlace(3, normz(3,x));
	return result;
}
// Force a number that's within 10**-e of zero to BE zero
function normz(e,x) {
	if (e < 0) {
		e = -e;
	}
	var zero = Math.pow(10,-e);
	if (Math.abs(x) <= zero) {
		return 0;
	} else {
		return x;
	}
}

// Round a fixed-point number to the nth decimal place
function roundFixedToPlace(n,x) {
	var shift = Math.pow(10,n);
	var z = (Math.round(x * shift))/shift;
	return z;
}
	
function log10(x)
{
  return Math.log(x)/Math.log(10);
}
