$form->addRule('objetives', get_lang('ThisFieldIsRequired'), 'required');
 // Target audience of the requested course.
 $form->addElement('textarea', 'target_audience', get_lang('TargetAudience'), array('style' => 'border:#A5ACB2 solid 1px; font-family:arial,verdana,helvetica,sans-serif; font-size:12px', 'rows' => '3', 'cols' => '116'));
 $form->addRule('target_audience', get_lang('ThisFieldIsRequired'), 'required');
 // Course language.
 $form->addElement('select_language', 'course_language', get_lang('Ln'));
 $form->applyFilter('select_language', 'html_filter');
 // Exemplary content checkbox.
 $form->addElement('checkbox', 'exemplary_content', get_lang('FillWithExemplaryContent'));
 // Submit buttons.
 $submit_buttons[] = $form->addButtonSave(get_lang('Save'), 'save_button', true);
 if ($course_request_info['status'] != COURSE_REQUEST_ACCEPTED) {
     $submit_buttons[] = $form->addButtonSave(get_lang('Accept'), 'accept_button', true);
 }
 if ($course_request_info['status'] != COURSE_REQUEST_ACCEPTED && $course_request_info['status'] != COURSE_REQUEST_REJECTED) {
     $submit_buttons[] = $form->addButtonCancel(get_lang('Reject'), 'reject_button', true);
 }
 if ($course_request_info['status'] != COURSE_REQUEST_ACCEPTED && intval($course_request_info['info']) <= 0) {
     $submit_buttons[] = $form->addButtonPreview(get_lang('AskAdditionalInfo'), 'ask_info_button', true);
 }
 $form->addGroup($submit_buttons);
 // Hidden form fields.
 $form->addElement('hidden', 'user_id');
 $form->addElement('hidden', 'directory');
 $form->addElement('hidden', 'visual_code');
 $form->addElement('hidden', 'request_date');
 $form->addElement('hidden', 'status');
 $form->addElement('hidden', 'info');
 // Set the default values based on the corresponding database record.
 $values['wanted_code'] = $course_request_info['code'];
 $values['user_id'] = $course_request_info['user_id'];
 foreach ($groupList as $group) {
     $groupIdList[$group['id']] = $group['name'];
 }
 echo Display::page_subheader(get_lang('CalendarList'));
 echo '<div class="attendance-calendar-list">';
 if (!empty($attendance_calendar)) {
     foreach ($attendance_calendar as $calendar) {
         echo '<div class="attendance-calendar-row">';
         if (isset($action) && $action == 'calendar_edit' && (isset($calendar_id) && $calendar_id == $calendar['id'])) {
             // calendar edit form
             echo '<div class="attendance-calendar-edit">';
             $form = new FormValidator('attendance_calendar_edit', 'POST', 'index.php?action=calendar_edit&attendance_id=' . $attendance_id . '&calendar_id=' . $calendar_id . '&' . api_get_cidreq() . $param_gradebook, '');
             $form->addElement('date_time_picker', 'date_time', '', array('form_name' => 'attendance_calendar_edit'), 5);
             $defaults['date_time'] = $calendar['date_time'];
             $form->addButtonSave(get_lang('Save'));
             $form->addButtonCancel(get_lang('Cancel'), 'cancel');
             $form->setDefaults($defaults);
             $form->display();
             echo '</div>';
         } else {
             echo Display::return_icon('lp_calendar_event.png', get_lang('DateTime')) . ' ' . substr($calendar['date_time'], 0, strlen($calendar['date_time']) - 3) . '&nbsp;';
             if (isset($calendar['groups']) && !empty($calendar['groups'])) {
                 foreach ($calendar['groups'] as $group) {
                     echo '&nbsp;' . Display::label($groupIdList[$group['group_id']]);
                 }
             }
             if (!$is_locked_attendance || api_is_platform_admin()) {
                 if (api_is_allowed_to_edit()) {
                     echo '<span style="margin-left:20px;">';
                     echo '<a href="index.php?' . api_get_cidreq() . '&action=calendar_edit&calendar_id=' . intval($calendar['id']) . '&attendance_id=' . $attendance_id . $param_gradebook . '">' . Display::return_icon('edit.png', get_lang('Edit'), array('style' => 'vertical-align:middle'), ICON_SIZE_SMALL) . '</a>&nbsp;';
                     echo '<a onclick="javascript:if(!confirm(\'' . get_lang('AreYouSureToDelete') . '\')) return false;" href="index.php?' . api_get_cidreq() . $param_gradebook . '&action=calendar_delete&calendar_id=' . intval($calendar['id']) . '&attendance_id=' . $attendance_id . '">' . Display::return_icon('delete.png', get_lang('Delete'), array('style' => 'vertical-align:middle'), ICON_SIZE_SMALL) . '</a>';
         unset($_SESSION['bc_sale_id']);
         header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/index.php');
         exit;
     }
     $messageTemplate = new Template();
     $messageTemplate->assign('user', $userInfo);
     $messageTemplate->assign('sale', ['date' => api_format_date($sale['date'], DATE_FORMAT_LONG_NO_DAY), 'product' => $sale['product_name'], 'currency' => $currency['iso_code'], 'price' => $sale['price'], 'reference' => $sale['reference']]);
     $messageTemplate->assign('transfer_accounts', $transferAccounts);
     api_mail_html($userInfo['complete_name'], $userInfo['email'], $plugin->get_lang('bc_subject'), $messageTemplate->fetch('buycourses/view/message_transfer.tpl'));
     Display::addFlash(Display::return_message(sprintf($plugin->get_lang('PurchaseStatusX'), $plugin->get_lang('PendingReasonByTransfer')), 'success', false));
     unset($_SESSION['bc_sale_id']);
     header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/course_catalog.php');
     exit;
 }
 $form->addButton('confirm', $plugin->get_lang('ConfirmOrder'), 'check', 'success');
 $form->addButtonCancel($plugin->get_lang('CancelOrder'), 'cancel');
 $template = new Template();
 if ($buyingCourse) {
     $template->assign('course', $course);
 } elseif ($buyingSession) {
     $template->assign('session', $session);
 }
 $template->assign('buying_course', $buyingCourse);
 $template->assign('buying_session', $buyingSession);
 $template->assign('title', $sale['product_name']);
 $template->assign('price', $sale['price']);
 $template->assign('currency', $sale['currency_id']);
 $template->assign('user', $userInfo);
 $template->assign('transfer_accounts', $transferAccounts);
 $template->assign('form', $form->returnForm());
 $content = $template->fetch('buycourses/view/process_confirm.tpl');
/**
 * This function allows the platform admin to choose the default stylesheet
 * @author Patrick Cool <*****@*****.**>, Ghent University
 * @author Julio Montoya <*****@*****.**>, Chamilo
 */
function handle_stylesheets()
{
    global $_configuration;
    // Current style.
    $currentstyle = api_get_setting('stylesheets');
    $is_style_changeable = false;
    if ($_configuration['access_url'] != 1) {
        $style_info = api_get_settings('stylesheets', '', 1, 0);
        $url_info = api_get_access_url($_configuration['access_url']);
        if ($style_info[0]['access_url_changeable'] == 1 && $url_info['active'] == 1) {
            $is_style_changeable = true;
        }
    } else {
        $is_style_changeable = true;
    }
    $form = new FormValidator('stylesheet_upload', 'post', 'settings.php?category=Stylesheets#tabs-3');
    $form->addElement('text', 'name_stylesheet', get_lang('NameStylesheet'), array('size' => '40', 'maxlength' => '40'));
    $form->addRule('name_stylesheet', get_lang('ThisFieldIsRequired'), 'required');
    $form->addElement('file', 'new_stylesheet', get_lang('UploadNewStylesheet'));
    $allowed_file_types = array('css', 'zip', 'jpeg', 'jpg', 'png', 'gif', 'ico', 'psd', 'xcf', 'svg', 'webp', 'woff', 'woff2');
    $form->addRule('new_stylesheet', get_lang('InvalidExtension') . ' (' . implode(',', $allowed_file_types) . ')', 'filetype', $allowed_file_types);
    $form->addRule('new_stylesheet', get_lang('ThisFieldIsRequired'), 'required');
    $form->addButtonUpload(get_lang('Upload'), 'stylesheet_upload');
    $show_upload_form = false;
    if (!is_writable(CSS_UPLOAD_PATH)) {
        Display::display_error_message(CSS_UPLOAD_PATH . get_lang('IsNotWritable'));
    } else {
        // Uploading a new stylesheet.
        if ($_configuration['access_url'] == 1) {
            $show_upload_form = true;
        } else {
            if ($is_style_changeable) {
                $show_upload_form = true;
            }
        }
    }
    // Stylesheet upload.
    if (isset($_POST['stylesheet_upload'])) {
        if ($form->validate()) {
            $values = $form->exportValues();
            $picture_element = $form->getElement('new_stylesheet');
            $picture = $picture_element->getValue();
            $result = upload_stylesheet($values, $picture);
            // Add event to the system log.
            $user_id = api_get_user_id();
            $category = $_GET['category'];
            Event::addEvent(LOG_CONFIGURATION_SETTINGS_CHANGE, LOG_CONFIGURATION_SETTINGS_CATEGORY, $category, api_get_utc_datetime(), $user_id);
            if ($result) {
                Display::display_confirmation_message(get_lang('StylesheetAdded'));
            }
        }
    }
    $form_change = new FormValidator('stylesheet_upload', 'post', api_get_self() . '?category=Stylesheets', null, array('id' => 'stylesheets_id'));
    $list_of_names = array();
    $selected = '';
    $dirpath = '';
    $safe_style_dir = '';
    if ($handle = @opendir(CSS_UPLOAD_PATH)) {
        $counter = 1;
        while (false !== ($style_dir = readdir($handle))) {
            if (substr($style_dir, 0, 1) == '.') {
                // Skip directories starting with a '.'
                continue;
            }
            $dirpath = CSS_UPLOAD_PATH . $style_dir;
            if (is_dir($dirpath)) {
                if ($style_dir != '.' && $style_dir != '..') {
                    if (isset($_POST['style']) && (isset($_POST['preview']) || isset($_POST['download'])) && $_POST['style'] == $style_dir) {
                        $safe_style_dir = $style_dir;
                    } else {
                        if ($currentstyle == $style_dir || $style_dir == 'chamilo' && !$currentstyle) {
                            if (isset($_POST['style'])) {
                                $selected = Database::escape_string($_POST['style']);
                            } else {
                                $selected = $style_dir;
                            }
                        }
                    }
                    $show_name = ucwords(str_replace('_', ' ', $style_dir));
                    if ($is_style_changeable) {
                        $list_of_names[$style_dir] = $show_name;
                    }
                    $counter++;
                }
            }
        }
        closedir($handle);
    }
    // Sort styles in alphabetical order.
    asort($list_of_names);
    $select_list = array();
    foreach ($list_of_names as $style_dir => $item) {
        $select_list[$style_dir] = $item;
    }
    $styles =& $form_change->addElement('select', 'style', get_lang('NameStylesheet'), $select_list);
    $styles->setSelected($selected);
    if ($form_change->validate()) {
        // Submit stylesheets.
        if (isset($_POST['save'])) {
            store_stylesheets();
            Display::display_normal_message(get_lang('Saved'));
        }
        if (isset($_POST['download'])) {
            $arch = api_get_path(SYS_ARCHIVE_PATH) . $safe_style_dir . '.zip';
            $dir = api_get_path(SYS_CSS_PATH) . 'themes/' . $safe_style_dir;
            if (is_dir($dir)) {
                $zip = new PclZip($arch);
                // Remove path prefix except the style name and put file on disk
                $zip->create($dir, PCLZIP_OPT_REMOVE_PATH, substr($dir, 0, -strlen($safe_style_dir)));
                //@TODO: use more generic script to download.
                $str = '<a class="btn btn-primary btn-large" href="' . api_get_path(WEB_CODE_PATH) . 'course_info/download.php?archive=' . str_replace(api_get_path(SYS_ARCHIVE_PATH), '', $arch) . '">' . get_lang('ClickHereToDownloadTheFile') . '</a>';
                Display::display_normal_message($str, false);
            } else {
                Display::addFlash(Display::return_message(get_lang('FileNotFound'), 'warning'));
            }
        }
    }
    $logoForm = new FormValidator('logo_upload', 'post', 'settings.php?category=Stylesheets#tabs-2');
    $logoForm->addHtml(Display::return_message(sprintf(get_lang('TheLogoMustBeSizeXAndFormatY'), '250 x 70', 'PNG'), 'info'));
    $dir = api_get_path(SYS_PUBLIC_PATH) . 'css/themes/' . $selected . '/images/';
    $url = api_get_path(WEB_CSS_PATH) . 'themes/' . $selected . '/images/';
    $logoFileName = 'header-logo.png';
    $newLogoFileName = 'header-logo-custom.png';
    if (is_file($dir . $newLogoFileName)) {
        $logoForm->addLabel(get_lang('CurrentLogo'), '<img id="header-logo-custom" src="' . $url . $newLogoFileName . '?' . time() . '">');
    } else {
        $logoForm->addLabel(get_lang('CurrentLogo'), '<img id="header-logo-custom" src="' . $url . $logoFileName . '?' . time() . '">');
    }
    $logoForm->addFile('new_logo', get_lang('UpdateLogo'));
    $allowedFileTypes = ['png'];
    if (isset($_POST['logo_reset'])) {
        if (is_file($dir . $newLogoFileName)) {
            unlink($dir . $newLogoFileName);
            Display::display_normal_message(get_lang('ResetToTheOriginalLogo'));
            echo '<script>' . '$("#header-logo").attr("src","' . $url . $logoFileName . '");' . '</script>';
        }
    } elseif (isset($_POST['logo_upload'])) {
        $logoForm->addRule('new_logo', get_lang('InvalidExtension') . ' (' . implode(',', $allowedFileTypes) . ')', 'filetype', $allowedFileTypes);
        $logoForm->addRule('new_logo', get_lang('ThisFieldIsRequired'), 'required');
        if ($logoForm->validate()) {
            $imageInfo = getimagesize($_FILES['new_logo']['tmp_name']);
            $width = $imageInfo[0];
            $height = $imageInfo[1];
            if ($width <= 250 && $height <= 70) {
                if (is_file($dir . $newLogoFileName)) {
                    unlink($dir . $newLogoFileName);
                }
                $status = move_uploaded_file($_FILES['new_logo']['tmp_name'], $dir . $newLogoFileName);
                if ($status) {
                    Display::display_normal_message(get_lang('NewLogoUpdated'));
                    echo '<script>' . '$("#header-logo").attr("src","' . $url . $newLogoFileName . '");' . '</script>';
                } else {
                    Display::display_error_message('Error - ' . get_lang('UplNoFileUploaded'));
                }
            } else {
                Display::display_error_message('Error - ' . get_lang('InvalidImageDimensions'));
            }
        }
    }
    if ($is_style_changeable) {
        $group = [$form_change->addButtonSave(get_lang('SaveSettings'), 'save', true), $form_change->addButtonPreview(get_lang('Preview'), 'preview', true), $form_change->addButtonDownload(get_lang('Download'), 'download', true)];
        $form_change->addGroup($group);
        $logoGroup = [$logoForm->addButtonUpload(get_lang('Upload'), 'logo_upload', true), $logoForm->addButtonCancel(get_lang('Reset'), 'logo_reset', true)];
        $logoForm->addGroup($logoGroup);
        if ($show_upload_form) {
            echo '<script>
            $(function() {
                $( "#tabs" ).tabs();
            });
            </script>';
            echo Display::tabs(array(get_lang('Update'), get_lang('UpdateLogo'), get_lang('UploadNewStylesheet')), array($form_change->return_form(), $logoForm->return_form(), $form->return_form()));
        } else {
            $form_change->display();
        }
        //Little hack to update the logo image in update form when submiting
        if (isset($_POST['logo_reset'])) {
            echo '<script>' . '$("#header-logo-custom").attr("src","' . $url . $logoFileName . '");' . '</script>';
        } elseif (isset($_POST['logo_upload']) && is_file($dir . $newLogoFileName)) {
            echo '<script>' . '$("#header-logo-custom").attr("src","' . $url . $newLogoFileName . '");' . '</script>';
        }
    } else {
        $form_change->freeze();
    }
}