/* copyright © 2002 - 2007 JAM Performance Transmissions, LLC  All rights reserved.  */

/*
To add a new trans:
* add ...Gears array for each gear
* add to the transGears array
* add to the transModels array
* add new table and fields named with transModel + "Rpm/Mph" + gear (starting with 1)
* add the check box list
*/

var useKph = false;


var tkoGears = new Array();
tkoGears[1]= 3.27;
tkoGears[2]= 1.98;
tkoGears[3]= 1.34;
tkoGears[4]= 1.00;
tkoGears[5]= 0.68;

var tko2Gears = new Array();
tko2Gears[1]= 3.27;
tko2Gears[2]= 1.98;
tko2Gears[3]= 1.34;
tko2Gears[4]= 1.00;
tko2Gears[5]= 0.83;

var camaroT5Gears = new Array();
camaroT5Gears[1]= 3.35;
camaroT5Gears[2]= 1.94;
camaroT5Gears[3]= 1.34;
camaroT5Gears[4]= 1.00;
camaroT5Gears[5]= 0.63;

var tko600Gears = new Array();
tko600Gears[1]= 2.87;
tko600Gears[2]= 1.89;
tko600Gears[3]= 1.28;
tko600Gears[4]= 1.00;
tko600Gears[5]= 0.64;

var tko600RGears = new Array();
tko600RGears[1]= 2.87;
tko600RGears[2]= 1.89;
tko600RGears[3]= 1.28;
tko600RGears[4]= 1.00;
tko600RGears[5]= 0.82;

var ls1Gears = new Array();
ls1Gears[1]= 2.66;
ls1Gears[2]= 1.78;
ls1Gears[3]= 1.30;
ls1Gears[4]= 1.00;
ls1Gears[5]= 0.74;
ls1Gears[6]= 0.50;

var gmAfterMarketGears = new Array();
gmAfterMarketGears[1]= 2.97;
gmAfterMarketGears[2]= 2.07;
gmAfterMarketGears[3]= 1.43;
gmAfterMarketGears[4]= 1;
gmAfterMarketGears[5]= 0.80;
gmAfterMarketGears[6]= 0.62;

var m20WideGears = new Array();
m20WideGears[1]= 2.56;
m20WideGears[2]= 1.91;
m20WideGears[3]= 1.48;
m20WideGears[4]= 1.00;

var m21CloseGears = new Array();
m21CloseGears[1]= 2.2;
m21CloseGears[2]= 1.64;
m21CloseGears[3]= 1.28;
m21CloseGears[4]= 1.00;


var customRatioGears = new Array();
customRatioGears[1]= 2.97;
customRatioGears[2]= 2.07;
customRatioGears[3]= 1.43;
customRatioGears[4]= 1;
customRatioGears[5]= 0.80;
customRatioGears[6]= 0.62;

var transModels = new Array();
transModels[0] = "tko";
transModels[1] = "lt1";
transModels[2] = "gmAftermarket";
transModels[3] = "m20Wide";
transModels[4] = "m21Close";
transModels[5] = "tko600";
transModels[6] = "tko2";
transModels[7] = "tko600R";
transModels[8] = "camaroT5";
transModels[9] = "custom";

var transGears = new Array();
transGears[0] = tkoGears;
transGears[1] = ls1Gears;
transGears[2] = gmAfterMarketGears;
transGears[3] = m20WideGears;
transGears[4] = m21CloseGears;
transGears[5] = tko600Gears;
transGears[6] = tko2Gears;
transGears[7] = tko600RGears;
transGears[8] = camaroT5Gears;
transGears[9] = customRatioGears;

var transDesc = new Array();
transDesc["custom"] = new Array("Your Trans", customRatioGears);
transDesc["tko600"] = new Array("TKO-600", tko600Gears);
transDesc["tko600R"] = new Array("TKO-600R", tko600RGears);
transDesc["tko500"] = new Array("TKO-500, TKO, 3550", tkoGears);
transDesc["tko2"] = new Array("TKOII", tko2Gears);
transDesc["gmt56"] = new Array("GM T56", gmAfterMarketGears);
transDesc["lt1t56"] = new Array("LT1/LS1/Viper T56", ls1Gears);
transDesc["camaroT5"] = new Array("Camaro T5", camaroT5Gears);
transDesc["m20"] = new Array("M20", m20WideGears);
transDesc["m21"] = new Array("M21", m21CloseGears);


