Diff for /loncom/interface/loncommon.pm between versions 1.907 and 1.925.2.26

version 1.907, 2009/10/31 16:17:07 version 1.925.2.26, 2010/12/07 04:33:49
Line 482  ENDAUTHORBRW Line 482  ENDAUTHORBRW
 }  }
   
 sub coursebrowser_javascript {  sub coursebrowser_javascript {
     my ($domainfilter,$sec_element,$formname,$role_element)=@_;      my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;
     my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Community - for which you wish to add/modify a user role.');      my $wintitle = &mt('Course Browser');
       if ($crstype ne '') {
           $wintitle = &mt($crstype);
       }
     my $id_functions = &javascript_index_functions();      my $id_functions = &javascript_index_functions();
     my $output = '      my $output = '
 <script type="text/javascript" language="JavaScript">  <script type="text/javascript" language="JavaScript">
Line 491  sub coursebrowser_javascript { Line 494  sub coursebrowser_javascript {
     var stdeditbrowser;'."\n";      var stdeditbrowser;'."\n";
   
     $output .= <<"ENDSTDBRW";      $output .= <<"ENDSTDBRW";
     function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {      function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,type,type_elem) {
         var url = '/adm/pickcourse?';          var url = '/adm/pickcourse?';
         var formid = getFormIdByName(formname);          var formid = getFormIdByName(formname);
         var domainfilter = getDomainFromSelectbox(formname,udom);          var domainfilter = getDomainFromSelectbox(formname,udom);
Line 520  sub coursebrowser_javascript { Line 523  sub coursebrowser_javascript {
                 }                  }
             }                   }     
         }          }
           if (type != null && type != '') {
               url += '&type='+type;
           }
           if (type_elem != null && type_elem != '') {
               url += '&typeelement='+type_elem;
           }
         if (formname == 'ccrs') {          if (formname == 'ccrs') {
             var ownername = document.forms[formid].ccuname.value;              var ownername = document.forms[formid].ccuname.value;
             var ownerdom =  document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value;              var ownerdom =  document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value;
Line 528  sub coursebrowser_javascript { Line 537  sub coursebrowser_javascript {
         if (multflag !=null && multflag != '') {          if (multflag !=null && multflag != '') {
             url += '&multiple='+multflag;              url += '&multiple='+multflag;
         }          }
         if (crstype == 'Course/Community') {          var title = '$wintitle';
             if (formname == 'cu') {  
                 crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value;   
                 if (crstype == "") {  
                     alert("$crs_or_grp_alert");  
                     return;  
                 }  
             }  
         }  
         if (crstype !=null && crstype != '') {  
             url += '&type='+crstype;  
         }  
         var title = 'Course_Browser';  
         var options = 'scrollbars=1,resizable=1,menubar=0';          var options = 'scrollbars=1,resizable=1,menubar=0';
         options += ',width=700,height=600';          options += ',width=700,height=600';
         stdeditbrowser = open(url,title,options,'1');          stdeditbrowser = open(url,title,options,'1');
Line 760  function setRole(crstype) { Line 757  function setRole(crstype) {
 }  }
   
 sub selectcourse_link {  sub selectcourse_link {
    my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype)=@_;     my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype,
          $typeelement) = @_;
      my $type = $selecttype;
    my $linktext = &mt('Select Course');     my $linktext = &mt('Select Course');
    if ($selecttype eq 'Community') {     if ($selecttype eq 'Community') {
        $linktext = &mt('Select Community');          $linktext = &mt('Select Community');
    } elsif ($selecttype eq 'Course/Community') {     } elsif ($selecttype eq 'Course/Community') {
        $linktext = &mt('Select Course/Community');         $linktext = &mt('Select Course/Community');
        $selecttype = 'Course';         $type = '';
    }     }
    return '<span class="LC_nobreak">'     return '<span class="LC_nobreak">'
          ."<a href='"           ."<a href='"
          .'javascript:opencrsbrowser("'.$form.'","'.$unameele           .'javascript:opencrsbrowser("'.$form.'","'.$unameele
          .'","'.$udomele.'","'.$desc.'","'.$extra_element           .'","'.$udomele.'","'.$desc.'","'.$extra_element
          .'","'.$multflag.'","'.$selecttype.'");'           .'","'.$multflag.'","'.$type.'","'.$typeelement.'");'
          ."'>".$linktext.'</a>'           ."'>".$linktext.'</a>'
          .'</span>';           .'</span>';
 }  }
Line 1878  sub select_form { Line 1877  sub select_form {
         $selectform.=          $selectform.=
     '<option value="'.&HTML::Entities::encode($key,'"<>&').'" '.      '<option value="'.&HTML::Entities::encode($key,'"<>&').'" '.
             ($key eq $def ? 'selected="selected" ' : '').              ($key eq $def ? 'selected="selected" ' : '').
                 ">".&mt($hash{$key})."</option>\n";                  ">".$hash{$key}."</option>\n";
     }      }
     $selectform.="</select>";      $selectform.="</select>";
     return $selectform;      return $selectform;
Line 1943  sub select_level_form { Line 1942  sub select_level_form {
   
 =pod  =pod
   
 =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange)  =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms)
   
 Returns a string containing a <select name='$name' size='1'> form to   Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select the domain to preform an operation in.    allow a user to select the domain to preform an operation in.  
Line 1954  selected"); Line 1953  selected");
   
 If the $showdomdesc flag is set, the domain name is followed by the domain description.  If the $showdomdesc flag is set, the domain name is followed by the domain description.
   
 The optional $onchange argumnet specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted.    The optional $onchange argument specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted.
   
   The optional $incdoms is a reference to an array of domains which will be the only available options. 
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
 sub select_dom_form {  sub select_dom_form {
     my ($defdom,$name,$includeempty,$showdomdesc,$onchange) = @_;      my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) = @_;
     if ($onchange) {      if ($onchange) {
         $onchange = ' onchange="'.$onchange.'"';          $onchange = ' onchange="'.$onchange.'"';
     }      }
     my @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains());      my @domains;
       if (ref($incdoms) eq 'ARRAY') {
           @domains = sort {lc($a) cmp lc($b)} (@{$incdoms});
       } else {
           @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains());
       }
     if ($includeempty) { @domains=('',@domains); }      if ($includeempty) { @domains=('',@domains); }
     my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n";      my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n";
     foreach my $dom (@domains) {      foreach my $dom (@domains) {
Line 1972  sub select_dom_form { Line 1978  sub select_dom_form {
             ($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom;              ($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom;
         if ($showdomdesc) {          if ($showdomdesc) {
             if ($dom ne '') {              if ($dom ne '') {
                 my $domdesc = &Apache::lonnet::domain($dom,'description');                  my $domdesc;
                   if ($name eq 'srchdomain') {
                       if ($dom =~ /^\w+ci$/) {
                           $domdesc = 'Faculty';
                       } else {
                           $domdesc = 'Students';
                       }
                   } else {
                       $domdesc = &Apache::lonnet::domain($dom,'description');
                   }
                 if ($domdesc ne '') {                  if ($domdesc ne '') {
                     $selectdomain .= ' ('.$domdesc.')';                      $selectdomain .= ' ('.$domdesc.')';
                 }                  }
Line 2463  sub authform_internal{ Line 2478  sub authform_internal{
     }      }
     $autharg = '<input type="password" size="10" name="intarg" value="'.      $autharg = '<input type="password" size="10" name="intarg" value="'.
                $intarg.'" onchange="'.$jscall.'" />';                 $intarg.'" onchange="'.$jscall.'" />';
     $result = &mt      my $authtext = '[_1] Internally authenticated (with initial password [_2])';
         ('[_1] Internally authenticated (with initial password [_2])',      if ($in{'caller'} eq 'requestcrs') {
          '<label>'.$authtype,'</label>'.$autharg);          $authtext = "[_1] Students' password, if none in the uploaded file: [_2]";
       }
       $result = &mt($authtext,'<label>'.$authtype,'</label>'.$autharg);
     $result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';      $result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
     return $result;      return $result;
 }  }
Line 4361  sub CSTR_pageheader { Line 4378  sub CSTR_pageheader {
     } else {      } else {
         $lastitem = $thisdisfn;          $lastitem = $thisdisfn;
     }      }
     return  
       my $output =
          '<div>'           '<div>'
         .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it?          .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it?
         .'<b>'.&mt('Construction Space:').'</b> '          .'<b>'.&mt('Construction Space:').'</b> '
         .'<form name="dirs" method="post" action="'.$formaction          .'<form name="dirs" method="post" action="'.$formaction
         .'" target="_top"><tt><b>' #FIXME lonpubdir: target="_parent"          .'" target="_top">' #FIXME lonpubdir: target="_parent"
         .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."$lastitem</b></tt><br />"          .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv',undef,undef);
   
       if ($lastitem) {
           $output .=
                '<span class="LC_filename">'
               .$lastitem
               .'</span>';
       }
       $output .=
            '<br />'
         #FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />"          #FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />"
         .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')          .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
         .'</form>'          .'</form>'
         .&Apache::lonmenu::constspaceform()          .&Apache::lonmenu::constspaceform()
         .'</div>';          .'</div>';
   
       return $output;
 }  }
   
 ###############################################  ###############################################
Line 4434  sub bodytag { Line 4463  sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,      my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,
         $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;          $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;
   
       my $public;
       if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
           || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) {
           $public = 1;
       }
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }      if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
   
     $function = &get_users_function() if (!$function);      $function = &get_users_function() if (!$function);
Line 4449  sub bodytag { Line 4483  sub bodytag {
    'link'    => &designparm($function.'.link',$domain),);     'link'    => &designparm($function.'.link',$domain),);
     @design{keys(%$addentries)} = @$addentries{keys(%$addentries)};       @design{keys(%$addentries)} = @$addentries{keys(%$addentries)}; 
   
       my $custommenu;
       if ($env{'environment.remote'} eq 'off') {
           $custommenu = &needs_gci_custom();
       }
  # role and realm   # role and realm
     my ($role,$realm) = split(/\./,$env{'request.role'},2);      my ($role,$realm) = split(/\./,$env{'request.role'},2);
     if ($role  eq 'ca') {      if ($role  eq 'ca') {
Line 4458  sub bodytag { Line 4496  sub bodytag {
 # realm  # realm
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         if ($env{'request.role'} !~ /^cr/) {          if ($env{'request.role'} !~ /^cr/) {
             $role = &Apache::lonnet::plaintext($role,&course_type());              if (($custommenu) && (($role eq 'cm') || ($env{'form.context'} eq 'requestcrs'))) {
                   undef($role);
               } else {
                   $role = &Apache::lonnet::plaintext($role,&course_type());
               }
         }          }
         if ($env{'request.course.sec'}) {          if (defined($role) && $env{'request.course.sec'}) {
             $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$env{'request.course.sec'};              $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$env{'request.course.sec'};
         }             }
  $realm = $env{'course.'.$env{'request.course.id'}.'.description'};          if ($env{'form.context'} eq 'requestcrs') {
               undef($realm);
           } else {
       $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
           }
     } else {      } else {
         $role = &Apache::lonnet::plaintext($role);          if (($custommenu) && ($role eq 'cm')) {
               undef($role);
           } else {
               $role = &Apache::lonnet::plaintext($role);
           }
     }      }
   
     if (!$realm) { $realm='&nbsp;'; }      if (!$realm) { $realm='&nbsp;'; }
Line 4483  sub bodytag { Line 4533  sub bodytag {
     }       } 
   
     my $name = &plainname($env{'user.name'},$env{'user.domain'});      my $name = &plainname($env{'user.name'},$env{'user.domain'});
     if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {      if ($public) {
  undef($role);   undef($role);
     } else {      } else {
  $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'});   $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'});
Line 4497  sub bodytag { Line 4547  sub bodytag {
                         $env{'course.'.$env{'request.course.id'}.                          $env{'course.'.$env{'request.course.id'}.
                                  '.domain'}.'/'})) {                                   '.domain'}.'/'})) {
         my $cid = $env{'request.course.id'};          my $cid = $env{'request.course.id'};
         $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};          $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
         $dc_info =~ s/\s+$//;          $dc_info =~ s/\s+$//;
         $dc_info = '('.$dc_info.')';  
     }      }
   
     $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;      $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;
     &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);      &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
   
     if ($env{'environment.remote'} eq 'off') {      if ($env{'environment.remote'} ne 'on') {
         # No Remote          # No Remote
         if ($no_nav_bar) { return $bodytag; }           if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { 
               return $bodytag; 
           } 
   
         if ($env{'request.state'} eq 'construct') { $forcereg=1; }          if ($env{'request.state'} eq 'construct') { $forcereg=1; }
   
Line 4515  sub bodytag { Line 4566  sub bodytag {
         #        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls          #        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
         #    }          #    }
   
         $bodytag .= qq|<div id="LC_nav_bar">$name $role<br />          my $role_selector;
             <em>$realm</em> $dc_info</div>| unless $env{'form.inhibitmenu'};          if (($custommenu) && !($env{'form.context'} eq 'requestcrs') && 
               ($env{'request.course.id'}) && 
               ($env{'course.'.$env{'request.course.id'}.'.domain'} =~ /^\w+citest$/)) {
               $role_selector = &Apache::lonmenu::roles_selector(
                           $env{'course.' . $env{'request.course.id'} . '.domain'},
                           $env{'course.' . $env{'request.course.id'} . '.num'}  );
               if ($role_selector) {
                   $role_selector = '<br />'.$role_selector;
               }
           }
           my $cid = $env{'request.course.id'};
           my %cicourses;
           my $udom = $env{'user.domain'};
           my %allnums = &get_faculty_cnums();
           if (($udom ne '') && (ref($allnums{$udom}) eq 'HASH')) {
                foreach my $key (%{$allnums{$udom}}) {
                    $cicourses{$udom.'_'.$key} = $allnums{$udom}->{$key};
                }
           }
           if (($custommenu && $cid && !$cicourses{$cid}) && 
                !($env{'form.context'} eq 'requestcrs') ||
                ($env{'user.domain'} =~ /^\w+citest$/)) {
               my $role = 'st';
               if ($custommenu) {
                   $role = 'cc';
               }
               my ($switcher_js,$switcher,$formname);
               $formname = 'pickrole';
               my %courses = &existing_gcitest_courses($role);
               my $numcourses = keys(%courses);
               my $reqdcount = 0;
               if ($cid) {
                   if ($courses{$cid}) {
                       $reqdcount = 1; 
                   }
               }
               if ($numcourses > $reqdcount) {
                   $switcher = &gcitest_switcher($role,$formname,%courses);
                   my $current;
                   if ($cid) {
                       $current = $role.'./'.$env{'course.'.$cid.'.domain'}.
                                  '/'.$env{'course.'.$cid.'.num'};
                   }
                   $switcher_js = &gcitest_switcher_js($current,$numcourses,$formname);
                   if ($switcher_js) {  
                       $switcher_js= <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   
   $switcher_js
   
         if (   $env{'form.inhibitmenu'} eq 'yes'   // ]]>
             || $ENV{'REQUEST_URI'} eq '/adm/logout'  </script>
             || $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {  ENDSCRIPT
                   }
               }
               if ($switcher) {
                   $switcher = $switcher_js.$switcher;
                   if ($role_selector) {
                       $role_selector .= '&nbsp;&nbsp;&nbsp;'.$switcher;
                   } else {
                       $role_selector .= '<br />'.$switcher;
                   }
               }
           }
   
           if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
                if ($dc_info) {
                    $dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|;
                }
                $bodytag .= qq|<div id="LC_nav_bar">$name $role<br />
                   <em>$realm</em> $dc_info</div>|;
               return $bodytag;
           }
           if ($env{'request.noversionuri'} eq '/adm/navmaps' &&
                   $env{'environment.remotenavmap'} eq 'on') {
             return $bodytag;              return $bodytag;
         }          }
   
           if ($cid && $cicourses{$cid} eq 'tutorial') {
               $bodytag .= '<div class="LC_page_header">';
           }
    
           $bodytag .= qq|<div id="LC_nav_bar">$name $role $role_selector</div>|;
   
         $bodytag .= Apache::lonhtmlcommon::scripttag(          $bodytag .= Apache::lonhtmlcommon::scripttag(
             Apache::lonmenu::utilityfunctions(), 'start');              Apache::lonmenu::utilityfunctions('',$custommenu), 'start');
   
         $bodytag .= Apache::lonmenu::primary_menu();          $bodytag .= Apache::lonmenu::primary_menu();
   
           if ($dc_info) {
               $dc_info = &dc_courseid_toggle($dc_info);
           }
           $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;
           if ($cid && $cicourses{$cid} eq 'tutorial') {
               $bodytag .= '</div>';
           }
   
         #don't show menus for public users          #don't show menus for public users
         if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){          if(!$public){
             $bodytag .= Apache::lonmenu::secondary_menu();              if (($custommenu) && 
                   ($env{'request.role'} !~ m{^st\./(\w+)citest/$match_courseid})) {
                   $bodytag .= &Apache::lonmenu::gci_secondary_menu();
               } elsif ($env{'request.role'} ne 'cm' || &check_for_gci_dc()) {    
                   $bodytag .= Apache::lonmenu::secondary_menu();
               }
             $bodytag .= Apache::lonmenu::serverform();              $bodytag .= Apache::lonmenu::serverform();
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');               $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
             $bodytag .= Apache::lonmenu::innerregister($forcereg) if $forcereg;              if ($env{'request.state'} eq 'construct') {
                   $bodytag .= &Apache::lonmenu::innerregister($forcereg,'',
                                   $args->{'bread_crumbs'});
               } elsif ($forcereg) { 
                   $bodytag .= &Apache::lonmenu::innerregister($forcereg);
               } elsif ($custommenu && $env{'request.course.id'} && 
                        &Apache::lonnet::allowed('mdc', $env{'request.course.id'})) {
                   if ((($env{'request.noversionuri'} eq '/adm/navmaps') && 
                       ($env{'request.noversionuri'} ne 'on')) ||
                       (($env{'request.noversionuri'} eq '/adm/coursedocs') &&
                        (!($env{'form.context'} eq 'requestcrs'))) ||
                       (($env{'request.noversionuri'} eq '/adm/createuser') &&
                        (!($env{'form.context'} eq 'requestcrs'))) ||
                       ($env{'request.noversionuri'} eq '/adm/whatsnew') ||
                       ($env{'request.noversionuri'} eq '/cgi-bin/printout.pl') ||
                       ($env{'request.noversionuri'} eq '/adm/printout') ||
                       ($env{'request.noversionuri'} eq '/adm/statistics')) {
   
                       my @advtools = &concept_test_manager();
                       &Apache::lonhtmlcommon::clear_breadcrumbs();
                       &Apache::lonhtmlcommon::add_breadcrumb_tool(
                                         'advtools',@advtools);
                       my $advlinks;
                       my $legendtext = '<a class="LC_menubuttons_link" href="/adm/menu">'.&mt('Management').'</a>';
                       &Apache::lonhtmlcommon::render_advtools(\$advlinks,$legendtext);
                       $bodytag .= $advlinks;
                   }
               }
         }else{          }else{
             # this is to seperate menu from content when there's no secondary              # this is to seperate menu from content when there's no secondary
             # menu. Especially needed for public accessible ressources.              # menu. Especially needed for public accessible ressources.
Line 4543  sub bodytag { Line 4710  sub bodytag {
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');               $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); 
         }          }
   
         #SD testing  
         #$bodytag .= Apache::lonmenu::menubuttons($forcereg);  
         return $bodytag;          return $bodytag;
     }      }
   
Line 4561  sub bodytag { Line 4726  sub bodytag {
     # Explicit link to get inline menu      # Explicit link to get inline menu
     my $menu= ($no_inline_link?''      my $menu= ($no_inline_link?''
        :'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>');         :'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>');
     $bodytag .= qq|<div id="LC_nav_bar">$name $role  
             <em>$realm</em> $dc_info </div>      if ($dc_info) {
           $dc_info = qq|<span class="LC_cusr_subheading">($dc_info)</span>|;
       }
   
       $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>
             <ol class="LC_primary_menu LC_right">              <ol class="LC_primary_menu LC_right">
                 <li>$menu</li>                  <li>$menu</li>
             </ol>| unless $env{'form.inhibitmenu'};              </ol><div id="LC_realm"> $realm $dc_info</div>| unless $env{'form.inhibitmenu'};
     #  
     return(<<ENDBODY);      return(<<ENDBODY);
 $bodytag  $bodytag
 <table id="LC_title_bar" class="LC_with_remote">  <table id="LC_title_bar" class="LC_with_remote">
Line 4579  $bodytag Line 4747  $bodytag
 ENDBODY  ENDBODY
 }  }
   
   sub concept_test_manager {
       my @advtools;
       my  %items = (
                      docs => { 
                                 desc    => 'Edit Test',
                                 action  => "go('/adm/coursedocs')",
                                 tooltip => 'Assemble or modify Concept Test'
                              },
                      cprv => {
                                 desc => 'Enrollment/Activity',
                                 action => "go('/adm/createuser')",
                                 tooltip => 'Enrollment and student activity',
                              },
                      new => { 
                                 desc   => "What's New?",
                                 action => "go('/adm/whatsnew')",
                                 tooltip => 'Recent events/action items in Concept Test' ,
                              },
                      prnt => {
                                 desc => 'Print Test',
                                 action => "go('/adm/printout');",
                                 tooltip => 'Prepare printable Concept Test',
                              },
                      chrt => { 
                                 desc   => 'Test Statistics',
                                 action => "go('/adm/statistics');",
                                 tooltip => 'Concept Test Statistics',
                              },
                      rcrs => {
                                 desc   => 'Create New Test',
                                 action  => "switchpage('createtest');",
                                 tooltip => 'Create new Concept Test',
                              },
                    );
       my @ordered = ('docs','cprv','new','prnt','chrt','rcrs');
       foreach my $item (@ordered) {
            push(@advtools,
                     '<a title="'.$items{$item}{tooltip}.'" class="LC_menubuttons_link" href="javascript:'.
                     $items{$item}{action}.';">'.
                     '<img src="'.'/res/adm/pages/'.$item.'22.png" alt="'.$items{$item}{tooltip}.
                     '" border="0" class="LC_icon" />'.
                     '<span class="LC_menubuttons_inline_text">'.$items{$item}{desc}.'</span></a>');
       }
       return @advtools;
   }
   
   sub dc_courseid_toggle {
       my ($dc_info) = @_;
       return ' <span id="dccidtext" class="LC_cusr_subheading">'.
              '<a href="javascript:showCourseID();">'.
              &mt('(More ...)').'</a></span>'.
              '<div id="dccid" class="LC_dccid">'.$dc_info.'</div>';
   }
   
 sub make_attr_string {  sub make_attr_string {
     my ($register,$attr_ref) = @_;      my ($register,$attr_ref) = @_;
   
Line 4710  sub standard_css { Line 4932  sub standard_css {
     my $mail_other_hover     = '#669999';      my $mail_other_hover     = '#669999';
     my $table_header         = '#DDDDDD';      my $table_header         = '#DDDDDD';
     my $feedback_link_bg     = '#BBBBBB';      my $feedback_link_bg     = '#BBBBBB';
     my $lg_border_color     = '#C8C8C8';      my $lg_border_color      = '#C8C8C8';
   
     my $border = ($env{'browser.type'} eq 'explorer' ||      my $border = ($env{'browser.type'} eq 'explorer' ||
   $env{'browser.type'} eq 'safari'     ) ? '0 2px 0 2px'        $env{'browser.type'} eq 'safari'     ) ? '0 2px 0 2px'
                                                  : '0 3px 0 4px';                                               : '0 3px 0 4px';
   
   
     return <<END;      return <<END;
 body {  body {
    font-family: $sans;    font-family: $sans;
    line-height:130%;    line-height:130%;
    font-size:0.83em;    font-size:0.83em;
    color:$font;    color:$font;
 }  
   
 a:link, a:visited {   
   font-size:100%;   
 }  }
   
 a:focus {   a:focus {
   color: red;    color: red;
   background: yellow     background: yellow;
 }  }
   
 form, .inline {   form, .inline {
    display: inline;     display: inline;
 }  }
   
 .LC_right {  .LC_right {
    text-align:right;    text-align:right;
 }  }
   
 .LC_middle {  .LC_middle {
    vertical-align:middle;    vertical-align:middle;
 }  }
   
 /* just for tests */  /* just for tests */
 .LC_400Box {width:400px; }  .LC_400Box {
     width:400px;
   }
 /* end */  /* end */
   
 .LC_filename {  .LC_filename {
   font-family: $mono;    font-family: $mono;
   white-space:pre;    white-space:pre;
     font-size: 120%;
 }  }
   
 .LC_fileicon {  .LC_fileicon {
Line 4807  div.LC_confirm_box .LC_success img { Line 5028  div.LC_confirm_box .LC_success img {
 }  }
   
 .LC_discussion {  .LC_discussion {
    background: $tabbg;    background: $tabbg;
    border: 1px solid black;    border: 1px solid black;
    margin: 2px;    margin: 2px;
 }  }
   
 .LC_disc_action_links_bar {  .LC_disc_action_links_bar {
    background: $tabbg;    background: $tabbg;
    border: none;    border: none;
    margin: 4px;    margin: 4px;
 }  }
   
 .LC_disc_action_left {  .LC_disc_action_left {
    text-align: left;    text-align: left;
 }  }
   
 .LC_disc_action_right {  .LC_disc_action_right {
    text-align: right;    text-align: right;
 }  }
   
 .LC_disc_new_item {  .LC_disc_new_item {
    background: white;    background: white;
    border: 2px solid red;    border: 2px solid red;
    margin: 2px;    margin: 2px;
 }  }
   
 .LC_disc_old_item {  .LC_disc_old_item {
    background: white;    background: white;
    border: 1px solid black;    border: 1px solid black;
    margin: 2px;    margin: 2px;
 }  }
   
 table.LC_pastsubmission {  table.LC_pastsubmission {
Line 4843  table.LC_pastsubmission { Line 5064  table.LC_pastsubmission {
   margin: 2px;    margin: 2px;
 }  }
   
 table#LC_top_nav,  table#LC_menubuttons {
 table#LC_menubuttons,  
 table#LC_nav_location {  
   width: 100%;    width: 100%;
   background: $pgbg;    background: $pgbg;
   border: 2px;    border: 2px;
Line 4876  table#LC_title_bar.LC_with_remote { Line 5095  table#LC_title_bar.LC_with_remote {
   margin: 0;    margin: 0;
 }  }
   
 table#LC_title_bar td {  ul.LC_breadcrumb_tools_outerlist {
   background: $tabbg;      margin: 0;
       padding: 0;
       position: relative;
       list-style: none;
   }
   ul.LC_breadcrumb_tools_outerlist li {
       display: inline;
 }  }
   
 table#LC_menubuttons img{  .LC_breadcrumb_tools_navigation {
   border: none;      padding: 0;
       margin: 0;
       float: left;
   }
   .LC_breadcrumb_tools_tools {
       padding: 0;
       margin: 0;
       float: right;
 }  }
   
 table#LC_top_nav td {  div.LC_GCI_Menu {
   background: $tabbg;      width:900px;
   border: none;  
   font-size: small;  
   vertical-align:top;  
   padding:2px 5px 2px 5px;  
 }  }
   
 table#LC_top_nav td a,  div.LC_GCI_Menu:after {
 div#LC_top_nav a {      content:'';
   color: $font;      display:block;
       clear:both;
 }  }
   
 table#LC_top_nav td.LC_top_nav_logo {  div.LC_GCI_Menu_left {
   background: $tabbg;      float:left;
   text-align: left;      width:400px;
   white-space: nowrap;  
   width: 31px;  
 }  }
   
 table#LC_top_nav td.LC_top_nav_logo img {  div.LC_GCI_Menu_right {
   border: none;      float:left;
   vertical-align: bottom;      width:400px;;
 }  }
   
 table#LC_top_nav td.LC_top_nav_exit,  dl.LC_GCI_Menu {
 table#LC_top_nav td.LC_top_nav_help {      width:300px;
   width: 2.0em;      float:left;
       margin-right:2em;
 }  }
   
 table#LC_top_nav td.LC_top_nav_login {  dl.LC_GCI_Menu dt {
   width: 4.0em;      font-weight: bold;
   text-align: center;      font-size:0.9em;
       margin-bottom:0.7em;
   }
   
   dl.LC_GCI_Menu dt a {
       color: $font;
   }
   
   dl.LC_GCI_Menu dd {
       font-size:0.8em;
       margin:0 0 2em 0;
       padding-left:4.5em;
       line-height:1.5em;
       background:none no-repeat left top;
   }
   
   table#LC_title_bar td {
     background: $tabbg;
   }
   
   table#LC_menubuttons img {
     border: none;
 }  }
   
 .LC_breadcrumbs_component {  .LC_breadcrumbs_component {
     float: right;    float: right;
     margin: 0 1em;    margin: 0.25em 1em;
 }  }
 .LC_breadcrumbs_component img {  .LC_breadcrumbs_component img {
     vertical-align: middle;    vertical-align: middle;
 }  }
   
 td.LC_table_cell_checkbox {  td.LC_table_cell_checkbox {
   text-align: center;    text-align: center;
 }  }
   
 table#LC_mainmenu td.LC_mainmenu_column {  
     vertical-align: top;  
 }  
   
 .LC_fontsize_small {  .LC_fontsize_small {
  font-size: 70%;    font-size: 70%;
 }  }
   
 #LC_breadcrumbs {  #LC_breadcrumbs {
  clear:both;    clear:both;
  background: $sidebg;    background: $sidebg;
  border-bottom: 1px solid $lg_border_color;    border-bottom: 1px solid $lg_border_color;
  line-height: 2.5em;     line-height: 2.5em;
  /* SD working here    overflow: hidden;
  height: 2.5em;    margin: 0;
  overflow: hidden; */    padding: 0;
  margin: 0;    text-align: left;
  padding: 0;  
 }  }
   
 /* Preliminary fix to hide breadcrumbs inside remote control window */  /* Preliminary fix to hide breadcrumbs inside remote control window */
 #LC_remote #LC_breadcrumbs {  #LC_remote #LC_breadcrumbs {
     display:none;    display:none;
 }  }
   
 #LC_head_subbox {  #LC_head_subbox {
  clear:both;    clear:both;
  background: #F8F8F8; /* $sidebg; */    background: #F8F8F8; /* $sidebg; */
  border-bottom: 1px solid $lg_border_color;    border: 1px solid $sidebg;
  margin: 0 0 10px 0;    margin: 0 0 0 0;      
  padding: 5px;  
 }  }
   
 .LC_fontsize_medium {  .LC_fontsize_medium {
  font-size: 85%;    font-size: 85%;
 }  }
   
 .LC_fontsize_large {  .LC_fontsize_large {
  font-size: 120%;    font-size: 120%;
 }  }
   
 .LC_menubuttons_inline_text {  .LC_menubuttons_inline_text {
Line 4990  table#LC_mainmenu td.LC_mainmenu_column Line 5233  table#LC_mainmenu td.LC_mainmenu_column
 }  }
   
 td.LC_menubuttons_text {  td.LC_menubuttons_text {
   color: $font;    color: $font;
 }  }
   
 .LC_current_location {  .LC_current_location {
   background: $tabbg;    background: $tabbg;
 }  }
   
 .LC_new_mail {  
   background: $tabbg;  
   font-weight: bold;  
 }  
   
 table.LC_data_table,  table.LC_data_table,
 table.LC_mail_list {  table.LC_mail_list {
   border: 1px solid #000000;    border: 1px solid #000000;
Line 5029  table.LC_nested { Line 5267  table.LC_nested {
   width: 100%;    width: 100%;
 }  }
   
 table.LC_data_table tr th,   table.LC_data_table tr th,
 table.LC_calendar tr th,   table.LC_calendar tr th,
 table.LC_mail_list tr th,  table.LC_mail_list tr th,
 table.LC_prior_tries tr th,  table.LC_prior_tries tr th,
 table.LC_innerpickbox tr th {  table.LC_innerpickbox tr th {
Line 5051  table.LC_data_table tr.LC_info_row > td Line 5289  table.LC_data_table tr.LC_info_row > td
   text-align: left;    text-align: left;
 }  }
   
 table.LC_data_table tr.LC_odd_row > td,  table.LC_data_table tr.LC_odd_row > td {
     background-color: $data_table_light;
     padding: 2px;
     vertical-align: top;
   }
   
 table.LC_pick_box tr > td.LC_odd_row {  table.LC_pick_box tr > td.LC_odd_row {
   background-color: $data_table_light;    background-color: $data_table_light;
     vertical-align: top;
   }
   
   table.LC_data_table tr.LC_even_row > td {
     background-color: $data_table_dark;
   padding: 2px;    padding: 2px;
   vertical-align: top;    vertical-align: top;
 }  }
   
 table.LC_data_table tr.LC_even_row > td,  
 table.LC_pick_box tr > td.LC_even_row {  table.LC_pick_box tr > td.LC_even_row {
   background-color: $data_table_dark;    background-color: $data_table_dark;
   padding: 2px;  
   vertical-align: top;    vertical-align: top;
 }  }
   
Line 5150  table.LC_createuser tr.LC_info_row td  { Line 5396  table.LC_createuser tr.LC_info_row td  {
 table.LC_calendar {  table.LC_calendar {
   border: 1px solid #000000;    border: 1px solid #000000;
   border-collapse: collapse;    border-collapse: collapse;
     width: 98%;
 }  }
   
 table.LC_calendar_pickdate {  table.LC_calendar_pickdate {
Line 5159  table.LC_calendar_pickdate { Line 5406  table.LC_calendar_pickdate {
 table.LC_calendar tr td {  table.LC_calendar tr td {
   border: 1px solid #000000;    border: 1px solid #000000;
   vertical-align: top;    vertical-align: top;
     width: 14%;
 }  }
   
 table.LC_calendar tr td.LC_calendar_day_empty {  table.LC_calendar tr td.LC_calendar_day_empty {
Line 5177  table.LC_mail_list tr.LC_mail_new:hover Line 5425  table.LC_mail_list tr.LC_mail_new:hover
   background-color: $mail_new_hover;    background-color: $mail_new_hover;
 }  }
   
 table.LC_mail_list tr.LC_mail_even {  
 }  
   
 table.LC_mail_list tr.LC_mail_odd {  
 }  
   
 table.LC_mail_list tr.LC_mail_read {  table.LC_mail_list tr.LC_mail_read {
   background-color: $mail_read;    background-color: $mail_read;
 }  }
Line 5231  table.LC_data_table tr.LC_browser_folder Line 5473  table.LC_data_table tr.LC_browser_folder
 }  }
   
 table.LC_data_table tr > td.LC_roles_is {  table.LC_data_table tr > td.LC_roles_is {
 /*  background: #77FF77; */    /* background: #77FF77; */
 }  }
   
 table.LC_data_table tr > td.LC_roles_future {  table.LC_data_table tr > td.LC_roles_future {
Line 5279  span.LC_parm_part { Line 5521  span.LC_parm_part {
   color: blue;    color: blue;
 }  }
   
 span.LC_parm_folder, span.LC_parm_symb {  span.LC_parm_folder,
   span.LC_parm_symb {
   font-size: x-small;    font-size: x-small;
   font-family: $mono;    font-family: $mono;
   color: #AAAAAA;    color: #AAAAAA;
Line 5461  table.LC_notify_front_page td { Line 5704  table.LC_notify_front_page td {
   
 .LC_topic_bar {  .LC_topic_bar {
   font-weight: bold;    font-weight: bold;
   width: 100%;  
   background: $tabbg;    background: $tabbg;
   vertical-align: middle;    margin: 1em 0em 1em 2em;
   margin: 2ex 0ex 2ex 0ex;  
   padding: 3px;    padding: 3px;
     font-size: 1.2em;
 }  }
   
 .LC_topic_bar span {  .LC_topic_bar span {
     left: 0.5em;
     position: absolute;
   vertical-align: middle;    vertical-align: middle;
     font-size: 1.2em;
 }  }
   
 .LC_topic_bar img {  .LC_topic_bar img {
Line 5502  div.LC_feedback_link img { Line 5747  div.LC_feedback_link img {
   vertical-align:middle;    vertical-align:middle;
 }  }
   
 div.LC_feedback_link a{  div.LC_feedback_link a {
   text-decoration: none;    text-decoration: none;
 }  }
   
 div.LC_comblock {  div.LC_comblock {
   display:inline;     display:inline;
   color:$font;    color:$font;
   font-size:90%;    font-size:90%;
 }  }
Line 5585  span.LC_prior_string, Line 5830  span.LC_prior_string,
 span.LC_prior_custom,  span.LC_prior_custom,
 span.LC_prior_reaction,  span.LC_prior_reaction,
 span.LC_prior_math {  span.LC_prior_math {
   font-family: monospace;    font-family: $mono;
   white-space: pre;    white-space: pre;
 }  }
   
 span.LC_prior_string {  span.LC_prior_string {
   font-family: monospace;    font-family: $mono;
   white-space: pre;    white-space: pre;
 }  }
   
Line 5599  table.LC_prior_option { Line 5844  table.LC_prior_option {
   border-collapse: collapse;    border-collapse: collapse;
 }  }
   
 table.LC_prior_rank,   table.LC_prior_rank,
 table.LC_prior_match {  table.LC_prior_match {
   border-collapse: collapse;    border-collapse: collapse;
 }  }
Line 5623  span.LC_cusr_subheading { Line 5868  span.LC_cusr_subheading {
   font-size: 85%;    font-size: 85%;
 }  }
   
 table.LC_docs_documents {  
   background: #BBBBBB;  
   border-width: 0;  
   border-collapse: collapse;  
 }  
   
 table.LC_docs_documents td.LC_docs_document {  
   border: 2px solid black;  
   padding: 4px;  
 }  
   
 div.LC_docs_entry_move {  div.LC_docs_entry_move {
   border: 1px solid #BBBBBB;    border: 1px solid #BBBBBB;
   background: #DDDDDD;    background: #DDDDDD;
Line 5829  div.LC_edit_problem_saves { Line 6063  div.LC_edit_problem_saves {
   padding-bottom: 5px;    padding-bottom: 5px;
 }  }
   
 img.stift{  img.stift {
   border-width: 0;    border-width: 0;
   vertical-align: middle;    vertical-align: middle;
 }  }
   
 table#LC_mainmenu{  table td.LC_mainmenu_col_fieldset {
  margin-top:10px;  
  width:80%;  
 }  
   
 table#LC_mainmenu td.LC_mainmenu_col_fieldset{  
   vertical-align: top;    vertical-align: top;
   width: 45%;  
 }  }
   
 .LC_mainmenu_fieldset_category {  div.LC_createcourse {
   color: $font;    margin: 10px 10px 10px 10px;
   background: $pgbg;  
   font-size: small;  
   font-weight: bold;  
 }  }
   
 div.LC_createcourse {  .LC_dccid {
     margin: 10px 10px 10px 10px;    margin: 0.2em 0 0 0;
     padding: 0;
     font-size: 90%;
     display:none;
 }  }
   
 /* ---- Remove when done ----  /* ---- Remove when done ----
Line 5869  ol#LC_PathBreadcrumbs a:hover, Line 6097  ol#LC_PathBreadcrumbs a:hover,
 ul#LC_secondary_menu a:hover,  ul#LC_secondary_menu a:hover,
 .LC_FormSectionClearButton input:hover  .LC_FormSectionClearButton input:hover
 ul.LC_TabContent   li:hover a {  ul.LC_TabContent   li:hover a {
  color:#BF2317;    color:#BF2317;
     text-decoration:none;    text-decoration:none;
 }  }
   
 h1 {  h1 {
  padding: 0;    padding: 0;
  line-height:130%;    line-height:130%;
 }  }
   
 h2,h3,h4,h5,h6 {  h2,
  margin: 5px 0 5px 0;  h3,
  padding: 0;  h4,
  line-height:130%;  h5,
   h6 {
     margin: 5px 0 5px 0;
     padding: 0;
     line-height:130%;
 }  }
   
 .LC_hcell {  .LC_hcell {
         padding:3px 15px 3px 15px;    padding:3px 15px 3px 15px;
         margin: 0;    margin: 0;
  background-color:$tabbg;    background-color:$tabbg;
  color:$fontmenu;    color:$fontmenu;
  border-bottom:solid 1px $lg_border_color;    border-bottom:solid 1px $lg_border_color;
 }  }
   
 .LC_Box > .LC_hcell {  .LC_Box > .LC_hcell {
     margin: 0 -10px 10px -10px;    margin: 0 -10px 10px -10px;
 }  }
   
 .LC_noBorder {  .LC_noBorder {
         border: 0;    border: 0;
 }  
   
 .LC_Right {  
         float: right;  
         margin: 0;  
         padding: 0;  
 }  }
   
 .LC_FormSectionClearButton input {  .LC_FormSectionClearButton input {
         background-color:transparent;    background-color:transparent;
         border: none;    border: none;
         cursor:pointer;    cursor:pointer;
         text-decoration:underline;    text-decoration:underline;
 }  }
   
 .LC_help_open_topic {  .LC_help_open_topic {
         color: #FFFFFF;    color: #FFFFFF;
         background-color: #EEEEFF;    background-color: #EEEEFF;
         margin: 1px;    margin: 1px;
         padding: 4px;    padding: 4px;
         border: 1px solid #000033;    border: 1px solid #000033;
         white-space: nowrap;    white-space: nowrap;
 /* vertical-align: middle; */    /* vertical-align: middle; */
 }  }
   
 dl,ul,div,fieldset {  dl,
  margin: 10px 10px 10px 0;  ul,
 /* overflow: hidden; */  div,
   fieldset {
     margin: 10px 10px 10px 0;
     /* overflow: hidden; */
 }  }
   
 fieldset > legend {  fieldset > legend {
     font-weight: bold;    font-weight: bold;
     padding: 0 5px 0 5px;    padding: 0 5px 0 5px;
   }
   
   div.LC_page_header {
     background-color: $pgbg_or_bgcolor;
     margin: 0 0 1.0em 0;
 }  }
   
 #LC_nav_bar {  #LC_nav_bar {
     float: left;    float: left;
     margin: 0.2em 0 0 0;    margin: 0.2em 0 0 0;
 }  }
   
 #LC_nav_bar em{  #LC_realm {
     font-weight: bold;    margin: 0.2em 0 0 0;
     font-style: normal;    padding: 0;
     font-weight: bold;
     text-align: center;
   }
   
   #LC_nav_bar em {
     font-weight: bold;
     font-style: normal;
 }  }
   
 ol.LC_primary_menu {  ol.LC_primary_menu {
     float: right;    float: right;
     margin: 0.2em 0 0 0;    margin: 0.2em 0 0 0;
 }  }
   
 ol#LC_PathBreadcrumbs {  ol#LC_PathBreadcrumbs {
  margin: 0;    margin: 0;
 }  }
   
 ol.LC_primary_menu li {  ol.LC_primary_menu li {
  display: inline;    display: inline;
  padding: 5px 5px 0 10px;    padding: 5px 5px 0 10px;
  vertical-align: top;    vertical-align: top;
 }  }
   
 ol.LC_primary_menu li img {  ol.LC_primary_menu li img {
  vertical-align: bottom;    vertical-align: bottom;
 }  }
   
 ol.LC_primary_menu a {  ol.LC_primary_menu a {
  font-size: 90%;    font-size: 90%;
  color: RGB(80, 80, 80);    color: RGB(80, 80, 80);
  text-decoration: none;    text-decoration: none;
   }
   
   ol.LC_primary_menu a.LC_new_message {
     font-weight:bold;
     color: darkred;
 }  }
   
 ul#LC_secondary_menu {  ul#LC_secondary_menu {
     clear: both;    clear: both;
     color: $fontmenu;    color: $fontmenu;
     background: $tabbg;    background: $tabbg;
     list-style: none;    list-style: none;
     padding: 0;    padding: 0;
     margin: 0;    margin: 0;
     width: 100%;    width: 100%;
 }  }
   
 ul#LC_secondary_menu li {  ul#LC_secondary_menu li {
     font-weight: bold;    font-weight: bold;
     line-height: 1.8em;    line-height: 1.8em;
     padding: 0 0.8em;     padding: 0 0.8em;
     border-right: 1px solid black;    border-right: 1px solid black;
     display: inline;    display: inline;
     vertical-align: middle;    vertical-align: middle;
 }  }
   
 ul.LC_TabContent {  ul.LC_TabContent {
  display:block;    display:block;
  background: $sidebg;    background: $sidebg;
  border-bottom: solid 1px $lg_border_color;    border-bottom: solid 1px $lg_border_color;
  list-style:none;    list-style:none;
  margin: 0 -10px;    margin: 0 -10px;
  padding: 0;    padding: 0;
 }  }
   
 ul.LC_TabContent li,  ul.LC_TabContent li,
 ul.LC_TabContentBigger li {  ul.LC_TabContentBigger li {
  float:left;    float:left;
 }  }
   
 ul#LC_secondary_menu li a {  ul#LC_secondary_menu li a {
     color: $fontmenu;    color: $fontmenu;
  text-decoration: none;    text-decoration: none;
 }  }
   
 ul.LC_TabContent {  ul.LC_TabContent {
  min-height:1.5em;    min-height:1.5em;
 }  }
   
 ul.LC_TabContent li {  ul.LC_TabContent li {
  vertical-align:middle;    vertical-align:middle;
  padding: 0 10px 0 10px;    padding: 0 10px 0 10px;
  background-color:$tabbg;    background-color:$tabbg;
  border-bottom:solid 1px $lg_border_color;    border-bottom:solid 1px $lg_border_color;
 }  }
   
 ul.LC_TabContent .right {  ul.LC_TabContent .right {
  float:right;    float:right;
 }  }
   
 ul.LC_TabContent li a, ul.LC_TabContent li {  ul.LC_TabContent li a,
  color:rgb(47,47,47);  ul.LC_TabContent li {
  text-decoration:none;    color:rgb(47,47,47);
  font-size:95%;    text-decoration:none;
  font-weight:bold;    font-size:95%;
  padding-right: 16px;    font-weight:bold;
     padding-right: 16px;
 }  }
   
 ul.LC_TabContent li:hover, ul.LC_TabContent li.active {  ul.LC_TabContent li:hover,
         background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;  ul.LC_TabContent li.active {
  border-bottom:solid 2px #FFFFFF;    background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;
  padding-right: 16px;    border-bottom:solid 2px #FFFFFF;
     padding-right: 16px;
 }  }
   
 #maincoursedoc {  #maincoursedoc {
  clear:both;    clear:both;
 }  }
   
 ul.LC_TabContentBigger {  ul.LC_TabContentBigger {
         display:block;    display:block;
         list-style:none;    list-style:none;
         padding: 0;    padding: 0;
 }  }
   
 ul.LC_TabContentBigger li {  ul.LC_TabContentBigger li {
         vertical-align:bottom;    vertical-align:bottom;
         height: 30px;    height: 30px;
         font-size:110%;    font-size:110%;
         font-weight:bold;    font-weight:bold;
         color: #737373;    color: #737373;
 }  }
   
   
 ul.LC_TabContentBigger li a {  ul.LC_TabContentBigger li a {
         background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;    background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;
  height: 30px;    height: 30px;
  line-height: 30px;    line-height: 30px;
  text-align: center;    text-align: center;
  display: block;    display: block;
  text-decoration: none;    text-decoration: none;
 }  }
   
 ul.LC_TabContentBigger li:hover a,   ul.LC_TabContentBigger li:hover a,
 ul.LC_TabContentBigger li.active a {  ul.LC_TabContentBigger li.active a {
  background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;    background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;
  color:$font;    color:$font;
  text-decoration: underline;    text-decoration: underline;
 }  }
   
   
 ul.LC_TabContentBigger li b {  ul.LC_TabContentBigger li b {
  background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;    background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;
  display: block;    display: block;
  float: left;    float: left;
  padding: 0 30px;    padding: 0 30px;
 }  }
   
 ul.LC_TabContentBigger li:hover b,  ul.LC_TabContentBigger li:hover b,
 ul.LC_TabContentBigger li.active b {  ul.LC_TabContentBigger li.active b {
         background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;    background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;
         color:$font;    color:$font;
  border-bottom: 1px solid #FFFFFF;    border-bottom: 1px solid #FFFFFF;
 }  }
   
   
