﻿$(function() {

	var	$calculator = $("table.rcfCalculator"),
			$radius = $("#txtRadius", $calculator),
			$rpm = $("#txtRPM", $calculator),
			$rcf = $("#txtRCF", $calculator),
			$status = $("#lblStatus", $calculator),
			$result = null;

	function floatToString(d) {
		var	regex = /(\d+(\.\d{1,3})?)/i,
				match = regex.exec(d.toString());
		return (match) ? d.toFixed(3).toString() : "0.0";
	}

	function getRadius() {
		var d = parseFloat($radius.val());
		return d;
	}
	function getRPM() {
		var d = parseFloat($rpm.val());
		return d;
	}
	function getRCF() {
		var d = parseFloat($rcf.val());
		return d;
	}
	
	function setRadius(d) {
		return $radius.val(floatToString(d));
	}
	function setRPM(d) {
		return $rpm.val(floatToString(d));
	}
	function setRCF(d) {
		return $rcf.val(floatToString(d));
	}
	
	function setStatus(s) {
		$status.text(s);
	}

	function removeHighlight() {
		if ($result) {
			$result.removeClass("highlight");
			$result = null;
		}
	}

	function clearForm() {
		removeHighlight();
		setRadius(0.0);
		setRPM(0.0);
		setRCF(0.0);
	}
	
	function validateFloat($text) {
		var	n = parseFloat($text.val());
		
		if (isNaN(n)) {
			$text.next("span.validate").text("!").show();
			return false;
		}
		
		$text.next("span.validate").hide();
		return true;
	}
	
	function validateForm() {
		var valid = true, rpm, radius, rcf;
		$("input.text", $calculator).each(function() {
			if (!validateFloat($(this))) {
				valid = false;
			}
		});

		if (!valid) {
			setStatus("Invalid input parameters - must be numeric!");
			return false;
		}
		
		rpm = getRPM();
		rcf = getRCF();
		radius = getRadius();

		if ((radius < 1.0) || (radius > 150.0)) {
			setStatus("Radius must be between 1cm and 150cm!");
			return false;
		}
		
		if ((rpm <= 0.0) && (rcf <= 0.0)) {
			setStatus("Specify either an RPM or RCF value!");
			return false;
		}
		
		if ((rpm > 0.0) && (rcf > 0.0)) {
			setStatus("Specify either a RPM or RCF value - not both!");
			return false;
		}
		
		return true;
	}
	
	
	function calculateRCF() {
		var	rpm, rcf;
		if (getRCF() > 0.0) {
			rpm = 299.0 * Math.sqrt(getRCF() / getRadius());
			// Abl.DEBUG.trace("rcf:" + getRCF() + ", rpm:" + getRPM() + ", rpm=" + rpm);
			$result = setRPM(rpm).addClass("highlight");
		} else {
			rcf = getRadius() * 11.18 * (getRPM() /1000.0) * (getRPM() / 1000.0);
			// Abl.DEBUG.trace("radius:" + getRadius() + ", rpm:" + getRPM() + ", rcf=" + rcf);
			$result = setRCF(rcf).addClass("highlight");
		}
	}
	
	$("#btnClear", $calculator).click(function() {
		clearForm();
		setStatus("");
	});
	
	$("#btnCalculate", $calculator).click(function() {
		removeHighlight();
		if (!validateForm()) {
			return;
		}
		calculateRCF();
	});
	
	$("input.text", $calculator).change(function() {
		var $text = $(this);
		if (!$text.val()) { $text.val("0.0"); }
		removeHighlight();
		validateFloat($(this));
	});
	
});