function init()
{

	for (anItem in transDesc)
	{
		var transId = anItem;

		var newTableRow = buildTableFor(transId);

		var table = document.all.ResultsTableTBody;
		table.appendChild(newTableRow);

		//now do the graph table
 		var graphTable = document.all.GraphTable;

		var tko600GraphTable = graphTable.cloneNode(true);	
		var tko600GraphTableRow = getField(transId + "GraphRow");
		tko600GraphTable.id = transId + "GraphTable";
		var cell = tko600GraphTableRow.cells[0] ;
		cell.appendChild(tko600GraphTable );

		//unhide the checked ones
		var cbox = getField(transId + "Checkbox");
		var checked = cbox.checked;
		if (checked == true || checked == "true")
		{
			getField(transId + "Row").style.display="block";
			if (transId == "custom")
			{
				getField("customRow").style.display="block";
			}
		}
	}

}

function refreshGraphData()
{
	for (anItem in transDesc)
	{
		var trans = transDesc[anItem];
		var transName = trans[0];
		var gearArray = trans[1];
		var graphTableRow = getField(anItem + "GraphRow");


		//ONLY Refresh is the graph row is visible
		if (graphTableRow.style.display != "none")
		{
			var graphTable = getField(anItem + "GraphTable");
			initGraph(transName , gearArray,graphTable);
		}
	}
}

function buildTableFor(transId)
{

	var baseTableRow = document.body.all.baseRow;
	var newFullTableRow = baseTableRow.cloneNode(true);
	newFullTableRow.id = transId + "Row";  
	//newFullTableRow.style.display="block";

	var transGearsArray = transDesc[transId][1]; 

	var firstGearRatio = transGearsArray[1];
	var rearGear = parseFloat(document.forms.Table3FORM.rearGearRatioInput.value);


	newFullTableRow.all.baseStartLineRatio.value = calcSlrRounded(firstGearRatio, rearGear);  

	var rpmRow = newFullTableRow.all.rpmRow;
	var mphRow = newFullTableRow.all.mphRow;
	var gearLabelRow = newFullTableRow.all.gearHeaderRow;


	var headerRowText = transDesc[transId][0] + " (";
	for (var i = 1; i < transGearsArray.length; i++)
	{
		if (i > 1)
		{
			headerRowText += ", ";
		}
		var gear = transGearsArray[i];
		if (gear == 1)
			headerRowText += "1.00";
		else
		 	headerRowText += gear;

		//show gearHeader Row lables, rpm fields, mph fields
		
		if (i == 6)
		{
			var gearLabelSpan = newFullTableRow.all.GearLabel6;
			gearLabelSpan.style.display="block";
		}

		
		if (i == 5)
		{
			var gearLabelSpan = newFullTableRow.all.GearLabel5;
			gearLabelSpan.style.display="block";
		}

		
		
		var rpmInput = document.createElement("Input");
		rpmInput.disabled=true;
		rpmInput.id = transId + "Rpm" + (i);
		rpmInput.name = transId + "Rpm" + (i);
		rpmInput.size=6;
		rpmInput.maxLength = 10;
		var rpmCell = rpmRow.cells[i];
		rpmCell.appendChild(rpmInput);

		
		var mphInput = document.createElement("Input");
		mphInput.disabled=true;
		mphInput.id = transId + "Mph" + (i);
		mphInput.name = transId + "Mph" + (i);
		mphInput.size=6;
		mphInput.maxLength = 10;
		var mphCell = mphRow.cells[i];
		mphCell.appendChild(mphInput);		
	}

	headerRowText += ")";


	if (transId != "custom")
	{
		var headerRow = newFullTableRow.all.headerRowTextSpan.innerText = headerRowText;
	}
	else
	{
		var headerRow = newFullTableRow.all.headerRowTextSpan.innerText = "Your Ratios";
	}


	newFullTableRow.all.startLineRatioRow.id = transId + "StartLineRatio";
	newFullTableRow.all.baseGraphRow.id = transId + "GraphRow";


	newFullTableRow.all.baseGraphItCheckbox.attachEvent("onclick", hideGraph);  
	newFullTableRow.all.baseGraphItCheckbox.graphTableRow = transId + "GraphRow";
	newFullTableRow.all.baseGraphItCheckbox.id = transId + "GraphItCheckbox";	

	return newFullTableRow;
}