Line 6095  ul.LC_CourseBreadcrumbs { Line 6343  ul.LC_CourseBreadcrumbs {
   
 }  }
   
 ol#LC_MenuBreadcrumbs,   ol#LC_MenuBreadcrumbs,
 ol#LC_PathBreadcrumbs {  ol#LC_PathBreadcrumbs {
  padding-left: 10px;    padding-left: 10px;
  margin: 0;    margin: 0;
  list-style-position: inside;    margin: 0;
     /* SD working here    height: 2.5em;  /* equal to #LC_breadcrumbs line-height */
     white-space: nowrap; */  
 }  }
   
 ol#LC_MenuBreadcrumbs li,   ol#LC_MenuBreadcrumbs li,
 ol#LC_PathBreadcrumbs li,   ol#LC_PathBreadcrumbs li,
 ul.LC_CourseBreadcrumbs li {  ul.LC_CourseBreadcrumbs li {
     display: inline;    display: inline;
     white-space: nowrap;    white-space: normal;
     /* SD working here  
     white-space: normal; */  
 }  }
   
 ol#LC_MenuBreadcrumbs li a,  ol#LC_MenuBreadcrumbs li a,
 ul.LC_CourseBreadcrumbs li a {  ul.LC_CourseBreadcrumbs li a {
  text-decoration: none;    text-decoration: none;
  font-size:90%;    font-size:90%;
   }
   
   ol#LC_MenuBreadcrumbs h1 {
     display: inline;
     font-size: 90%;
     line-height: 2.5em;
     margin: 0;
     padding: 0;
 }  }
   
 ol#LC_PathBreadcrumbs li a {  ol#LC_PathBreadcrumbs li a {
  text-decoration:none;    text-decoration:none;
  font-size:100%;    font-size:100%;
  font-weight:bold;    font-weight:bold;
 }  }
   
 .LC_Box {  .LC_Box {
     border: solid 1px $lg_border_color;    border: solid 1px $lg_border_color;
     padding: 0 10px 10px 10px;    padding: 0 10px 10px 10px;
 }  }
   
 .LC_AboutMe_Image {  .LC_AboutMe_Image {
  float:left;    float:left;
  margin-right:10px;    margin-right:10px;
 }  }
   
 .LC_Clear_AboutMe_Image {  .LC_Clear_AboutMe_Image {
  clear:left;    clear:left;
 }  }
   
 dl.LC_ListStyleClean dt {  dl.LC_ListStyleClean dt {
  padding-right: 5px;    padding-right: 5px;
  display: table-header-group;    display: table-header-group;
 }  }
   
 dl.LC_ListStyleClean dd {  dl.LC_ListStyleClean dd {
  display: table-row;    display: table-row;
 }  }
   
 .LC_ListStyleClean,  .LC_ListStyleClean,
 .LC_ListStyleSimple,  .LC_ListStyleSimple,
 .LC_ListStyleNormal,  .LC_ListStyleNormal,
 .LC_ListStyle_Border,  
 .LC_ListStyleSpecial {  .LC_ListStyleSpecial {
  /*display:block; */    /* display:block; */
  list-style-position: inside;    list-style-position: inside;
  list-style-type: none;    list-style-type: none;
  overflow: hidden;    overflow: hidden;
  padding: 0;    padding: 0;
 }  }
   
 .LC_ListStyleSimple li,  .LC_ListStyleSimple li,
