//+--------------------------------------------------------------------------+
//| Project Name     	: Ready Reckoner	
//+ 
//| Project Number 	: P3480
//+ 
//| Reference  		: table.js
//+ 
//| Description		: javascript file which contains functionality
//|			: for table processing and validation.
//+ 
//| Configuration Record
//| Review		Version	Author		Date		Change No.
//| P3480/PM5.7.6/43    1.0     Paul Ash        11/03/2002	Original
//|
//+ 
//| Copyright CMG 2002
//+--------------------------------------------------------------------------+
//|                  VISUAL SOURCESAFE VERSION INFORMATION 
//| $Archive:: /Ready Reckoner (2)/asproot/ill_health_ $Workfile::                                                		     
//| $Revision:: 2                                                                  $Modtime::                                                               
//| $Author:: Pash                                                                 $Date::                                                                  
//| $NoKeywords:
//+--------------------------------------------------------------------------+


//+--------------------------------------------------------------------------+
//| Name     		: AddRow						     
//+ 
//| Description		: Dynamically adds a row to the end of table.				    
//+ 
//| Parameters		: None				                     
//+ 
//| Returns		: Nothing		                     
//+ 
//| Comments		: None						                     
//+--------------------------------------------------------------------------+
function TruncateNumber(longfloat,length)
{
	
	var trunc 
	var strTotal = new String(longfloat);

	var s = strTotal.lastIndexOf('.');

	if(s!=-1) {
		var expression = s+parseInt(length);
	
		if (strTotal.length > expression)
		{ 
			trunc =  strTotal.substr(0,s) + '' + strTotal.substr(s, length + 1);
			trunc = removetrailingzeros(trunc);
		}
		else
			{
			trunc = removetrailingzeros(strTotal);
			}
		}
	else 
	trunc = longfloat;

	return(trunc)
}

function saveDHTMLtable()
{
	//save out the DHTML table
	var objsavetable = document.all.item("hndpersisttable");
	objsavetable.value =  document.all("tblList").outerHTML;
}

function removetrailingzeros(number)
{
	var whole;
	var strTotal = new String(number);
	var objtrunc;

	var s = strTotal.lastIndexOf('.00');
	if (s!=-1) 
	{
	 whole =  strTotal.substr(0,s);
	}
	else
	{
	//remove any zeros encountered at the end of the 3 dp 
	objtrunc = strTotal.substr(strTotal.length-1,1);

	if(objtrunc == "0") 
		{
			whole = strTotal.substr(0,strTotal.length-1);		
		}
	else
	whole = number;
	}

	return(whole);
}
function restoreDHTMLtable()
{
	//restore the DHTML table
	var objsavetable = document.all.item("hndpersisttable");
	document.all("tblList").outerHTML = objsavetable.value;
}


function ill_health_checkreload()
{
	if(document.all.item("hndpersisttable").value != '')
	{
		restoreDHTMLtable();
	}
}

function ill_health_reorderctrls()
{
	
	var j;
	var obj;
	var obj1;
	var objrownumber = 5;

	var strTableRow = document.all("tblList").rows;

	for (j=0; j < strTableRow.length; j++)
	{
	if(strTableRow(j).cells(5).name != "Total") 
	 {
	  
	 obj = strTableRow(j).cells(5).childNodes(0);
	 obj1 = strTableRow(j).cells(5).childNodes(2);

	 obj.outerHTML = '<input type="button" name="cmdedit' + j + '" value="Edit" class="cmd" onclick="editrow(this.name)">';
         obj1.outerHTML = '<input type="button" name="cmdremove' + j + '" value="Remove" class="cmd" onclick="deleterow(this.name)">';
	 }
	}

}

//+--------------------------------------------------------------------------+
//| Name     		: addrow						     
//+ 
//| Description		: Dynamically adds a row to the end of table.				    
//+ 
//| Parameters		: None				                     
//+ 
//| Returns		: Nothing		                     
//+ 
//| Comments		: None						                     
//+--------------------------------------------------------------------------+
function isNumeric(str)
{
  for (var i=0; i < str.length; i++)
		{
    var ch = str.substring(i, i+1)

    //only numeric numbers allowed
    if( ch < "0" || ch>"9" || str.length == null)
	
    {
      //Allow for decimal points
      if (ch != ".") 
	{		
      		return false
	}
    }
    
  }
  return true
}


