e['function6'] = function () {
	//all functions are private unless included in return statement
// 'abstract' method implementations (for api)
	function getInterface() {
		var out = "<ul>";
		out += "<li><h1>Integration</h1></li>";

		/*
		out += "<li><h3>";
		out += "<a class='right' onclick=\"document.getElementById('byValues').style.display='block'; document.getElementById('byEquation').style.display='none'; return false;\" href=''>Data Values</a>";
		out += "<a class='left' onclick=\"document.getElementById('byValues').style.display='none'; document.getElementById('byEquation').style.display='block'; return false;\" href=''>Polynomial</a>";
		out += "<span>or</span>";
		out += "</h3></li>";
		*/

		out += "<div id='byEquation'>";
			// input #1
			out += "<li><label for='coefficients'>Coefficients</label></li>";
			out += "<li class='input'><input type='text' id='coefficients' value='.166666 0 0 20'/></li>";
			// input #2
			out += "<li><label for='a'>Lower Bounds (A)</label></li>";
			out += "<li class='input'><input type='text' id='a' value='0'/></li>";
			// input #3
			out += "<li><label for='b'>Upper Bounds (B)</label></li>";
			out += "<li class='input'><input type='text' id='b' value='12'/></li>";
			// input #4
			out += "<li><label for='accuracy'>Percent Accurate</label></li>";
			out += "<li class='input'><input type='text' id='accuracy' value='.01'/></li>";
			// submit button a
			out += "<li>&nbsp;</li>";
			out += "<li class='input'><input id='submit_coeffs' onclick=\"e['function6'].getHTML(this, document.getElementById('returnValue'))\" type='submit' value='Calculate Area'/></li>";
		out += "</div>";

		out += "<div id='byValues' style='display:none;'>";
			// input #1b
			out += "<li><label for='datapoints'>Data Points</label></li>";
			out += "<li class='input'><textarea id='datapoints' rows='8' cols='40'>";
			out += "3 1.5\n";
			out += "4 3.4\n";
			out += "7 22.3\n";
			out += "8 35";
			out += "</textarea></li>";
			// input #4b
			out += "<li><label for='accuracy'>Percent Accurate</label></li>";
			out += "<li class='input'><input type='text' id='accuracy' value='.01'/></li>";
			// submit button b
			out += "<li>&nbsp;</li>";
			out += "<li class='input'><input id='submit_datapoints' onclick=\"e['function6'].getHTML(this, document.getElementById('returnValue'))\" type='submit' value='Calculate Area'/></li>";
		out += "</div>";

		out += "</ul>";
		return out;
	}

	function getHTML(caller, returnNode) {
		// grab input vals
		var coeffs = document.getElementById('coefficients').value.split(" ");
		var a = parseFloat(document.getElementById('a').value);
		var b = parseFloat(document.getElementById('b').value);
		var accuracy = parseFloat(document.getElementById('accuracy').value);

		//note: we're not sending in the desired accuracy here (we need to know what format the accuracy is in!)
		var r_trap = getArea(coeffs, a, b, trapezoidal, accuracy);
		var r_simp = getArea(coeffs, a, b, simpson, accuracy);

		// format for output and create html
		var out = "<ul>";
		out += "<li><h1>Results</h1></li>";
		out += "<li><h3 class='right'>Simpson's Rule</h3><h3>Trapezoidal Rule</h3></li>";
		out += "<li><span>Area</span></li>";
		out += "<li class='output'><span class='right'>" + r_simp.area.toFixed(10) + "</span><span>" + r_trap.area.toFixed(10) + "</span></li>";
		out += "<li><span>Iterations</span></li>";
		out += "<li class='output'><span class='right'>" + r_simp.iterations + "</span><span>" + r_trap.iterations + "</span></li>";
		out += "<li><span>Error</span></li>";
		out += "<li class='output'><span class='right'>" + r_simp.error.toFixed(15) + "%</span><span>" + r_trap.error.toFixed(15) + "%</span></li>";
		out += "</ul>";
		returnNode.innerHTML = out;
	}

	function validateInput() {
	}

// Program & Presentation Functions
	function results() {
		this.iterations = 0;
		this.area = 0;
		this.error = 0;
	}

	function getArea(coeffs, a, b, func, accuracy) {
		r = new results();
		var revD = e['function2'].solveFX(b, getReverseDerivitive(coeffs));
		revD -= e['function2'].solveFX(a, getReverseDerivitive(coeffs));
		var i = 2;
		do {
			var n = Math.pow(2, i);
			r.area = func(coeffs, (b-a)/n, a, b);
			r.error = rel_error(revD, r.area);
			i++;
		} while (r.error >= accuracy);
		r.iterations = n;
		return r;
	}

// Math Functions
	function trapezoidal(coeffs, h, a, b) {
		var area = 0;
		for(var i = 0; i <= (b-a)/h; i++) {
			var fx = e['function2'].solveFX(a+(i*h), coeffs);
			if (i!=0 && i!=(b-a)/h) { // multiply by 2 if not first or last fX
				fx *= 2;
			}
			area += fx;
			printDebug('area=' + area);
		}
		area *= (h/2);
		printDebug('area=' + area);
		return area;
	}

	function simpson(coeffs, h, a, b) {
		var area = 0;
		for(var i = 0; i <= (b-a)/h; i++) {
			var fx = e['function2'].solveFX(a+(i*h), coeffs);
			if (i != 0 && i != (b-a)/h && i%2 == 0) { // multiply by 2 if not first or last fX
				fx *= 2;
			} else if (i != 0 && i != (b-a)/h && i%2 == 1) { // multiply by 4 if not first or last fX
				fx *= 4;
			}
			area += fx;
			printDebug('area=' + area);
		}
		area *= (h/3);
		printDebug('area=' + area);
		return area;
	}

	function getReverseDerivitive(coeffs) {
		var revD = coeffs.slice(); // using slice() creates a copy of the array (instead of being a pointer)
		for(var j = 0; j < coeffs.length; j++) {
			revD[j] = parseFloat(coeffs[j]) / (coeffs.length - j);
		}
		revD[coeffs.length] = 0;
		return revD;
	}

	function rel_error(exact, estimate) {
		return Math.abs( (exact - estimate) / exact) * 100;
	}

// return public pointers to the private methods
	return {
		getInterface:getInterface,
		getHTML:getHTML,
		validateInput:validateInput
	}

}();

