public function getFooter () {
        $data = new stdClass();
        $data->config = $this->ReportConfig;
        $data->footer_contents = '';
        $reportId = intval($this->ReportConfig->getId());

        if(!empty($this->ReportConfig->options['visual']['footer'])) {
            foreach($this->ReportConfig->options['visual']['footer'] as $footer) {
                $cols = $this->ReportConfig->columns;
                $offset = $this->ReportConfig->getOffset();
                $sort = $this->ReportConfig->sort;
                $colorColumn = !empty($this->ReportConfig->options['visual']['useColumnDataForColor']) ? $this->ReportConfig->options['visual']['useColumnDataForColor'] : NULL;
                $this->ReportConfig->options['visual']['useColumnDataForColor'] = NULL;
                $this->ReportConfig->setColumns(array($footer['measure']));
                $this->ReportConfig->sort = NULL;
                $this->ReportConfig->setOffset(0);
                $format = array(
                    array(
                        'formatter' => array(
                            'format' => isset($footer['format']) ? $footer['format'] : 'number',
                            'scale' => isset($footer['scale']) ? $footer['scale'] : 0
                        ),
                        'displayName' => $footer['text'],
                        'columnId' => $footer['measure'],
                    )
                );
                $this->ReportConfig->setColumnConfigs($format);
                $value = $this->ReportConfig->getData();
                list($fields, $formatted, $errors) = array_values(gd_report_format_data($this->ReportConfig, $value));
                $fontSize = intval(!empty($footer['size']) ? $footer['size'] : '14');
                $styles = 'text-align:' . (!empty($footer['alignment']) ? $footer['alignment'] : 'right') . ';color: ' . (!empty($footer['color']) ? $footer['color'] . ' !important' : '#000080 !important') . ';font-size: ' . $fontSize . 'px;font-weight: bold;';
                $data->footer_contents .= '<span class="gd-footer-measure" style="' . $styles . '">' . $footer['text'] . ': ' . $formatted[0]->record[$footer['measure']] . '</span>';
                $this->ReportConfig->options['visual']['useColumnDataForColor'] = $colorColumn;
                $this->ReportConfig->setColumns($cols);
                $this->ReportConfig->sort = $sort;
                $this->ReportConfig->setOffset($offset);
            }
        }

        drupal_alter('gd_report_view_footer', $data);

        //  TODO Move to new report rendering JavaScript
        //  Set timeout is necessary for Dashboard Builder.
        //  Not entirely certain but pretty sure .html() of the DashboardCanvas caused main UI thread of browser to stall and not calculated heights until after .html() call is over
        //  Which means when the script below is ran by jQuery inside .html() call, elements without specified heights like footer are 0
        $footerScript = '<script type="text/javascript">!function(global) { !function($,undefined) {
            setTimeout(function() {
                var height = $("#report-' . $reportId . '").height();
                var footerHeight = $("#gd-report-footer-' . $reportId . '").height();
                $("#report-' . $reportId . '").height((height - footerHeight));
                $("#report-' . $reportId . '").trigger("ready.report.render");
            }, 1);
            }(global.GD_jQuery ? global.GD_jQuery : jQuery);
        }(!window ? this : window);</script>';

        return '<div id="gd-report-footer-'.$reportId.'" report_id="'.$reportId.'" class="gd-report-footer">' . $data->footer_contents . '</div>'.$footerScript;
    }
    protected function getBody(array $options) {
        if (!empty($this->ReportConfig->title)) {
            $constants = $this->getConstants($options);
            list($fields,$tableData,$errors) = array_values(gd_report_format_data($this->ReportConfig,$this->ReportConfig->getData()));
            $data =
                'var ReportData = {};
                    ReportData.data='.json_encode($tableData).';
                    ReportData.drilldowns = '. json_encode($this->ReportConfig->drilldowns) .';';

            $viewCode = $this->ReportConfig->getCustomView();

            if ( !isset($viewCode) ) {
                $node = $this->ReportConfig->getNode();
                if ( !isset($node) && $this->ReportConfig->getId() ) {
                    $node = node_load($this->ReportConfig->getId());
                }

                if ( isset($node) ) {
                    $viewCode = $node->field_report_custom_view[$node->language][0]['value'];
                }
            }

            if ( isset($viewCode) ) {
                $viewCode = $this->scopeScripts($viewCode, $constants, $data);
            }

            return $viewCode;
        }

        return '';
    }