    """CGIWrapper dump CSV admin script."""

    import os

    from WebUtils.Funcs import htmlEncode
    from AdminPage import AdminPage

    def LoadCSV(filename):
        """Load CSV file.

        Loads a CSV (comma-separated value) file from disk and returns it as a
        list of rows where each row is a list of values (which are always strings).

        """
        try:
            f = open(filename)
            try:
                rows = []
                while 1:
                    line = f.readline()
                    if not line:
                        break
                    rows.append(line.split(','))
            finally:
                f.close()
        except IOError:
            rows = []
        return rows

    class _dumpCSV(AdminPage):
        """CGIWrapper class that dumps a CSV file."""

        def __init__(self, dict):
            AdminPage.__init__(self, dict)
            self._filename = self._fields['filename'].value

        def shortFilename(self):
            return os.path.splitext(os.path.split(self._filename)[1])[0]

        def title(self):
            return 'View ' + self.shortFilename()

        def writeBody(self):
            rows = LoadCSV(self._filename)

            self.writeln('<table align="center"'
                ' border="0" cellpadding="2" cellspacing="2">')

            # Head row gets special formatting
            self._headings = map(lambda name: name.strip(), rows[0])
            self.writeln('<tr>')
            for value in self._headings:
                self.writeln('<th style="color:white;'
                    'font-family:Arial,Helvetica,sans-serif" bgcolor="#101040">',
                value, '</th>')
            self.writeln('</tr>')

            # Data rows
            rowIndex = 1
            for row in rows[1:]:
                self.writeln('<tr>')
                colIndex = 0
                for value in row:
                    self.writeln('<td style="color:#111111" bgcolor="#EEEEEE">',
                        self.cellContents(rowIndex, colIndex, value), '</td>')
                    colIndex += 1
                self.writeln('</tr>')
                rowIndex += 1

            self.writeln('</table>')

        def cellContents(self, rowIndex, colIndex, value):
            """Return cell contents of CSV file.

            This is a hook for subclasses to customize the contents of a cell
            based on any criteria (including location).

            """
            return htmlEncode(value)