var ie = false;
// Uncomment following line for debugging IE functionality in standard compliant browsers.
ie = true;

var slAge, slWeight, slHeight;
var bee, bmi, gender, age, weight, height;

var slPal
var tee, pal;

var slIntake;
var intake, kcalDiffPerDay;

// For handling IE's lack of standard compliance!
var qspans = new Array();
var qlinks = new Array();
// End of ie handling vars

var sliderDetails = { age:    {left: 14, right: 120, roundingFactor: 1 },
			weight: {left: 20, right: 200, roundingFactor: 1 },
			height: {left: 1.0, right: 2.5, roundingFactor: 100 },
			pal:    {left: 1, right: 2.5, roundingFactor: 10 },
			intake: {left: 500, right: 5000, roundingFactor: 1 }
		};
var sliderRange = 200;

function init() {
	slAge = YAHOO.widget.Slider.getHorizSlider("agebg", "aget", 0, 200);
	slAge.onChange = SlAgeChange;
	slWeight = YAHOO.widget.Slider.getHorizSlider("weightbg", "weightt", 0, 200);
	slWeight.onChange = SlWeightChange;
	slHeight = YAHOO.widget.Slider.getHorizSlider("heightbg", "heightt", 0, 200);
	slHeight.onChange = SlHeightChange;

	slPal = YAHOO.widget.Slider.getHorizSlider("palbg", "palt", 0, 200);
	slPal.onChange = SlPalChange;

	slIntake = YAHOO.widget.Slider.getHorizSlider("intakebg", "intaket", 0, 200);
	slIntake.onChange = SlIntakeChange;

	setTimeout("SetSliderDefaults();", 1);

	// IE handling.
	if( ie ) {
		// Populate an array of the spans that contain the tooltip 'q'.
		var spans = document.getElementsByTagName('span');
		for( ct = 0; ct < spans.length; ++ct ) {
			if( spans[ct].className == 'q' ) {
				qspans[qspans.length] = spans[ct];
			}
		}

		// Populate an array of the links that power the tooltip (even in f*&£&% IE)
		// and the tooltip itself
		for( ct = 0; ct < qspans.length; ++ct ) {
			qlinks[ct] = qspans[ct].parentNode;
		}

		for( ct = 0; ct < qlinks.length; ++ct ) {
			var fn = new Function("HideAllBut(" + ct + ")");
			qlinks[ct].onmouseover = fn;
			qlinks[ct].onmouseout = function () { ReshowAll(); }
		}
	}
}

function SetSliderDefaults() {
	SetSlider(slAge, sliderDetails.age, 40);
	SetSlider(slHeight, sliderDetails.height, 1.80);
	SetSlider(slWeight, sliderDetails.weight, 80);
	SetSlider(slPal, sliderDetails.pal, 1.1);
	SetSlider(slIntake, sliderDetails.intake, 2000);
}

function SetSlider(slider, sliderDetail, value) {
	left = sliderDetail.left;
	right = sliderDetail.right;
	newpos = Math.round((sliderRange * (value - left)) / (right - left));
	slider.setValue(newpos, true, true);
}

function SlAgeChange(offset) {
	age = OnSliderChange(offset, sliderDetails.age);
	element = document.getElementById("ageval")
	element.innerHTML = age;
	RecalculateBeeAndBmi();
}

function SlWeightChange(offset) {
	weight = OnSliderChange(offset, sliderDetails.weight);
	element = document.getElementById("weightval")
	element.innerHTML = weight + " kg";
//	element = document.getElementById("weightvalimp")
//	element.innerHTML = ConvertWeightToImperial(weight);
	RecalculateBeeAndBmi();
}

function SlHeightChange(offset) {
	height = OnSliderChange(offset, sliderDetails.height);
	element = document.getElementById("heightval")
	heightint = Math.floor(height); //integer part (before comma)
	heightdec = (height - heightint) * 100; //decimal part (after comma)
	heightdec = Math.round(heightdec);
	element.innerHTML = heightint + "," + heightdec + " m";
	RecalculateBeeAndBmi();
}