Line 6166  dl.LC_ListStyleClean dd { Line 6418  dl.LC_ListStyleClean dd {
 .LC_ListStyleNormal dd,  .LC_ListStyleNormal dd,
 .LC_ListStyleSpecial li,  .LC_ListStyleSpecial li,
 .LC_ListStyleSpecial dd {  .LC_ListStyleSpecial dd {
  margin: 0;    margin: 0;
  padding: 5px 5px 5px 10px;    padding: 5px 5px 5px 10px;
  clear: both;    clear: both;
 }  }
   
 .LC_ListStyleClean li,  .LC_ListStyleClean li,
 .LC_ListStyleClean dd {  .LC_ListStyleClean dd {
  padding-top: 0;    padding-top: 0;
  padding-bottom: 0;    padding-bottom: 0;
 }  }
   
 .LC_ListStyleSimple dd,  .LC_ListStyleSimple dd,
 .LC_ListStyleSimple li {  .LC_ListStyleSimple li {
  border-bottom: solid 1px $lg_border_color;    border-bottom: solid 1px $lg_border_color;
 }  }
   
 .LC_ListStyleSpecial li,  .LC_ListStyleSpecial li,
 .LC_ListStyleSpecial dd {  .LC_ListStyleSpecial dd {
  list-style-type: none;    list-style-type: none;
  background-color: RGB(220, 220, 220);    background-color: RGB(220, 220, 220);
  margin-bottom: 4px;    margin-bottom: 4px;
 }  }
   
 table.LC_SimpleTable {  table.LC_SimpleTable {
  margin:5px;    margin:5px;
  border:solid 1px $lg_border_color;    border:solid 1px $lg_border_color;
 }  }
   
 table.LC_SimpleTable tr {  table.LC_SimpleTable tr {
  padding: 0;    padding: 0;
  border:solid 1px $lg_border_color;    border:solid 1px $lg_border_color;
 }  }
   
 table.LC_SimpleTable thead {  table.LC_SimpleTable thead {
  background:rgb(220,220,220);    background:rgb(220,220,220);
 }  }
   
 div.LC_columnSection {  div.LC_columnSection {
  display: block;    display: block;
  clear: both;    clear: both;
  overflow: hidden;    overflow: hidden;
  margin: 0;    margin: 0;
 }  }
   
 div.LC_columnSection>* {  div.LC_columnSection>* {
  float: left;    float: left;
  margin: 10px 20px 10px 0;    margin: 10px 20px 10px 0;
  overflow:hidden;    overflow:hidden;
 }  }
   
 .LC_loginpage_container {  .LC_loginpage_container {
  text-align:left;    text-align:left;
  margin : 0 auto;    margin : 0 auto;
  width:90%;    width:90%;
  padding: 10px;    padding: 10px;
  height: auto;    height: auto;
  background-color:#FFFFFF;    background-color:#FFFFFF;
  border:1px solid #CCCCCC;    border:1px solid #CCCCCC;
 }  }
   
   
 .LC_loginpage_loginContainer {  .LC_loginpage_loginContainer {
  float:left;    float:left;
  width: 182px;    width: 182px;
  padding: 2px;    padding: 2px;
  border:1px solid #CCCCCC;    border:1px solid #CCCCCC;
  background-color:$loginbg;    background-color:$loginbg;
 }  }
   
 .LC_loginpage_loginContainer h2 {  .LC_loginpage_loginContainer h2 {
  margin-top: 0;    margin-top: 0;
  display:block;    display:block;
  background:$bgcol;    background:$bgcol;
  color:$textcol;    color:$textcol;
  padding-left:5px;    padding-left:5px;
 }  }
   
 .LC_loginpage_loginInfo {  .LC_loginpage_loginInfo {
  float:left;    float:left;
  width:182px;    width:182px;
  border:1px solid #CCCCCC;    border:1px solid #CCCCCC;
  padding:2px;    padding:2px;
 }  }
   
 .LC_loginpage_space {  .LC_loginpage_space {
  clear: both;    clear: both;
  margin-bottom: 20px;    margin-bottom: 20px;
  border-bottom: 1px solid #CCCCCC;    border-bottom: 1px solid #CCCCCC;
 }  }
   
 .LC_loginpage_floatLeft {  .LC_loginpage_floatLeft {
  float: left;    float: left;
  width: 200px;    width: 200px;
  margin: 0;    margin: 0;
 }  }
   
 table em {  table em {
  font-weight: bold;    font-weight: bold;
  font-style: normal;    font-style: normal;
 }  }
   
 table.LC_tableBrowseRes,  table.LC_tableBrowseRes,
 table.LC_tableOfContent {  table.LC_tableOfContent {
         border:none;    border:none;
  border-spacing: 1px;    border-spacing: 1px;
  padding: 3px;    padding: 3px;
  background-color: #FFFFFF;    background-color: #FFFFFF;
  font-size: 90%;    font-size: 90%;
 }  }
   
 table.LC_tableOfContent{  table.LC_tableOfContent {
     border-collapse: collapse;    border-collapse: collapse;
 }  }
   
 table.LC_tableBrowseRes a,  table.LC_tableBrowseRes a,
 table.LC_tableOfContent a {  table.LC_tableOfContent a {
         background-color: transparent;    background-color: transparent;
  text-decoration: none;    text-decoration: none;
 }  
   
 table.LC_tableBrowseRes tr.LC_trOdd,  
 table.LC_tableOfContent tr.LC_trOdd{  
  background-color: #EEEEEE;  
 }  }
   
 table.LC_tableOfContent img {  table.LC_tableOfContent img {
  border: none;    border: none;
  height: 1.3em;    height: 1.3em;
  vertical-align: text-bottom;    vertical-align: text-bottom;
  margin-right: 0.3em;    margin-right: 0.3em;
 }  }
   
 a#LC_content_toolbar_firsthomework {  a#LC_content_toolbar_firsthomework {
  background-image:url(/res/adm/pages/open-first-problem.gif);    background-image:url(/res/adm/pages/open-first-problem.gif);
 }  }
   
 a#LC_content_toolbar_launchnav {  a#LC_content_toolbar_launchnav {
  background-image:url(/res/adm/pages/start-navigation.gif);    background-image:url(/res/adm/pages/start-navigation.gif);
 }  }
   
 a#LC_content_toolbar_closenav {  a#LC_content_toolbar_closenav {
  background-image:url(/res/adm/pages/close-navigation.gif);    background-image:url(/res/adm/pages/close-navigation.gif);
 }  }
   
 a#LC_content_toolbar_everything {  a#LC_content_toolbar_everything {
  background-image:url(/res/adm/pages/show-all.gif);    background-image:url(/res/adm/pages/show-all.gif);
 }  }
   
 a#LC_content_toolbar_uncompleted {  a#LC_content_toolbar_uncompleted {
  background-image:url(/res/adm/pages/show-incomplete-problems.gif);    background-image:url(/res/adm/pages/show-incomplete-problems.gif);
 }  }
   
 #LC_content_toolbar_clearbubbles {  #LC_content_toolbar_clearbubbles {
  background-image:url(/res/adm/pages/mark-discussionentries-read.gif);    background-image:url(/res/adm/pages/mark-discussionentries-read.gif);
 }  }
   
 a#LC_content_toolbar_changefolder {  a#LC_content_toolbar_changefolder {
  background : url(/res/adm/pages/close-all-folders.gif) top center ;    background : url(/res/adm/pages/close-all-folders.gif) top center ;
 }  }
   
 a#LC_content_toolbar_changefolder_toggled {  a#LC_content_toolbar_changefolder_toggled {
  background-image:url(/res/adm/pages/open-all-folders.gif);    background-image:url(/res/adm/pages/open-all-folders.gif);
   }
   
   a#LC_content_toolbar_management {
     background-image:url(/res/adm/pages/navtomenu.png);
 }  }
   
 ul#LC_toolbar li a:hover {  ul#LC_toolbar li a:hover {
  background-position: bottom center;    background-position: bottom center;
 }  }
   
 ul#LC_toolbar {  ul#LC_toolbar {
  padding: 0;    padding: 0;
  margin: 2px;    margin: 2px;
  list-style:none;    list-style:none;
  position:relative;    position:relative;
  background-color:white;    background-color:white;
 }  }
   
 ul#LC_toolbar li {  ul#LC_toolbar li {
  border:1px solid white;    border:1px solid white;
  padding: 0;    padding: 0;
  margin: 0;    margin: 0;
         float: left;    float: left;
  display:inline;    display:inline;
  vertical-align:middle;    vertical-align:middle;
 }   }
   
   
 a.LC_toolbarItem {  a.LC_toolbarItem {
  display:block;    display:block;
  padding: 0;    padding: 0;
  margin: 0;    margin: 0;
  height: 32px;    height: 32px;
  width: 32px;    width: 32px;
  color:white;    color:white;
  border: none;    border: none;
  background-repeat:no-repeat;    background-repeat:no-repeat;
  background-color:transparent;    background-color:transparent;
   }
   
   ul.LC_funclist {
       margin: 0;
       padding: 0.5em 1em 0.5em 0;
   }
   
   ul.LC_funclist > li:first-child {
       font-weight:bold;
       margin-left:0.8em;
   }
   
   ul.LC_funclist + ul.LC_funclist {
       /* 
          left border as a seperator if we have more than
          one list 
       */
       border-left: 1px solid $sidebg;
       /* 
          this hides the left border behind the border of the 
          outer box if element is wrapped to the next 'line' 
       */
       margin-left: -1px;
 }  }
   
 ul.LC_funclist li {  ul.LC_funclist li {
   float: left;    display: inline;
   white-space: nowrap;    white-space: nowrap;
   height: 35px; /* at least as high as heighest list item */    margin: 0 0 0 25px;
   margin: 0 15px 15px 10px;    line-height: 150%;
 }  }
   
   #gciheader {
     float:left;
     width:100%;
     background:#DAE0D2 url("/gcimenu_bg.gif") repeat-x bottom;
     font-size:93%;
     line-height:normal;
     margin: 0.5em 0 0.5em 0;
   }
   #gciheader ul {
     margin:0;
     padding:10px 10px 0;
     list-style:none;
   }
   #gciheader li {
     float:left;
     background:url("/gcimenu_left.gif") no-repeat left top;
     margin:0;
     padding:0 0 0 9px;
   }
   #gciheader a {
     display:block;
     background:url("/gcimenu_right.gif") no-repeat right top;
     padding:5px 15px 4px 6px;
   }
   #gciheader #current {
     background-image:url("/gcimenu_left_on.gif");
   }
   #gciheader #current a {
     background-image:url("/gcimenu_right_on.gif");
     padding-bottom:5px;
   }
   
 END  END
 }  }
