/* JavaScript: Class Dynamic Tables (alias: jsDynTable)functions: to provide generic functionality to add and remove table rows for our dynamic tables.returns: 	true = action is successful			false = had a problem and we need to troubleshoot somhow.created: 2009-08-04 rwmethods:	table.initTable	table.setColField	table.setMinRows	table.addRow	table.delRow	addRow requires a number of properties to be set before it can be called.   These are all defined using the setColField method.  Use this              method to get the layout initialized and then call addRow.	- number of columns	- field names for the columns (prefix) we add a rownumber suffix 	- type of field for the column	- values and defaults for the field in the column	- styles to use	- javascript to use	- extra data to put behind field - just text for now	class initialized in forms onLoad eventusage: yourtable.initTable(tableID, numberOfRows)yourtable.setColField(the column you are setting up, the field name, type of field or button, default values, stylesheet style to use,						extra javascript you want to add (onClick or onFocus etc.), extra stuff to go behind the field.   Needed this last one						for the Business Days label that went behind the field) yourtable.setMinRows() - optionally called to prebuild a table with a minimum number of rows.yourtable.addRow() - uses all the settings preset above in the onLoad to add the rowyourtable.delRow(rowNumber)*//* ********************************************************************** */function dynamicTables() {  try {	// prefix all local vars (hide them) with var	var kTableName;	var kTable, kTableBody;	var kTableId = '';	var kNumOfCols = 0;	var kNumOfCols2 = 0;	var kFieldNameArray = new Array;	var kFieldTypeArray = new Array;	var kFieldValueArray = new Array;	var kFieldStyleArray = new Array;	var kFieldJsArray = new Array;	var kExtrasArray = new Array;	var kCheckedArray = new Array;		var kFieldNameArray2 = new Array;	var kFieldTypeArray2 = new Array;	var kFieldValueArray2 = new Array;	var kFieldStyleArray2 = new Array;	var kFieldJsArray2 = new Array;	var kExtrasArray2 = new Array;	var kCheckedArray2 = new Array;		var kRowNumbers = new Array();	var kRowNum = 0;	var kMinimumRows = 0;	var kColumnSpan = false;	var kColumnSpan2 = false;	var kColumnSpanAmount = 1;	var kColumnSpanAmount2 = 1;	var kSpecial = false;	// Method to initialize the table	this.initTable = function initializeTable(thisTableId, thisNumber, thisSpecial) {		try {			var parmCheck=true;			parmCheck = (thisTableId.constructor==String) ? parmCheck : false;			parmCheck = (thisNumber.constructor==Number) ? parmCheck : false;						if ( parmCheck ) {									if ( thisSpecial == 'Yes' ) {					kSpecial = true;				} else {					kSpecial = false;				}								kTableName = thisTableId;				kTable = document.getElementById(thisTableId)				kTableBody = kTable.tBodies[0]							setNumberOfColumns(thisNumber);						 } else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: initializeTable error: Parameter passed was not a number');			 }		}	    	catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: initializeTable error: '+e.message);          }		} // end of initializeTable function		// Method to set the name of a field to be stored in the table	this.setColField = function setColumnField(thisColumn, thisName, thisType, thisValue, thisStyle, thisJs, thisExtra) {		try {			var parmCheck = true;			parmCheck = (thisColumn.constructor==Number) ? parmCheck : false;			parmCheck = (thisName.constructor==String) ? parmCheck : false;			parmCheck = (thisType.constructor==String) ? parmCheck : false;			parmCheck = (thisValue.constructor==String) ? parmCheck : false;			parmCheck = (thisStyle.constructor==String) ? parmCheck : false;						if ( parmCheck ) {				kFieldNameArray[thisColumn] = thisName;				kFieldTypeArray[thisColumn] = thisType;				kFieldValueArray[thisColumn] = thisValue;				kFieldStyleArray[thisColumn] = thisStyle;				if (thisJs.constructor==String) {					kFieldJsArray[thisColumn] = thisJs;				}				if (thisExtra.constructor==String) {					kExtrasArray[thisColumn] = thisExtra;				}			} else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: setColumnFieldName error: Parameter check failed');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setColumnField error: '+e.message);          }		} // end of setColumnField function	// Method to set the name of a field to be stored in the table   This is a special method copied from above for a multi-lined row	this.setColField2 = function setColumnField2(thisColumn, thisName, thisType, thisValue, thisStyle, thisJs, thisExtra) {		try {			var parmCheck = true;			parmCheck = (thisColumn.constructor==Number) ? parmCheck : false;			parmCheck = (thisName.constructor==String) ? parmCheck : false;			parmCheck = (thisType.constructor==String) ? parmCheck : false;			parmCheck = (thisValue.constructor==String) ? parmCheck : false;			parmCheck = (thisStyle.constructor==String) ? parmCheck : false;						if ( parmCheck ) {				kFieldNameArray2[thisColumn] = thisName;				kFieldTypeArray2[thisColumn] = thisType;				kFieldValueArray2[thisColumn] = thisValue;				kFieldStyleArray2[thisColumn] = thisStyle;				if (thisJs.constructor==String) {					kFieldJsArray2[thisColumn] = thisJs;				}				if (thisExtra.constructor==String) {					kExtrasArray2[thisColumn] = thisExtra;				}			} else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: setColumnField2 error: Parameter check failed');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setColumnField error: '+e.message);          }		} // end of setColumnField function	// Method to set the minimum number of rows for this table	this.setMinRows = function setMinimumRows(thisRows) {		try {			var parmCheck = true;			parmCheck = (thisRows.constructor==Number) ? parmCheck : false;			if ( parmCheck ) {				kMinimumRows = thisRows;					if (forceNumeric(this.getSize()) <= forceNumeric(kMinimumRows+1)) {     // need to add 1 to account for the header row.					for (x=1; x <= kMinimumRows; x++) {					 	this.addRow();					 }				} else {					if (kSpecial) {						this.checkDelButtons(this.getSize()-2, kMinimumRows+1) // need to subtract 1 for the header row.   Add 1 to minRows to account for double row line items					} else {						this.checkDelButtons(this.getSize()-1, kMinimumRows) // need to subtract 1 for the header row					}				}			} else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: setMinimumRows error: Parameter check failed');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setMinimumRows error: '+e.message);          }		} // end of setColumnField function	// Method to add a row to a table	this.addRow = function addTableRow(checkArray) {		try {			var newCell;			var newRow = kTableBody.insertRow(-1);   // <- problem here on the reload			var html = '';			var preHtml = '';			var fieldName;			var fieldNameSuffix			 						this.clearColors()   // reset the row colours for the previously added rows.						// Loop through the columns and add them one by one according to their properties			for (var i=1; i<=kNumOfCols; i++) {    				switch(kFieldTypeArray[i]) {					case 'select':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName						fieldNamePrefix = fieldName.slice(0,3)						if (kExtrasArray[i] == '') {							html = "<select "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						} else {							if (fieldNamePrefix == 'Cur') {								html = "<select "+kFieldJsArray[i]+" onChange='"+kExtrasArray[i]+"("+kRowNum+", true)' class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"							} else {								html = "<select "+kFieldJsArray[i]+" onChange='"+kExtrasArray[i]+"("+kRowNum+", false)' class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"							}//	alert(html)						}						break;					case 'check':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName						if (checkArray.constructor == Array) {							if (checkArray[0] == '') {								html = "<span class='labelCss'>none available</span>"							} else {								for (c=0; c<checkArray.length; c++) {									html = html + "<input type='checkbox' "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+'v'+c+"' id='"+kFieldNameArray[i]+'v'+c+"' "+kCheckedArray[i]+"></input>"+kExtrasArray[i]+"<span class='labelCss' id='lbl"+fieldNameSuffix+'v'+c+"'>"+checkArray[c]+"</span><span class='errorCss' id='err"+fieldNameSuffix+'v'+c+"'></span><br>"								}							}						} else {							html = "<span class='labelCss'>none available</span>"						}						break;					case 'input':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName						fieldNamePrefix = fieldName.slice(0,3)						if (kFieldNameArray[i] == 'CurrDept') {  // very special case where we need to add 2 fields to a single cell							preHtml = "<span id='cdept"+kRowNum+"'>"						} else {							if (kFieldNameArray[i] == 'SixDept') {								preHtml = "<span id='sdept"+kRowNum+"'>"							}						}						if (kExtrasArray[i] == '') {							html = preHtml + "<input "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"' value='"+kFieldValueArray[i]+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						} else {							if (fieldNamePrefix == 'Cur') {								html = preHtml + "<input "+kFieldJsArray[i]+" onKeyUp='"+kExtrasArray[i]+"("+kRowNum+", true)' class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"' value='"+kFieldValueArray[i]+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"							} else {								html = preHtml + "<input "+kFieldJsArray[i]+" onKeyUp='"+kExtrasArray[i]+"("+kRowNum+", false)' class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"' value='"+kFieldValueArray[i]+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"							}//		alert(html)						}						if (kFieldNameArray[i] == 'CurrDept') {							html = html + "</span><span id='cppe"+kRowNum+"'><select onChange='calculateDisplay("+kRowNum+", true)' class='fieldCssMandatory' name='CurrPPE"+kRowNum+"' id='CurrPPE"+kRowNum+"'>"+PPEList+"</select></span><span class='labelCss' id='lblCurrPPE"+kRowNum+"'></span><span class='errorCss' id='errCurrPPE"+kRowNum+"'></span>"						} else {							if (kFieldNameArray[i] == 'SixDept') {								html = html + "</span><span id='sppe"+kRowNum+"'><select onChange='calculateDisplay("+kRowNum+", false)' class='fieldCssMandatory' name='SixPPE"+kRowNum+"' id='SixPPE"+kRowNum+"'>"+PPEList+"</select></span><span class='labelCss' id='lblSixPPE"+kRowNum+"'></span><span class='errorCss' id='errSixPPE"+kRowNum+"'></span>"							}						}						break;					case 'textarea':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName						html = "<textarea "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'>"+kFieldValueArray[i]+"</textarea><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'>"+kExtrasArray[i]+"</span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						break;					case 'deletebutton':						html = "<input class='"+kFieldStyleArray[i]+"' type='button' name='"+kTableName+"Del' id='btn"+kTableName+kRowNum+"' value='"+kFieldNameArray[i]+"' onClick=\""+kFieldValueArray[i]+"("+kRowNum+")\">"						break;// This following case is unique to the RFS and we had to put it into the class to make it work.....   					case 'sectionbutton':						html = "<input class='"+kFieldStyleArray[i]+"' type='button' name='"+kTableName+"Add' id='btn"+kTableName+'Add'+kRowNum+"' value='"+kFieldNameArray[i]+"' onClick=\"tblBgnd"+kRowNum+"."+kFieldValueArray[i]+"()\">"						break;					case 'data':						html = "<span class='"+kFieldStyleArray[i]+"' >"+kFieldNameArray[i]+"</span>"						break;					default:						html = "&nbsp;"				}				newCell = newRow.insertCell(i-1);  // Must initialize cells starting at 0				newCell.innerHTML = html				newCell.className = 'selectRolesClass';				if ( kSpecial && i == 4) {					newCell.colSpan = 2;				}				newCell.style.backgroundColor = "#E4E6DC" // "#CBE4CB"			} // End Loop			kRowNumbers = kRowNumbers.concat(kRowNum)						if (kSpecial) {   // Need to add extra row and not check the delete buttons				this.addRow2();				kRowNum = kRowNum+2  // Since we are adding an extra row, we need to be handling this in our count.			} else {// Check to make sure that the delete buttons on are visible if we have more than the minimum required fields				kRowNum = kRowNum+1				this.checkDelButtons(this.getSize()-1, kMinimumRows) // need to subtract 1 for the header row			}				}	    	catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: addTableRow error: '+e.message);          }		} // end of addTableRow function					// Method to add a row to a table (SPECIAL)	this.addRow2 = function addTableRow2(checkArray) {		try {			var newCell;			var newRow = kTableBody.insertRow(-1);   // <- problem here on the reload			var html = '';			var fieldName;			var fieldNameSuffix			 						// Loop through the columns and add them one by one according to their properties			for (var i=1; i<=kNumOfCols2; i++) {    				switch(kFieldTypeArray2[i]) {					case 'select':						fieldName = kFieldNameArray2[i];						fieldNameSuffix = fieldName						if (kExtrasArray[i] == '') {							html = "<select "+kFieldJsArray2[i]+" class='"+kFieldStyleArray2[i]+"' name='"+kFieldNameArray2[i]+kRowNum+"' id='"+kFieldNameArray2[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						} else {							html = "<select "+kFieldJsArray2[i]+" onChange='"+kExtrasArray[i]+"("+kRowNum+")'; class='"+kFieldStyleArray2[i]+"' name='"+kFieldNameArray2[i]+kRowNum+"' id='"+kFieldNameArray2[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						}						break;					case 'check':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName.slice(3)						if (checkArray.constructor == Array) {							if (checkArray[0] == '') {								html = "<span class='labelCss'>none available</span>"							} else {								for (c=0; c<checkArray.length; c++) {									html = html + "<input type='checkbox' "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+'v'+c+"' id='"+kFieldNameArray[i]+'v'+c+"' "+kCheckedArray[i]+"></input>"+kExtrasArray[i]+"<span class='labelCss' id='lbl"+fieldNameSuffix+'v'+c+"'>"+checkArray[c]+"</span><span class='errorCss' id='err"+fieldNameSuffix+'v'+c+"'></span><br>"								}							}						} else {							html = "<span class='labelCss'>none available</span>"						}						break;					case 'input':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName						fieldNamePrefix = fieldName.slice(0,3)						if (kExtrasArray[i] == '') {							html = "<input "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"' value='"+kFieldValueArray[i]+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						} else {							html = "<input "+kFieldJsArray[i]+" onKeyUp='"+kExtrasArray[i]+"("+kRowNum+")' class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"' value='"+kFieldValueArray[i]+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						}						break;					case 'textarea':						fieldName = kFieldNameArray2[i];						fieldNameSuffix = fieldName						if (kExtrasArray[i] == '') {							html = "<textarea "+kFieldJsArray2[i]+" class='"+kFieldStyleArray2[i]+"' name='"+kFieldNameArray2[i]+kRowNum+"' id='"+kFieldNameArray2[i]+kRowNum+"'>"+kFieldValueArray2[i]+"</textarea><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						} else {							if (fieldNamePrefix == 'Cur') {								html = "<textarea "+kFieldJsArray2[i]+" onKeyUp='"+kExtrasArray2[i]+"("+kRowNum+", true)' class='"+kFieldStyleArray2[i]+"' name='"+kFieldNameArray2[i]+kRowNum+"' id='"+kFieldNameArray2[i]+kRowNum+"'>"+kFieldValueArray2[i]+"</textarea><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"							} else {								html = "<textarea "+kFieldJsArray2[i]+" onKeyUp='"+kExtrasArray2[i]+"("+kRowNum+", false)' class='"+kFieldStyleArray2[i]+"' name='"+kFieldNameArray2[i]+kRowNum+"' id='"+kFieldNameArray2[i]+kRowNum+"'>"+kFieldValueArray2[i]+"</textarea><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"							}						}//	alert(html)						if (kFieldNameArray2[i] == 'CurrDesc') {							html = html +"<div class='labelCss'>How it will look:</div><div class='displayCss' id='currUserDisplay"+kRowNum+"'>--> Lobbying the following Department(_____) in regards to Bill: _____.</div>"						} else {							html = html +"<div class='labelCss'>How it will look:</div><div class='displayCss' id='sixUserDisplay"+kRowNum+"'>--> Lobbying the following Department(_____) in regards to Bill: _____.</div>"						}//	alert(html)						break;					case 'deletebutton':						html = "<br><input class='"+kFieldStyleArray2[i]+"' type='button' name='"+kTableName+"Del' id='btn"+kTableName+kRowNum+"' value='"+kFieldNameArray2[i]+"' onClick=\""+kFieldValueArray2[i]+"("+kRowNum+")\">"//	alert(html)						break;					case 'data':						html = "<span class='"+kFieldStyleArray[i]+"' >"+kFieldNameArray[i]+"</span>"						break;					default:						html = "&nbsp;"				}				newCell = newRow.insertCell(i-1);  // Must initialize cells starting at 0				newCell.innerHTML = html				newCell.className = 'selectRolesClass';				if (i == 1) {					newCell.colSpan = 4;				}										newCell.style.backgroundColor = "#E4E6DC" // "#CBE4CB"			} // End Loop		// Check to make sure that the delete buttons on are visible if we have more than the minimum required fields			this.checkDelButtons(this.getSize()-2, kMinimumRows+1) // need to subtract 1 for the header row					}	    	catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: addTableRow error: '+e.message);          }		} // end of addTableRow function				// Method to remove a row from a table		this.delRow = function removeTableRow(thisRow) {		try {			var parmCheck = true;			parmCheck = (thisRow.constructor==Number) ? parmCheck : false;			if ( parmCheck ) {				for (var i=0; i<kRowNumbers.length; i++) {					if ( thisRow == kRowNumbers[i]) {	// Find the sequence number						if (kSpecial) {							kTableBody.deleteRow((i*2)+3) 	// Due to the header row, we need to skip add 1 as our table is skewed							kTableBody.deleteRow((i*2)+2) // Due to the special nature of section H row counts go by 2...						} else {							kTableBody.deleteRow(i+1) 	// Due to the header row, we need to skip add 1 as our table is skewed						}						kRowNumbers.splice(i, 1); 			// Remove this sequence number from the array					}				}// Check to make sure that the delete buttons on are visible if we have more than the minimum required fields				if (kSpecial) {					this.checkDelButtons(this.getSize()-2, kMinimumRows+1) // need to subtract 1 for the header row.   Add 1 to minRows to account for double row line items				} else {					this.checkDelButtons(this.getSize()-1, kMinimumRows) // need to subtract 1 for the header row				}			} else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: removeTableRow error: Parameter check failed');			}			}	    	catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: removeTableRow error: '+e.message);          }		} // end of removeTableRow function					// Property to set the array that stores the field suffixes.  When adding and removing the items are no longer sequential	this.setRowNums = function setRowNumbers(thisOldRows) {		try {			var parmCheck = true;			parmCheck = (thisOldRows.constructor==String) ? parmCheck : false;			if ( parmCheck ) {				if (thisOldRows.indexOf(',') < 0) {					kRowNumbers[0] = thisOldRows				} else {					kRowNumbers = thisOldRows.split(',');				}				kRowNum = forceNumeric(kRowNumbers[kRowNumbers.length-1])+1			} else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: setRowNumbers error: Parameter check failed');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setRowNumbers error: '+e.message);          }		} // end of setRowNumbers function// Property to set a new array that stores the default check value.  This is only used by checkbox field types.   Defaulted to 'off' 	this.setCheckDefault = function setCheckBoxDefaults(thisRow, state) {		try {			var parmCheck = true;			parmCheck = (thisRow.constructor==Number) ? parmCheck : false;			if ( parmCheck ) {				if (state == 'on') {					kCheckedArray[thisRow] = 'checked'				} else {					kCheckedArray[thisRow] = ''				}			} else {			 	logError(severityMajor, 'javascript class library: jsDynTable. function: setCheckBoxDefaults error: Parameter check failed');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setCheckBoxDefaults error: '+e.message);          }		} // end of setRowNumbers function		// Property to get the array that stores the field suffixes.	this.getRowNums = function getRowNumbers() {		try {			return kRowNumbers		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setRowNumbers error: '+e.message);          }		} // end of setRowNumbers function	// Property to get the last row number.	this.getLastRowNum = function getLastRowNumber() {		try {			return kRowNumbers[kRowNumbers.length - 1]		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setRowNumbers error: '+e.message);          }		} // end of setRowNumbers function// Property to get the array that stores the field suffixes and send it back as a string.	this.getRowNumsStr = function getRowNumbersString() {		try {			return kRowNumbers.join(',')		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setRowNumbers error: '+e.message);          }		} // end of setRowNumbers function// Property to set the array that stores the field suffixes.  When adding and removing the items are no longer sequential	this.getSize = function getTableSize() {		try {			return forceNumeric(kTable.rows.length)		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setRowNumbers error: '+e.message);          }		} // end of setRowNumbers function// Property to get an array of the values that are stored in a column.	this.getColumn = function getColumnContents(thisRow) {		try {			var parmCheck = true;			parmCheck = (thisRow.constructor==Number) ? parmCheck : false;			if ( parmCheck ) {				var retArray = new Array;				for (i=0; i<kRowNumbers.length; i++) {					var fieldName = kFieldNameArray[thisRow]+kRowNumbers[i]					switch (kFieldTypeArray[thisRow]) {						case 'select':							retArray[i] = getSelectedText(fieldName)							break;						case 'input':							retArray[i] = getText(fieldName)							break;						case 'textarea':							retArray[i] = getText(fieldName)							break;					}				} // end for loop								return retArray			} else {				logError(severityMajor, 'javascript class library: jsDynTable. function: getColumnContents error: Parameter check failed (NaN)');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: getColumnContents error: '+e.message);          }		} // end of getColumnContents function// Property to set column spanning.   This is unique and only setup to be used by the Background information section	this.colSpan = function columnSpanning(thisState, thisAmount) {		try {			var parmCheck = true;			parmCheck = (thisState.constructor==String) ? parmCheck : false;			if ( parmCheck ) {				if (thisState = 'on') {					parmCheck = (thisAmount.constructor==Number) ? parmCheck : false;					if ( paramCheck ) {						kColumnSpan = true;						kColumnSpanAmount = thisAmount;					} else {						logError(severityMajor, 'javascript class library: jsDynTable. function: columnSpanning error: Parameter check failed (NaN)');										}				} else {					kColumnSpan = false					kColumnSpanAmount = 1;				}			} else {				logError(severityMajor, 'javascript class library: jsDynTable. function: columnSpanning error: Parameter check failed');			}		}   		catch(e) { 			logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: getColumnContents error: '+e.message);          }		} // end of getColumnContents function// housekeeping functions	this.clearColors = function clearBGColors() {  	try{		for (var i = 0; i < kTableBody.rows.length; i++) {       		for (var j = 0; j < kTableBody.rows[i].cells.length; j++) {            		kTableBody.rows[i].cells[j].style.backgroundColor = ""                		}    		}  	}    	catch(e)    	{     	logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: clearBGColors error: '+e.message);  	}  }//**************// Property to get an array of the values that are stored in a column.   //**************	this.checkDelButtons = function checkDeleteButtons(curSize, minRows) {	try {		var id;		var button;		if (minRows == 0) {			return false;		}		if (curSize> minRows) {			for (i=0; i<kRowNumbers.length; i++){				id = 'btn'+kTableName+kRowNumbers[i]// alert('on - '+id)				button = document.getElementById(id)				button.style.display='block';			}		} else {			for (i=0; i<kRowNumbers.length; i++){				id = 'btn'+kTableName+kRowNumbers[i]// alert('off - '+id)				button = document.getElementById(id)				button.style.display='none';			}		}  	}    	catch(e)    	{     	logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: checkDeleteButtons error: '+e.message);  	}  }	  } // End of the try for dynamicTables function (MAIN)	  catch(e) { 	logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: formValidation error: '+e.message);  }  function setNumberOfColumns(thisNumber) {	try {			if ( thisNumber.constructor == Number ) {			if ( kSpecial == true ) {				kNumOfCols2 = 2;				for (var i=1; i>=kNumOfCols2; i++) {					kFieldNameArray2[i] = '';					kFieldTypeArray2[i] = '';					kFieldValueArray2[i] = '';					kFieldStyleArray2[i] = '';					kFieldJsArray2[i] = '';					kExtrasArray2[i] = '';					kCheckedArray2[i] = '';				}			} 						kNumOfCols = parseInt(thisNumber)							for (var i=1; i>=kNumOfCols; i++) {				kFieldNameArray[i] = '';				kFieldTypeArray[i] = '';				kFieldValueArray[i] = '';				kFieldStyleArray[i] = '';				kFieldJsArray[i] = '';				kExtrasArray[i] = '';				kCheckedArray[i] = '';			}					 } else {		 	logError(severityMajor, 'javascript class library: jsDynTable. function: setNumberOfColumns error: Parameter passed was not a number');		 }   	}    	catch(e) { 		logError(severityMajor, 'catch exception in javascript class library: jsDynTable. function: setNumberOfColumns error: '+e.message);      }	  } // end of setNumberOfColumns function			}