// common.js
// functions by Jim Holloway and John Warner

function element(id) // find control regardless of web-browser.
{
  if (document.getElementById != null)
	return document.getElementById(id) ;

  if (document.all != null)  // for old IE
	return document.all[id] ;

  if (document.layers != null)  // for old NS
	return document.layers[id] ;

  return null ;  // give up
}

function Sender(e)
{
  return (e != null ? e.target : event.srcElement) ;
}


function FormatNumber(num, decPrec, money, pct, noDec)
{
  if (decPrec < 1)
	noDec = true ;

  var
	fx = Math.pow(10, decPrec),
	gx = fx / 10,
	sign = (num == (num = Math.abs(num))),
	num = Math.floor(num * fx + 0.50000000001),
	cents = num % fx,
	num = Math.floor(num / fx).toString();

  while (gx > 1)
  {
	if(cents < gx)
	  cents = "0" + cents;

	gx /= 10 ;
  }

  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));

  return (((sign)?'':'-') + ((money)?'$':'') + num + (noDec ? '' : '.' + cents)) + ((pct)?'%':'');
}


function SorF(valid) // success or failure- converts true/false into text string "success" or "failure"
{
	var retVal;
	if (valid)
	{
		retVal = element("hidSuccess").value; 
	}
	else
	{
		retVal = element("hidFailure").value; 
	}
	return retVal;
}

// remove all items from the listbox
function clearListBoxAll()
{ 
	lbPartList.innerHTML = ""; // this is a little simpler!  
	return;            
}

function resetToDefault()
{    
	var isReset= confirm(element("hidResetToDefault").value); //"Reset all inputs to default values?"); // translate
	
	if (isReset)
	{       
		PageLoad(isReset);
	}
	return;
}
	   
 


function StartCalc()
{
  if (calcTime == 0)
  {
	divResultsMsg.innerHTML = "" ;
	window.setTimeout("CalcTimer();", 100) ;
  }

  calcTime = 10 ;
  return;
}


function CalcTimer()
{
  calcTime-- ;

  if (calcTime > 0)
	window.setTimeout("CalcTimer();", 100) ;
  else
  {
	autoCalculate();
  }
  return;
}


function TextCell(txt, color)
{
  var
	td = document.createElement("td") ;

  td.style.backgroundColor = color ;
  td.appendChild(document.createTextNode(txt)) ;
  td.className = "printSmall";

  return td ;
}



function SetRowCell(label, cell)
{
  var
	x = -1 ;

  for (var j = 0; j < tabOuts.rows.length; j++)
  {
	if (tabOuts.rows[j].firstChild.innerHTML == label + ":")
	{   
	  x = j ;
	  break ;
	}
  }


  var
	xtr ;

  if (x == -1)
  {
	xtr = tabOuts.insertRow(-1) ;

	var
	  xtd = xtr.insertCell(0) ;

	//xtd.align = "right" ;
	xtd.style.backgroundColor = "#ccc" ;
	xtd.style.fontWeight = "bold" ;
	xtd.className = "printSmall2";
	xtd.appendChild(document.createTextNode(label + ":")) ;
	try
	{
		if (colNum == "C2") // just in case C2 doesn't exist.
		{
			xtd.className = "leftColC2";
		}
	}
	catch(err)
	{} // nothing! absolutely nothing!
  }
  else
	xtr = tabOuts.rows[x] ;

  var
	rowColPos = colCount - xtr.childNodes.length ;

  for (var k = 0; k < rowColPos; k++)
	xtr.appendChild(document.createElement("td")) ;
  xtr.appendChild(cell) ;
  
  return xtr;
}




