var tire1Sel;
var tire2Sel;

function updatePage() {
	var tire1SelSecWidth = parseFloat(document.getElementById('tire1SectionWidth').value);
	var tire1SelAspectRatio = parseFloat(document.getElementById('tire1AspectRatio').value);
	var tire1SelWheelDiameter = parseFloat(document.getElementById('tire1WheelDiameter').value);
	
	var tire2SelSecWidth = parseFloat(document.getElementById('tire2SectionWidth').value);
	var tire2SelAspectRatio = parseFloat(document.getElementById('tire2AspectRatio').value);
	var tire2SelWheelDiameter = parseFloat(document.getElementById('tire2WheelDiameter').value);
	
	tire1Sel = new TireCalculator(tire1SelSecWidth, tire1SelAspectRatio, tire1SelWheelDiameter);
	tire2Sel = new TireCalculator(tire2SelSecWidth, tire2SelAspectRatio, tire2SelWheelDiameter);
	
	writeValAndUnit("tire1SectionWidthIn", tire1Sel.sectionWidth, true);
	writeValAndUnit("tire1SectionWidthMm", tire1Sel.sectionWidth, false);
	writeValAndUnit("tire2SectionWidthIn", tire2Sel.sectionWidth, true);
	writeValAndUnit("tire2SectionWidthMm", tire2Sel.sectionWidth, false);
	writeDiff("diffSectionWidthIn", tire1Sel.sectionWidth, tire2Sel.sectionWidth, true);
	writeDiff("diffSectionWidthMm", tire1Sel.sectionWidth, tire2Sel.sectionWidth, false);
	writeDiffPercent("diffSectionWidthPercent", tire1Sel.sectionWidth, tire2Sel.sectionWidth);
	
	writeValAndUnit("tire1WheelDiameterIn", tire1Sel.wheelDiameterMm, true);
	writeValAndUnit("tire1WheelDiameterMm", tire1Sel.wheelDiameterMm, false);
	writeValAndUnit("tire2WheelDiameterIn", tire2Sel.wheelDiameterMm, true);
	writeValAndUnit("tire2WheelDiameterMm", tire2Sel.wheelDiameterMm, false);
	writeDiff("diffWheelDiameterIn", tire1Sel.wheelDiameterMm, tire2Sel.wheelDiameterMm, true);
	writeDiff("diffWheelDiameterMm", tire1Sel.wheelDiameterMm, tire2Sel.wheelDiameterMm, false);
	writeDiffPercent("diffWheelDiameterPercent", tire1Sel.wheelDiameterMm, tire2Sel.wheelDiameterMm);
	
	replaceChildNodesById("tire1RecommendedRimWidth", rimWidthInfoTextNode(tire1Sel));
	replaceChildNodesById("tire2RecommendedRimWidth", rimWidthInfoTextNode(tire2Sel));
	
	writeValAndUnit("tire1OverallDiameterIn", tire1Sel.overallDiameter, true);
	writeValAndUnit("tire1OverallDiameterMm", tire1Sel.overallDiameter, false);
	writeValAndUnit("tire2OverallDiameterIn", tire2Sel.overallDiameter, true);
	writeValAndUnit("tire2OverallDiameterMm", tire2Sel.overallDiameter, false);
	writeDiff("diffOverallDiameterIn", tire1Sel.overallDiameter, tire2Sel.overallDiameter, true);
	writeDiff("diffOverallDiameterMm", tire1Sel.overallDiameter, tire2Sel.overallDiameter, false);
	writeDiffPercent("diffOverallDiameterPercent", tire1Sel.overallDiameter, tire2Sel.overallDiameter);
	
	writeValAndUnit("tire1SideWallHieghtIn", tire1Sel.sidewall, true);
	writeValAndUnit("tire1SideWallHieghtMm", tire1Sel.sidewall, false);
	writeValAndUnit("tire2SideWallHieghtIn", tire2Sel.sidewall, true);
	writeValAndUnit("tire2SideWallHieghtMm", tire2Sel.sidewall, false);
	writeDiff("diffSidewallHeightIn", tire1Sel.sidewall, tire2Sel.sidewall, true);
	writeDiff("diffSidewallHeightMm", tire1Sel.sidewall, tire2Sel.sidewall, false);
	writeDiffPercent("diffSidewallHeightPercent", tire1Sel.sidewall, tire2Sel.sidewall);
	
	writeValAndUnit("tire1RadiusIn", tire1Sel.radius, true);
	writeValAndUnit("tire1RadiusMm", tire1Sel.radius, false);
	writeValAndUnit("tire2RadiusIn", tire2Sel.radius, true);
	writeValAndUnit("tire2RadiusMm", tire2Sel.radius, false);
	writeDiff("diffRadiusIn", tire1Sel.radius, tire2Sel.radius, true);
	writeDiff("diffRadiusMm", tire1Sel.radius, tire2Sel.radius, false);
	writeDiffPercent("diffRadiusPercent", tire1Sel.radius, tire2Sel.radius);
	
	writeValAndUnit("tire1CircumferenceIn", tire1Sel.circumferance, true);
	writeValAndUnit("tire1CircumferenceMm", tire1Sel.circumferance, false);
	writeValAndUnit("tire2CircumferenceIn", tire2Sel.circumferance, true);
	writeValAndUnit("tire2CircumferenceMm", tire2Sel.circumferance, false);
	writeDiff("diffCircumferenceIn", tire1Sel.circumferance, tire2Sel.circumferance, true);
	writeDiff("diffCircumferenceMm", tire1Sel.circumferance, tire2Sel.circumferance, false);
	writeDiffPercent("diffCircumferencePercent", tire1Sel.circumferance, tire2Sel.circumferance);
	
	replaceChildTextById("tire1Revolutions", formatOneDecimalPlace(tire1Sel.revsPerMile));
	replaceChildTextById("tire2Revolutions", formatOneDecimalPlace(tire2Sel.revsPerMile));
	writeSignVal("diffRevolutions", tire2Sel.revsPerMile - tire1Sel.revsPerMile);
	writeDiffPercent("diffRevolutionsPercent", tire1Sel.revsPerMile, tire2Sel.revsPerMile);
	
	replaceChildNodesById("tireSpeedChangeMph", speedometerDiff(tire1Sel, tire2Sel, 65, true));
	replaceChildNodesById("tireSpeedChangeKmh", speedometerDiff(tire1Sel, tire2Sel, 100, false));
	
	writeDiffPercent("diffSpeedChangePercent", 65, speedometerChange(tire1Sel, tire2Sel, 65));
	
	var tireImgCompare = document.getElementById("tireCompareImg");
	tireImgCompare.src = "/image/tire-calulator/tire-compare?" + tire1SelSecWidth + "/" + tire1SelAspectRatio + "R" + tire1SelWheelDiameter + ";" + tire2SelSecWidth + "/" + tire2SelAspectRatio + "R" + tire2SelWheelDiameter;
	
	replaceChildNodesById("diameterPercent", diamenterPercentageInfoTextNode());
}

