[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface domainprefs.pm

raeburn raeburn at source.lon-capa.org
Tue Aug 27 19:27:11 EDT 2019


raeburn		Tue Aug 27 23:27:11 2019 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	domainprefs.pm 
  Log:
  - For 2.11
    Backport 1.315
  
  
-------------- next part --------------
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.160.6.100 loncom/interface/domainprefs.pm:1.160.6.101
--- loncom/interface/domainprefs.pm:1.160.6.100	Tue Aug 27 18:37:01 2019
+++ loncom/interface/domainprefs.pm	Tue Aug 27 23:27:07 2019
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.160.6.100 2019/08/27 18:37:01 raeburn Exp $
+# $Id: domainprefs.pm,v 1.160.6.101 2019/08/27 23:27:07 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2968,7 +2968,54 @@
                           $to{$item}.'" /></td></tr>';
             $rownum ++;
         }
-    } else {
+    } elsif ($position eq 'bottom') {
+        $css_class = $rownum%2?' class="LC_odd_row"':'';
+        $datatable .= '<tr'.$css_class.'>'.
+                      '<td>'.&mt('Extra helpdesk form fields:').'<br />'.
+                      &mt('(e-mail, subject, and description always shown)').
+                      '</td><td class="LC_left_item">';
+        if ((ref($fields) eq 'ARRAY') && (ref($fieldtitles) eq 'HASH') &&
+            (ref($fieldoptions) eq 'HASH') && (ref($possoptions) eq 'HASH')) {
+            $datatable .= '<table><tr><th>'.&mt('Field').'</th><th>'.&mt('Status').'</th></tr>';
+            foreach my $field (@{$fields}) {
+                $datatable .= '<tr><td>'.$fieldtitles->{$field};
+                if (($field eq 'screenshot') || ($field eq 'cc')) {
+                    $datatable .= ' '.&mt('(logged-in users)');
+                }
+                $datatable .='</td><td>';
+                my $clickaction;
+                if ($field eq 'screenshot') {
+                    $clickaction = ' onclick="screenshotSize(this);"';
+                }
+                if (ref($possoptions->{$field}) eq 'ARRAY') {
+                    foreach my $option (@{$possoptions->{$field}}) {
+                        my $checked;
+                        if ($currfield{$field} eq $option) {
+                            $checked = ' checked="checked"';
+                        }
+                        $datatable .= '<span class="LC_nobreak"><label>'.
+                                      '<input type="radio" name="helpform_'.$field.'" '.
+                                      'value="'.$option.'"'.$checked.$clickaction.' />'.$fieldoptions->{$option}.
+                                      '</label></span>'.(' 'x2);
+                    }
+                }
+                if ($field eq 'screenshot') {
+                    my $display;
+                    if ($currfield{$field} eq 'no') {
+                        $display = ' style="display:none"';
+                    }
+                    $datatable .= '</td></tr><tr id="help_screenshotsize"'.$display.'>'.
+                                  '<td>'.&mt('Maximum size for upload (MB)').'</td><td>'.
+                                  '<input type="text" size="5" name="helpform_maxsize" value="'.$maxsize.'" />';
+                }
+                $datatable .= '</td></tr>';
+            }
+            $datatable .= '</table>';
+        }
+        $datatable .= '</td></tr>'."\n";
+        $rownum ++;
+    }
+    unless ($position eq 'top') {
         foreach my $type (@mailings) {
             $css_class = $rownum%2?' class="LC_odd_row"':'';
             $datatable .= '<tr'.$css_class.'>'.
@@ -3028,56 +3075,138 @@
                                                    \%choices,$rownum);
         $datatable .= $reports;
     } elsif ($position eq 'bottom') {
-        $css_class = $rownum%2?' class="LC_odd_row"':'';
-        $datatable .= '<tr'.$css_class.'>'.
-                      '<td>'.&mt('Extra helpdesk form fields:').'<br />'.
-                      &mt('(e-mail, subject, and description always shown)').
-                      '</td><td class="LC_left_item">';
-        if ((ref($fields) eq 'ARRAY') && (ref($fieldtitles) eq 'HASH') &&
-            (ref($fieldoptions) eq 'HASH') && (ref($possoptions) eq 'HASH')) {
-            $datatable .= '<table><tr><th>'.&mt('Field').'</th><th>'.&mt('Status').'</th></tr>';
-            foreach my $field (@{$fields}) {
-                $datatable .= '<tr><td>'.$fieldtitles->{$field};
-                if (($field eq 'screenshot') || ($field eq 'cc')) {
-                    $datatable .= ' '.&mt('(logged-in users)');
-                }
-                $datatable .='</td><td>';
-                my $clickaction;
-                if ($field eq 'screenshot') {
-                    $clickaction = ' onclick="screenshotSize(this);"';
-                }
-                if (ref($possoptions->{$field}) eq 'ARRAY') {
-                    foreach my $option (@{$possoptions->{$field}}) {
-                        my $checked;
-                        if ($currfield{$field} eq $option) {
-                            $checked = ' checked="checked"';
+        my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+        my (@posstypes,%usertypeshash);
+        if (ref($types) eq 'ARRAY') {
+            @posstypes = @{$types};
+        }
+        if (@posstypes) {
+            if (ref($usertypes) eq 'HASH') {
+                %usertypeshash = %{$usertypes};
+            }
+            my @overridden;
+            my $numinrow = 4;
+            if (ref($settings) eq 'HASH') {
+                if (ref($settings->{'overrides'}) eq 'HASH') {
+                    foreach my $key (sort(keys(%{$settings->{'overrides'}}))) {
+                        if (ref($settings->{'overrides'}{$key}) eq 'HASH') {
+                            push(@overridden,$key);
+                            foreach my $item (@contacts) {
+                                if ($settings->{'overrides'}{$key}{$item}) {
+                                    $checked{'override_'.$key}{$item} = ' checked="checked" ';
+                                }
+                            }
+                            $otheremails{'override_'.$key} = $settings->{'overrides'}{$key}{'others'};
+                            $bccemails{'override_'.$key} = $settings->{'overrides'}{$key}{'bcc'};
+                            $includeloc{'override_'.$key} = '';
+                            $includestr{'override_'.$key} = '';
+                            if ($settings->{'overrides'}{$key}{'include'} ne '') {
+                                ($includeloc{'override_'.$key},$includestr{'override_'.$key}) =
+                                    split(/:/,$settings->{'overrides'}{$key}{'include'},2);
+                                $includestr{'override_'.$key} = &unescape($includestr{'override_'.$key});
+                            }
                         }
-                        $datatable .= '<span class="LC_nobreak"><label>'.
-                                      '<input type="radio" name="helpform_'.$field.'" '.
-                                      'value="'.$option.'"'.$checked.$clickaction.' />'.$fieldoptions->{$option}.
-                                      '</label></span>'.(' 'x2);
                     }
                 }
-                if ($field eq 'screenshot') {
-                    my $display;
-                    if ($currfield{$field} eq 'no') {
-                        $display = ' style="display:none"';
-                    }
-                    $datatable .= '</td></tr><tr id="help_screenshotsize"'.$display.'>'.
-                                  '<td>'.&mt('Maximum size for upload (MB)').'</td><td>'.
-                                  '<input type="text" size="5" name="helpform_maxsize" value="'.$maxsize.'" />';
+            }
+            my $customclass = 'LC_helpdesk_override';
+            my $optionsprefix = 'LC_options_helpdesk_';
+
+            my $onclicktypes = "toggleHelpdeskRow(this.form,'overrides','$customclass','$optionsprefix');";
+
+            $datatable .= &insttypes_row($settings,$types,$usertypes,$dom,
+                                         $numinrow,$othertitle,'overrides',
+                                         \$rownum,$onclicktypes,$customclass);
+            $rownum ++;
+            $usertypeshash{'default'} = $othertitle;
+            foreach my $status (@posstypes) {
+                my $css_class;
+                if ($rownum%2) {
+                    $css_class = 'LC_odd_row ';
+                }
+                $css_class .= $customclass;
+                my $rowid = $optionsprefix.$status;
+                my $hidden = 1;
+                my $currstyle = 'display:none';
+                if (grep(/^\Q$status\E$/, at overridden)) {
+                    $currstyle = 'display:table-row';
+                    $hidden = 0;
+                }
+                my $key = 'override_'.$status;
+                $datatable .= &overridden_helpdesk($checked{$key},$otheremails{$key},$bccemails{$key},
+                                                  $includeloc{$key},$includestr{$key},$status,$rowid,
+                                                  $usertypeshash{$status},$css_class,$currstyle,
+                                                  \@contacts,$short_titles);
+                unless ($hidden) {
+                    $rownum ++;
                 }
-                $datatable .= '</td></tr>';
             }
-            $datatable .= '</table>';
         }
-        $datatable .= '</td></tr>'."\n";
-        $rownum ++;
     }
     $$rowtotal += $rownum;
     return $datatable;
 }
 
+sub overridden_helpdesk {
+    my ($checked,$otheremails,$bccemails,$includeloc,$includestr,$type,$rowid,
+        $typetitle,$css_class,$rowstyle,$contacts,$short_titles) = @_;
+    my $class = 'LC_left_item';
+    if ($css_class) {
+        $css_class = ' class="'.$css_class.'"';
+    }
+    if ($rowid) {
+        $rowid = ' id="'.$rowid.'"';
+    }
+    if ($rowstyle) {
+        $rowstyle = ' style="'.$rowstyle.'"';
+    }
+    my ($output,$description);
+    $description = &mt('Helpdesk requests from: [_1] in this domain (overrides default)',"<b>$typetitle</b>");
+    $output = '<tr'.$css_class.$rowid.$rowstyle.'>'.
+              "<td>$description</td>\n".
+              '<td class="'.$class.'" colspan="2">'.
+              '<fieldset><legend>'.&mt('E-mail recipient(s)').'</legend>'.
+              '<span class="LC_nobreak">';
+    if (ref($contacts) eq 'ARRAY') {
+        foreach my $item (@{$contacts}) {
+            my $check;
+            if (ref($checked) eq 'HASH') {
+               $check = $checked->{$item};
+            }
+            my $title;
+            if (ref($short_titles) eq 'HASH') {
+                $title = $short_titles->{$item};
+            }
+            $output .= '<label>'.
+                       '<input type="checkbox" name="override_'.$type.'"'.$check.
+                       ' value="'.$item.'" />'.$title.'</label> ';
+        }
+    }
+    $output .= '</span><br />'.&mt('Others').':  '.
+               '<input type="text" name="override_'.$type.'_others" '.
+               'value="'.$otheremails.'"  />';
+    my %locchecked;
+    foreach my $loc ('s','b') {
+        if ($includeloc eq $loc) {
+            $locchecked{$loc} = ' checked="checked"';
+            last;
+        }
+    }
+    $output .= '<br />'.&mt('Bcc:').(' 'x6).
+               '<input type="text" name="override_'.$type.'_bcc" '.
+               'value="'.$bccemails.'"  /></fieldset>'.
+               '<fieldset><legend>'.&mt('Optional added text').'</legend>'.
+               &mt('Text automatically added to e-mail:').' '.
+               '<input type="text" name="override_'.$type.'_includestr" value="'.$includestr.'" /><br />'.
+               '<span class="LC_nobreak">'.&mt('Location:').' '.
+               '<label><input type="radio" name="override_'.$type.'_includeloc" value="s"'.$locchecked{'s'}.' />'.&mt('in subject').'</label>'.
+               (' 'x2).
+               '<label><input type="radio" name="override_'.$type.'_includeloc" value="b"'.$locchecked{'b'}.' />'.&mt('in body').'</label>'.
+               '</span></fieldset>'.
+               '</td></tr>'."\n";
+    return $output;
+}
+
 sub contacts_javascript {
     return <<"ENDSCRIPT";
 
@@ -3095,6 +3224,36 @@
     return;
 }
 
+function toggleHelpdeskRow(form,checkbox,target,prefix,docount) {
+    if (form.elements[checkbox].length != undefined) {
+        var count = 0;
+        if (docount) {
+            for (var i=0; i<form.elements[checkbox].length; i++) {
+                if (form.elements[checkbox][i].checked) {
+                    count ++;
+                }
+            }
+        }
+        for (var i=0; i<form.elements[checkbox].length; i++) {
+            var type = form.elements[checkbox][i].value;
+            if (document.getElementById(prefix+type)) {
+                if (form.elements[checkbox][i].checked) {
+                    document.getElementById(prefix+type).style.display = 'table-row';
+                    if (count % 2 == 1) {
+                        document.getElementById(prefix+type).className = target+' LC_odd_row';
+                    } else {
+                        document.getElementById(prefix+type).className = target;
+                    }
+                    count ++;
+                } else {
+                    document.getElementById(prefix+type).style.display = 'none';
+                }
+            }
+        }
+    }
+    return;
+}
+
 // ]]>
 </script>
 
@@ -5293,8 +5452,8 @@
                    'adminemail'      => 'Default Server Admin E-mail address',
                    'errormail'       => 'Error reports to be e-mailed to',
                    'packagesmail'    => 'Package update alerts to be e-mailed to',
-                   'helpdeskmail'    => "Helpdesk requests for this domain's users",
-                   'otherdomsmail'   => 'Helpdesk requests for other (unconfigured) domains',
+                   'helpdeskmail'    => "Helpdesk requests from all users in this domain",
+                   'otherdomsmail'   => 'Helpdesk requests from users in other (unconfigured) domains',
                    'lonstatusmail'   => 'E-mail from nightly status check (warnings/errors)',
                    'requestsmail'    => 'E-mail from course requests requiring approval',
                    'updatesmail'     => 'E-mail from nightly check of LON-CAPA module integrity/updates',
@@ -7617,6 +7776,7 @@
                       statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
                       lockablenames => 'User preference to lock name',
                       selfassign    => 'Self-reportable affiliations',
+                      overrides     => "Override domain's helpdesk settings based on requester's affiliation",
              );
     my $showdom;
     if ($context eq 'cansearch') {
@@ -7663,6 +7823,10 @@
                         if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {
                             $check = ' checked="checked" ';
                         }
+                    } elsif (ref($settings->{$context}) eq 'HASH') {
+                        if (ref($settings->{$context}->{$types->[$i]}) eq 'HASH') {
+                            $check = ' checked="checked" ';
+                        }
                     } elsif ($context eq 'statustocreate') {
                         $check = ' checked="checked" ';
                     }
@@ -7677,29 +7841,38 @@
         $rem = @{$types}%($numinrow);
     }
     my $colsleft = $numinrow - $rem;
-    if ($rem == 0) {
-        $output .= '<tr>';
-    }
-    if ($colsleft > 1) {
-        $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
+    if ($context eq 'overrides') {
+        if ($colsleft > 1) {
+            $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
+        } else {
+            $output .= '<td class="LC_left_item">';
+        }
+        $output .= ' ';
     } else {
-        $output .= '<td class="LC_left_item">';
-    }
-    my $defcheck = ' ';
-    if (ref($settings) eq 'HASH') {  
-        if (ref($settings->{$context}) eq 'ARRAY') {
-            if (grep(/^default$/,@{$settings->{$context}})) {
+        if ($rem == 0) {
+            $output .= '<tr>';
+        }
+        if ($colsleft > 1) {
+            $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
+        } else {
+            $output .= '<td class="LC_left_item">';
+        }
+        my $defcheck = ' ';
+        if (ref($settings) eq 'HASH') {  
+            if (ref($settings->{$context}) eq 'ARRAY') {
+                if (grep(/^default$/,@{$settings->{$context}})) {
+                    $defcheck = ' checked="checked" ';
+                }
+            } elsif ($context eq 'statustocreate') {
                 $defcheck = ' checked="checked" ';
             }
-        } elsif ($context eq 'statustocreate') {
-            $defcheck = ' checked="checked" ';
         }
+        $output .= '<span class="LC_nobreak"><label>'.
+                   '<input type="checkbox" name="'.$context.'" '.
+                   'value="default"'.$defcheck.$onclick.' />'.
+                   $othertitle.'</label></span>';
     }
-    $output .= '<span class="LC_nobreak"><label>'.
-               '<input type="checkbox" name="'.$context.'" '.
-               'value="default"'.$defcheck.$onclick.'/>'.
-               $othertitle.'</label></span></td>'.
-               '</tr></table></td></tr>';
+    $output .= '</td></tr></table></td></tr>';
     return $output;
 }
 
@@ -10331,17 +10504,57 @@
                 my $value = $env{'form.helpform_'.$field};
                 $value =~ s/^\s+|\s+$//g;
                 if (grep(/^\Q$value\E$/,@{$possoptions->{$field}})) {
-                    $contacts_hash{contacts}{'helpform'}{$field} = $value;
+                    $contacts_hash{'contacts'}{'helpform'}{$field} = $value;
                     if ($field eq 'screenshot') {
                         $env{'form.helpform_maxsize'} =~ s/^\s+|\s+$//g;
                         if ($env{'form.helpform_maxsize'} =~ /^\d+\.?\d*$/) {
-                            $contacts_hash{contacts}{'helpform'}{'maxsize'} = $env{'form.helpform_maxsize'};
+                            $contacts_hash{'contacts'}{'helpform'}{'maxsize'} = $env{'form.helpform_maxsize'};
                         }
                     }
                 }
             }
         }
     }
+    my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+    my (@statuses,%usertypeshash, at overrides);
+    if ((ref($types) eq 'ARRAY') && (@{$types} > 0)) {
+        @statuses = @{$types};
+        if (ref($usertypes) eq 'HASH') {
+            %usertypeshash = %{$usertypes};
+        }
+    }
+    if (@statuses) {
+        my @possoverrides = &Apache::loncommon::get_env_multiple('form.overrides');
+        foreach my $type (@possoverrides) {
+            if (($type ne '') && (grep(/^\Q$type\E$/, at statuses))) {
+                push(@overrides,$type);
+            }
+        }
+        if (@overrides) {
+            foreach my $type (@overrides) {
+                my @standard = &Apache::loncommon::get_env_multiple('form.override_'.$type);
+                foreach my $item (@contacts) {
+                    if (grep(/^\Q$item\E$/, at standard)) {
+                        $contacts_hash{'contacts'}{'overrides'}{$type}{$item} = 1;
+                        $newsetting{'override_'.$type}{$item} = 1;
+                    } else {
+                        $contacts_hash{'contacts'}{'overrides'}{$type}{$item} = 0;
+                        $newsetting{'override_'.$type}{$item} = 0;
+                    }
+                }
+                $contacts_hash{'contacts'}{'overrides'}{$type}{'others'} = $env{'form.override_'.$type.'_others'};
+                $contacts_hash{'contacts'}{'overrides'}{$type}{'bcc'} = $env{'form.override_'.$type.'_bcc'};
+                $newsetting{'override_'.$type}{'others'} = $env{'form.override_'.$type.'_others'};
+                $newsetting{'override_'.$type}{'bcc'} = $env{'form.override_'.$type.'_bcc'};
+                if (($env{'form.override_'.$type.'_includestr'} ne '') && ($env{'form.override_'.$type.'_includeloc'} =~ /^s|b$/)) {
+                    $includestr{$type} = $env{'form.override_'.$type.'_includestr'};
+                    $includeloc{$type} = $env{'form.override_'.$type.'_includeloc'};
+                    $contacts_hash{'contacts'}{'overrides'}{$type}{'include'} = $includeloc{$type}.':'.&escape($includestr{$type});
+                    $newsetting{'override_'.$type}{'include'} = $contacts_hash{'contacts'}{'overrides'}{$type}{'include'};
+                }
+            }    
+        }
+    }
     if (keys(%currsetting) > 0) {
         foreach my $item (@contacts) {
             if ($to{$item} ne $currsetting{$item}) {
@@ -10396,6 +10609,33 @@
                 }
             }
         }
+        if (@statuses) {
+            if (ref($currsetting{'overrides'}) eq 'HASH') {
+                foreach my $key (keys(%{$currsetting{'overrides'}})) {
+                    if (ref($currsetting{'overrides'}{$key}) eq 'HASH') {
+                        if (ref($newsetting{'override_'.$key}) eq 'HASH') {
+                            foreach my $item (@contacts,'bcc','others','include') {
+                                if ($currsetting{'overrides'}{$key}{$item} ne $newsetting{'override_'.$key}{$item}) {
+                                    push(@{$changes{'overrides'}},$key);
+                                    last;
+                                }
+                            }
+                        } else {
+                            push(@{$changes{'overrides'}},$key);
+                        }
+                    }
+                }
+                foreach my $key (@overrides) {
+                    unless (exists($currsetting{'overrides'}{$key})) {
+                        push(@{$changes{'overrides'}},$key);
+                    }
+                }
+            } else {
+                foreach my $key (@overrides) {
+                    push(@{$changes{'overrides'}},$key);
+                }
+            }
+        }
     } else {
         my %default;
         $default{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
@@ -10511,6 +10751,60 @@
                     $resulttext .= '</li>';
                 }
             }
+            if (ref($changes{'overrides'}) eq 'ARRAY') {
+                my @deletions;
+                foreach my $type (@{$changes{'overrides'}}) {
+                    if ($usertypeshash{$type}) {
+                        if (grep(/^\Q$type\E/, at overrides)) {
+                            $resulttext .= '<li>'.&mt("Overrides based on requester's affiliation set for [_1]",
+                                                      $usertypeshash{$type}).'<ul><li>';
+                            if (ref($newsetting{'override_'.$type}) eq 'HASH') {
+                                my @text;
+                                foreach my $item (@contacts) {
+                                    if ($newsetting{'override_'.$type}{$item}) {
+                                        push(@text,$short_titles->{$item});
+                                    }
+                                }
+                                if ($newsetting{'override_'.$type}{'others'} ne '') {
+                                    push(@text,$newsetting{'override_'.$type}{'others'});
+                                }
+
+                                if (@text) {
+                                    $resulttext .= &mt('Helpdesk e-mail sent to: [_1]',
+                                                       '<span class="LC_cusr_emph">'.join(', ', at text).'</span>');
+                                }
+                                if ($newsetting{'override_'.$type}{'bcc'} ne '') {
+                                    my $bcctext;
+                                    if (@text) {
+                                        $bcctext = ' '.&mt('with Bcc to');
+                                    } else {
+                                        $bcctext = '(Bcc)';
+                                    }
+                                    $resulttext .= $bcctext.': <span class="LC_cusr_emph">'.$newsetting{'override_'.$type}{'bcc'}.'</span>';
+                                } elsif (!@text) {
+                                     $resulttext .= &mt('Helpdesk e-mail sent to no one');
+                                }
+                                $resulttext .= '</li>';
+                                if ($newsetting{'override_'.$type}{'include'} ne '') {
+                                    my ($loc,$str) = split(/:/,$newsetting{'override_'.$type}{'include'});
+                                    if ($loc eq 'b') {
+                                        $resulttext .= '<li>'.&mt('Text automatically added to e-mail body:').' '.&unescape($str).'</li>';
+                                    } elsif ($loc eq 's') {
+                                        $resulttext .= '<li>'.&mt('Text automatically added to e-mail subject:').' '.&unescape($str).'</li>';
+                                    }
+                                }
+                            }
+                            $resulttext .= '</li></ul></li>';
+                        } else {
+                            push(@deletions,$usertypeshash{$type});
+                        }
+                    }
+                }
+                if (@deletions) {
+                    $resulttext .= '<li>'.&mt("Overrides based on requester's affiliation discontinued for: [_1]",
+                                              join(', ', at deletions)).'</li>';
+                }
+            }
             my @offon = ('off','on');
             if ($changes{'reporterrors'}) {
                 $resulttext .= '<li>'.
@@ -10566,7 +10860,6 @@
                                    &mt('Max size for file uploaded to help form by logged-in user set to [_1] MB.',
                                        $contacts_hash{'contacts'}{'helpform'}{'maxsize'}).
                                    '</li>';
-
                 }
             }
             $resulttext .= '</ul>';


More information about the LON-CAPA-cvs mailing list