function createOutputUC(label, units, value, warnColor, i, errorText)
{
	var
	  xtd = document.createElement("td"),
	  im = document.createElement("img"),
	  ed = document.createElement("input"),
	  ip = document.createElement("img"),
	  sp = document.createElement("span"),
	  lab = document.createTextNode("x"),
	  ia = document.createElement("img") ;
	  
	  im.src = "images/minus.gif" ;
	  im.alt = "Decrease" ;
	  im.className  = "noprint";

	  ip.src = "images/plus.gif" ;
	  ip.alt = "Increase" ;
	  ip.className  = "noprint";

	  ed.type = "text" ;
	  ed.size = "6" ;      
	  // ed.outerHTML = value;   
	  ed.value = value; // test test test 120606
	  // ed.defaultValue = value; // test test test 031307
	  ed.alt = '"' + value + '"';
	  ed.className = "printSmall";
	  
	  ia.src = "images/down.gif" ;
	  ia.alt = "Convert Units" ;
	  ia.className  = "noprint";
	  
	  sp.appendChild(lab) ;
	  // MARKER- this is kind of questionable actually... Success/Failure might be hard-coded
	  if (units != element("hidSuccess").value && units != element("hidFailure").value && units != "" && units != "Cv")
	  {
		sp.appendChild(ia) ;
	  }
	  
	  var c;
	  try
	  {
		c = colNum;
	  }
	  catch(err)
	  {
		c = ""; 
	  }
	  
	  
	  // sp.id = "spnUCOut" + colCount + "_" + i;
	  sp.id = "spnUCOut" + c + count + "_" + i;
	  
	  sp.className = "printSmall";
	  
	  
	  xtd.appendChild(im) ;
	  xtd.appendChild(document.createTextNode(" ")) ;
	  xtd.appendChild(ed) ;
	  xtd.appendChild(document.createTextNode(" ")) ;
	  xtd.appendChild(ip) ;
	  xtd.appendChild(document.createTextNode(" ")) ;
	  xtd.appendChild(sp) ;
	  
	  // test for error message:
	  
	  if (errorText != null)
	  {
		var lblError = document.createElement("label");
		lblError.innerHTML = "<br \>" + errorText;
		lblError.style.color = "Black";
		lblError.fontSize = "xx-small";
		xtd.appendChild(lblError);
	  }
	  
	  xtd.style.backgroundColor = warnColor ;

	  var xtr = SetRowCell(label, xtd) ;
	  
	  if (value == "N/A")
	  {
		units = element("hidFailure").value
	  }
	  
	  SetupUCByRefs(im, ed, ip, sp, units, "", value, 1, 1, 4, null, null, true) ;
	  
	  if (value == "N/A")
	  {
		ed.value = value;
	  }
	  
	  sp.SetMetric(rbMetric.checked) ;      
			
	  return xtr;
	  
}






// Function clearTabOuts()
// Purpose: deletes all rows of output table
function clearTabOuts()
{
	while (tabOuts.rows.length > 0)
	{
		tabOuts.deleteRow(0) ;
	}
	return;
}




// unused in production, but useful in debugging- 
// returns all properties of an object.
// usually I'll just display them in an alert or put them in the clipboard.
function debugProperties(objParam)
{
	var props = "";
	for (var prop in objParam)
	{
		props += prop + "=" + objParam[prop] + "\n";
	}
   
	return props;
}



