/******************************************************************************
These are the support JS functions which run the General section of the Energy
& Environmental Impact Estimator (formerly known as the 'Light Comparison
Tool')
******************************************************************************/

/* Because sometimes, foo / bar * bar !== foo, and sometimes,
   foo - bar + bar !== foo */
function isApprox (a, b) {
	return (Math.abs(a - b) < 0.000001);
}

/* because getValueFromURL forgot to decode % escapes and + signs. */
function getValueFromURLCorrectly (paramName) {
	var result = getValueFromURL(paramName);
	result = result.replace(/\+/g, " ");
	result = decodeURIComponent(result);
	return result;
}

/* invoked on initialization with 1, and on clicking each radio button. */
function changeNumberOfAreasDisplayedTo (n) {
	var i, id, e;
	for (i = 1; i <= 5; ++i) {
		id = "A" + i + "Div";
		e = document.getElementById(id);
		if (e) {
			e.style.display = (i <= n) ? "block" : "none";
		}
	}
}

/* invoked for each radio button */
function addOnclickToNumberOfAreasRadioButton (i) {
	var id = "numberOfAreas" + i;
	var e = document.getElementById(id);
	if (e) {
		e.onclick = function () {
			changeNumberOfAreasDisplayedTo(i);
		};
	}
}

/* populates a form input field from a query string parameter */
function grabTextField (id) {
	var temp;
	try {
		temp = getValueFromURLCorrectly(id);
		document.getElementById(id).value = temp;
	}
	catch (err) { }
}
function grabTextFieldIfNotEmpty (id) {
	var temp;
	try {
		temp = getValueFromURLCorrectly(id);
		if (temp !== null && temp !== "") {
			document.getElementById(id).value = temp;
		}
	}
	catch (err) { }
}

/* invoked on page load */
function prePopulateGeneralForm () {
	var temp, id, e, i, err;
	var numberOfAreas = 0;

	// grab individual variables from query string and populate the page
	// with their values.
	temp = getValueFromURLCorrectly("numberOfAreas");
	if (/^\d+$/.test(temp)) {
		numberOfAreas = parseInt(temp, 10);
		id = "numberOfAreas" + temp;
		e = document.getElementById(id);
		if (e) {
			e.checked = true;
		}
		changeNumberOfAreasDisplayedTo(numberOfAreas);
	}
	else {
		changeNumberOfAreasDisplayedTo(1);
	}

	for (i = 1; i <= 5; ++i) {
		addOnclickToNumberOfAreasRadioButton(i);
	}

	for (i = 1; i <= numberOfAreas; ++i) {
		grabTextField("A" + i + "N");
		grabTextField("A" + i + "S1FC");
		grabTextField("A" + i + "S1WPF");
		grabTextField("A" + i + "S1BH");
		grabTextField("A" + i + "S2FC");
		grabTextField("A" + i + "S2WPF");
		grabTextField("A" + i + "S2BH");
	}

	grabTextFieldIfNotEmpty("energyRate");
	
	// display content
	document.getElementById("mainBody").style.visibility = "visible";
}

