--- loncom/interface/lonconfigsettings.pm	2009/04/26 00:09:53	1.3
+++ loncom/interface/lonconfigsettings.pm	2024/07/03 16:35:11	1.21.4.14
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: lonconfigsettings.pm,v 1.3 2009/04/26 00:09:53 raeburn Exp $
+# $Id: lonconfigsettings.pm,v 1.21.4.14 2024/07/03 16:35:11 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -35,20 +35,94 @@ use Apache::lonnet;
 use Apache::loncommon();
 use Apache::lonhtmlcommon();
 use Apache::lonlocal;
+use Apache::courseclassifier();
+use LONCAPA qw(:DEFAULT :match);
 
 sub print_header {
-    my ($r,$phase,$context,$jscript) = @_;
-    my ($pagetitle,$brcrumtitle,$action);
+    my ($r,$phase,$context,$jscript,$container,$instcode,$dom) = @_;
+    my ($pagetitle,$brcrumtitle,$action,$call_category_check,$instcode_check,
+        $crstype,@actions,@code_order);
+    if ($phase eq 'display') {
+        @actions = &Apache::loncommon::get_env_multiple('form.actions');
+    }
     if ($context eq 'domain') {
-        ($pagetitle, $brcrumtitle) = ('View/Modify Domain Settings','Domain Settings');
+        ($pagetitle, $brcrumtitle) = ('View/Modify Domain Settings','View/Modify Domain Settings');
         $action = '/adm/domainprefs';
+        if ($phase eq 'display') {
+            if (grep(/^coursecategories$/,@actions)) {
+                $call_category_check = qq|
+    if (formname == document.display) {
+        if (!categoryCheck(formname)) {
+            return;
+        }
+    }
+|;
+            }
+        }
     } else {
-        ($pagetitle, $brcrumtitle) = ('Course Configuration','Course Configuration');
+        $crstype = &Apache::loncommon::course_type();
+        if ($crstype eq 'Community') {
+            ($pagetitle,$brcrumtitle) = ('Community Configuration','Community Configuration');
+        } else {
+            ($pagetitle,$brcrumtitle) = ('Course Configuration','Course Configuration');
+        }
         $action = '/adm/courseprefs';
+        if ($phase eq 'display') {
+            if (grep(/^courseinfo$/,@actions)) {
+                my %codedefaults;
+                &Apache::lonnet::auto_instcode_defaults($env{'request.role.domain'},\%codedefaults,
+                                                        \@code_order);
+                if (@code_order) {
+                   my $noinstcodestr = &mt('You indicated cloning based on category, but did not select any categories.');
+                   &js_escape(\$noinstcodestr);
+                   $instcode_check = <<"ENDSCRIPT";
+    if (formname == document.display) {
+        if (formname.cloners_instcode.length) {
+            for (var j=0; j<formname.cloners_instcode.length; j++) {
+                if (formname.cloners_instcode[j].checked) {
+                    if (formname.cloners_instcode[j].value == 1) {
+                        var codes;
+                        if (document.getElementsByClassName) {
+                            codes = document.getElementsByClassName('LC_cloners_instcodes');
+                        } else {
+                            codes = getElementsByClassName(document.body,'LC_cloners_instcodes');
+                        }
+                        if (codes.length) {
+                            var gotcode = 0;
+                            for (var i=0; i<codes.length; i++) {
+                                if (codes[i].selectedIndex != 0) {
+                                     gotcode = 1;
+                                     break;
+                                }
+                            }
+                            if (!gotcode) {
+                                for (var k=0; k<formname.cloners_instcode.length; k++) {
+                                    if (formname.cloners_instcode[k].value == 0) {
+                                        formname.cloners_instcode[k].checked = true;
+                                    }
+                                }
+                                toggleCloners(document.display.cloners_instcode);
+                                alert('$noinstcodestr');
+                                return false;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+ENDSCRIPT
+                }
+            }
+        }
     }
     my $alert = &mt('You must select at least one functionality type to display.');
+    &js_escape(\$alert);
     my $js = '
 <script type="text/javascript">
+// <![CDATA[
+
 function changePage(formname,newphase) {
     formname.phase.value = newphase;
     numchecked = 0;
@@ -71,16 +145,20 @@ function changePage(formname,newphase) {
             return;
         }
     }
+    '.$instcode_check.$call_category_check.'
     formname.submit();
 }'."\n";
     if ($phase eq 'pickactions') {
+        $js .= &Apache::lonhtmlcommon::color_picker();
         $js .=
-            &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox',numcols => 'radio',})."\n".
-            &javascript_set_colnums();
+            &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox'})."\n";
     } elsif ($phase eq 'display') {
+        $js .= &Apache::lonhtmlcommon::color_picker();
         $js .= &color_pick_js()."\n";
     }
     $js .= &Apache::loncommon::viewport_size_js().'
+
+// ]]>
 </script>
 ';
     if ($jscript) {
@@ -93,14 +171,90 @@ $jscript
     my $additem;
     if ($phase eq 'pickactions') {
         my %loaditems = (
-                    'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",
-                        );
-        $additem = {'add_entries' => \%loaditems,};
-    } else {
-        my %loaditems = (
-                    'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);",
+                    'onload' => "setFormElements(document.pickactions);",
                         );
         $additem = {'add_entries' => \%loaditems,};
+    } elsif ($phase eq 'display') {
+        if ($context eq 'domain') {
+            my $onload;
+            if (grep(/^coursedefaults$/,@actions)) {
+                $onload = "toggleDisplay(document.display,'cloneinstcode');".
+                          "toggleDisplay(document.display,'credits');".
+                          "toggleDisplay(document.display,'studentsubmission');";
+            }
+            if (grep(/^selfcreation$/,@actions)) {
+                my $prefix = 'cancreate_emailverified';
+                my $customclass = 'LC_selfcreate_email';
+                my $classprefix = 'LC_canmodify_emailusername_';
+                my $optionsprefix = 'LC_options_emailusername_';
+                $onload .= "toggleRows(document.display,'cancreate_email','selfassign','$customclass','$classprefix','$optionsprefix');";
+                my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+                my $hascustom;
+                my ($emailrules,$emailruleorder) = &Apache::lonnet::inst_userrules($dom,'email');
+                if (ref($emailrules) eq 'HASH') {
+                    if (keys(%{$emailrules}) > 0) {
+                        $hascustom = 'cancreate_emailrule';
+                    }
+                }
+                my @posstypes;
+                if (ref($types) eq 'ARRAY') {
+                    @posstypes = @{$types};
+                    push(@posstypes,'default');
+                    foreach my $type (@posstypes) {
+                        $onload .= "toggleEmailOptions(document.display,'cancreate_emailoptions','$hascustom',".
+                                                               "'cancreate_emaildomain','$type');";
+                    }
+                } else {
+                    $onload .= "toggleEmailOptions(document.display,'cancreate_emailoptions','$hascustom',".
+                                                       "'cancreate_emaildomain','default');";
+                }
+            }
+            if (grep(/^contacts$/,@actions)) {
+                my $customclass = 'LC_helpdesk_override';
+                my $optionsprefix = 'LC_options_helpdesk_';
+                $onload .= "toggleHelpdeskRow(document.display,'overrides','$customclass','$optionsprefix');";
+            }
+            if (grep(/^wafproxy$/,@actions)) {
+                $onload .= "toggleWAF();checkWAF();updateWAF();";
+            }
+            if (grep(/^scantron$/,@actions)) {
+                $onload .= "toggleScantron(document.display);";
+            }
+            if (grep(/^autoupdate$/,@actions)) {
+                $onload .= "toggleLastActiveDays(document.display);";
+            }
+            if (grep(/^autoenroll$/,@actions)) {
+                $onload .= "toggleFailsafe(document.display);";
+            }
+            if (grep(/^login$/,@actions)) {
+                my %domservers = &Apache::lonnet::get_servers($dom);
+                foreach my $server (sort(keys(%domservers))) {
+                    $onload .= "toggleSamlOptions(document.display,'$server');";
+                }
+            }
+            if ($onload) {
+                my %loaditems = (
+                                  'onload' => $onload,
+                                );
+                $additem = {'add_entries' => \%loaditems,};
+            }
+        } elsif ($context eq 'course') {
+            my $onload;
+            if (grep(/^courseinfo$/,@actions)) {
+                if (@code_order) {
+                    $onload = "courseSet('','load');toggleCloners(document.display.cloners_instcode);";
+                }
+            }
+            if (grep(/^grading$/,@actions)) {
+                $onload .= 'toggleGrading(document.display);toggleHiddenTotalsSec(document.display);';
+            }
+            if ($onload) {
+                my %loaditems = (
+                                  'onload' => $onload,
+                                );
+                $additem = {'add_entries' => \%loaditems,};
+            }
+        }
     }
     $r->print(&Apache::loncommon::start_page($pagetitle,$js,$additem));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs($brcrumtitle));
@@ -117,24 +271,24 @@ $jscript
 }
 
 sub print_footer {
-    my ($r,$phase,$newphase,$button_text,$actions) = @_;
+    my ($r,$phase,$newphase,$button_text,$actions,$container,$parm_permission) = @_;
     $button_text = &mt($button_text);
-    $r->print('<input type="hidden" name="phase" value="" />'.
-              '<input type="hidden" name="width" value="'.
-              $env{'form.width'}.'" />'.
-              '<input type="hidden" name="height" value="'.
-              $env{'form.height'}.'" />');
+    $r->print('<input type="hidden" name="phase" value="" />');
+    if (defined($env{'form.origin'})) {
+        $r->print('<input type="hidden" name="origin" value="'.$env{'form.origin'}.'" />'."\n");
+    }
     if (($phase eq 'display') || ($phase eq 'process')) {
         if (ref($actions) eq 'ARRAY') {
             foreach my $item (@{$actions}) {
-                $r->print('<input type="hidden" name="actions" value="'.$item.'" />')."\n";
+                $r->print('<input type="hidden" name="actions" value="'.$item.'" />'."\n");
             }
         }
-        $r->print('<input type="hidden" name="numcols" value="'.$env{'form.numcols'}.'" />');
     }
     my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
     if ($phase eq 'process') {
-        $r->print('<p><a href='.$dest.'>'.$button_text.'</a></p>');
+        $r->print(
+            &Apache::lonhtmlcommon::actionbox(
+                ['<a href='.$dest.'>'.$button_text.'</a>']));
     } else {
         my $onclick;
         if ($phase eq 'display') {
@@ -142,118 +296,177 @@ sub print_footer {
         } else {
             $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
         }
-        $r->print('<p><input type="button" name="store" value="'.
-                  $button_text.'" onclick='.$onclick.' /></p>');
+        my $showbutton = 1;
+        if (ref($parm_permission) eq 'HASH') {
+            unless (($parm_permission->{'process'}) || ($newphase eq 'display')) {
+                $showbutton = 0;
+            }
+        }
+        if ($showbutton) {
+            $r->print('<p><input type="button" name="store" value="'.
+                      $button_text.'" onclick='.$onclick.' /></p>');
+        }
     }
     if ($phase eq 'process') {
-        $r->print('</form>'.&Apache::loncommon::end_page());
+        $r->print('</form>');
+        $r->print(&Apache::loncommon::end_page());
     }
     return;
 }
 
 sub make_changes {
-    my ($r,$dom,$phase,$context,$prefs_order,$prefs,$values,$confname,$roles) = @_;
+    my ($r,$dom,$phase,$context,$prefs_order,$prefs,$values,$confname,$roles,
+        $allitems,$container,$parm_permission) = @_;
     my %brcrumtext = &get_crumb_text();
     my @actions = &Apache::loncommon::get_env_multiple('form.actions');
+    my ($numchanged,%changes,%disallowed);
     &Apache::lonhtmlcommon::add_breadcrumb
       ({href=>"javascript:changePage(document.$phase,'display')",
         text=>$brcrumtext{$context}},
        {href=>"javascript:changePage(document.$phase,'$phase')",
         text=>"Updated"});
-    &print_header($r,$phase,$context);
+    &print_header($r,$phase,$context,undef,$container);
+    my ($crstype,%lastact,$errors);
+    if ($context eq 'course') {
+        $crstype = &Apache::loncommon::course_type();
+    }
     if ((ref($prefs_order) eq 'ARRAY') && (ref($prefs) eq 'HASH') && 
         (ref($prefs) eq 'HASH')) {
         foreach my $item (@{$prefs_order}) {
             if (grep(/^\Q$item\E$/,@actions)) {
-                $r->print('<h3>'.&mt($prefs->{$item}{'text'}).'</h3>');
                 if ($context eq 'domain') {
-                    $r->print(&Apache::domainprefs::process_changes($r,$dom,$confname,$item,$roles,$values));
+                    $r->print('<h3>'.&mt($prefs->{$item}{'text'}).'</h3>'.
+                              &Apache::domainprefs::process_changes($r,$dom,
+                                          $confname,$item,$roles,$values,\%lastact));
                 } else {
-                    $r->print(&Apache::courseprefs::process_changes($r,$dom,$item,$values));
+                    $changes{$item} = {};
+                    $errors =
+                        &Apache::courseprefs::process_changes($dom,$item,$values,
+                                                              $prefs->{$item},$changes{$item},
+                                                              $allitems,\%disallowed,$crstype);
+                    if (keys(%{$changes{$item}}) > 0) {
+                        $numchanged ++;
+                    }
+                }
+            }
+        }
+    }
+    if ($context eq 'course') {
+        if ($numchanged) {
+            my $message = &Apache::courseprefs::store_changes($dom,$confname,$prefs_order,\@actions,
+                                                          $prefs,$values,\%changes,$crstype);
+            $r->print(&Apache::loncommon::confirmwrapper($message));
+        } else {
+            if ($crstype eq 'Community') {
+                $r->print(&Apache::loncommon::confirmwrapper(&mt("No changes made to community configuration.")));
+            } else {
+                $r->print(&Apache::loncommon::confirmwrapper(&mt("No changes made to course configuration.")));
+            }
+        }
+        if (keys(%disallowed) > 0) {
+            $r->print('<p>');
+            foreach my $item ('cloners','rolenames','feedback','discussion','localization') {
+                if (ref($disallowed{$item}) eq 'HASH') {
+                    if (keys(%{$disallowed{$item}}) > 0) {
+                        $r->print(&Apache::courseprefs::display_disallowed($item,$disallowed{$item},
+                                                                           $prefs,$crstype));
+                    }
                 }
             }
+            $r->print('</p>');
+        }
+        if ($errors) {
+            $r->print('<p>'.$errors.'</p>');
         }
     }
     $r->print('<p>');
-    &print_footer($r,$phase,'display','Back to configuration display',\@actions);
+    my $footer_text = 'Back to configuration display';
+    if ($context eq 'course') {
+        $footer_text = 'Back to display/edit settings'; 
+    }
+    &print_footer($r,$phase,'display',$footer_text,\@actions,$container,$parm_permission);
     $r->print('</p>');
+    return \%lastact;
 }
 
 sub display_settings {
     my ($r,$dom,$phase,$context,$prefs_order,$prefs,$values,$confname,$jscript,
-        $allitems) = @_;
+        $allitems,$crstype,$container,$parm_permission) = @_;
     my %brcrumtext = &get_crumb_text();
     my @actions = &Apache::loncommon::get_env_multiple('form.actions');
     &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"javascript:changePage(document.$phase,'display')",
-          text=>"Course Settings"});
-    &print_header($r,$phase,$context,$jscript);
+          text=>"Display/Edit Settings"});
+    my $instcode;
+    if (ref($values) eq 'HASH') {
+        $instcode = $values->{'internal.coursecode'};
+    }
+    &print_header($r,$phase,$context,$jscript,$container,$instcode,$dom);
+    my $divwidth = 900;
     if ((ref($prefs_order) eq 'ARRAY') && (ref($prefs) eq 'HASH') && (ref($values) eq 'HASH')) { 
         if (@actions > 0) {
             my $rowsum = 0;
             my (%output,%rowtotal,@items);
-            my $halfway = @actions/2;
             foreach my $item (@{$prefs_order}) {
                 if (grep(/^\Q$item\E$/,@actions)) {
                     push(@items,$item);
                     if ($context eq 'domain') {
+                        my $settings;
+                        if (ref($values) eq 'HASH') {
+                            $settings = $values->{$item};
+                        }
+                        if ($item eq 'usersessions') {
+                            $r->print('<script type="text/javascript">'."\n".
+                                      '// <![CDATA['."\n".
+                                      &Apache::loncommon::check_uncheck_jscript()."\n".
+                                      '// ]]>'."\n".
+                                      '</script>'."\n");
+                        } elsif ($item eq 'selfcreation') {
+                            if (ref($values) eq 'HASH') {
+                                $settings = $values->{'usercreation'};
+                            }
+                        } elsif ($item eq 'defaults') {
+                            if (ref($values->{'inststatus'}) eq 'HASH') {
+                                if (ref($values->{'defaults'}) eq 'HASH') {
+                                    $settings = {%{$values->{'inststatus'}},%{$values->{'defaults'}}};
+                                } else {
+                                    $settings = $values->{'inststatus'};
+                                }
+                            } else {
+                                my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+                                my $inststatus = {
+                                                   inststatustypes => $usertypes,
+                                                   inststatusorder => $types,
+                                                   inststatusguest => [],
+                                                 };
+                                if (ref($values->{defaults}) eq 'HASH') {
+                                    $settings = {%{$inststatus},%{$values->{'defaults'}}};
+                                } else {
+                                    $settings = $inststatus;
+                                }
+                            }
+                        }
                         ($output{$item},$rowtotal{$item}) =
                             &Apache::domainprefs::print_config_box($r,$dom,$confname,
-                                $phase,$item,$prefs->{$item},$values->{$item});
+                                $phase,$item,$prefs->{$item},$settings);
                     } else {
                         ($output{$item},$rowtotal{$item}) =
                             &Apache::courseprefs::print_config_box($r,$dom,$phase,
-                                $item,$prefs->{$item},$values,$allitems);
+                                $item,$prefs->{$item},$values,$allitems,$crstype,$parm_permission);
                     }
                     $rowsum += $rowtotal{$item};
                 }
             }
-            my $colend;
-            my $halfway = $rowsum/2;
-            my $aggregate = 0;
-            my $sumleft = 0;
-            my $sumright = 0;
-            my $crossover;
+            $r->print('<div id="prefs" style="max-width:'.$divwidth.'px;margin: 10px auto 10px auto;">');
             for (my $i=0; $i<@items; $i++) {
-                $aggregate += $rowtotal{$items[$i]};
-                if ($aggregate > $halfway) {
-                    $crossover = $i;
-                    last;
-                }
-            }
-            for (my $i=0; $i<$crossover; $i++) {
-                $sumleft += $rowtotal{$items[$i]};
-            }
-            for (my $i=$crossover+1; $i<@items; $i++) {
-                $sumright += $rowtotal{$items[$i]};
-            }
-            if ((@items > 1) && ($env{'form.numcols'} == 2)) {
-                my $sumdiff = $sumright - $sumleft;
-                if ($sumdiff > 0) {
-                    $colend = $crossover + 1;
-                } else {
-                    $colend = $crossover;
-                }
-            } else {
-                $colend = @items;
-            }
-            $r->print('<p><table class="LC_double_column"><tr><td class="LC_left_col">');            for (my $i=0; $i<$colend; $i++) {
                 $r->print($output{$items[$i]});
             }
-            $r->print('</td><td></td><td class="LC_right_col">');
-            if ($colend < @items) {
-                for (my $i=$colend; $i<@items; $i++) {
-                    $r->print($output{$items[$i]});
-                }
-            }
-            $r->print('</td></tr></table></p>');
-            $r->print(&print_footer($r,$phase,'process','Save',\@actions));
+            $r->print('</div>');
+            $r->print(&print_footer($r,$phase,'process','Save Changes',\@actions,$container,$parm_permission));
         } else {
             $r->print('<input type="hidden" name="phase" value="" />'.
-                  '<input type="hidden" name="numcols" value="'.
-                  $env{'form.numcols'}.'" />'."\n".
-                  '<span class="LC_error">'.&mt('No settings chosen').
-                  '</span>');
+                      '<span class="LC_error">'.&mt('No settings chosen').
+                      '</span>');
         }
         $r->print('</form>');
     }
