function strDisplayUserTableSingle(&$clsUserTable)
    {
        //---------------------------------------------------------------------
        //
        //---------------------------------------------------------------------
        global $genumDateFormat, $gbDateFormatUS;
        $clsACO = new madmin_aco();
        $strOut = '';
        $lTableID = $clsUserTable->lKeyID;
        $bCollapsibleHeadings = $clsUserTable->bCollapsibleHeadings;
        $bCollapseDefaultHide = $clsUserTable->bCollapseDefaultHide;
        $strSafeTableName = htmlspecialchars($clsUserTable->strUserTableName);
        $strOut .= $this->strBeginCollapsibleHeading($lTableID, $strSafeTableName, true);
        $this->loadSingleDataRecord($lTableID, $this->lForeignID, $recInfo);
        $lRecID = $recInfo->lRecID;
        $enumTType = $clsUserTable->enumTType;
        $strOut .= '<fieldset class="enpFS" style="width: ' . $this->lFieldSetWidth . 'pt; align: left;">
              <legend class="enpLegend">
                 <b><i>' . $strSafeTableName . '</b></i> ' . strLinkView_UFMFRecordViaRecID($lTableID, $this->lForeignID, $lRecID, 'View record', true, ' id="viewSingle_' . $lTableID . '" ') . '&nbsp;&nbsp;' . "\n" . strLinkEdit_UFMultiRecEntry($enumTType, $lTableID, $this->lForeignID, $lRecID, true, 'Edit table entries', ' id="editSingle_' . $lTableID . '" ') . '&nbsp;&nbsp;' . ($recInfo->bRecordEntered ? '' : '(not written) ') . '

              </legend>';
        $strOut .= '<table class="enpRpt">';
        for ($idx = 0; $idx < $this->lNumFields; ++$idx) {
            $uf =& $this->fields[$idx];
            $enumType = $uf->enumFieldType;
            $userValue = $uf->userValue;
            $lFieldID = $uf->pff_lKeyID;
            if ($enumType == CS_FT_HEADING) {
                $strOut .= '
                  <tr>
                     <td colspan="2" class="enpRptLabel">' . htmlspecialchars($this->fields[$idx]->pff_strFieldNameUser) . '
                     </td>
                  </tr>';
            } else {
                $strOut .= '
                  <tr>
                     <td width="' . $this->lLabelWidth . '" class="enpRptLabel">' . htmlspecialchars($this->fields[$idx]->pff_strFieldNameUser) . '
                     </td>
                     <td class="enpRpt" width="' . $this->lFieldValWidth . '" valign="center">' . "\n";
                if (is_null($userValue) && !($enumType == CS_FT_LOG || $enumType == CS_FT_DDLMULTI)) {
                    $strOut .= '&nbsp';
                } else {
                    switch ($enumType) {
                        case CS_FT_CHECKBOX:
                            $strOut .= (bool) $userValue ? 'Yes' : 'No';
                            break;
                        case CS_FT_DATE:
                            $strOut .= strNumericDateViaMysqlDate($userValue, $gbDateFormatUS);
                            break;
                            //                  case CS_FT_DATETIME:
                            //                     echoT(strNumericDateViaMysqlDate($userValue, $gbDateFormatUS)   date($genumDateFormat.' H:i:s', $userValue));
                            //                     break;
                        //                  case CS_FT_DATETIME:
                        //                     echoT(strNumericDateViaMysqlDate($userValue, $gbDateFormatUS)   date($genumDateFormat.' H:i:s', $userValue));
                        //                     break;
                        case CS_FT_TEXTLONG:
                            $strOut .= nl2br(htmlspecialchars($userValue)) . '&nbsp;';
                            break;
                        case CS_FT_TEXT255:
                        case CS_FT_TEXT80:
                        case CS_FT_TEXT20:
                            $strOut .= htmlspecialchars($userValue) . '&nbsp;';
                            break;
                        case CS_FT_CLIENTID:
                        case CS_FT_INTEGER:
                            $strOut .= number_format($userValue);
                            break;
                        case CS_FT_CURRENCY:
                            $clsACO->loadCountries(false, false, true, $this->fields[$idx]->pff_lCurrencyACO);
                            $strOut .= $clsACO->countries[0]->strCurrencySymbol . ' ' . number_format($userValue, 2) . '&nbsp;' . $clsACO->countries[0]->strFlagImg;
                            break;
                        case CS_FT_DDL:
                            $strOut .= htmlspecialchars($this->strDDLValue($userValue));
                            break;
                        case CS_FT_DDL:
                            $strOut .= htmlspecialchars($this->strDDLValue($userValue));
                            break;
                        case CS_FT_LOG:
                            $strOut .= $this->logDisplay($enumTType, $lFieldID, $lTableID, $this->lForeignID, 5);
                            break;
                        case CS_FT_DDLMULTI:
                            $strDDLMultiFN = $uf->strFieldNameInternal . '_ddlMulti';
                            $this->loadMultiDDLSelects($lTableID, $lFieldID, $lRecID, $uf->{$strDDLMultiFN});
                            $strOut .= $this->strMultiDDLUL($uf->{$strDDLMultiFN});
                            break;
                        default:
                            screamForHelp($enumType . ': invalid field type<br>error on line ' . __LINE__ . ',<br>file ' . __FILE__ . ',<br>function ' . __FUNCTION__);
                            break;
                    }
                }
            }
        }
        $strOut .= '
            </table>' . "\n";
        $strOut .= '
         </fieldset><br>' . "\n";
        //      if ($bCollapsibleHeadings)
        $strOut .= $this->strEndCollapsibleHeading();
        return $strOut;
    }
