// CETAC Automation DSA7 Time Savings Calculator

/*
 * uptakeDelay
 * readDelay
 * acquisitionTime
 * numberReplicates
 * washTime
 * samplesPerPeriod
 */
function AutoSampler (uptakeDelay, readDelay, acquisitionTime, 
					  numberReplicates, washTime, samplesPerPeriod) {
	
	//set some defaults if values are not provided or provided values are not numbers
	if (uptakeDelay == undefined || isNaN(parseFloat(uptakeDelay))) uptakeDelay = 0.0;
	if (readDelay == undefined || isNaN(parseFloat(readDelay))) readDelay = 0.0;
	if (acquisitionTime == undefined || isNaN(parseFloat(acquisitionTime))) acquisitionTime = 0.0;
	if (numberReplicates == undefined || isNaN(parseFloat(numberReplicates))) numberReplicates = 0.0;
	if (washTime == undefined || isNaN(parseFloat(washTime))) washTime = 0.0;
	if (samplesPerPeriod == undefined || isNaN(parseFloat(samplesPerPeriod))) samplesPerPeriod = 0.0;	
	
	//set properties in object
	this.uptakeDelay = uptakeDelay;
	this.readDelay = readDelay;
	this.acquisitionTime = acquisitionTime;
	this.numberReplicates = numberReplicates;
	this.washTime = washTime;
	this.samplesPerPeriod = samplesPerPeriod;	
}

AutoSampler.prototype.calculateAcquisitionTime = function calculateAcquistionTime () {
	return (this.acquisitionTime * this.numberReplicates);
}

AutoSampler.prototype.calculateAnalysisTime = function calculateAnalysisTime () {

	var uptakeDelay = new Number(parseFloat(this.uptakeDelay));
	var readDelay = new Number(parseFloat(this.readDelay));
	var acquisitionTime = this.calculateAcquisitionTime() 
	var washTime = new Number(parseFloat(this.washTime));
	
	return (uptakeDelay + readDelay + acquisitionTime + washTime);
}
		
AutoSampler.prototype.toString = function toString() {

	var uptakeDelayStr = 		"uptakeDelay : " + this.uptakeDelay;
	var readDelayStr = 			"readDelay : " + this.readDelay;
	var acquistionTimeStr = 	"acquistionTime : " + this.acquisitionTime;
	var numberReplicatesStr = 	"numberReplicates : " + this.numberReplicates;
	var washTimeStr = 			"washTime : " + this.washTime;
	var samplesPerPeriodStr = 	"samplesPerPeriod : " + this.samplesPerPeriod;
	
	var returnString = uptakeDelayStr + " @ " + readDelayStr + " @ " + acquistionTimeStr + " @ " +
					   numberReplicatesStr + " @ " + washTimeStr + " @ " + samplesPerPeriodStr;
	
	return returnString;
}

function CetacCalculator () {}

/*
 * standardAutoSampler - an AutoSampler instance
 * cetacAutoSampler - an AutoSampler instance
 */
CetacCalculator.prototype.calculateTotalSecondsSaved = 
	function calculateTotalSecondsSaved(standardAutoSampler, cetacAutoSampler) {

	//debug
	//alert(standardAutoSampler.toString());
	//alert(cetacAutoSampler.toString());
	return (standardAutoSampler.samplesPerPeriod * this.calculateTimeSavedPerSample(standardAutoSampler, cetacAutoSampler));

}

/*
 * standardAutoSampler - an AutoSampler instance
 * cetacAutoSampler - an AutoSampler instance
 */
CetacCalculator.prototype.calculateTimeSavedPerSample = 
	function calculateTimeSavedPerSample (standardAutoSampler, cetacAutoSampler) {

	//debug
	//alert(standardAutoSampler.toString());
	//alert(cetacAutoSampler.toString());
	
	var timeSaved = new Number(0.0);
	var cetacAnalysisTime = cetacAutoSampler.calculateAnalysisTime();
	var standardAnalysisTime = standardAutoSampler.calculateAnalysisTime();

	if (cetacAnalysisTime < standardAnalysisTime) {
	
		timeSaved = standardAnalysisTime - cetacAnalysisTime;
	} 

	return timeSaved.toFixed(2);
}