Line 6647  sub start_page { Line 6952  sub start_page {
     # Don't add anything more if only_body wanted      # Don't add anything more if only_body wanted
     return $result if $args->{'only_body'};      return $result if $args->{'only_body'};
   
       #Breadcrumbs for Construction Space provided by &bodytag. 
       if (($env{'environment.remote'} eq 'off') && ($env{'request.state'} eq 'construct')) {
           return $result;
       }
    
     #Breadcrumbs      #Breadcrumbs
     if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) {      if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) {
  &Apache::lonhtmlcommon::clear_breadcrumbs();   &Apache::lonhtmlcommon::clear_breadcrumbs();
Line 6660  sub start_page { Line 6970  sub start_page {
  #if bread_crumbs_component exists show it as headline else show only the breadcrumbs   #if bread_crumbs_component exists show it as headline else show only the breadcrumbs
  if(exists($args->{'bread_crumbs_component'})){   if(exists($args->{'bread_crumbs_component'})){
  $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'});   $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'});
  }else{   } elsif (exists($args->{'bread_crumbs_menulink'})) {
  $result .= &Apache::lonhtmlcommon::breadcrumbs();   $result .= &Apache::lonhtmlcommon::breadcrumbs('','',$args->{'bread_crumbs_menulink'});
                   } else {
    $result .= &Apache::lonhtmlcommon::breadcrumbs(); 
  }   }
     }      }
     return $result;      return $result;