function calculateRpmBtnClicked()
{

	var rearGear = parseFloat(document.forms.Table3FORM.rearGearRatioInput.value);
	var tireDia = parseFloat(document.forms.Table3FORM.tireDiameterInput.value) * Math.PI;
	var mph = parseFloat(document.forms.Table3FORM.mphInput.value);
	//var whichGear = parseFloat(document.forms.Table3FORM.whichGearSelect.selectedValue);
	var rpm = parseFloat(document.forms.Table3FORM.rpmInput.value);

  	var ok = validateInputFields();
	if (ok == "false")  return;

  	clearAllCalcFieldsClicked();

	refreshGraphData();

	for (anItem in transDesc)
	{
	  var model = transDesc[anItem];
	  var ratiosArray = model[1];
	  var table = getField(anItem + "Row");

	  if (table.style.display != "none")
	  {

		  for (var x = 1; x < ratiosArray.length; x++)
		  {
		    if (x == 1)
		    {
			table.all.baseStartLineRatio.value = calcSlrRounded(ratiosArray[x], rearGear);
		    }
	
		    getField(anItem + "Rpm" + x).value = calcRpm(mph, tireDia, rearGear, ratiosArray[x]);
		    getField(anItem + "Mph" + x).value = mph;
	  	  }
		}
	  }

}
 
//calculate MPH
function calculateBtnClicked()
{

 	var rpm = parseFloat(document.forms.Table3FORM.rpmInput.value);
	var rearGear = parseFloat(document.forms.Table3FORM.rearGearRatioInput.value);
	var tireDia = parseFloat(document.forms.Table3FORM.tireDiameterInput.value);
	var mph = parseFloat(document.forms.Table3FORM.mphInput.value);

  	var ok = validateInputFields();
	if (ok == "false")  return;

 	clearAllCalcFieldsClicked();
  	refreshGraphData();



	for (anItem in transDesc)
	{
		var model = transDesc[anItem];
		var ratiosArray = model[1];

		var table = getField(anItem + "Row");
		if (table.style.display != "none")
		{
			for (var x = 1; x < ratiosArray.length; x++)
			{
		  	 	if (x == 1)
		  	 	{
					table.all.baseStartLineRatio.value = calcSlrRounded(ratiosArray[x],rearGear);
		   	 	}
		   		getField(anItem + "Rpm" + x).value = rpm;
		   		getField(anItem + "Mph" + x).value = calcMph(rpm, tireDia, rearGear, ratiosArray[x]);
			}
		}
		
	}
	
}

function calcSlrRounded(transRatio, rearGearRatio)
{
	return (Math.round((transRatio * rearGearRatio) * 10))/10;
}


function getField(fieldId)
{
	var field = document.getElementById(fieldId);
	if (field == null)
	      alert("didn't find " + fieldId);
	else
		return field; 

}

function calcMph(rpm, tireDia, rearGear, transGear)
{
    var mph =  Math.round((rpm * tireDia) / (rearGear * transGear * 336) );

    if (useKph == "true" || useKph == true)
    {
	return Math.round(mph / 0.6215);
    }
    return mph;
}

function calcRpm(mph, tireDia, rearGear, transGear)
{
    if (useKph == "true" || useKph == true)
    {
	mph = mph / 0.6215;
    }

    return Math.round( (rearGear * (mph * 88)) / ((tireDia/12)) * transGear);
}


function hideGraph()
{
  var showItBoolean = event.srcElement.checked;
  var graphTableRow = getField(event.srcElement.graphTableRow); 
   if (showItBoolean == true || showItBoolean == "true")
   {
	   graphTableRow.style.display="block";
 	   refreshGraphData();
   }
   else
	   graphTableRow.style.display="none";
}

function hide(divId, showItBoolean)
{

   if (showItBoolean == true || showItBoolean == "true")
   {
	   getField(divId).style.display="block";
	   calculateRpmBtnClicked(); //make sure it's data is updated 
   }
   else
	   getField(divId).style.display="none";
}

function hideCustom(divId, showItBoolean)
{
   if (showItBoolean == true || showItBoolean == "true")
   {
	getField(divId).style.display="block";
	getField("customRow").style.display="block";
        updateCustomGears();
   }
   else
   {
	getField(divId).style.display="none";
	getField("customRow").style.display="none";
   }
}