/* invoked on form submission */
function validateGeneralCompareForm (form) {
	var numberOfAreas = 0;
	var i, e;

	validationErrorMessage = "";
	postValidateFocus = "";

	for (i = 1; i <= 5; ++i) {
		e = document.getElementById("numberOfAreas" + i);
		if (e && e.checked) {
			numberOfAreas = i;
			break;
		}
	}

	var validateInteger = function (id, message) {
		var v = document.getElementById(id).value;
		if (!/^\d+$/.test(v)) {
			setFirstInvalid(id);
			validationErrorMessage += message + "\n";
		}
	};
	var validateFloat = function (id, message) {
		var v = document.getElementById(id).value;
		if (!/^(\d+(\.\d*)?|\.\d+)$/.test(v)) {
			setFirstInvalid(id);
			validationErrorMessage += message + "\n";
		}
	};

	for (i = 1; i <= numberOfAreas; ++i) {
		if (!/\S/.test(document.getElementById("A" + i + "N").value)) {
			setFirstInvalid("A" + i + "N");
			validationErrorMessage += "Enter the name or location of Area " + i + ".\n";
		}
		validateInteger("A" + i + "S1FC",
				"Enter number of fixtures for Area " + i + ", System 1.");
		validateInteger("A" + i + "S2FC",
				"Enter number of fixtures for Area " + i + ", System 2.");
		validateFloat("A" + i + "S1WPF",
			      "Enter number of watts per fixture for Area " + i + ", System 1.");
		validateFloat("A" + i + "S2WPF",
			      "Enter number of watts per fixture for Area " + i + ", System 2.");
		validateInteger("A" + i + "S1BH",
				"Enter burning hours per year for Area " + i + ", System 1.");
		validateInteger("A" + i + "S2BH",
				"Enter burning hours per year for Area " + i + ", System 2.");
	}
	validateFloat("energyRate", "Enter an energy rate.");

	if (validationErrorMessage) {
		alert(validationErrorTitle + validationErrorMessage);
		postValidateFocus.setAttribute('autocomplete', 'off'); 
		postValidateFocus.focus();
		return false;
	}

	/* blank unused fields */
	for (i = numberOfAreas + 1; i <= 5; ++i) {
		document.getElementById("A" + i + "N").value = "";
		document.getElementById("A" + i + "S1FC").value = "";
		document.getElementById("A" + i + "S2FC").value = "";
		document.getElementById("A" + i + "S1WPF").value = "";
		document.getElementById("A" + i + "S2WPF").value = "";
		document.getElementById("A" + i + "S1BH").value = "";
		document.getElementById("A" + i + "S2BH").value = "";
	}

	return true;
}