Line 6971  sub check_user_status { Line 7283  sub check_user_status {
     my $active_chk = 'none';      my $active_chk = 'none';
     my $now = time;      my $now = time;
     if (@uroles > 0) {      if (@uroles > 0) {
         if (($role eq 'cc') || ($sec eq '') || (!defined($sec))) {          if (($role eq 'cc') || ($role eq 'co') || ($sec eq '') || (!defined($sec))) {
             $srchstr = '/'.$cdom.'/'.$crs.'_'.$role;              $srchstr = '/'.$cdom.'/'.$crs.'_'.$role;
         } else {          } else {
             $srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role;              $srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role;
Line 7592  sub user_picker { Line 7904  sub user_picker {
                     'whse'      => "When searching by last,first you must include at least one character in the first name.",                      'whse'      => "When searching by last,first you must include at least one character in the first name.",
                      'thfo'     => "The following need to be corrected before the search can be run:",                       'thfo'     => "The following need to be corrected before the search can be run:",
                                        );                                         );
     my $domform = &select_dom_form($currdom,'srchdomain',1,1);      my $domform = &select_dom_form($currdom,'srchdomain',undef,1);
     my $srchinsel = ' <select name="srchin">';      my $srchinsel = ' <select name="srchin">';
        
     my @srchins = ('crs','dom','alc','instd');      my @srchins = ('crs','dom','alc','instd');
   
     foreach my $option (@srchins) {      foreach my $option (@srchins) {
Line 7604  sub user_picker { Line 7916  sub user_picker {
         next if ($option eq 'alc');          next if ($option eq 'alc');
         next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs'));            next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs'));  
         next if ($option eq 'crs' && !$env{'request.course.id'});          next if ($option eq 'crs' && !$env{'request.course.id'});
           next if ($option eq 'instd');
         if ($curr_selected{'srchin'} eq $option) {          if ($curr_selected{'srchin'} eq $option) {
             $srchinsel .= '               $srchinsel .= ' 
    <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';         <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
         } else {          } else {
             $srchinsel .= '              $srchinsel .= '
    <option value="'.$option.'">'.$lt{$option}.'</option>';      <option value="'.$option.'">'.$lt{$option}.'</option>';
         }          }
     }      }
     $srchinsel .= "\n  </select>\n";      $srchinsel .= "\n  </select>\n";
Line 7653  sub user_picker { Line 7966  sub user_picker {
                     );                      );
                     $new_user_create = '<p class="LC_warning">'                      $new_user_create = '<p class="LC_warning">'
                                       .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")                                        .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
                                       .' '                                        .'<br />'
                                       .&mt('Please contact the [_1]helpdesk[_2] for assistance.'                                        .&mt('Enter a valid e-mail address as the username for the new user.').' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.'
                                           ,'<a href="'.$helplink.'">','</a>')                                        ,'<a href="'.$helplink.'">','</a>')
                                       .'</p><br />';                                        .'</p><br />';
                 }                  }
             }              }
Line 9525  sub extract_categories { Line 9838  sub extract_categories {
                 my $trailstr;                  my $trailstr;
                 if ($name eq 'instcode') {                  if ($name eq 'instcode') {
                     $trailstr = &mt('Official courses (with institutional codes)');                      $trailstr = &mt('Official courses (with institutional codes)');
                   } elsif ($name eq 'communities') {
                       $trailstr = &mt('Communities');
                 } else {                  } else {
                     $trailstr = $name;                      $trailstr = $name;
                 }                  }
Line 9637  cathash - reference to hash of categorie Line 9952  cathash - reference to hash of categorie
   
 currcat - scalar with an & separated list of categories assigned to a course.   currcat - scalar with an & separated list of categories assigned to a course. 
   
   type    - scalar contains course type (Course or Community).
   
 Returns: $output (markup to be displayed)   Returns: $output (markup to be displayed) 
   
 =cut  =cut
   
 sub assign_categories_table {  sub assign_categories_table {
     my ($cathash,$currcat) = @_;      my ($cathash,$currcat,$type) = @_;
     my $output;      my $output;
     if (ref($cathash) eq 'HASH') {      if (ref($cathash) eq 'HASH') {
         my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth);          my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth);
Line 9651  sub assign_categories_table { Line 9968  sub assign_categories_table {
         if (@cats > 0) {          if (@cats > 0) {
             my $itemcount = 0;              my $itemcount = 0;
             if (ref($cats[0]) eq 'ARRAY') {              if (ref($cats[0]) eq 'ARRAY') {
                 $output = &Apache::loncommon::start_data_table();  
                 my @currcategories;                  my @currcategories;
                 if ($currcat ne '') {                  if ($currcat ne '') {
                     @currcategories = split('&',$currcat);                      @currcategories = split('&',$currcat);
                 }                  }
                   my $table;
                 for (my $i=0; $i<@{$cats[0]}; $i++) {                  for (my $i=0; $i<@{$cats[0]}; $i++) {
                     my $parent = $cats[0][$i];                      my $parent = $cats[0][$i];
                     my $css_class = $itemcount%2?' class="LC_odd_row"':'';  
                     next if ($parent eq 'instcode');                      next if ($parent eq 'instcode');
                       if ($type eq 'Community') {
                           next unless ($parent eq 'communities');
                       } else {
                           next if ($parent eq 'communities');
                       }
                       my $css_class = $itemcount%2?' class="LC_odd_row"':'';
                     my $item = &escape($parent).'::0';                      my $item = &escape($parent).'::0';
                     my $checked = '';                      my $checked = '';
                     if (@currcategories > 0) {                      if (@currcategories > 0) {
Line 9667  sub assign_categories_table { Line 9989  sub assign_categories_table {
                             $checked = ' checked="checked"';                              $checked = ' checked="checked"';
                         }                          }
                     }                      }
                     $output .= '<tr '.$css_class.'><td><span class="LC_nobreak">'.                      my $parent_title = $parent;
                                '<input type="checkbox" name="usecategory" value="'.                      if ($parent eq 'communities') {
                                $item.'"'.$checked.' />'.$parent.'</span>'.                          $parent_title = &mt('Communities');
                                '<input type="hidden" name="catname" value="'.$parent.'" /></td>';                      }
                       $table .= '<tr '.$css_class.'><td><span class="LC_nobreak">'.
                                 '<input type="checkbox" name="usecategory" value="'.
                                 $item.'"'.$checked.' />'.$parent_title.'</span>'.
                                 '<input type="hidden" name="catname" value="'.$parent.'" /></td>';
                     my $depth = 1;                      my $depth = 1;
                     push(@path,$parent);                      push(@path,$parent);
                     $output .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories);                      $table .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories);
                     pop(@path);                      pop(@path);
                     $output .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>';                      $table .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>';
                     $itemcount ++;                      $itemcount ++;
                 }                  }
                 $output .= &Apache::loncommon::end_data_table();                  if ($itemcount) {
                       $output = &Apache::loncommon::start_data_table().
                                 $table.
                                 &Apache::loncommon::end_data_table();
                   }
             }              }
         }          }
     }      }
Line 9923  sub check_clone { Line 10253  sub check_clone {
     my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);      my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
     my $clonemsg;      my $clonemsg;
     my $can_clone = 0;      my $can_clone = 0;
       my $lctype = lc($args->{'crstype'});
       if ($lctype ne 'community') {
           $lctype = 'course';
       }
     if ($clonehome eq 'no_host') {      if ($clonehome eq 'no_host') {
         $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});               if ($args->{'crstype'} eq 'Community') {
               $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
           } else {
               $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
           }     
     } else {      } else {
  my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});   my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
           if ($args->{'crstype'} eq 'Community') {
               if ($clonedesc{'type'} ne 'Community') {
                    $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
                   return ($can_clone, $clonemsg, $cloneid, $clonehome);
               }
           }
  if (($env{'request.role.domain'} eq $args->{'clonedomain'}) &&    if (($env{'request.role.domain'} eq $args->{'clonedomain'}) && 
             (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) {              (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) {
     $can_clone = 1;      $can_clone = 1;
Line 9940  sub check_clone { Line 10283  sub check_clone {
             } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) {              } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) {
                 $can_clone = 1;                  $can_clone = 1;
             } else {              } else {
                   my $ccrole = 'cc';
                   if ($args->{'crstype'} eq 'Community') {
                       $ccrole = 'co';
                   }
         my %roleshash =          my %roleshash =
     &Apache::lonnet::get_my_roles($args->{'ccuname'},      &Apache::lonnet::get_my_roles($args->{'ccuname'},
  $args->{'ccdomain'},   $args->{'ccdomain'},
                                          'userroles',['active'],['cc'],                                           'userroles',['active'],[$ccrole],
  [$args->{'clonedomain'}]);   [$args->{'clonedomain'}]);
         if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {          if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
     $can_clone = 1;      $can_clone = 1;
         } else {          } else {
                     $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});                      if ($args->{'crstype'} eq 'Community') {
                           $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
                       } else {
                           $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
                       }
         }          }
     }      }
         }          }
