/**
* Renders each declared sum as HTML
*
*/
function dashboard_render_numsums(&$theBlock, &$aggr)
{
    global $OUTPUT;
    $str = '';
    $str .= $OUTPUT->box_start('dashboard-sumative-box', '', true);
    foreach (array_keys($theBlock->numsumsf) as $numsum) {
        if (!empty($theBlock->numsumsf[$numsum])) {
            $formattedsum = dashboard_format_data($theBlock->numsumsf[$numsum], @$aggr->{$numsum});
        } else {
            $formattedsum = 0 + @$aggr->{$numsum};
        }
        $str .= $theBlock->outputnumsums[$numsum] . ' : <b>' . $formattedsum . '</b>&nbsp;&nbsp;&nbsp;&nbsp;';
    }
    $str .= $OUTPUT->box_end(true);
    return $str;
}
 /**
  * provides ability to defer cache update to croned delayed period     
  */
 function cron()
 {
     global $CFG, $DB;
     mtrace('Dashboard cron...');
     if (!empty($CFG->block_dashboard_cron_enabled)) {
         $block = $DB->get_record('block', array('name' => 'dashboard'));
         if ($alldashboards = $DB->get_records('block_instances', array('blockid' => $block->id))) {
             foreach ($alldashboards as $dsh) {
                 $config = unserialize(base64_decode($dsh->configdata));
                 if (empty($config->cronmode) or @$config->cronmode == 'norefresh') {
                     continue;
                 }
                 if (!@$config->uselocalcaching) {
                     continue;
                 }
                 $needscron = false;
                 if ($config->cronmode == 'global') {
                     $chour = 0 + @$CFG->block_dashboard_cron_hour;
                     $cmin = 0 + @$CFG->block_dashboard_cron_min;
                     $cfreq = @$CFG->block_dashboard_cron_freq;
                 } else {
                     $chour = 0 + @$config->cronhour;
                     $cmin = 0 + @$config->cronmin;
                     $cfreq = @$config->cronfrequency;
                 }
                 $now = time();
                 $nowdt = getdate($now);
                 $lastdate = getdate(0 + @$config->lastcron);
                 $crondebug = optional_param('crondebug', false, PARAM_BOOL);
                 // first check we did nt already refreshed it today (or a new year is starting)
                 if ($nowdt['yday'] > $lastdate['yday'] || $nowdt['yday'] == 0 || $crondebug) {
                     // we wait the programmed time is passed, and check we are an allowed day to run and no query is already running
                     if ($cfreq == 'daily' || $nowdt['wday'] == $cfreq) {
                         if ($nowdt['hours'] >= $chour && $nowdt['minutes'] > $cmin && !@$config->isrunning || $crondebug) {
                             $config->isrunning = true;
                             $config->lastcron = $now;
                             $DB->set_field('block_instances', 'configdata', base64_encode(serialize($config)), array('id' => $dsh->id));
                             // Save config
                             // process data caching
                             $dshobj = new block_dashboard();
                             $dshobj->config = $config;
                             $limit = '';
                             $offset = '';
                             // TODO : compute correct values for $limit and $offset
                             $sql = str_replace('<%%FILTERS%%>', '', $config->query);
                             mtrace('   ... refreshing for instance ' . $dsh->id);
                             $results = $dshobj->fetch_dashboard_data($sql, $limit, $offset, true, true);
                             if (empty($results)) {
                                 mtrace('Empty result on query : ' . $sql);
                             }
                             // generate output file if required
                             if (!empty($config->makefile) && !empty($results)) {
                                 if (!empty($config->filepathadminoverride)) {
                                     // an admin has configured, can be anywhere in moodledata
                                     $outputfile = $CFG->dataroot . '/' . $config->filepathadminoverride . '/' . $config->filelocation;
                                 } else {
                                     // needs being in course files
                                     $outputfile = $CFG->dataroot . '/' . $dsh->pageid . '/' . $config->filelocation;
                                 }
                                 if (!isset($CFG->block_dashboard_output_field_separator)) {
                                     $CFG->block_dashboard_output_field_separator = ';';
                                 }
                                 if (!isset($CFG->block_dashboard_output_line_separator)) {
                                     $CFG->block_dashboard_output_line_separator = 'LF';
                                 }
                                 $FIELDSEPARATORS = array(':' => ':', ";" => ";", "TAB" => "\t");
                                 $LINESEPARATORS = array('LF' => "\n", 'CR' => "\r", "CRLF" => "\n\r");
                                 // output from query
                                 if (!empty($config->fileoutput)) {
                                     $outputfields = explode(';', $config->fileoutput);
                                     $outputformats = explode(';', $config->fileoutputformats);
                                 } else {
                                     $outputfields = explode(';', $config->outputfields);
                                     $outputformats = explode(';', $config->outputformats);
                                 }
                                 dashboard_normalize($outputfields, $outputformats);
                                 // normalizes labels to keys
                                 $this->outputf = array_combine($outputfields, $outputformats);
                                 mtrace('   ... generating file for instance ' . $dsh->id . ' in format ' . $config->fileformat);
                                 if (!empty($this->outputf)) {
                                     $FILE = fopen($outputfile, 'wb');
                                     if ($config->fileformat == 'CSV') {
                                         // print col names
                                         $rarr = array();
                                         foreach ($this->outputf as $key => $format) {
                                             $rarr[] = $key;
                                         }
                                         fputs($FILE, implode($FIELDSEPARATORS[$CFG->block_dashboard_output_field_separator], $rarr));
                                         fputs($FILE, $LINESEPARATORS[$CFG->block_dashboard_output_line_separator]);
                                     }
                                     if ($config->fileformat == 'CSV' || $config->fileformat == 'CSVWH') {
                                         // print effective records
                                         $reccount = 0;
                                         foreach ($results as $result) {
                                             $rarr = array();
                                             foreach ($this->outputf as $key => $format) {
                                                 if (empty($format)) {
                                                     $rarr[] = @$result->{$key};
                                                 } else {
                                                     $rarr[] = dashboard_format_data($format, @$result->{$key});
                                                 }
                                             }
                                             fputs($FILE, implode($FIELDSEPARATORS[$CFG->block_dashboard_output_field_separator], $rarr));
                                             fputs($FILE, $LINESEPARATORS[$CFG->block_dashboard_output_line_separator]);
                                             $reccount++;
                                         }
                                         mtrace($reccount . ' processed');
                                     }
                                     if ($config->fileformat == 'SQL') {
                                         if (empty($config->filesqlouttable)) {
                                             mtrace('SQL required for output but no SQL table name given');
                                             continue;
                                         }
                                         $colnames = array();
                                         foreach ($this->outputf as $key => $format) {
                                             $colnames[] = $key;
                                         }
                                         foreach ($results as $result) {
                                             $values = array();
                                             foreach ($this->outputf as $key => $format) {
                                                 if (empty($format)) {
                                                     $format = 'TEXT';
                                                 }
                                                 $values[] = dashboard_format_data($format, str_replace("'", "''", $result->{$key}));
                                             }
                                             $valuegroup = implode(",", $values);
                                             $colgroup = implode(",", $colnames);
                                             $statement = "INSERT INTO {$config->filesqlouttable}({$colgroup}) VALUES ({$valuegroup});\n";
                                             fputs($FILE, $statement);
                                         }
                                     }
                                     fclose($FILE);
                                 }
                             }
                             $config->isrunning = false;
                             $DB->set_field('block_instances', 'configdata', base64_encode(serialize($config)), array('id' => $dsh->id));
                             // Save config
                         } else {
                             mtrace('   waiting for valid time for instance ' . $dsh->id);
                         }
                     } else {
                         mtrace('   waiting for valid day for instance ' . $dsh->id);
                     }
                 } else {
                     mtrace('   waiting for next unprocessed day for instance ' . $dsh->id);
                 }
             }
         } else {
             mtrace('no instances to process...');
         }
     } else {
         mtrace('dashboard cron disabled.');
     }
     return true;
 }
     if (!in_array($hkeyvalue, $hcols)) {
         $hcols[] = $hkeyvalue;
     }
     // now put the cell value in it
     $outvalues = array();
     foreach ($outputfields as $field) {
         // did we ask for cumulative results ?
         $cumulativeix = null;
         if (preg_match('/S\\((.+?)\\)/', $field, $matches)) {
             $field = $matches[1];
             $cumulativeix = $theBlock->instance->id . '_' . $field;
         }
         if (!empty($outputf[$field])) {
             $datum = dashboard_format_data($outputf[$field], $r->{$field}, $cumulativeix);
         } else {
             $datum = dashboard_format_data(null, @$r->{$field}, $cumulativeix);
         }
         /*
         // no colour possible that way in excel
         if (!empty($theBlock->config->colorfield) && $theBlock->config->colorfield == $field){
         	$datum = dashboard_colour_code($theBlock, $datum, $colorcoding);
         }
         */
         $outvalues[] = str_replace('"', '\\"', $datum);
     }
     $matrixst .= ' = "' . implode(' ', $outvalues) . '"';
     // make the matrix in memory
     eval($matrixst . ";");
 }
 print_cross_table_csv($theBlock, $m, $hcols, $horizkey, $vertkeys, $hlabel, true);
 echo $CFG->dashboard_csv_line_separator;