/**
 * Echoes HTML code for booking table with all booking options and booking status
 * @param $booking object containing complete details of the booking instance
 * @param $user object of current user
 * @param $cm course module object
 * @param $allresponses array of all responses
 * @param $sorturl
 * @param $urlParams - fparameters of url
 * @param $optionid - if is set, show only this option
 * @return void
 */
function booking_show_form($booking, $user, $cm, $allresponses, $sorturl = '', $urlParams = array(), $optionid = NULL)
{
    global $DB, $OUTPUT;
    //$optiondisplay is an array of the display info for a booking $cdisplay[$optionid]->text  - text name of option.
    //                                                                            ->maxanswers -maxanswers for this option
    //                                                                            ->full - whether this option is full or not. 0=not full, 1=full
    //									      ->maxoverbooking - waitinglist places dor option
    //									      ->waitingfull - whether waitinglist is full or not 0=not, 1=full
    $bookingfull = false;
    $cdisplay = new stdClass();
    if ($booking->booking->limitanswers) {
        //set bookingfull to true by default if limitanswers.
        $bookingfull = true;
        $waitingfull = true;
    }
    $context = context_module::instance($cm->id);
    $table = NULL;
    $displayoptions = new stdClass();
    $displayoptions->para = false;
    $tabledata = array();
    $current = array();
    $rowclasses = array();
    $hidden = "";
    foreach ($urlParams as $key => $value) {
        if (!in_array($key, array('searchText', 'searchLocation', 'searchInstitution'))) {
            $hidden .= '<input value="' . $value . '" type="hidden" name="' . $key . '">';
        }
    }
    $labelBooking = empty($booking->booking->lblbooking) ? get_string('booking', 'booking') : $booking->booking->lblbooking;
    $labelLocation = empty($booking->booking->lbllocation) ? get_string('location', 'booking') : $booking->booking->lbllocation;
    $labelInstitution = empty($booking->booking->lblinstitution) ? get_string('institution', 'booking') : $booking->booking->lblinstitution;
    $labelSearchName = empty($booking->booking->lblname) ? get_string('searchName', 'booking') : $booking->booking->lblname;
    $labelSearchSurname = empty($booking->booking->lblsurname) ? get_string('searchSurname', 'booking') : $booking->booking->lblsurname;
    $row = new html_table_row(array($labelBooking, $hidden . '<form><input value="' . $urlParams['searchText'] . '" type="text" id="searchText" name="searchText">', "", ""));
    $tabledata[] = $row;
    $rowclasses[] = "";
    $row = new html_table_row(array($labelLocation, $hidden . '<input value="' . $urlParams['searchLocation'] . '" type="text" id="searchLocation" name="searchLocation">', "", ""));
    $tabledata[] = $row;
    $rowclasses[] = "";
    $row = new html_table_row(array($labelInstitution, $hidden . '<input value="' . $urlParams['searchInstitution'] . '" type="text" id="searchInstitution" name="searchInstitution">', "", ""));
    $tabledata[] = $row;
    $rowclasses[] = "";
    $row = new html_table_row(array($labelSearchName, '<form>' . $hidden . '<input value="' . $urlParams['searchName'] . '" type="text" id="searchName" name="searchName">', "", ""));
    $tabledata[] = $row;
    $rowclasses[] = "";
    $row = new html_table_row(array($labelSearchSurname, '<input value="' . $urlParams['searchSurname'] . '" type="text" id="searchSurname" name="searchSurname">', "", ""));
    $tabledata[] = $row;
    $rowclasses[] = "";
    $row = new html_table_row(array("", '<input id="searchButton" type="submit" value="' . get_string('search') . '"><input id="buttonclear" type="button" value="' . get_string('reset', 'booking') . '"></form>', "", ""));
    $tabledata[] = $row;
    $rowclasses[] = "";
    $table = new html_table();
    $table->head = array('', '', '');
    $table->data = $tabledata;
    $table->id = "tableSearch";
    if (empty($urlParams['searchText']) && empty($urlParams['searchLocation']) && empty($urlParams['searchName']) && empty($urlParams['searchInstitution']) && empty($urlParams['searchSurname'])) {
        $table->attributes = array('style' => "display: none;");
    }
    echo html_writer::table($table);
    $table = NULL;
    $displayoptions = new stdClass();
    $displayoptions->para = false;
    $tabledata = array();
    $rowclasses = array();
    $underlimit = $booking->booking->maxperuser == 0;
    $underlimit = $underlimit || booking_get_user_booking_count($booking, $user, $allresponses) < $booking->booking->maxperuser;
    // Show only one option
    if (isset($optionid)) {
        foreach ($booking->options as $option) {
            if ($optionid != $option->id) {
                unset($booking->options[$option->id]);
            }
        }
    }
    if (isset($booking->options)) {
        foreach ($booking->options as $option) {
            $current = array();
            $optiondisplay = new stdClass();
            $optiondisplay->delete = "";
            $optiondisplay->button = "";
            $hiddenfields = array('answer' => $option->id);
            $myBooking = $DB->get_record('booking_answers', array('userid' => $user->id, 'optionid' => $option->id));
            $inpast = $option->courseendtime && $option->courseendtime < time();
            $extraclass = $inpast ? ' inpast' : '';
            if ($myBooking) {
                // If I'm booked
                if ($booking->booking->allowupdate and $option->status != 'closed') {
                    $buttonoptions = array('id' => $cm->id, 'action' => 'delbooking', 'optionid' => $option->id, 'sesskey' => $user->sesskey);
                    $url = new moodle_url('view.php', $buttonoptions);
                    $optiondisplay->delete = $OUTPUT->single_button($url, empty($booking->booking->btncancelname) ? get_string('cancelbooking', 'booking') : $booking->booking->btncancelname, 'post') . '<br />';
                } else {
                    $optiondisplay->button = "";
                }
                if ($myBooking->waitinglist) {
                    $rowclasses[] = "mod-booking-watinglist" . $extraclass;
                    $optiondisplay->booked = get_string('onwaitinglist', 'booking');
                } else {
                    $rowclasses[] = "mod-booking-booked" . $extraclass;
                    if ($inpast) {
                        $optiondisplay->booked = get_string('bookedpast', 'booking');
                    } else {
                        $optiondisplay->booked = get_string('booked', 'booking');
                    }
                }
            } else {
                $optiondisplay->booked = get_string('notbooked', 'booking');
                $rowclasses[] = $extraclass;
                $buttonoptions = array('answer' => $option->id, 'id' => $cm->id, 'sesskey' => $user->sesskey);
                $url = new moodle_url('view.php', $buttonoptions);
                $url->params($hiddenfields);
                $optiondisplay->button = $OUTPUT->single_button($url, empty($booking->booking->btnbooknowname) ? get_string('booknow', 'booking') : $booking->booking->btnbooknowname, 'post');
            }
            if ($option->limitanswers && $option->status == "full" || $option->status == "closed" || !$underlimit) {
                $optiondisplay->button = '';
            }
            if ($booking->booking->cancancelbook == 0 && $option->courseendtime > 0 && $option->courseendtime < time()) {
                $optiondisplay->button = '';
                $optiondisplay->delete = '';
            }
            // Dont display button Book now if it's disabled
            if ($option->disablebookingusers) {
                $optiondisplay->button = '';
            }
            // check if user ist logged in
            if (has_capability('mod/booking:choose', $context, $user->id, false)) {
                //don't show booking button if the logged in user is the guest user.
                $bookingbutton = $optiondisplay->button;
            } else {
                $bookingbutton = get_string('havetologin', 'booking') . "<br />";
            }
            if (!$option->limitanswers) {
                $stravailspaces = get_string("unlimited", 'booking');
            } else {
                $stravailspaces = get_string("placesavailable", "booking") . ": " . $option->availspaces . " / " . $option->maxanswers . "<br />" . get_string("waitingplacesavailable", "booking") . ": " . $option->availwaitspaces . " / " . $option->maxoverbooking;
            }
            if (has_capability('mod/booking:readresponses', $context) || booking_check_if_teacher($option, $user)) {
                $numberofresponses = $option->count;
                $optiondisplay->manage = "<a href=\"report.php?id={$cm->id}&optionid={$option->id}\">" . get_string("viewallresponses", "booking", $numberofresponses) . "</a>";
            } else {
                $optiondisplay->manage = "";
            }
            $optiondisplay->bookotherusers = "";
            $cTeachers = $DB->count_records("booking_teachers", array("optionid" => $option->id, 'bookingid' => $option->bookingid));
            $teachers = $DB->get_records("booking_teachers", array("optionid" => $option->id, 'bookingid' => $option->bookingid));
            $niceTeachers = array();
            $printTeachers = "";
            if ($cTeachers > 0) {
                $printTeachers = "<p>";
                $printTeachers .= (empty($booking->booking->lblteachname) ? get_string('teachers', 'booking') : $booking->booking->lblteachname) . ': ';
                foreach ($teachers as $teacher) {
                    $tmpuser = $DB->get_record('user', array('id' => $teacher->userid));
                    $niceTeachers[] = fullname($tmpuser);
                }
                $printTeachers .= implode(', ', $niceTeachers);
                $printTeachers .= "</p>";
            }
            $additionalInfo = '';
            if (strlen($option->location) > 0) {
                $additionalInfo .= '<p>' . get_string('location', "booking") . ': ' . $option->location . '</p>';
            }
            if (strlen($option->institution) > 0) {
                $additionalInfo .= '<p>' . get_string('institution', "booking") . ': ' . $option->institution . '</p>';
            }
            if (strlen($option->address) > 0) {
                $additionalInfo .= '<p>' . get_string('address', "booking") . ': ' . $option->address . '</p>';
            }
            $row = new html_table_row(array("<span id=\"option{$option->id}\"></span>" . $bookingbutton . $optiondisplay->booked . '
		<br />' . get_string($option->status, "booking") . '
		<br />' . $optiondisplay->delete . $optiondisplay->manage . '
		<br />' . $optiondisplay->bookotherusers, "<b>" . format_text($option->text . ' ', FORMAT_MOODLE, $displayoptions) . "</b>" . "<p>" . $option->description . "</p>" . $printTeachers . $additionalInfo, $option->coursestarttimetext . " " . get_string('to', "booking") . " <br />" . $option->courseendtimetext, $stravailspaces));
            $tabledata[] = $row;
        }
    }
    $table = new html_table();
    $table->attributes['class'] = 'box generalbox boxaligncenter boxwidthwide booking';
    $table->attributes['style'] = '';
    $table->data = array();
    $strselect = get_string("select", "booking");
    $strbooking = get_string("booking", "booking");
    if (strlen($booking->booking->eventtype) > 0) {
        $strbooking = $booking->booking->eventtype;
    }
    $strdate = '<a href="' . $sorturl . '">' . get_string("coursedate", "booking") . '</a>';
    $stravailability = get_string("availability", "booking");
    $table->head = array($strselect, $strbooking, $strdate, $stravailability);
    $table->align = array("left", "left", "left", "left");
    $table->rowclasses = $rowclasses;
    $table->data = $tabledata;
    echo html_writer::table($table);
}
 /**
  * Saves the booking for the user
  * @return boolean true if booking was possible, false if meanwhile the booking got full
  */
 public function user_submit_response($user)
 {
     global $DB;
     if (null == $this->option) {
         return false;
     }
     $waitingList = $this->check_if_limit();
     if ($waitingList === FALSE) {
         return FALSE;
     }
     $underlimit = $this->booking->maxperuser == 0;
     $underlimit = $underlimit || booking_get_user_booking_count($this, $user, NULL) < $this->booking->maxperuser;
     if (!$underlimit) {
         return FALSE;
     }
     if (!($currentanswerid = $DB->get_field('booking_answers', 'id', array('userid' => $user->id, 'optionid' => $this->optionid)))) {
         $newanswer = new stdClass();
         $newanswer->bookingid = $this->id;
         $newanswer->userid = $user->id;
         $newanswer->optionid = $this->optionid;
         $newanswer->timemodified = time();
         $newanswer->timecreated = time();
         $newanswer->waitinglist = $waitingList;
         if (!$DB->insert_record("booking_answers", $newanswer)) {
             error("Could not register your booking because of a database error");
         }
         //TODO replace
         booking_check_enrol_user($this->option, $this->booking, $user->id);
     }
     $event = \mod_booking\event\bookingoption_booked::create(array('objectid' => $this->optionid, 'context' => context_module::instance($this->cm->id), 'relateduserid' => $user->id, 'other' => array('userid' => $user->id)));
     $event->trigger();
     if ($this->booking->sendmail) {
         $eventdata = new stdClass();
         $eventdata->user = $user;
         $eventdata->booking = $this->booking;
         // TODO the next line is for backward compatibility only, delete when finished refurbishing the module ;-)
         $eventdata->booking->option[$this->optionid] = $this->option;
         $eventdata->optionid = $this->optionid;
         $eventdata->cmid = $this->cm->id;
         //TODO replace
         booking_send_confirm_message($eventdata);
     }
     return true;
 }