// JavaScript Document
var number = /^[0-9]{0,3}\.?[0-9]*$/;
var time = /^([0-9]+:){0,2}[0-9]+$/;

$(document).ready( function(){	
	$(".accordian").accordion({
		header:			'h4',
		collapsible:	true,
		change:			function(event, ui) {
							ui.newContent.find("input:first").focus();
						}
	});
	
	/* speed (mph), time spent, grade group */
	$("#slidder_stg").draggable({
		axis: 			'x',
		containment: 	'parent',
		stop: 			function () { pointerToGrade($(this).parent().parent(), "stg"); },
		drag: 			function () { pointerToGrade($(this).parent().parent(), "stg"); }
	});
	$("input[name='weight_stg']").change(function() { calculate("stg"); });
	$("input[name='speed_stg']").change(function() { calculate("stg"); });
	$("input[name='time_stg']").change(function() { calculate("stg"); });
	$("input[name='grade_stg']").change(function() { gradeToPointer($(this), "stg") });
	$("input[name='grade_stg']").val("0.00");
	gradeToPointer($("input[name='grade_stg']"), "stg");
	
	/* distance, time spent, grade group */
	$("#slidder_dtg").draggable({
		axis: 			'x',
		containment: 	'parent',
		stop: 			function () { pointerToGrade($(this).parent().parent(), "dtg"); },
		drag: 			function () { pointerToGrade($(this).parent().parent(), "dtg"); }
	});
	$("input[name='weight_dtg']").change(function() { calculate("dtg"); });
	$("input[name='distance_dtg']").change(function() { calculate("dtg"); });
	$("input[name='time_dtg']").change(function() { calculate("dtg"); });
	$("input[name='grade_dtg']").change(function() { gradeToPointer($(this), "dtg") });
	$("input[name='grade_dtg']").val("0.00");
	gradeToPointer($("input[name='grade_dtg']"), "dtg");
	
	/* speed, distance, grade group */
	$("#slidder_sdg").draggable({
		axis: 			'x',
		containment: 	'parent',
		stop: 			function () { pointerToGrade($(this).parent().parent(), "sdg"); },
		drag: 			function () { pointerToGrade($(this).parent().parent(), "sdg"); }
	});
	$("input[name='weight_sdg']").change(function() { calculate("sdg"); });
	$("input[name='speed_sdg']").change(function() { calculate("sdg"); });
	$("input[name='distance_sdg']").change(function() { calculate("sdg"); });
	$("input[name='grade_sdg']").change(function() { gradeToPointer($(this), "sdg") });
	$("input[name='grade_sdg']").val("0.00");
	gradeToPointer($("input[name='grade_sdg']"), "sdg");
	
	/* speed (minutes/mile), time spent, grade group */
	$("#slidder_smtg").draggable({
		axis: 			'x',
		containment: 	'parent',
		stop: 			function () { pointerToGrade($(this).parent().parent(), "smtg"); },
		drag: 			function () { pointerToGrade($(this).parent().parent(), "smtg"); }
	});
	$("input[name='weight_smtg']").change(function() { calculate("smtg"); });
	$("input[name='speedmpm_smtg']").change(function() { calculate("smtg"); });
	$("input[name='speedmps_smtg']").change(function() { calculate("smtg"); });
	$("input[name='minutes_smtg']").change(function() { calculate("smtg"); });
	$("input[name='seconds_smtg']").change(function() { calculate("smtg"); });
	$("input[name='grade_smtg']").change(function() { gradeToPointer($(this), "smtg") });
	$("input[name='grade_smtg']").val("0.00");
	gradeToPointer($("input[name='grade_smtg']"), "smtg");
});

function floatToTimeFormat(number) {
	var hours = Math.floor(Math.floor(number)/60);
	var minutes = Math.floor(number) % 60;
	var seconds = (number - Math.floor(number)) * 60;
	
	var formated = ((hours > 0) ? hours + ":" : "") + minutes + ":" + ((seconds < 10) ? "0" : "") + seconds.toFixed(0);
	
	return formated;
}

function timeFormatToFloat (number) {
	$("input[name='time_smtg']").change(function() { calculate("smtg"); });
	var parts = number.split(":");
	
	if (parts.length == 3) {
		return parts[0] * 60 + parts[1] + "." + parts[2] / 60;
	} else if (parts.length == 2) {
		return parseInt(parts[0]) + (parts[1] / 60);
	}
	
	return parts;
}

function gradeToPointer(textbox, section) {
	var group = textbox.parent().parent().parent().parent();
	if (number.test(textbox.val()) & textbox.val() >= 0 & textbox.val() <= 45) {
		var grade = textbox.val() * 1;
		var percent = 100 * ((grade - group.find(".slider .continuum0 span").text()) / (group.find(".slider .continuum12 span").text()-group.find(".slider .continuum0 span").text()));
		percent = (percent < 0) ? -1 : percent;
		percent = (percent > 100) ? 101 : percent;
		if (textbox.val() <= 45) {
			var size = (180/Math.PI)* Math.atan(grade/100);
			//var size = Math.round(Math.tan(grade * Math.PI / 180) * 180);
			group.find(".gradeIndicator div").css("border-top-width", size);
		} else {
			group.find(".gradeIndicator div").css("border-top-width", 0);
		}
		group.find(".pointer").css("left", percent+"%");
		group.find(".pointer span").text(grade.toFixed(2));
		calculate(section);
	} else {
		group.find(".pointer").css("left", "0%");
		group.find(".pointer span").text("0.00");	
		textbox.val("0.00");
		calculate(section);
	}
}

