private function _create_preview_table($columns)
 {
     global $PAGE, $OUTPUT, $cm;
     $jsmodule = array('name' => 'mod_organizer', 'fullpath' => '/mod/organizer/module.js', 'requires' => array('node', 'node-event-delegate'));
     $PAGE->requires->js_init_call('M.mod_organizer.init_organizer_print_slots_form', null, false, $jsmodule);
     $table = new html_table();
     $table->id = 'print_preview';
     $table->attributes['class'] = 'boxaligncenter';
     $tsort = isset($_SESSION['organizer_tsort']) ? $_SESSION['organizer_tsort'] : "";
     if ($tsort != "") {
         $order = "ASC";
         if (substr($tsort, strlen($tsort) - strlen("DESC")) == "DESC") {
             $tsort = substr($tsort, 0, strlen($tsort) - strlen("DESC"));
             $order = "DESC";
         }
     }
     $icon_up = ' <img src="' . $OUTPUT->pix_url('t/up') . '" class="iconsmall" alt="up" />';
     $icon_down = ' <img src=' . $OUTPUT->pix_url('t/down') . '" class="iconsmall" alt="down" />';
     $header = array();
     foreach ($columns as $column) {
         $content = '<a href="?id=' . $cm->id . '&sesskey=' . sesskey() . '&action=print&tsort=' . $column;
         $icon = "";
         if ($column == $tsort) {
             if ($order == "ASC") {
                 $content .= "DESC";
                 $icon = $icon_up;
             } else {
                 $icon = $icon_down;
             }
         }
         $content .= '" name="' . $column . '_cell">' . get_string("th_{$column}", 'organizer') . $icon;
         $content .= '</a>';
         $imgattr = array('src' => $OUTPUT->pix_url('t/switch_minus'), 'alt' => get_string('hide'), 'id' => "toggle_{$column}", 'style' => 'cursor: pointer', 'title' => get_string("th_{$column}", 'organizer'));
         $content .= ' ' . html_writer::empty_tag('img', $imgattr);
         $cell = new html_table_cell($content);
         $cell->header = true;
         $header[] = $cell;
     }
     $table->head = $header;
     switch ($tsort) {
         case "datetime":
             $sort = "starttime";
             break;
         case "location":
             $sort = "s.location";
             break;
         case "teacher":
             $sort = "teacherfirstname";
             break;
         case "participant":
             $sort = "u.lastname";
             break;
         case "idnumber":
             $sort = "u.idnumber";
             break;
         case "attended":
             $sort = "a.attended";
             break;
         case "grade":
             $sort = "a.grade";
             break;
         case "feedback":
             $sort = "a.feedback";
             break;
         default:
             $sort = NULL;
     }
     if (!isset($order)) {
         $order = "";
     } else {
         if ($order != "DESC" && $order != "ASC") {
             $order = "";
         }
     }
     $data =& $this->_customdata;
     $entries = organizer_fetch_table_entries($data['slots'], $sort . ' ' . $order);
     $rows = array();
     $rowspan = 0;
     $numcols = 0;
     $evenodd = 0;
     foreach ($entries as $entry) {
         if ($numcols == 10) {
             break;
         }
         $row = $rows[] = new html_table_row();
         foreach ($columns as $column) {
             if ($rowspan == 0) {
                 switch ($column) {
                     case 'datetime':
                         $datetime = userdate($entry->starttime, get_string('fulldatetimetemplate', 'organizer')) . ' - ' . userdate($entry->starttime + $entry->duration, get_string('timetemplate', 'organizer'));
                         $content = "<span name='{$column}_cell'>" . $datetime . '</span>';
                         $cell = new html_table_cell($content);
                         $cell->rowspan = $entry->rowspan;
                         $cell->style = 'vertical-align: middle;';
                         $row->cells[] = $cell;
                         break;
                     case 'location':
                         $location = $entry->location;
                         $content = "<span name='{$column}_cell'>" . $location . '</span>';
                         $cell = new html_table_cell($content);
                         $cell->rowspan = $entry->rowspan;
                         $cell->style = 'vertical-align: middle;';
                         $row->cells[] = $cell;
                         break;
                     case 'teacher':
                         $a = new stdClass();
                         $a->firstname = $entry->teacherfirstname;
                         $a->lastname = $entry->teacherlastname;
                         $name = get_string('fullname_template', 'organizer', $a);
                         $content = "<span name='{$column}_cell'>" . $name . '</span>';
                         $cell = new html_table_cell($content);
                         $cell->rowspan = $entry->rowspan;
                         $cell->style = 'vertical-align: middle;';
                         $row->cells[] = $cell;
                         break;
                     case 'groupname':
                         $groupname = $entry->groupname;
                         $content = "<span name='{$column}_cell'>" . $groupname . '</span>';
                         $cell = new html_table_cell($content);
                         $cell->rowspan = $entry->rowspan;
                         $cell->style = 'vertical-align: middle;';
                         $row->cells[] = $cell;
                         break;
                     default:
                         break;
                 }
             }
             switch ($column) {
                 case 'participant':
                     $a = new stdClass();
                     $a->firstname = $entry->firstname;
                     $a->lastname = $entry->lastname;
                     $name = get_string('fullname_template', 'organizer', $a);
                     $content = "<span name='{$column}_cell'>" . $name . '</span>';
                     $cell = new html_table_cell($content);
                     $cell->style = 'vertical-align: middle;';
                     $row->cells[] = $cell;
                     break;
                 case 'idnumber':
                     $idnumber = isset($entry->idnumber) && $entry->idnumber !== '' ? $entry->idnumber : '';
                     $content = "<span name='{$column}_cell'>" . $idnumber . '</span>';
                     $cell = new html_table_cell($content);
                     $cell->style = 'vertical-align: middle;';
                     $row->cells[] = $cell;
                     break;
                 case 'attended':
                     $attended = isset($entry->attended) ? $entry->attended == 1 ? 'Yes' : 'No' : '';
                     $content = "<span name='{$column}_cell'>" . $attended . '</span>';
                     $cell = new html_table_cell($content);
                     $cell->style = 'vertical-align: middle;';
                     $row->cells[] = $cell;
                     break;
                 case 'grade':
                     $grade = isset($entry->grade) ? sprintf("%01.2f", $entry->grade) : '';
                     $content = "<span name='{$column}_cell'>" . $grade . '</span>';
                     $cell = new html_table_cell($content);
                     $cell->style = 'vertical-align: middle;';
                     $row->cells[] = $cell;
                     break;
                 case 'feedback':
                     $feedback = isset($entry->feedback) && $entry->feedback !== '' ? $entry->feedback : '';
                     $content = "<span name='{$column}_cell'>" . $feedback . '</span>';
                     $cell = new html_table_cell($content);
                     $cell->style = 'vertical-align: middle;';
                     $row->cells[] = $cell;
                     break;
                 case 'datetime':
                 case 'location':
                 case 'teacher':
                 case 'groupname':
                     break;
                 default:
                     print_error("Unsupported column type: {$column}");
             }
         }
         $numcols++;
         $row->attributes['class'] = " r{$evenodd}";
         $rowspan = ($rowspan + 1) % $entry->rowspan;
         if ($rowspan == 0) {
             $evenodd = $evenodd ? 0 : 1;
         }
     }
     $table->data = $rows;
     return organizer_render_table_with_footer($table, false, true);
 }