function populateGeneralResultOrPrintPage (options) {
	var i, j, k, area, input;

	var printPage = options && options.printPage;

	// Grab user-entered data from the query string.
	var numberOfAreas = 
		parseInt(getValueFromURLCorrectly("numberOfAreas"), 10);
	var energyRate = parseFloat(getValueFromURLCorrectly("energyRate"));

	// Collects names of parameters passed from result page to print page
	// via hidden inputs in the print form.
	var inputs = [];

	inputs.push("numberOfAreas");
	inputs.push("energyRate");

	var areas = [];
	var system1, system2;
	for (i = 1; i <= numberOfAreas; ++i) {
		system1 = {
			fixtureCount:    parseFloat(getValueFromURLCorrectly("A" + i + "S1FC")),
			wattsPerFixture: parseFloat(getValueFromURLCorrectly("A" + i + "S1WPF")),
			burningHours:    parseFloat(getValueFromURLCorrectly("A" + i + "S1BH"))
		};
		system2 = {
			fixtureCount:    parseFloat(getValueFromURLCorrectly("A" + i + "S2FC")),
			wattsPerFixture: parseFloat(getValueFromURLCorrectly("A" + i + "S2WPF")),
			burningHours:    parseFloat(getValueFromURLCorrectly("A" + i + "S2BH"))
		};
		areas[i] = {
			name: getValueFromURLCorrectly("A" + i + "N"),
			systems: [
				/* 0 */ null,
				/* 1 */ system1,
				/* 2 */ system2
			]
		};
		inputs.push("A" + i + "S1FC");
		inputs.push("A" + i + "S1WPF");
		inputs.push("A" + i + "S1BH");
		inputs.push("A" + i + "S2FC");
		inputs.push("A" + i + "S2WPF");
		inputs.push("A" + i + "S2BH");
		inputs.push("A" + i + "N");
	}

	if (printPage) {
		var yourName     = getValueFromURLCorrectly("yourName");
		var customerName = getValueFromURLCorrectly("customerName");
		var projectName  = getValueFromURLCorrectly("projectName");
		var yourEmail    = getValueFromURLCorrectly("yourEmail");
		var yourPhone    = getValueFromURLCorrectly("yourPhone");
		var comments     = getValueFromURLCorrectly("comments");
		inputs.push("yourName");
		inputs.push("customerName");
		inputs.push("projectName");
		inputs.push("yourEmail");
		inputs.push("yourPhone");
		inputs.push("comments");
	}

	// Perform calculations.

	var worstEnergyUsed = 0;
	var bestEnergyUsed = 0;
	var tied;
	var totalEnergySaved;
	var totalEnergyReduction;
	for (i = 1; i <= numberOfAreas; ++i) {
		area = areas[i];
		for (j = 1; j <= 2; ++j) {
			area.systems[j].energyUsed =
				area.systems[j].fixtureCount *
				area.systems[j].wattsPerFixture *
				area.systems[j].burningHours /
				1000;
		}
		area.tied = isApprox(area.systems[1].energyUsed, 
				     area.systems[2].energyUsed);
		if (area.tied) {
			area.energySaved     = 0;
			area.energyReduction = 0;
			area.bestSystemIndex = null;
			area.worstSystemIndex = null;
			worstEnergyUsed += area.systems[1].energyUsed;
			bestEnergyUsed  += area.systems[1].energyUsed;
		}
		else {
			if (area.systems[1].energyUsed < 
			    area.systems[2].energyUsed) {
				area.bestSystemIndex = 1;
				area.worstSystemIndex = 2;
				area.bestSystem  = area.systems[1];
				area.worstSystem = area.systems[2];
			}
			else {
				area.bestSystemIndex = 2;
				area.worstSystemIndex = 1;
				area.bestSystem  = area.systems[2];
				area.worstSystem = area.systems[1];
			}
			area.energySaved =
				Math.abs(area.systems[1].energyUsed -
					 area.systems[2].energyUsed);
			area.energyReduction =
				area.energySaved /
				area.worstSystem.energyUsed;
			worstEnergyUsed += area.worstSystem.energyUsed;
			bestEnergyUsed  += area.bestSystem.energyUsed;
		}
	}
	tied = isApprox(worstEnergyUsed, bestEnergyUsed);
	if (tied) {
		totalEnergySaved     = 0;
		totalEnergyReduction = 0;
	}
	else {
		totalEnergySaved     = worstEnergyUsed - bestEnergyUsed;
		totalEnergyReduction = totalEnergySaved / worstEnergyUsed;
	}

	// Source: http://www.energystar.gov/ia/partners/promotions/change_light/downloads/CALFacts_and_Assumptions.pdf
	// "ENERGY STAR 'Change a Light, Change the World' 2007 Campaign Facts and Assumptions Sheet"

	var energyCostsSavings        = totalEnergySaved * energyRate;
	var energyCostsSavingsMonthly = energyCostsSavings / 12;
	var greenhouseDifference      = totalEnergySaved * 1.54;
	var sulfurDioxideDifference   = totalEnergySaved * 0.006;
	var nitricOxideDifference     = totalEnergySaved * 0.003;
	var coalDifference            = greenhouseDifference / 2.06;
	var coalDifferenceTons        = coalDifference / 2200; // metric tons
	var mercuryDifference         = coalDifference * 0.0216;
	var equivalentForestation     = greenhouseDifference / 8066;
	var carsRemoved               = greenhouseDifference / 11470;

	// Populate the page.

	if (printPage) {
		document.getElementById("yourName").innerHTML = yourName;
		document.getElementById("customerName").innerHTML = customerName;
		document.getElementById("projectName").innerHTML = projectName;
		document.getElementById("yourEmail").innerHTML = yourEmail;
		document.getElementById("yourPhone").innerHTML = yourPhone;
		document.getElementById("comments").innerHTML = comments;
	}

	var id1, id2, id3;
	for (i = 1; i <= numberOfAreas; ++i) {
		area = areas[i];
		document.getElementById("A" + i + "N").innerHTML =
			area.name;
		for (j = 1; j <= 2; ++j) {
			id1 = "A" + i + "S" + j + "FC";
			id2 = "A" + i + "S" + j + "WPF";
			id3 = "A" + i + "S" + j + "BH";
			document.getElementById(id1).innerHTML =
				addCommas(area.systems[j].fixtureCount) +
				"&nbsp;fixtures";
			document.getElementById(id2).innerHTML =
				addCommas(area.systems[j].wattsPerFixture) +
				"&nbsp;watts";
			document.getElementById(id3).innerHTML =
				addCommas(area.systems[j].burningHours) +
				"&nbsp;hrs./yr.";
		}
		j = area.bestSystemIndex;
		k = area.worstSystemIndex;
		if (j !== null) {
			id1 = "A" + i + "S" + j + "EnergySaved";
			id2 = "A" + i + "S" + j + "EnergyReduction";
			document.getElementById(id1).innerHTML =
				addCommas(Math.floor(area.energySaved));
			document.getElementById(id2).innerHTML =
				Math.floor(area.energyReduction * 100) + "%";
			id1 = "A" + i + "S" + j + "Row";
			id2 = "A" + i + "S" + k + "Row";
			id3 = "A" + i + "S" + j + "ArrowCell";
			document.getElementById(id1).className =
				"bestSystemRow";
			document.getElementById(id2).className = 
				"worstSystemRow";
			document.getElementById(id3).className =
				"arrowCell";
			document.getElementById(id3).innerHTML =
				"<img src='/na/business_lighting/education_resources/tools_software/light_comparison/images/arrow_better_system.gif' width='10' height='19' />";
		}
		else {
			id1 = "A" + i + "S1Row";
			id2 = "A" + i + "S2Row";
			document.getElementById(id1).className = "";
			document.getElementById(id2).className = "";
		}
	}

	for (i = numberOfAreas + 1; i <= 5; ++i) {
		document.getElementById("A" + i + "Tbody").style.display =
			"none";
	}

	document.getElementById("totalEnergySaved").innerHTML = 
		"$" + addCommas(Math.floor(totalEnergySaved));
	document.getElementById("totalEnergyReduction").innerHTML = 
		Math.floor(totalEnergyReduction * 100) + "%";

	var displayFormat = function (x) {
		return (isNaN(x) || x < 1) ? "&lt; 1" : 
			addCommas(Math.floor(x));
	};

	document.getElementById("greenhouseGases").innerHTML = 
		displayFormat(greenhouseDifference) + " lbs/year";
	document.getElementById("sulfurDioxide").innerHTML =
		displayFormat(sulfurDioxideDifference) + " lbs/year";
	document.getElementById("nitricOxide").innerHTML =
		displayFormat(nitricOxideDifference) + " lbs/year";

	document.getElementById("coalBurning").innerHTML =
		displayFormat(coalDifference) + " lbs or " +
		displayFormat(coalDifferenceTons) + " metric tons";
	document.getElementById("mercuryDifference").innerHTML =
		displayFormat(mercuryDifference) + " mg avoided";
	
	document.getElementById("equivalentForestation").innerHTML =
		displayFormat(equivalentForestation) + " acre(s) added";
	document.getElementById("carsRemoved").innerHTML =
		displayFormat(carsRemoved) + " car(s) per year";

	document.getElementById("energyRate").innerHTML =
		"$" + getValueFromURLCorrectly("energyRate") +
		" per kWh";

	if (tied) {
		document.getElementById("youCouldSave").style.display =
			"none";
	}
	else {
		document.getElementById("youCouldSave").style.display =
			"block";
		document.getElementById("energyCostsSavings").innerHTML = 
			"$" + addCommas(Math.floor(energyCostsSavings));
		document.getElementById("energyCostsSavingsMonthly").innerHTML =
			"$" + addCommas(Math.floor(energyCostsSavingsMonthly));
	}

	if (!printPage) {
		var form = document.getElementById("printHeadersForm");

		// Grab parameters from URL and append to appropriate links.
		var URLparams = document.location.search.substring(1);
		var backURL = document.getElementById("editInformation").href +
			"?" + URLparams;
		document.getElementById("editInformation").href = backURL;

		// Populate hidden parameters in result form.
		for (i = 0; i < inputs.length; ++i) {
			v = getValueFromURLCorrectly(inputs[i]);
			if (v !== null && v !== "") {
				input = document.createElement("input");
				input.type = "hidden";
				input.name = inputs[i];
				input.value = v;
				form.appendChild(input);
			}
		}
	}

	// display content
	document.getElementById("mainBody").style.visibility = "visible";
}

function populateGeneralResultPage() {
	populateGeneralResultOrPrintPage({ "printPage": false });
}

function populateGeneralPrintPage() {
	populateGeneralResultOrPrintPage({ "printPage": true });
}

