Diff for /loncom/interface/lonparmset.pm between versions 1.420 and 1.471

version 1.420, 2009/01/15 18:31:11 version 1.471, 2009/09/03 16:58:17
Line 214  Variables used (guessed by Jeremy): Line 214  Variables used (guessed by Jeremy):
         When storing information, store as part 0          When storing information, store as part 0
         When requesting information, request from full part          When requesting information, request from full part
   
 =item crsenv()  
   
 Show and set course data and parameters.  This is a large routine that should  
 be simplified and shortened... someday.  
   
 Inputs: $r  
   
 Returns: nothing  
   
 =item can_modify_catsettings()  
   
 =item assign_course_categories()  
   
 =item tablestart()  =item tablestart()
   
 =item tableend()  =item tableend()
Line 322  Set portfolio metadata Line 309  Set portfolio metadata
   
 =item handler() :   =item handler() : 
   
 Main handler.  Calls &assessparms and &crsenv subroutines.  Main handler.  Calls &assessparms subroutine.
   
   
 =back  =back
Line 366  sub parmval_by_symb { Line 353  sub parmval_by_symb {
     my $result='';      my $result='';
     my @outpar=();      my @outpar=();
 # ----------------------------------------------------- Cascading lookup scheme  # ----------------------------------------------------- Cascading lookup scheme
     my $map=(&Apache::lonnet::decode_symb($symb))[0];          my $map=(&Apache::lonnet::decode_symb($symb))[0];
     $map = &Apache::lonnet::deversion($map);      $map = &Apache::lonnet::deversion($map);
   
     my $symbparm=$symb.'.'.$what;      my $symbparm=$symb.'.'.$what;
Line 468  sub parmval_by_symb { Line 455  sub parmval_by_symb {
   
 # --- Caches local to lonparmset  # --- Caches local to lonparmset
   
       
 sub reset_caches {  sub reset_caches {
     &resetparmhash();      &resetparmhash();
     &resetsymbcache();      &resetsymbcache();
Line 482  sub reset_caches { Line 469  sub reset_caches {
  undef($parmhashid);   undef($parmhashid);
  undef(%parmhash);   undef(%parmhash);
     }      }
       
     sub cacheparmhash {      sub cacheparmhash {
  if ($parmhashid eq  $env{'request.course.fn'}) { return; }   if ($parmhashid eq  $env{'request.course.fn'}) { return; }
  my %parmhashfile;   my %parmhashfile;
Line 493  sub reset_caches { Line 480  sub reset_caches {
     $parmhashid=$env{'request.course.fn'};      $parmhashid=$env{'request.course.fn'};
  }   }
     }      }
    
     sub parmhash {      sub parmhash {
  my ($id) = @_;   my ($id) = @_;
  &cacheparmhash();   &cacheparmhash();
Line 501  sub reset_caches { Line 488  sub reset_caches {
     }      }
  }   }
   
 {     {
     my $symbsid;      my $symbsid;
     my %symbs;      my %symbs;
     sub resetsymbcache {      sub resetsymbcache {
  undef($symbsid);   undef($symbsid);
  undef(%symbs);   undef(%symbs);
     }      }
       
     sub symbcache {      sub symbcache {
  my $id=shift;   my $id=shift;
  if ($symbsid ne $env{'request.course.id'}) {   if ($symbsid ne $env{'request.course.id'}) {
Line 529  sub reset_caches { Line 516  sub reset_caches {
     }      }
  }   }
   
 {     {
     my $rulesid;      my $rulesid;
     my %rules;      my %rules;
     sub resetrulescache {      sub resetrulescache {
  undef($rulesid);   undef($rulesid);
  undef(%rules);   undef(%rules);
     }      }
       
     sub rulescache {      sub rulescache {
  my $id=shift;   my $id=shift;
  if ($rulesid ne $env{'request.course.id'}   if ($rulesid ne $env{'request.course.id'}
Line 683  sub storeparm_by_symb_inner { Line 670  sub storeparm_by_symb_inner {
     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;      my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
 # ---------------------------------------------------------- Construct prefixes  # ---------------------------------------------------------- Construct prefixes
     $spnam=~s/\_([^\_]+)$/\.$1/;      $spnam=~s/\_([^\_]+)$/\.$1/;
     my $map=(&Apache::lonnet::decode_symb($symb))[0];          my $map=(&Apache::lonnet::decode_symb($symb))[0];
     $map = &Apache::lonnet::deversion($map);      $map = &Apache::lonnet::deversion($map);
   
     my $symbparm=$symb.'.'.$spnam;      my $symbparm=$symb.'.'.$spnam;
Line 696  sub storeparm_by_symb_inner { Line 683  sub storeparm_by_symb_inner {
     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;      my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;      my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;      my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
       
     my $courselevel=$env{'request.course.id'}.'.'.$spnam;      my $courselevel=$env{'request.course.id'}.'.'.$spnam;
     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;      my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;      my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
       
     my $storeunder='';      my $storeunder='';
     if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }      if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
     if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }      if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
Line 712  sub storeparm_by_symb_inner { Line 699  sub storeparm_by_symb_inner {
     if ($snum==5) { $storeunder=$grplevelm; }      if ($snum==5) { $storeunder=$grplevelm; }
     if ($snum==4) { $storeunder=$grplevelr; }      if ($snum==4) { $storeunder=$grplevelr; }
   
       
     my $delete;      my $delete;
     if ($nval eq '') { $delete=1;}      if ($nval eq '') { $delete=1;}
     my %storecontent = ($storeunder         => $nval,      my %storecontent = ($storeunder         => $nval,
Line 769  sub storeparm_by_symb_inner { Line 756  sub storeparm_by_symb_inner {
  }   }
  &Apache::lonnet::devalidateuserresdata($uname,$udom);   &Apache::lonnet::devalidateuserresdata($uname,$udom);
     }      }
       
     if ($reply=~/^error\:(.*)/) {      if ($reply=~/^error\:(.*)/) {
  return "<span class=\"LC_error\">Write Error: $1</span>";   return "<span class=\"LC_error\">Write Error: $1</span>";
     }      }
Line 848  sub plink { Line 835  sub plink {
     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);      my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
     unless (defined($winvalue)) { $winvalue=$val; }      unless (defined($winvalue)) { $winvalue=$val; }
     my $valout = &valout($value,$type,1);      my $valout = &valout($value,$type,1);
       my $unencmarker = $marker;
     foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,      foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
       \$hour, \$min, \$sec) {        \$hour, \$min, \$sec) {
  $$item = &HTML::Entities::encode($$item,'"<>&');   $$item = &HTML::Entities::encode($$item,'"<>&');
  $$item =~ s/\'/\\\'/g;   $$item =~ s/\'/\\\'/g;
     }      }
     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$marker.'" /></td></tr><tr><td align="center">'.      return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
  '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"   '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
     .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.      .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
     $valout.'</a></td></tr></table>';      $valout.'</a></td></tr></table>';
Line 866  sub page_js { Line 854  sub page_js {
   
     return(<<ENDJS);      return(<<ENDJS);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
     function pclose() {      function pclose() {
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",          parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                  "height=350,width=350,scrollbars=no,menubar=no");                   "height=350,width=350,scrollbars=no,menubar=no");
Line 905  sub page_js { Line 893  sub page_js {
         var newWin = window.open(url, wdwName, options);          var newWin = window.open(url, wdwName, options);
         newWin.focus();          newWin.focus();
     }      }
   // ]]>
 </script>  </script>
 $selscript  $selscript
 ENDJS  ENDJS
Line 925  sub startpage { Line 914  sub startpage {
    text=>"Table Mode",     text=>"Table Mode",
    help => 'Course_Setting_Parameters'});     help => 'Course_Setting_Parameters'});
     }      }
     my $start_page =       my $start_page =
  &Apache::loncommon::start_page('Set/Modify Course Parameters',   &Apache::loncommon::start_page('Set/Modify Course Parameters',
        &page_js(),         &page_js(),
        {'add_entries' => \%loaditems,});         {'add_entries' => \%loaditems,});
     my $breadcrumbs =       my $breadcrumbs =
  &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');   &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
     $r->print(<<ENDHEAD);      $r->print(<<ENDHEAD);
 $start_page  $start_page
Line 961  sub print_row { Line 950  sub print_row {
 # cascade down manually  # cascade down manually
     my $cascadetype=$$defaulttype{$which};      my $cascadetype=$$defaulttype{$which};
     for (my $i=14;$i>0;$i--) {      for (my $i=14;$i>0;$i--) {
  if ($typeoutpar[$i]) {    if ($typeoutpar[$i]) {
             $cascadetype=$typeoutpar[$i];              $cascadetype=$typeoutpar[$i];
  } else {   } else {
             $typeoutpar[$i]=$cascadetype;              $typeoutpar[$i]=$cascadetype;
Line 972  sub print_row { Line 961  sub print_row {
     if ($parmlev eq 'full') {      if ($parmlev eq 'full') {
         $r->print('<td style="background-color:'.$defbgtwo.';" align="center">'          $r->print('<td style="background-color:'.$defbgtwo.';" align="center">'
                   .$$part{$which}.'</td>');                    .$$part{$which}.'</td>');
     } else {          } else {
         $parm=~s|\[.*\]\s||g;          $parm=~s|\[.*\]\s||g;
     }      }
     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');      my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
     if ($automatic) {      if ($automatic) {
  $parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';   $parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';
     }      }
     $r->print('<td style="background-color:'.$defbgone.';">'.$parm.'</td>');      $r->print('<td>'.$parm.'</td>');
      
     my $thismarker=$which;      my $thismarker=$which;
     $thismarker=~s/^parameter\_//;      $thismarker=~s/^parameter\_//;
     my $mprefix=$rid.'&'.$thismarker.'&';      my $mprefix=$rid.'&'.$thismarker.'&';
Line 994  sub print_row { Line 983  sub print_row {
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);              &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);               &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         } else {          } else {
             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);               &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         }          }
     } elsif ($parmlev eq 'map') {      } elsif ($parmlev eq 'map') {
   
Line 1033  sub print_row { Line 1022  sub print_row {
  &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);   &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
  &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);   &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
  &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);   &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
   
  if ($csec) {   if ($csec) {
     &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);      &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
     &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);      &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
Line 1045  sub print_row { Line 1034  sub print_row {
             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);              &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);              &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         }          }
        
  if ($uname) {   if ($uname) {
             if ($othergrp) {              if ($othergrp) {
                 $r->print($othergrp);                  $r->print($othergrp);
Line 1075  sub print_td { Line 1064  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
     $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).      $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).
               ';" align="center">');                ';" align="center">');
     if ($which<11 || $which > 12) {      my $nolink = 0;
  $r->print(&plink($$typeoutpar[$which],      if ($which == 11 || $which == 12) {
  $$display{$value},$$outpar[$which],          $nolink = 1;
  $mprefix."$which",'parmform.pres','psub'));      } elsif ($mprefix =~ /availablestudent\&$/) {
           if ($which > 3) {
               $nolink = 1;
           }
       }
       if ($nolink) {
           $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
     } else {      } else {
  $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));          $r->print(&plink($$typeoutpar[$which],
                            $$display{$value},$$outpar[$which],
                            $mprefix."$which",'parmform.pres','psub'));
     }      }
     $r->print('</td>'."\n");      $r->print('</td>'."\n");
 }  }
Line 1098  sub print_usergroups { Line 1095  sub print_usergroups {
                                                                    $courseopt);                                                                     $courseopt);
     my $bgcolor = $defbg;      my $bgcolor = $defbg;
     my $grp_parm;      my $grp_parm;
     if (($coursereply) && ($cgroup ne $resultgroup)) {       if (($coursereply) && ($cgroup ne $resultgroup)) {
         if ($result > 3) {          if ($result > 3) {
             $bgcolor = '#AAFFAA';              $bgcolor = '#AAFFAA';
             $grp_parm = &valout($coursereply,$resulttype);              $grp_parm = &valout($coursereply,$resulttype);
Line 1181  sub extractResourceInformation { Line 1178  sub extractResourceInformation {
 #  #
     my $name=&Apache::lonnet::metadata($srcf,$key.'.name');      my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
     if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {      if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {
  my $display= &Apache::lonnet::metadata($srcf,$key.'.display');   my ($display,$parmdis);
  my $parmdis = $display;   $display = &standard_parameter_names($name);
  $parmdis =~ s/\s*\[Part.*$//g;   if ($display eq '') {
       $display= &Apache::lonnet::metadata($srcf,$key.'.display');
       $parmdis = $display;
       $parmdis =~ s/\s*\[Part.*$//g;
    } else {
       $parmdis = &mt($display);
    }
  $$allparms{$name}=$parmdis;   $$allparms{$name}=$parmdis;
  if (ref($defkeytype)) {   if (ref($defkeytype)) {
     $$defkeytype{$name}=      $$defkeytype{$name}=
Line 1206  sub extractResourceInformation { Line 1209  sub extractResourceInformation {
     }      }
 #  #
 # Put in order  # Put in order
 #   #
     unless ($$keyorder{$key}) {      unless ($$keyorder{$key}) {
  $$keyorder{$key}=$keyordercnt;   $$keyorder{$key}=$keyordercnt;
  $keyordercnt++;   $keyordercnt++;
     }      }
  }   }
   
   
  if (!exists($$mapp{$mapid})) {   if (!exists($$mapp{$mapid})) {
     $$mapp{$id}=      $$mapp{$id}=
  &Apache::lonnet::declutter($resource->enclosing_map_src());   &Apache::lonnet::declutter($resource->enclosing_map_src());
Line 1223  sub extractResourceInformation { Line 1226  sub extractResourceInformation {
  $$maptitles{$mapid}=&mt('Main Course Documents');   $$maptitles{$mapid}=&mt('Main Course Documents');
     } else {      } else {
  $$maptitles{$mapid}=   $$maptitles{$mapid}=
     &Apache::lonnet::gettitle($$mapp{$id});          &Apache::lonnet::gettitle($$mapp{$id});
     }      }
     $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};      $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
     $$symbp{$mapid}=$$mapp{$id}.'___(all)';      $$symbp{$mapid}=$$mapp{$id}.'___(all)';
Line 1241  sub isdateparm { Line 1244  sub isdateparm {
     return (($type=~/^date/) && (!($type eq 'date_interval')));      return (($type=~/^date/) && (!($type eq 'date_interval')));
 }  }
   
   #
   # This function prints a list of parameters, which were selected. It also display a link from which you can
   # hide or show the complete parameter list, from which you can choose your parameters. 
   #
 sub parmmenu {  sub parmmenu {
     my ($r,$allparms,$pscat,$keyorder)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
     my $tempkey;      my $tempkey;
     $r->print(<<ENDSCRIPT);      $r->print(<<ENDSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
     function checkall(value, checkName) {      function checkall(value, checkName) {
   
           var li = "_li";
           var displayOverview = "";
           
           if (value == false) {
               displayOverview = "none"
           }
   
  for (i=0; i<document.forms.parmform.elements.length; i++) {   for (i=0; i<document.forms.parmform.elements.length; i++) {
             ele = document.forms.parmform.elements[i];              ele = document.forms.parmform.elements[i];
             if (ele.name == checkName) {              if (ele.name == checkName) {
                 document.forms.parmform.elements[i].checked=value;                  document.forms.parmform.elements[i].checked=value;
                   document.getElementById(document.forms.parmform.elements[i].value.concat(li)).style.display = displayOverview;
             }              }
         }          }
     }      }
   
     function checkthis(thisvalue, checkName) {      function checkthis(thisvalue, checkName) {
   
           document.getElementById(thisvalue.concat("_li")).style.display = "";        
   
  for (i=0; i<document.forms.parmform.elements.length; i++) {   for (i=0; i<document.forms.parmform.elements.length; i++) {
             ele = document.forms.parmform.elements[i];              ele = document.forms.parmform.elements[i];
             if (ele.name == checkName) {              if (ele.name == checkName) {
Line 1281  sub parmmenu { Line 1301  sub parmmenu {
  checkthis('contentopen','pscat');   checkthis('contentopen','pscat');
   checkthis('contentclose','pscat');    checkthis('contentclose','pscat');
     }      }
    
   
     function checkvisi() {      function checkvisi() {
  checkthis('hiddenresource','pscat');   checkthis('hiddenresource','pscat');
Line 1304  sub parmmenu { Line 1323  sub parmmenu {
  checkthis('maxtries','pscat');   checkthis('maxtries','pscat');
     }      }
   
       function hideParms() {
           document.getElementById('LC_parm_overview_parm_menu').style.display = "none";
       }
   
       function showParms() {
           document.getElementById('LC_parm_overview_parm_menu').style.display = "";
       }
   
       function checkboxChecked(id) {
           var li = "_li";
           var id_li = id.concat(li);
           if (document.getElementById(id_li).style.display == "none") {
               document.getElementById(id_li).style.display = "";
           }
           else {
               document.getElementById(id_li).style.display = "none";
           }
       }
   // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     $r->print();      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
     $r->print("\n<table id=\"LC_parm_overview_parm_menu\"><tr>");  
     my $cnt=0;      #part to print selected parms overview
       $r->print(&mt('Selected Parameters:').'<br />');
   
       #print out all possible parms and hide them by default
       $r->print('<ul>');
     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {      foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
  $r->print("\n".'<td><label><input type="checkbox" name="pscat" ');          $r->print('<li id="'.$tempkey.'_li" value="'.$tempkey.'_li" name="pscat_li"');
  $r->print('value="'.$tempkey.'"');          if (!($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat})) {
  if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {              $r->print(' style="display:none"');
     $r->print(' checked');          }
  }          $r->print('>'
  $r->print('>'.($$allparms{$tempkey}=~/\S/ ? &mt($$allparms{$tempkey})                   .($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey} : $tempkey)
                                   : &mt($tempkey))                   .'</li>'
   .'</label></td>');          );
   $cnt++;      }
         if ($cnt==3) {      $r->print('</ul>'
     $r->print("</tr>\n<tr>");               .'<p><a href="javascript:showParms()">'
     $cnt=0;               .&mt('Show detailed Parameter Selection')
  }               .'</a></p>'
       );
   
       &shortCuts($r,$allparms,$pscat,$keyorder);
   
       $r->print(&Apache::lonhtmlcommon::row_closure(1));
   }
   # return a hash
   sub categories {
       return ('time_settings' => 'Time Settings',
       'grading' => 'Grading',
       'tries' => 'Tries',
       'problem_appearance' => 'Problem Appearance',
       'behaviour_of_input_fields' => 'Behaviour of Input Fields',
       'hiding' => 'Hiding',
       'high_level_randomization' => 'High Level Randomization',
       'slots' => 'Slots',
       'file_submission' => 'File Submission',
       'misc' => 'Miscellaneous' ); 
   }
   
   # return a hash. Like a look-up table
   sub lookUpTableParameter {
    
       return ( 
           'opendate' => 'time_settings',
           'duedate' => 'time_settings',
           'answerdate' => 'time_settings',
           'interval' => 'time_settings',
           'contentopen' => 'time_settings',
           'contentclose' => 'time_settings',
           'discussend' => 'time_settings',
           'weight' => 'grading',
           'handgrade' => 'grading',
           'maxtries' => 'tries',
           'hinttries' => 'tries',
           'type' => 'problem_appearance',
           'problemstatus' => 'problem_appearance',
           'display' => 'problem_appearance',
           'ordered' => 'problem_appearance',
           'numbubbles' => 'problem_appearance',
           'tol' => 'behaviour_of_input_fields',
           'sig' => 'behaviour_of_input_fields',
           'turnoffunit' => 'behaviour_of_input_fields',
           'hiddenresource' => 'hiding',
           'hiddenparts' => 'hiding',
           'discusshide' => 'hiding',
           'buttonshide' => 'hiding',
           'turnoffeditor' => 'hiding',
           'encrypturl' => 'hiding',
           'randomorder' => 'high_level_randomization',
           'randompick' => 'high_level_randomization',
           'available' => 'slots',
           'useslots' => 'slots',
           'availablestudent' => 'slots',
           'uploadedfiletypes' => 'file_submission',
           'maxfilesize' => 'file_submission',
           'cssfile' => 'misc',
           'mapalias' => 'misc',
           'acc' => 'misc',
           'maxcollaborators' => 'misc',
           'scoreformat' => 'misc',
   
       );    
   }
   
   sub whatIsMyCategory {
       my $name = shift;
       my $catList = shift;
       my @list;
       my %lookUpList = &lookUpTableParameter; #Initilize the lookupList
       my $cat = $lookUpList{$name};
       if (defined($cat)) {
           if (!defined($$catList{$cat})){
               push @list, ($name);
               $$catList{$cat} = \@list;
           } else {
               push @{${$catList}{$cat}}, ($name);     
           }
       } else {
           if (!defined($$catList{'misc'})){
               push @list, ($name);
               $$catList{'misc'} = \@list;
           } else {
               push @{${$catList}{'misc'}}, ($name);     
           }
       }        
   }
   
   sub keysindisplayorderCategory {
       my ($name,$keyorder)=@_;
       return sort {
       $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b}; 
       } ( @{$name});
   }
   
   sub category_order {
       return (
           'time_settings' => 1,
           'grading' => 2,
           'tries' => 3,
           'problem_appearance' => 4,
           'hiding' => 5,
           'behaviour_of_input_fields' => 6,
           'high_level_randomization'  => 7,
           'slots' => 8,
           'file_submission' => 9,
           'misc' => 10
       );
   
   }
   
   sub parmboxes {
       my ($r,$allparms,$pscat,$keyorder)=@_;
       my $tempkey;
       my $tempparameter;
       my %categories = &categories;
       my %category_order = &category_order();
       my %categoryList = (
           'time_settings' => [],
           'grading' => [],
           'tries' => [],
           'problem_appearance' => [],
           'behaviour_of_input_fields' => [],
           'hiding' => [],
           'high_level_randomization' => [],
           'slots' => [],
           'file_submission' => [],
           'misc' => [],
      );
       foreach $tempparameter (keys %$allparms) {
           &whatIsMyCategory($tempparameter, \%categoryList);
       }
       #part to print the parm-list
       $r->print('<fieldset id="LC_parm_overview_parm_menu" style="display:none">'
                .'<legend>'.&mt('Parameter').'</legend>'."\n"
       );
   
       #Print parameters
       for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) {
           if(@{$categoryList{$key}} == 0) {
               next;
           } else { 
               $r->print('<fieldset>'
                        .'<legend>'
                        .&mt($categories{$key})
                        .'</legend>'."\n");
               foreach $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
                       $r->print('<span class="LC_nobreak">'
                                .'<label><input type="checkbox" name="pscat" ');
               $r->print('value="'.$tempkey.'" ');
                   $r->print('onclick="checkboxChecked(\''.$tempkey.'\')"');
               if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                   $r->print(' checked="checked"');
               }
                   $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
                                                         : $tempkey)
                           .'</label></span> ');
               }
               $r->print('</fieldset>');
           }
     }      }
     $r->print('</tr>'      $r->print('<hr />'
              .'<tr id=\"LC_parm_overview_parm_menu_selectors\">'               .'<a href="javascript:hideParms()">'
                .&mt('Hide')
                .'</a>'
       );
   
       #&shortCuts($r,$allparms,$pscat,$keyorder);
       $r->print('</fieldset>');
   }
   #
   # This function offers some links on the parameter section to get with one click a group a parameters
   #
   sub shortCuts {
       my ($r,$allparms,$pscat,$keyorder)=@_;
   
       #part to print out the shortcuts for parmselection
       $r->print('<table><tr id="LC_parm_overview_parm_menu_selectors">'
              .'<td valign="top">'               .'<td valign="top">'
              .'<fieldset><legend><b>'.&mt('Parameter Selection').'</b></legend>'               .'<fieldset><legend>'.&mt('Parameter Selection').'</legend>'
              .'<span class="LC_nobreak">'               .'<span class="LC_nobreak">'
              .'&bull; <a href="javascript:checkall(true, \'pscat\')">'.&mt('Select All').'</a>'               .'&bull; <a href="javascript:checkall(true, \'pscat\')">'.&mt('Select All').'</a>'
              .'</span>'               .'</span>'
Line 1342  ENDSCRIPT Line 1559  ENDSCRIPT
              .'</fieldset>'               .'</fieldset>'
              .'</td>'               .'</td>'
              .'<td colspan="2" valign="top">'               .'<td colspan="2" valign="top">'
              .'<fieldset><legend><b>'.&mt('Add Selection for...').'</b></legend>'               .'<fieldset><legend>'.&mt('Add Selection for...').'</legend>'
              .'<span class="LC_nobreak">'               .'<span class="LC_nobreak">'
              .'&bull; <a href="javascript:checkdates()">'.&mt('Problem Dates').'</a>'               .'&bull; <a href="javascript:checkdates()">'.&mt('Problem Dates').'</a>'
              .'</span>'               .'</span>'
Line 1362  ENDSCRIPT Line 1579  ENDSCRIPT
              .'</span>'               .'</span>'
              .'</fieldset>'               .'</fieldset>'
              .'</td>'               .'</td>'
              .'</tr></table>'               .'</tr></table>');
     );  
 }  }
   
 sub partmenu {  sub partmenu {
     my ($r,$allparts,$psprt)=@_;      my ($r,$allparts,$psprt)=@_;
     $r->print('<select multiple name="psprt" size="8">');  
       $r->print('<select multiple="multiple" name="psprt" size="8">');
     $r->print('<option value="all"');      $r->print('<option value="all"');
     $r->print(' selected="selected"') unless (@{$psprt});      $r->print(' selected="selected"') unless (@{$psprt});
     $r->print('>'.&mt('All Parts').'</option>');      $r->print('>'.&mt('All Parts').'</option>');
Line 1421  sub usermenu { Line 1638  sub usermenu {
         $sections .= '&nbsp;'.&mt('or').'&nbsp;';          $sections .= '&nbsp;'.&mt('or').'&nbsp;';
         $sections .= qq|          $sections .= qq|
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function group_or_section(caller) {  function group_or_section(caller) {
    if (caller == "cgroup") {     if (caller == "cgroup") {
        if (document.parmform.cgroup.selectedIndex != 0) {         if (document.parmform.cgroup.selectedIndex != 0) {
Line 1432  function group_or_section(caller) { Line 1650  function group_or_section(caller) {
        }         }
    }     }
 }  }
   // ]]>
 </script>  </script>
 |;  |;
     } else {      } else {
         $sections .= qq|          $sections .= qq|
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function group_or_section(caller) {  function group_or_section(caller) {
     return;      return;
 }  }
   // ]]>
 </script>  </script>
 |;  |;
     }       }
   
     if (%grouphash) {      if (%grouphash) {
         $groups=&mt('Group:').' <select name="cgroup"';          $groups=&mt('Group:').' <select name="cgroup"';
Line 1469  function group_or_section(caller) { Line 1690  function group_or_section(caller) {
     }      }
   
     if (%sectionhash || %grouphash) {      if (%sectionhash || %grouphash) {
         $g_s_header='<fieldset><legend>'.&mt('Group/Section').'</legend><div>';          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));
         $g_s_footer='</div></fieldset>';          $r->print($sections.$groups);
           $r->print(&Apache::lonhtmlcommon::row_closure());
     }      }
   
     $r->print('<b>'      $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));
              .$g_s_header      $r->print(&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
              .$sections  
              .$groups  
              .$g_s_footer  
              .'<fieldset><legend>'.&mt('User').'</legend><div>'  
              .&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'  
                  ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'                   ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'
                  ,'<input type="text" value="'.$id.'" size="12" name="id" /> '                   ,'<input type="text" value="'.$id.'" size="12" name="id" /> '
                  ,$chooseopt)                   ,$chooseopt));
              .'</div></fieldset>'  
              .'</b>'  
     );  
 }  }
   
   #
   # This function shows on table Mode the available Parameters for the selected Resources
   #
 sub displaymenu {  sub displaymenu {
     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;      my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.      $r->print(&Apache::lonhtmlcommon::topic_bar (2,&mt('Select Parameters')));
      &mt('Select Parts to View').'</th></tr><tr><td>');        $r->print(&Apache::lonhtmlcommon::start_pick_box());
     &parmmenu($r,$allparms,$pscat,$keyorder);      &parmmenu($r,$allparms,$pscat,$keyorder);
     $r->print('</td><td valign="top" align="center">');      $r->print(&Apache::lonhtmlcommon::end_pick_box());
       &parmboxes($r,$allparms,$pscat,$keyorder);
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
     &partmenu($r,$allparts,$psprt);      &partmenu($r,$allparts,$psprt);
     $r->print('</td></tr></table>');      $r->print(&Apache::lonhtmlcommon::row_closure(1));
       $r->print(&Apache::lonhtmlcommon::end_pick_box());
 }  }
   
 sub mapmenu {  sub mapmenu {
     my ($r,$allmaps,$pschp,$maptitles)=@_;      my ($r,$allmaps,$pschp,$maptitles, $symbp)=@_;
     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');      my %allmaps_inverted = reverse %$allmaps;
     $r->print('<select name="pschp">');      my $navmap = Apache::lonnavmaps::navmap->new();
     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');      my $tree=[];
     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {      my $treeinfo={};
  $r->print('<option value="'.$_.'"');      if (defined($navmap)) {
  if (($pschp eq $_)) { $r->print(' selected="selected"'); }          my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
  $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');          my $curRes;
           my $depth = 0;
           my %parent = ();
           my $startcount = 5;
           my $lastcontainer = $startcount;
   # preparing what is to show ...
           while ($curRes = $it->next()) {
               if ($curRes == $it->BEGIN_MAP()) {
                   $depth++;
                   $parent{$depth}= $lastcontainer;
               }
               if ($curRes == $it->END_MAP()) {
                   $depth--;
                   $lastcontainer = $parent{$depth};
               }
               if (ref($curRes)) {
                   my $symb = $curRes->symb();
                   my $ressymb = $symb;
                   if (($curRes->is_sequence()) || ($curRes->is_page())) {
                       my $type = 'sequence';
                       if ($curRes->is_page()) {
                           $type = 'page';
                       }
                       my $id= $curRes->id();
                       my $srcf = $curRes->src();
                       my $resource_name = &Apache::lonnet::gettitle($srcf);
                       if(!exists($treeinfo->{$id})) {
                           push(@$tree,$id);
                           my $enclosing_map_folder = &Apache::lonnet::declutter($curRes->enclosing_map_src());    
                           $treeinfo->{$id} = {
                                       depth => $depth,
                                       type  => $type,
                                       name  => $resource_name,
                                       enclosing_map_folder => $enclosing_map_folder,
                                       };
                       }
                   }
               }
           }
       }
   # Show it ...
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder')));
       if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {
           my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';
           $r->print(&Apache::loncommon::start_data_table()
                    .&Apache::loncommon::start_data_table_row()
                    .'<td>'.$icon
                    .'<label>&nbsp;'
                    .'<input type="radio" name="pschp" checked="checked" value="all" />'
                    .&mt('All Maps or Folders')
                    .'</label></td>'
                    .&Apache::loncommon::end_data_table_row()
           );
           my $whitespace = '<img src="'
                           .&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif")
                           .'" alt="" />';
           if (exists($$allmaps{1})) {
               $r->print(&Apache::loncommon::start_data_table_row()
                   .'<td>'.$icon
                   .'<label>&nbsp;'
                   .'<input type="radio" name="pschp" value="1"'
               );
               if ($pschp eq 1) {
                   $r->print(' checked="checked"');
               }
               $r->print('/>'
                   .$$maptitles{1}
                   .($$allmaps{1} !~/^uploaded/?' ['.$$allmaps{1}.']':'')
                   .'</label>'
                   .'</td>'
                   .&Apache::loncommon::end_data_table_row()
               );
           }
           foreach my $id (@{$tree}) {
               my ($mapid,$resid)=split(/\./,$id);
               # Indentation
               my $depth = $treeinfo->{$id}->{'depth'};
               my $indent;
               for (my $i = 0; $i < $depth; $i++) {
                   $indent.= $whitespace;
               }
               $icon =  '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';
               if ($treeinfo->{$id}->{'type'} eq 'page') {
                   $icon = '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />';
               }
               my $symb_name = $$symbp{$id};
               my ($front, $tail) = split (/___${resid}___/, $symb_name);
               $symb_name = $tail;
               $r->print(&Apache::loncommon::start_data_table_row()
                        .'<td>'.$indent.$icon
                        .'<label>&nbsp;'
                        .'<input type ="radio" name="pschp" value="'.$allmaps_inverted{$symb_name}.'"'
               );
               if ($pschp eq $allmaps_inverted{$symb_name}) {
                   $r->print(' checked="checked"');
               }
               $r->print('/>'
                        .$treeinfo->{$id}->{name}
                        .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':'')
                        .'</label>'
                        .'</td>'
                        .&Apache::loncommon::end_data_table_row()
               );
           }
           $r->print(&Apache::loncommon::end_data_table());
     }      }
     $r->print("</select>");  
 }  }
   
 sub levelmenu {  sub levelmenu {
     my ($r,$alllevs,$parmlev)=@_;      my ($r,$alllevs,$parmlev)=@_;
     $r->print('<b>'.&mt('Select Parameter Level').  
       &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
     $r->print('<select name="parmlev">');      $r->print('<select name="parmlev">');
     foreach (reverse sort keys %{$alllevs}) {      foreach (reverse sort keys %{$alllevs}) {
  $r->print('<option value="'.$$alllevs{$_}.'"');   $r->print('<option value="'.$$alllevs{$_}.'"');
  if ($parmlev eq $$alllevs{$_}) {   if ($parmlev eq $$alllevs{$_}) {
     $r->print(' selected="selected"');       $r->print(' selected="selected"');
  }   }
  $r->print('>'.&mt($_).'</option>');   $r->print('>'.&mt($_).'</option>');
     }      }
Line 1532  sub sectionmenu { Line 1856  sub sectionmenu {
     my %sectionhash = &Apache::loncommon::get_sections();      my %sectionhash = &Apache::loncommon::get_sections();
     return if (!%sectionhash);      return if (!%sectionhash);
   
     $r->print('<select name="Section" multiple="true" size="8" >');      $r->print('<select name="Section" multiple="multiple" size="8">');
     foreach my $s ('all',sort keys %sectionhash) {      foreach my $s ('all',sort keys %sectionhash) {
  $r->print('    <option value="'.$s.'"');   $r->print('    <option value="'.$s.'"');
  foreach (@{$selectedsections}) {   foreach (@{$selectedsections}) {
Line 1551  sub groupmenu { Line 1875  sub groupmenu {
     my %grouphash = &Apache::longroup::coursegroups();      my %grouphash = &Apache::longroup::coursegroups();
     return if (!%grouphash);      return if (!%grouphash);
   
     $r->print('<select name="Group" multiple="true" size="8" >');      $r->print('<select name="Group" multiple="multiple" size="8">');
     foreach my $group (sort(keys(%grouphash))) {      foreach my $group (sort(keys(%grouphash))) {
  $r->print('    <option value="'.$group.'"');   $r->print('    <option value="'.$group.'"');
  foreach (@{$selectedgroups}) {   foreach (@{$selectedgroups}) {
Line 1601  sub sortmenu { Line 1925  sub sortmenu {
     my ($r,$sortorder)=@_;      my ($r,$sortorder)=@_;
     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');      $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
     if ($sortorder eq 'realmstudent') {      if ($sortorder eq 'realmstudent') {
        $r->print(' checked="on"');         $r->print(' checked="checked"');
     }      }
     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));      $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');      $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
     if ($sortorder eq 'studentrealm') {      if ($sortorder eq 'studentrealm') {
        $r->print(' checked="on"');         $r->print(' checked="checked"');
     }      }
     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').      $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
       '</label>');        '</label>');
Line 1659  sub assessparms { Line 1983  sub assessparms {
     my $csec;      my $csec;
     my $cgroup;      my $cgroup;
     my @usersgroups = ();      my @usersgroups = ();
    
     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};      my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
   
     $alllevs{'Resource Level'}='full';      $alllevs{'Resource Level'}='full';
Line 1688  sub assessparms { Line 2012  sub assessparms {
     } else {      } else {
  $udom=$r->dir_config('lonDefDomain');   $udom=$r->dir_config('lonDefDomain');
     }      }
       
   
     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');      my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
     my $pschp=$env{'form.pschp'};      my $pschp=$env{'form.pschp'};
Line 1696  sub assessparms { Line 2021  sub assessparms {
   
     my $pssymb='';      my $pssymb='';
     my $parmlev='';      my $parmlev='';
    
     unless ($env{'form.parmlev'}) {      unless ($env{'form.parmlev'}) {
         $parmlev = 'map';          $parmlev = 'map';
     } else {      } else {
Line 1747  sub assessparms { Line 2072  sub assessparms {
         } else {          } else {
     $csec=&Apache::lonnet::getsection($udom,$uname,      $csec=&Apache::lonnet::getsection($udom,$uname,
       $env{'request.course.id'});        $env{'request.course.id'});
               
     if ($csec eq '-1') {      if ($csec eq '-1') {
  $message='<span class="LC_error">'.   $message='<span class="LC_error">'.
     &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".      &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
Line 1777  sub assessparms { Line 2102  sub assessparms {
     unless ($cgroup) { $cgroup=''; }      unless ($cgroup) { $cgroup=''; }
   
 # --------------------------------------------------------- Get all assessments  # --------------------------------------------------------- Get all assessments
     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,       &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
  \%mapp, \%symbp,\%maptitles,\%uris,   \%mapp, \%symbp,\%maptitles,\%uris,
  \%keyorder);   \%keyorder);
   
Line 1790  sub assessparms { Line 2115  sub assessparms {
         my @values=split(/\&\&\&/,$env{'form.pres_value'});          my @values=split(/\&\&\&/,$env{'form.pres_value'});
         my @types=split(/\&\&\&/,$env{'form.pres_type'});          my @types=split(/\&\&\&/,$env{'form.pres_type'});
  for (my $i=0;$i<=$#markers;$i++) {   for (my $i=0;$i<=$#markers;$i++) {
               if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
                   my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   my (@ok_slots,@fail_slots,@del_slots);
                   my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
                   my ($level,@all) =
                       &parmval_by_symb('0.availablestudent',$pssymb,'',$uname,$udom,
                                        $csec,$cgroup,$courseopt);
                   foreach my $slot_name (split(/:/,$values[$i])) {
                       next if ($slot_name eq '');
                       if (&update_slots($slot_name,$cdom,$cnum,$pssymb,$uname,$udom) eq 'ok') {
                           push(@ok_slots,$slot_name);
   
                       } else {
                           push(@fail_slots,$slot_name);
                       }
                   }
                   if (@ok_slots) {
                       $values[$i] = join(':',@ok_slots);
                   } else {
                       $values[$i] = '';
                   }
                   if ($all[$level] ne '') {
                       my @existing = split(/:/,$all[$level]);
                       foreach my $slot_name (@existing) {
                           if (!grep(/^\Q$slot_name\E$/,split(/:/,$values[$i]))) {
                               if (&delete_slots($slot_name,$cdom,$cnum,$uname,$udom,$pssymb) eq 'ok') {
                                   push(@del_slots,$slot_name);
                               }
                           }
                       }
                   }
               }
     $message.=&storeparm(split(/\&/,$markers[$i]),      $message.=&storeparm(split(/\&/,$markers[$i]),
  $values[$i],   $values[$i],
  $types[$i],   $types[$i],
  $uname,$udom,$csec,$cgroup);   $uname,$udom,$csec,$cgroup);
  }   }
 # ---------------------------------------------------------------- Done storing  # ---------------------------------------------------------------- Done storing
  $message.='<h3>'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'</h3>';          $message.='<p class="LC_warning">'
                    .&mt('Changes can take up to 10 minutes before being active for all students.')
                    .&Apache::loncommon::help_open_topic('Caching')
                    .'</p>';
     }      }
 #----------------------------------------------- if all selected, fill in array  #----------------------------------------------- if all selected, fill in array
     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}      if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };       if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };
     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}      if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
 # ------------------------------------------------------------------ Start page  # ------------------------------------------------------------------ Start page
   
Line 1812  sub assessparms { Line 2173  sub assessparms {
   &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').    &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
   '" name="recent_'.$_.'" />');    '" name="recent_'.$_.'" />');
     }      }
                           
       # ----- Start Parameter Selection
   
       # Hide parm selection?
       $r->print(<<ENDPARMSELSCRIPT);
   <script type="text/javascript">
   // <![CDATA[
   function parmsel_show() {
     document.getElementById('parmsel').style.display = "";
     document.getElementById('parmsellink').style.display = "none";
   }
   // ]]>
   </script>
   ENDPARMSELSCRIPT
       my $parmselhiddenstyle=' style="display:none"';
       if($env{'form.hideparmsel'} eq 'hidden') {
           $r->print('<div id="parmsel"'.$parmselhiddenstyle.'>');
       } else  {
           $r->print('<div id="parmsel">');
       }
   
       # Display Unit 1 "General Parameters"
     if (!$pssymb) {      if (!$pssymb) {
         $r->print('<table border="1"><tr><td>');          $r->print(&Apache::lonhtmlcommon::topic_bar (1,&mt('General Parameters')));
           $r->print(&Apache::lonhtmlcommon::start_pick_box());
   
         &levelmenu($r,\%alllevs,$parmlev);          &levelmenu($r,\%alllevs,$parmlev);
   
  if ($parmlev ne 'general') {   if ($parmlev ne 'general') {
             $r->print('<td>');              $r->print(&Apache::lonhtmlcommon::row_closure());
     &mapmenu($r,\%allmaps,$pschp,\%maptitles);      &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);
     $r->print('</td>');  
  }   }
         $r->print('</td></tr></table>');  
           $r->print(&Apache::lonhtmlcommon::row_closure(1));
           $r->print(&Apache::lonhtmlcommon::end_pick_box());
       #Display Unit 2 "Select Parameter"   
  &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);   &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
     } else {      } else {
         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);          my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
Line 1831  sub assessparms { Line 2218  sub assessparms {
   '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.    '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
   ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');    ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
     }      }
     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);          $r->print(&Apache::lonhtmlcommon::topic_bar (3,&mt('User Selection')));
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
       &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
       $r->print(&Apache::lonhtmlcommon::row_closure(1));
       $r->print(&Apache::lonhtmlcommon::end_pick_box());
       
       # parm selection is shown: display parm update button
       $r->print('<p>'
                .'<input type="submit" name="dis"'
                .' value="'.&mt('Update Parameter Display').'" />'
                .'<input type="hidden" name="hideparmsel" value="hidden" />'
                .'</p>'
       );
   
       $r->print('</div>');
       # ----- End Parameter Selection
   
     $r->print('<p>'.$message.'</p>');      # Offer link to display parameter selection again
       $r->print('<p id="parmsellink"');
       if($env{'form.hideparmsel'} ne 'hidden') {
           $r->print($parmselhiddenstyle);
       }
       $r->print('>'
                .'<a href="javascript:parmsel_show()">'
                .&mt('Change Parameter Selection')
                .'</a>'
                .'</p>');
   
       # Display Messages
       $r->print('<div>'.$message.'</div>');
   
     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');  
   
     my @temp_pscat;      my @temp_pscat;
     map {      map {
Line 1856  sub assessparms { Line 2269  sub assessparms {
            my $userspan=3;             my $userspan=3;
            if ($cgroup ne '') {             if ($cgroup ne '') {
               $coursespan += 3;                $coursespan += 3;
            }              }
         
            $r->print('<p><table border="2">');             $r->print('<p><table border="2">');
            $r->print('<tr><td colspan="5"></td>');             $r->print('<tr><td colspan="5"></td>');
            $r->print('<th colspan="'.($coursespan).'">'.&mt('Any User').'</th>');             $r->print('<th colspan="'.($coursespan).'">'.&mt('Any User').'</th>');
Line 1933  ENDTABLEHEADFOUR Line 2346  ENDTABLEHEADFOUR
                 my $rid=$_;                  my $rid=$_;
                 my ($inmapid)=($rid=~/\.(\d+)$/);                  my ($inmapid)=($rid=~/\.(\d+)$/);
   
                 if ((!$pssymb &&                   if ((!$pssymb &&
      (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))       (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
     ||      ||
     ($pssymb && $pssymb eq $symbp{$rid})) {      ($pssymb && $pssymb eq $symbp{$rid})) {
Line 1968  ENDTABLEHEADFOUR Line 2381  ENDTABLEHEADFOUR
                         if (grep $_ eq $tempkeyp, @catmarker) {                          if (grep $_ eq $tempkeyp, @catmarker) {
                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');                            $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');                            $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');                            my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
                             if ($allparms{$name{$_}} ne '') {
                                 my $identifier;
                                 if ($parmdis =~ /(\s*\[Part.*)$/) {
                                     $identifier = $1;
                                 }
                                 $display{$_} = $allparms{$name{$_}}.$identifier;
                             } else {
                                 $display{$_} = $parmdis;
                             }
                           unless ($display{$_}) { $display{$_}=''; }                            unless ($display{$_}) { $display{$_}=''; }
                           $display{$_}.=' ('.$name{$_}.')';                            $display{$_}.=' ('.$name{$_}.')';
                           $default{$_}=&Apache::lonnet::metadata($uri,$_);                            $default{$_}=&Apache::lonnet::metadata($uri,$_);
Line 2029  ENDTABLEHEADFOUR Line 2451  ENDTABLEHEADFOUR
             my %maplist;              my %maplist;
   
             if ($pschp eq 'all') {              if ($pschp eq 'all') {
                 %maplist = %allmaps;                   %maplist = %allmaps;
             } else {              } else {
                 %maplist = ($pschp => $mapp{$pschp});                  %maplist = ($pschp => $mapp{$pschp});
             }              }
Line 2049  ENDTABLEHEADFOUR Line 2471  ENDTABLEHEADFOUR
                 my $map = 0;                  my $map = 0;
   
 # $r->print("Catmarker: @catmarker<br />\n");  # $r->print("Catmarker: @catmarker<br />\n");
                  
                 foreach (@ids) {                  foreach (@ids) {
                   ($map)=(/([\d]*?)\./);                    ($map)=(/([\d]*?)\./);
                   my $rid = $_;                    my $rid = $_;
           
 #                  $r->print("$mapid:$map:   $rid <br /> \n");  #                  $r->print("$mapid:$map:   $rid <br /> \n");
   
                   if ($map eq $mapid) {                    if ($map eq $mapid) {
Line 2071  ENDTABLEHEADFOUR Line 2493  ENDTABLEHEADFOUR
                       my $tempkeyp = $_;                        my $tempkeyp = $_;
                       my $fullkeyp = $tempkeyp;                        my $fullkeyp = $tempkeyp;
                       $tempkeyp =~ s/_\w+_/_0_/;                        $tempkeyp =~ s/_\w+_/_0_/;
                         
                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                        if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                         $part{$tempkeyp}="0";                          $part{$tempkeyp}="0";
                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                          $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                          my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                           if ($allparms{$name{$tempkeyp}} ne '') {
                               my $identifier;
                               if ($parmdis =~ /(\s*\[Part.*)$/) {
                                   $identifier = $1;
                               }
                               $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                           } else {
                               $display{$tempkeyp} = $parmdis;
                           }
                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                          unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                          $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                         $display{$tempkeyp} =~ s/_\w+_/_0_/;                          $display{$tempkeyp} =~ s/_\w+_/_0_/;
Line 2085  ENDTABLEHEADFOUR Line 2516  ENDTABLEHEADFOUR
                     } # end loop through keys                      } # end loop through keys
                   }                    }
                 } # end loop through ids                  } # end loop through ids
                                    
 #---------------------------------------------------- print header information  #---------------------------------------------------- print header information
                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');                  my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');                  my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
Line 2112  ENDTABLEHEADFOUR Line 2543  ENDTABLEHEADFOUR
                              ,'<font color="red"><i>'.$coursename.'</i></font>'                               ,'<font color="red"><i>'.$coursename.'</i></font>'
                              )                               )
                          ."<br /></h4>\n"                           ."<br /></h4>\n"
                          );                  );
 #---------------------------------------------------------------- print table  #---------------------------------------------------------------- print table
                 $r->print('<p>'.&Apache::loncommon::start_data_table()                  $r->print('<p>'.&Apache::loncommon::start_data_table()
                          .&Apache::loncommon::start_data_table_header_row()                           .&Apache::loncommon::start_data_table_header_row()
Line 2128  ENDTABLEHEADFOUR Line 2559  ENDTABLEHEADFOUR
                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                             \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                            $parmlev,$uname,$udom,$csec,$cgroup);                             $parmlev,$uname,$udom,$csec,$cgroup);
                 }                  }
                 $r->print(&Apache::loncommon::end_data_table().'</p>');                  $r->print(&Apache::loncommon::end_data_table().'</p>'
                            .'</div>'
                   );
             } # end each map              } # end each map
         } # end of $parmlev eq map          } # end of $parmlev eq map
 #--------------------------------- Entry for parm level general (Course level)  #--------------------------------- Entry for parm level general (Course level)
Line 2146  ENDTABLEHEADFOUR Line 2579  ENDTABLEHEADFOUR
             my %display = ();              my %display = ();
             my %type = ();              my %type = ();
             my %default = ();              my %default = ();
                  
             foreach (@ids) {              foreach (@ids) {
                 my $rid = $_;                  my $rid = $_;
           
                 my $uri=&Apache::lonnet::declutter($uris{$rid});                  my $uri=&Apache::lonnet::declutter($uris{$rid});
   
 #--------------------------------------------------------------------  #--------------------------------------------------------------------
Line 2166  ENDTABLEHEADFOUR Line 2599  ENDTABLEHEADFOUR
                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                    if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                     $part{$tempkeyp}="0";                      $part{$tempkeyp}="0";
                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                      $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                      my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                       if ($allparms{$name{$tempkeyp}} ne '') {
                           my $identifier;
                           if ($parmdis =~ /(\s*\[Part.*)$/) {
                               $identifier = $1;
                           }
                           $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                       } else {
                           $display{$tempkeyp} = $parmdis;
                       }
                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                      unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                      $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                     $display{$tempkeyp} =~ s/_\w+_/_0_/;                      $display{$tempkeyp} =~ s/_\w+_/_0_/;
Line 2175  ENDTABLEHEADFOUR Line 2617  ENDTABLEHEADFOUR
                   }                    }
                 } # end loop through keys                  } # end loop through keys
             } # end loop through ids              } # end loop through ids
                                    
 #---------------------------------------------------- print header information  #---------------------------------------------------- print header information
     my $setdef=&mt("Set Defaults for All Resources in Course");      my $setdef=&mt("Set Defaults for All Resources in Course");
             $r->print(<<ENDMAPONE);              $r->print(<<ENDMAPONE);
Line 2189  ENDMAPONE Line 2631  ENDMAPONE
             } else {              } else {
                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");                  $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
             }              }
               
             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};              if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};              if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
             $r->print("</h4>\n");              $r->print("</h4>\n");
Line 2217  ENDMAPONE Line 2659  ENDMAPONE
     $r->print('</form>'.&Apache::loncommon::end_page());      $r->print('</form>'.&Apache::loncommon::end_page());
 } # end sub assessparms  } # end sub assessparms
   
   
   
 sub crsenv {  
     my $r=shift;  
     my $setoutput='';  
   
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',  
  text=>"Course Environment"});  
     my $breadcrumbs =   
  &Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');  
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};  
   
     my (%crsinfo,$chome);  
   
     #  
     # Go through list of changes  
     foreach (keys %env) {  
         next if ($_!~/^form\.(.+)\_setparmval$/);  
         my $name  = $1;  
         my $value = $env{'form.'.$name.'_value'};  
         if ($name eq 'newp') {  
             $name = $env{'form.newp_name'};  
         }  
         if ($name eq 'url') {  
             $value=~s/^\/res\///;  
             my $bkuptime=time;  
             my @tmp = &Apache::lonnet::get  
                 ('environment',['url'],$dom,$crs);  
             $setoutput.=&mt('Backing up previous URL').': '.  
                 &Apache::lonnet::put  
                 ('environment',  
                  {'top level map backup '.$bkuptime => $tmp[1] },  
                  $dom,$crs).  
                      '<br />';  
         }  
         #  
         # Deal with modified default spreadsheets  
         if ($name =~ /^spreadsheet_default_(classcalc|  
                                             studentcalc|  
                                             assesscalc)$/x) {  
             my $sheettype = $1;   
             if ($sheettype eq 'classcalc') {  
                 # no need to do anything since viewing the sheet will  
                 # cause it to be updated.   
             } elsif ($sheettype eq 'studentcalc') {  
                 # expire all the student spreadsheets  
                 &Apache::lonnet::expirespread('','','studentcalc');  
             } else {  
                 # expire all the assessment spreadsheets   
                 #    this includes non-default spreadsheets, but better to  
                 #    be safe than sorry.  
                 &Apache::lonnet::expirespread('','','assesscalc');  
                 # expire all the student spreadsheets  
                 &Apache::lonnet::expirespread('','','studentcalc');  
             }  
         }  
         #  
         # Deal with the enrollment dates  
         if ($name =~ /^default_enrollment_(start|end)_date$/) {  
             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');  
         }  
  #  
         # Deal with the emails  
         if ($name =~ /\.email$/) {  
     foreach my $specifier (split(',',$value)) {  
  my ($user,$sections_or_groups)=  
     ($specifier=~/^([^\(]+)\(([^\)]+)\)/);  
  if (!$sections_or_groups) {  
     $user = $specifier;  
  }  
  my ($name,$domain) = split(':',$user);  
  if (!defined($user) || !defined($domain)) {  
     $setoutput.= '<br /> <span class="LC_error">'.  
  &mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).  
  '</span>';  
     undef($value);  
  } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {  
     $setoutput.= '<br /> <span class="LC_error">'.  
  &mt("Invalid email address specified, user [_1] is unknown.",$name).  
  '</span>';  
     undef($value);  
  }  
     }  
         }  
         # Get existing cloners  
         my @oldcloner = ();  
         if ($name eq 'cloners') {  
             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');  
             if ($clonenames{'cloners'} =~ /,/) {  
                 @oldcloner = split/,/,$clonenames{'cloners'};  
             } else {  
                 $oldcloner[0] = $clonenames{'cloners'};  
             }  
         }  
         #  
         # Let the user know we made the changes  
         if ($name && defined($value)) {  
             my %failed_cloners;  
             if ($name eq 'cloners') {  
                 $value =~ s/\s//g;  
                 $value =~ s/^,//;  
                 $value =~ s/,$//;  
                 # check requested clones are valid users.  
                 %failed_cloners = &check_cloners(\$value,\@oldcloner);  
             }  
             my $put_result = &Apache::lonnet::put('environment',  
                                                   {$name=>$value},$dom,$crs);  
             if ($put_result eq 'ok') {  
                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>';  
                 if ($name =~ /^default_enrollment_(start|end)_date$/) {  
                     $setoutput .= &Apache::lonlocal::locallocaltime($value);  
                 } elsif ($name eq 'categories') {  
                     $setoutput .= $env{'form.categories_display'};  
                 } else {  
                     $setoutput .= $value;  
                 }  
                 $setoutput .= '</b>.<br />';  
                 if ($name eq 'cloners') {  
                     &change_clone($value,\@oldcloner);  
                 }  
                 # Update environment and nohist_courseids.db  
                 if (($name eq 'description') || ($name eq 'cloners') ||   
                     ($name eq 'hidefromcat') || ($name eq 'categories')) {  
                     if ($chome eq '') {  
                         %crsinfo =  
                             &Apache::lonnet::courseiddump($dom,'.',1,'.','.',  
                                                  $crs,undef,undef,'.');  
                         $chome = &Apache::lonnet::homeserver($crs,$dom);  
                     }  
                 }  
                 if ($name eq 'description' && defined($value)) {  
                     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value});  
                     if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {  
                         $crsinfo{$env{'request.course.id'}}{'description'} = $value;   
                         my $putresult =  
                             &Apache::lonnet::courseidput($dom,\%crsinfo,  
                                                          $chome,'notime');  
                     }  
                 }  
                 if (($name eq 'cloners') || ($name eq 'hidefromcat') || ($name eq 'categories')) {  
                     if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {  
                         &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$name => $value});  
                         $crsinfo{$env{'request.course.id'}}{$name} = $value;  
                         my $putresult =  
                             &Apache::lonnet::courseidput($dom,\%crsinfo,  
                                                          $chome,'notime');  
                     }  
                 }  
             } else {  
                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').  
     ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';  
             }  
             if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) {  
                 $setoutput.= &mt('Unable to include').': ';  
                 my @fails;  
                 my $num = 0;  
                 if (defined($failed_cloners{'format'})) {  
                     $fails[$num] .= '<b>'.$failed_cloners{'format'}.  
                                   '</b>, '.&mt('reason').' - '.  
                                   &mt('Invalid format');  
                     $num ++;  
                 }  
                 if (defined($failed_cloners{'domain'})) {  
                     $fails[$num] .= '<b>'.$failed_cloners{'domain'}.  
                                   '</b>, '.&mt('reason').' - '.  
                                   &mt('Domain does not exist');  
                     $num ++;  
                 }  
                 if (defined($failed_cloners{'newuser'})) {  
                     $fails[$num] .= '<b>'.$failed_cloners{'newuser'}.                                   '</b>, '.&mt('reason').' - '.  
                         &mt('LON-CAPA user(s) do(es) not exist.').  
                         '.<br />'.&mt('Please ').  
                         ' <a href="/adm/createuser">'.  
                         &mt('add the user(s)').'</a>, '.  
                         &mt('and then return to the ').  
                         '<a href="/adm/parmset?action=crsenv">'.  
                         &mt('Course Parameters page').'</a> '.  
                         &mt('to add the new user(s) to the list of possible cloners');  
                 }  
                 $setoutput .= join(';&nbsp;&nbsp;',@fails).'.<br />';  
             }  
         }  
     }  
   
     my $start_table     =&Apache::loncommon::start_data_table();  
     my $start_header_row=&Apache::loncommon::start_data_table_header_row();  
     my $end_header_row  =&Apache::loncommon::end_data_table_header_row();  
 # ------------------------- Re-init course environment entries for this session  
   
     &Apache::lonnet::coursedescription($env{'request.course.id'},  
        {'freshen_cache' => 1});  
   
 # -------------------------------------------------------- Get parameters again  
   
     my %values=&Apache::lonnet::dump('environment',$dom,$crs);  
     my $SelectStyleFile=&mt('Select Style File');  
     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');  
     my $output='';  
     my $can_categorize;  
     if (! exists($values{'con_lost'})) {  
         my %descriptions=  
     ('url'            => '<b>'.&mt('Top Level Map').'</b><br />'.  
                                  '<a href="javascript:openbrowser'.  
                                  "('envform','url','sequence')\">".  
                                  &mt('Select Map').'</a><br /><span class="LC_warning"> '.  
                                  &mt('Modification may make assessment data inaccessible!').  
                                  '</span>',  
              'description'    => '<b>'.&mt('Course Description').'</b>',  
              'courseid'       => '<b>'.&mt('Course ID or number').  
                                  '</b><br />'.  
                                  '('.&mt('internal, optional').')',  
              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br />'  
                                 .'("<tt>'.&mt('user:domain,user:domain,*:domain').'</tt>")<br />'  
                                 .&mt('Users with active Course Coordinator role in this course are permitted to clone and need not be included.').'<br />'  
                                 .&mt('Use [_1] to allow course to be cloned by anyone in the specified domain.','"<tt>*:domain</tt>"').'<br />'  
                                 .&mt('Use [_1] to allow unrestricted cloning in all domains.','"<tt>*</tt>"'),  
              'grading'        => '<b>'.&mt('Grading').'</b><br />'.  
                                  &mt('[_1], [_2], or [_3]','"<tt>standard</tt>"','"<tt>external</tt>"','"<tt>spreadsheet</tt>"').&Apache::loncommon::help_open_topic('GradingOptions'),  
      'task_grading'   => '<b>'.&mt('Bridge Task Grading').'</b><br />'  
                                 .&mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections.').'<br />'  
                                 .'('.&mt('[_1]: they are allowed (this is the default). [_2]: no, they can only grade their own section.','"<tt>any</tt>"','"<tt>section</tt>"').')',  
              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b><br />'.  
                     '<a href="javascript:openbrowser'.  
                     "('envform','default_xml_style'".  
                     ",'sty')\">$SelectStyleFile</a><br />",  
              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').'</b><br />'  
                                 .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',  
              'question.email.text' => '<b>'.&mt('Custom Text for Resource Content Question Option in Feedback').'</b>',  
              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'  
                                 .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',  
              'comment.email.text' => '<b>'.&mt('Custom Text for Course Content Option in Feedback').'</b>',  
              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b><br />'  
                                  .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',  
              'policy.email.text' => '<b>'.&mt('Custom Text for Course Policy Option in Feedback').'</b>',  
              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'  
                                 .'('.&mt('[_1] for default hiding','"<tt>yes</tt>"').')',  
              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'  
                                  .'('.&mt('[_1] for visible separation.','"<tt>yes</tt>"').' '  
                                  .&mt('Changes will not show until next login.').')',  
              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b><br />'  
                                         .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"<tt>all</tt>"','"<tt>section</tt>"','"<tt>disabled</tt>"').')',  
              'student_classlist_portfiles' => '<b>'.&mt('Include link to accessible portfolio files').'</b><br />'  
                                              .'('.&mt("[_1] for link to each a listing of each student's files.",'"<tt>yes</tt>"').')',  
              'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'  
                                            .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"<tt>yes</tt>"').')',  
              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').'</b><br />'  
                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'  
                                  .'("<tt>'.&mt('role,role,...').'</tt>") '  
                          .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),  
              'plc.users.denied' =>   
                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.  
                                   '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',  
   
              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').'</b><br />'  
                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"')  
                                  .'("<tt>'.&mt('role,role,...').'</tt>") '  
                                  .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),  
              'pch.users.denied' =>   
                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.  
                                  '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',  
              'spreadsheet_default_classcalc'   
                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.  
                     '<a href="javascript:openbrowser'.  
                     "('envform','spreadsheet_default_classcalc'".  
                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",  
              'spreadsheet_default_studentcalc'   
                  => '<b>'.&mt('Default Student Spreadsheet').'</b><br />'.  
                     '<a href="javascript:openbrowser'.  
                     "('envform','spreadsheet_default_calc'".  
                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",  
              'spreadsheet_default_assesscalc'   
                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.  
                     '<a href="javascript:openbrowser'.  
                     "('envform','spreadsheet_default_assesscalc'".  
                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",  
      'allow_limited_html_in_feedback'  
          => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.  
             '('.&mt('Set value to [_1] to allow.','"<tt>yes</tt>"').')',  
              'allow_discussion_post_editing'  
                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />'  
                    .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'  
                    .'('.&mt('Set value to [_1] to allow all roles.','"<tt>yes</tt>"').')'  
                    .'("<tt>'.&mt('role:section,role:section,...').'</tt>")<br />'  
                    .'('.&mt('Example: "<tt>st:001,st:002,in,cc</tt>" would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')',  
      'rndseed'  
          => '<b>'.&mt('Randomization algorithm used').'</b><br />'  
                    .'<span class="LC_error">'  
                    .&mt('Modifying this will make problems have different numbers and answers!')  
                    .'</span>',  
      'receiptalg'  
          => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.  
                     &mt('This controls how receipt numbers are generated.'),  
              'suppress_tries'  
                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.  
                     ' ('.&mt('[_1] to suppress, anything else to not suppress','"<tt>yes</tt>"').')',  
              'problem_stream_switch'  
                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.  
                     ' ('.&mt('[_1] if allowed, anything else if not','"<tt>yes</tt>"').')',  
              'default_paper_size'   
                  => '<b>'.&mt('Default paper type').'</b><br />'.  
                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.   
                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.   
                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',  
      'print_header_format'  
          => ' <b>'.&mt('Print header format').'</b><br />'  
                    .&mt('Substitutions:<br />[_1]: student name, [_2]: course id, [_3]: assignment note. Numbers after the <tt>%</tt> limit the field size.','"<tt>%n</tt>"','"<tt>%c</tt>"','"<tt>%a</tt>"'),  
              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',  
              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',  
              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b><br />'  
                                      .'("<tt>'.&mt('user:domain,user:domain,*:domain').'</tt>")',  
              'languages' => '<b>'.&mt('Languages used').'</b>',  
              'disable_receipt_display'  
                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.  
                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',  
      'task_messages'  
          => '<b>'.&mt('Send message to student when clicking Done on Tasks').'</b><br /> ('.&mt('[_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','"<tt>only_student</tt>"','"<tt>student_and_user_notes_screen</tt>"').')',  
      'disablesigfigs'  
          => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.  
                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',  
      'disableexampointprint'  
          => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.  
                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',  
              'externalsyllabus'  
                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',  
      'tthoptions'  
          => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>',  
   
      'texengine'  
          => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'  
                    .'('.&mt("[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student's preference",'"<tt>jsMath</tt>"','"<tt>mimetex</tt>"','"<tt>tth</tt>"').')',  
              'timezone'  
                  => '<b>'.&mt('Timezone in which the course takes place').'</b>',  
   
              'suppress_embed_prompt'  
                  => '<b>'.&mt('Suppress prompt to upload items referenced in a web page being uploaded to portfolio, when current role is student.').'</b><br />'.  
                     ' ('.&mt('[_1] to suppress, anything else to not suppress','"<tt>yes</tt>"').')',  
              'hidefromcat'  
                  => '<b>'.&mt('Exclude from course catalog').'</b><br />'.  
                     ' ('.&mt('[_1] to exclude, anything else to include - included if assigned an institutional code, or manually catagorized','"<tt>yes</tt>"').')',  
              'categories'  
                  => '<b>'.&mt('Categorize course').'</b> <a href="javascript:catsbrowser()">'.  
                     &mt('Display Categories').'</a>',  
              'datelocale'   
                  => '<b>'.&mt('Locale used for course calendar').'</b>',  
              );  
         my @Display_Order = ('url','description','courseid','cloners');  
         (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom);  
         if ($can_toggle_cat) {  
             push(@Display_Order,'hidefromcat');  
         }  
         if ($can_categorize) {  
             push(@Display_Order,'categories');  
         }  
         push (@Display_Order,('grading',  
                              'externalsyllabus',  
                              'default_xml_style','pageseparators',  
                              'question.email','question.email.text','comment.email',  
                              'comment.email.text','policy.email','policy.email.text',  
                              'student_classlist_view',  
                              'student_classlist_opt_in',  
                              'student_classlist_portfiles',  
                              'plc.roles.denied','plc.users.denied',  
                              'pch.roles.denied','pch.users.denied',  
                              'allow_limited_html_in_feedback',  
                              'allow_discussion_post_editing',  
                              'languages',  
                              'timezone',  
                              'datelocale',  
      'nothideprivileged',  
                              'rndseed',  
                              'receiptalg',  
                              'problem_stream_switch',  
      'suppress_tries',  
                              'suppress_embed_prompt',  
                              'default_paper_size',  
      'print_header_format',  
                              'disable_receipt_display',  
                              'spreadsheet_default_classcalc',  
                              'spreadsheet_default_studentcalc',  
                              'spreadsheet_default_assesscalc',   
                              'hideemptyrows',  
                              'default_enrollment_start_date',  
                              'default_enrollment_end_date',  
      'tthoptions',  
      'texengine',  
      'disablesigfigs',  
      'disableexampointprint',  
      'task_messages','task_grading'));  
  foreach my $parameter (sort(keys(%values))) {  
             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||  
                     ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)  
                     || ($parameter eq 'type')) {  
                 if (! $descriptions{$parameter}) {  
                     $descriptions{$parameter}=$parameter;  
                     push(@Display_Order,$parameter);  
                 }  
             }  
  }  
   
         foreach my $parameter (@Display_Order) {  
             my $description = $descriptions{$parameter};  
             # onchange is javascript to automatically check the 'Set' button.  
             my $onchange = 'onFocus="javascript:window.document.forms'.  
                 "['envform'].elements['".$parameter."_setparmval']".  
                 '.checked=true;"';  
             $output .= &Apache::loncommon::start_data_table_row().  
  '<td>'.$description.'</td>';  
             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {  
                 $output .= '<td>'.  
                     &Apache::lonhtmlcommon::date_setter('envform',  
                                                         $parameter.'_value',  
                                                         $values{$parameter},  
                                                         $onchange).  
                                                         '</td>';  
             } elsif ($parameter eq 'timezone') {  
                 my $includeempty = 1;  
                 my $timezone = &Apache::lonlocal::gettimezone();  
                 $output .= '<td>'.  
                     &Apache::loncommon::select_timezone($parameter.'_value',  
                                                         $timezone,  
                                                         $onchange,$includeempty).'</td>';  
             } elsif ($parameter eq 'datelocale') {  
                 my $includeempty = 1;  
                 my $locale_obj = &Apache::lonlocal::getdatelocale();  
                 my $currdatelocale;  
                 if (ref($locale_obj)) {  
                     $currdatelocale = $locale_obj->id();  
                 }  
                 $output .= '<td>'.  
                     &Apache::loncommon::select_datelocale($parameter.'_value',  
                                                           $currdatelocale,  
                                                           $onchange,$includeempty).'</td>';   
             } elsif ($parameter eq 'categories') {  
                 my $catdisplay;  
                 if ($values{'categories'} ne '') {  
                     my @curritems = split(/\&/,$values{'categories'});  
                     foreach my $item (@curritems) {  
                         my ($name,$parent,$pos) = split(/:/,$item);  
                         $catdisplay .= &unescape($name).'&';  
                     }  
                     $catdisplay =~ s/\&$//;  
                 }   
                 $output .= '<td>'.  
                            '<input type="hidden" name="categories_value" value="'.  
                            $values{'categories'}.'" />'.  
                            '<input type="textbox" name="categories_display" value="'.  
                            $catdisplay.'" readonly="readonly" size="40" /></td>';  
             } else {  
                 $output .= '<td>'.  
                     &Apache::lonhtmlcommon::textbox($parameter.'_value',  
                                                     $values{$parameter},  
                                                     40,$onchange).'</td>';  
             }  
             $output .= '<td>'.  
                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').  
                 '</td>';  
             $output .= &Apache::loncommon::end_data_table_row()."\n";  
  }  
         my $onchange = 'onFocus="javascript:window.document.forms'.  
             '[\'envform\'].elements[\'newp_setparmval\']'.  
             '.checked=true;"';  
  $output.=&Apache::loncommon::start_data_table_row().  
     '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.  
     '<input type="text" size="40" name="newp_name" '.  
                 $onchange.' /></td><td>'.  
             '<input type="text" size="40" name="newp_value" '.  
                 $onchange.' /></td><td>'.  
     '<input type="checkbox" name="newp_setparmval" /></td>'.  
     &Apache::loncommon::end_data_table_row()."\n";  
     }  
     my %lt=&Apache::lonlocal::texthash(  
     'par'   => 'Parameter',  
     'val'   => 'Value',  
     'set'   => 'Set?',  
     'sav'   => 'Save'  
        );  
   
     my $Parameter=&mt('Parameter');  
     my $Value=&mt('Value');  
     my $Set=&mt('Set');  
     my ($jscript,$categorize_js);  
     my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');  
     if ($can_categorize) {  
         $categorize_js = <<ENDSCRIPT;  
 function catsbrowser() {  
     var catswin = null;  
     var url = '/adm/parmset?action=categorizecourse';  
     if (!catswin || catswin.closed) {  
         catswin=window.open(url,'categorieswin','height=480,width=600,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');  
     } else {  
         catswin.focus();  
     }  
 }   
 ENDSCRIPT  
     }  
     $jscript = '<script type="text/javascript" language="Javascript">'."\n".  
                $browse_js."\n".$categorize_js."\n".'</script>';  
     my $start_page =   
  &Apache::loncommon::start_page('Set Course Environment',  
        $jscript);  
     my $end_page =   
  &Apache::loncommon::end_page();  
     my $end_table=&Apache::loncommon::end_data_table();  
     $r->print(<<ENDENV);  
 $start_page  
 $breadcrumbs  
 <form method="post" action="/adm/parmset?action=crsenv" name="envform">  
 $setoutput  
 <div><input type="submit" name="crsenv" value="$lt{'sav'}" /></div>  
 $start_table  
 $start_header_row  
 <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}</th>  
 $end_header_row  
 $output  
 $end_table  
 <input type="submit" name="crsenv" value="$lt{'sav'}" />  
 </form>  
 $end_page  
 ENDENV  
 }  
   
 sub can_modify_catsettings {  
     my ($dom) = @_;  
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);  
     my ($can_toggle_cat,$can_categorize);  
     if (ref($domconf{'coursecategories'}) eq 'HASH') {  
         if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {  
             $can_toggle_cat = 1;  
         }  
         if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {  
             $can_categorize = 1;  
         }  
     }  
     return ($can_toggle_cat,$can_categorize);  
 }  
   
 sub assign_course_categories {  
     my ($r) = @_;  
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
     my $hascats = 0;  
     my $cathash;  
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);  
     if (ref($domconf{'coursecategories'}) eq 'HASH') {  
         $cathash = $domconf{'coursecategories'}{'cats'};  
         if (ref($cathash) eq 'HASH') {  
             $hascats = 1;     
         }  
     }  
     my $catwin_js;  
     if ($hascats) {  
         my $alert = &mt('Use \"Save\" in the main window to save course categories');  
         $catwin_js = <<ENDSCRIPT;  
 <script type="text/javascript">  
   
 function updateCategories() {  
     var newcategories = '';  
     var unescapedcats = '';  
     if (document.chgcats.usecategory.length) {  
         for (var i=0; i<document.chgcats.usecategory.length; i++) {  
             if (document.chgcats.usecategory[i].checked == true) {  
                 newcategories = newcategories + document.chgcats.usecategory[i].value + '&';  
                 unescapedcats = unescapedcats + document.chgcats.catname[i].value + ' & ';  
             }  
         }  
         if (newcategories.length > 0) {  
             newcategories = newcategories.slice(0,-1);  
         }  
         if (unescapedcats.length > 0) {  
             unescapedcats = unescapedcats.slice(0,-3);  
         }  
     } else {  
          if (document.chgcats.usecategory.checked == true) {  
              newcategories = document.chgcats.usecategory.value;  
              unescapedcats = document.chgcats.catname.value;  
          }  
     }  
     opener.document.envform.categories_value.value = newcategories;  
     opener.document.envform.categories_display.value = unescapedcats;  
     opener.document.envform.categories_setparmval.checked = true;  
     alert("$alert");  
     self.close();  
     return;  
 }  
   
 </script>  
 ENDSCRIPT  
     } else {  
         my $onload;   
     }  
     my $start_page =  
         &Apache::loncommon::start_page('Course Categories',$catwin_js,  
                                        {'only_body'      => 1,});  
     my $end_page = &Apache::loncommon::end_page();  
     my $categoriesform = '<h3>'.&mt('Categorize Course').'</h3>';  
     if ($hascats) {  
         my %currsettings =  
             &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);  
         $categoriesform .= &mt('Assign one or more categories to this course.').'<br /><br />'.  
                                '<form name="chgcats" action="/adm/parmset" method="post">'."\n"  
                                .&Apache::loncommon::assign_categories_table($cathash,  
                                                        $currsettings{'categories'})."\n"  
                                .'<br /><input type="button" name="changes" value="'  
                                .&mt('Copy to main window').'" '  
                                .'onclick="javascript:updateCategories()" /></form><br />';  
     } else {  
         $categoriesform .= &mt('No categories defined for this domain');  
     }  
     $r->print($start_page.$categoriesform.$end_page);  
     return;  
 }  
   
 ##################################################  ##################################################
 # Overview mode  # Overview mode
 ##################################################  ##################################################
Line 2913  sub storedata { Line 2742  sub storedata {
     $typeof=$env{'form.typeof_'.$thiskey};      $typeof=$env{'form.typeof_'.$thiskey};
     $text = &mt('Saved modified date for');      $text = &mt('Saved modified date for');
  }   }
  if (defined($data) and $$olddata{$thiskey} ne $data) {    if (defined($data) and $$olddata{$thiskey} ne $data) {
     if ($tuname) {      if ($tuname) {
  if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,   if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
  $tkey.'.type' => $typeof},   $tkey.'.type' => $typeof},
Line 2928  sub storedata { Line 2757  sub storedata {
  &Apache::lonnet::devalidateuserresdata($tuname,$tudom);   &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
     } else {      } else {
  $newdata{$thiskey}=$data;   $newdata{$thiskey}=$data;
   $newdata{$thiskey.'.type'}=$typeof;     $newdata{$thiskey.'.type'}=$typeof;
                    }                      }
  }   }
     } elsif ($cmd eq 'del') {      } elsif ($cmd eq 'del') {
  if ($tuname) {   if ($tuname) {
Line 2983  sub parse_listdata_key { Line 2812  sub parse_listdata_key {
     my ($key,$listdata) = @_;      my ($key,$listdata) = @_;
     # split into student/section affected, and      # split into student/section affected, and
     # the realm (folder/resource part and parameter      # the realm (folder/resource part and parameter
     my ($student,$realm) =       my ($student,$realm) =
  ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);   ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
     # if course wide student would be undefined      # if course wide student would be undefined
     if (!defined($student)) {      if (!defined($student)) {
Line 3024  sub listdata { Line 2853  sub listdata {
  if ($sortorder eq 'realmstudent') {   if ($sortorder eq 'realmstudent') {
             if ($ares     ne $bres    ) {              if ($ares     ne $bres    ) {
  $result = ($ares     cmp $bres);   $result = ($ares     cmp $bres);
             } elsif ($astudent ne $bstudent) {               } elsif ($astudent ne $bstudent) {
  $result = ($astudent cmp $bstudent);   $result = ($astudent cmp $bstudent);
     } elsif ($apart    ne $bpart   ) {      } elsif ($apart    ne $bpart   ) {
  $result = ($apart    cmp $bpart);   $result = ($apart    cmp $bpart);
     }      }
  } else {   } else {
     if      ($astudent ne $bstudent) {       if      ($astudent ne $bstudent) {
  $result = ($astudent cmp $bstudent);   $result = ($astudent cmp $bstudent);
     } elsif ($ares     ne $bres    ) {      } elsif ($ares     ne $bres    ) {
  $result = ($ares     cmp $bres);   $result = ($ares     cmp $bres);
Line 3038  sub listdata { Line 2867  sub listdata {
  $result = ($apart    cmp $bpart);   $result = ($apart    cmp $bpart);
     }      }
  }   }
       
  if (!$result) {   if (!$result) {
             if (defined($aparm) && defined($bparm)) {              if (defined($aparm) && defined($bparm)) {
  $result = ($aparm <=> $bparm);   $result = ($aparm <=> $bparm);
Line 3103  sub listdata { Line 2932  sub listdata {
     }      }
     if ($part ne $oldpart) {      if ($part ne $oldpart) {
  $r->print(&tableend().   $r->print(&tableend().
   "\n<span class=\"LC_parm_part\">".&mt('Part').": $part</span>");    "\n".'<span class="LC_parm_part">'.&mt('Part').": $part</span>");
  $oldpart=$part;   $oldpart=$part;
     }      }
 #  #
 # Ready to print  # Ready to print
 #  #
               my $parmitem = &standard_parameter_names($name);
     $r->print(&tablestart().      $r->print(&tablestart().
       &Apache::loncommon::start_data_table_row().        &Apache::loncommon::start_data_table_row().
       '<td><b>'.&standard_parameter_names($name).        '<td><b>'.&mt($parmitem).
       '</b></td><td><input type="checkbox" name="del_'.        '</b></td><td><input type="checkbox" name="del_'.
       $thiskey.'" /></td><td>');        $thiskey.'" /></td><td>');
     $foundkeys++;      $foundkeys++;
Line 3138  sub listdata { Line 2968  sub listdata {
  $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));   $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
     }      }
     $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.      $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
       $thistype.'">');        $thistype.'" />');
     $r->print('</td>'.&Apache::loncommon::end_data_table_row());      $r->print('</td>'.&Apache::loncommon::end_data_table_row());
  }   }
     }      }
Line 3188  sub default_selector { Line 3018  sub default_selector {
     return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';      return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';
 }  }
   
 my %strings =   my %strings =
     (      (
      'string_yesno'       'string_yesno'
              => [[ 'yes', 'Yes' ],               => [[ 'yes', 'Yes' ],
Line 3203  my %strings = Line 3033  my %strings =
   
 sub string_selector {  sub string_selector {
     my ($thistype, $thiskey, $showval) = @_;      my ($thistype, $thiskey, $showval) = @_;
       
     if (!exists($strings{$thistype})) {      if (!exists($strings{$thistype})) {
  return &default_selector($thiskey,$showval);   return &default_selector($thiskey,$showval);
     }      }
Line 3296  ENDOVER Line 3126  ENDOVER
     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');      my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
     if (!@psprt) { $psprt[0]='0'; }      if (!@psprt) { $psprt[0]='0'; }
   
     my @selected_sections =       my @selected_sections =
  &Apache::loncommon::get_env_multiple('form.Section');   &Apache::loncommon::get_env_multiple('form.Section');
     @selected_sections = ('all') if (! @selected_sections);      @selected_sections = ('all') if (! @selected_sections);
     foreach my $sec (@selected_sections) {      foreach my $sec (@selected_sections) {
Line 3309  ENDOVER Line 3139  ENDOVER
   
     my $pssymb='';      my $pssymb='';
     my $parmlev='';      my $parmlev='';
    
     unless ($env{'form.parmlev'}) {      unless ($env{'form.parmlev'}) {
         $parmlev = 'map';          $parmlev = 'map';
     } else {      } else {
         $parmlev = $env{'form.parmlev'};          $parmlev = $env{'form.parmlev'};
     }      }
   
     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,       &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
  \%mapp, \%symbp,\%maptitles,\%uris,   \%mapp, \%symbp,\%maptitles,\%uris,
  \%keyorder,\%defkeytype);   \%keyorder,\%defkeytype);
   
Line 3325  ENDOVER Line 3155  ENDOVER
     }      }
 # Menu to select levels, etc  # Menu to select levels, etc
   
     $r->print('<table id="LC_parm_overview_scope">      #$r->print('<table id="LC_parm_overview_scope">
                <tr><td class="LC_parm_overview_level_menu">');      #           <tr><td class="LC_parm_overview_level_menu">');
       $r->print('<div class="LC_Box">');
       #$r->print('<h2 class="LC_hcell">Step 1</h2>');
       $r->print('<div>');
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
     &levelmenu($r,\%alllevs,$parmlev);      &levelmenu($r,\%alllevs,$parmlev);
     if ($parmlev ne 'general') {      if ($parmlev ne 'general') {
  $r->print('<td class="LC_parm_overview_map_menu">');   #$r->print('<td class="LC_parm_overview_map_menu">');
           $r->print(&Apache::lonhtmlcommon::row_closure());
  &mapmenu($r,\%allmaps,$pschp,\%maptitles);   &mapmenu($r,\%allmaps,$pschp,\%maptitles);
  $r->print('</td>');   #$r->print('</td>');
     }      }
     $r->print('</td></tr></table>');      $r->print(&Apache::lonhtmlcommon::row_closure(1));
       $r->print(&Apache::lonhtmlcommon::end_pick_box());
     $r->print('<table id="LC_parm_overview_controls">      $r->print('</div></div>');
                <tr><td class="LC_parm_overview_parm_selectors">');        #$r->print('</td></tr></table>');
   
       #$r->print('<table id="LC_parm_overview_controls">
       #           <tr><td class="LC_parm_overview_parm_selectors">');
       $r->print('<div class="LC_Box">');
       $r->print('<div>');
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
     &parmmenu($r,\%allparms,\@pscat,\%keyorder);      &parmmenu($r,\%allparms,\@pscat,\%keyorder);
     $r->print('</td><td class="LC_parm_overview_restrictions">      $r->print(&Apache::lonhtmlcommon::end_pick_box());
                 <table class="LC_parm_overview_restrictions">'.      &parmboxes($r,\%allparms,\@pscat,\%keyorder);
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
       #$r->print('</td><td class="LC_parm_overview_restrictions">'.
        $r->print('<table>'.
               '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').                '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
               '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');                '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
     &partmenu($r,\%allparts,\@psprt);      &partmenu($r,\%allparts,\@psprt);
Line 3348  ENDOVER Line 3193  ENDOVER
     $r->print('</td><td>');      $r->print('</td><td>');
     &groupmenu($r,\@selected_groups);      &groupmenu($r,\@selected_groups);
     $r->print('</td></tr></table>');      $r->print('</td></tr></table>');
     $r->print('</td></tr></table>');      #$r->print('</td></tr></table>');
        $r->print(&Apache::lonhtmlcommon::row_closure(1));
       $r->print(&Apache::lonhtmlcommon::end_pick_box());
       $r->print('</div></div>');
   
       $r->print('<div class="LC_Box">');
       $r->print('<div>');
     my $sortorder=$env{'form.sortorder'};      my $sortorder=$env{'form.sortorder'};
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder);
       $r->print('</div></div>');
   
     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');      $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
   
Line 3450  ENDOVER Line 3301  ENDOVER
     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);      my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
   
     $r->print(&tableend().'<p>'.      $r->print(&tableend().'<p>'.
  ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.   ($foundkeys?'<input type="submit" value="'.&mt('Save').'" />':&mt('There are no parameters.')).'</p></form>'.
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
 }  }
   
Line 3497  ENDOVER Line 3348  ENDOVER
     $r->print(&Apache::loncommon::start_data_table_row().      $r->print(&Apache::loncommon::start_data_table_row().
       '<tr>'.        '<tr>'.
       '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'      );        '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'      );
       
     $r->print('<td>');      $r->print('<td>');
     my $display_value = $resourcedata->{$thiskey};      my $display_value = $resourcedata->{$thiskey};
     if (&isdateparm($resourcedata->{$thiskey.'.type'})) {      if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
  $display_value =    $display_value =
     &Apache::lonlocal::locallocaltime($display_value);      &Apache::lonlocal::locallocaltime($display_value);
     }      }
               my $parmitem = &standard_parameter_names($data{'parameter_name'});
               $parmitem = &mt($parmitem);
     $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',      $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
   &standard_parameter_names($data{'parameter_name'}),    $parmitem,$resourcedata->{$thiskey}));
   $resourcedata->{$thiskey}));  
     $r->print('<br />');      $r->print('<br />');
     if ($data{'scope_type'} eq 'all') {      if ($data{'scope_type'} eq 'all') {
  $r->print(&mt('All users'));   $r->print(&mt('All users'));
Line 3530  ENDOVER Line 3382  ENDOVER
     }      }
     $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));      $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));
     $r->print('</td></tr>');      $r->print('</td></tr>');
   
  }   }
     }      }
     $r->print(&Apache::loncommon::end_data_table().'<p>'.      $r->print(&Apache::loncommon::end_data_table().'<p>'.
Line 3620  sub parse_key { Line 3472  sub parse_key {
  my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});   my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
  $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);   $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
     }      }
       
     $data{'parameter_part'} = $part;      $data{'parameter_part'} = $part;
     $data{'parameter_name'} = $name;      $data{'parameter_name'} = $name;
   
Line 3660  sub check_cloners { Line 3512  sub check_cloners {
                         $disallowed{'format'} .= $currclone.',';                          $disallowed{'format'} .= $currclone.',';
                     }                      }
                 } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {                  } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {
                     $disallowed{'format'} .= $currclone.',';                       $disallowed{'format'} .= $currclone.',';
                 } else {                  } else {
                     if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {                      if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                         $disallowed{'newuser'} .= $currclone.',';                          $disallowed{'newuser'} .= $currclone.',';
Line 3689  sub change_clone { Line 3541  sub change_clone {
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $clone_crs = $cnum.':'.$cdom;      my $clone_crs = $cnum.':'.$cdom;
       
     if ($cnum && $cdom) {      if ($cnum && $cdom) {
         my @allowclone;          my @allowclone;
         &extract_cloners($clonelist,\@allowclone);          &extract_cloners($clonelist,\@allowclone);
Line 3770  ENDMAINFORMHEAD Line 3622  ENDMAINFORMHEAD
     my @menu =      my @menu =
         ( { categorytitle=>'Settings for this Course',          ( { categorytitle=>'Settings for this Course',
     items => [      items => [
   { linktext => 'Course Environment',    { linktext => 'Course Configuration',
     url => '/adm/parmset?action=crsenv',      url => '/adm/courseprefs?origin=params',
     permission => $parm_permission,      permission => $parm_permission,
     linktitle =>'Edit environment settings for this course.'  ,      linktitle =>'Edit course configuration.'  ,
     icon => 'preferences-desktop-remote-desktop.png'  ,      icon => 'preferences-desktop-remote-desktop.png'  ,
     #help => 'Course_Environment',      #help => 'Course_Environment',
     },      },
Line 3801  ENDMAINFORMHEAD Line 3653  ENDMAINFORMHEAD
     permission => $parm_permission,      permission => $parm_permission,
     linktitle =>'Set default actions for parameters.'  ,      linktitle =>'Set default actions for parameters.'  ,
     icon => 'folder-new.png'  ,      icon => 'folder-new.png'  ,
     }]},                }]},
   { categorytitle => 'New and Existing Parameter Settings for Resources',    { categorytitle => 'New and Existing Parameter Settings for Resources',
     items => [      items => [
   { linktext => 'Edit Resource Parameters - Helper Mode',    { linktext => 'Edit Resource Parameters - Helper Mode',
Line 3833  ENDMAINFORMHEAD Line 3685  ENDMAINFORMHEAD
     linktitle =>'Set/Modify existing resource parameters in overview mode.'  ,      linktitle =>'Set/Modify existing resource parameters in overview mode.'  ,
     icon => 'preferences-desktop-wallpaper.png'  ,      icon => 'preferences-desktop-wallpaper.png'  ,
     #help => 'Parameter_Overview',      #help => 'Parameter_Overview',
     },                },
   { linktext => 'Change Log',    { linktext => 'Change Log',
     url => '/adm/parmset?action=parameterchangelog',      url => '/adm/parmset?action=parameterchangelog',
     permission => $parm_permission,      permission => $parm_permission,
Line 3865  sub output_row { Line 3717  sub output_row {
             push @options,['deleted', 'Delete Metadata Field'];              push @options,['deleted', 'Delete Metadata Field'];
         }          }
        $output = &Apache::loncommon::start_data_table_row();         $output = &Apache::loncommon::start_data_table_row();
         $output .= '<td><span class="LC_metadata"><strong>'.$field_text.':</strong></span></td>';          $output .= '<td><strong>'.$field_text.':</strong></td>';
         $output .= &Apache::loncommon::end_data_table_row();          $output .= &Apache::loncommon::end_data_table_row();
         foreach my $opt (@options) {          foreach my $opt (@options) {
     my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;      my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
     $output .= &Apache::loncommon::continue_data_table_row();      $output .= &Apache::loncommon::continue_data_table_row();
     $output .= '<td>'.('&nbsp;' x 5).'<span class="LC_metadata"><label>      $output .= '<td>'.('&nbsp;' x 5).'<label>
                <input type="checkbox" name="'.                 <input type="checkbox" name="'.
                $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.                 $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                &mt($opt->[1]).'</label></span> </td>';                 &mt($opt->[1]).'</label></td>';
     $output .= &Apache::loncommon::end_data_table_row();      $output .= &Apache::loncommon::end_data_table_row();
  }   }
         $output .= &Apache::loncommon::continue_data_table_row();          $output .= &Apache::loncommon::continue_data_table_row();
         $output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata"><input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></span></td>';          $output .= '<td>'.('&nbsp;' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';
         $output .= &Apache::loncommon::end_data_table_row();          $output .= &Apache::loncommon::end_data_table_row();
         my $multiple_checked;          my $multiple_checked;
         my $single_checked;          my $single_checked;
         if ($options =~ m/onlyone/) {          if ($options =~ m/onlyone/) {
             $multiple_checked = "";              $multiple_checked = '';
             $single_checked = " CHECKED ";              $single_checked = ' checked="checked"';
         } else {          } else {
             $multiple_checked = " CHECKED ";              $multiple_checked = ' checked="checked"';
             $single_checked = "";              $single_checked = '';
         }          }
  $output .= &Apache::loncommon::continue_data_table_row();   $output .= &Apache::loncommon::continue_data_table_row();
  $output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata">   $output .= '<td>'.('&nbsp;' x 10).'
             <input type="radio" name="'.$field_name.'_onlyone" value="multiple" '.$multiple_checked .'/>              <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
             '.&mt('Student may select multiple choices from list').'</span></td>';              '.&mt('Student may select multiple choices from list').'</td>';
  $output .= &Apache::loncommon::end_data_table_row();   $output .= &Apache::loncommon::end_data_table_row();
  $output .= &Apache::loncommon::continue_data_table_row();   $output .= &Apache::loncommon::continue_data_table_row();
  $output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata">   $output .= '<td>'.('&nbsp;' x 10).'
             <input type="radio" name="'.$field_name.'_onlyone"  value="single" '.$single_checked.'/>              <input type="radio" name="'.$field_name.'_onlyone"  value="single"'.$single_checked.' />
             '.&mt('Student may select only one choice from list').'</span></td>';              '.&mt('Student may select only one choice from list').'</td>';
  $output .= &Apache::loncommon::end_data_table_row();   $output .= &Apache::loncommon::end_data_table_row();
     }      }
     return ($output);      return ($output);
Line 3950  sub order_meta_fields { Line 3802  sub order_meta_fields {
         }          }
  my $ordered_fields = join ",", @neworder;   my $ordered_fields = join ",", @neworder;
         my $put_result = &Apache::lonnet::put('environment',          my $put_result = &Apache::lonnet::put('environment',
                            {'metadata.addedorder'=>$ordered_fields},$dom,$crs);                             {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
  &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});   &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
     }      }
     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});      my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
Line 3963  sub order_meta_fields { Line 3815  sub order_meta_fields {
             $ordered_fields = join ",", @fields_in_order;              $ordered_fields = join ",", @fields_in_order;
         }          }
         my $put_result = &Apache::lonnet::put('environment',          my $put_result = &Apache::lonnet::put('environment',
                             {'metadata.addedorder'=>$ordered_fields},$dom,$crs);                               {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
     }       }
     $r->print('<table>');      $r->print('<table>');
     my $num_fields = scalar(@fields_in_order);      my $num_fields = scalar(@fields_in_order);
     foreach my $key (@fields_in_order) {      foreach my $key (@fields_in_order) {
Line 4015  sub addmetafield { Line 3867  sub addmetafield {
             $options =~ s/,,/,/;              $options =~ s/,,/,/;
             my $put_result = &Apache::lonnet::put('environment',              my $put_result = &Apache::lonnet::put('environment',
                                         {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);                                          {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
                                           
             $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');              $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
         }          }
         $r->print(&continue());          $r->print(&continue());
Line 4074  sub setrestrictmeta { Line 3926  sub setrestrictmeta {
                     $save_field = $meta_field;                      $save_field = $meta_field;
                if ($env{'form.'.$meta_field.'_stuadd'}) {                 if ($env{'form.'.$meta_field.'_stuadd'}) {
                    $options.='stuadd,';                     $options.='stuadd,';
                }                  }
                if ($env{'form.'.$meta_field.'_choices'}) {                 if ($env{'form.'.$meta_field.'_choices'}) {
                    $options.='choices,';                     $options.='choices,';
                }                  }
                if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {                 if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
                    $options.='onlyone,';                     $options.='onlyone,';
                }                  }
                if ($env{'form.'.$meta_field.'_active'}) {                 if ($env{'form.'.$meta_field.'_active'}) {
                    $options.='active,';                     $options.='active,';
                }                 }
Line 4126  ENDButtons Line 3978  ENDButtons
         $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);          $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
     }      }
     $output .= &Apache::loncommon::end_data_table();      $output .= &Apache::loncommon::end_data_table();
     $r->print(<<ENDenv);             $r->print(<<ENDenv);
         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">          <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
         $output          $output
         $buttons          $buttons
Line 4172  sub defaultsetter { Line 4024  sub defaultsetter {
   
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
     text=>"Set Defaults"});      text=>"Set Defaults"});
     my $start_page =       my $start_page =
  &Apache::loncommon::start_page('Parameter Setting Default Actions');   &Apache::loncommon::start_page('Parameter Setting Default Actions');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
     $r->print(<<ENDDEFHEAD);      $r->print(<<ENDDEFHEAD);
Line 4196  ENDDEFHEAD Line 4048  ENDDEFHEAD
     my %keyorder=&standardkeyorder();      my %keyorder=&standardkeyorder();
     my %defkeytype=();      my %defkeytype=();
   
     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,       &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
  \%mapp, \%symbp,\%maptitles,\%uris,   \%mapp, \%symbp,\%maptitles,\%uris,
  \%keyorder,\%defkeytype);   \%keyorder,\%defkeytype);
     if ($env{'form.storerules'}) {      if ($env{'form.storerules'}) {
Line 4259  ENDDEFHEAD Line 4111  ENDDEFHEAD
     push @datedisplay,&mt('Automatically set later than ').$tempkey;      push @datedisplay,&mt('Automatically set later than ').$tempkey;
     push @dateoptions,'earlier_than_'.$tempkey;      push @dateoptions,'earlier_than_'.$tempkey;
     push @datedisplay,&mt('Automatically set earlier than ').$tempkey;      push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
  }    }
     }      }
 $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.  $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
   &mt('Automatic setting rules apply to table mode interfaces only.'));    &mt('Automatic setting rules apply to table mode interfaces only.'));
Line 4310  ENDINPUTDATE Line 4162  ENDINPUTDATE
  } elsif ($defkeytype{$tempkey} eq 'string_yesno') {   } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
             my $yeschecked='';              my $yeschecked='';
             my $nochecked='';              my $nochecked='';
             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }              if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }              if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
   
     $r->print(<<ENDYESNO);      $r->print(<<ENDYESNO);
 <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />  <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
 <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>  <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
 ENDYESNO  ENDYESNO
         } else {          } else {
     $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');      $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
Line 4324  ENDYESNO Line 4176  ENDYESNO
     }      }
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
       "\n".'<input type="submit" name="storerules" value="'.        "\n".'<input type="submit" name="storerules" value="'.
       &mt('Save Rules').'" /></form>'."\n".        &mt('Save').'" /></form>'."\n".
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
     return;      return;
 }  }
Line 4353  sub components { Line 4205  sub components {
  $issection='';   $issection='';
     }      }
     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';      my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
     my $realmdescription=&mt('all resources');       my $realmdescription=&mt('all resources');
     if ($middle=~/^(.+)\_\_\_\(all\)$/) {      if ($middle=~/^(.+)\_\_\_\(all\)$/) {
  $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';   $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';
   $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);    $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
Line 4368  sub components { Line 4220  sub components {
 }  }
   
 my %standard_parms;  my %standard_parms;
   my %standard_parms_types;
   
 sub load_parameter_names {  sub load_parameter_names {
     open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");      open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
Line 4379  sub load_parameter_names { Line 4231  sub load_parameter_names {
  my (undef,$name,$type)=split(/\&/,$short,3);   my (undef,$name,$type)=split(/\&/,$short,3);
  if ($type eq 'display') {   if ($type eq 'display') {
     $standard_parms{$name} = $plain;      $standard_parms{$name} = $plain;
  }          } elsif ($type eq 'type') {
               $standard_parms_types{$name} = $plain;
           }
     }      }
     close($config);      close($config);
     $standard_parms{'int_pos'}      = 'Positive Integer';      $standard_parms{'int_pos'}      = 'Positive Integer';
     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';      $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
     %standard_parms=&Apache::lonlocal::texthash(%standard_parms);  
 }  }
   
 sub standard_parameter_names {  sub standard_parameter_names {
Line 4393  sub standard_parameter_names { Line 4246  sub standard_parameter_names {
  &load_parameter_names();   &load_parameter_names();
     }      }
     if ($standard_parms{$name}) {      if ($standard_parms{$name}) {
  return $standard_parms{$name};    return $standard_parms{$name};
     } else {       } else {
  return $name;    return $name;
     }      }
 }  }
   
   sub standard_parameter_types {
       my ($name)=@_;
       if (!%standard_parms_types) {
           &load_parameter_names();
       }
       if ($standard_parms_types{$name}) {
           return $standard_parms_types{$name};
       }
       return;
   }
   
 sub parm_change_log {  sub parm_change_log {
     my ($r)=@_;      my ($r)=@_;
Line 4416  sub parm_change_log { Line 4278  sub parm_change_log {
   
     $r->print('<form action="/adm/parmset?action=parameterchangelog"      $r->print('<form action="/adm/parmset?action=parameterchangelog"
                      method="post" name="parameterlog">');                       method="post" name="parameterlog">');
       
     my %saveable_parameters = ('show' => 'scalar',);      my %saveable_parameters = ('show' => 'scalar',);
     &Apache::loncommon::store_course_settings('parameter_log',      &Apache::loncommon::store_course_settings('parameter_log',
                                               \%saveable_parameters);                                                \%saveable_parameters);
Line 4444  sub parm_change_log { Line 4306  sub parm_change_log {
  }   }
  if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }   if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
     }      }
     foreach my $id (sort       foreach my $id (sort
     {      {
  if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {   if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
     return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}      return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
Line 4457  sub parm_change_log { Line 4319  sub parm_change_log {
  my $count = 0;   my $count = 0;
  my $time =   my $time =
     &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});      &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
  my $plainname =    my $plainname =
     &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},      &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
   $parmlog{$id}{'exe_udom'});    $parmlog{$id}{'exe_udom'});
  my $about_me_link =    my $about_me_link =
     &Apache::loncommon::aboutmewrapper($plainname,      &Apache::loncommon::aboutmewrapper($plainname,
        $parmlog{$id}{'exe_uname'},         $parmlog{$id}{'exe_uname'},
        $parmlog{$id}{'exe_udom'});         $parmlog{$id}{'exe_udom'});
  my $send_msg_link='';   my $send_msg_link='';
  if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})    if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
      || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {       || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
     $send_msg_link ='<br />'.      $send_msg_link ='<br />'.
  &Apache::loncommon::messagewrapper(&mt('Send message'),   &Apache::loncommon::messagewrapper(&mt('Send message'),
Line 4488  sub parm_change_log { Line 4350  sub parm_change_log {
  }   }
     }      }
     if ($typeflag) {      if ($typeflag) {
  $istype{$parmname}=$value;    $istype{$parmname}=$value;
  if (!$env{'form.includetypes'}) { next; }    if (!$env{'form.includetypes'}) { next; }
     }      }
     $count++;      $count++;
     if ($makenewrow) {      if ($makenewrow) {
Line 4497  sub parm_change_log { Line 4359  sub parm_change_log {
     } else {      } else {
  $makenewrow=1;   $makenewrow=1;
     }      }
               my $parmitem = &standard_parameter_names($parmname);
     $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.      $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
       &standard_parameter_names($parmname).'</td><td>'.        &mt($parmitem).'</td><td>'.
       ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';        ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
     my $stillactive=0;      my $stillactive=0;
     if ($parmlog{$id}{'delflag'}) {      if ($parmlog{$id}{'delflag'}) {
  $output .= &mt('Deleted');   $output .= &mt('Deleted');
     } else {      } else {
  if ($typeflag) {   if ($typeflag) {
     $output .= &mt('Type: [_1]',&standard_parameter_names($value));                      my $parmitem = &standard_parameter_names($value); 
                       $parmitem = &mt($parmitem);
       $output .= &mt('Type: [_1]',$parmitem);
  } else {   } else {
     my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),      my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
       $uname,$udom,$issection,$issection,$courseopt);        $uname,$udom,$issection,$issection,$courseopt);
     if (&isdateparm($istype{$parmname})) {                      my $showvalue = $value;
  $output .= &Apache::lonlocal::locallocaltime($value);                      if ($istype{$parmname} eq '') {
     } else {                          my $type = &standard_parameter_types($parmname);
  $output .= $value;                          if ($type ne '') {
     }                              if (&isdateparm($type)) {
                                   $showvalue =
                                       &Apache::lonlocal::locallocaltime($value);
                               }
                           }
                       } else {
           if (&isdateparm($istype{$parmname})) {
       $showvalue = 
                                   &Apache::lonlocal::locallocaltime($value);
           }
                       }
                       $output .= $showvalue;
     if ($value ne $all[$level]) {      if ($value ne $all[$level]) {
  $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';   $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
     } else {      } else {
Line 4522  sub parm_change_log { Line 4398  sub parm_change_log {
  }   }
     }      }
     $output .= '</td><td>';      $output .= '</td><td>';
               
     if ($stillactive) {      if ($stillactive) {
  my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));                  my $parmitem = &standard_parameter_names($parmname);
                 my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,                  $parmitem = &mt($parmitem);
    my $title=&mt('Changed [_1]',$parmitem);
                   my $description=&mt('Changed [_1] for [_2] to [_3]',
                                       $parmitem,$realmdescription,
     (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));      (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
  if (($uname) && ($udom)) {   if (($uname) && ($udom)) {
     $output .=       $output .=
  &Apache::loncommon::messagewrapper('Notify User',   &Apache::loncommon::messagewrapper('Notify User',
    $uname,$udom,$title,     $uname,$udom,$title,
    $description);     $description);
  } else {   } else {
     $output .=       $output .=
  &Apache::lonrss::course_blog_link($id,$title,   &Apache::lonrss::course_blog_link($id,$title,
   $description);    $description);
  }   }
Line 4543  sub parm_change_log { Line 4423  sub parm_change_log {
     my $wholeentry=$about_me_link.':'.      my $wholeentry=$about_me_link.':'.
  $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.   $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
  $output;   $output;
     if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }              if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
  }   }
         if ($count) {          if ($count) {
     $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>      $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
Line 4553  sub parm_change_log { Line 4433  sub parm_change_log {
   $send_msg_link.'</td>'.$output);    $send_msg_link.'</td>'.$output);
     $shown++;      $shown++;
  }   }
  if (!($env{'form.show'} eq &mt('all')    if (!($env{'form.show'} eq &mt('all')
       || $shown<=$env{'form.show'})) { last; }        || $shown<=$env{'form.show'})) { last; }
     }      }
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub update_slots {
       my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
       my %slot=&Apache::lonnet::get_slot($slot_name);
       if (!keys(%slot)) {
           return 'error: slot does not exist';
       }
       my $max=$slot{'maxspace'};
       if (!defined($max)) { $max=99999; }
   
       my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
                                          "^$slot_name\0");
       my ($tmp)=%consumed;
       if ($tmp=~/^error: 2 / ) {
           return 'error: unable to determine current slot status';
       }
       my $last=0;
       foreach my $key (keys(%consumed)) {
           my $num=(split('\0',$key))[1];
           if ($num > $last) { $last=$num; }
           if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
               return 'ok';
           }
       }
   
       if (scalar(keys(%consumed)) >= $max) {
           return 'error: no space left in slot';
       }
       my $wanted=$last+1;
   
       my %reservation=('name'      => $uname.':'.$udom,
                        'timestamp' => time,
                        'symb'      => $symb);
   
       my $success=&Apache::lonnet::newput('slot_reservations',
                                           {"$slot_name\0$wanted" =>
                                                \%reservation},
                                           $cdom, $cnum);
       if ($success eq 'ok') {
           my %storehash = (
                             symb    => $symb,
                             slot    => $slot_name,
                             action  => 'reserve',
                             context => 'parameter',
                           );
           &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
                                           '',$uname,$udom,$cnum,$cdom);
   
           &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                           '',$uname,$udom,$uname,$udom);
       }
       return $success;
   }
   
   sub delete_slots {
       my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
       my $delresult;
       my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom,
                                            $cnum, "^$slot_name\0");
       if (&Apache::lonnet::error(%consumed)) {
           return 'error: unable to determine current slot status';
       }
       my ($tmp)=%consumed;
       if ($tmp=~/^error: 2 /) {
           return 'error: unable to determine current slot status';
       }
       foreach my $key (keys(%consumed)) {
           if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
               my $num=(split('\0',$key))[1];
               my $entry = $slot_name.'\0'.$num;
               $delresult = &Apache::lonnet::del('slot_reservations',[$entry],
                                                 $cdom,$cnum);
               if ($delresult eq 'ok') {
                   my %storehash = (
                                     symb    => $symb,
                                     slot    => $slot_name,
                                     action  => 'release',
                                     context => 'parameter',
                                   );
                   &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
                                                   1,$uname,$udom,$cnum,$cdom);
                   &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                                   1,$uname,$udom,$uname,$udom);
               }
           }
       }
       return $delresult;
   }
   
 sub check_for_course_info {  sub check_for_course_info {
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     return 1 if ($navmap);      return 1 if ($navmap);
Line 4589  sub handler { Line 4557  sub handler {
     text=>"Parameter Manager",      text=>"Parameter Manager",
     faq=>10,      faq=>10,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
                                             help => 'Parameter_Manager'});                                              help =>
                                               'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
   
 # ----------------------------------------------------- Needs to be in a course  # ----------------------------------------------------- Needs to be in a course
     my $parm_permission =      my $parm_permission =
Line 4609  sub handler { Line 4578  sub handler {
     &assessparms($r);      &assessparms($r);
         } elsif (! exists($env{'form.action'})) {          } elsif (! exists($env{'form.action'})) {
             &print_main_menu($r,$parm_permission);              &print_main_menu($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'crsenv') {  
             &crsenv($r);   
         } elsif ($env{'form.action'} eq 'setoverview') {          } elsif ($env{'form.action'} eq 'setoverview') {
     &overview($r);      &overview($r);
  } elsif ($env{'form.action'} eq 'addmetadata') {   } elsif ($env{'form.action'} eq 'addmetadata') {
Line 4635  sub handler { Line 4602  sub handler {
             &date_shift_two($r);              &date_shift_two($r);
  } elsif ($env{'form.action'} eq 'categorizecourse') {   } elsif ($env{'form.action'} eq 'categorizecourse') {
             &assign_course_categories($r);              &assign_course_categories($r);
         }           }
     } else {      } else {
 # ----------------------------- Not in a course, or not allowed to modify parms  # ----------------------------- Not in a course, or not allowed to modify parms
  if ($exists) {   if ($exists) {

Removed from v.1.420  
changed lines
  Added in v.1.471


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>