function SlPalChange(offset) {
	pal = OnSliderChange(offset, sliderDetails.pal);
	element = document.getElementById("palval")
	palint = Math.floor(pal); //integer part (before comma)
	paldec = (pal - palint) * 10; //decimal part (after comma)
	paldec = Math.round(paldec);
	element.innerHTML = palint + "," + paldec + " ";
	RecalculateTee();
}

function SlIntakeChange(offset) {
	intake = OnSliderChange(offset, sliderDetails.intake);
	element = document.getElementById("intakeval")
	element.innerHTML = intake + " kcal ";
	RecalculateWeightDiff();
}

function OnSliderChange(offset, sliderDetail) {
	right = sliderDetail.right;
	left = sliderDetail.left;
	roundingFactor = sliderDetail.roundingFactor;
	value = Math.round(((right * offset + left * sliderRange - offset * left) / sliderRange) * roundingFactor) / roundingFactor;

	return value;
}

function RecalculateBeeAndBmi() {
	// Set gender.
	genderm = document.getElementById("genderm");
	gendermcheck = genderm.checked;
	if( gendermcheck == true ) {
		gender = "m";
	} else {
		gender = "f"
	}

	// Calculate BEE.
	if( gender == "m" ) {
//		bee = 66.473 + (13.7516 * weight) + (500.33 * height) - (6.755 * age);
		bee = (9.99 * weight) + (625.0 * height) - (4.92 * age) + 5.0 
	} else {
//		bee = 655.0955 + (9.5634 * weight) + (184.96 * height) - (4.6756 * age);
		bee = (9.99 * weight) + (625.0 * height) - (4.92 * age) - 161.0
	}
	bee = Math.round(bee);

	// Get the element which will hold the result.
	beeVal = document.getElementById("bee");
	beeVal.innerHTML = bee + " kcal ";

	// Calculate BMI
	bmi = Math.round(weight / (height * height) * 100) / 100;
	bmiint = Math.floor(bmi); //integer part (before comma)
	bmidec = (bmi - bmiint) * 10; //decimal part (after comma)
	bmidec = Math.round(bmidec);
	bmiVal = document.getElementById("bmi");
	if (bmi < 18.5 || bmi > 25.0 && bmi <= 30.0) {
		bmiVal.innerHTML = "<font color=\"goldenrod\">" + bmiint + "," +bmidec + "</font> ";
	}
	else if (bmi >= 18.5 && bmi <= 25.0) {
		bmiVal.innerHTML = "<font color=\"limegreen\">" + bmiint + "," +bmidec + "</font> ";
	}
	else {
		bmiVal.innerHTML = "<font color=\"red\">" + bmiint + "," +bmidec + "</font> ";
	}

	// Recalculate TEE
	RecalculateTee();

	// BMI warnings.
	//if( bmi <= 18.5  ) {
	//	SetWarningClass("bmiunderweight", "warningshow");
	//	SetWarningClass("bmioverweight", "warninghide");
	//	SetWarningClass("bmiobese", "warninghide");
	//} else if( bmi > 18.5 && bmi <= 25 ) {
	//	SetWarningClass("bmiunderweight", "warninghide");
	//	SetWarningClass("bmioverweight", "warninghide");
	//	SetWarningClass("bmiobese", "warninghide");
	//} else if( bmi > 25 && bmi <= 30 ) {
	//	SetWarningClass("bmiunderweight", "warninghide");
	//	SetWarningClass("bmioverweight", "warningshow");
	//	SetWarningClass("bmiobese", "warninghide");
	//} else {
	//	SetWarningClass("bmiunderweight", "warninghide");
	//	SetWarningClass("bmioverweight", "warninghide");
	//	SetWarningClass("bmiobese", "warningshow");
	//}
}

function RecalculateTee() {
	// Set PAL.
	tee = Math.round(bee * pal);

	// Get the element which will hold the result.
	teeVal = document.getElementById("tee");
	teeVal.innerHTML = tee + " kcal ";

	//RecalculateWeightDiff();
}