// Things to do when first starting-up the page:
function PageLoad(isReset, colNum)
{   
	 //agreed = true; // get off my back for testing. TO DO: remove it for the real thing.
	if (!agreed)
	{ 
		if (confirm(element("hidDisclaimer").value ))
		{
			agreed = true ;
		}
		else
		{
			location = "http://www.phdinc.com/" ;
			return ;
		}
	}


	SetupDivPop("divUCPop") ;  
	 
		
	// in the interest of leaving as much working code alone as possible (at the slight expense of 
	// having a tiny bit of inconsistancy in labeling) the normal column name is blank,
	// which is what it was before I started messing with this (so I didn't have to change
	// a bunch of code) and the compare column is C2.
	
	if (colNum != "C2")
	{
		colNum = "";
		dispExtRetTime = false;
	}
	
	
	getVars(colNum);
	

	if (colNum == "")
	{
	// set defaults
	var DistLNum = 1, DistLUOM = element("hidIn").value,
		WeightWNum = 0.1, WeightWUOM = element("hidLb").value,
		NumberNNum = 1, NumberNUOM = element("hidUnits").value,
		PressurePNum = 87, PressurePUOM = element("hidPSI").value,
		OffsetRNum = 0, OffsetRUOM = element("hidIn").value,
		DistHpNum =1, DistHpUOM = element("hidIn").value,
		DistHsNum =1, DistHsUOM = element("hidIn").value,
		FrictionFNum = 0.5, FrictionFUOM = "",
		VelocityVNum = 1, VelocityVUOM = element("hidInSec").value,
		AngleANum = 90, AngleAUOM = element("hidDegree").value,
		TemperatureNum = 72, TemperatureUOM = "F";
		//CycleRateNum = 60, CycleRateUOM = element("hidPerMin").value;    
	}
	else
	{   // we need to initialize column 2 fields to match column 1 fields.
	var DistLNum = element("spnUCDistL").ActualValue / element("spnUCDistL").ConvFact,
		WeightWNum = element("spnUCWeightW").ActualValue / element("spnUCWeightW").ConvFact,
		NumberNNum = element("spnUCNumberN").ActualValue / element("spnUCNumberN").ConvFact,
		PressurePNum = element("spnUCPressureP").ActualValue / element("spnUCPressureP").ConvFact,
		OffsetRNum = element("spnUCOffsetR").ActualValue / element("spnUCOffsetR").ConvFact,
		DistHpNum =element("spnUCDistHp").ActualValue / element("spnUCDistHp").ConvFact,
		DistHsNum =element("spnUCDistHs").ActualValue / element("spnUCDistHs").ConvFact,
		FrictionFNum = element("spnUCFrictionF").ActualValue / element("spnUCFrictionF").ConvFact,
		VelocityVNum = element("spnUCVelocityV").ActualValue / element("spnUCVelocityV").ConvFact,
		AngleANum = element("spnUCAngleA").ActualValue / element("spnUCAngleA").ConvFact,
		TemperatureNum = element("spnUCTemperature").ActualValue;
		//CycleRateNum = element("spnUCCycleRate").ActualValue / element("spnUCCycleRate").ConvFact;
   
		rbMetric   = element("rbMetric") ;
		rbImperial = element("rbImperial");
		
		
		if (whichBrs() == "Firefox") 
		{
			var DistLUOM = element("spnUCDistL").textContent, 
			WeightWUOM = element("spnUCWeightW").textContent, 
			NumberNUOM = element("spnUCNumberN").textContent, 
			PressurePUOM = element("spnUCPressureP").textContent, 
			OffsetRUOM = element("spnUCOffsetR").textContent, 
			DistHsUOM = element("spnUCDistHs").textContent, 
			DistHpUOM = element("spnUCDistHp").textContent, 
			AngleAUOM = element("spnUCAngleA").textContent, 
			FrictionFUOM = element("spnUCFrictionF").textContent,
			VelocityVUOM = element("spnUCVelocityV").textContent, 
			TemperatureUOM = element("spnUCTemperature").textContent;
			//CycleRateUOM = element("spnUCCycleRate").textContent;
		}
		else
		{
			var DistLUOM = element("spnUCDistL").innerText, 
			WeightWUOM = element("spnUCWeightW").innerText, 
			NumberNUOM = element("spnUCNumberN").innerText, 
			PressurePUOM = element("spnUCPressureP").innerText, 
			OffsetRUOM = element("spnUCOffsetR").innerText, 
			DistHsUOM = element("spnUCDistHs").innerText, 
			DistHpUOM = element("spnUCDistHp").innerText, 
			AngleAUOM = element("spnUCAngleA").innerText, 
			FrictionFUOM = element("spnUCFrictionF").innerText,
			VelocityVUOM = element("spnUCVelocityV").innerText, 
			TemperatureUOM = element("spnUCTemperature").innerText;
			//CycleRateUOM = element("spnUCCycleRate").innerText;
		}
	}
	
	if (isReset)
	{
		rbGravity.checked = true;
		rbImperial.checked = true ;  
		NoSeries() ; // not using cookie stuff for now
	}
	else
	{
		if (!rbImperial.checked && !rbMetric.checked)
			rbImperial.checked = true; // if neither one is checked, check one.
	}

	/*var txtCycleRate = element("txtCycleRate");
	alert("txtCycleRate.value: " + txtCycleRate.value);
	alert("element('spnUCCycleRate').ActualValue: " + element("spnUCCycleRate").ActualValue);
	alert(element("spnUCCycleRate").ActualValue / element("spnUCCycleRate").ConvFact);  */
	// set up unit converters for inputs:
	SetupUC("imgDistLMinus" + colNum, "txtDistL" + colNum, "imgDistLPlus" + colNum, "spnUCDistL" + colNum, "length", DistLUOM, DistLNum, 1, 1, 4, 0, Infinity, false) ;
	SetupUC("imgWeightWMinus" + colNum, "txtWeightW" + colNum, "imgWeightWPlus" + colNum, "spnUCWeightW" + colNum, "weight", WeightWUOM, WeightWNum, 1, 1, 3, 0, Infinity, false) ;
	SetupUC("imgNumberNMinus" + colNum, "txtNumberN" + colNum, "imgNumberNPlus" + colNum, "spnUCNumberN" + colNum, "units", element("hidUnits").value, NumberNNum, 1, 1, 1, 1, Infinity, false) ;
	SetupUC("imgPressurePMinus" + colNum, "txtPressureP" + colNum, "imgPressurePPlus" + colNum, "spnUCPressureP" + colNum, "pressure", PressurePUOM, PressurePNum, 1, 1, 2, 30, 150, false) ;
	SetupUC("imgOffsetRMinus" + colNum, "txtOffsetR" + colNum, "imgOffsetRPlus" + colNum, "spnUCOffsetR" + colNum, "length", OffsetRUOM, OffsetRNum, 1, 1, 4, 0, Infinity, false) ;
	SetupUC("imgDistHpMinus" + colNum, "txtDistHp" + colNum, "imgDistHpPlus" + colNum, "spnUCDistHp" + colNum, "length", DistHpUOM, DistHpNum, 1, 1, 4, 0, Infinity, false) ;
	SetupUC("imgFrictionFMinus" + colNum, "txtFrictionF" + colNum, "imgFrictionFPlus" + colNum, "spnUCFrictionF" + colNum, "", "", FrictionFNum, 1, 1, 1, 0, Infinity, false) ;
	SetupUC("imgDistHsMinus" + colNum, "txtDistHs" + colNum, "imgDistHsPlus" + colNum, "spnUCDistHs" + colNum, "length", DistHsUOM, DistHsNum, 1, 1, 4, 0, Infinity, false) ;
	SetupUC("imgVelocityVMinus" + colNum, "txtVelocityV" + colNum, "imgVelocityVPlus" + colNum, "spnUCVelocityV" + colNum, "velocity", VelocityVUOM, VelocityVNum, 1, 1, 3, 0, Infinity, false) ;
	SetupUC("imgAngleAMinus" + colNum, "txtAngleA" + colNum, "imgAngleAPlus" + colNum, "spnUCAngleA" + colNum, "angle", AngleAUOM, AngleANum, 1, 1, 1, 0, 90, false) ;
	SetupUC("imgTemperatureMinus" + colNum, "txtTemperature" + colNum, "imgTemperaturePlus" + colNum, "spnUCTemperature" + colNum, "temperature", TemperatureUOM, TemperatureNum, TemperatureUOM, 1, 1, -20, 180, false) ;
	//SetupUC("imgCycleRateMinus" + colNum, "txtCycleRate" + colNum, "imgCycleRatePlus" + colNum, "spnUCCycleRate" + colNum, "cyclerate", CycleRateUOM, CycleRateNum, 1, 1, 1, 0, Infinity, false) ;
		 
		
	if (colNum == "C2")
	{
		var MC2, IC2;
		MC2 = element("rbMetricC2");
		IC2 = element("rbImperialC2");
		MC2.checked = rbMetric.checked;
		IC2.checked = rbImperial.checked;
	}
	
	
	busy = true ;    // we're busy!
	
	// act as if these buttons were just clicked
	FilterFeedClick() ;         // display proper fields depending on feed type (gravity vs conveyor show different fields)
	FilterSeriesClick() ;  
	
	UnitsChanged();


	if (Language == null) {
	    Language = element("UserLanguageStorage").value;
	}
	// adjust lang input to correct name so the picky thing runs...
	if (Language == "en")
	    Language = "English"
	else if (Language == "de")
	    Language = "German"
	else if (Language == "es")
	    Language = "Spanish"


	busy = false;  // we're not busy anymore!
	
	
	
	return;
}



