// Calculate Object Dimension (Horizontal and Vertical), Distance, Focal length

var caltable = new Array(3);

function calcObj(in1, in2, out1, out2, out3, out4, out5, out6, out7, calno) {
	// input field
	this.infield = new Array(in1, in2);

	// output field
	this.outfield = new Array(out1, out2, out3, out4, out5, out6, out7);
	this.outcount = this.outfield.length;

	// calculation no
	this.calcno = calno;

	// constant value
	if (this.calcno == 3) {
		// vertical dimension
		this.cons = new Array(6.6, 5.4, 5.4, 4.8, 3.92, 3.6, 2.9);
	} else {
		// horizontal dimension
		this.cons = new Array(8.8, 7.2, 9.6, 6.4, 6.97, 4.8, 5.2);
	}

	return this;
}

calcObj.prototype.calc = function(inUnits1, inUnits2, outUnits) {
	// data ---------------------------------------------
	var inVal1 = this.infield[0].value;
	var inVal2 = this.infield[1].value;
	var ans = 0;
	var outcount = this.outcount;
	var answers = new Array(0, 0, 0, 0, 0);
	var converted = false;
	var unitOverflow = false;
	var unitUnderflow = false;
	var str = new String();
	var calno = this.calcno;

	// convert input values
	switch (this.calcno) {
	case 0:
		// Horizontal distance
		setUnits(outUnits, "unitdisplay1");
		if (inUnits1 == "feet") {
			inVal1 = convertFeetToM(inVal1);
		} else if (inUnits1 == "inches") {
			inVal1 = convertInchToM(inVal1);
		}
		break;
	case 1:
		// Object distance
		setUnits(outUnits, "unitdisplay2");
		if (inUnits1 == "inches") {
			inVal1 = convertInchToCm(inVal1);
		} else if (inUnits1 == "feet") {
			inVal1 = convertFeetToCm(inVal1);
		} else if (inUnits1 == "meters") {
			inVal1 = convertMToCm(inVal1);
		}
		break;
	case 2:
		// Focal length
		setUnits(outUnits, "unitdisplay3");	
		if (inUnits1 == "feet") {
			inVal1 = convertFeetToM(inVal1);
		} else if (inUnits1 == "inches") {
			inVal1 = convertInchToM(inVal1);
		} else if (inUnits1 == "centimeters") {
			inVal1 = convertCmToM(inVal1);
		}

		if (inUnits2 == "inches") {
			inVal2 = convertInchToCm(inVal2);
		} else if (inUnits2 == "feet") {
			inVal2 = convertFeetToCm(inVal2);
		} else if (inUnits2 == "meters") {
			inVal2 = convertMToCm(inVal2);
		}
		break;
	case 3:
		// Vertical distance
		setUnits(outUnits, "unitdisplay4");
		if (inUnits1 == "feet") {
			inVal1 = convertFeetToM(inVal1);
		} else if (inUnits1 == "inches") {
			inVal1 = convertInchToM(inVal1);
		}
		break;
	default:
		break;
	}

	if (!this.checkform(inVal1, inVal2)) {
		return;
	}

	// calculate output values
	switch (this.calcno) {
	case 0:
		// Horizontal distance
		for (var i = 0; i < outcount; i++) {
			ans = this.cons[i] * (inVal1 / inVal2) * 100;
			if (outUnits == "inches") {
				ans = convertCmToInch(ans);
				if (ans > 24) {
					unitOverflow = true;
				}
			} else {
				if (ans > 100) {
					unitOverflow = true;
				}
			}
			answers[i] = ans;
		}

		// run back through the answers and reset new converted values
		if (unitOverflow == true) {
			if (outUnits == "inches") {
				setUnits("feet", "unitdisplay1");
				for (var i = 0; i < outcount; i++) {
					answers[i] = convertInchToFeet(answers[i]);
				}
			} else {
				setUnits("meters", "unitdisplay1");
				for (var i = 0; i < outcount; i++) {
					answers[i] = convertCmToM(answers[i]);
				}
			}
		} else {
			if (outUnits != "inches") {
				setUnits("centimeters", "unitdisplay1");
			}
		}

		// set final output values
		for (var i = 0; i < outcount; i++) {
			ans = answers[i] * 100;
			str = String(Math.round(ans) / 100);
			this.outfield[i].value = this.format(str);
		}

		break;
	case 1:
		// Object distance
		for (var i = 0; i < outcount; i++) {
			ans = (inVal1 / 100 * inVal2) / this.cons[i];
			if (outUnits == "feet") {
				ans = convertMToFeet(ans);
				if (ans < 1) {
					unitUnderflow = true;
				}
			}
			answers[i] = ans;
		}

		// run back through the answers and reset new converted values
		if (outUnits == "feet" && unitUnderflow == true) {
			setUnits("inches", "unitdisplay2");
			for (var i = 0; i < outcount; i++) {
				answers[i] = convertFeetToInch(answers[i]);
			}
		}

		// set final output values
		for (var i = 0; i < outcount; i++) {
			ans = answers[i] * 100;
			str = String(Math.round(ans) / 100);
			this.outfield[i].value = this.format(str);
		}
		break;
	case 2:
		// Focal length
		for (var i = 0; i < outcount; i++) {
			ans = (this.cons[i] * inVal1) / (inVal2 / 100);
			ans *= 100;
			str = String(Math.round(ans) / 100);
			this.outfield[i].value = this.format(str);
		}
		break;
	case 3:
		// Vertical distance
		for (var i = 0; i < outcount; i++) {
			ans = this.cons[i] * (inVal1 / inVal2) * 100;
			if (outUnits == "inches") {
				ans = convertCmToInch(ans);
				if (ans > 24) {
					unitOverflow = true;
				}
			} else {
				if (ans > 100) {
					unitOverflow = true;
				}
			}
			answers[i] = ans;
		}

		// run back through the answers and reset new converted values
		if (unitOverflow == true) {
			if (outUnits == "inches") {
				setUnits("feet", "unitdisplay4");
				for (var i = 0; i < outcount; i++) {
					answers[i] = convertInchToFeet(answers[i]);
				}
			} else {
				setUnits("meters", "unitdisplay4");
				for (var i = 0; i < outcount; i++) {
					answers[i] = convertCmToM(answers[i]);
				}
			}
		} else {
			if (outUnits != "inches") {
				setUnits("centimeters", "unitdisplay4");
			}
		}

		// set final output values
		for (var i = 0; i < outcount; i++) {
			ans = answers[i] * 100;
			str = String(Math.round(ans) / 100);
			this.outfield[i].value = this.format(str);
		}

		break;
	default:
		break;
	}
}