function formatOneDecimalPlace(n) {
	var s = "" + Math.round(n * 10) / 10;
	var i = s.indexOf('.');
	
	if (i < 0) return s + ".0";
	
	var t = s.substring(0, i + 1) + s.substring(i + 1, i + 2);
	
	return t;
}

function formatTwoDecimalPlaces(n) {
	var s = "" + Math.round(n * 100) / 100;
	var i = s.indexOf('.');
	
	if (i < 0)
		return s + ".00";
	
	var t = s.substring(0, i + 1) + s.substring(i + 1, i + 3);
	
	if (i + 2 == s.length)
		t += "0";
	
	return t;
}

function writeDiff(id, mmVal1, mmVal2, inches) {
	var val = mmVal2 - mmVal1;
	writeSignValUnit(id, val, inches);	
}

function writeDiffPercent(id, mmVal1, mmVal2) {
	var docFrag = document.createDocumentFragment();
	var sign = "";
	
	// if (id=="diffRevolutionsPercent") { alert("val1:" + mmVal1); alert("val2:" + mmVal2);  alert("val2 - val1:" + mmVal2 - mmVal1);}
	
	var val = Math.round((mmVal2 - mmVal1) / mmVal1 * 10000) /100;
	
	if (val > 0) sign = "+"; else if (val < 0) sign = "\u2212\u2060";
		
	replaceChildNodesById(id, document.createTextNode(sign + Math.abs(val) + "%"));	
}

function writeValAndUnit(id, mmVal, inches) {
	var docFrag = document.createDocumentFragment();
	var factor = 1;
	
	if (inches) factor = 25.4;
	
	var val = mmVal / factor;
	var roundVal = Math.round(val * 100) / 100;
	var displayString = "" + roundVal
	
	docFrag.appendChild(document.createTextNode(displayString + "\u00A0"));
	
	var abbrElm = createElement("abbr");
	
	if (inches) {
		if (mmVal > 1) abbrElm.setAttribute("title", "inches"); else abbrElm.setAttribute("title", "inch");
		abbrElm.appendChild(document.createTextNode("in"));
	} else {
		if (mmVal > 1) abbrElm.setAttribute("title", "millimeters"); else abbrElm.setAttribute("title", "millimeter");
		abbrElm.appendChild(document.createTextNode("mm"));
	}
	
	docFrag.appendChild(abbrElm);
		
	replaceChildNodesById(id, docFrag);
}