@@ -262,29 +475,42 @@ sub display_settings {
 }
 
 sub display_choices {
-    my ($r,$phase,$context,$prefs_order,$prefs) = @_;
+    my ($r,$phase,$context,$prefs_order,$prefs,$container,$parm_permission) = @_;
     if ($phase eq '') {
         $phase = 'pickactions';
     }
     my %helphash;
-    &print_header($r,$phase,$context);
-    $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');
+    &print_header($r,$phase,$context,undef,$container);
     $r->print('<script type="text/javascript">'."\n".
+              '// <![CDATA['."\n".
               &Apache::loncommon::check_uncheck_jscript()."\n".
-              '</script>'."\n".'<p><input type="button" value="'.&mt('check all').'" '.
+              '// ]]>'."\n".
+              '</script>'."\n");
+    my $heading = &mt('Settings to display/modify');
+    if (ref($parm_permission) eq 'HASH') {
+        unless ($parm_permission->{'process'}) {
+            $heading = &mt('Settings to display');
+        }
+    }
+    $r->print('<h3>'.$heading.'</h3>'.
+              '<div><input type="button" value="'.&mt('check all').'" '.
               'onclick="javascript:checkAll(document.pickactions.actions)"'.
               ' />'.('&nbsp;'x2).
               '<input type="button" value="'.&mt('uncheck all').'" '.
-              'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
-              ' /></p><div class="LC_left_float">');
-    my ($numitems,$midpoint,$seconddiv,$count);
+              'onclick="javascript:uncheckAll(document.pickactions.actions)" />'.
+              "\n".
+              '</div><div class="LC_left_float">');
+    my ($numitems,$maxincol,$firstthird,$secondthird,$seconddiv,$thirddiv,$count);
     if (ref($prefs_order) eq 'ARRAY') {
         $numitems = @{$prefs_order};
     }