/*
 * standardAutoSampler - an AutoSampler instance
 * cetacAutoSampler - an AutoSampler instance
 */
CetacCalculator.prototype.calculateTimeSavedPerPeriod = 
	function calculateTimeSavedPerPeriod(standardAutoSampler, cetacAutoSampler) {

	//debug
	//alert(standardAutoSampler.toString());
	//alert(cetacAutoSampler.toString());
	
	var timeSaved = new Number(0.0);

	var totalSecondsSaved = this.calculateTotalSecondsSaved(standardAutoSampler, cetacAutoSampler);
	if (totalSecondsSaved > 0.0) {
		timeSaved = (totalSecondsSaved / 60.0) / 60.0;
	}

	return timeSaved.toFixed(2);
	
}

/*
 * standardAutoSampler - an AutoSampler instance
 * cetacAutoSampler - an AutoSampler instance
 */
CetacCalculator.prototype.calculateProjectedSamples = 
	function calculateProjectedSamples(standardAutoSampler, cetacAutoSampler) {

	//debug
	//alert(standardAutoSampler.toString());
	//alert(cetacAutoSampler.toString());
	
	var additionalSamples = 0;
	var cetacAnalysisTime = cetacAutoSampler.calculateAnalysisTime();
	
	if (cetacAnalysisTime > 0.0) {

		totalSecondsSaved = this.calculateTotalSecondsSaved(standardAutoSampler, cetacAutoSampler);

		if (totalSecondsSaved > 0.0) {
			additionalSamples = 
				totalSecondsSaved / cetacAnalysisTime;
		}		
	}

	return Math.floor(additionalSamples);
}

/*
 * standardAutoSampler - an AutoSampler instance
 * cetacAutoSampler - an AutoSampler instance
 */
CetacCalculator.prototype.calculatePerformance = 
	function calculatePercentIncreasedThroughput(standardAutoSampler, cetacAutoSampler) {

	//debug
	//alert(standardAutoSampler.toString());
	//alert(cetacAutoSampler.toString());
	
	var percentIncrease = new Number(0.0);
	
	if (standardAutoSampler.samplesPerPeriod > 0.0) {
		percentIncrease = 
			this.calculateProjectedSamples(standardAutoSampler, cetacAutoSampler) / 
				standardAutoSampler.samplesPerPeriod;
	}
	
	return (percentIncrease.toFixed(2) * 100);
}