Line 10283  sub construct_course { Line 10634  sub construct_course {
         $outcome .= ($fatal?$errtext:'write ok').$linefeed;          $outcome .= ($fatal?$errtext:'write ok').$linefeed;
     }      }
   
       if ($args->{'cloneroster'}) {
           my ($numadded,$clisterror) = &Apache::lonclonecourse::copyroster($cloneid,$$courseid,$args->{'startaccess'},$args->{'endaccess'});
           if ($clisterror) {
               $outcome .= "\0".&mt('An error occurred when copying the student roster from the old course to the new course; the error was: [_1].',$clisterror).$linefeed;
               if ($numadded) {
                   $outcome .= &mt('Although [quant,_1,student] have received roles in the new course the roster does not report this. It is  ').$linefeed;
               } 
           } else {
               if ($numadded) {
                   $outcome .= "\0".&mt('[quant,_1,student] copied from roster for old course to roster for new course.',$numadded).$linefeed;
               } else {
                   $outcome .= "\0".&mt('No students have been enrolled in the new Concept Test.').' '.&mt('This is because either (a) an error occurred, or (b) there were no students with either current access or access which ended on/after the current default end date set for access to the old course.').$linefeed;
               }
           }
       }
     return (1,$outcome);      return (1,$outcome);
 }  }
   