function updateCustomGears()
{
	//validate the values
	var gear1Input = document.body.all.customRatio1Input;
	var gear2Input = document.body.all.customRatio2Input;
	var gear3Input = document.body.all.customRatio3Input;
	var gear4Input = document.body.all.customRatio4Input;
	var gear5Input = document.body.all.customRatio5Input;
	var gear6Input = document.body.all.customRatio6Input;

	var gear1 = parseFloat(gear1Input.value);
	var gear2 = parseFloat(gear2Input.value);
	var gear3 = parseFloat(gear3Input.value);
	var gear4 = parseFloat(gear4Input.value);
	var gear5 = parseFloat(gear5Input.value);
	var gear6 = parseFloat(gear6Input.value);


	if (validateGearRatio(gear1Input, gear1) && 
		validateGearRatio(gear2Input, gear2) &&
		validateGearRatio(gear3Input, gear3) &&
		validateGearRatio(gear4Input, gear4) &&
		validateGearRatio(gear5Input, gear5) &&
		validateGearRatio(gear6Input, gear6) )
	{
		//OK,now validate they are sequential in descending order

		if ( !(gear6 <= gear5 && gear5 <= gear4 && gear4 < gear3 && gear3 < gear2 && gear2 < gear1))
		{
			alert("Gears must be in descending sequential order!");
			return false;
		}
	}
		
	//Ok, they must be reasonbly ok, proceed
	customRatioGears[1]= gear1;
	customRatioGears[2]= gear2;
	customRatioGears[3]= gear3;
	customRatioGears[4]= gear4;
	customRatioGears[5]= gear5;
	customRatioGears[6]= gear6;

	calculateRpmBtnClicked(); //make sure it's data is updated 

}

function validateGearRatio(input, value)
{
	if (isNaN(value) || value < 0 || value > 10)
	{
		alert("Gear Ratio must be a valid entry!  (0 - 6.2)");
		input.focus();
		input.select();
		return false;
	}
	return true;
}



function clearAllCalcFieldsClicked()
{
  var elements = document.forms.Table1FORM.elements;
  for (var i = 0; i < elements.length; i++)
  {
    if (elements[i].type=="text")
	 elements[i].value="";
  }
}

function validateInputFields()
{
	var rearGearInput = document.forms.Table3FORM.rearGearRatioInput;
	var tireDiaInput = document.forms.Table3FORM.tireDiameterInput;
	var mphInput = document.forms.Table3FORM.mphInput;
	var rpmInput = document.forms.Table3FORM.rpmInput;

	var rearGear = parseFloat(rearGearInput.value);
	var tireDia = parseFloat(tireDiaInput.value);
	var mph = parseFloat(mphInput.value);
	var rpm = parseFloat(rpmInput.value);

	if ( isNaN(rearGear) || rearGear < 2 || rearGear > 6.13)
	{
		alert("Rear Gear Ratio must be a valid entry!  (2.0 - 6.13)");
		rearGearInput.focus();
		rearGearInput.select();
		return "false";
	}

	if ( isNaN(tireDia) || tireDia < 20 || tireDia > 35)
	{
		alert("Tire Diameter must be a valid entry! (20 - 35)");
		tireDiaInput.focus();
		tireDiaInput.select();
		return "false";
	}


	if ( isNaN(rpm) || rpm == null || rpm < 1000 || rpm > 7500)
	{
		alert("RPM must be a valid entry! (1000 - 7500)");
		rpmInput.focus();
		rpmInput.select();
		return "false";
	}

	if ( isNaN(mph)  || mph == null || mph < 10 || mph > 140)
	{
		alert("MPH/KPH must be a valid entry! (10 - 140)");
		mphInput.focus();
		mphInput.select();
		return "false";
	}


	return "true";

}

//For SLR page
function calcSLR()
{
	var rearGear = parseFloat(getField("1stGearRatio").value);
	var transGear = parseFloat(getField("RearGearRatio").value);	
	getField("startingLineRatio").value = rearGear * transGear;
}

function calcOverallSLR()
{
	var distance = 1200;

	for (var x = 1; x < 4; x++)
	{
		var rearGearScenA = parseFloat(getField("RearGearRatioScen" + x).value);
		var transGearScenA = parseFloat(getField("1stGearRatioScen" + x).value);	
		var tireDiaScenA =  parseFloat(getField("tireDiaScen"+ x).value) * Math.PI;	
		getField("distanceScen"+x).value = (distance / tireDiaScenA) * transGearScenA * rearGearScenA;
	}

}


var maxIterations = 150;
var count = 0;
    