-    $midpoint = int($numitems/2);
-    if ($numitems%2) {
-        $midpoint ++;
+    my $numcols = 3;
+    $maxincol = int($numitems/$numcols);
+    if ($numitems%$numcols) {
+        $maxincol ++;
     }
+    $firstthird = $maxincol;
+    $secondthird = $firstthird + $maxincol;
     $count = 0;
     if ((ref($prefs_order) eq 'ARRAY') && (ref($prefs) eq 'HASH')) {
         foreach my $item (@{$prefs_order}) {
@@ -293,49 +519,31 @@ sub display_choices {
                       '<label><input type="checkbox" name="actions" value="'.$item.
                       '" />&nbsp;'.&mt($prefs->{$item}->{'text'}).'</label></h4>');
             $count ++;
-            if ((!$seconddiv) && ($count >= $midpoint)) {
+            if ((!$seconddiv) && ($count >= $firstthird)) {
                 $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");
                 $seconddiv = 1;
             }
+            if ((!$thirddiv) && ($count >= $secondthird)) {
+                $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");
+                $thirddiv = 1;
+            }
         }
-        $r->print('</div><div class="LC_clear_float_footer"></div><h3>'.
-                  &mt('Display options').'</h3>'."\n".
-                  '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".
-                  '<label><input type="radio" name="numcols" value="1" />'.
-                  &mt('one column').'</label>&nbsp;&nbsp;<label>'.
-                  '<input type="radio" name="numcols" value="2" />'.
-                  &mt('two columns').'</label></span></p>');
     }
-    $r->print(&print_footer($r,$phase,'display','Go'));
+    $r->print('</div><div style="padding:0;clear:both;margin:0;border:0"></div>');
+    $r->print(&print_footer($r,$phase,'display','Display',undef,$container,$parm_permission));
     $r->print('</form>');
     $r->print(&Apache::loncommon::end_page());
     return;
 }
 
-sub javascript_set_colnums {
-    return <<END;
-function setDisplayColumns() {
-    if (document.pickactions.width.value > 1100) {
-        document.pickactions.numcols[1].checked = true;
-    } else {
-        document.pickactions.numcols[0].checked = true;
-    }
-}
-END
-}
-
 sub color_pick_js {
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $output = <<"ENDCOL";
-    function pclose() {
-        parmwin=window.open("/adm/rat/empty.html","LONCAPAparms","height=350,width=350,scrollbars=no,menubar=no");
-        parmwin.close();
-    }
 
     $pjump_def
 
     function psub() {
-        pclose();
+        modalWindow.close();
         if (document.parmform.pres_marker.value!='') {
             if (document.parmform.pres_type.value!='') {
                 eval('document.display.'+
@@ -373,7 +581,7 @@ ENDCOL
 sub get_crumb_text {
     my %brcrumbtext = (
                        domain => 'Domain Settings',
-                       course => 'Course Settings',
+                       course => 'Display/Edit Settings',
                      );
     return %brcrumbtext;
 }