function validate(strnum,entryname)
{
	// check for null entry
	
	var field = document.all.item(entryname)
		
	//second level check

	if (parseFloat(strnum) == 'NaN') 
	{
		alert("The user has not entered a valid number");
		field.focus();
		return(false);
	}
	else
	field.value = parseFloat(strnum); // correct the field
	
	if (isNaN(parseFloat(strnum)))
	{ //reset the field if NaN is encountered
		field.value = strnum;
	}

	
	//check for negatives
	if (parseFloat(strnum) < 0) 
	{
		alert("The user cannot enter negative numbers");
		field.focus();
		return(false);
	}
	
	if (isNumeric(strnum) == false) 
	{
		alert("The user has not entered a valid number");
		field.focus();
		return(false);
	}
	return(true);
}

function valkeycodes()
{

	//no leading spaces
	if (window.event.keyCode == 32) 
	{
	window.event.returnValue = false 
	}
	
}

//+--------------------------------------------------------------------------+
//| Name     		: addrow						     
//+ 
//| Description		: Dynamically adds a row to the end of table.				    
//+ 
//| Parameters		: None				                     
//+ 
//| Returns		: Nothing		                     
//+ 
//| Comments		: None						                     
//+--------------------------------------------------------------------------+
function addrow()
{
	var objT1 = document.all.item("txttbldata1");
	var objT2 = document.all.item("txttbldata2");
	var objT3 = document.all.item("txttbldata3");
	var objT4 = document.all.item("txttbldata4");
	var strheaderRow = document.all("tblHeaders").rows;

	if(objT2.value=="")
	{
		objT2.value = '0';
	}
	if(objT3.value=="")
	{
		objT3.value = '0';
	}
	if(objT4.value=="")
	{
		objT4.value = '0';
	}

	var bcontinue = true;
	var objdatatype;

	var strTableRow = document.all("tblList").rows;
	objdatatype = document.all.item("hndcalcmode");
	if(objdatatype.value=="Sector")
	{ 
		if(strTableRow.length==2)
		{
			alert("You are only allowed to have one sector");
			objT1.value = '';
			objT2.value = '';
			objT3.value = '';
			objT4.value = '';
			strheaderRow(1).cells(4).innerText = "";
			bcontinue = false;
		}
	}

	var objtxtind1 = document.all.item("txtind1");

	//Create the total row first

	if(strTableRow.length==0) 
	{
		
	document.all.tblList.insertRow(strTableRow.length);
	document.all.tblList.rows[strTableRow.length-1].insertCell().width="176";
 	document.all.tblList.rows[strTableRow.length-1].insertCell().width="71";
 	document.all.tblList.rows[strTableRow.length-1].insertCell().width="53";
 	document.all.tblList.rows[strTableRow.length-1].insertCell().width="83";
   	document.all.tblList.rows[strTableRow.length-1].insertCell().width="79";
 	document.all.tblList.rows[strTableRow.length-1].insertCell().width="97";

	document.all.tblList.rows[strTableRow.length-1].cells[0].name="Total";
	document.all.tblList.rows[strTableRow.length-1].cells[1].name="Total";
	document.all.tblList.rows[strTableRow.length-1].cells[2].name="Total";
	document.all.tblList.rows[strTableRow.length-1].cells[3].name="Total";
	document.all.tblList.rows[strTableRow.length-1].cells[4].name="Total";
	document.all.tblList.rows[strTableRow.length-1].cells[5].name="Total";

	document.all.tblList.rows[strTableRow.length-1].cells[0].className="TotalCellBlank";
	document.all.tblList.rows[strTableRow.length-1].cells[1].className="TotalCell";
	document.all.tblList.rows[strTableRow.length-1].cells[2].className="TotalCell";
	document.all.tblList.rows[strTableRow.length-1].cells[3].className="TotalCellBlank";
	document.all.tblList.rows[strTableRow.length-1].cells[4].className="TotalCell";	
	}
	
	if(bcontinue==true)
	{
 	document.all.tblList.insertRow(0);
	var offset = 0;
 	document.all.tblList.rows[offset].insertCell().width="176";
 	document.all.tblList.rows[offset].insertCell().width="71";
 	document.all.tblList.rows[offset].insertCell().width="53";
 	document.all.tblList.rows[offset].insertCell().width="83";
   	document.all.tblList.rows[offset].insertCell().width="79";
 	document.all.tblList.rows[offset].insertCell().width="97";
	
	document.all.tblList.rows[offset].cells[0].className="DataCellleft";
	document.all.tblList.rows[offset].cells[1].className="DataCell";
	document.all.tblList.rows[offset].cells[2].className="DataCell";
	document.all.tblList.rows[offset].cells[3].className="DataCell";
	document.all.tblList.rows[offset].cells[4].className="DataCell";

	//Add some text and controls to the cells
	
	if(trimstring(objT1.value)=="")
	{
		 	document.all.tblList.rows[offset].cells[0].insertAdjacentHTML('AfterBegin', "&nbsp;");		
	}
	else
 	document.all.tblList.rows[offset].cells[0].insertAdjacentHTML('AfterBegin', objT1.value);		
 	document.all.tblList.rows[offset].cells[1].insertAdjacentHTML('AfterBegin', objT2.value);	
 	document.all.tblList.rows[offset].cells[2].insertAdjacentHTML('AfterBegin', objT3.value);
 	document.all.tblList.rows[offset].cells[3].insertAdjacentHTML('AfterBegin', objT4.value);
	document.all.tblList.rows[offset].cells[4].insertAdjacentHTML('AfterBegin', TruncateNumber(objT2.value * objT3.value * objT4.value,2));
	document.all.tblList.rows[offset].cells[5].insertAdjacentHTML('AfterBegin', '<input type="button" name="cmdedit" value="Edit" class="cmd" onclick="editrow(this.name)"> <input type="button" name="cmdremove" value="Remove" class="cmd" onclick="deleterow(this.name)">');

	totalrow(1,'');
	totalrow(2,'');
	//totalrow(3,'');
	totalrow(4,'hndtablecost');
		
	//put the subtotal figure in the header row		
	strheaderRow(1).cells(4).innerText = TruncateNumber(objT2.value * objT3.value * objT4.value,2);
	
	if(objdatatype.value!="Sector")
	{
	var bcontinue = window.confirm("Click OK to add another entry. Click Cancel to stop.");
	if (bcontinue==true)
	{
	//Reset to the first field
	objT1.focus();
	}
	else
	objtxtind1.focus();
	}

	if (document.all.chknew.checked == true) 
	{
		objT1.value = "";
		objT2.value = "";
		objT3.value = "";
		objT4.value = "";
		strheaderRow(1).cells(4).innerText = "";	 
	} 

	//rename the names of the controls
	ill_health_reorderctrls();

	//save the table details, it will get destroyed when the form is submitted
	saveDHTMLtable();
	}
}

