/**
     * Echo a table of submitted form data
     * @param string $formName
     * @param array $options
     * @return void|string returns String when called from a short code,
     * otherwise echo's output and returns void
     */
    public function export($formName, $options = null)
    {
        $this->setOptions($options);
        $this->setCommonOptions(true);
        $canDelete = false;
        $useDT = false;
        $editMode = false;
        $printScripts = false;
        $printStyles = false;
        if ($options && is_array($options)) {
            if (isset($options['useDT'])) {
                $useDT = $options['useDT'];
                //$this->htmlTableClass = '';
                if (isset($options['printScripts'])) {
                    $printScripts = $options['printScripts'];
                }
                if (isset($options['printStyles'])) {
                    $printStyles = $options['printStyles'];
                }
                if (isset($options['edit'])) {
                    $this->dereferenceOption('edit');
                    $editMode = 'true' == $this->options['edit'] || 'cells' == $this->options['edit'];
                }
            }
            if (isset($options['canDelete'])) {
                $canDelete = $options['canDelete'];
            }
        }
        // Security Check
        if (!$this->isAuthorized()) {
            $this->assertSecurityErrorMessage();
            return;
        }
        if ($editMode && !$this->plugin->canUserDoRoleOption('CanChangeSubmitData')) {
            $editMode = false;
        }
        // Headers
        $this->echoHeaders('Content-Type: text/html; charset=UTF-8');
        if ($this->isFromShortCode) {
            ob_start();
            if ($this->useBom) {
                // File encoding UTF-8 Byte Order Mark (BOM) http://wiki.sdn.sap.com/wiki/display/ABAP/Excel+files+-+CSV+format
                echo chr(239) . chr(187) . chr(191);
            }
        } else {
            if ($this->useBom) {
                // File encoding UTF-8 Byte Order Mark (BOM) http://wiki.sdn.sap.com/wiki/display/ABAP/Excel+files+-+CSV+format
                echo chr(239) . chr(187) . chr(191);
            }
            if ($printScripts) {
                $pluginUrl = plugins_url('/', __FILE__);
                wp_enqueue_script('datatables', $pluginUrl . 'DataTables/media/js/jquery.dataTables.min.js', array('jquery'));
                wp_print_scripts('datatables');
            }
            if ($printStyles) {
                $pluginUrl = plugins_url('/', __FILE__);
                wp_enqueue_style('datatables-demo', $pluginUrl . 'DataTables/media/css/demo_table.css');
                wp_enqueue_style('jquery-ui.css', $pluginUrl . 'jquery-ui/jquery-ui.css');
                wp_print_styles(array('jquery-ui.css', 'datatables-demo'));
            }
        }
        // Query DB for the data for that form
        $submitTimeKeyName = 'Submit_Time_Key';
        $this->setDataIterator($formName, $submitTimeKeyName);
        // Break out sections: Before, Content, After
        $before = '';
        $content = '';
        $after = '';
        if (isset($options['content'])) {
            $contentParser = new CFDBShortCodeContentParser();
            list($before, $content, $after) = $contentParser->parseBeforeContentAfter($options['content']);
        }
        if ($before) {
            // Allow for short codes in "before"
            echo do_shortcode($before);
        }
        if ($useDT) {
            $dtJsOptions = isset($options['dt_options']) ? $options['dt_options'] : '"bJQueryUI": true, "aaSorting": [], "iDisplayLength": -1, "aLengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "' . __('All', 'contact-form-7-to-database-extension') . '"]]';
            $i18nUrl = $this->plugin->getDataTableTranslationUrl();
            if ($i18nUrl) {
                if (!empty($dtJsOptions)) {
                    $dtJsOptions .= ',';
                }
                $dtJsOptions .= " \"oLanguage\": { \"sUrl\":  \"{$i18nUrl}\" }";
            }
            $dtJsOptions = stripslashes($dtJsOptions);
            // unescape single quotes when posted via URL
            ?>

            <script type="text/javascript" language="Javascript">
                jQuery(document).ready(function() {
                    jQuery('#<?php 
            echo $this->htmlTableId;
            ?>
').dataTable({
                        <?php 
            echo $dtJsOptions;
            if ($editMode) {
                do_action_ref_array('cfdb_edit_fnDrawCallbackJsonForSC', array($this->htmlTableId, $this->options['edit']));
            }
            ?>
 })
                });
            </script>
            <?php 
        }
        if ($this->htmlTableClass == $this->defaultTableClass && !ExportToHtmlTable::$wroteDefaultHtmlTableStyle) {
            ?>

            <style type="text/css">
                table.<?php 
            echo $this->defaultTableClass;
            ?>
 {
                    margin-top: 1em;
                    border-spacing: 0;
                    border: 0 solid gray;
                    font-size: x-small;
                }

                br {
                    <?php 
            /* Thanks to Alberto for this style which means that in Excel IQY all the text will
               be in the same cell, not broken into different cells */
            ?>

                    mso-data-placement: same-cell;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 th {
                    padding: 5px;
                    border: 1px solid gray;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 th > td {
                    font-size: x-small;
                    background-color: #E8E8E8;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 tbody td {
                    padding: 5px;
                    border: 1px solid gray;
                    font-size: x-small;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 tbody td > div {
                    max-height: 100px;
                    overflow: auto;
                }
            </style>
            <?php 
            ExportToHtmlTable::$wroteDefaultHtmlTableStyle = true;
        }
        if ($this->style) {
            ?>

            <style type="text/css">
                <?php 
            echo $this->style;
            ?>

            </style>
            <?php 
        }
        ?>


        <table <?php 
        if ($this->htmlTableId) {
            echo "id=\"{$this->htmlTableId}\" ";
        }
        if ($this->htmlTableClass) {
            echo "class=\"{$this->htmlTableClass}\"";
        }
        ?>
 >
            <thead>
            <?php 
        if (isset($this->options['header']) && $this->options['header'] != 'true') {
            // do not output column headers
        } else {
            ?>

            <tr>
            <?php 
            if ($canDelete) {
                ?>

            <th id="delete_th">
                <button id="delete" name="cfdbdel" onclick="this.form.submit()"><?php 
                echo htmlspecialchars(__('Delete', 'contact-form-7-to-database-extension'));
                ?>
</button>
                <input type="checkbox" id="selectall"/>
                <script type="text/javascript">
                    jQuery(document).ready(function() {
                        jQuery('#selectall').click(function() {
                            jQuery('#<?php 
                echo $this->htmlTableId;
                ?>
').find('input[id^="delete_"]').attr('checked', this.checked);
                        });
                    });
                </script>
            </th>
            <?php 
            }
            foreach ($this->dataIterator->getDisplayColumns() as $aCol) {
                $colDisplayValue = $aCol;
                if ($this->headers && isset($this->headers[$aCol])) {
                    $colDisplayValue = $this->headers[$aCol];
                }
                printf('<th title="%s"><div id="%s,%s">%s</div></th>', $colDisplayValue, $formName, $aCol, $colDisplayValue);
            }
            ?>

            </tr>
            <?php 
        }
        ?>

            </thead>
            <tbody>
            <?php 
        $showLineBreaks = $this->plugin->getOption('ShowLineBreaksInDataTable');
        $showLineBreaks = 'false' != $showLineBreaks;
        while ($this->dataIterator->nextRow()) {
            $submitKey = '';
            if (isset($this->dataIterator->row[$submitTimeKeyName])) {
                $submitKey = $this->dataIterator->row[$submitTimeKeyName];
            }
            ?>

                <tr>
                <?php 
            if ($canDelete && $submitKey) {
                // Put in the delete checkbox
                ?>

                    <td align="center">
                        <input type="checkbox" id="delete_<?php 
                echo $submitKey;
                ?>
" name="<?php 
                echo $submitKey;
                ?>
" value="row"/>
                    </td>
                <?php 
            }
            $fields_with_file = null;
            if (isset($this->dataIterator->row['fields_with_file']) && $this->dataIterator->row['fields_with_file'] != null) {
                $fields_with_file = explode(',', $this->dataIterator->row['fields_with_file']);
            }
            foreach ($this->dataIterator->getDisplayColumns() as $aCol) {
                $cell = $this->rawValueToPresentationValue($this->dataIterator->row[$aCol], $showLineBreaks, $fields_with_file && in_array($aCol, $fields_with_file), $this->dataIterator->row[$submitTimeKeyName], $formName, $aCol);
                // NOTE: the ID field is used to identify the cell when an edit happens and we save that to the server
                printf('<td title="%s"><div id="%s,%s">%s</div></td>', $aCol, $submitKey, $aCol, $cell);
            }
            ?>
</tr><?php 
        }
        ?>

            </tbody>
        </table>
        <?php 
        if ($after) {
            // Allow for short codes in "after"
            echo do_shortcode($after);
        }
        if ($this->isFromShortCode) {
            // If called from a shortcode, need to return the text,
            // otherwise it can appear out of order on the page
            $output = ob_get_contents();
            ob_end_clean();
            return $output;
        }
    }
    /**
     * Echo a table of submitted form data
     * @param string $formName
     * @param array $options
     * @return void
     */
    public function export($formName, $options = null)
    {
        $this->setOptions($options);
        $this->setCommonOptions(true);
        $canDelete = false;
        $useDT = false;
        $printScripts = false;
        $printStyles = false;
        if ($options && is_array($options)) {
            if (isset($options['useDT'])) {
                $useDT = $options['useDT'];
                //$this->htmlTableClass = '';
                if (isset($options['printScripts'])) {
                    $printScripts = $options['printScripts'];
                }
                if (isset($options['printStyles'])) {
                    $printStyles = $options['printStyles'];
                }
            }
            if (isset($options['canDelete'])) {
                $canDelete = $options['canDelete'];
            }
        }
        // Security Check
        if (!$this->isAuthorized()) {
            $this->assertSecurityErrorMessage();
            return;
        }
        // Headers
        $this->echoHeaders('Content-Type: text/html; charset=UTF-8');
        if ($this->isFromShortCode) {
            ob_start();
        } else {
            if ($printScripts) {
                $pluginUrl = plugins_url('/', __FILE__);
                wp_enqueue_script('datatables', $pluginUrl . 'DataTables/media/js/jquery.dataTables.min.js', array('jquery'));
                wp_print_scripts('datatables');
            }
            if ($printStyles) {
                $pluginUrl = plugins_url('/', __FILE__);
                wp_enqueue_style('datatables-demo', $pluginUrl . 'DataTables/media/css/demo_table.css');
                wp_enqueue_style('jquery-ui.css', $pluginUrl . 'jquery-ui/jquery-ui.css');
                wp_print_styles(array('jquery-ui.css', 'datatables-demo'));
            }
        }
        // Query DB for the data for that form
        $submitTimeKeyName = 'Submit_Time_Key';
        $this->setDataIterator($formName, $submitTimeKeyName);
        if ($useDT) {
            $dtJsOptions = isset($options['dt_options']) ? $options['dt_options'] : false;
            if (!$dtJsOptions) {
                $dtJsOptions = '"bJQueryUI": true, "aaSorting": []';
                $i18nUrl = $this->plugin->getDataTableTranslationUrl();
                if ($i18nUrl) {
                    $dtJsOptions = $dtJsOptions . ", \"oLanguage\": { \"sUrl\":  \"{$i18nUrl}\" }";
                }
            }
            ?>
            <script type="text/javascript" language="Javascript">
                jQuery(document).ready(function() {
                    jQuery('#<?php 
            echo $this->htmlTableId;
            ?>
').dataTable({
                        <?php 
            echo $dtJsOptions;
            ?>
 })
                });
            </script>
            <?php 
        }
        if ($this->htmlTableClass == $this->defaultTableClass && !ExportToHtmlTable::$wroteDefaultHtmlTableStyle) {
            ?>
            <style type="text/css">
                table.<?php 
            echo $this->defaultTableClass;
            ?>
 {
                    margin-top: 1em;
                    border-spacing: 0;
                    border: 0 solid gray;
                    font-size: x-small;
                }

                br {
                    <?php 
            /* Thanks to Alberto for this style which means that in Excel IQY all the text will
               be in the same cell, not broken into different cells */
            ?>
                    mso-data-placement: same-cell;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 th {
                    padding: 5px;
                    border: 1px solid gray;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 th > td {
                    font-size: x-small;
                    background-color: #E8E8E8;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 tbody td {
                    padding: 5px;
                    border: 1px solid gray;
                    font-size: x-small;
                }

                table.<?php 
            echo $this->defaultTableClass;
            ?>
 tbody td > div {
                    max-height: 100px;
                    overflow: auto;
                }
            </style>
            <?php 
            ExportToHtmlTable::$wroteDefaultHtmlTableStyle = true;
        }
        if ($this->style) {
            ?>
            <style type="text/css">
                <?php 
            echo $this->style;
            ?>
            </style>
            <?php 
        }
        ?>

        <table <?php 
        if ($this->htmlTableId) {
            echo "id=\"{$this->htmlTableId}\" ";
        }
        if ($this->htmlTableClass) {
            echo "class=\"{$this->htmlTableClass}\"";
        }
        ?>
 >
            <thead>
            <?php 
        if (isset($this->options['header']) && $this->options['header'] != 'true') {
            // do not output column headers
        } else {
            ?>
            <tr>
            <?php 
            if ($canDelete) {
                ?>
            <th>
                <button id="delete" name="delete" onclick="this.form.submit()"><?php 
                _e('Delete', 'contact-form-7-to-database-extension');
                ?>
</button>
            </th>
            <?php 
            }
            foreach ($this->dataIterator->displayColumns as $aCol) {
                printf('<th title="%s"><div id="%s,%s">%s</div></th>', $aCol, $formName, $aCol, $aCol);
            }
            ?>
            </tr>
            <?php 
        }
        ?>
            </thead>
            <tbody>
            <?php 
        $showLineBreaks = $this->plugin->getOption('ShowLineBreaksInDataTable');
        $showLineBreaks = 'false' != $showLineBreaks;
        while ($this->dataIterator->nextRow()) {
            $submitKey = $this->dataIterator->row[$submitTimeKeyName];
            ?>
                <tr>
                <?php 
            if ($canDelete) {
                // Put in the delete checkbox
                ?>
                    <td align="center">
                        <input type="checkbox" name="<?php 
                echo $submitKey;
                ?>
" value="row"/>
                    </td>
                <?php 
            }
            $fields_with_file = null;
            if (isset($this->dataIterator->row['fields_with_file']) && $this->dataIterator->row['fields_with_file'] != null) {
                $fields_with_file = explode(',', $this->dataIterator->row['fields_with_file']);
            }
            foreach ($this->dataIterator->displayColumns as $aCol) {
                $cell = $this->rawValueToPresentationValue($this->dataIterator->row[$aCol], $showLineBreaks, $fields_with_file && in_array($aCol, $fields_with_file), $this->dataIterator->row[$submitTimeKeyName], $formName, $aCol);
                // NOTE: the ID field is used to identify the cell when an edit happens and we save that to the server
                printf('<td title="%s"><div id="%s,%s">%s</div></td>', $aCol, $submitKey, $aCol, $cell);
            }
            ?>
</tr><?php 
        }
        ?>
            </tbody>
        </table>
        <?php 
        if ($this->isFromShortCode) {
            // If called from a shortcode, need to return the text,
            // otherwise it can appear out of order on the page
            $output = ob_get_contents();
            ob_end_clean();
            return $output;
        }
    }