function calculate() {
	
	var uptakeDelay = document.getElementById("txtUptakeDelay").value;
	var readDelay = document.getElementById("txtReadDelay").value;
	var acquisitionTime = document.getElementById("txtAcquisitionTime").value;
	var numberReplicates = document.getElementById("txtNumberReplicates").value;
	var washTime = document.getElementById("txtWashTime").value;
	var samplesPerPeriod = document.getElementById("txtSamplesPerPeriod").value;

	if (isNaN(parseFloat(uptakeDelay) || isNaN(parseFloat(readDelay)) || isNaN(parseFloat(acquisitionTime)) ||
		isNaN(parseFloat(numberReplicates)) || isNaN(parseFloat(washTime)) || isNaN(samplesPerPeriod))) { 
	
		alert("One or more inputs are not numbers.  Please check your inputs and try again.");
		
	} else if (uptakeDelay == "0" && readDelay == "0" && acquisitionTime == "0" && 
			   numberReplicates == "0" && washTime == "0" && samplesPerPeriod == "0") { 
	
		alert("Please provide us with some data about your current autosampler and try again.");
		
	} else {
	
		var custAutoSampler = 
			new AutoSampler(uptakeDelay, readDelay, acquisitionTime, 
					        numberReplicates, washTime, samplesPerPeriod);
	
		document.getElementById("txtCustUptakeDelay").innerHTML = 
			custAutoSampler.uptakeDelay;
		document.getElementById("txtCustReadDelay").innerHTML = 
			custAutoSampler.readDelay;
		document.getElementById("txtCustAcquisitionTime").innerHTML = 
			custAutoSampler.calculateAcquisitionTime(); 
		document.getElementById("txtCustWashTime").innerHTML = 
			custAutoSampler.washTime;
		document.getElementById("txtCustTotAnalysisTime").innerHTML = 
			custAutoSampler.calculateAnalysisTime();
		
		var dsa7AutoSampler = 
			new AutoSampler(15, 0, acquisitionTime, 
						    numberReplicates, 0, samplesPerPeriod);
		
		document.getElementById("txtDsaUptakeDelay").innerHTML = 
			dsa7AutoSampler.uptakeDelay;
		document.getElementById("txtDsaReadDelay").innerHTML = 
			dsa7AutoSampler.readDelay;
		document.getElementById("txtDsaAcquisitionTime").innerHTML = 
			dsa7AutoSampler.calculateAcquisitionTime(); 
		document.getElementById("txtDsaWashTime").innerHTML = 
			dsa7AutoSampler.washTime;
		document.getElementById("txtDsaTotAnalysisTime").innerHTML = 
			dsa7AutoSampler.calculateAnalysisTime();
		
		var calculator = new CetacCalculator();
		
		document.getElementById("txtTimeSavedPerSample").innerHTML = 
			calculator.calculateTimeSavedPerSample(custAutoSampler, dsa7AutoSampler);
		document.getElementById("txtTimeSavedPerPeriod").innerHTML = 
			calculator.calculateTimeSavedPerPeriod(custAutoSampler, dsa7AutoSampler);
		document.getElementById("txtUnusedProcess").innerHTML = 
			calculator.calculateProjectedSamples(custAutoSampler, dsa7AutoSampler);
		document.getElementById("txtIncrThroughput").innerHTML = 
			calculator.calculatePerformance(custAutoSampler, dsa7AutoSampler);
	}
}

function resetForm(formId) {
	
	var form = document.getElementById(formId);
	
	for (var i=0; i < form.elements.length; i++) {
		
		if (form.elements[i].type != "button")	form.elements[i].value = "0";
	}
	
	document.getElementById("txtCustUptakeDelay").innerHTML ="0"; 
	document.getElementById("txtCustReadDelay").innerHTML = "0";
	document.getElementById("txtCustAcquisitionTime").innerHTML = "0"; 
	document.getElementById("txtCustWashTime").innerHTML = "0";
	document.getElementById("txtCustTotAnalysisTime").innerHTML = "0"; 

	document.getElementById("txtDsaUptakeDelay").innerHTML = "0";
	document.getElementById("txtDsaReadDelay").innerHTML = "0";
	document.getElementById("txtDsaAcquisitionTime").innerHTML = "0";
	document.getElementById("txtDsaWashTime").innerHTML = "0";
	document.getElementById("txtDsaTotAnalysisTime").innerHTML = "0";
	
	document.getElementById("txtTimeSavedPerSample").innerHTML = "0";
	document.getElementById("txtTimeSavedPerPeriod").innerHTML = "0";
	document.getElementById("txtUnusedProcess").innerHTML = "0";
	document.getElementById("txtIncrThroughput").innerHTML = "0";
}

//debug
/*
function testObjects() {
	
	var dsa7AutoSampler = new AutoSampler(15, 0, 10, 10, 0, 1000);
	var custAutoSampler = new AutoSampler(30, 10.5, 10, 10, 10, 1000);
	
	var calculator = new CetacCalculator();
	var totalSecondsSaved = calculator.calculateTotalSecondsSaved(custAutoSampler, dsa7AutoSampler);
	var timeSavedPerSample = calculator.calculateTimeSavedPerSample(custAutoSampler, dsa7AutoSampler);
	var projectedSamples = calculator.calculateProjectedSamples(custAutoSampler, dsa7AutoSampler);
	var incrPerf = calculator.calculatePerformance(custAutoSampler, dsa7AutoSampler);
	
	alert("The total seconds saved is " + totalSecondsSaved);
	alert("The time saved per sample is " + timeSavedPerSample);
	alert("The projected number of additional samples is " + projectedSamples);
	alert("The increase in performance is " + incrPerf);
}

function testObjectsWithNaN() {


}
*/