//+--------------------------------------------------------------------------+
//| Name     		:editrow						     
//+ 
//| Description		: Dynamically adds a row to the end of table.				    
//+ 
//| Parameters		: None				                     
//+ 
//| Returns		: Nothing		                     
//+ 
//| Comments		: None						                     
//+--------------------------------------------------------------------------+
function editrow(buttonname)
{
	var bcontinue = window.confirm("Click OK to edit row or click Cancel to end.");
	if (bcontinue==true)
	{
		var objeditrow = document.all.item("hndeditrow");
		if(objeditrow.value !='')
		{ 
		  cancelupdate(); 
		}

		var objT1 = document.all.item("txttbldata1");
		var objT2 = document.all.item("txttbldata2");
		var objT3 = document.all.item("txttbldata3");
		var objT4 = document.all.item("txttbldata4");

		//identify which control in the table called this function
		var objCell = document.all.item(buttonname).parentNode;
		
		//Now retrieve the Row object that the cell is within.
		var objRow = objCell.parentNode;
		
		//Now that we have the Row, identify its index within the Rows collection.
		var RowIndex = objRow.rowIndex;
		
		//Get the text in the table 
		var strTableRow = document.all("tblList").rows;	
		
		//put the contents of that row into the text boxes
		objT1.value  = strTableRow(RowIndex).cells(0).innerText;
		objT2.value  = strTableRow(RowIndex).cells(1).innerText;
		objT3.value  = strTableRow(RowIndex).cells(2).innerText;
		objT4.value  = strTableRow(RowIndex).cells(3).innerText;
		//put the subtotal figure in the header row
		var strheaderRow = document.all("tblHeaders").rows;		
		strheaderRow(1).cells(4).innerText = strTableRow(RowIndex).cells(4).innerText;
	
		//modify the buttons
		document.all.tblHeaders.rows[1].cells[5].innerHTML = '<input type="button" name="cmdupdate" value="Save" class="cmdHeaderCancel" onclick="updaterow()">&nbsp;<input type="button" name="Button" value="Cancel" class="cmdHeaderUpdate" onclick="cancelupdate()">';	
		
		//save the edit row position
		objeditrow.value = RowIndex;

		//show the user that this row is being edited.
		document.all.tblList.rows[RowIndex].cells[0].className="DataCelleditleft";
		document.all.tblList.rows[RowIndex].cells[1].className="DataCelledit";
		document.all.tblList.rows[RowIndex].cells[2].className="DataCelledit";
		document.all.tblList.rows[RowIndex].cells[3].className="DataCelledit";
		document.all.tblList.rows[RowIndex].cells[4].className="DataCelledit";

		var intCurrentrows = strTableRow.length;
		intCurrentrows = intCurrentrows - 1;
		for (i=0;i<intCurrentrows;i++)
		{
		//Disable the calling row buttons
		var objCurrentEdit = document.getElementById("cmdedit"+i);
		objCurrentEdit.disabled = true;

		var objCurrentRemove = document.getElementById("cmdremove"+i);
		objCurrentRemove.disabled = true;
		}

		//place cursor in the first box
		objT1.focus();	
	}
}

