function definition()
 {
     global $CFG, $COURSE;
     $mform =& $this->_form;
     $coursecontext = get_context_instance(CONTEXT_COURSE, $COURSE->id);
     $forumng = $this->_instance ? get_record('forumng', 'id', $this->_instance) : null;
     $this->clone = $forumng ? $forumng->originalcmid : 0;
     // If this is a clone, don't show the normal form
     if ($this->clone) {
         $mform->addElement('hidden', 'name', $forumng->name);
         $mform->addElement('static', 'sharedthing', '', get_string('sharedinfo', 'forumng', $CFG->wwwroot . '/course/modedit.php?update=' . $this->clone . '&return=1'));
         $this->shared_definition_part($coursecontext);
         return;
     }
     $mform->addElement('header', 'general', get_string('general', 'form'));
     // Forum name
     $mform->addElement('text', 'name', get_string('forumname', 'forumng'), array('size' => '64'));
     if (!empty($CFG->formatstringstriptags)) {
         $mform->setType('name', PARAM_TEXT);
     } else {
         $mform->setType('name', PARAM_CLEAN);
     }
     $mform->addRule('name', null, 'required', null, 'client');
     $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
     // Forum types
     $types = forum_type::get_all();
     $options = array();
     foreach ($types as $type) {
         if ($type->is_user_selectable()) {
             $options[$type->get_id()] = $type->get_name();
         }
     }
     $mform->addElement('select', 'type', get_string('forumtype', 'forumng'), $options);
     $mform->setHelpButton('type', array('forumtype', get_string('forumtype', 'forumng'), 'forumng'));
     $mform->setDefault('type', 'general');
     $mform->addElement('htmleditor', 'intro', get_string('forumintro', 'forumng'));
     $mform->setType('intro', PARAM_RAW);
     $mform->setHelpButton('intro', array('writing', 'questions', 'richtext'), false, 'editorhelpbutton');
     // Subscription option displays only if enabled at site level
     if ($CFG->forumng_subscription == -1) {
         $options = forum::get_subscription_options();
         $mform->addElement('select', 'subscription', get_string('subscription', 'forumng'), $options);
         $mform->setDefault('subscription', forum::SUBSCRIPTION_PERMITTED);
         $mform->setHelpButton('subscription', array('subscription', get_string('subscription', 'forumng'), 'forumng'));
     } else {
         // Hidden element contains default value (not used anyhow)
         $mform->addElement('hidden', 'subscription', forum::SUBSCRIPTION_PERMITTED);
     }
     // Max size of attachments
     $choices = get_max_upload_sizes($CFG->maxbytes, $COURSE->maxbytes);
     $choices[-1] = get_string('uploadnotallowed');
     $choices[0] = get_string('courseuploadlimit') . ' (' . display_size($COURSE->maxbytes) . ')';
     $mform->addElement('select', 'attachmentmaxbytes', get_string('attachmentmaxbytes', 'forumng'), $choices);
     $mform->setHelpButton('attachmentmaxbytes', array('attachmentmaxbytes', get_string('attachmentmaxbytes', 'forumng'), 'forumng'));
     $mform->setDefault('attachmentmaxbytes', $CFG->forumng_attachmentmaxbytes);
     //Email address for reporting unacceptable post for this forum, default is blank
     $mform->addElement('text', 'reportingemail', get_string('reportingemail', 'forumng'), array('size' => 48));
     $mform->setType('reportingemail', PARAM_NOTAGS);
     $mform->setHelpButton('reportingemail', array('reportingemail', get_string('reportingemail', 'forumng'), 'forumng'));
     // Atom/RSS feed on/off/discussions-only
     if ($CFG->enablerssfeeds && !empty($CFG->forumng_enablerssfeeds)) {
         if ($CFG->forumng_feedtype == -1 || $CFG->forumng_feeditems == -1) {
             $mform->addElement('header', '', get_string('feeds', 'forumng'));
         }
         if ($CFG->forumng_feedtype == -1) {
             $mform->addElement('select', 'feedtype', get_string('feedtype', 'forumng'), forum::get_feedtype_options());
             $mform->setDefault('feedtype', forum::FEEDTYPE_ALL_POSTS);
             $mform->setHelpButton('feedtype', array('feedtype', get_string('feedtype', 'forumng'), 'forumng'));
         }
         // Atom/RSS feed item count
         if ($CFG->forumng_feeditems == -1) {
             $mform->addElement('select', 'feeditems', get_string('feeditems', 'forumng'), forum::get_feeditems_options());
             $mform->setDefault('feeditems', 20);
             $mform->setHelpButton('feeditems', array('feeditems', get_string('feeditems', 'forumng'), 'forumng'));
         }
     }
     // Ratings header
     /////////////////
     $mform->addElement('header', '', get_string('ratings', 'forumng'));
     $mform->addElement('checkbox', 'enableratings', get_string('enableratings', 'forumng'));
     $mform->setHelpButton('enableratings', array('enableratings', get_string('enableratings', 'forumng'), 'forumng'));
     // Scale
     $mform->addElement('modgrade', 'ratingscale', get_string('scale'), null, true);
     $mform->disabledIf('ratingscale', 'enableratings', 'notchecked');
     $mform->setDefault('ratingscale', 5);
     // From/until times
     $mform->addElement('date_time_selector', 'ratingfrom', get_string('ratingfrom', 'forumng'), array('optional' => true));
     $mform->disabledIf('ratingfrom', 'enableratings', 'notchecked');
     $mform->addElement('date_time_selector', 'ratinguntil', get_string('ratinguntil', 'forumng'), array('optional' => true));
     $mform->disabledIf('ratinguntil', 'enableratings', 'notchecked');
     $mform->addElement('text', 'ratingthreshold', get_string('ratingthreshold', 'forumng'));
     $mform->setType('ratingthreshold', PARAM_INT);
     $mform->setDefault('ratingthreshold', 1);
     $mform->addRule('ratingthreshold', get_string('error_ratingthreshold', 'forumng'), 'regex', '/[1-9][0-9]*/', 'client');
     $mform->setHelpButton('ratingthreshold', array('ratingthreshold', get_string('ratingthreshold', 'forumng'), 'forumng'));
     $mform->disabledIf('ratingthreshold', 'enableratings', 'notchecked');
     // Grading
     $mform->addElement('select', 'grading', get_string('grade'), forum::get_grading_options());
     $mform->setDefault('grading', forum::GRADING_NONE);
     $mform->setHelpButton('grading', array('grading', get_string('grade'), 'forumng'));
     $mform->disabledIf('grading', 'enableratings', 'notchecked');
     // Blocking header
     //////////////////
     $mform->addElement('header', '', get_string('limitposts', 'forumng'));
     // Post dates
     $mform->addElement('date_time_selector', 'postingfrom', get_string('postingfrom', 'forumng'), array('optional' => true));
     $mform->addElement('date_time_selector', 'postinguntil', get_string('postinguntil', 'forumng'), array('optional' => true));
     // User limits
     $limitgroup = array();
     $limitgroup[] = $mform->createElement('checkbox', 'enablelimit', '');
     $options = forum::get_max_posts_period_options();
     $limitgroup[] = $mform->createElement('text', 'maxpostsblock', '', array('size' => 3));
     $limitgroup[] = $mform->createElement('static', 'staticthing', '', ' ' . get_string('postsper', 'forumng') . ' ');
     $limitgroup[] = $mform->createElement('select', 'maxpostsperiod', '', $options);
     $mform->addGroup($limitgroup, 'limitgroup', get_string('enablelimit', 'forumng'));
     $mform->disabledIf('limitgroup[maxpostsblock]', 'limitgroup[enablelimit]');
     $mform->disabledIf('limitgroup[maxpostsperiod]', 'limitgroup[enablelimit]');
     $mform->setHelpButton('limitgroup', array('enablelimit', get_string('enablelimit', 'forumng'), 'forumng'));
     $mform->setType('limitgroup[maxpostsblock]', PARAM_INT);
     $mform->setDefault('limitgroup[maxpostsblock]', '10');
     // Remove old discussion
     $options = array();
     $options[0] = get_string('removeolddiscussionsdefault', 'forumng');
     for ($i = 1; $i <= 36; $i++) {
         $options[$i * 2592000] = $i;
     }
     $mform->addElement('header', '', get_string('removeolddiscussions', 'forumng'));
     $mform->addElement('select', 'removeafter', get_string('removeolddiscussionsafter', 'forumng'), $options);
     $mform->setHelpButton('removeafter', array('removeolddiscussions', get_string('removeolddiscussions', 'forumng'), 'forumng'));
     $options = array();
     $options[0] = get_string('deletepermanently', 'forumng');
     $modinfo = get_fast_modinfo($COURSE);
     $targetforumid = $this->_instance ? $this->_instance : 0;
     // Add all in stances to drop down if the user can access them and it's not the same as the current forum
     if (array_key_exists('forumng', $modinfo->instances)) {
         foreach ($modinfo->instances['forumng'] as $info) {
             if ($info->uservisible && $targetforumid != $info->instance) {
                 $options[$info->instance] = $info->name;
             }
         }
     }
     $mform->addElement('select', 'removeto', get_string('withremoveddiscussions', 'forumng'), $options);
     $mform->disabledIf('removeto', 'removeafter', 'eq', 0);
     $mform->setHelpButton('removeto', array('withremoveddiscussions', get_string('withremoveddiscussions', 'forumng'), 'forumng'));
     // Sharing options are advanced and for administrators only
     if ($CFG->forumng_enableadvanced && has_capability('moodle/site:config', $coursecontext)) {
         $mform->addElement('header', '', get_string('sharing', 'forumng'));
         $mform->addElement('advcheckbox', 'shared', get_string('shared', 'forumng'));
         $mform->setHelpButton('shared', array('shared', get_string('shared', 'forumng'), 'forumng'));
         // Only when creating a forum, you can choose to make it a clone
         if (!$this->_instance) {
             $sharegroup = array();
             $sharegroup[] = $mform->createElement('checkbox', 'useshared', '');
             $sharegroup[] = $mform->createElement('text', 'originalcmidnumber', '');
             $mform->addGroup($sharegroup, 'usesharedgroup', get_string('useshared', 'forumng'));
             $mform->disabledIf('usesharedgroup[originalcmidnumber]', 'usesharedgroup[useshared]', 'notchecked');
             $mform->setHelpButton('usesharedgroup', array('useshared', get_string('useshared', 'forumng'), 'forumng'));
         }
     }
     // Do definition that is shared with clone version of form
     $this->shared_definition_part($coursecontext);
     if (count(forum_utils::get_convertible_forums($COURSE)) > 0 && !$this->_instance) {
         $mform->addElement('static', '', '', '<div class="forumng-convertoffer">' . get_string('offerconvert', 'forumng', $CFG->wwwroot . '/mod/forumng/convert.php?course=' . $COURSE->id) . '</div>');
     }
 }