function jsPrint3()
{ 
	getVars("");
	
	// reset all to default:
	tabInsC1 = "";
	tabInsC2 = "";
	tabOutsC1 = "";
	tabOutsC2 = "";
	
	// make sure we have the proper values being sent to the print html file
	// if the user types in a number, it won't show up properly-
	// if you don't believe me, comment this out and test it.   
	element("txtDistL").defaultValue = element("txtDistL").value;
	element("txtWeightW").defaultValue = element("txtWeightW").value;
	element("txtNumberN").defaultValue = element("txtNumberN").value;
	element("txtPressureP").defaultValue = element("txtPressureP").value;
	element("txtOffsetR").defaultValue = element("txtOffsetR").value;
	
	 element("txtDistHp").defaultValue = element("txtDistHp").value;
		element("txtDistHs").defaultValue = element("txtDistHs").value;
		element("txtAngleA").defaultValue = element("txtAngleA").value;

		element("txtFrictionF").defaultValue = element("txtFrictionF").value;
		element("txtVelocityV").defaultValue = element("txtVelocityV").value;
   // }
	element("txtTemperature").defaultValue = element("txtTemperature").value;
	//element("txtCycleRate").defaultValue = element("txtCycleRate").value;    
		
	tabInsC1 = element("tabIns");
	tabOutsC1 = element("tabOuts"); 
	
	tabInsC1.width = "100%";
	tabOutsC1.width = "100%";
	
	if (rbCompareMode.checked)
	{
		tabOutsC2 = element("tabOutsC2");
		tabInsC2 = element("tabInsC2");
		
		tabInsC2.width = "100%";
		tabOutsC2.width = "100%"
	}
	 
	
	divPrintFeed = element("divFilter");
	divPrintSeries = element("divEscSeries");
	divPrintInput = element("divAppInputs");
	
	
	if (cbLC.checked && cb160.checked)
	{
		series = "LC & 160 Escapements";// translate
	}
	else if (cb160.checked)
	{           
		series = "160 Escapements";// translate
	}
	else if (cbLC.checked)
	{   
		series = "LC Escapements";// translate
	}
	
	if (rbGravity.checked)
	{
		feedType = "Gravity";// translate
	}
	else if (rbConveyor.checked)
	{           
		feedType = "Conveyor";// translate
	}
	
	   
	window.open('print.html','Printing','width=800,height=675, toolbar=yes, scrollbars=yes');
	return;
}




