// NC Noise Criterion Calculator 

function NoiseCriterion(hz63, hz125, hz250, hz500, hz1000, hz2000, hz4000, hz8000){
	this.hz63 = hz63;
	this.hz125 = hz125;
	this.hz250 = hz250;
	this.hz500 = hz500;
	this.hz1000 = hz1000;
	this.hz2000 = hz2000;
	this.hz4000 = hz4000;
	this.hz8000 = hz8000;
	this.hzValues = [this.hz63, this.hz125, this.hz250, this.hz500, this.hz1000, this.hz2000, this.hz4000, this.hz8000];
}

// returns NC value
NoiseCriterion.prototype.calculateNC = function(){
	var nc = -1;
	var oor = 1;
	var hz63 = {NC15:47, NC20:51, NC25:54, NC30:57, NC35:60, NC40:64, NC45:67, NC50:71, NC55:74, NC60:77, NC65:80, NC70:83};
	var hz125 = {NC15:37, NC20:41, NC25:45, NC30:48, NC35:53, NC40:57, NC45:60, NC50:64, NC55:67, NC60:71, NC65:75, NC70:79};
	var hz250 = {NC15:29, NC20:33, NC25:38, NC30:41, NC35:46, NC40:51, NC45:54, NC50:59, NC55:62, NC60:67, NC65:71, NC70:75};
	var hz500 = {NC15:22, NC20:26, NC25:31, NC30:35, NC35:40, NC40:45, NC45:49, NC50:54, NC55:58, NC60:63, NC65:68, NC70:72};
	var hz1000 = {NC15:17, NC20:22, NC25:27, NC30:31, NC35:36, NC40:41, NC45:46, NC50:51, NC55:56, NC60:61, NC65:66, NC70:71};
	var hz2000 = {NC15:14, NC20:19, NC25:24, NC30:29, NC35:34, NC40:39, NC45:44, NC50:49, NC55:54, NC60:59, NC65:64, NC70:70};
	var hz4000 = {NC15:12, NC20:17, NC25:22, NC30:28, NC35:33, NC40:38, NC45:43, NC50:48, NC55:53, NC60:58, NC65:63, NC70:69};
	var hz8000 = {NC15:11, NC20:16, NC25:21, NC30:27, NC35:32, NC40:37, NC45:42, NC50:47, NC55:52, NC60:57, NC65:62, NC70:68};
	var ncLims = [hz63, hz125, hz250, hz500, hz1000, hz2000, hz4000, hz8000];

	for (i = 0; i < ncLims.length; i++){
		var ncTemp;
		if (this.hzValues[i] > ncLims[i].NC15) ncTemp = 15 + 5*(this.hzValues[i] - ncLims[i].NC15)/(ncLims[i].NC20 - ncLims[i].NC15); // NC 15+	
		if (this.hzValues[i] > ncLims[i].NC20) ncTemp = 20 + 5*(this.hzValues[i] - ncLims[i].NC20)/(ncLims[i].NC25 - ncLims[i].NC20); // NC 20+	
		if (this.hzValues[i] > ncLims[i].NC25) ncTemp = 25 + 5*(this.hzValues[i] - ncLims[i].NC25)/(ncLims[i].NC30 - ncLims[i].NC25); // NC 25+	
		if (this.hzValues[i] > ncLims[i].NC30) ncTemp = 30 + 5*(this.hzValues[i] - ncLims[i].NC30)/(ncLims[i].NC35 - ncLims[i].NC30); // NC 30+	
		if (this.hzValues[i] > ncLims[i].NC35) ncTemp = 35 + 5*(this.hzValues[i] - ncLims[i].NC35)/(ncLims[i].NC40 - ncLims[i].NC35); // NC 35+	
		if (this.hzValues[i] > ncLims[i].NC40) ncTemp = 40 + 5*(this.hzValues[i] - ncLims[i].NC40)/(ncLims[i].NC45 - ncLims[i].NC40); // NC 40+	
		if (this.hzValues[i] > ncLims[i].NC45) ncTemp = 45 + 5*(this.hzValues[i] - ncLims[i].NC45)/(ncLims[i].NC50 - ncLims[i].NC45); // NC 45+	
		if (this.hzValues[i] > ncLims[i].NC50) ncTemp = 50 + 5*(this.hzValues[i] - ncLims[i].NC50)/(ncLims[i].NC55 - ncLims[i].NC50); // NC 50+	
		if (this.hzValues[i] > ncLims[i].NC55) ncTemp = 55 + 5*(this.hzValues[i] - ncLims[i].NC55)/(ncLims[i].NC60 - ncLims[i].NC55); // NC 55+	
		if (this.hzValues[i] > ncLims[i].NC60) ncTemp = 60 + 5*(this.hzValues[i] - ncLims[i].NC60)/(ncLims[i].NC65 - ncLims[i].NC60); // NC 60+	
		if (this.hzValues[i] > ncLims[i].NC65) ncTemp = 65 + 5*(this.hzValues[i] - ncLims[i].NC65)/(ncLims[i].NC70 - ncLims[i].NC65); // NC 65+	
		if (this.hzValues[i] > ncLims[i].NC70) oor = -1; // NC 70+ out of range
		if (ncTemp > nc) nc = ncTemp;
		if (oor == -1) nc = -1;
	}

	return nc; 
}

// returns input values
NoiseCriterion.prototype.inputValues = function(){
	var msg = this.hz63 + " " + this.hz125 + " " + this.hz250 + " " + this.hz500 + " " 
		+ this.hz1000 + " " + this.hz2000 + " " + this.hz4000  + " " + this.hz8000;
	return msg;
}

// Copyright engineeringtoolbox.com