function pointerToGrade(slider, section) {
	var grade = parseInt(slider.find(".pointer").css("left")) / parseInt(slider.find(".continuum").css("width"));
	grade *= slider.find(".continuum12 span").text() - slider.find(".continuum0 span").text();
	slider.find(".pointer span").text(grade.toFixed(2));
	slider.parent().find("input:last").val(grade.toFixed(2));
	var size = (180/Math.PI)* Math.atan(grade/100);
	slider.parent().find(".gradeIndicator div").css("border-top-width", size);
	calculate(section);
}

function calculate(section) {
	if (okay(section)) {
		/* calculate base data */
		if (section == "stg") {
			var weight =  $("input[name='weight_stg']").val() * 1;
			var speed =  $("input[name='speed_stg']").val() * 1;
			var time =  $("input[name='time_stg']").val() * 1;
			var grade = $("input[name='grade_stg']").val() * 1;
			
			var distance = ( speed / 60 ) * time;
			var speedmpm = 60 / speed;
		} else if (section == "dtg") {
			var weight =  $("input[name='weight_dtg']").val() * 1;
			var distance =  $("input[name='distance_dtg']").val() * 1;
			var time =  $("input[name='time_dtg']").val() * 1;
			var grade = $("input[name='grade_dtg']").val() * 1;
			
			var speed = distance / time * 60;
			var speedmpm = 60 / speed;
		} else if (section == "sdg") {
			var weight =  $("input[name='weight_sdg']").val() * 1;
			var speed =  $("input[name='speed_sdg']").val() * 1;
			var distance =  $("input[name='distance_sdg']").val() * 1;
			var grade = $("input[name='grade_sdg']").val() * 1;
			
			var time = distance * 60 / speed;
			var speedmpm = 60 / speed;
		} else if (section == "smtg") {
			var weight =  $("input[name='weight_smtg']").val() * 1;
			//var speedmpm =  timeFormatToFloat($("input[name='speedmpm_smtg']").val()) * 1;
			var speedmpmo =  $("input[name='speedmpm_smtg']").val() * 1;
			var speedmps =  $("input[name='speedmps_smtg']").val() * 1;
			var speedmpm = speedmpmo+(speedmps/60);
			var minutes =  $("input[name='minutes_smtg']").val() * 1;
			var seconds =  $("input[name='seconds_smtg']").val() * 1;
			var time = minutes+(seconds/60);
			var grade = $("input[name='grade_smtg']").val() * 1;
			
			var speed = 60 / speedmpm;
			var distance = ( speed / 60 ) * time;
		}
		
		/* run major calculations */
		if (speed < 4) {
			var mets = (((((weight / 2.2) * time * (3.5 + (1.8 * grade * .01 * (speed * 26.8)) + ((speed * 26.8) * .1))) + (3.5 * (weight / 2.2))) / 3.5) / (weight / 2.2)) / time;
			var totalcalories = ((((weight / 2.2) * time * (3.5 + (1.8 * grade * .01 * (speed * 26.8)) + ((speed * 26.8) * .1))) + (3.5 * (weight / 2.2))) / 1000) * 5;
		} else {
			var mets = (((((weight / 2.2) * time * (3.5 + (.9 * grade * .01 * (speed * 26.8)) + ((speed * 26.8) * .2))) + (3.5 * (weight / 2.2))) / 3.5) / (weight / 2.2)) / time;
			var totalcalories = ((((weight / 2.2) * time * (3.5 + (.9 * grade * .01 * (speed * 26.8)) + ((speed * 26.8) * .2))) + (3.5 * (weight / 2.2))) / 1000 ) * 5;
		}
		
		var caloriesMinute = totalcalories / time;
		
		/* write the information to the user */
		if (section == "stg") {
			$("span#distance_stg").text(distance.toFixed(2));
			$("span#speedmpm_stg").text(floatToTimeFormat(speedmpm));
			$("span#mets_stg").text(mets.toFixed(2));
			$("span#calories_stg").text(totalcalories.toFixed(2));
			$("span#cpm_stg").text(caloriesMinute.toFixed(2));
		} else if (section == "dtg") {
			$("span#speed_dtg").text(speed.toFixed(2));
			$("span#speedmpm_dtg").text(floatToTimeFormat(speedmpm));
			$("span#mets_dtg").text(mets.toFixed(2));
			$("span#calories_dtg").text(totalcalories.toFixed(2));
			$("span#cpm_dtg").text(caloriesMinute.toFixed(2));
		} else if (section == "sdg") {
			$("span#time_sdg").text(time.toFixed(2));
			$("span#speedmpm_sdg").text(floatToTimeFormat(speedmpm));
			$("span#mets_sdg").text(mets.toFixed(2));
			$("span#calories_sdg").text(totalcalories.toFixed(2));
			$("span#cpm_sdg").text(caloriesMinute.toFixed(2));
		} else if (section == "smtg") {
			$("span#distance_smtg").text(distance.toFixed(2));
			$("span#speed_smtg").text(speed.toFixed(2));
			$("span#mets_smtg").text(mets.toFixed(2));
			$("span#calories_smtg").text(totalcalories.toFixed(2));
			$("span#cpm_smtg").text(caloriesMinute.toFixed(2));
		}
	} else {
		clearCalculated(section);	
	}
}