function writeSignVal(id, val) {
	var sign = "";
	
	val = Math.round(val * 100) / 100;
	
	if (val > 0) sign = "+"; else if (val < 0) sign = "\u2212\uFEFF";
	
	replaceChildNodesById(id, document.createTextNode(sign + Math.abs(val)));
}

function writeSignValUnit(id, mmVal, inches) {
	var factor;
	
	if (inches) factor = 25.4; else factor = 1;
	
	writeSignVal(id, mmVal / factor)
	
	var abbrElm = createElement("abbr");
	
	if (inches) {
		if (mmVal > 1) abbrElm.setAttribute("title", "inches"); else abbrElm.setAttribute("title", "inch");
		abbrElm.appendChild(document.createTextNode("in"));
	} else {
		if (mmVal > 1) abbrElm.setAttribute("title", "millimeters"); else abbrElm.setAttribute("title", "millimeter");
		abbrElm.appendChild(document.createTextNode("mm"));
	}
	
	var elm = document.getElementById(id);
	elm.appendChild(document.createTextNode("\u00A0"));
	elm.appendChild(abbrElm);
}

function rimWidthInfoTextNode(tire) {
	var docFrag = document.createDocumentFragment();
	docFrag.appendChild(document.createTextNode(tire.recommendedRimWidthMin + " \u2013 " + tire.recommendedRimWidthMax + " "));
	
	var abbrElm = createElement("abbr");
	if (tire.recommendedRimWidthMax > 1) abbrElm.setAttribute("title", "inches"); else abbrElm.setAttribute("title", "inch");
	abbrElm.appendChild(document.createTextNode("in"));
	docFrag.appendChild(abbrElm);
	
	return docFrag;
}

function speedometerDiff(tire, compTire, speed, mph) {
	var docFrag = document.createDocumentFragment();
	var newSpeed = speedometerChange(tire, compTire, speed);
	
	docFrag.appendChild(document.createTextNode(formatOneDecimalPlace(newSpeed) + " "))
	
	var abbrElm = createElement("abbr");
	
	if (mph) {
		if (newSpeed > 1 | newSpeed == 0) abbrElm.setAttribute("title", "Miles per hour"); else abbrElm.setAttribute("title", "Mile per hour");
		abbrElm.appendChild(document.createTextNode("mph."));
	} else {
		if (newSpeed > 1 | newSpeed == 0) abbrElm.setAttribute("title", "Kilometers per hour"); else abbrElm.setAttribute("title", "Kilometer per hour");
		abbrElm.appendChild(document.createTextNode("km/h"));
	}
	
	docFrag.appendChild(abbrElm);
	
	return docFrag;
}

function diamenterPercentageInfoTextNode() {
	var diameterPercentage = Math.abs(tire1Sel.overallDiameter - tire2Sel.overallDiameter) / tire1Sel.overallDiameter * 100;
	var s = "You have a " + (Math.round(diameterPercentage * 100) / 100) + "% difference in diameter. Your speedometer ";
	
	var speedDiff = Math.abs(tire1Sel.revsPerMile - tire2Sel.revsPerMile) / tire1Sel.revsPerMile * 100;
	
	if (speedDiff == 0)
		s = s + "remain the same.";
	else {
		s = s + "will be " + (Math.round(speedDiff * 100) / 100) + "% too ";
		if (tire1Sel.revsPerMile > tire2Sel.revsPerMile)
			s = s + "slow.";
		else
			s = s + "fast.";
	}
	
	return document.createTextNode(s);
}

function replaceChildNodes(e, newNode) {
	if (e.hasChildNodes)
		for (var i = e.childNodes.length - 1; i >= 0; i--)
			e.removeChild(e.childNodes.item(i));
	e.appendChild(newNode);
}

function replaceChildNodesById(id, newNode) {
	replaceChildNodes(document.getElementById(id), newNode);
}

function replaceChildTextById(id, s) {
	replaceChildText(document.getElementById(id), s);	
}

function replaceChildText(e, s) {
	replaceChildNodes(e, document.createTextNode(s));
}

function createElement(tagName) {
	if (isHtml())
		return document.createElement(tagName.toUpperCase());
	else
		return document.createElementNS("http://www.w3.org/1999/xhtml", tagName);
}

function isHtml() {
    var bodyNode = document.getElementsByTagName("body")[0];
	return bodyNode.tagName == "BODY";
}