Line 10549  sub _add_to_env { Line 10915  sub _add_to_env {
     }      }
 }  }
   
   sub new_roles_update {
       my $rolecount = 0;
       foreach my $envkey (keys(%env)) {
           next unless ($envkey =~ /^user\.role\./);
           $rolecount ++;
       }
       my $newrolecount = 0;
       if (!$rolecount) {
           my %userenv;
           foreach my $crstype ('official','unofficial','community') {
               $userenv{'canrequest.'.$crstype} =
                   &Apache::lonnet::usertools_access($env{'user.name'},
                   $env{'user.domain'},$crstype,'reload','requestcourses');
           }
           my $then=$env{'user.login.time'};
           my $refresh=time;
           my (%userroles,%allroles,%allgroups,@newroles);
           my %roleshash =
               &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',['active','future','previous'],undef,undef,1);
           foreach my $item (keys(%roleshash)) {
               my ($uname,$udom,$role,$section) = split(':',$item);
               my $where = '/'.$udom.'/'.$uname;
               my ($tstart,$tend) = split(':',$roleshash{$item});
               if ($section ne '') {
                   $where .= '/'.$section;
               }
               my $spec = $role.'.'.$where;
               &Apache::lonnet::set_arearole($role,$where,$tstart,$tend,
                                             $env{'user.domain'},$env{'user.name'});
               $userroles{'user.role.'.$spec} = $tstart.'.'.$tend;
               $newrolecount ++;
               unless (grep(/^\Q$role\E$/,@newroles)) {
                   push(@newroles,$role);
               }
               my $status =
                   &Apache::lonnet::curr_role_status($tstart,$tend,$refresh,$then);
               if ($status eq 'active') {
                   &Apache::lonnet::gather_roleprivs(\%allroles,\%allgroups,\%userroles,
                                                     $where,$role,$tstart,$tend);
               }
           }
           if (@newroles) {
               my ($author,$adv) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles,
                                                                  \%allgroups);
               &Apache::lonnet::appenv(\%userroles,[@newroles,'cm']);
               $userenv{'user.adv'} = $adv;
               $userenv{'user.author'} = $author;
               $userenv{'user.refresh.time'} = $refresh;
           }
           &Apache::lonnet::appenv(\%userenv);
       }
       return $newrolecount;
   }
   
 # --- Get the symbolic name of a problem and the url  # --- Get the symbolic name of a problem and the url
 sub get_symb {  sub get_symb {
     my ($request,$silent) = @_;      my ($request,$silent) = @_;
Line 10590  sub clean_symb { Line 11010  sub clean_symb {
     return ($symb,$enc);      return ($symb,$enc);
 }  }
   
   sub needs_gci_custom {
       my $custommenu;
       my $numdc = &check_for_gci_dc();
       my $udom = $env{'user.domain'};
       return if ($udom eq '');
       unless ($numdc) {
           my $then=$env{'user.login.time'};
           my $now = time;
           my %allnums = &get_faculty_cnums();
           my $cnums = $allnums{$udom};
           return unless (ref($cnums) eq 'HASH');
           if ($env{"user.role.st./$udom/$cnums->{'review'}"}) {
               my ($start,$end) =
                   split('.',$env{"user.role.st./$udom/$cnums->{'review'}"});
               if (((!$start) || ($start && $start <= $now)) &&
                   ((!$end) || ($end > $now))) {
                   $custommenu = 1;
                   if ($env{"user.role.cc./$udom/$cnums->{'review'}"}) {
                       my ($ccstart,$ccend) =
                           split('.',$env{"user.role.cc./$udom/$cnums->{'review'}"});
                       if (((!$start) || ($start && $start <= $now)) &&
                               ((!$end) || ($end > $now))) {
                           $custommenu = '';
                       }
                   }
               }
           }
       }
       return $custommenu;
   }
   
   sub ci_tabs {
       my ($domain) = @_;
       my %tabs = (
                    gci  => ['review','submit','managetest','tutorial'],
                    slci => ['review'],
                  );
       return $tabs{$domain};
   }
   
   sub check_for_gci_dc {
       my $then=$env{'user.login.time'};
       my $numdc = 0;
       my @doms = &Apache::lonnet::current_machine_domains();
       foreach my $dom (@doms) {
           if ($env{'user.role.dc./'.$dom.'/'}) {
               my $livedc = 1;
               my ($tstart,$tend)=split(/\./,$env{'user.role.dc./'.$dom.'/'});
               if ($tstart && $tstart>$then) { $livedc = 0; }
               if ($tend   && $tend  <$then) { $livedc = 0; }
               if ($livedc) {
                   $numdc++;
               }
           }
       }
       return $numdc;
   }
   
   sub get_faculty_cnums {
       my %cnums = (
            gci => { 
                       review => '9615072b469884921gcil1',
                       submit => '1H96711d710194bfegcil1',
                       tutorial => '5422913620b814c90gcil1',
                   },
            slci => {
                       review => '4V80581c93ffc4c38gcil1',
                    }
       );
       return %cnums;
   }
   
   sub existing_gcitest_courses {
       my ($role) = @_;
       my %courses;
       my $cdom = $env{'user.domain'}.'test';
       my $now = time;
       foreach my $envkey (keys(%env)) {
           my $cnum;
           if ($envkey =~ m{^user\.role\.\Q$role\E\./\Q$cdom\E/($match_courseid)$}) {
               $cnum = $1;
           } else {
               next;
           }
           my ($tstart,$tend) = split(/\./,$env{$envkey});
           if (((!$tstart) || ($tstart < $now)) && ((!$tend) || ($tend > $now))) {
               my $descr = $env{'course.'.$cdom.'_'.$cnum.'.description'};
               if ($descr ne '') {
                   $courses{$cdom.'_'.$cnum}{'description'} = $descr;
               }
           }
       }
       return %courses;
   }
   
   sub gcitest_switcher {
       my ($role,$formname,%courses) = @_;
       my $output;
       my %Sortby;
       foreach my $course (sort(keys(%courses))) {
           next unless (ref($courses{$course}) eq 'HASH');
           my $clean_title = $courses{$course}{'description'};
           $clean_title =~ s/\W+//g;
           if ($clean_title eq '') {
               $clean_title = $courses{$course}{'description'};
           }
           push(@{$Sortby{$clean_title}},$course);
       }
       my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));
       my $default;
       if (@sorted_courses > 1) {
           if (($env{'request.course.id'}) && ($courses{$env{'request.course.id'}})) {
               $default = &mt('Switch concept test ...');
           } else {
               $default = &mt('Select a concept test ...');
           }
       } else {
           unless (($env{'request.course.id'}) && ($courses{$env{'request.course.id'}})) {
               $default = &mt('Select concept test ...');
           }
       }
       if ($default) {
           $output = '<form name="'.$formname.'" action="/adm/roles" method="post">'.
                     '<select name="newrole" onchange="javascript:courseswitcher();">'.
                     '<option value="" selected="selected">'.$default.'</option>';
           foreach my $item (@sorted_courses) {
               foreach my $course (@{$Sortby{$item}}) {
                   my ($cdom,$cnum) = split('_',$course);
                   $output .= '<option value="'.$role.'./'.$cdom.'/'.$cnum.'">'.$courses{$course}{'description'}.'</option>';
               }
           }
           $output .= '</select><input type="hidden" name="selectrole" value="" /></form>';
       }
       return $output;
   }
   
   sub gcitest_switcher_js {
       my ($current,$numcourses,$formname) = @_;
       my $output = <<"ENDJS";
   
   function courseswitcher(caller) {
       var numcourses = $numcourses;
       var current = '$current';
       var choice = document.$formname.newrole.options[document.$formname.newrole.selectedIndex].value;
       if (choice == '') {
           if (caller == 'icon') {
               alert('No Concept Test selected');
           }
           document.$formname.selectrole.value = '';
           return;
       }
       if (choice == current) {
           if ((caller != 'icon') && (numcourses > 1)) {
               alert('You have selected the current course.\\nPlease select a different Concept Test course');
           }
           document.$formname.newrole.selectedIndex = 0;
           document.$formname.selectrole.value = '';
           return;
       }
       document.$formname.selectrole.value = '1';
       document.$formname.submit();
       return;
   }
   
   ENDJS
       return $output;
   }
   
   sub get_citest_map {
       my ($cdom) = @_;
       my %questionnaires = (
                              gcitest  => 'default_1261144274.sequence',
                              slcitest => 'default_1261144274.sequence',
                            );
       return $questionnaires{$cdom};
   }
   
 =pod  =pod
   
 =back  =back

Removed from v.1.907  
changed lines
  Added in v.1.925.2.26


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