function okay(section) {
	var okay = true;
	if (section == "stg") {
		if (!number.test($("input[name='weight_stg']").val()) | $("input[name='weight_stg']").val() == "") {
			$("input[name='weight_stg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='speed_stg']").val()) | $("input[name='speed_stg']").val() == "") {
			$("input[name='speed_stg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='time_stg']").val()) | $("input[name='time_stg']").val() == "") {
			$("input[name='time_stg']").val("");
			okay = false;
		}
		if (!number.test($("input[name='grade_stg']").val()) | $("input[name='grade_stg']").val() == "") {
			$("input[name='grade_stg']").val("");
			okay = false;
		}
		return okay;
	} else if (section == "dtg") {
		if (!number.test($("input[name='weight_dtg']").val()) | $("input[name='weight_dtg']").val() == "") {
			$("input[name='weight_dtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='distance_dtg']").val()) | $("input[name='distance_dtg']").val() == "") {
			$("input[name='distance_dtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='time_dtg']").val()) | $("input[name='time_dtg']").val() == "") {
			$("input[name='time_dtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='grade_dtg']").val()) | $("input[name='grade_dtg']").val() == "") {
			$("input[name='grade_dtg']").val("");
			okay = false;
		}
		return okay;
	} else if (section == "sdg") {
		if (!number.test($("input[name='weight_sdg']").val()) | $("input[name='weight_sdg']").val() == "") {
			$("input[name='weight_sdg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='distance_sdg']").val()) | $("input[name='distance_sdg']").val() == "") {
			$("input[name='distance_sdg']").val("");
			okay = false;
		}  
		if (!number.test($("input[name='speed_sdg']").val()) | $("input[name='speed_sdg']").val() == "") {
			$("input[name='speed_sdg']").val("");
			okay = false;
		}  
		if (!number.test($("input[name='grade_sdg']").val()) | $("input[name='grade_sdg']").val() == "") {
			$("input[name='grade_sdg']").val("");
			okay = false;
		}
		return okay;
	} else if (section == "smtg") {
		if (!number.test($("input[name='weight_smtg']").val()) | $("input[name='weight_smtg']").val() == "") {
			$("input[name='weight_smtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='speedmpm_smtg']").val()) | $("input[name='speedmpm_smtg']").val() == "") {
			$("input[name='speedmpm_smtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='speedmps_smtg']").val()) | $("input[name='speedmps_smtg']").val() == "") {
			$("input[name='speedmps_smtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='minutes_smtg']").val()) | $("input[name='minutes_smtg']").val() == "") {
			$("input[name='minutes_smtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='seconds_smtg']").val()) | $("input[name='seconds_smtg']").val() == "") {
			$("input[name='seconds_smtg']").val("");
			okay = false;
		} 
		if (!number.test($("input[name='grade_smtg']").val()) | $("input[name='grade_smtg']").val() == "") {
			$("input[name='grade_smtg']").val("");
			okay = false;
		}
		return okay;
	}
	//check for age and sex and upload information
	return false;
}

function clearCalculated(section) {
	//clear calculated fields
	if (section == "stg") {
		$("span#distance_stg").html("&nbsp;");
		$("span#speedmpm_stg").html("&nbsp;");
		$("span#mets_stg").html("&nbsp;");
		$("span#cpm_stg").html("&nbsp;");
		$("span#calories_stg").html("&nbsp;");
	} else if (section == "dtg") {
		$("span#speed_dtg").html("&nbsp;");
		$("span#speedmpm_dtg").html("&nbsp;");
		$("span#mets_dtg").html("&nbsp;");
		$("span#cpm_dtg").html("&nbsp;");
		$("span#calories_dtg").html("&nbsp;");
	} else if (section == "sdg") {
		$("span#time_sdg").html("&nbsp;");
		$("span#speedmpm_sdg").html("&nbsp;");
		$("span#mets_sdg").html("&nbsp;");
		$("span#calories_sdg").html("&nbsp;");
		$("span#cpm_sdg").html("&nbsp;");
	} else if (section == "smtg") {
		$("span#distance_smtg").html("&nbsp;");
		$("span#speed_smtg").html("&nbsp;");
		$("span#mets_smtg").html("&nbsp;");
		$("span#cpm_smtg").html("&nbsp;");
		$("span#calories_smtg").html("&nbsp;");
	}
}