function cleareditrow()
{
	// clear the editing row input boxes
	document.all.item("txttbldata1").value = '';
	document.all.item("txttbldata2").value = '';
	document.all.item("txttbldata3").value = '';
	document.all.item("txttbldata4").value = '';
	
	var strheaderRow = document.all("tblHeaders").rows;
	strheaderRow(1).cells(4).innerText = "";
}

function cancelupdate()
{
	//restore the header button
	var strTableRow = document.all("tblList").rows;
	document.all.tblHeaders.rows[1].cells[5].innerHTML = '<input type="button" name="cmdAddToReport" value="Add to Report" class="cmdHeaderAdd" onclick="addrow()">';
	//restore the class of the rows
	var objeditrow = document.all.item("hndeditrow");
	var RowIndex = objeditrow.value;
	document.all.tblList.rows[RowIndex].cells[0].className="DataCellleft";
	document.all.tblList.rows[RowIndex].cells[1].className="DataCell";
	document.all.tblList.rows[RowIndex].cells[2].className="DataCell";
	document.all.tblList.rows[RowIndex].cells[3].className="DataCell";
	document.all.tblList.rows[RowIndex].cells[4].className="DataCell";
	
	objeditrow.value = '';
	
	// clear the editing row input boxes
	cleareditrow();

	var intCurrentrows = strTableRow.length;
	intCurrentrows = intCurrentrows - 1;
	for (i=0;i<intCurrentrows;i++)
	{
	//Disable the calling row buttons
	var objCurrentEdit = document.getElementById("cmdedit"+i);
	objCurrentEdit.disabled = false;

	var objCurrentRemove = document.getElementById("cmdremove"+i);
	objCurrentRemove.disabled = false;
	}
}

function updaterow()
{
	var objT1 = document.all.item("txttbldata1");
	var objT2 = document.all.item("txttbldata2");
	var objT3 = document.all.item("txttbldata3");
	var objT4 = document.all.item("txttbldata4");
	var strTableRow = document.all("tblList").rows;

	var objtxtind1 = document.all.item("txtind1");

	var objedit = document.all.item("hndeditrow");
	
	//validation is correct then update the row
	document.all.tblList.rows[objedit.value].cells[0].innerText = objT1.value;		
 	document.all.tblList.rows[objedit.value].cells[1].innerText = objT2.value;
 	document.all.tblList.rows[objedit.value].cells[2].innerText = objT3.value;
	document.all.tblList.rows[objedit.value].cells[3].innerText = objT4.value;
	document.all.tblList.rows[objedit.value].cells[4].innerText = TruncateNumber(objT2.value * objT3.value * objT4.value,2);
	
	totalrow(1,'');
	totalrow(2,'');
	totalrow(4,'hndtablecost');

	
	//put the subtotal figure in the header row
	var strheaderRow = document.all("tblHeaders").rows;		
	strheaderRow(1).cells(4).innerText = TruncateNumber(objT2.value * objT3.value * objT4.value,2);
	
	cancelupdate();

	//persist the table and totals
	saveDHTMLtable();

	// clear the editing row input boxes
	cleareditrow();

}