// since the built-in javascript rounding is next to useless,
// it's up to me to create a decent one.
function round(base, places)
{
	var mult = Math.pow(10,places);
	var temp = base * mult;
	var retVal;
	
	temp = Math.round(temp);
	retVal = temp/mult;
	
	return retVal;
}


// find position of object on webpage
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


// find how many options are selected in the list.
function numberSelected(list)
{ 
	var num = 0;
	for (var i=0; i <= list.options.length-1; i++) 
	{   
		if (list.options[i].selected) 
		{   
			num++;
		}
	}
	return num;
}


/// function copy : javascript
/// for clipboard functionality
/// use printData function, but replace HTML specific code
function copy()
{   
	var column1, column2;
	column1 = copyData("");
	if (rbCompareMode.checked)
	{
		getVars("C2");
		column2 = copyData("C2");
	}
	else
	{
		column2 = "";
	}
	
	var clipboardData = column1 + column2; // printData(); // formatData();
	clipboardData = clipboardData.replace(/<br \/>/g, "\n"); // replace html with umm.. whatever its called.
	clipboardData = clipboardData.replace(/<b>/g, ""); // this looks nice and easy to read. 
	clipboardData = clipboardData.replace(/<\/b>/g, ""); 
	
	try
	{
		vname=window.clipboardData.setData("Text", clipboardData );
		alert(element("hidClipboard").value);
	}
	catch(err)
	{
		// NOTE: this isn't going to work for FireFox.
		alert(element("hidUnsupported").value);
	}
	return;
}