function organizer_display_printable_table($allowsubmissionsfromdate, $timedue, $columns, $slots, $entriesperpage = false, $textsize = '10', $orientation = 'L', $headerfooter = true, $filename = '')
{
    global $USER;
    list($cm, $course, $organizer, $context) = organizer_get_course_module_data();
    $columnwitdh = array();
    $titles = array();
    $columnformats = array();
    $tsort = isset($_SESSION['organizer_tsort']) ? $_SESSION['organizer_tsort'] : "";
    if ($tsort != "") {
        $order = "ASC";
        if (substr($tsort, strlen($tsort) - strlen("DESC")) == "DESC") {
            $tsort = substr($tsort, 0, strlen($tsort) - strlen("DESC"));
            $order = "DESC";
        }
    }
    $colorder = array();
    $dosort = false;
    $i = 0;
    foreach ($columns as $column) {
        if ($column != "") {
            $titles[] = get_string("th_{$column}", 'organizer');
            if ($tsort == $column) {
                $dosort = true;
            }
            $colorder[$column] = $i++;
            switch ($column) {
                case 'datetime':
                    $columnwitdh[] = array('value' => 64, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'location':
                    $columnwitdh[] = array('value' => 48, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'teacher':
                    $columnwitdh[] = array('value' => 32, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'groupname':
                    $columnwitdh[] = array('value' => 32, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'participant':
                    $columnwitdh[] = array('value' => 32, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'idnumber':
                    $columnwitdh[] = array('value' => 24, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'attended':
                    $columnwitdh[] = array('value' => 12, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'grade':
                    $columnwitdh[] = array('value' => 18, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 0, 'align' => 'C');
                    break;
                case 'feedback':
                    $columnwitdh[] = array('value' => 64, 'mode' => 'Relativ');
                    $columnformats[] = array('fill' => 1, 'align' => 'L');
                    break;
            }
        }
    }
    switch ($tsort) {
        case "datetime":
            $sort = "starttime";
            break;
        case "location":
            $sort = "s.location";
            break;
        case "teacher":
            $sort = "teacherfirstname";
            break;
        case "participant":
            $sort = "u.lastname";
            break;
        case "idnumber":
            $sort = "u.idnumber";
            break;
        case "attended":
            $sort = "a.attended";
            break;
        case "grade":
            $sort = "a.grade";
            break;
        case "feedback":
            $sort = "a.feedback";
            break;
        default:
            $sort = NULL;
    }
    if (!isset($order)) {
        $order = "";
    } else {
        if ($order != "DESC" && $order != "ASC") {
            $order = "";
        }
    }
    if ($dosort) {
        $dosort = $sort . ' ' . $order;
    } else {
        $dosort = "";
    }
    $allowsubmissionsfromdate = $allowsubmissionsfromdate ? userdate($allowsubmissionsfromdate) : get_string('pdf_notactive', 'organizer');
    $timedue = $timedue ? userdate($timedue) : get_string('pdf_notactive', 'organizer');
    $mpdftable = new MTablePDF($orientation, $columnwitdh);
    $mpdftable->SetTitle(get_string('modulename', 'organizer') . " " . $organizer->name . " - " . get_string('printout', 'organizer'));
    $mpdftable->setRowsperPage($entriesperpage);
    $mpdftable->ShowHeaderFooter($headerfooter);
    $mpdftable->SetFontSize($textsize);
    $mpdftable->setHeaderText(get_string('course') . ':', "{$course->idnumber} {$course->fullname}", get_string('availablefrom', 'organizer') . ':', $allowsubmissionsfromdate, get_string('date') . ':', userdate(time()), get_string('modulename', 'organizer') . ':', $organizer->name, get_string('duedate', 'organizer') . ':', $timedue, '', '');
    $mpdftable->setTitles($titles);
    $mpdftable->setColumnFormat($columnformats);
    $entries = organizer_fetch_table_entries($slots, $dosort);
    $rowspan = 0;
    foreach ($entries as $entry) {
        $row = array();
        if ($rowspan == 0) {
            $rowspan = $entry->rowspan;
        }
        foreach ($columns as $column) {
            switch ($column) {
                // these columns may have rowspan
                case 'datetime':
                    if ($rowspan != $entry->rowspan) {
                        $row[] = null;
                    } else {
                        $datetime = userdate($entry->starttime, get_string('fulldatetimetemplate', 'organizer')) . ' - ' . userdate($entry->starttime + $entry->duration, get_string('timetemplate', 'organizer'));
                        $row[] = array('data' => $datetime, 'rowspan' => $rowspan - 1);
                    }
                    break;
                case 'location':
                    if ($rowspan != $entry->rowspan) {
                        $row[] = null;
                    } else {
                        $row[] = array('data' => $entry->location, 'rowspan' => $rowspan - 1);
                    }
                    break;
                case 'teacher':
                    if ($rowspan != $entry->rowspan) {
                        $row[] = null;
                    } else {
                        $a = new stdClass();
                        $a->firstname = $entry->teacherfirstname;
                        $a->lastname = $entry->teacherlastname;
                        $name = get_string('fullname_template', 'organizer', $a);
                        $row[] = array('data' => $name, 'rowspan' => $rowspan - 1);
                    }
                    break;
                case 'groupname':
                    if ($rowspan != $entry->rowspan) {
                        $row[] = null;
                    } else {
                        $groupname = isset($entry->groupname) ? $entry->groupname : '';
                        $row[] = array('data' => $groupname, 'rowspan' => $rowspan - 1);
                    }
                    break;
                    // these columns cannot have rowspan
                // these columns cannot have rowspan
                case 'participant':
                    $a = new stdClass();
                    $a->firstname = $entry->firstname;
                    $a->lastname = $entry->lastname;
                    $name = get_string('fullname_template', 'organizer', $a);
                    $row[] = array('data' => $name, 'rowspan' => 0);
                    break;
                case 'idnumber':
                    $idnumber = isset($entry->idnumber) && $entry->idnumber !== '' ? $entry->idnumber : '';
                    $row[] = array('data' => $idnumber, 'rowspan' => 0);
                    break;
                case 'attended':
                    $attended = isset($entry->attended) ? $entry->attended == 1 ? get_string('yes') : get_string('no') : '';
                    $row[] = array('data' => $attended, 'rowspan' => 0);
                    break;
                case 'grade':
                    $grade = isset($entry->grade) ? sprintf("%01.2f", $entry->grade) : '';
                    $row[] = array('data' => $grade, 'rowspan' => 0);
                    break;
                case 'feedback':
                    $feedback = isset($entry->feedback) && $entry->feedback !== '' ? $entry->feedback : '';
                    $row[] = array('data' => $feedback, 'rowspan' => 0);
                    break;
            }
        }
        $mpdftable->addRow($row);
        $rowspan--;
    }
    $format = optional_param('format', 'pdf', PARAM_TEXT);
    switch ($format) {
        case 'xlsx':
            $mpdftable->setOutputFormat(MTablePDF::OUTPUT_FORMAT_XLSX);
            break;
        case 'xls':
            $mpdftable->setOutputFormat(MTablePDF::OUTPUT_FORMAT_XLS);
            break;
        case 'ods':
            $mpdftable->setOutputFormat(MTablePDF::OUTPUT_FORMAT_ODS);
            break;
        case 'csv_comma':
            $mpdftable->setOutputFormat(MTablePDF::OUTPUT_FORMAT_CSV_COMMA);
            break;
        case 'csv_tab':
            $mpdftable->setOutputFormat(MTablePDF::OUTPUT_FORMAT_CSV_TAB);
            break;
        default:
            $mpdftable->setOutputFormat(MTablePDF::OUTPUT_FORMAT_PDF);
            break;
    }
    $mpdftable->generate($filename);
    die;
}