$sizes[-1] = get_string('forbidattachments', 'forumng');
$settings->add(new admin_setting_configselect('forumng_attachmentmaxbytes', get_string('attachmentmaxbytes', 'forumng'), get_string('configattachmentmaxbytes', 'forumng'), 512000, $sizes));
// Option about read tracking
$settings->add(new admin_setting_configcheckbox('forumng_trackreadposts', get_string('trackreadposts', 'forumng'), get_string('configtrackreadposts', 'forumng'), 1));
// Number of days that a post is considered old and we don't store unread data
$settings->add(new admin_setting_configtext('forumng_readafterdays', get_string('readafterdays', 'forumng'), get_string('configreadafterdays', 'forumng'), 60, PARAM_INT));
// RSS feeds
if (empty($CFG->enablerssfeeds)) {
    $options = array(0 => get_string('rssglobaldisabled', 'admin'));
    $str = get_string('configenablerssfeeds', 'forumng') . '<br />' . get_string('configenablerssfeedsdisabled2', 'admin');
} else {
    $options = array(0 => get_string('no'), 1 => get_string('yes'));
    $str = get_string('configenablerssfeeds', 'forumng');
}
$settings->add(new admin_setting_configselect('forumng_enablerssfeeds', get_string('enablerssfeeds', 'admin'), $str, 0, $options));
$options = forum::get_subscription_options();
$options[-1] = get_string('perforumoption', 'forumng');
$settings->add(new admin_setting_configselect('forumng_subscription', get_string('subscription', 'forumng'), get_string('configsubscription', 'forumng'), -1, $options));
// In Moodle 2.0, or OU Moodle 1.9, we use a new admin setting type to let you
// select roles with checkboxes. Otherwise you have to type in role IDs. Ugh.
$defaultroles = array('moodle/legacy:student', 'moodle/legacy:teacher');
if (class_exists('admin_setting_pickroles')) {
    $settings->add(new admin_setting_pickroles('forumng_subscriberoles', get_string('subscriberoles', 'forumng'), get_string('configsubscriberoles', 'forumng'), $defaultroles));
} else {
    $default = '';
    if (!isset($CFG->forumng_subscriberoles)) {
        $result = array();
        foreach ($defaultroles as $capability) {
            if ($caproles = get_roles_with_capability($capability, CAP_ALLOW)) {
                foreach ($caproles as $caprole) {
                    if (!in_array($caprole->id, $result)) {