/* JavaScript: Class PAAS 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 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 kRowNumbers = new Array();	var kRowNum = 0;	var kMinimumRows = 0;	var kColumnSpan = false;	var kColumnSpanAmount = 1;	var kSearch = false;	// Method to initialize the table	this.initTable = function initializeTable(thisTableId, thisNumber) {		try {			var parmCheck=true;			parmCheck = (thisTableId.constructor==String) ? parmCheck : false;			parmCheck = (thisNumber.constructor==Number) ? parmCheck : false;						if ( parmCheck ) {				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 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 {			 	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 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.slice(3)						if (kSearch) {							html="<select "+kFieldJsArray[i]+" onChange='selectionHide("+kRowNum+");' class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select>"+kExtrasArray[i]+"<span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'></span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						} else {							html = "<select "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'>"+kFieldValueArray[i]+"</select>"+kExtrasArray[i]+"<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.slice(3)												if (kSearch) {/*							html = "<div id='regText"+kRowNum+"'><input "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'>"+kExtrasArray[i]+"</span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span></div>"							html = html + "<br><div id='newDate"+kRowNum+"' class='fieldtext'>Start Date:<IMG SRC='cal_icon.gif' id='btns'"+kRowNum+"' width='20' height='20' border='0'>"							html = html + "<input name='PeriodStart"+kRowNum+"' value='' onfocus='blur();' id='PeriodStart"+kRowNum+"' class='fieldShieldedCss'>"							html = html + "<br>End Date:<IMG SRC='cal_icon.gif' id='btne'"+kRowNum+" width='20' height='20' border='0'>"							html = html + "<input name='PeriodEnd"+kRowNum+"' value='' onfocus='blur();' id='PeriodEnd"+kRowNum+"' class='fieldShieldedCss'></div>"*/													html = "<div id='regText"+kRowNum+"'><input "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'>"+kExtrasArray[i]+"</span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span></div>"							html = html + "<div id='newDate"+kRowNum+"' class='fieldtext'>Registration Date is: "							html = html + "<select  name='RegDateType"+kRowNum+"'  id='RegDateType"+kRowNum+"' class='fieldCss'><option value='on' selected>On</option><option value='before'>Before</option><option value='after'>After</option></select>"							html = html + "<input name='RegDate"+kRowNum+"' value='' onfocus='blur();' id='RegDate"+kRowNum+"' class='fieldShieldedCss'><img src='cal_icon.gif' id='date_btn"+kRowNum+"' width='20' height='20' border='0'></div>"//							cal.manageFields("date_btn"+kRowNum, "RegDate"+kRowNum, "%b %e, %Y");  // This is for the calendar buttons...    Need to initialize so they work.						} else {													html = "<input "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' type='text' name='"+kFieldNameArray[i]+kRowNum+"' /><span class='labelCss' id='lbl"+fieldNameSuffix+kRowNum+"'>"+kExtrasArray[i]+"</span><span class='errorCss' id='err"+fieldNameSuffix+kRowNum+"'></span>"						}						break;					case 'textarea':						fieldName = kFieldNameArray[i];						fieldNameSuffix = fieldName.slice(3)						html = "<textarea "+kFieldJsArray[i]+" class='"+kFieldStyleArray[i]+"' name='"+kFieldNameArray[i]+kRowNum+"' id='"+kFieldNameArray[i]+kRowNum+"'></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 ( kColumnSpan) {					newCell.colspan = kColumnSpanAmount;				}				newCell.style.backgroundColor = "#E4E6DC" // "#CBE4CB"			} // End Loop			kRowNumbers = kRowNumbers.concat(kRowNum)			kRowNum = kRowNum+1		// Check to make sure that the delete buttons on are visible if we have more than the minimum required fields			this.checkDelButtons(this.getSize()-1, kMinimumRows) // need to subtract 1 for the header row					}	    	catch(e) { 			alert('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						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				this.checkDelButtons(this.getSize()-1, kMinimumRows) // need to subtract 1 for the header row			} else {			 	alert('javascript class library: jsDynTable. function: removeTableRow error: Parameter check failed');			}			}	    	catch(e) { 			alert('catch exception in javascript class library: jsDynTable. function: removeTableRow error: '+e.message);          }		} // end of removeTableRow function				// Method to remove multiple rows from a table - only 2 at this time as this is a special requirement of Background information		this.delMultiRows = function removeMultipleTableRows(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						kTableBody.deleteRow(i+1) 	// Due to the header row, we need to skip add 1 as our table is skewed						kTableBody.deleteRow(i+2) 	// Remove the table of subsections.						kRowNumbers.splice(i, 2); 			// Remove these sequence numbers from the array (2 of them)					}				}			} else {			 	alert('javascript class library: jsDynTable. function: removeMultipleTableRows error: Parameter check failed');			}			}	    	catch(e) { 			alert('catch exception in javascript class library: jsDynTable. function: removeMultipleTableRows error: '+e.message);          }		} // end of removeMultipleTableRows 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 {			 	alert('javascript class library: jsDynTable. function: setRowNumbers error: Parameter check failed');			}		}   		catch(e) { 			alert('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 {			 	alert('javascript class library: jsDynTable. function: setCheckBoxDefaults error: Parameter check failed');			}		}   		catch(e) { 			alert('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) { 			alert('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) { 			alert('catch exception in javascript class library: jsDynTable. function: setRowNumbers error: '+e.message);          }		} // end of setRowNumbers function// Property to get the id number of the last field entered.	this.getCurrRowNum = function getCurrentRowNumber() {		try {			return kRowNumbers[kRowNumbers.length-1]		}   		catch(e) { 			alert('catch exception in javascript class library: jsDynTable. function: getCurrentRowNumber error: '+e.message);          }		} // end of getCurrentRowNumber function// Property to set the search flag so we can add extra data to a cell.....	this.setSearch = function setSearchFlag(setting) {		try {			var parmCheck = true;						parmCheck = (setting.constructor==Boolean) ? parmCheck : false;						if (parmCheck) {				kSearch = setting;			}		}   		catch(e) { 			alert('catch exception in javascript class library: jsDynTable. function: setSearchFlag 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) { 			alert('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 {				alert('javascript class library: jsDynTable. function: getColumnContents error: Parameter check failed (NaN)');			}		}   		catch(e) { 			alert('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 {						alert('javascript class library: jsDynTable. function: columnSpanning error: Parameter check failed (NaN)');										}				} else {					kColumnSpan = false					kColumnSpanAmount = 1;				}			} else {				alert('javascript class library: jsDynTable. function: columnSpanning error: Parameter check failed');			}		}   		catch(e) { 			alert('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)    	{     	alert('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 is not working//**************	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]				button = document.getElementById(id)				button.style.display='block';			}		} else {			for (i=0; i<kRowNumbers.length; i++){				id = 'btn'+kTableName+kRowNumbers[i]				button = document.getElementById(id)				button.style.display='none';			}		}  	}    	catch(e)    	{     	alert('catch exception in javascript class library: jsDynTable. function: checkDeleteButtons error: '+e.message);  	}  }	  } // End of the try for dynamicTables function (MAIN)	  catch(e) { 	alert('catch exception in javascript class library: jsDynTable. function: formValidation error: '+e.message);  }  function setNumberOfColumns(thisNumber) {	try {			if ( thisNumber.constructor == Number ) {			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 {		 	alert('javascript class library: jsDynTable. function: setNumberOfColumns error: Parameter passed was not a number');		 }   	}    	catch(e) { 		alert('catch exception in javascript class library: jsDynTable. function: setNumberOfColumns error: '+e.message);      }	  } // end of setNumberOfColumns function			}