echoT($strHTMLSummary);
$params = array('enumStyle' => 'terse');
$clsRpt = new generic_rpt($params);
$clsRpt->strWidthLabel = '180pt';
$attributes = new stdClass();
$attributes->width = null;
$bReadOnly = $utable->bReadOnly;
if ($bMultiEntry && !$bReadOnly) {
    $strLinkRem = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' . strLinkRem_UFMultiRecEntry($utable->enumTType, $lTableID, $lFID, $lRID, 'Remove', true, true) . '&nbsp;' . strLinkRem_UFMultiRecEntry($utable->enumTType, $lTableID, $lFID, $lRID, 'Remove', false, true);
} else {
    $strLinkRem = '';
}
if ($bReadOnly) {
    $strLinkEdit = '';
} else {
    $strLinkEdit = strLinkEdit_UFMultiRecEntry($utable->enumTType, $lTableID, $lFID, $lRID, true, 'Edit record', ' id="editURec_' . $lTableID . '_' . $lRID . '" ', $lEnrollRecID) . '&nbsp;' . strLinkEdit_UFMultiRecEntry($utable->enumTType, $lTableID, $lFID, $lRID, false, 'Edit record', ' id="editURec1_' . $lTableID . '_' . $lRID . '" ', $lEnrollRecID);
}
if ($bCProg && !$bEnrollment) {
    $strCloneAttendance = '&nbsp;&nbsp;&nbsp;' . strLinkClone_CPAttendance($cprog->lKeyID, $lRID, 'Clone ' . $cprog->strSafeAttendLabel, true) . '&nbsp;' . strLinkClone_CPAttendance($cprog->lKeyID, $lRID, 'Clone ' . $cprog->strSafeAttendLabel, false) . '&nbsp';
} else {
    $strCloneAttendance = '';
}
openBlock($strTableLabel, $strLinkEdit . $strCloneAttendance . $strLinkRem);
echoT($clsRpt->openReport(800));
if ($utable->lNumFields == 0 && !$bCProg) {
    echoT('<i>There is no data associated with this record!</i><br>');
} else {
    echoT($clsRpt->openRow() . $clsRpt->writeLabel('tableID:') . $clsRpt->writeCell(str_pad($lTableID, 5, '0', STR_PAD_LEFT)) . $clsRpt->closeRow());
    echoT($clsRpt->openRow() . $clsRpt->writeLabel('recordID:') . $clsRpt->writeCell(str_pad($lRID, 5, '0', STR_PAD_LEFT)) . $clsRpt->closeRow());
    // add default fields if client program
    if ($bCProg) {
function writeMRecRows($lTableID, $lFID, &$utable, &$mRecs, $lEnrollRecID)
{
    //---------------------------------------------------------------------
    //
    //---------------------------------------------------------------------
    global $genumDateFormat;
    $strFNPrefix = $utable->strFieldPrefix;
    $strFNKeyID = $strFNPrefix . '_lKeyID';
    if ($utable->bCProg) {
        $lCProgID = $utable->cprog->lKeyID;
    }
    $bReadOnly = $utable->bReadOnly;
    foreach ($mRecs as $mrec) {
        echoT('<tr class="makeStripe">');
        $lRecID = $mrec->{$strFNKeyID};
        if ($utable->bCProg && !$utable->bEnrollment) {
            $strClone = '<br>' . strLinkClone_CPAttendance($lCProgID, $lRecID, 'Clone attendance record', true);
        } else {
            $strClone = '';
        }
        if ($bReadOnly) {
            $strEditLink = '';
        } else {
            $strEditLink = strLinkEdit_UFMultiRecEntry($utable->enumTType, $lTableID, $lFID, $lRecID, true, 'Edit record', '', $lEnrollRecID);
        }
        echoT('
            <td class="enpRpt" style="text-align: center;">' . str_pad($lRecID, 5, '0', STR_PAD_LEFT) . '&nbsp;' . strLinkView_UFMFRecordViaRecID($lTableID, $lFID, $lRecID, 'View', true) . '
            </td>');
        echoT('
            <td class="enpRpt" style="text-align: center;">' . $strEditLink . $strClone . '
            </td>');
        if (!$bReadOnly) {
            echoT('
               <td class="enpRpt" style="text-align: center;">' . strLinkRem_UFMultiRecEntry($utable->enumTType, $lTableID, $lFID, $lRecID, 'Remove', true, true) . '
               </td>');
        }
        if ($utable->bCProg) {
            //-----------------------------
            // enrollment records
            //-----------------------------
            if ($utable->bEnrollment) {
                echoT('
                  <td class="enpRpt">' . date($genumDateFormat, $mrec->dteStart) . '&nbsp;
                  </td>');
                if (is_null($mrec->dteMysqlEnd)) {
                    $strEnd = '<i>Ongoing</i>';
                } else {
                    $strEnd = date($genumDateFormat, $mrec->dteEnd);
                }
                echoT('
                     <td class="enpRpt" style="text-align: center;">' . $strEnd . '
                     </td>
                     <td class="enpRpt" style="text-align: center;">' . ($mrec->bCurrentlyEnrolled ? 'Yes' : 'No') . '
                     </td>
                     <td class="enpRpt" style="text-align: center;">' . strLinkAdd_CProgAttendance(false, $lFID, $utable->cprog->lKeyID, $lRecID, 'Add attendance record', true) . '
                     </td>
                     ');
            } else {
                //-----------------------------
                // attendance records
                //-----------------------------
                echoT('
                  <td class="enpRpt" style="text-align: center;">' . str_pad($mrec->lEnrollRecordID, 5, '0', STR_PAD_LEFT) . '&nbsp;' . strLinkView_UFMFRecordViaRecID($utable->cprog->lEnrollmentTableID, $lFID, $mrec->lEnrollRecordID, 'View enrollment record', true) . '
                  </td>
                  <td class="enpRpt">' . date($genumDateFormat, $mrec->dteAttendance) . '&nbsp;
                  </td>
                  <td class="enpRpt" style="text-align: right;">' . number_format($mrec->dDuration, 2) . '&nbsp;
                  </td>
                  <td class="enpRpt" style="width: 220pt;">' . nl2br(htmlspecialchars($mrec->strCaseNotes)) . '&nbsp;
                  </td>
                  ');
                $utable->dTotDuration += $mrec->dDuration;
            }
        }
        if ($utable->lNumFields > 0) {
            foreach ($utable->ufields as $ufield) {
                displayField($mrec, $ufield);
            }
        }
        echoT('</tr>');
    }
}