calcObj.prototype.format = function(str) {
	var len = str.length;
	var pos = str.indexOf(".");

	if (str != "Infinity") {
		switch (pos) {
		case -1:
 			str += ".00";
			break;
		case 0:
			str = "0" + str;
	 		len = str.length;
			pos = str.indexOf(".");
		default:
			for (var i = 0; i < 3 - len + pos; i++) {
				str += "0";
			} 
			break;
		}
	}

	return str;
}

calcObj.prototype.checkform = function(v1, v2) {
	if (v1 == null || v1 == "" || v1.length == 0 || v2 == null || v2 == "" || v2.length == 0) {
		return false;
	}

	if (isNaN(v1) == true || isNaN(v2) == true) {
		return false;
	}
	
	return true;
}

function init() {
	caltable[0] = new calcObj(
		document.calcform1.in11, 
		document.calcform1.in12, 
		document.calcform1.out11, 
		document.calcform1.out12, 
		document.calcform1.out13, 
		document.calcform1.out10, 
		document.calcform1.out14,
		document.calcform1.out15,
		document.calcform1.out16,
		0
	);
	caltable[1] = new calcObj(
		document.calcform2.in21, 
		document.calcform2.in22, 
		document.calcform2.out21, 
		document.calcform2.out22, 
		document.calcform2.out23, 
		document.calcform2.out20, 
		document.calcform2.out24,
		document.calcform2.out25,
		document.calcform2.out26,
		1
	);
	caltable[2] = new calcObj(
		document.calcform3.in31, 
		document.calcform3.in32, 
		document.calcform3.out31, 
		document.calcform3.out32, 
		document.calcform3.out33, 
		document.calcform3.out30, 
		document.calcform3.out34,
		document.calcform3.out35,
		document.calcform3.out36,
		2
	);
	caltable[3] = new calcObj(
		document.calcform1.in11, 
		document.calcform1.in12, 
		document.calcform4.out41, 
		document.calcform4.out42, 
		document.calcform4.out43, 
		document.calcform4.out40, 
		document.calcform4.out44,
		document.calcform4.out45,
		document.calcform4.out46,
		3
	);
}

function calculate(form, index) {
	var inUnits1;
	var inUnits2;
	var outUnits;

	inUnits1 = form.units.value;

	if (form.units2) {
		inUnits2 = form.units2.value;
	} else {
		inUnits2 = "millimeters";
	}

	if (index == 0) {
		if (inUnits1 == "feet") {
			outUnits = "inches";
		} else {
			outUnits = "centimeters";
		}
	} else if (index == 1) {
		if (inUnits1 == "inches" || inUnits1 == "feet") {
			outUnits = "feet";
		} else {
			outUnits = "meters";
		}
	} else if (index == 2) {
		outUnits = "millimeters";
	} else if (index == 3) {
		if (inUnits1 == "feet") {
			outUnits = "inches";
		} else {
			outUnits = "centimeters";
		}
	}

	caltable[index].calc(inUnits1, inUnits2, outUnits);

	if (index == 0) {
		caltable[3].calc(inUnits1, inUnits2, outUnits);
	}
}