function initGraph(transType, transGearsArray, graphTable)
{
	count = 0;
	var title = transType;    

  	var rearGear = parseFloat(document.forms.Table3FORM.rearGearRatioInput.value);
	var tireDia = parseFloat(document.forms.Table3FORM.tireDiameterInput.value) ;
	var shiftRpm = parseFloat(document.forms.Table3FORM.rpmInput.value);


	title += " Rear Gear Ratio=" + rearGear + " Shift RPM=" + shiftRpm + " Tire Diameter=" + tireDia;
	graphTable.all.GraphTitleTransType.innerText = title;

	var graphResultsTable = graphTable.all.graphResultsTable;
        var mph = 0;
        var col = "";
	var maxH = graphResultsTable.height; 

	var eachRpmHeight = maxH / 16;

        graphResultsTable.deleteRow(0);
        var row = graphResultsTable.insertRow();
        row.style.display="inline";
	
	var maxRpm = 7500;

	var gearNumber = 1;
	var needToShift = "false";
	var transGear = transGearsArray[gearNumber];

	var maxMph = 140;
	if (useKph == "true" || useKph == true)
	{
		maxMph = 225;
	}
	var isLastGear = "false";
	
    	while (mph < maxMph && count <= maxIterations) 
    	{
    		count++;
        	var mph = mph + 2;
  		var rpm = calcRpm(mph, (parseFloat(tireDia) * Math.PI), rearGear, transGear);
  		var actualMph = mph;
  		var heightPerc = (rpm / 500) * eachRpmHeight;
  	 
  		if (rpm > shiftRpm  && isLastGear == "false")
  		{
  	 	   rpm = shiftRpm;
  	 	   var heightPerc = (rpm / 500) * eachRpmHeight;
  	 	   actualMph = calcMph(rpm, tireDia, rearGear, transGear);
  	 	   needToShift = "true";
  		}
  	         
                var height = heightPerc; //(maxH * heightPerc);

		var cell = row.insertCell() ;
		cell.height = "100%";
		cell.width = "3";
		cell.vAlign = "bottom";
		cell.rowSpan = "16";
		cell.style.display="inline";
		cell.rpm=rpm;
		cell.actualMph=actualMph;

		cell.attachEvent("onmouseenter", showHover);
		cell.attachEvent("onmouseleave", hideHover);

		var myDiv = document.createElement("div");
		myDiv.id = gearNumber;
		myDiv.style.position = "relative";
		myDiv.style.height = height + "px"; 
		myDiv.style.width="5px";
		myDiv.style.zIndex = "100";
		myDiv.style.background = "blue";

		cell.appendChild(myDiv);   
   	          
        	if (needToShift == "true" && isLastGear == "false")
        	{
  	    		needToShift = "false";
	    		gearNumber++;
  	    		transGear = transGearsArray[gearNumber];
  	    		if (transGearsArray[gearNumber+1] == null || transGearsArray[gearNumber+1] == 0)
  	    		{
  	        	 	isLastGear = "true";
  	    		}  
  		}
    	}

	return col;
}
    function showHover()
    {
	var label = " MPH";
	if (useKph == "true" || useKph == true)
	{
		label = " KPH";
	}
	
    	var txt = event.srcElement.rpm + " RPM @ " + event.srcElement.actualMph + label;
        document.all.hoverSpan.innerText = txt ;
        window.status = txt;

    	hover.style.display="block";
    	hover.style.pixelTop=event.clientY + document.body.scrollTop;
    	hover.style.pixelLeft=event.clientX + document.body.scrollLeft +10;
    	hover.style.zIndex=1000;    	    	
    }
    
    function hideHover()
    {
        window.status = "";
    	document.all.hover.style.display="none";
    }

function initCalcs()
{
	calcDrivenGear();
	calcDiameter();
}
    
function calcDrivenGear()
{
	var driveTeeth = parseFloat(document.all.driveGearTeethInput.value);
	var gearRatio = parseFloat(document.all.rearGearRatioInput.value) ;
	var tireH = parseFloat(document.all.tireHeightInput.value);
	var tireRevs = 20168 / tireH;
	var drivenGearTeeth = (driveTeeth * gearRatio * tireRevs)/1001;
	var drivenGearTeethRounded = (Math.round(drivenGearTeeth * 10)) / 10;
	document.all.drivenGearTeethResult.value = drivenGearTeethRounded;
}

function calcDiameter()
{
	var width = parseFloat(document.all.tireWidthInput.value);
	var aspectRatio = parseFloat(document.all.aspectRatioInput.value) ;
	var rimDia = parseFloat(document.all.rimDiaInput.value);

	var tireH = (width / 25.4) * aspectRatio / 100;
	var dia = (2 * tireH) + rimDia;

	var diaRounded = (Math.round(dia * 10)) / 10;
	document.all.tireDiameterResult.value = diaRounded;
	var circum = (Math.round((diaRounded * Math.PI) * 10)) / 10; 
	document.all.tireCircumResult.value = circum;
}
function showAsKphClicked(value)
{
	var checked = value == "KPH";
	useKph = checked;
	var text = "MPH";
	if (useKph == "true" || useKph == true)
	{
		text = "KPH";
	}

	document.all.CalculateMphBtn.value = "Calculate " + text ;

	var nodeList = document.getElementsByName("mphSpan");
	for (var x = 0; x < nodeList.length; x++)
	{
		var span = nodeList(x);
		span.innerText = text+ ":";	
	}
	
	calculateBtnClicked();
}