function totalrow(objrownumber,textbox)
{
	//recalculate the running total
	var strTableRow = document.all("tblList").rows;
	var runningtotal = "0.00";
	var j

	for (j=0; j < strTableRow.length; j++)
	{
	//only process rows which are not the total row
	if(strTableRow(j).cells(objrownumber).name != "Total") 
		{
	 	//adds two floating point numbers together correctly
	 	runningtotal = addfloat(strTableRow(j).cells(objrownumber).innerText,runningtotal);
		} 
	}

	strTableRow(strTableRow.length-1).cells(objrownumber).innerText = TruncateNumber(runningtotal,2);

	if(TruncateNumber(runningtotal,2) == ".") 
	{
	strTableRow(strTableRow.length-1).cells(objrownumber).innerText = "0";
	}

	if(textbox !="")
	{
		var objpersisttotal = document.all.item(textbox);
		objpersisttotal.value = strTableRow(strTableRow.length-1).cells(objrownumber).innerText;
	}
}


function deleterow(buttonname)
{
	var bcontinue = window.confirm("Click OK to Delete row or click Cancel to end.");
	if (bcontinue==true)
	{	
		
		//identify which control in the table called this function
		var objCell = document.all.item(buttonname).parentNode;
		
		//Now retrieve the Row object that the cell is within.
		var objRow = objCell.parentNode;
		
		//Now that we have the Row, identify its index within the Rows collection.
		var RowIndex = objRow.rowIndex;

		//Remove the row from the table
	   	document.all.tblList.rows[RowIndex].removeNode(true);

		//retotal the columns
		totalrow(1,'');
		totalrow(2,'');
		//totalrow(3,'');
		totalrow(4,'hndtablecost');

		//renumber the button ctrls
		ill_health_reorderctrls()

		//persist the table and totals
		saveDHTMLtable();
	}
		
}

function addfloat(num1, num2)
{
var dec1 = 0;
var dec2 = 0;
var i
var numsign1 = false;
var numsign2 = false;
var signsym1
var signsym2

	// get the length of the integer section before the decimal place.

	// this is the first number
	var strnum1 = new String(num1);
	//check for any sign at the begining of the number and remove it.
	if (strnum1.substr(0,1) == "-" || strnum1.substr(0,1) == "+") 
	{
		signsym1 = strnum1.substr(0,1);
		strnum1 = strnum1.substr(1);
		numsign1 = true;
	}

	

	dec1 = strnum1.lastIndexOf('.');
	if (dec1==-1) {strnum1+=".0";dec1 = strnum1.lastIndexOf('.');}

	if (dec1==0) {strnum1="0" + strnum1;dec1=1;}

	// this is the second number
		
	var strnum2 = new String(num2);
	if (strnum2.substr(0,1) == "-" || strnum2.substr(0,1) == "+") 
	{ 

		signsym2 = strnum2.substr(0,1);
		strnum2 = strnum2.substr(1);
		numsign2 = true;
	}

	dec2 = strnum2.lastIndexOf('.');
	if (dec2==-1) {strnum+=".0";dec2 = strnum2.lastIndexOf('.');}
	
	if (dec2==0) {strnum2="0" + strnum2;dec2=1;}

	var decimalp = Math.max(dec1,dec2);

	//get the length of the longest trailing floating point section

	var float1 = strnum1.substr(dec1 + 1);
	var float2 = strnum2.substr(dec2 + 1);

	if (float1.length > float2.length)
	{
		var diff = float1.length - float2.length;
		var floatsection = float2;
		var section = 2;
	}
	else
	{
	var diff = float2.length - float1.length;
	var floatsection = float1;
	var section = 1;
	}

	//pad the shortest floating point section with trailing zeros.	
	for (i=0; i < diff; i++)
	{
		floatsection+= "0";	
	}

	var integersection1 = strnum1.substr(0,dec1);
	var integersection2 = strnum2.substr(0,dec2);



	if (section == 1) 
		{
			var number1 = integersection1 + floatsection;
			var number2 = integersection2 + float2;
		}
		else
			{
				var number1 = integersection1 + float1;
				var number2 = integersection2 + floatsection;
			}
		
		
		var orglength = Math.max(number1.length,number2.length);
		

		if (numsign1 == true) 
		{ 
			number1 = signsym1 + number1;
		}
		
		if (numsign2 == true) 
		{ 
			number2 = signsym2 + number2;
		}

		var result = new String(parseFloat(number1) + parseFloat(number2));
	
		var offsetdp = result.length - orglength;
		var totaldp = decimalp + offsetdp;
		
		var newresult = result.substr(0,totaldp) + "." + result.substr(totaldp);
		return (newresult);

}


//---------------------------------------------------------------------------//
//				END OF FILE
//---------------------------------------------------------------------------//