function RecalculateWeightDiff() {
	var gainorloss;
	kcalDiffPerDay = tee - intake;

	wdpd = document.getElementById("weightdiffperday");
	wdpdVal = Math.round((kcalDiffPerDay / 7800) * 100) / 100;
	wdpdi = document.getElementById("wdpdimp");
	wdpdiVal = Math.round(ConvertWeightToPoundsOnly(wdpdVal) * 100) / 100;
	gainorloss = document.getElementById("gainorloss");
	if ( kcalDiffPerDay < 0 ) {
		gainorloss.innerHTML = "gain ";
		wdpd.innerHTML = -wdpdVal + " kg ";
		wdpdi.innerHTML = -wdpdiVal + " pounds ";
	} else {
		gainorloss.innerHTML = "loss ";
		wdpd.innerHTML = wdpdVal + " kg ";
		wdpdi.innerHTML = wdpdiVal + " pounds ";
	}

	wdpw = document.getElementById("weightdiffperweek");
	wdpwVal = Math.round((kcalDiffPerDay / 7800) * 7 * 100) / 100;
	wdpwi = document.getElementById("wdpwimp");
	wdpwiVal = Math.round(ConvertWeightToPoundsOnly(wdpwVal) * 100) / 100;
	if ( kcalDiffPerDay < 0 ) {
		wdpw.innerHTML = -wdpwVal + " kg ";
		wdpwi.innerHTML = -wdpwiVal + " pounds ";
	} else {
		wdpw.innerHTML = wdpwVal + " kg ";
		wdpwi.innerHTML = wdpwiVal + " pounds ";
	}
}

// Checks the current className of the element with the specified id and changes
// it if it does not match the supplied className
function SetWarningClass(id, className) {
	element = document.getElementById(id);
	if( element.className != className ) {
		element.className = className;
	}
}

function ConvertHeightToImperial(h) {
	inches = h * 39.3700787;
	feet = Math.floor(inches / 12);
	inches = Math.round(inches - feet * 12);

	return feet + "'" + inches + '"';
}

function ConvertWeightToImperial(w) {
	pounds = w * 2.2;
	stones = Math.floor(pounds / 14);
	pounds = Math.round(pounds - stones * 14);

	return stones + "st" + pounds + "lbs";
}

function ConvertWeightToPoundsOnly(w) {
	return w * 2.2;
}


function HeightWeightInMetric() {
	hm = document.getElementById("heightval");
	hm.className = "sliderval metimpshow";
	hi = document.getElementById("heightvalimp");
	hi.className = "sliderval metimphide";

	wm = document.getElementById("weightval");
	wm.className = "sliderval metimpshow";
	wi = document.getElementById("weightvalimp");
	wi.className = "sliderval metimphide";

	pdm = document.getElementById("weightdiffperday");
	pdm.className = "metimpshow";
	pdi = document.getElementById("wdpdimp");
	pdi.className = "metimphide";

	pwm = document.getElementById("weightdiffperweek");
	pwm.className = "metimpshow";
	pwi = document.getElementById("wdpwimp");
	pwi.className = "metimphide";
}

function HeightWeightInImperial() {
	hm = document.getElementById("heightval");
	hm.className = "sliderval metimphide";
	hi = document.getElementById("heightvalimp");
	hi.className = "sliderval metimpshow";

	wm = document.getElementById("weightval");
	wm.className = "sliderval metimphide";
	wi = document.getElementById("weightvalimp");
	wi.className = "sliderval metimpshow";

	pdm = document.getElementById("weightdiffperday");
	pdm.className = "metimphide";
	pdi = document.getElementById("wdpdimp");
	pdi.className = "metimpshow";

	pwm = document.getElementById("weightdiffperweek");
	pwm.className = "metimphide";
	pwi = document.getElementById("wdpwimp");
	pwi.className = "metimpshow";
}

/**********************************************/
// As IE can't even manage the within a rect calcs correctly we'll just have to hide them all.
function HideAllBut(thisOne) {
	for( ct = 0; ct < qspans.length; ++ct ) {
		if( ct == thisOne ) continue;
		hidee = qspans[ct];
		hidee.className = "q iehide";
	}
}

function ReshowAll() {
	for( ct = 0; ct < qspans.length; ++ct ) {
		hidee = qspans[ct];
		hidee.className = "q";
	}

}