function valueAndUOM(strCellData)
{
// this function takes the cell data and returns a string of ActualValue + UOM
// first find ActualValue data:
	var start;
	var ActualValue;
	var end;
	var UOM;
	var retVal;
	var found = false;
	var offset;
	
	var spanID, spanObj;
	
	// get ActualValue:    
	
	var searchString, endString;
	offset = 13;
	start = strCellData.toUpperCase().search('ACTUALVALUE="') + offset; // the +offset is to include the 'ActualValue="' string
	end = strCellData.indexOf('"', start);
	ActualValue = strCellData.substring(start, end);
	
	start = 0;
	end = 0;
	i = 0;
	while (!found) // ugh.. this is asking for trouble. TO DO: fix it (eventually.)
	{
		start = strCellData.indexOf(">", end+1);
		end = strCellData.indexOf("<", start);
		
		if (start == -1 || start >= strCellData.length) // just so we don't go into endless loops
		{
			break;
		}
		
		UOM = strCellData.substring(start +1, end);
		
		if (UOM == "" || UOM == " ")
		{
			found = false;
		}
		else
		{
			found = true;
			break;
		}
	}
	
	retVal = round(ActualValue,3) + " " + UOM;    
	//alert("retVal: " + retVal);
	return (retVal);
}


function value(strCellData)
{
// this function takes the cell data and returns a string of ActualValue 
// first find ActualValue data:
	var start;
	var ActualValue;
	var end;
	var UOM;
	var retVal;
	var found = false;
	var offset;
	
	var spanID, spanObj;
	
	// get ActualValue:    
	
	var searchString, endString;
	offset = 13;
	start = strCellData.toUpperCase().search('ACTUALVALUE="') + offset; // the +offset is to include the 'ActualValue="' string
	end = strCellData.indexOf('"', start);
	ActualValue = strCellData.substring(start, end);
	
	start = 0;
	end = 0;
	i = 0;
	while (!found) // ugh.. this is asking for trouble. TO DO: fix it (eventually.)
	{
		start = strCellData.indexOf(">", end+1);
		end = strCellData.indexOf("<", start);
		
		if (start == -1 || start >= strCellData.length) // just so we don't go into endless loops
		{
			break;
		}
		
		UOM = strCellData.substring(start +1, end);
		
		if (UOM == "" || UOM == " ")
		{
			found = false;
		}
		else
		{
			found = true;
			break;
		}
	}
	
	retVal = round(ActualValue,4);//  + " " + UOM;    
	//alert("retVal: " + retVal);
	return (retVal);
}