Diff for /loncom/interface/loncommon.pm between versions 1.777 and 1.967

version 1.777, 2009/03/26 12:44:52 version 1.967, 2010/05/06 16:16:02
Line 407  sub studentbrowser_javascript { Line 407  sub studentbrowser_javascript {
           ) { return ''; }              ) { return ''; }  
    return (<<'ENDSTDBRW');     return (<<'ENDSTDBRW');
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   // <![CDATA[
     var stdeditbrowser;      var stdeditbrowser;
     function openstdbrowser(formname,uname,udom,roleflag,ignorefilter) {      function openstdbrowser(formname,uname,udom,roleflag,ignorefilter,courseadvonly) {
         var url = '/adm/pickstudent?';          var url = '/adm/pickstudent?';
         var filter;          var filter;
  if (!ignorefilter) {   if (!ignorefilter) {
Line 422  sub studentbrowser_javascript { Line 423  sub studentbrowser_javascript {
         url += 'form=' + formname + '&unameelement='+uname+          url += 'form=' + formname + '&unameelement='+uname+
                                     '&udomelement='+udom;                                      '&udomelement='+udom;
  if (roleflag) { url+="&roles=1"; }   if (roleflag) { url+="&roles=1"; }
           if (courseadvonly) { url+="&courseadvonly=1"; }
         var title = 'Student_Browser';          var title = 'Student_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');
         stdeditbrowser.focus();          stdeditbrowser.focus();
     }      }
   // ]]>
 </script>  </script>
 ENDSTDBRW  ENDSTDBRW
 }  }
   
 sub selectstudent_link {  sub selectstudent_link {
    my ($form,$unameele,$udomele)=@_;     my ($form,$unameele,$udomele,$courseadvonly)=@_;
      my $callargs = "'".$form."','".$unameele."','".$udomele."'";
    if ($env{'request.course.id'}) {       if ($env{'request.course.id'}) {  
        if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})         if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
    && !&Apache::lonnet::allowed('srm',$env{'request.course.id'}.     && !&Apache::lonnet::allowed('srm',$env{'request.course.id'}.
  '/'.$env{'request.course.sec'})) {   '/'.$env{'request.course.sec'})) {
    return '';     return '';
        }         }
        return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele.         if ($courseadvonly)  {
         '","'.$udomele.'");'."'>".&mt('Select User')."</a>";             $callargs .= ",'',1,1";
          }
          return '<span class="LC_nobreak">'.
                 '<a href="javascript:openstdbrowser('.$callargs.');">'.
                 &mt('Select User').'</a></span>';
    }     }
    if ($env{'request.role'}=~/^(au|dc|su)/) {     if ($env{'request.role'}=~/^(au|dc|su)/) {
        return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele.         $callargs .= ",1"; 
         '","'.$udomele.'",1);'."'>".&mt('Select User')."</a>";         return '<span class="LC_nobreak">'.
                 '<a href="javascript:openstdbrowser('.$callargs.');">'.
                 &mt('Select User').'</a></span>';
    }     }
    return '';     return '';
 }  }
Line 453  sub selectstudent_link { Line 463  sub selectstudent_link {
 sub authorbrowser_javascript {  sub authorbrowser_javascript {
     return <<"ENDAUTHORBRW";      return <<"ENDAUTHORBRW";
 <script type="text/javascript" language="JavaScript">  <script type="text/javascript" language="JavaScript">
   // <![CDATA[
 var stdeditbrowser;  var stdeditbrowser;
   
 function openauthorbrowser(formname,udom) {  function openauthorbrowser(formname,udom) {
Line 465  function openauthorbrowser(formname,udom Line 476  function openauthorbrowser(formname,udom
     stdeditbrowser.focus();      stdeditbrowser.focus();
 }  }
   
   // ]]>
 </script>  </script>
 ENDAUTHORBRW  ENDAUTHORBRW
 }  }
   
 sub coursebrowser_javascript {  sub coursebrowser_javascript {
     my ($domainfilter,$sec_element,$formname)=@_;      my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;
     my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role');      my $wintitle = 'Course_Browser';
    my $output = '      if ($crstype eq 'Community') {
           $wintitle = 'Community_Browser';
       }
       my $id_functions = &javascript_index_functions();
       my $output = '
 <script type="text/javascript" language="JavaScript">  <script type="text/javascript" language="JavaScript">
   // <![CDATA[
     var stdeditbrowser;'."\n";      var stdeditbrowser;'."\n";
    $output .= <<"ENDSTDBRW";  
     function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {      $output .= <<"ENDSTDBRW";
       function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,type,type_elem) {
         var url = '/adm/pickcourse?';          var url = '/adm/pickcourse?';
         var domainfilter = '';  
         var formid = getFormIdByName(formname);          var formid = getFormIdByName(formname);
         if (formid > -1) {          var domainfilter = getDomainFromSelectbox(formname,udom);
             var domid = getIndexByName(formid,udom);  
             if (domid > -1) {  
                 if (document.forms[formid].elements[domid].type == 'select-one') {  
                     domainfilter=document.forms[formid].elements[domid].options[document.forms[formid].elements[domid].selectedIndex].value;  
                 }  
                 if (document.forms[formid].elements[domid].type == 'hidden') {  
                     domainfilter=document.forms[formid].elements[domid].value;  
                 }  
             }  
         }  
         if (domainfilter != null) {          if (domainfilter != null) {
            if (domainfilter != '') {             if (domainfilter != '') {
                url += 'domainfilter='+domainfilter+'&';                 url += 'domainfilter='+domainfilter+'&';
Line 509  sub coursebrowser_javascript { Line 516  sub coursebrowser_javascript {
             else {              else {
                 if (formname == 'portform') {                  if (formname == 'portform') {
                     url += '&setroles='+extra_element;                      url += '&setroles='+extra_element;
                   } else {
                       if (formname == 'rules') {
                           url += '&fixeddom='+extra_element; 
                       }
                 }                  }
             }                   }     
         }          }
         if (multflag !=null && multflag != '') {          if (type != null && type != '') {
             url += '&multiple='+multflag;              url += '&type='+type;
         }          }
         if (crstype == 'Course/Group') {          if (type_elem != null && type_elem != '') {
             if (formname == 'cu') {              url += '&typeelement='+type_elem;
                 crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value;   
                 if (crstype == "") {  
                     alert("$crs_or_grp_alert");  
                     return;  
                 }  
             }  
         }          }
         if (crstype !=null && crstype != '') {          if (formname == 'ccrs') {
             url += '&type='+crstype;              var ownername = document.forms[formid].ccuname.value;
               var ownerdom =  document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value;
               url += '&cloner='+ownername+':'+ownerdom;
           }
           if (multflag !=null && multflag != '') {
               url += '&multiple='+multflag;
         }          }
         var title = 'Course_Browser';          var title = '$wintitle';
         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');
         stdeditbrowser.focus();          stdeditbrowser.focus();
     }      }
   $id_functions
   ENDSTDBRW
       if (($sec_element ne '') || ($role_element ne '')) {
           $output .= &setsec_javascript($sec_element,$formname,$role_element);
       }
       $output .= '
   // ]]>
   </script>';
       return $output;
   }
   
     function getFormIdByName(formname) {  sub javascript_index_functions {
         for (var i=0;i<document.forms.length;i++) {      return <<"ENDJS";
             if (document.forms[i].name == formname) {  
                 return i;  function getFormIdByName(formname) {
             }      for (var i=0;i<document.forms.length;i++) {
           if (document.forms[i].name == formname) {
               return i;
           }
       }
       return -1;
   }
   
   function getIndexByName(formid,item) {
       for (var i=0;i<document.forms[formid].elements.length;i++) {
           if (document.forms[formid].elements[i].name == item) {
               return i;
         }          }
         return -1;   
     }      }
       return -1;
   }
   
     function getIndexByName(formid,item) {  function getDomainFromSelectbox(formname,udom) {
         for (var i=0;i<document.forms[formid].elements.length;i++) {      var userdom;
             if (document.forms[formid].elements[i].name == item) {      var formid = getFormIdByName(formname);
                 return i;      if (formid > -1) {
           var domid = getIndexByName(formid,udom);
           if (domid > -1) {
               if (document.forms[formid].elements[domid].type == 'select-one') {
                   userdom=document.forms[formid].elements[domid].options[document.forms[formid].elements[domid].selectedIndex].value;
               }
               if (document.forms[formid].elements[domid].type == 'hidden') {
                   userdom=document.forms[formid].elements[domid].value;
             }              }
         }          }
         return -1;  
     }      }
 ENDSTDBRW      return userdom;
     if ($sec_element ne '') {  }
         $output .= &setsec_javascript($sec_element,$formname);  
   ENDJS
   
   }
   
   sub userbrowser_javascript {
       my $id_functions = &javascript_index_functions();
       return <<"ENDUSERBRW";
   
   function openuserbrowser(formname,uname,udom,ulast,ufirst,uemail,hideudom,crsdom,caller) {
       var url = '/adm/pickuser?';
       var userdom = getDomainFromSelectbox(formname,udom);
       if (userdom != null) {
          if (userdom != '') {
              url += 'srchdom='+userdom+'&';
          }
     }      }
     $output .= '      url += 'form=' + formname + '&unameelement='+uname+
 </script>';                                  '&udomelement='+udom+
     return $output;                                  '&ulastelement='+ulast+
                                   '&ufirstelement='+ufirst+
                                   '&uemailelement='+uemail+
                                   '&hideudomelement='+hideudom+
                                   '&coursedom='+crsdom;
       if ((caller != null) && (caller != undefined)) {
           url += '&caller='+caller;
       }
       var title = 'User_Browser';
       var options = 'scrollbars=1,resizable=1,menubar=0';
       options += ',width=700,height=600';
       var stdeditbrowser = open(url,title,options,'1');
       stdeditbrowser.focus();
   }
   
   function fix_domain (formname,udom,origdom,uname) {
       var formid = getFormIdByName(formname);
       if (formid > -1) {
           var unameid = getIndexByName(formid,uname);
           var domid = getIndexByName(formid,udom);
           var hidedomid = getIndexByName(formid,origdom);
           if (hidedomid > -1) {
               var fixeddom = document.forms[formid].elements[hidedomid].value;
               var unameval = document.forms[formid].elements[unameid].value;
               if ((fixeddom != '') && (fixeddom != undefined) && (fixeddom != null) && (unameval != '') && (unameval != undefined) && (unameval != null)) {
                   if (domid > -1) {
                       var slct = document.forms[formid].elements[domid];
                       if (slct.type == 'select-one') {
                           var i;
                           for (i=0;i<slct.length;i++) {
                               if (slct.options[i].value==fixeddom) { slct.selectedIndex=i; }
                           }
                       }
                       if (slct.type == 'hidden') {
                           slct.value = fixeddom;
                       }
                   }
               }
           }
       }
       return;
   }
   
   $id_functions
   ENDUSERBRW
 }  }
   
 sub setsec_javascript {  sub setsec_javascript {
     my ($sec_element,$formname) = @_;      my ($sec_element,$formname,$role_element) = @_;
       my (@courserolenames,@communityrolenames,$rolestr,$courserolestr,
           $communityrolestr);
       if ($role_element ne '') {
           my @allroles = ('st','ta','ep','in','ad');
           foreach my $crstype ('Course','Community') {
               if ($crstype eq 'Community') {
                   foreach my $role (@allroles) {
                       push(@communityrolenames,&Apache::lonnet::plaintext($role,$crstype));
                   }
                   push(@communityrolenames,&Apache::lonnet::plaintext('co'));
               } else {
                   foreach my $role (@allroles) {
                       push(@courserolenames,&Apache::lonnet::plaintext($role,$crstype));
                   }
                   push(@courserolenames,&Apache::lonnet::plaintext('cc'));
               }
           }
           $rolestr = '"'.join('","',@allroles).'"';
           $courserolestr = '"'.join('","',@courserolenames).'"';
           $communityrolestr = '"'.join('","',@communityrolenames).'"';
       }
     my $setsections = qq|      my $setsections = qq|
 function setSect(sectionlist) {  function setSect(sectionlist) {
     var sectionsArray = new Array();      var sectionsArray = new Array();
Line 595  function setSect(sectionlist) { Line 713  function setSect(sectionlist) {
         }          }
     }      }
 }  }
   
   function setRole(crstype) {
   |;
       if ($role_element eq '') {
           $setsections .= '    return;
   }
   ';
       } else {
           $setsections .= qq|
       var elementLength = document.$formname.$role_element.length;
       var allroles = Array($rolestr);
       var courserolenames = Array($courserolestr);
       var communityrolenames = Array($communityrolestr);
       if (elementLength != undefined) {
           if (document.$formname.$role_element.options[5].value == 'cc') {
               if (crstype == 'Course') {
                   return;
               } else {
                   allroles[5] = 'co';
                   for (var i=0; i<6; i++) {
                       document.$formname.$role_element.options[i].value = allroles[i];
                       document.$formname.$role_element.options[i].text = communityrolenames[i];
                   }
               }
           } else {
               if (crstype == 'Community') {
                   return;
               } else {
                   allroles[5] = 'cc';
                   for (var i=0; i<6; i++) {
                       document.$formname.$role_element.options[i].value = allroles[i];
                       document.$formname.$role_element.options[i].text = courserolenames[i];
                   }
               }
           }
       }
       return;
   }
 |;  |;
       }
     return $setsections;      return $setsections;
 }  }
   
   
 sub selectcourse_link {  sub selectcourse_link {
    my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype)=@_;     my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype,
    return "<a href='".'javascript:opencrsbrowser("'.$form.'","'.$unameele.         $typeelement) = @_;
         '","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'","'.$selecttype.'");'."'>".&mt('Select Course')."</a>";     my $type = $selecttype;
      my $linktext = &mt('Select Course');
      if ($selecttype eq 'Community') {
          $linktext = &mt('Select Community');
      } elsif ($selecttype eq 'Course/Community') {
          $linktext = &mt('Select Course/Community');
          $type = '';
      }
      return '<span class="LC_nobreak">'
            ."<a href='"
            .'javascript:opencrsbrowser("'.$form.'","'.$unameele
            .'","'.$udomele.'","'.$desc.'","'.$extra_element
            .'","'.$multflag.'","'.$type.'","'.$typeelement.'");'
            ."'>".$linktext.'</a>'
            .'</span>';
 }  }
   
 sub selectauthor_link {  sub selectauthor_link {
Line 612  sub selectauthor_link { Line 782  sub selectauthor_link {
           &mt('Select Author').'</a>';            &mt('Select Author').'</a>';
 }  }
   
   sub selectuser_link {
       my ($form,$unameelem,$domelem,$lastelem,$firstelem,$emailelem,$hdomelem,
           $coursedom,$linktext,$caller) = @_;
       return '<a href="javascript:openuserbrowser('."'$form','$unameelem','$domelem',".
              "'$lastelem','$firstelem','$emailelem','$hdomelem','$coursedom','$caller'".
              ');">'.$linktext.'</a>';
   }
   
 sub check_uncheck_jscript {  sub check_uncheck_jscript {
     my $jscript = <<"ENDSCRT";      my $jscript = <<"ENDSCRT";
 function checkAll(field) {  function checkAll(field) {
Line 710  sub select_datelocale { Line 888  sub select_datelocale {
     return $output;      return $output;
 }  }
   
   sub select_language {
       my ($name,$selected,$includeempty) = @_;
       my %langchoices;
       if ($includeempty) {
           %langchoices = ('' => 'No language preference');
       }
       foreach my $id (&languageids()) {
           my $code = &supportedlanguagecode($id);
           if ($code) {
               $langchoices{$code} = &plainlanguagedescription($id);
           }
       }
       return &select_form($selected,$name,%langchoices);
   }
   
 =pod  =pod
   
 =item * &linked_select_forms(...)  =item * &linked_select_forms(...)
Line 797  sub linked_select_forms { Line 990  sub linked_select_forms {
     # output the javascript to do the changing      # output the javascript to do the changing
     my $result = '';      my $result = '';
     $result.='<script type="text/javascript" language="JavaScript">'."\n";      $result.='<script type="text/javascript" language="JavaScript">'."\n";
       $result.="// <![CDATA[\n";
     $result.="var select2data = new Object();\n";      $result.="var select2data = new Object();\n";
     $" = '","';      $" = '","';
     my $debug = '';      my $debug = '';
Line 842  function select1_changed() { Line 1036  function select1_changed() {
         }          }
     }      }
 }  }
   // ]]>
 </script>  </script>
 END  END
     # output the initial values for the selection lists      # output the initial values for the selection lists
Line 903  sub help_open_topic { Line 1098  sub help_open_topic {
     my ($topic, $text, $stayOnPage, $width, $height) = @_;      my ($topic, $text, $stayOnPage, $width, $height) = @_;
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);      $stayOnPage = 0 if (not defined $stayOnPage);
     if ($env{'browser.interface'} eq 'textual') {  
  $stayOnPage=1;  
     }  
     $width = 350 if (not defined $width);      $width = 350 if (not defined $width);
     $height = 400 if (not defined $height);      $height = 400 if (not defined $height);
     my $filename = $topic;      my $filename = $topic;
Line 935  sub help_open_topic { Line 1127  sub help_open_topic {
     $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'      $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'                .'<img src="'.$helpicon.'" border="0"'
               .' alt="'.&mt('Help: [_1]',$topic).'"'                .' alt="'.&mt('Help: [_1]',$topic).'"'
               .' title="'.$title.'"'                .' title="'.$title.'" style="vertical-align:middle;"' 
               .' /></a>';                .' /></a>';
     if ($text ne "") {      if ($text ne "") {
         $template.='</span>';          $template.='</span>';
Line 978  sub general_help { Line 1170  sub general_help {
     my $helptopic='Student_Intro';      my $helptopic='Student_Intro';
     if ($env{'request.role'}=~/^(ca|au)/) {      if ($env{'request.role'}=~/^(ca|au)/) {
  $helptopic='Authoring_Intro';   $helptopic='Authoring_Intro';
     } elsif ($env{'request.role'}=~/^cc/) {      } elsif ($env{'request.role'}=~/^(cc|co)/) {
  $helptopic='Course_Coordination_Intro';   $helptopic='Course_Coordination_Intro';
     } elsif ($env{'request.role'}=~/^dc/) {      } elsif ($env{'request.role'}=~/^dc/) {
         $helptopic='Domain_Coordination_Intro';          $helptopic='Domain_Coordination_Intro';
Line 998  sub update_help_link { Line 1190  sub update_help_link {
     my $banner_link = "/adm/helpmenu?page=banner&amp;topic=$topic&amp;component_help=$component_help&amp;faq=$faq&amp;bug=$bug&amp;origurl=$origurl&amp;stamp=$timestamp&amp;stayonpage=$stayOnPage";      my $banner_link = "/adm/helpmenu?page=banner&amp;topic=$topic&amp;component_help=$component_help&amp;faq=$faq&amp;bug=$bug&amp;origurl=$origurl&amp;stamp=$timestamp&amp;stayonpage=$stayOnPage";
     my $output .= <<"ENDOUTPUT";      my $output .= <<"ENDOUTPUT";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 banner_link = '$banner_link';  banner_link = '$banner_link';
   // ]]>
 </script>  </script>
 ENDOUTPUT  ENDOUTPUT
     return $output;      return $output;
Line 1008  ENDOUTPUT Line 1202  ENDOUTPUT
 sub help_open_menu {  sub help_open_menu {
     my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text)       my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) 
  = @_;       = @_;    
     $stayOnPage = 0 if (not defined $stayOnPage);      $stayOnPage = 1;
     # only use pop-up help (stayOnPage == 0)  
     # if environment.remote is on (using remote control UI)  
     if ($env{'browser.interface'} eq 'textual' ||  
     $env{'environment.remote'} eq 'off' ) {  
         $stayOnPage=1;  
     }  
     my $output;      my $output;
     if ($component_help) {      if ($component_help) {
  if (!$text) {   if (!$text) {
Line 1035  sub help_open_menu { Line 1223  sub help_open_menu {
 sub top_nav_help {  sub top_nav_help {
     my ($text) = @_;      my ($text) = @_;
     $text = &mt($text);      $text = &mt($text);
     my $stay_on_page =       my $stay_on_page = 1;
  ($env{'browser.interface'}  eq 'textual' ||  
  $env{'environment.remote'} eq 'off' );  
     my $link = ($stay_on_page) ? "javascript:helpMenu('display')"      my $link = ($stay_on_page) ? "javascript:helpMenu('display')"
                      : "javascript:helpMenu('open')";                       : "javascript:helpMenu('open')";
     my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page);      my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page);
Line 1052  END Line 1239  END
   
 sub help_menu_js {  sub help_menu_js {
     my ($text) = @_;      my ($text) = @_;
       my $stayOnPage = 1;
     my $stayOnPage =   
  ($env{'browser.interface'}  eq 'textual' ||  
  $env{'environment.remote'} eq 'off' );  
   
     my $width = 620;      my $width = 620;
     my $height = 600;      my $height = 600;
     my $helptopic=&general_help();      my $helptopic=&general_help();
Line 1075  sub help_menu_js { Line 1258  sub help_menu_js {
   
     my $template .= <<"ENDTEMPLATE";      my $template .= <<"ENDTEMPLATE";
 <script type="text/javascript">  <script type="text/javascript">
 // <!-- BEGIN LON-CAPA Internal  
 // <![CDATA[  // <![CDATA[
   // <!-- BEGIN LON-CAPA Internal
 var banner_link = '';  var banner_link = '';
 function helpMenu(target) {  function helpMenu(target) {
     var caller = this;      var caller = this;
Line 1101  function writeHelp(caller) { Line 1284  function writeHelp(caller) {
     caller.document.close()      caller.document.close()
     caller.focus()      caller.focus()
 }  }
 // ]]>  
 // END LON-CAPA Internal -->  // END LON-CAPA Internal -->
   // ]]>
 </script>  </script>
 ENDTEMPLATE  ENDTEMPLATE
     return $template;      return $template;
Line 1113  sub help_open_bug { Line 1296  sub help_open_bug {
     unless ($env{'user.adv'}) { return ''; }      unless ($env{'user.adv'}) { return ''; }
     unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; }      unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; }
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);  
     if ($env{'browser.interface'} eq 'textual' ||  
  $env{'environment.remote'} eq 'off' ) {  
  $stayOnPage=1;   $stayOnPage=1;
     }  
     $width = 600 if (not defined $width);      $width = 600 if (not defined $width);
     $height = 600 if (not defined $height);      $height = 600 if (not defined $height);
   
Line 1158  sub help_open_faq { Line 1337  sub help_open_faq {
     unless ($env{'user.adv'}) { return ''; }      unless ($env{'user.adv'}) { return ''; }
     unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; }      unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; }
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);  
     if ($env{'browser.interface'} eq 'textual' ||  
  $env{'environment.remote'} eq 'off' ) {  
  $stayOnPage=1;   $stayOnPage=1;
     }  
     $width = 350 if (not defined $width);      $width = 350 if (not defined $width);
     $height = 400 if (not defined $height);      $height = 400 if (not defined $height);
   
Line 1370  sub resize_textarea_js { Line 1545  sub resize_textarea_js {
     my $geometry = &viewport_geometry_js();      my $geometry = &viewport_geometry_js();
     return <<"RESIZE";      return <<"RESIZE";
     <script type="text/javascript">      <script type="text/javascript">
   // <![CDATA[
 $geometry  $geometry
   
 function getX(element) {  function getX(element) {
Line 1408  function resize_textarea(textarea_id,bot Line 1584  function resize_textarea(textarea_id,bot
     }      }
     textarea.style.height=new_height+'px';      textarea.style.height=new_height+'px';
 }  }
   // ]]>
 </script>  </script>
 RESIZE  RESIZE
   
Line 1528  sub create_workbook { Line 1705  sub create_workbook {
     my $workbook  = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);      my $workbook  = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
     if (! defined($workbook)) {      if (! defined($workbook)) {
         $r->log_error("Error creating excel spreadsheet $filename: $!");          $r->log_error("Error creating excel spreadsheet $filename: $!");
         $r->print('<p>'.&mt("Unable to create new Excel file.  ".          $r->print(
                             "This error has been logged.  ".              '<p class="LC_error">'
                             "Please alert your LON-CAPA administrator").             .&mt('Problems occurred in creating the new Excel file.')
                   '</p>');             .' '.&mt('This error has been logged.')
              .' '.&mt('Please alert your LON-CAPA administrator.')
              .'</p>'
           );
         return (undef);          return (undef);
     }      }
     #      #
Line 1571  sub create_text_file { Line 1751  sub create_text_file {
     $fh = Apache::File->new('>/home/httpd'.$filename);      $fh = Apache::File->new('>/home/httpd'.$filename);
     if (! defined($fh)) {      if (! defined($fh)) {
         $r->log_error("Couldn't open $filename for output $!");          $r->log_error("Couldn't open $filename for output $!");
         $r->print(&mt('Problems occurred in creating the output file. '          $r->print(
                      .'This error has been logged. '              '<p class="LC_error">'
                      .'Please alert your LON-CAPA administrator.'));             .&mt('Problems occurred in creating the output file.')
              .' '.&mt('This error has been logged.')
              .' '.&mt('Please alert your LON-CAPA administrator.')
              .'</p>'
           );
     }      }
     return ($fh,$filename)      return ($fh,$filename)
 }  }
Line 1686  sub select_form { Line 1870  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 1751  sub select_level_form { Line 1935  sub select_level_form {
   
 =pod  =pod
   
 =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$autosubmit)  =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 1762  selected"); Line 1946  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.
   
 If the $autosubmit flag is set, the form containing the domain selector will be auto-submitted by an onchange action.    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,$autosubmit) = @_;      my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) = @_;
     my $onchange;      if ($onchange) {
     if ($autosubmit) {          $onchange = ' onchange="'.$onchange.'"';
         $onchange = ' onchange="this.form.submit()"';      }
       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());
     }      }
     my @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 1831  sub home_server_form_item { Line 2021  sub home_server_form_item {
     if ($numlib > 1) {      if ($numlib > 1) {
         $result .= '<select name="'.$name.'" />'."\n";          $result .= '<select name="'.$name.'" />'."\n";
         if ($default) {          if ($default) {
             $result .= '<option value="default" selected>'.&mt('default').              $result .= '<option value="default" selected="selected">'.&mt('default').
                        '</option>'."\n";                         '</option>'."\n";
         }          }
         foreach my $hostid (sort(keys(%servers))) {          foreach my $hostid (sort(keys(%servers))) {
Line 2165  sub authform_kerberos { Line 2355  sub authform_kerberos {
         }          }
     } else {      } else {
         if ($authnum == 1) {          if ($authnum == 1) {
             $authtype = '<input type="hidden" name="login" value="krb">';              $authtype = '<input type="hidden" name="login" value="krb" />';
         }          }
     }      }
     if (!$can_assign{'krb4'} && !$can_assign{'krb5'}) {      if (!$can_assign{'krb4'} && !$can_assign{'krb5'}) {
Line 2174  sub authform_kerberos { Line 2364  sub authform_kerberos {
         if (defined($in{'mode'})) {          if (defined($in{'mode'})) {
             if ($in{'mode'} eq 'modifycourse') {              if ($in{'mode'} eq 'modifycourse') {
                 if ($authnum == 1) {                  if ($authnum == 1) {
                     $authtype = '<input type="hidden" name="login" value="krb">';                      $authtype = '<input type="hidden" name="login" value="krb" />';
                 }                  }
             }              }
         }          }
Line 2251  sub authform_internal{ Line 2441  sub authform_internal{
         }          }
     } else {      } else {
         if ($authnum == 1) {          if ($authnum == 1) {
             $authtype = '<input type="hidden" name="login" value="int">';              $authtype = '<input type="hidden" name="login" value="int" />';
         }          }
     }      }
     if (!$can_assign{'int'}) {      if (!$can_assign{'int'}) {
Line 2260  sub authform_internal{ Line 2450  sub authform_internal{
         if (defined($in{'mode'})) {          if (defined($in{'mode'})) {
             if ($in{'mode'} eq 'modifycourse') {              if ($in{'mode'} eq 'modifycourse') {
                 if ($authnum == 1) {                  if ($authnum == 1) {
                     $authtype = '<input type="hidden" name="login" value="int">';                      $authtype = '<input type="hidden" name="login" value="int" />';
                 }                  }
             }              }
         }          }
Line 2275  sub authform_internal{ Line 2465  sub authform_internal{
     $result = &mt      $result = &mt
         ('[_1] Internally authenticated (with initial password [_2])',          ('[_1] Internally authenticated (with initial password [_2])',
          '<label>'.$authtype,'</label>'.$autharg);           '<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 2306  sub authform_local{ Line 2496  sub authform_local{
         }          }
     } else {      } else {
         if ($authnum == 1) {          if ($authnum == 1) {
             $authtype = '<input type="hidden" name="login" value="loc">';              $authtype = '<input type="hidden" name="login" value="loc" />';
         }          }
     }      }
     if (!$can_assign{'loc'}) {      if (!$can_assign{'loc'}) {
Line 2315  sub authform_local{ Line 2505  sub authform_local{
         if (defined($in{'mode'})) {          if (defined($in{'mode'})) {
             if ($in{'mode'} eq 'modifycourse') {              if ($in{'mode'} eq 'modifycourse') {
                 if ($authnum == 1) {                  if ($authnum == 1) {
                     $authtype = '<input type="hidden" name="login" value="loc">';                      $authtype = '<input type="hidden" name="login" value="loc" />';
                 }                  }
             }              }
         }          }
Line 2357  sub authform_filesystem{ Line 2547  sub authform_filesystem{
         }          }
     } else {      } else {
         if ($authnum == 1) {          if ($authnum == 1) {
             $authtype = '<input type="hidden" name="login" value="fsys">';              $authtype = '<input type="hidden" name="login" value="fsys" />';
         }          }
     }      }
     if (!$can_assign{'fsys'}) {      if (!$can_assign{'fsys'}) {
Line 2366  sub authform_filesystem{ Line 2556  sub authform_filesystem{
         if (defined($in{'mode'})) {          if (defined($in{'mode'})) {
             if ($in{'mode'} eq 'modifycourse') {              if ($in{'mode'} eq 'modifycourse') {
                 if ($authnum == 1) {                  if ($authnum == 1) {
                     $authtype = '<input type="hidden" name="login" value="fsys">';                      $authtype = '<input type="hidden" name="login" value="fsys" />';
                 }                  }
             }              }
         }          }
Line 2790  sub screenname { Line 2980  sub screenname {
 }  }
   
   
   # ------------------------------------------------------------- Confirm Wrapper
   =pod
   
   =item confirmwrapper
   
   Wrap messages about completion of operation in box
   
   =cut
   
   sub confirmwrapper {
       my ($message)=@_;
       if ($message) {
           return "\n".'<div class="LC_confirm_box">'."\n"
                  .$message."\n"
                  .'</div>'."\n";
       } else {
           return $message;
       }
   }
   
 # ------------------------------------------------------------- Message Wrapper  # ------------------------------------------------------------- Message Wrapper
   
 sub messagewrapper {  sub messagewrapper {
Line 2800  sub messagewrapper { Line 3010  sub messagewrapper {
  '&amp;subject='.&escape($subject).'&amp;text='.&escape($text).'" '.   '&amp;subject='.&escape($subject).'&amp;text='.&escape($text).'" '.
         'title="'.&mt('Send message').'">'.$link.'</a>';          'title="'.&mt('Send message').'">'.$link.'</a>';
 }  }
   
 # --------------------------------------------------------------- Notes Wrapper  # --------------------------------------------------------------- Notes Wrapper
   
 sub noteswrapper {  sub noteswrapper {
     my ($link,$un,$do)=@_;      my ($link,$un,$do)=@_;
     return       return 
 "<a href='/adm/email?recordftf=retrieve&recname=$un&recdom=$do'>$link</a>";  "<a href='/adm/email?recordftf=retrieve&amp;recname=$un&amp;recdom=$do'>$link</a>";
 }  }
   
 # ------------------------------------------------------------- Aboutme Wrapper  # ------------------------------------------------------------- Aboutme Wrapper
   
 sub aboutmewrapper {  sub aboutmewrapper {
Line 2814  sub aboutmewrapper { Line 3026  sub aboutmewrapper {
     if (!defined($username)  && !defined($domain)) {      if (!defined($username)  && !defined($domain)) {
         return;          return;
     }      }
     return '<a href="/adm/'.$domain.'/'.$username.'/aboutme"'.      return '<a href="/adm/'.$domain.'/'.$username.'/aboutme?forcestudent=1"'.
  ($target?' target="$target"':'').' title="'.&mt("View this user's personal information page").'">'.$link.'</a>';   ($target?' target="$target"':'').' title="'.&mt("View this user's personal information page").'">'.$link.'</a>';
 }  }
   
 # ------------------------------------------------------------ Syllabus Wrapper  # ------------------------------------------------------------ Syllabus Wrapper
   
   
 sub syllabuswrapper {  sub syllabuswrapper {
     my ($linktext,$coursedir,$domain)=@_;      my ($linktext,$coursedir,$domain)=@_;
     return qq{<a href="/public/$domain/$coursedir/syllabus">$linktext</a>};      return qq{<a href="/public/$domain/$coursedir/syllabus">$linktext</a>};
 }  }
   
   # -----------------------------------------------------------------------------
   
 sub track_student_link {  sub track_student_link {
     my ($linktext,$sname,$sdom,$target,$start) = @_;      my ($linktext,$sname,$sdom,$target,$start,$only_body) = @_;
     my $link ="/adm/trackstudent?";      my $link ="/adm/trackstudent?";
     my $title = 'View recent activity';      my $title = 'View recent activity';
     if (defined($sname) && $sname !~ /^\s*$/ &&      if (defined($sname) && $sname !~ /^\s*$/ &&
Line 2841  sub track_student_link { Line 3054  sub track_student_link {
         $target = '';          $target = '';
     }      }
     if ($start) { $link.='&amp;start='.$start; }      if ($start) { $link.='&amp;start='.$start; }
       if ($only_body) { $link .= '&amp;only_body=1'; }
     $title = &mt($title);      $title = &mt($title);
     $linktext = &mt($linktext);      $linktext = &mt($linktext);
     return qq{<a href="$link" title="$title" $target>$linktext</a>}.      return qq{<a href="$link" title="$title" $target>$linktext</a>}.
  &help_open_topic('View_recent_activity');   &help_open_topic('View_recent_activity');
 }  }
   
   sub slot_reservations_link {
       my ($linktext,$sname,$sdom,$target) = @_;
       my $link ="/adm/slotrequest?command=showresv&amp;origin=aboutme";
       my $title = 'View slot reservation history';
       if (defined($sname) && $sname !~ /^\s*$/ &&
           defined($sdom)  && $sdom  !~ /^\s*$/) {
           $link .= "&amp;uname=$sname&amp;udom=$sdom";
           $title .= ' of this student';
       }
       if (defined($target) && $target !~ /^\s*$/) {
           $target = qq{target="$target"};
       } else {
           $target = '';
       }
       $title = &mt($title);
       $linktext = &mt($linktext);
       return qq{<a href="$link" title="$title" $target>$linktext</a>};
   # FIXME uncomment when help item created: &help_open_topic('Slot_Reservation_History');
   
   }
   
 # ===================================================== Display a student photo  # ===================================================== Display a student photo
   
   
Line 3163  sub get_previous_attempt { Line 3398  sub get_previous_attempt {
       }        }
       $prevattempts=&start_data_table().&start_data_table_header_row();        $prevattempts=&start_data_table().&start_data_table_header_row();
       $prevattempts.='<th>'.&mt('History').'</th>';        $prevattempts.='<th>'.&mt('History').'</th>';
         my %typeparts;
         my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'});
       foreach my $key (sort(keys(%lasthash))) {        foreach my $key (sort(keys(%lasthash))) {
  my ($ign,@parts) = split(/\./,$key);   my ($ign,@parts) = split(/\./,$key);
  if ($#parts > 0) {   if ($#parts > 0) {
   my $data=$parts[-1];    my $data=$parts[-1];
   pop(@parts);    pop(@parts);
   $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.'&nbsp;</th>';            if ($data eq 'type') {
                 unless ($showsurv) {
                     my $id = join(',',@parts);
                     $typeparts{$ign.'.'.$id} = $lasthash{$key};
                 }
                 delete($lasthash{$key});
             } else {
         $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.'&nbsp;</th>';
             }
  } else {   } else {
   if ($#parts == 0) {    if ($#parts == 0) {
     $prevattempts.='<th>'.$parts[0].'</th>';      $prevattempts.='<th>'.$parts[0].'</th>';
Line 3178  sub get_previous_attempt { Line 3423  sub get_previous_attempt {
  }   }
       }        }
       $prevattempts.=&end_data_table_header_row();        $prevattempts.=&end_data_table_header_row();
         my %lasthidden;
       if ($getattempt eq '') {        if ($getattempt eq '') {
  for ($version=1;$version<=$returnhash{'version'};$version++) {   for ($version=1;$version<=$returnhash{'version'};$version++) {
   $prevattempts.=&start_data_table_row().              my @hidden;
       '<td>'.&mt('Transaction [_1]',$version).'</td>';              if (%typeparts) {
     foreach my $key (sort(keys(%lasthash))) {                  foreach my $id (keys(%typeparts)) {
  my $value = &format_previous_attempt_value($key,                      if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) {
    $returnhash{$version.':'.$key});                          push(@hidden,$id);
  $prevattempts.='<td>'.$value.'&nbsp;</td>';                             $lasthidden{$id} = 1;
     }                      } elsif ($lasthidden{$id}) {
   $prevattempts.=&end_data_table_row();                          if (exists($returnhash{$version.':'.$id.'.award'})) {
                               delete($lasthidden{$id});
                           }
                       }
                   }
               }
               $prevattempts.=&start_data_table_row().
                              '<td>'.&mt('Transaction [_1]',$version).'</td>';
               if (@hidden) {
                   foreach my $key (sort(keys(%lasthash))) {
                       my $hide;
                       foreach my $id (@hidden) {
                           if ($key =~ /^\Q$id\E/) {
                               $hide = 1;
                               last;
                           }
                       }
                       if ($hide) {
                           my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/);
                           if (($data eq 'award') || ($data eq 'awarddetail')) {
                               my $value = &format_previous_attempt_value($key,
                                                $returnhash{$version.':'.$key});
                               $prevattempts.='<td>'.$value.'&nbsp;</td>';
                           } else {
                               $prevattempts.='<td>&nbsp;</td>';
                           }
                       } else {
                           if ($key =~ /\./) {
                               my $value = &format_previous_attempt_value($key,
                                                 $returnhash{$version.':'.$key});
                               $prevattempts.='<td>'.$value.'&nbsp;</td>';
                           } else {
                               $prevattempts.='<td>&nbsp;</td>';
                           }
                       }
                   }
               } else {
           foreach my $key (sort(keys(%lasthash))) {
       my $value = &format_previous_attempt_value($key,
               $returnhash{$version.':'.$key});
       $prevattempts.='<td>'.$value.'&nbsp;</td>';
           }
               }
       $prevattempts.=&end_data_table_row();
  }   }
       }        }
         my @currhidden = keys(%lasthidden);
       $prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>';        $prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>';
       foreach my $key (sort(keys(%lasthash))) {        foreach my $key (sort(keys(%lasthash))) {
  my $value = &format_previous_attempt_value($key,$lasthash{$key});            if (%typeparts) {
  if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}                my $hidden;
  $prevattempts.='<td>'.$value.'&nbsp;</td>';                foreach my $id (@currhidden) {
                     if ($key =~ /^\Q$id\E/) {
                         $hidden = 1;
                         last;
                     }
                 }
                 if ($hidden) {
                     my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/);
                     if (($data eq 'award') || ($data eq 'awarddetail')) {
                         my $value = &format_previous_attempt_value($key,$lasthash{$key});
                         if ($key =~/$regexp$/ && (defined &$gradesub)) {
                             $value = &$gradesub($value);
                         }
                         $prevattempts.='<td>'.$value.'&nbsp;</td>';
                     } else {
                         $prevattempts.='<td>&nbsp;</td>';
                     }
                 } else {
                     my $value = &format_previous_attempt_value($key,$lasthash{$key});
                     if ($key =~/$regexp$/ && (defined &$gradesub)) {
                         $value = &$gradesub($value);
                     }
                     $prevattempts.='<td>'.$value.'&nbsp;</td>';
                 }
             } else {
         my $value = &format_previous_attempt_value($key,$lasthash{$key});
         if ($key =~/$regexp$/ && (defined &$gradesub)) {
                     $value = &$gradesub($value);
                 }
         $prevattempts.='<td>'.$value.'&nbsp;</td>';
             }
       }        }
       $prevattempts.= &end_data_table_row().&end_data_table();        $prevattempts.= &end_data_table_row().&end_data_table();
     } else {      } else {
Line 3367  sub submlink { Line 3687  sub submlink {
     }      }
     if (!$symb) { $symb=&Apache::lonnet::symbread(); }      if (!$symb) { $symb=&Apache::lonnet::symbread(); }
     $symb=&escape($symb);      $symb=&escape($symb);
     if ($target) { $target="target=\"$target\""; }      if ($target) { $target=" target=\"$target\""; }
     return '<a href="/adm/grades?&command=submission&'.      return
  'symb='.$symb.'&student='.$uname.          '<a href="/adm/grades?command=submission'.
  '&userdom='.$udom.'" '.$target.'>'.$text.'</a>';          '&amp;symb='.$symb.
           '&amp;student='.$uname.
           '&amp;userdom='.$udom.'"'.
           $target.'>'.$text.'</a>';
 }  }
 ##############################################  ##############################################
   
Line 3496  sub findallcourses { Line 3819  sub findallcourses {
         if (!%roles) {          if (!%roles) {
             %roles = (              %roles = (
                        cc => 1,                         cc => 1,
                          co => 1,
                        in => 1,                         in => 1,
                        ep => 1,                         ep => 1,
                        ta => 1,                         ta => 1,
Line 3686  sub blockcheck { Line 4010  sub blockcheck {
                  ($env{'request.role'} !~ m{^st\./\Q$cdom\E/\Q$cnum\E}));                   ($env{'request.role'} !~ m{^st\./\Q$cdom\E/\Q$cnum\E}));
         next if ($no_userblock);          next if ($no_userblock);
   
         # Retrieve blocking times and identity of blocker for course          # Retrieve blocking times and identity of locker for course
         # of specified user, unless user has 'evb' privilege.          # of specified user, unless user has 'evb' privilege.
                   
         my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum);          my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum);
Line 3751  sub parse_block_record { Line 4075  sub parse_block_record {
     return ($setuname,$setudom,$title,$blocks);      return ($setuname,$setudom,$title,$blocks);
 }  }
   
 sub build_block_table {  
     my ($startblock,$endblock,$setters) = @_;  
     my %lt = &Apache::lonlocal::texthash(  
         'cacb' => 'Currently active communication blocks',  
         'cour' => 'Course',  
         'dura' => 'Duration',  
         'blse' => 'Block set by'  
     );  
     my $output;  
     $output = '<br />'.$lt{'cacb'}.':<br />';  
     $output .= &start_data_table();  
     $output .= '  
 <tr>  
  <th>'.$lt{'cour'}.'</th>  
  <th>'.$lt{'dura'}.'</th>  
  <th>'.$lt{'blse'}.'</th>  
 </tr>  
 ';  
     foreach my $course (keys(%{$setters})) {  
         my %courseinfo=&Apache::lonnet::coursedescription($course);  
         for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) {  
             my ($uname,$udom) = @{$$setters{$course}{staff}[$i]};  
             my $fullname = &plainname($uname,$udom);  
             if (defined($env{'user.name'}) && defined($env{'user.domain'})  
                 && $env{'user.name'} ne 'public'   
                 && $env{'user.domain'} ne 'public') {  
                 $fullname = &aboutmewrapper($fullname,$uname,$udom);  
             }  
             my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]};  
             $openblock = &Apache::lonlocal::locallocaltime($openblock);  
             $closeblock= &Apache::lonlocal::locallocaltime($closeblock);  
             $output .= &Apache::loncommon::start_data_table_row().  
                        '<td>'.$courseinfo{'description'}.'</td>'.  
                        '<td>'.$openblock.' to '.$closeblock.'</td>'.  
                        '<td>'.$fullname.'</td>'.  
                         &Apache::loncommon::end_data_table_row();  
         }  
     }  
     $output .= &end_data_table();  
 }  
   
 sub blocking_status {  sub blocking_status {
     my ($activity,$uname,$udom) = @_;    my ($activity,$uname,$udom) = @_;
     my %setters;    my %setters;
     my ($blocked,$output,$ownitem,$is_course);  
     my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom);    # check for active blocking
     if ($startblock && $endblock) {    my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom);
         $blocked = 1;  
         if (wantarray) {    my $blocked = $startblock && $endblock ? 1 : 0;
             my $category;  
             if ($activity eq 'boards') {    # caller just wants to know whether a block is active
                 $category = 'Discussion posts in this course';    if (!wantarray) { return $blocked; }
             } elsif ($activity eq 'blogs') {  
                 $category = 'Blogs';    # build a link to a popup window containing the details
             } elsif ($activity eq 'port') {    my $querystring  = "?activity=$activity";
                 if (defined($uname) && defined($udom)) {    # $uname and $udom decide whose portfolio the user is trying to look at
                     if ($uname eq $env{'user.name'} &&       $querystring .= "&amp;udom=$udom"      if $udom;
                         $udom eq $env{'user.domain'}) {       $querystring .= "&amp;uname=$uname"    if $uname;
                         $ownitem = 1;  
                     }    my $output .= <<'END_MYBLOCK';
                 }      function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                 $is_course = &Apache::lonnet::is_course($udom,$uname);          var options = "width=" + w + ",height=" + h + ",";
                 if ($ownitem) {           options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                     $category = 'Your portfolio files';            options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                 } elsif ($is_course) {          var newWin = window.open(url, wdwName, options);
                     my $coursedesc;          newWin.focus();
                     foreach my $course (keys(%setters)) {      }
                         my %courseinfo =  END_MYBLOCK
                              &Apache::lonnet::coursedescription($course);  
                         $coursedesc = $courseinfo{'description'};    $output = Apache::lonhtmlcommon::scripttag($output);
                     }    
                     $category = "Group portfolio in the course '$coursedesc'";    my $popupUrl = "/adm/blockingstatus/$querystring";
                 } else {    my $text = mt('Communication Blocked');
                     $category = 'Portfolio files belonging to ';  
                     if ($env{'user.name'} eq 'public' &&     $output .= <<"END_BLOCK";
                         $env{'user.domain'} eq 'public') {  <div class='LC_comblock'>
                         $category .= &plainname($uname,$udom);    <a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring'
                     } else {    title='$text'>
                         $category .= &aboutmewrapper(&plainname($uname,$udom),$uname,$udom);      <img class='LC_noBorder LC_middle' title='$text' src='/res/adm/pages/comblock.png' alt='$text'/></a>
                     }    <a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' 
                 }    title='$text'>$text</a>
             } elsif ($activity eq 'groups') {  </div>
                 $category = 'Groups in this course';  
             }  END_BLOCK
             my $showstart = &Apache::lonlocal::locallocaltime($startblock);  
             my $showend = &Apache::lonlocal::locallocaltime($endblock);    return ($blocked, $output);
             $output = '<br />'.&mt('[_1] will be inaccessible between [_2] and [_3] because communication is being blocked.',$category,$showstart,$showend).'<br />';  
             if (!($activity eq 'port' && !($ownitem) && !($is_course))) {   
                 $output .= &build_block_table($startblock,$endblock,\%setters);  
             }  
         }  
     }  
     if (wantarray) {  
         return ($blocked,$output);  
     } else {  
         return $blocked;  
     }  
 }  }
   
 ###############################################  ###############################################
Line 3925  sub determinedomain { Line 4197  sub determinedomain {
     my $domain=shift;      my $domain=shift;
     if (! $domain) {      if (! $domain) {
         # Determine domain if we have not been given one          # Determine domain if we have not been given one
         $domain = $Apache::lonnet::perlvar{'lonDefDomain'};          $domain = &Apache::lonnet::default_login_domain();
         if ($env{'user.domain'}) { $domain=$env{'user.domain'}; }          if ($env{'user.domain'}) { $domain=$env{'user.domain'}; }
         if ($env{'request.role.domain'}) {           if ($env{'request.role.domain'}) { 
             $domain=$env{'request.role.domain'};               $domain=$env{'request.role.domain'}; 
Line 3948  sub get_domainconf { Line 4220  sub get_domainconf {
     if (defined($cached)) { return %{$result}; }      if (defined($cached)) { return %{$result}; }
   
     my %domconfig = &Apache::lonnet::get_dom('configuration',      my %domconfig = &Apache::lonnet::get_dom('configuration',
      ['login','rolecolors'],$udom);       ['login','rolecolors','autoenroll'],$udom);
     my (%designhash,%legacy);      my (%designhash,%legacy);
     if (keys(%domconfig) > 0) {      if (keys(%domconfig) > 0) {
         if (ref($domconfig{'login'}) eq 'HASH') {          if (ref($domconfig{'login'}) eq 'HASH') {
             if (keys(%{$domconfig{'login'}})) {              if (keys(%{$domconfig{'login'}})) {
                 foreach my $key (keys(%{$domconfig{'login'}})) {                  foreach my $key (keys(%{$domconfig{'login'}})) {
                     if (ref($domconfig{'login'}{$key}) eq 'HASH') {                      if (ref($domconfig{'login'}{$key}) eq 'HASH') {
                         foreach my $img (keys(%{$domconfig{'login'}{$key}})) {                          if ($key eq 'loginvia') {
                             $designhash{$udom.'.login.'.$key.'_'.$img} =                               if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') {
                                 $domconfig{'login'}{$key}{$img};                                  my @ids = &Apache::lonnet::current_machine_ids();
                                   foreach my $hostname (@ids) {
                                       if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') {
                                           if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) {
                                               my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'};
                                               $designhash{$udom.'.login.loginvia'} = $server;
                                               if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') {
   
                                                   $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'};
                                               } else {
                                                    $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'};
                                               }
                                               if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) {
                                                   $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'};
                                               }
                                           }
                                       }
                                   }
                               }
                           } else {
                               foreach my $img (keys(%{$domconfig{'login'}{$key}})) {
                                   $designhash{$udom.'.login.'.$key.'_'.$img} = 
                                       $domconfig{'login'}{$key}{$img};
                               }
                         }                          }
                     } else {                      } else {
                         $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};                          $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};
Line 3984  sub get_domainconf { Line 4279  sub get_domainconf {
         } else {          } else {
             $legacy{'rolecolors'} = 1;              $legacy{'rolecolors'} = 1;
         }          }
           if (ref($domconfig{'autoenroll'}) eq 'HASH') {
               if ($domconfig{'autoenroll'}{'co-owners'}) {
                   $designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'};
               }
           }
         if (keys(%legacy) > 0) {          if (keys(%legacy) > 0) {
             my %legacyhash = &get_legacy_domconf($udom);              my %legacyhash = &get_legacy_domconf($udom);
             foreach my $item (keys(%legacyhash)) {              foreach my $item (keys(%legacyhash)) {
Line 4076  Returns: value of designparamter $which Line 4376  Returns: value of designparamter $which
 ##############################################  ##############################################
 sub designparm {  sub designparm {
     my ($which,$domain)=@_;      my ($which,$domain)=@_;
     if ($env{'browser.blackwhite'} eq 'on') {  
  if ($which=~/\.(font|alink|vlink|link|textcol)$/) {  
     return '#000000';  
  }  
  if ($which=~/\.(pgbg|sidebg|bgcol)$/) {  
     return '#FFFFFF';  
  }  
  if ($which=~/\.tabbg$/) {  
     return '#CCCCCC';  
  }  
     }  
     if (exists($env{'environment.color.'.$which})) {      if (exists($env{'environment.color.'.$which})) {
  return $env{'environment.color.'.$which};          return $env{'environment.color.'.$which};
     }      }
     $domain=&determinedomain($domain);      $domain=&determinedomain($domain);
     my %domdesign = &get_domainconf($domain);      my %domdesign = &get_domainconf($domain);
     my $output;      my $output;
     if ($domdesign{$domain.'.'.$which} ne '') {      if ($domdesign{$domain.'.'.$which} ne '') {
  $output = $domdesign{$domain.'.'.$which};          $output = $domdesign{$domain.'.'.$which};
     } else {      } else {
         $output = $defaultdesign{$which};          $output = $defaultdesign{$which};
     }      }
     if (($which =~ /^(student|coordinator|author|admin)\.img$/) ||      if (($which =~ /^(student|coordinator|author|admin)\.img$/) ||
         ($which =~ /login\.(img|logo|domlogo|login)/)) {          ($which =~ /login\.(img|logo|domlogo|login)/)) {
         if ($output =~ m{^/(adm|res)/}) {          if ($output =~ m{^/(adm|res)/}) {
     if ($output =~ m{^/res/}) {              if ($output =~ m{^/res/}) {
  my $local_name = &Apache::lonnet::filelocation('',$output);                  my $local_name = &Apache::lonnet::filelocation('',$output);
  &Apache::lonnet::repcopy($local_name);                  &Apache::lonnet::repcopy($local_name);
     }              }
             $output = &lonhttpdurl($output);              $output = &lonhttpdurl($output);
         }          }
     }      }
     return $output;      return $output;
 }  }
   
   ##############################################
   =pod
   
   =item * &authorspace()
   
   Inputs: ./.
   
   Returns: Path to the Construction Space of the current user's
            accessed author space
            The author space will be that of the current user
            when accessing the own author space
            and that of the co-author/assistent co-author
            when accessing the co-author's/assistent co-author's
            space
   
   =cut
   
   sub authorspace {
       my $caname = '';
       if ($env{'request.role'} =~ /^ca|^aa/) {
           (undef,$caname) =
               ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
       } else {
           $caname = $env{'user.name'};
       }
       return '/priv/'.$caname.'/';
   }
   
   ##############################################
   =pod
   
   =item * &head_subbox()
   
   Inputs: $content (contains HTML code with page functions, etc.)
   
   Returns: HTML div with $content
            To be included in page header
   
   =cut
   
   sub head_subbox {
       my ($content)=@_;
       my $output =
           '<div id="LC_head_subbox">'
          .$content
          .'</div>'
   }
   
   ##############################################
   =pod
   
   =item * &CSTR_pageheader()
   
   Inputs: ./.
   
   Returns: HTML div with CSTR path and recent box
            To be included on Construction Space pages
   
   =cut
   
   sub CSTR_pageheader {
       # this is for resources; directories have customtitle, and crumbs
               # and select recent are created in lonpubdir.pm  
       my ($uname,$thisdisfn)=
           ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);
       my $formaction='/priv/'.$uname.'/'.$thisdisfn;
       $formaction=~s/\/+/\//g;
   
       my $parentpath = '';
       my $lastitem = '';
       if ($thisdisfn =~ m-(.+/)([^/]*)$-) {
           $parentpath = $1;
           $lastitem = $2;
       } else {
           $lastitem = $thisdisfn;
       }
   
       my $output =
            '<div>'
           .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it?
           .'<b>'.&mt('Construction Space:').'</b> '
           .'<form name="dirs" method="post" action="'.$formaction
           .'" target="_top">' #FIXME lonpubdir: target="_parent"
           .&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 />"
           .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
           .'</form>'
           .&Apache::lonmenu::constspaceform()
           .'</div>';
   
       return $output;
   }
   
 ###############################################  ###############################################
 ###############################################  ###############################################
   
Line 4143  Inputs: Line 4534  Inputs:
 =item * $forcereg, if page should register as content page (relevant for   =item * $forcereg, if page should register as content page (relevant for 
             text interface only)              text interface only)
   
 =item * $customtitle, alternate text to use instead of $title  =item * $no_nav_bar, if true, keep the 'what is this' info but remove the
                       in the title box that appears, this text                       navigational links
                       is not auto translated like the $title is  
   
 =item * $notopbar, if true, keep the 'what is this' info but remove the  
                    navigational links  
   
 =item * $bgcolor, used to override the bgcolor on a webpage to a specific value  =item * $bgcolor, used to override the bgcolor on a webpage to a specific value
   
 =item * $notitle, if true keep the nav controls, but remove the title bar  
   
 =item * $no_inline_link, if true and in remote mode, don't show the   
          'Switch To Inline Menu' link  
   
 =item * $args, optional argument valid values are  =item * $args, optional argument valid values are
             no_auto_mt_title -> prevents &mt()ing the title arg              no_auto_mt_title -> prevents &mt()ing the title arg
             inherit_jsmath -> when creating popup window in a page,              inherit_jsmath -> when creating popup window in a page,
Line 4173  other decorations will be returned. Line 4555  other decorations will be returned.
 =cut  =cut
   
 sub bodytag {  sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle,      my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,
  $notopbar,$bgcolor,$notitle,$no_inline_link,$args)=@_;          $no_nav_bar,$bgcolor,$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 4183  sub bodytag { Line 4570  sub bodytag {
     my $font =   &designparm($function.'.font',$domain);      my $font =   &designparm($function.'.font',$domain);
     my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);      my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);
   
     my %design = ( 'style'   => 'margin-top: 0px',      my %design = ( 'style'   => 'margin-top: 0',
    'bgcolor' => $pgbg,     'bgcolor' => $pgbg,
    'text'    => $font,     'text'    => $font,
                    'alink'   => &designparm($function.'.alink',$domain),                     'alink'   => &designparm($function.'.alink',$domain),
Line 4202  sub bodytag { Line 4589  sub bodytag {
         if ($env{'request.role'} !~ /^cr/) {          if ($env{'request.role'} !~ /^cr/) {
             $role = &Apache::lonnet::plaintext($role,&course_type());              $role = &Apache::lonnet::plaintext($role,&course_type());
         }          }
           if ($env{'request.course.sec'}) {
               $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$env{'request.course.sec'};
           }   
  $realm = $env{'course.'.$env{'request.course.id'}.'.description'};   $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
     } else {      } else {
         $role = &Apache::lonnet::plaintext($role);          $role = &Apache::lonnet::plaintext($role);
     }      }
   
     if (!$realm) { $realm='&nbsp;'; }      if (!$realm) { $realm='&nbsp;'; }
 # Set messages  
     my $messages=&domainlogo($domain);  
   
     my $extra_body_attr = &make_attr_string($forcereg,\%design);      my $extra_body_attr = &make_attr_string($forcereg,\%design);
   
Line 4219  sub bodytag { Line 4607  sub bodytag {
   
     if ($bodyonly) {      if ($bodyonly) {
         return $bodytag;          return $bodytag;
     } elsif ($env{'browser.interface'} eq 'textual') {      } 
 # Accessibility  
             
  $bodytag.=&Apache::lonmenu::menubuttons($forcereg,$forcereg);  
  if (!$notitle) {  
     $bodytag.='<h1>LON-CAPA: '.$title.'</h1>';  
  }  
  return $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'});
     }      }
           
     my $roleinfo=(<<ENDROLE);  
 <td class="LC_title_bar_who">  
 <div class="LC_title_bar_name">  
     $name  
     &nbsp;  
 </div>  
 <div class="LC_title_bar_role">  
 $role&nbsp;  
 </div>  
 <div class="LC_title_bar_realm">  
 $realm&nbsp;  
 </div>  
 </td>  
 ENDROLE  
   
     my $titleinfo = '<h1>'.$title.'</h1>';      my $titleinfo = '<h1>'.$title.'</h1>';
     if ($customtitle) {  
         $titleinfo = $customtitle;  
     }  
     #      #
     # Extra info if you are the DC      # Extra info if you are the DC
     my $dc_info = '';      my $dc_info = '';
Line 4262  ENDROLE Line 4624  ENDROLE
                         $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.')';  
     }      }
   
     if (($env{'environment.remote'} eq 'off') || ($args->{'suppress_header_logos'})) {      $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;
         # No Remote      &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
  if ($env{'request.state'} eq 'construct') {  
     $forcereg=1;  
  }  
   
  if (!$customtitle && $env{'request.state'} eq 'construct') {          if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { 
     # this is for resources; directories have customtitle, and crumbs              return $bodytag; 
             # and select recent are created in lonpubdir.pm            } 
     my ($uname,$thisdisfn)=  
  ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);          if ($env{'request.state'} eq 'construct') { $forcereg=1; }
     my $formaction='/priv/'.$uname.'/'.$thisdisfn;  
     $formaction=~s/\/+/\//g;          #    if ($env{'request.state'} eq 'construct') {
           #        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
     my $parentpath = '';          #    }
     my $lastitem = '';  
     if ($thisdisfn =~ m-(.+/)([^/]*)$-) {  
  $parentpath = $1;  
  $lastitem = $2;          if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
     } else {               if ($dc_info) {
  $lastitem = $thisdisfn;                   $dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|;
     }               }
     $titleinfo =                $bodytag .= qq|<div id="LC_nav_bar">$name $role<br />
  &Apache::loncommon::help_open_menu('','',3,'Authoring')                  <em>$realm</em> $dc_info</div>|;
  .'<b>'.&mt('Construction Space').'</b>:&nbsp;'              return $bodytag;
  .'<form name="dirs" method="post" action="'.$formaction          }
  .'" target="_top"><tt><b>'  
  .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."<span class=\"LC_fontsize_big\">$lastitem</span></b></tt><br />"          unless ($env{'request.symb'} =~ m/\.page___\d+___/) {
  .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')              $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>|;
  .'</form>'          }
  .&Apache::lonmenu::constspaceform();  
         }          $bodytag .= Apache::lonhtmlcommon::scripttag(
               Apache::lonmenu::utilityfunctions(), 'start');
         my $titletable;  
  if (!$notitle) {          $bodytag .= Apache::lonmenu::primary_menu();
     $titletable =  
  '<table id="LC_title_bar">'.          if ($dc_info) {
                          "<tr><td> $titleinfo $dc_info</td>".$roleinfo.              $dc_info = &dc_courseid_toggle($dc_info);
  '</tr></table>';          }
  }          $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;
  if ($notopbar) {  
     $bodytag .= $titletable;          #don't show menus for public users
  } else {          if (!$public){
     if ($env{'request.state'} eq 'construct') {              $bodytag .= Apache::lonmenu::secondary_menu();
                 $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg,              $bodytag .= Apache::lonmenu::serverform();
   $titletable);              $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
             } else {              if ($env{'request.state'} eq 'construct') {
                 $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg).                  $bodytag .= &Apache::lonmenu::innerregister($forcereg,
     $titletable;                                  $args->{'bread_crumbs'});
               } elsif ($forcereg) { 
                   $bodytag .= &Apache::lonmenu::innerregister($forcereg);
             }              }
           }else{
               # this is to seperate menu from content when there's no secondary
               # menu. Especially needed for public accessible ressources.
               $bodytag .= '<hr style="clear:both" />';
               $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); 
         }          }
         return $bodytag;  
     }  
   
 #          return $bodytag;
 # Top frame rendering, Remote is up  }
 #  
   
     my $imgsrc = $img;  sub dc_courseid_toggle {
     if ($img =~ /^\/adm/) {      my ($dc_info) = @_;
         $imgsrc = &lonhttpdurl($img);      return ' <span id="dccidtext" class="LC_cusr_subheading">'.
     }             '<a href="javascript:showCourseID();">'.
     my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />';             &mt('(More ...)').'</a></span>'.
              '<div id="dccid" class="LC_dccid">'.$dc_info.'</div>';
     # Explicit link to get inline menu  
     my $menu= ($no_inline_link?''  
        :'<br /><a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a>');  
     #  
     if ($notitle) {  
  return $bodytag;  
     }  
     return(<<ENDBODY);  
 $bodytag  
 <table id="LC_title_bar" class="LC_with_remote">  
 <tr><td class="LC_title_bar_role_logo">$upperleft</td>  
     <td class="LC_title_bar_domain_logo">$messages&nbsp;</td>  
 </tr>  
 <tr><td>$titleinfo $dc_info $menu</td>  
 $roleinfo  
 </tr>  
 </table>  
 ENDBODY  
 }  }
   
 sub make_attr_string {  sub make_attr_string {
Line 4372  sub make_attr_string { Line 4716  sub make_attr_string {
  delete($attr_ref->{$key});   delete($attr_ref->{$key});
     }      }
  }   }
  $attr_ref->{'onload'}  =   $attr_ref->{'onload'}  = $on_load;
     &Apache::lonmenu::loadevents().  $on_load;   $attr_ref->{'onunload'}= $on_unload;
  $attr_ref->{'onunload'}=  
     &Apache::lonmenu::unloadevents().$on_unload;  
     }  
   
 # Accessibility font enhance  
     if ($env{'browser.fontenhance'} eq 'on') {  
  my $style;  
  foreach my $key (keys(%{$attr_ref})) {  
     if (lc($key) eq 'style') {  
  $style.=$attr_ref->{$key}.';';  
  delete($attr_ref->{$key});  
     }  
  }  
  $attr_ref->{'style'}=$style.'; font-size: x-large;';  
     }  
   
     if ($env{'browser.blackwhite'} eq 'on') {  
  delete($attr_ref->{'font'});  
  delete($attr_ref->{'link'});  
  delete($attr_ref->{'alink'});  
  delete($attr_ref->{'vlink'});  
  delete($attr_ref->{'bgcolor'});  
  delete($attr_ref->{'background'});  
     }      }
   
     my $attr_string;      my $attr_string;
Line 4459  sub standard_css { Line 4780  sub standard_css {
     my $img    = &designparm($function.'.img',   $domain);      my $img    = &designparm($function.'.img',   $domain);
     my $tabbg  = &designparm($function.'.tabbg', $domain);      my $tabbg  = &designparm($function.'.tabbg', $domain);
     my $font   = &designparm($function.'.font',  $domain);      my $font   = &designparm($function.'.font',  $domain);
       my $fontmenu = &designparm($function.'.fontmenu', $domain);
   #second colour for later usage
     my $sidebg = &designparm($function.'.sidebg',$domain);      my $sidebg = &designparm($function.'.sidebg',$domain);
     my $pgbg_or_bgcolor =      my $pgbg_or_bgcolor =
          $bgcolor ||           $bgcolor ||
Line 4468  sub standard_css { Line 4791  sub standard_css {
     my $vlink  = &designparm($function.'.vlink', $domain);      my $vlink  = &designparm($function.'.vlink', $domain);
     my $link   = &designparm($function.'.link',  $domain);      my $link   = &designparm($function.'.link',  $domain);
   
     my $loginbg = &designparm('login.sidebg',$domain);  
     my $bgcol = &designparm('login.bgcol',$domain);  
     my $textcol = &designparm('login.textcol',$domain);  
   
     my $sans                 = 'Verdana,Arial,Helvetica,sans-serif';      my $sans                 = 'Verdana,Arial,Helvetica,sans-serif';
     my $mono                 = 'monospace';      my $mono                 = 'monospace';
     my $data_table_head      = $tabbg;      my $data_table_head      = $sidebg;
     my $data_table_light     = '#EEEEEE';      my $data_table_light     = '#FAFAFA';
     my $data_table_dark      = '#DDDDDD';      my $data_table_dark      = '#F0F0F0';
     my $data_table_darker    = '#CCCCCC';      my $data_table_darker    = '#CCCCCC';
     my $data_table_highlight = '#FFFF00';      my $data_table_highlight = '#FFFF00';
     my $mail_new             = '#FFBB77';      my $mail_new             = '#FFBB77';
Line 4489  sub standard_css { Line 4808  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 $button_hover         = '#BF2317';
   
     my $border = ($env{'browser.type'} eq 'explorer' ||      my $border = ($env{'browser.type'} eq 'explorer' ||
   $env{'browser.type'} eq 'safari'     ) ? '0px 2px 0px 2px'        $env{'browser.type'} eq 'safari'     ) ? '0 2px 0 2px'
                                                  : '0px 3px 0px 4px';                                               : '0 3px 0 4px';
   
   
     return <<END;      return <<END;
 body{  
      font-family: $sans;  
      line-height:130%;  
      font-size:0.83em;  
      color:$font;  
   }  
 a:link, a:visited { font-size:100%; }  
   
 a:focus { color: red; background: yellow }   /* needed for iframe to allow 100% height in FF */
 table.thinborder,  body, html { 
 table.thinborder tr th {      margin: 0;
   border-style: solid;      padding: 0 0.5%;
   border-width: 1px;      height: 99%; /* to avoid scrollbars */
   border-color: $lg_border_color;  
   background: $tabbg;  
 }  }
 table.thinborder tr td {  
   border-style: solid;  body {
   border-width: 1px;    font-family: $sans;
   border-color: $lg_border_color;    line-height:130%;
     font-size:0.83em;
     color:$font;
   }
   
   a:focus,
   a:focus img {
     color: red;
     background: yellow;
   }
   
   form, .inline {
     display: inline;
   }
   
   .LC_right {
     text-align:right;
   }
   
   .LC_middle {
     vertical-align:middle;
   }
   
   .LC_400Box {
     width:400px;
   }
   
   .LC_iframecontainer {
       width: 98%;
       margin: 0;
       position: fixed;
       top: 8.5em;
       bottom: 0;
 }  }
   
 form, .inline { display: inline; }  .LC_iframecontainer iframe{
       border: none;
       width: 100%;
       height: 100%;
   }
   
 .LC_right {text-align:right;}  .LC_filename {
 .LC_middle {vertical-align:middle;}    font-family: $mono;
     white-space:pre;
     font-size: 120%;
   }
   
 /* just for tests */  .LC_fileicon {
 .LC_400Box {width:400px; }    border: none;
 /* end */    height: 1.3em;
     vertical-align: text-bottom;
     margin-right: 0.3em;
     text-decoration:none;
   }
   
 .LC_filename {font-family: $mono; white-space:pre;}  
 .LC_error {  .LC_error {
   color: red;    color: red;
   font-size: larger;    font-size: larger;
 }  }
   
 .LC_warning,  .LC_warning,
 .LC_diff_removed {  .LC_diff_removed {
   color: red;    color: red;
Line 4543  form, .inline { display: inline; } Line 4897  form, .inline { display: inline; }
 .LC_diff_added {  .LC_diff_added {
   color: green;    color: green;
 }  }
 .LC_unknown {  
   color: yellow;  div.LC_confirm_box {
     background-color: #FAFAFA;
     border: 1px solid $lg_border_color;
     margin-right: 0;
     padding: 5px;
   }
   
   div.LC_confirm_box .LC_error img,
   div.LC_confirm_box .LC_success img {
     vertical-align: middle;
 }  }
   
 .LC_icon {  .LC_icon {
   border: none;    border: none;
     vertical-align: middle;
 }  }
   
 .LC_indexer_icon {  
   border: 0px;  
   height: 22px;  
 }  
 .LC_docs_spacer {  .LC_docs_spacer {
   width: 25px;    width: 25px;
   height: 1px;    height: 1px;
Line 4565  form, .inline { display: inline; } Line 4925  form, .inline { display: inline; }
   color: #999999;    color: #999999;
 }  }
   
   .LC_discussion {
     background: $tabbg;
     border: 1px solid black;
     margin: 2px;
   }
   
   .LC_disc_action_links_bar {
     background: $tabbg;
     border: none;
     margin: 4px;
   }
   
   .LC_disc_action_left {
     text-align: left;
   }
   
   .LC_disc_action_right {
     text-align: right;
   }
   
   .LC_disc_new_item {
     background: white;
     border: 2px solid red;
     margin: 2px;
   }
   
   .LC_disc_old_item {
     background: white;
     border: 1px solid black;
     margin: 2px;
   }
   
 table.LC_pastsubmission {  table.LC_pastsubmission {
   border: 1px solid black;    border: 1px solid black;
   margin: 2px;    margin: 2px;
 }  }
   
 table#LC_top_nav, table#LC_menubuttons,table#LC_nav_location {  table#LC_menubuttons {
   width: 100%;    width: 100%;
   background: $pgbg;    background: $pgbg;
   border: 2px;    border: 2px;
   border-collapse: separate;    border-collapse: separate;
   padding: 0px;    padding: 0;
   }
   
   table#LC_title_bar a {
     color: $fontmenu;
   }
   
   table#LC_title_bar {
     clear: both;
     display: none;
 }  }
   
 table#LC_title_bar, table.LC_breadcrumbs,   table#LC_title_bar,
   table.LC_breadcrumbs, /* obsolete? */
 table#LC_title_bar.LC_with_remote {  table#LC_title_bar.LC_with_remote {
   width: 100%;    width: 100%;
   border-color: $pgbg;    border-color: $pgbg;
   border-style: solid;    border-style: solid;
   border-width: $border;    border-width: $border;
   
   background: $pgbg;    background: $pgbg;
   font-family: $sans;    color: $fontmenu;
   border-collapse: collapse;    border-collapse: collapse;
   padding: 0px;    padding: 0;
 }    margin: 0;
 table.LC_docs_path {  
   width: 100%;  
   border: 0;  
   background: $pgbg;  
   font-family: $sans;  
   border-collapse: collapse;  
   padding: 0px;  
 }  }
   
 table#LC_title_bar td {  ul.LC_breadcrumb_tools_outerlist {
   background: $tabbg;      margin: 0;
 }      padding: 0;
 table#LC_title_bar .LC_title_bar_who {      position: relative;
   background: $tabbg;      list-style: none;
   color: $font;  
   font: small $sans;  
   text-align: right;  
   margin: 0px;  
 }  
 table#LC_title_bar .LC_title_bar_name {  
   margin: 0px;  
 }  
 table#LC_title_bar .LC_title_bar_role {  
   margin: 0px;  
 }  
 table#LC_title_bar .LC_title_bar_realm {  
   margin: 0px;  
 }  
 span.LC_metadata {  
     font-family: $sans;  
 }  
 table#LC_title_bar td.LC_title_bar_domain_logo {  
   background: $sidebg;  
   text-align: right;  
   padding: 0px;  
 }  }
 table#LC_title_bar td.LC_title_bar_role_logo {  ul.LC_breadcrumb_tools_outerlist li {
   background: $sidebg;      display: inline;
   padding: 0px;  
 }  }
   
 table#LC_menubuttons img{  .LC_breadcrumb_tools_navigation {
   border: 0px;      padding: 0;
 }      margin: 0;
 table#LC_top_nav td {      float: left;
   background: $tabbg;  
   border: 0px;  
   font-size: small;  
   vertical-align:top;  
   padding:2px 5px 2px 5px;  
 }  }
 table#LC_top_nav td a, div#LC_top_nav a {  .LC_breadcrumb_tools_tools {
   color: $font;      padding: 0;
   font-family: $sans;      margin: 0;
       float: right;
 }  }
 table#LC_top_nav td.LC_top_nav_logo {  
   table#LC_title_bar td {
   background: $tabbg;    background: $tabbg;
   text-align: left;  
   white-space: nowrap;  
   width: 31px;  
 }  
 table#LC_top_nav td.LC_top_nav_logo img {  
   border: 0px;  
   vertical-align: bottom;  
 }  }
 table#LC_top_nav td.LC_top_nav_exit,  
 table#LC_top_nav td.LC_top_nav_help {      table#LC_menubuttons img {
   width: 2.0em;    border: none;
 }  
 table#LC_top_nav td.LC_top_nav_login {  
   width: 4.0em;  
   text-align: center;  
 }  }
 table.LC_breadcrumbs td, table.LC_docs_path td  {  
   background: $tabbg;  .LC_breadcrumbs_component {
   color: $font;    float: right;
   font-family: $sans;    margin: 0 1em;
   font-size: smaller;  
 }  }
 table.LC_breadcrumbs td.LC_breadcrumbs_component,  .LC_breadcrumbs_component img {
 table.LC_docs_path td.LC_docs_path_component {    vertical-align: middle;
   background: $tabbg;      
   color: $font;  
   font-family: $sans;  
   font-size: larger;       
   text-align: right;       
 }  }
   
 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 {
     font-size: 70%;
 }  }
   
 .LC_fontsize_small  #LC_breadcrumbs {
 {    clear:both;
  font-size: 70%;    background: $sidebg;
     border-bottom: 1px solid $lg_border_color;
     line-height: 2.5em;
     overflow: hidden;
     margin: 0;
     padding: 0;
 }  }
   
 .LC_fontsize_medium  #LC_head_subbox {
 {    clear:both;
  font-size: 85%;    background: #F8F8F8; /* $sidebg; */
     border: 1px solid $sidebg;
     margin: 0 0 10px 0;      
     padding: 3px;
 }  }
   
 .LC_fontsize_large  .LC_fontsize_medium {
 {    font-size: 85%;
  font-size: 120%;  }
   
   .LC_fontsize_large {
     font-size: 120%;
 }  }
   
 .LC_menubuttons_inline_text {  .LC_menubuttons_inline_text {
   color: $font;    color: $font;
   font-family: $sans;  
   font-size: 90%;    font-size: 90%;
   padding-left:3px;    padding-left:3px;
 }  }
   
   .LC_menubuttons_inline_text img{
     vertical-align: middle;
   }
   
   li.LC_menubuttons_inline_text img,a {
     cursor:pointer;
   }
   
 .LC_menubuttons_link {  .LC_menubuttons_link {
   text-decoration: none;    text-decoration: none;
 }  }
 /*2008--9-5: new menu style sheet.Changed category*/  
 .LC_menubuttons_category {  .LC_menubuttons_category {
   color: $font;    color: $font;
   background: $pgbg;    background: $pgbg;
   font-family: $sans;  
   font-size: larger;    font-size: larger;
   font-weight: bold;    font-weight: bold;
 }  }
   
 td.LC_menubuttons_text {  td.LC_menubuttons_text {
   color: $font;    color: $font;
 }  }
   
   
   
 .LC_current_location {  .LC_current_location {
   font-family: $sans;  
   background: $tabbg;    background: $tabbg;
 }  }
 .LC_new_mail {  
   font-family: $sans;  
   background: $tabbg;  
   font-weight: bold;  
 }  
   
   
 .LC_dropadd_labeltext {  
   font-family: $sans;  
   text-align: right;  
 }  
   
 .LC_preferences_labeltext {  
   font-family: $sans;  
   text-align: right;  
 }  
   
 .LC_roleslog_note {  
   font-size: small;  
 }  
   
 .LC_mail_functions {  
     font-weight: bold;  
 }  
   
 table.LC_aboutme_port {  table.LC_data_table {
   border: 0px;  
   border-collapse: collapse;  
   border-spacing: 0px;  
 }  
 table.LC_data_table, table.LC_mail_list {  
   border: 1px solid #000000;    border: 1px solid #000000;
   border-collapse: separate;    border-collapse: separate;
   border-spacing: 1px;    border-spacing: 1px;
   background: $pgbg;    background: $pgbg;
 }  }
   
 .LC_data_table_dense {  .LC_data_table_dense {
   font-size: small;    font-size: small;
 }  }
   
 table.LC_nested_outer {  table.LC_nested_outer {
   border: 1px solid #000000;    border: 1px solid #000000;
   border-collapse: collapse;    border-collapse: collapse;
   border-spacing: 0px;    border-spacing: 0;
   width: 100%;    width: 100%;
 }  }
   
   table.LC_innerpickbox,
 table.LC_nested {  table.LC_nested {
   border: 0px;    border: none;
   border-collapse: collapse;    border-collapse: collapse;
   border-spacing: 0px;    border-spacing: 0;
   width: 100%;    width: 100%;
 }  }
 table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th,  
 table.LC_prior_tries tr th {  .ui-accordion,
   .ui-accordion table.LC_data_table,
   .ui-accordion table.LC_nested_outer{
     border: 0px;
     border-spacing: 0px;
     margin: 3px;
   }
   
   table.LC_data_table tr th,
   table.LC_calendar tr th,
   table.LC_prior_tries tr th,
   table.LC_innerpickbox tr th {
   font-weight: bold;    font-weight: bold;
   background-color: $data_table_head;    background-color: $data_table_head;
     color:$fontmenu;
   font-size:90%;    font-size:90%;
 }  }
   
   table.LC_innerpickbox tr th,
   table.LC_innerpickbox tr td {
     vertical-align: top;
   }
   
 table.LC_data_table tr.LC_info_row > td {  table.LC_data_table tr.LC_info_row > td {
   background-color: #CCCCCC;    background-color: #CCCCCC;
   font-weight: bold;    font-weight: bold;
   text-align: left;    text-align: left;
 }  }
 table.LC_data_table tr.LC_odd_row > td,   
 table.LC_pick_box tr > td.LC_odd_row,  table.LC_data_table tr.LC_odd_row > td {
 table.LC_aboutme_port tr td {  
   background-color: $data_table_light;    background-color: $data_table_light;
   padding: 2px;    padding: 2px;
     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_odd_row {
 table.LC_aboutme_port tr.LC_even_row td {    background-color: $data_table_light;
     vertical-align: top;
   }
   
   table.LC_data_table tr.LC_even_row > td {
   background-color: $data_table_dark;    background-color: $data_table_dark;
   padding: 2px;    padding: 2px;
     vertical-align: top;
   }
   
   table.LC_pick_box tr > td.LC_even_row {
     background-color: $data_table_dark;
     vertical-align: top;
 }  }
   
 table.LC_data_table tr.LC_data_table_highlight td {  table.LC_data_table tr.LC_data_table_highlight td {
   background-color: $data_table_darker;    background-color: $data_table_darker;
 }  }
   
 table.LC_data_table tr td.LC_leftcol_header {  table.LC_data_table tr td.LC_leftcol_header {
   background-color: $data_table_head;    background-color: $data_table_head;
   font-weight: bold;    font-weight: bold;
 }  }
   
 table.LC_data_table tr.LC_empty_row td,  table.LC_data_table tr.LC_empty_row td,
 table.LC_nested tr.LC_empty_row td {  table.LC_nested tr.LC_empty_row td {
   background-color: #FFFFFF;  
   font-weight: bold;    font-weight: bold;
   font-style: italic;    font-style: italic;
   text-align: center;    text-align: center;
   padding: 8px;    padding: 8px;
 }  }
   
   table.LC_data_table tr.LC_empty_row td {
     background-color: $sidebg;
   }
   
   table.LC_nested tr.LC_empty_row td {
     background-color: #FFFFFF;
   }
   
   table.LC_caption {
   }
   
 table.LC_nested tr.LC_empty_row td {  table.LC_nested tr.LC_empty_row td {
   padding: 4ex    padding: 4ex
 }  }
   
 table.LC_nested_outer tr th {  table.LC_nested_outer tr th {
   font-weight: bold;    font-weight: bold;
     color:$fontmenu;
   background-color: $data_table_head;    background-color: $data_table_head;
   font-size: small;    font-size: small;
   border-bottom: 1px solid #000000;    border-bottom: 1px solid #000000;
 }  }
   
 table.LC_nested_outer tr td.LC_subheader {  table.LC_nested_outer tr td.LC_subheader {
   background-color: $data_table_head;    background-color: $data_table_head;
   font-weight: bold;    font-weight: bold;
Line 4833  table.LC_nested_outer tr td.LC_subheader Line 5221  table.LC_nested_outer tr td.LC_subheader
   border-bottom: 1px solid #000000;    border-bottom: 1px solid #000000;
   text-align: right;    text-align: right;
 }  }
   
 table.LC_nested tr.LC_info_row td {  table.LC_nested tr.LC_info_row td {
   background-color: #CCCCCC;    background-color: #CCCCCC;
   font-weight: bold;    font-weight: bold;
   font-size: small;    font-size: small;
   text-align: center;    text-align: center;
 }  }
   
 table.LC_nested tr.LC_info_row td.LC_left_item,  table.LC_nested tr.LC_info_row td.LC_left_item,
 table.LC_nested_outer tr th.LC_left_item {  table.LC_nested_outer tr th.LC_left_item {
   text-align: left;    text-align: left;
 }  }
   
 table.LC_nested td {  table.LC_nested td {
   background-color: #FFFFFF;    background-color: #FFFFFF;
   font-size: small;    font-size: small;
 }  }
   
 table.LC_nested_outer tr th.LC_right_item,  table.LC_nested_outer tr th.LC_right_item,
 table.LC_nested tr.LC_info_row td.LC_right_item,  table.LC_nested tr.LC_info_row td.LC_right_item,
 table.LC_nested tr.LC_odd_row td.LC_right_item,  table.LC_nested tr.LC_odd_row td.LC_right_item,
Line 4854  table.LC_nested tr td.LC_right_item { Line 5246  table.LC_nested tr td.LC_right_item {
   text-align: right;    text-align: right;
 }  }
   
   .ui-accordion table.LC_nested tr.LC_odd_row td.LC_left_item,
   .ui-accordion table.LC_nested tr.LC_even_row td.LC_left_item {
     text-align: right;
     width: 40%;
     padding-right:10px;
     vertical-align: top;
     padding: 5px;
   }
   
   .ui-accordion table.LC_nested tr.LC_odd_row td.LC_right_item,
   .ui-accordion table.LC_nested tr.LC_even_row td.LC_right_item {
     text-align: left;
     width: 60%;
     padding: 2px 4px;
   }
   
 table.LC_nested tr.LC_odd_row td {  table.LC_nested tr.LC_odd_row td {
   background-color: #EEEEEE;    background-color: #EEEEEE;
 }  }
Line 4874  table.LC_createuser tr.LC_info_row td  { Line 5282  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 {
   font-size: xx-small;    font-size: xx-small;
 }  }
   
 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 {
   background-color: $data_table_dark;    background-color: $data_table_dark;
 }  }
 table.LC_calendar tr td.LC_calendar_day_current {   
   background-color: $data_table_highlight;         table.LC_calendar tr td.LC_calendar_day_current {
     background-color: $data_table_highlight;
 }  }
 table.LC_mail_list tr.LC_mail_new {  
   table.LC_data_table tr td.LC_mail_new {
   background-color: $mail_new;    background-color: $mail_new;
 }  }
 table.LC_mail_list tr.LC_mail_new:hover {  
   table.LC_data_table 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_data_table tr td.LC_mail_read {
 table.LC_mail_list tr.LC_mail_odd{  
 }  
 table.LC_mail_list tr.LC_mail_read {  
   background-color: $mail_read;    background-color: $mail_read;
 }  }
 table.LC_mail_list tr.LC_mail_read:hover {  
   /*
   table.LC_data_table tr.LC_mail_read:hover {
   background-color: $mail_read_hover;    background-color: $mail_read_hover;
 }  }
 table.LC_mail_list tr.LC_mail_replied {  */
   
   table.LC_data_table tr td.LC_mail_replied {
   background-color: $mail_replied;    background-color: $mail_replied;
 }  }
 table.LC_mail_list tr.LC_mail_replied:hover {  
   /*
   table.LC_data_table tr.LC_mail_replied:hover {
   background-color: $mail_replied_hover;    background-color: $mail_replied_hover;
 }  }
 table.LC_mail_list tr.LC_mail_other {  */
   
   table.LC_data_table tr td.LC_mail_other {
   background-color: $mail_other;    background-color: $mail_other;
 }  }
 table.LC_mail_list tr.LC_mail_other:hover {  
   /*
   table.LC_data_table tr.LC_mail_other:hover {
   background-color: $mail_other_hover;    background-color: $mail_other_hover;
 }  }
   */
   
 table.LC_data_table tr > td.LC_browser_file,  table.LC_data_table tr > td.LC_browser_file,
 table.LC_data_table tr > td.LC_browser_file_published {  table.LC_data_table tr > td.LC_browser_file_published {
   background: #CCFF88;    background: #AAEE77;
 }  }
   
 table.LC_data_table tr > td.LC_browser_file_locked,  table.LC_data_table tr > td.LC_browser_file_locked,
 table.LC_data_table tr > td.LC_browser_file_unpublished {  table.LC_data_table tr > td.LC_browser_file_unpublished {
   background: #FFAA99;    background: #FFAA99;
 }  }
   
 table.LC_data_table tr > td.LC_browser_file_obsolete {  table.LC_data_table tr > td.LC_browser_file_obsolete {
   background: #AAAAAA;               background: #888888;
 }          }
   
 table.LC_data_table tr > td.LC_browser_file_modified,  table.LC_data_table tr > td.LC_browser_file_modified,
 table.LC_data_table tr > td.LC_browser_file_metamodified {         table.LC_data_table tr > td.LC_browser_file_metamodified {
   background: #FFFF77;               background: #F8F866;
 }  }
   
 table.LC_data_table tr.LC_browser_folder > td {  table.LC_data_table tr.LC_browser_folder > td {
   background: #CCCCFF;    background: #E0E8FF;
 }  }
   
 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 {
   background: #FFFF77;    border-right: 8px solid #FFFF77;
 }  }
   
 table.LC_data_table tr > td.LC_roles_will {  table.LC_data_table tr > td.LC_roles_will {
   background: #FFAA77;    border-right: 8px solid #FFAA77;
 }  }
   
 table.LC_data_table tr > td.LC_roles_expired {  table.LC_data_table tr > td.LC_roles_expired {
   background: #FF7777;    border-right: 8px solid #FF7777;
 }  }
   
 table.LC_data_table tr > td.LC_roles_will_not {  table.LC_data_table tr > td.LC_roles_will_not {
   background: #AAFF77;    border-right: 8px solid #AAFF77;
 }  }
   
 table.LC_data_table tr > td.LC_roles_selected {  table.LC_data_table tr > td.LC_roles_selected {
   background: #11CC55;    border-right: 8px solid #11CC55;
 }  }
   
 span.LC_current_location {  span.LC_current_location {
Line 4962  span.LC_current_location { Line 5395  span.LC_current_location {
   
 span.LC_parm_menu_item {  span.LC_parm_menu_item {
   font-size: larger;    font-size: larger;
   font-family: $sans;  
 }  }
   
 span.LC_parm_scope_all {  span.LC_parm_scope_all {
   color: red;    color: red;
 }  }
   
 span.LC_parm_scope_folder {  span.LC_parm_scope_folder {
   color: green;    color: green;
 }  }
   
 span.LC_parm_scope_resource {  span.LC_parm_scope_resource {
   color: orange;    color: orange;
 }  }
   
 span.LC_parm_part {  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;
 }  }
   
 td.LC_parm_overview_level_menu, td.LC_parm_overview_map_menu,  td.LC_parm_overview_level_menu,
 td.LC_parm_overview_parm_selectors,td.LC_parm_overview_restrictions  {  td.LC_parm_overview_map_menu,
   td.LC_parm_overview_parm_selectors,
   td.LC_parm_overview_restrictions  {
   border: 1px solid black;    border: 1px solid black;
   border-collapse: collapse;    border-collapse: collapse;
 }  }
   
 table.LC_parm_overview_restrictions td {  table.LC_parm_overview_restrictions td {
   border-width: 1px 4px 1px 4px;    border-width: 1px 4px 1px 4px;
   border-style: solid;    border-style: solid;
   border-color: $pgbg;    border-color: $pgbg;
   text-align: center;    text-align: center;
 }  }
   
 table.LC_parm_overview_restrictions th {  table.LC_parm_overview_restrictions th {
   background: $tabbg;    background: $tabbg;
   border-width: 1px 4px 1px 4px;    border-width: 1px 4px 1px 4px;
   border-style: solid;    border-style: solid;
   border-color: $pgbg;    border-color: $pgbg;
 }  }
   
 table#LC_helpmenu {  table#LC_helpmenu {
   border: 0px;    border: none;
   height: 55px;    height: 55px;
   border-spacing: 0px;    border-spacing: 0;
 }  }
   
 table#LC_helpmenu fieldset legend {  table#LC_helpmenu fieldset legend {
   font-size: larger;    font-size: larger;
   font-weight: bold;  
 }  }
   
 table#LC_helpmenu_links {  table#LC_helpmenu_links {
   width: 100%;    width: 100%;
   border: 1px solid black;    border: 1px solid black;
   background: $pgbg;    background: $pgbg;
   padding: 0px;    padding: 0;
   border-spacing: 1px;    border-spacing: 1px;
 }  }
   
 table#LC_helpmenu_links tr td {  table#LC_helpmenu_links tr td {
   padding: 1px;    padding: 1px;
   background: $tabbg;    background: $tabbg;
Line 5023  table#LC_helpmenu_links tr td { Line 5467  table#LC_helpmenu_links tr td {
   font-weight: bold;    font-weight: bold;
 }  }
   
 table#LC_helpmenu_links a:link, table#LC_helpmenu_links a:visited,  table#LC_helpmenu_links a:link,
   table#LC_helpmenu_links a:visited,
 table#LC_helpmenu_links a:active {  table#LC_helpmenu_links a:active {
   text-decoration: none;    text-decoration: none;
   color: $font;    color: $font;
 }  }
   
 table#LC_helpmenu_links a:hover {  table#LC_helpmenu_links a:hover {
   text-decoration: underline;    text-decoration: underline;
   color: $vlink;    color: $vlink;
Line 5037  table#LC_helpmenu_links a:hover { Line 5483  table#LC_helpmenu_links a:hover {
   border: 1px solid #339933;    border: 1px solid #339933;
   margin: -1px;    margin: -1px;
 }  }
   
 .LC_chrt_popup_up {  .LC_chrt_popup_up {
   border: 1px solid yellow;    border: 1px solid yellow;
   margin: -1px;    margin: -1px;
 }  }
   
 .LC_chrt_popup {  .LC_chrt_popup {
   border: 1px solid #8888FF;    border: 1px solid #8888FF;
   background: #CCCCFF;    background: #CCCCFF;
 }  }
   
 table.LC_pick_box {  table.LC_pick_box {
   border-collapse: separate;    border-collapse: separate;
   background: white;    background: white;
   border: 1px solid black;    border: 1px solid black;
   border-spacing: 1px;    border-spacing: 1px;
 }  }
   
 table.LC_pick_box td.LC_pick_box_title {  table.LC_pick_box td.LC_pick_box_title {
   background: $tabbg;    background: $sidebg;
   font-weight: bold;    font-weight: bold;
   text-align: right;    text-align: left;
   vertical-align: top;    vertical-align: top;
   width: 184px;    width: 184px;
   padding: 8px;    padding: 8px;
 }  }
 table.LC_pick_box td.LC_selfenroll_pick_box_title {  
   background: $tabbg;  
   font-weight: bold;  
   text-align: right;  
   width: 350px;  
   padding: 8px;  
 }  
   
 table.LC_pick_box td.LC_pick_box_value {  table.LC_pick_box td.LC_pick_box_value {
   text-align: left;    text-align: left;
   padding: 8px;    padding: 8px;
 }  }
   
 table.LC_pick_box td.LC_pick_box_select {  table.LC_pick_box td.LC_pick_box_select {
   text-align: left;    text-align: left;
   padding: 8px;    padding: 8px;
 }  }
   
 table.LC_pick_box td.LC_pick_box_separator {  table.LC_pick_box td.LC_pick_box_separator {
   padding: 0px;    padding: 0;
   height: 1px;    height: 1px;
   background: black;    background: black;
 }  }
   
 table.LC_pick_box td.LC_pick_box_submit {  table.LC_pick_box td.LC_pick_box_submit {
   text-align: right;    text-align: right;
 }  }
   
 table.LC_pick_box td.LC_evenrow_value {  table.LC_pick_box td.LC_evenrow_value {
   text-align: left;    text-align: left;
   padding: 8px;    padding: 8px;
   background-color: $data_table_light;    background-color: $data_table_light;
 }  }
   
 table.LC_pick_box td.LC_oddrow_value {  table.LC_pick_box td.LC_oddrow_value {
   text-align: left;    text-align: left;
   padding: 8px;    padding: 8px;
   background-color: $data_table_light;    background-color: $data_table_light;
 }  }
 table.LC_helpform_receipt {  
   width: 620px;  
   border-collapse: separate;  
   background: white;  
   border: 1px solid black;  
   border-spacing: 1px;  
 }  
 table.LC_helpform_receipt td.LC_pick_box_title {  
   background: $tabbg;  
   font-weight: bold;  
   text-align: right;  
   width: 184px;  
   padding: 8px;  
 }  
 table.LC_helpform_receipt td.LC_evenrow_value {  
   text-align: left;  
   padding: 8px;  
   background-color: $data_table_light;  
 }  
 table.LC_helpform_receipt td.LC_oddrow_value {  
   text-align: left;  
   padding: 8px;  
   background-color: $data_table_light;  
 }  
 table.LC_helpform_receipt td.LC_pick_box_separator {  
   padding: 0px;  
   height: 1px;  
   background: black;  
 }  
 span.LC_helpform_receipt_cat {  span.LC_helpform_receipt_cat {
   font-weight: bold;    font-weight: bold;
 }  }
   
 table.LC_group_priv_box {  table.LC_group_priv_box {
   background: white;    background: white;
   border: 1px solid black;    border: 1px solid black;
   border-spacing: 1px;    border-spacing: 1px;
 }  }
   
 table.LC_group_priv_box td.LC_pick_box_title {  table.LC_group_priv_box td.LC_pick_box_title {
   background: $tabbg;    background: $tabbg;
   font-weight: bold;    font-weight: bold;
   text-align: right;    text-align: right;
   width: 184px;    width: 184px;
 }  }
   
 table.LC_group_priv_box td.LC_groups_fixed {  table.LC_group_priv_box td.LC_groups_fixed {
   background: $data_table_light;    background: $data_table_light;
   text-align: center;    text-align: center;
 }  }
   
 table.LC_group_priv_box td.LC_groups_optional {  table.LC_group_priv_box td.LC_groups_optional {
   background: $data_table_dark;    background: $data_table_dark;
   text-align: center;    text-align: center;
 }  }
   
 table.LC_group_priv_box td.LC_groups_functionality {  table.LC_group_priv_box td.LC_groups_functionality {
   background: $data_table_darker;    background: $data_table_darker;
   text-align: center;    text-align: center;
   font-weight: bold;    font-weight: bold;
 }  }
   
 table.LC_group_priv td {  table.LC_group_priv td {
   text-align: left;    text-align: left;
   padding: 0px;    padding: 0;
 }  }
   
 table.LC_notify_front_page {  table.LC_notify_front_page {
Line 5159  table.LC_notify_front_page { Line 5585  table.LC_notify_front_page {
   border: 1px solid black;    border: 1px solid black;
   padding: 8px;    padding: 8px;
 }  }
   
 table.LC_notify_front_page td {  table.LC_notify_front_page td {
   padding: 8px;    padding: 8px;
 }  }
   
 .LC_navbuttons {  .LC_navbuttons {
   margin: 2ex 0ex 2ex 0ex;    margin: 2ex 0ex 2ex 0ex;
 }  }
   
 .LC_topic_bar {  .LC_topic_bar {
   font-family: $sans;  
   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;
     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 {  
   vertical-align: bottom;  
 }  
 table.LC_course_group_status {  table.LC_course_group_status {
   margin: 20px;    margin: 20px;
 }  }
   
 table.LC_status_selector td {  table.LC_status_selector td {
   vertical-align: top;    vertical-align: top;
   text-align: center;    text-align: center;
   padding: 4px;    padding: 4px;
 }  }
 table.LC_descriptive_input td.LC_description {  
   vertical-align: top;  
   text-align: right;  
   font-weight: bold;  
 }  
 div.LC_feedback_link {  div.LC_feedback_link {
   clear: both;    clear: both;
   background: white;    background: $sidebg;
   width: 100%;      width: 100%;
     padding-bottom: 10px;
     border: 1px $tabbg solid;
     height: 22px;
     line-height: 22px;
     padding-top: 5px;
   }
   
   div.LC_feedback_link img {
     height: 22px;
     vertical-align:middle;
 }  }
   
   div.LC_feedback_link a {
     text-decoration: none;
   }
   
   div.LC_comblock {
     display:inline;
     color:$font;
     font-size:90%;
   }
   
   div.LC_feedback_link div.LC_comblock {
     padding-left:5px;
   }
   
   div.LC_feedback_link div.LC_comblock a {
     color:$font;
   }
   
 span.LC_feedback_link {  span.LC_feedback_link {
   background: $feedback_link_bg;    /* background: $feedback_link_bg; */
   font-size: larger;    font-size: larger;
 }  }
   
 span.LC_message_link {  span.LC_message_link {
   background: $feedback_link_bg;    /* background: $feedback_link_bg; */
   font-size: larger;    font-size: larger;
   position: absolute;    position: absolute;
   right: 1em;    right: 1em;
Line 5219  table.LC_prior_tries td { Line 5676  table.LC_prior_tries td {
 }  }
   
 .LC_answer_correct {  .LC_answer_correct {
   background: #AAFFAA;    background: lightgreen;
   color: black;    color: darkgreen;
     padding: 6px;
 }  }
   
 .LC_answer_charged_try {  .LC_answer_charged_try {
   background: #FFAAAA ! important;    background: #FFAAAA;
   color: black;    color: darkred;
     padding: 6px;
 }  }
 .LC_answer_not_charged_try,   
   .LC_answer_not_charged_try,
 .LC_answer_no_grade,  .LC_answer_no_grade,
 .LC_answer_late {  .LC_answer_late {
   background: #FFFFAA;    background: lightyellow;
   color: black;    color: black;
     padding: 6px;
 }  }
   
 .LC_answer_previous {  .LC_answer_previous {
   background: #AAAAFF;    background: lightblue;
   color: black;    color: darkblue;
     padding: 6px;
 }  }
 .LC_answer_no_message {   
   .LC_answer_no_message {
   background: #FFFFFF;    background: #FFFFFF;
   color: black;    color: black;
 }     padding: 6px;
 .LC_answer_unknown {   }
   background: orange;   
   color: black;   .LC_answer_unknown {
     background: orange;
     color: black;
     padding: 6px;
 }  }
   
 span.LC_prior_numerical,  span.LC_prior_numerical,
 span.LC_prior_string,  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 5262  table.LC_prior_option { Line 5731  table.LC_prior_option {
   width: 100%;    width: 100%;
   border-collapse: collapse;    border-collapse: collapse;
 }  }
 table.LC_prior_rank, table.LC_prior_match {  
   table.LC_prior_rank,
   table.LC_prior_match {
   border-collapse: collapse;    border-collapse: collapse;
 }  }
   
 table.LC_prior_option tr td,  table.LC_prior_option tr td,
 table.LC_prior_rank tr td,  table.LC_prior_rank tr td,
 table.LC_prior_match tr td {  table.LC_prior_match tr td {
   border: 1px solid #000000;    border: 1px solid #000000;
 }  }
   
 td.LC_nobreak,  .LC_nobreak {
 span.LC_nobreak {  
   white-space: nowrap;    white-space: nowrap;
 }  }
   
Line 5285  span.LC_cusr_subheading { Line 5756  span.LC_cusr_subheading {
   font-size: 85%;    font-size: 85%;
 }  }
   
 table.LC_docs_documents {  div.LC_docs_entry_move {
   background: #BBBBBB;    border: 1px solid #BBBBBB;
   border-width: 0px;  
   border-collapse: collapse;  
 }  
 table.LC_docs_documents td.LC_docs_document {  
   border: 2px solid black;         
   padding: 4px;            
 }  
 .LC_docs_entry_move {  
   border: 0px;  
   border-collapse: collapse;  
 }  
   
 .LC_docs_entry_move td {  
   border: 2px solid #BBBBBB;  
   background: #DDDDDD;    background: #DDDDDD;
     width: 22px;
     padding: 1px;
     margin: 0;
 }  }
   
 .LC_docs_editor td.LC_docs_entry_commands {  table.LC_data_table tr > td.LC_docs_entry_commands,
   table.LC_data_table tr > td.LC_docs_entry_parameter {
   background: #DDDDDD;    background: #DDDDDD;
   font-size: x-small;    font-size: x-small;
 }  }
   
   .LC_docs_entry_parameter {
     white-space: nowrap;
   }
   
 .LC_docs_copy {  .LC_docs_copy {
   color: #000099;    color: #000099;
 }  }
   
 .LC_docs_cut {  .LC_docs_cut {
   color: #550044;    color: #550044;
 }  }
   
 .LC_docs_rename {  .LC_docs_rename {
   color: #009900;    color: #009900;
 }  }
   
 .LC_docs_remove {  .LC_docs_remove {
   color: #990000;    color: #990000;
 }  }
Line 5326  table.LC_docs_documents td.LC_docs_docum Line 5795  table.LC_docs_documents td.LC_docs_docum
   font-size: x-small;    font-size: x-small;
 }  }
   
 .LC_docs_editor td.LC_docs_entry_title,  
 .LC_docs_editor td.LC_docs_entry_icon {  
   background: #FFFFBB;  
 }  
 .LC_docs_editor td.LC_docs_entry_parameter {  
   background: #BBBBFF;  
   font-size: x-small;  
   white-space: nowrap;  
 }  
   
 table.LC_docs_adddocs td,  table.LC_docs_adddocs td,
 table.LC_docs_adddocs th {  table.LC_docs_adddocs th {
   border: 1px solid #BBBBBB;    border: 1px solid #BBBBBB;
Line 5346  table.LC_docs_adddocs th { Line 5805  table.LC_docs_adddocs th {
 table.LC_sty_begin {  table.LC_sty_begin {
   background: #BBFFBB;    background: #BBFFBB;
 }  }
   
 table.LC_sty_end {  table.LC_sty_end {
   background: #FFBBBB;    background: #FFBBBB;
 }  }
   
 table.LC_double_column {  table.LC_double_column {
   border-width: 0px;    border-width: 0;
   border-collapse: collapse;    border-collapse: collapse;
   width: 100%;    width: 100%;
   padding: 2px;    padding: 2px;
Line 5366  table.LC_double_column tr td.LC_left_col Line 5826  table.LC_double_column tr td.LC_left_col
   
 table.LC_double_column tr td.LC_right_col {  table.LC_double_column tr td.LC_right_col {
   top: 2px;    top: 2px;
   right: 2px;     right: 2px;
   width: 47%;    width: 47%;
   vertical-align: top;    vertical-align: top;
 }  }
   
 span.LC_role_level {  
   font-weight: bold;  
 }  
   
 div.LC_left_float {  div.LC_left_float {
   float: left;    float: left;
   padding-right: 5%;    padding-right: 5%;
Line 5390  div.LC_clear_float_footer { Line 5846  div.LC_clear_float_footer {
   clear: both;    clear: both;
 }  }
   
   
 div.LC_grade_show_user {  div.LC_grade_show_user {
   margin-top: 20px;  /*  border-left: 5px solid $sidebg; */
   border: 1px solid black;    border-top: 5px solid #000000;
     margin: 50px 0 0 0;
     padding: 15px 0 5px 10px;
 }  }
 div.LC_grade_user_name {  
   background: #DDDDEE;  div.LC_grade_show_user_odd_row {
   border-bottom: 1px solid black;  /*  border-left: 5px solid #000000; */
   font-weight: bold;  
   font-size: large;  
 }  }
 div.LC_grade_show_user_odd_row div.LC_grade_user_name {  
   background: #DDEEDD;  div.LC_grade_show_user div.LC_Box {
     margin-right: 50px;
 }  }
   
 div.LC_grade_show_problem,  
 div.LC_grade_submissions,  div.LC_grade_submissions,
 div.LC_grade_message_center,  div.LC_grade_message_center,
 div.LC_grade_info_links,  div.LC_grade_info_links {
 div.LC_grade_assign {  
   margin: 5px;    margin: 5px;
   width: 99%;    width: 99%;
   background: #FFFFFF;    background: #FFFFFF;
 }  }
 div.LC_grade_show_problem_header,  
 div.LC_grade_submissions_header,  div.LC_grade_submissions_header,
 div.LC_grade_message_center_header,  div.LC_grade_message_center_header {
 div.LC_grade_assign_header {  
   font-weight: bold;    font-weight: bold;
   font-size: large;    font-size: large;
 }  }
 div.LC_grade_show_problem_problem,  
 div.LC_grade_submissions_body,  div.LC_grade_submissions_body,
 div.LC_grade_message_center_body,  div.LC_grade_message_center_body {
 div.LC_grade_assign_body {  
   border: 1px solid black;    border: 1px solid black;
   width: 99%;    width: 99%;
   background: #FFFFFF;    background: #FFFFFF;
 }  }
 span.LC_grade_check_note {  
   font-weight: normal;  
   font-size: medium;  
   display: inline;  
   position: absolute;  
   right: 1em;  
 }  
   
 table.LC_scantron_action {  table.LC_scantron_action {
   width: 100%;    width: 100%;
 }  }
   
 table.LC_scantron_action tr th {  table.LC_scantron_action tr th {
   font-weight:bold;    font-weight:bold;
   font-style:normal;    font-style:normal;
 }  }
 .LC_edit_problem_header,   
   .LC_edit_problem_header,
 div.LC_edit_problem_footer {  div.LC_edit_problem_footer {
   font-weight: normal;    font-weight: normal;
   font-size:  medium;    font-size:  medium;
   margin: 2px;    margin: 2px;
 }  }
   
 div.LC_edit_problem_header,  div.LC_edit_problem_header,
 div.LC_edit_problem_header div,  div.LC_edit_problem_header div,
 div.LC_edit_problem_footer,  div.LC_edit_problem_footer,
Line 5458  div.LC_edit_problem_editxml_header, Line 5906  div.LC_edit_problem_editxml_header,
 div.LC_edit_problem_editxml_header div {  div.LC_edit_problem_editxml_header div {
   margin-top: 5px;    margin-top: 5px;
 }  }
 div.LC_edit_problem_header_edit_row {  
   background: $tabbg;  
   padding: 3px;  
   margin-bottom: 5px;  
 }  
 div.LC_edit_problem_header_title {  div.LC_edit_problem_header_title {
   font-weight: bold;    font-weight: bold;
   font-size: larger;    font-size: larger;
   background: $tabbg;    background: $tabbg;
   padding: 3px;    padding: 3px;
 }  }
   
 table.LC_edit_problem_header_title {  table.LC_edit_problem_header_title {
   font-size: larger;  
   font-weight:  bold;  
   width: 100%;    width: 100%;
   border-color: $pgbg;  
   border-style: solid;  
   border-width: $border;  
   
   background: $tabbg;    background: $tabbg;
   border-collapse: collapse;  
   padding: 0px  
 }  }
   
 div.LC_edit_problem_discards {  div.LC_edit_problem_discards {
   float: left;    float: left;
   padding-bottom: 5px;    padding-bottom: 5px;
 }  }
   
 div.LC_edit_problem_saves {  div.LC_edit_problem_saves {
   float: right;    float: right;
   padding-bottom: 5px;    padding-bottom: 5px;
 }  }
 hr.LC_edit_problem_divide {  
   clear: both;  
   color: $tabbg;  
   background-color: $tabbg;  
   height: 3px;  
   border: 0px;  
 }  
 img.stift{  
   border-width:0;  
   vertical-align:middle;  
 }  
   
 table#LC_mainmenu{  
  margin-top:10px;  
  width:80%;  
   
   img.stift {
     border-width: 0;
     vertical-align: middle;
 }  }
   
 table#LC_mainmenu td.LC_mainmenu_col_fieldset{  table td.LC_mainmenu_col_fieldset {
   vertical-align: top;    vertical-align: top;
   width: 45%;  
 }  
 .LC_mainmenu_fieldset_category {   
   color: $font;            
   background: $pgbg;       
   font-family: $sans;      
   font-size: small;        
   font-weight: bold;       
 }  }
   
 div.LC_createcourse {  div.LC_createcourse {
     margin: 10px 10px 10px 10px;    margin: 10px 10px 10px 10px;
 }  }
   
 /* ---- Remove when done ----  .LC_dccid {
 # The following styles is part of the redesign of LON-CAPA and are    margin: 0.2em 0 0 0;
 # subject to change during this project.    padding: 0;
 # Don't rely on their current functionality as they might be     font-size: 90%;
 # changed or removed.    display:none;
 # --------------------------*/  }
   
 a:hover,  a:hover,
 ol.LC_smallMenu a:hover,  ol.LC_primary_menu a:hover,
 ol#LC_MenuBreadcrumbs a:hover,  ol#LC_MenuBreadcrumbs a:hover,
 ol#LC_PathBreadcrumbs a:hover,  ol#LC_PathBreadcrumbs a:hover,
 ul#LC_TabMainMenuContent 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:$button_hover;
         text-decoration:none;    text-decoration:none;
 }  }
   
 h1 {   h1 {
  padding:5px 10px 5px 20px;    padding: 0;
  line-height:130%;    line-height:130%;
 }  }
   
 h2,h3,h4,h5,h6  h2,
 {  h3,
  margin:5px 0px 5px 0px;  h4,
  padding:0px;  h5,
  line-height:130%;  h6 {
 }    margin: 5px 0 5px 0;
 .LC_hcell{    padding: 0;
         padding:3px 15px 3px 15px;    line-height:130%;
         margin:0px;  }
  background-color:$tabbg;  
  border-bottom:solid 1px $lg_border_color;         .LC_hcell {
     padding:3px 15px 3px 15px;
     margin: 0;
     background-color:$tabbg;
     color:$fontmenu;
     border-bottom:solid 1px $lg_border_color;
   }
   
   .LC_Box > .LC_hcell {
     margin: 0 -10px 10px -10px;
 }  }
   
 .LC_noBorder {  .LC_noBorder {
         border:0px;    border: 0;
 }  }
   
   .LC_FormSectionClearButton input {
     background-color:transparent;
     border: none;
     cursor:pointer;
     text-decoration:underline;
   }
   
 /* Main Header with discription of Person, Course, etc. */  .LC_help_open_topic {
     color: #FFFFFF;
     background-color: #EEEEFF;
     margin: 1px;
     padding: 4px;
     border: 1px solid #000033;
     white-space: nowrap;
     /* vertical-align: middle; */
   }
   
 .LC_Right {  dl,
         float: right;  ul,
         margin: 0px;  div,
         padding: 0px;  fieldset {
     margin: 10px 10px 10px 0;
     /* overflow: hidden; */
 }  }
   
 p, .LC_ContentBox {  fieldset > legend {
  padding: 10px;    font-weight: bold;
     padding: 0 5px 0 5px;
   }
   
   #LC_nav_bar {
     float: left;
     margin: 0 0 2px 0;
 }  }
 .LC_FormSectionClearButton input {  
         background-color:transparent;          #LC_realm {
         border:0px;    margin: 0.2em 0 0 0;
         cursor:pointer;    padding: 0;
         text-decoration:underline;    font-weight: bold;
     text-align: center;
 }  }
   
 .LC_help_open_topic {  #LC_nav_bar em {
         color: #FFFFFF;    font-weight: bold;
         background-color: #EEEEFF;    font-style: normal;
         margin: 1px;  
         padding: 4px;  
         border: 1px solid #000033;  
         white-space: nowrap;  
 }  }
   
 dl,ul,div,fieldset {  /* Preliminary fix to hide nav_bar inside bookmarks window */
  margin: 10px 10px 10px 0px;  #LC_bookmarks #LC_nav_bar {
  overflow:hidden;    display:none;
 }  }
 ol.LC_smallMenu, ol#LC_PathBreadcrumbs {  
  margin: 0px;  ol.LC_primary_menu {
     float: right;
     margin: 0;
 }  }
   
 ol.LC_smallMenu li {  ol#LC_PathBreadcrumbs {
  display: inline;    margin: 0;
  padding: 5px 5px 0px 10px;  
  vertical-align: top;  
 }  }
   
 ol.LC_smallMenu li img {  ol.LC_primary_menu li {
  vertical-align: bottom;    display: inline;
     padding: 5px 5px 0 10px;
     vertical-align: top;
 }  }
   
 ol.LC_smallMenu a {  ol.LC_primary_menu li img {
  font-size: 90%;    vertical-align: bottom;
  color: RGB(80, 80, 80);    height: 1.1em;
  text-decoration: none;  
 }  }
 ol#LC_TabMainMenuContent, ul.LC_TabContent ,  
 ul.LC_TabContentBigger {  ol.LC_primary_menu a {
  display:block;    color: RGB(80, 80, 80);
  list-style:none;    text-decoration: none;
  margin: 0px;  }
  padding: 0px;  
 }  ol.LC_primary_menu a.LC_new_message {
     font-weight:bold;
 ol#LC_TabMainMenuContent li, ul.LC_TabContent li,    color: darkred;
 ul.LC_TabContentBigger li{  
  display: inline;  
  border-right: solid 1px $lg_border_color;  
  float:left;  
  line-height:140%;  
  white-space:nowrap;  
 }  
 ol#LC_TabMainMenuContent li{  
  vertical-align: bottom;  
  border-bottom: solid 1px RGB(175, 175, 175);  
  padding: 5px 10px 5px 10px;  
  margin-right:5px;  
  margin-bottom:3px;  
  font-weight: bold;  
  background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top;  
 }  
   
 ol#LC_TabMainMenuContent li a{  
  color: RGB(47, 47, 47);  
  text-decoration: none;  
 }  }
   
   ul#LC_secondary_menu {
     clear: both;
     color: $fontmenu;
     background: $tabbg;
     list-style: none;
     padding: 0;
     margin: 0;
     width: 100%;
   }
   
   ul#LC_secondary_menu li {
     font-weight: bold;
     line-height: 1.8em;
     padding: 0 0.8em;
     border-right: 1px solid black;
     display: inline;
     vertical-align: middle;
   }
   
 ul.LC_TabContent {  ul.LC_TabContent {
  min-height:1.6em;    display:block;
     background: $sidebg;
     border-bottom: solid 1px $lg_border_color;
     list-style:none;
     margin: 0 -10px;
     padding: 0;
 }  }
 ul.LC_TabContent li{  
  vertical-align:middle;  ul.LC_TabContent li,
  padding:0px 10px 0px 10px;  ul.LC_TabContentBigger li {
  background-color:$tabbg;    float:left;
  border-bottom:solid 1px $lg_border_color;  
 }  
 ul.LC_TabContent li a, ul.LC_TabContent li{   
  color:rgb(47,47,47);  
  text-decoration:none;  
  font-size:95%;  
  font-weight:bold;  
  padding-right: 16px;  
 }  
 ul.LC_TabContent li:hover, ul.LC_TabContent li.active{  
         background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;  
  border-bottom:solid 1px #FFFFFF;  
  padding-right: 16px;  
 }  
 ul.LC_TabContentBigger li{  
  vertical-align:bottom;  
  border-top:solid 1px $lg_border_color;  
  border-left:solid 1px $lg_border_color;  
  padding:5px 10px 5px 10px;  
  margin-left:2px;  
  background:url(/adm/lonIcons/lightGreyBG.png) repeat-x left top;  
 }  
 ul.LC_TabContentBigger li:hover, ul.LC_TabContentBigger li.active{  
  background:url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom;  
 }  
 ul.LC_TabContentBigger li, ul.LC_TabContentBigger li a{  
  font-size:110%;  
  font-weight:bold;  
 }  
   
 ol#LC_MenuBreadcrumbs, ol#LC_PathBreadcrumbs {  
  border-top: solid 1px RGB(255, 255, 255);  
  height: 20px;  
  line-height: 20px;  
  vertical-align: bottom;  
  margin: 0px 0px 30px 0px;  
  padding-left: 10px;  
  list-style-position: inside;  
  background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top;  
 }  }
   
 ol#LC_MenuBreadcrumbs li, ol#LC_PathBreadcrumbs li {  ul#LC_secondary_menu li a {
 /*    color: $fontmenu;
  background: url(/adm/lonIcons/arrow_white.png) no-repeat left center;    text-decoration: none;
 */  
  display: inline;  
  padding: 0px 0px 0px 10px;  
  vertical-align: bottom;  
  overflow:hidden;  
 }  
   
 ol#LC_MenuBreadcrumbs li a {  
  text-decoration: none;  
  font-size:90%;  
 }  
 ol#LC_PathBreadcrumbs li a{  
  text-decoration:none;  
  font-size:100%;  
  font-weight:bold;  
 }  }
 .LC_ContentBoxSpecial  
 {  ul.LC_TabContent {
  border: solid 1px $lg_border_color;    min-height:20px;
 }  }
 .LC_ContentBoxSpecialContactInfo  
 {  ul.LC_TabContent li {
  border: solid 1px $lg_border_color;    vertical-align:middle;
  max-width:25%;    padding: 0 16px 0 10px;
  min-width:25%;    background-color:$tabbg;
     border-bottom:solid 1px $lg_border_color;
     border-right: solid 1px $font;
 }  }
 .LC_AboutMe_Image  
 {  ul.LC_TabContent .right {
  float:left;    float:right;
  margin-right:10px;  
 }  }
 .LC_Clear_AboutMe_Image  
 {  ul.LC_TabContent li a,
  clear:left;  ul.LC_TabContent li {
     color:rgb(47,47,47);
     text-decoration:none;
     font-size:95%;
     font-weight:bold;
     min-height:20px;
   }
   
   ul.LC_TabContent li a:hover,
   ul.LC_TabContent li a:focus {
     color: $button_hover;
     background:none;
     outline:none;
   }
   
   ul.LC_TabContent li:hover {
     color: $button_hover;
     cursor:pointer;
   }
   
   ul.LC_TabContent li.active {
     color: $font;
     background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;
     border-bottom:solid 1px #FFFFFF;
     cursor: default;
   }
   
   ul.LC_TabContent li.active a {
     color:$font;
     background:#FFFFFF;
     outline: none;
   }
   #maincoursedoc {
     clear:both;
   }
   
   ul.LC_TabContentBigger {
     display:block;
     list-style:none;
     padding: 0;
   }
   
   ul.LC_TabContentBigger li {
     vertical-align:bottom;
     height: 30px;
     font-size:110%;
     font-weight:bold;
     color: #737373;
   }
   
   ul.LC_TabContentBigger li.active {
     position: relative;
     top: 1px;
   }
   
   ul.LC_TabContentBigger li a {
     background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;
     height: 30px;
     line-height: 30px;
     text-align: center;
     display: block;
     text-decoration: none;
     outline: none;  
   }
   
   ul.LC_TabContentBigger li.active a {
     background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;
     color:$font;
   }
   
   ul.LC_TabContentBigger li b {
     background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;
     display: block;
     float: left;
     padding: 0 30px;
     border-bottom: 1px solid $lg_border_color;
   }
   
   ul.LC_TabContentBigger li:hover b {
     color:$button_hover;
   }
   
   ul.LC_TabContentBigger li.active b {
     background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;
     color:$font;
     border: 0;
     cursor:default;
   }
   
   
   ul.LC_CourseBreadcrumbs {
     background: $sidebg;
     line-height: 32px;
     padding-left: 10px;
     margin: 0 0 10px 0;
     list-style-position: inside;
   
   }
   
   ol#LC_MenuBreadcrumbs,
   ol#LC_PathBreadcrumbs {
     padding-left: 10px;
     margin: 0;
     height: 2.5em;  /* equal to #LC_breadcrumbs line-height */
   }
   
   ol#LC_MenuBreadcrumbs li,
   ol#LC_PathBreadcrumbs li,
   ul.LC_CourseBreadcrumbs li {
     display: inline;
     white-space: normal;  
   }
   
   ol#LC_MenuBreadcrumbs li a,
   ul.LC_CourseBreadcrumbs li a {
     text-decoration: none;
     font-size:90%;
   }
   
   ol#LC_PathBreadcrumbs li a {
     text-decoration:none;
     font-size:100%;
     font-weight:bold;
   }
   
   .LC_Box {
     border: solid 1px $lg_border_color;
     padding: 0 10px 10px 10px;
   }
   
   .LC_AboutMe_Image {
     float:left;
     margin-right:10px;
   }
   
   .LC_Clear_AboutMe_Image {
     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; */
  {    list-style-position: inside;
  /*display:block; */    list-style-type: none;
  list-style-position: inside;    overflow: hidden;
  list-style-type: none;    padding: 0;
  overflow: hidden;  
  padding: 0px;  
 }  }
   
 .LC_ListStyleSimple li,  .LC_ListStyleSimple li,
Line 5757  dl.LC_ListStyleClean dd { Line 6292  dl.LC_ListStyleClean dd {
 .LC_ListStyleNormal li,  .LC_ListStyleNormal li,
 .LC_ListStyleNormal dd,  .LC_ListStyleNormal dd,
 .LC_ListStyleSpecial li,  .LC_ListStyleSpecial li,
 .LC_ListStyleSpecial dd  .LC_ListStyleSpecial dd {
  {    margin: 0;
  margin: 0px;    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: 0px;    padding-top: 0;
  padding-bottom: 0px;    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:0px;    padding: 0;
  border:solid 1px $lg_border_color;    border:solid 1px $lg_border_color;
 }  }
 table.LC_SimpleTable thead{  
  background:rgb(220,220,220);  table.LC_SimpleTable thead {
     background:rgb(220,220,220);
 }  }
   
 div.LC_columnSection {  div.LC_columnSection {
  display: block;    display: block;
  clear: both;    clear: both;
  overflow: hidden;    overflow: hidden;
  margin:0px;    margin: 0;
 }  }
   
 div.LC_columnSection>* {  div.LC_columnSection>* {
  float: left;    float: left;
  margin: 10px 20px 10px 0px;    margin: 10px 20px 10px 0;
  overflow:hidden;    overflow:hidden;
 }  
   
 .ContentBoxSpecialTemplate  
 {  
         border: solid 1px $lg_border_color;  
 }  
 .ContentBoxTemplate {  
         padding:10px;  
 }  
   
 div.LC_columnSection > .ContentBoxTemplate,  
 div.LC_columnSection > .ContentBoxSpecialTemplate  
         {  
         width: 600px;  
 }  }
   
 .clear{  table em {
  clear: both;    font-weight: bold;
  line-height: 0px;    font-style: normal;
  font-size: 0px;  
  height: 0px;  
 }  }
   
 .LC_loginpage_container {  table.LC_tableBrowseRes,
  text-align:left;  table.LC_tableOfContent {
  margin : 0 auto;    border:none;
  width:65%;    border-spacing: 1px;
  padding: 10px;    padding: 3px;
  height: auto;    background-color: #FFFFFF;
  background-color:#FFFFFF;    font-size: 90%;
  border:1px solid #CCCCCC;  
 }  }
   
   table.LC_tableOfContent {
 .LC_loginpage_loginContainer {    border-collapse: collapse;
  float:left;  
  width: 182px;  
  border:1px solid #CCCCCC;  
  background-color:$loginbg;  
 }  }
   
 .LC_loginpage_loginContainer h2{  table.LC_tableBrowseRes a,
  margin-top:0;  table.LC_tableOfContent a {
  display:block;    background-color: transparent;
  background:$bgcol;    text-decoration: none;
  color:$textcol;  
  padding-left:5px;  
 }  
 .LC_loginpage_loginInfo {  
  margin-left:20px;  
  float:left;  
  width:30%;  
  border:1px solid #CCCCCC;  
  padding:10px;  
 }  }
   
 .LC_loginpage_loginDomain {  table.LC_tableOfContent img {
  margin-right:20px;    border: none;
  width:20%;    height: 1.3em;
  float:left;    vertical-align: text-bottom;
  padding:10px;    margin-right: 0.3em;
 }  }
   
 .LC_loginpage_space {  a#LC_content_toolbar_firsthomework {
  clear: both;    background-image:url(/res/adm/pages/open-first-problem.gif);
  margin-bottom: 20px;  
  border-bottom: 1px solid #CCCCCC;  
 }  }
   
 table em{  a#LC_content_toolbar_everything {
  font-weight: bold;    background-image:url(/res/adm/pages/show-all.gif);
  font-style: normal;  
 }  
 table.LC_tableBrowseRes,   
 table.LC_tableOfContent{  
         border:none;  
  border-spacing: 1;  
  padding: 3px;  
  background-color: #FFFFFF;  
  font-size: 90%;  
 }  
 table.LC_tableBrowseRes a,  
 table.LC_tableOfContent a {  
         background-color: transparent;  
  text-decoration: none;  
 }  }
   
 table.LC_tableBrowseRes tr.LC_trOdd,  a#LC_content_toolbar_uncompleted {
 table.LC_tableOfContent tr.LC_trOdd{    background-image:url(/res/adm/pages/show-incomplete-problems.gif);
  background-color: #EEEEEE;  
 }  }
   
 table.LC_tableOfContent img{  #LC_content_toolbar_clearbubbles {
  border: none;    background-image:url(/res/adm/pages/mark-discussionentries-read.gif);
  height: 1.3em;  
  vertical-align: text-bottom;  
  margin-right: 0.3em;  
 }  }
   
 a#LC_content_toolbar_firsthomework{  a#LC_content_toolbar_changefolder {
  background-image:url(/res/adm/pages/open-first-problem.gif);    background : url(/res/adm/pages/close-all-folders.gif) top center ;
 }  }
   
 a#LC_content_toolbar_launchnav{  a#LC_content_toolbar_changefolder_toggled {
  background-image:url(/res/adm/pages/start-navigation.gif);    background-image:url(/res/adm/pages/open-all-folders.gif);
 }  }
   
 a#LC_content_toolbar_closenav{  ul#LC_toolbar li a:hover {
  background-image:url(/res/adm/pages/close-navigation.gif);    background-position: bottom center;
 }  }
   
 a#LC_content_toolbar_everything{  ul#LC_toolbar {
  background-image:url(/res/adm/pages/show-all.gif);    padding: 0;
     margin: 2px;
     list-style:none;
     position:relative;
     background-color:white;
 }  }
   
 a#LC_content_toolbar_uncompleted{  ul#LC_toolbar li {
  background-image:url(/res/adm/pages/show-incomplete-problems.gif);    border:1px solid white;
     padding: 0;
     margin: 0;
     float: left;
     display:inline;
     vertical-align:middle;
 }  }
   
 #LC_content_toolbar_clearbubbles{  
  background-image:url(/res/adm/pages/mark-discussionentries-read.gif);  
 }  
   
 a#LC_content_toolbar_changefolder{  a.LC_toolbarItem {
  background : url(/res/adm/pages/close-all-folders.gif) top center ;    display:block;
     padding: 0;
     margin: 0;
     height: 32px;
     width: 32px;
     color:white;
     border: none;
     background-repeat:no-repeat;
     background-color:transparent;
 }  }
   
 a#LC_content_toolbar_changefolder_toggled{  ul.LC_funclist {
  background-image:url(/res/adm/pages/open-all-folders.gif);      margin: 0;
       padding: 0.5em 1em 0.5em 0;
 }  }
   
 ul#LC_toolbar li a:hover{  ul.LC_funclist > li:first-child {
  background-position: bottom center;      font-weight:bold; 
       margin-left:0.8em;
 }  }
   
 ul#LC_toolbar{  ul.LC_funclist + ul.LC_funclist {
  padding:0;       /* 
  margin: 2px;         left border as a seperator if we have more than
  list-style:none;         one list 
  position:relative;      */
  background-color:white;      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_toolbar li{  ul.LC_funclist li {
  border:1px solid white;    display: inline;
  padding:0;    white-space: nowrap;
  margin: 0;    margin: 0 0 0 25px;
     float: left;    line-height: 150%;
  display:inline;  
  vertical-align:middle;  
 }  }
   
 a.LC_toolbarItem{  .ui-accordion .LC_advanced_toggle {
  display:block;    float: right;
  padding:0;    font-size: 90%;
  margin:0;    padding: 0px 4px
  height: 32px;  
  width: 32px;  
  color:white;   
  border:0 none;  
  background-repeat:no-repeat;  
  background-color:transparent;  
 }  }
   
   
 END  END
 }  }
   
Line 6022  sub headtag { Line 6519  sub headtag {
     if (!$args->{'frameset'}) {      if (!$args->{'frameset'}) {
  $result .= &Apache::lonhtmlcommon::htmlareaheaders();   $result .= &Apache::lonhtmlcommon::htmlareaheaders();
     }      }
     if ($args->{'force_register'}) {      if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) {
  $result .= &Apache::lonmenu::registerurl(1);          $result .= Apache::lonxml::display_title();
     }      }
     if (!$args->{'no_nav_bar'}       if (!$args->{'no_nav_bar'} 
  && !$args->{'only_body'}   && !$args->{'only_body'}
Line 6049  ADDMETA Line 6546  ADDMETA
     $result .= '<title> LON-CAPA '.$title.'</title>'      $result .= '<title> LON-CAPA '.$title.'</title>'
  .'<link rel="stylesheet" type="text/css" href="'.$url.'" />'   .'<link rel="stylesheet" type="text/css" href="'.$url.'" />'
  .$head_extra;   .$head_extra;
     return $result;      return $result.'</head>';
 }  }
   
 =pod  =pod
Line 6098  sub xml_begin { Line 6595  sub xml_begin {
             .'<html xmlns:math="http://www.w3.org/1998/Math/MathML" '               .'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' 
     .'xmlns="http://www.w3.org/1999/xhtml">';      .'xmlns="http://www.w3.org/1999/xhtml">';
     } else {      } else {
  $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>';   $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
              .'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">';
     }      }
     return $output;      return $output;
 }  }
   
 =pod  =pod
   
 =item * &endheadtag()  
   
 Returns a uniform </head> for LON-CAPA web pages.  
   
 Inputs: none  
   
 =cut  
   
 sub endheadtag {  
     return '</head>';  
 }  
   
 =pod  
   
 =item * &head()  
   
 Returns a uniform complete <head>..</head> section for LON-CAPA web pages.  
   
 Inputs:  
   
 =over 4  
   
 $title - optional title for the page  
   
 $head_extra - optional extra HTML to put inside the <head>  
   
 =back  
   
 =cut  
   
 sub head {  
     my ($title,$head_extra,$args) = @_;  
     return &headtag($title,$head_extra,$args).&endheadtag();  
 }  
   
 =pod  
   
 =item * &start_page()  =item * &start_page()
   
 Returns a complete <html> .. <body> section for LON-CAPA web pages.  Returns a complete <html> .. <body> section for LON-CAPA web pages.
Line 6160  $args - additional optional args support Line 6621  $args - additional optional args support
   
              only_body      -> is true will set &bodytag() onlybodytag               only_body      -> is true will set &bodytag() onlybodytag
                                     arg on                                      arg on
              no_nav_bar     -> is true will set &bodytag() notopbar arg on               no_nav_bar     -> is true will set &bodytag() no_nav_bar arg on
              add_entries    -> additional attributes to add to the  <body>               add_entries    -> additional attributes to add to the  <body>
              domain         -> force to color decorate a page for a                domain         -> force to color decorate a page for a 
                                     specific domain                                      specific domain
Line 6174  $args - additional optional args support Line 6635  $args - additional optional args support
                                     a html attribute                                      a html attribute
              force_register -> if is true will turn on the &bodytag()               force_register -> if is true will turn on the &bodytag()
                                     $forcereg arg                                      $forcereg arg
              body_title     -> alternate text to use instead of $title  
                                     in the title box that appears, this text  
                                     is not auto translated like the $title is  
              frameset       -> if true will start with a <frameset>               frameset       -> if true will start with a <frameset>
                                     rather than <body>                                      rather than <body>
              no_title       -> if true the title bar won't be shown  
              skip_phases    -> hash ref of                skip_phases    -> hash ref of 
                                     head -> skip the <html><head> generation                                      head -> skip the <html><head> generation
                                     body -> skip all <body> generation                                      body -> skip all <body> generation
              no_inline_link -> if true and in remote mode, don't show the   
                                     'Switch To Inline Menu' link  
              no_auto_mt_title -> prevent &mt()ing the title arg               no_auto_mt_title -> prevent &mt()ing the title arg
              inherit_jsmath -> when creating popup window in a page,               inherit_jsmath -> when creating popup window in a page,
                                     should it have jsmath forced on by the                                      should it have jsmath forced on by the
                                     current page                                      current page
                bread_crumbs ->             Array containing breadcrumbs
                bread_crumbs_components ->  if exists show it as headline else show only the breadcrumbs
   
 =back  =back
   
Line 6199  $args - additional optional args support Line 6656  $args - additional optional args support
 sub start_page {  sub start_page {
     my ($title,$head_extra,$args) = @_;      my ($title,$head_extra,$args) = @_;
     #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));      #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));
   #SD
   #I don't see why we copy certain elements of %$args to %head_args
   #head args is passed to headtag() and this routine only reads those
   #keys that are needed. There doesn't happen any writes or any processing
   #of other keys.
   #proposal: just pass $args to headtag instead of \%head_args and delete 
   #marked lines
   #<- MARK
     my %head_args;      my %head_args;
     foreach my $arg ('redirect','force_register','domain','function',      foreach my $arg ('redirect','force_register','domain','function',
      'bgcolor','frameset','no_nav_bar','only_body',       'bgcolor','frameset','no_nav_bar','only_body',
Line 6207  sub start_page { Line 6672  sub start_page {
     $head_args{$arg} = $args->{$arg};      $head_args{$arg} = $args->{$arg};
  }   }
     }      }
   #MARK ->
   
     $env{'internal.start_page'}++;      $env{'internal.start_page'}++;
     my $result;      my $result;
   
     if (! exists($args->{'skip_phases'}{'head'}) ) {      if (! exists($args->{'skip_phases'}{'head'}) ) {
  $result.=          $result .= 
     &xml_begin().                    &xml_begin() . &headtag($title,$head_extra,\%head_args);
     &headtag($title,$head_extra,\%head_args).&endheadtag();  #replace prev line by
   #                 &xml_begin() . &headtag($title, $head_extra, $args);
     }      }
           
     if (! exists($args->{'skip_phases'}{'body'}) ) {      if (! exists($args->{'skip_phases'}{'body'}) ) {
Line 6221  sub start_page { Line 6689  sub start_page {
     my $attr_string = &make_attr_string($args->{'force_register'},      my $attr_string = &make_attr_string($args->{'force_register'},
  $args->{'add_entries'});   $args->{'add_entries'});
     $result .= "\n<frameset $attr_string>\n";      $result .= "\n<frameset $attr_string>\n";
  } else {          } else {
     $result .=              $result .=
  &bodytag($title,                   &bodytag($title, 
  $args->{'function'},       $args->{'add_entries'},                           $args->{'function'},       $args->{'add_entries'},
  $args->{'only_body'},      $args->{'domain'},                           $args->{'only_body'},      $args->{'domain'},
  $args->{'force_register'}, $args->{'body_title'},                           $args->{'force_register'}, $args->{'no_nav_bar'},
  $args->{'no_nav_bar'},     $args->{'bgcolor'},                           $args->{'bgcolor'},        $args);
  $args->{'no_title'},       $args->{'no_inline_link'},          }
  $args);  
  }  
     }      }
   
     if ($args->{'js_ready'}) {      if ($args->{'js_ready'}) {
Line 6240  sub start_page { Line 6706  sub start_page {
  $result = &html_encode($result);   $result = &html_encode($result);
     }      }
   
  #Breadcrumbs      # Preparation for new and consistent functionlist at top of screen
       # if ($args->{'functionlist'}) {
       #            $result .= &build_functionlist();
       #}
   
       # Don't add anything more if only_body wanted or in const space
       return $result if    $args->{'only_body'} 
                         || $env{'request.state'} eq 'construct';
   
       #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();
  #if any br links exists, add them to the breadcrumbs   #if any br links exists, add them to the breadcrumbs
Line 6260  sub start_page { Line 6735  sub start_page {
     return $result;      return $result;
 }  }
   
   
 =pod  
   
 =item * &head()  
   
 Returns a complete </body></html> section for LON-CAPA web pages.  
   
 Inputs:         $args - additional optional args supported are:  
                  js_ready     -> return a string ready for being used in   
                                  a javascript writeln  
                  html_encode  -> return a string ready for being used in   
                                  a html attribute  
                  frameset     -> if true will start with a <frameset>  
                                  rather than <body>  
                  dicsussion   -> if true will get discussion from  
                                   lonxml::xmlend  
                                  (you can pass the target and parser arguments  
                                   through optional 'target' and 'parser' args  
                                   to this routine)  
   
 =cut  
   
 sub end_page {  sub end_page {
     my ($args) = @_;      my ($args) = @_;
     $env{'internal.end_page'}++;      $env{'internal.end_page'}++;
Line 6371  sub simple_error_page { Line 6824  sub simple_error_page {
   
 {  {
     my @row_count;      my @row_count;
   
       sub start_data_table_count {
           unshift(@row_count, 0);
           return;
       }
   
       sub end_data_table_count {
           shift(@row_count);
           return;
       }
   
     sub start_data_table {      sub start_data_table {
  my ($add_class) = @_;   my ($add_class) = @_;
  my $css_class = (join(' ','LC_data_table',$add_class));   my $css_class = (join(' ','LC_data_table',$add_class));
  unshift(@row_count,0);   &start_data_table_count();
  return '<table class="'.$css_class.'">'."\n";   return '<table class="'.$css_class.'">'."\n";
     }      }
   
     sub end_data_table {      sub end_data_table {
  shift(@row_count);   &end_data_table_count();
  return '</table>'."\n";;   return '</table>'."\n";;
     }      }
   
Line 6387  sub simple_error_page { Line 6851  sub simple_error_page {
  my ($add_class) = @_;   my ($add_class) = @_;
  $row_count[0]++;   $row_count[0]++;
  my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';   my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
  $css_class = (join(' ',$css_class,$add_class));   $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
  return  '<tr class="'.$css_class.'">'."\n";;   return  '<tr class="'.$css_class.'">'."\n";;
     }      }
           
     sub continue_data_table_row {      sub continue_data_table_row {
  my ($add_class) = @_;   my ($add_class) = @_;
  my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';   my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
  $css_class = (join(' ',$css_class,$add_class));   $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');;
  return  '<tr class="'.$css_class.'">'."\n";;   return  '<tr class="'.$css_class.'">'."\n";;
     }      }
   
Line 6418  sub simple_error_page { Line 6882  sub simple_error_page {
     sub end_data_table_header_row {      sub end_data_table_header_row {
  return '</tr>'."\n";;   return '</tr>'."\n";;
     }      }
   
       sub data_table_caption {
           my $caption = shift;
           return "<caption class=\"LC_caption\">$caption</caption>";
       }
 }  }
   
 =pod  =pod
Line 6484  Returns either 'student','coordinator',' Line 6953  Returns either 'student','coordinator','
   
 ###############################################  ###############################################
 sub get_users_function {  sub get_users_function {
     my $function = 'student';      my $function = 'norole';
     if ($env{'request.role'}=~/^(cc|in|ta|ep)/) {      if ($env{'request.role'}=~/^(st)/) {
           $function='student';
       }
       if ($env{'request.role'}=~/^(cc|co|in|ta|ep)/) {
         $function='coordinator';          $function='coordinator';
     }      }
     if ($env{'request.role'}=~/^(su|dc|ad|li)/) {      if ($env{'request.role'}=~/^(su|dc|ad|li)/) {
         $function='admin';          $function='admin';
     }      }
     if (($env{'request.role'}=~/^(au|ca)/) ||      if (($env{'request.role'}=~/^(au|ca|aa)/) ||
         ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) {          ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) {
         $function='author';          $function='author';
     }      }
Line 6502  sub get_users_function { Line 6974  sub get_users_function {
   
 =pod  =pod
   
   =item * &show_course()
   
   Used by lonmenu.pm and lonroles.pm to determine whether to use the word
   'Courses' or 'Roles' in inline navigation and on screen displaying user's roles.
   
   Inputs:
   None
   
   Outputs:
   Scalar: 1 if 'Course' to be used, 0 otherwise.
   
   =cut
   
   ###############################################
   sub show_course {
       my $course = !$env{'user.adv'};
       if (!$env{'user.adv'}) {
           foreach my $env (keys(%env)) {
               next if ($env !~ m/^user\.priv\./);
               if ($env !~ m/^user\.priv\.(?:st|cm)/) {
                   $course = 0;
                   last;
               }
           }
       }
       return $course;
   }
   
   ###############################################
   
   =pod
   
 =item * &check_user_status()  =item * &check_user_status()
   
 Determines current status of supplied role for a  Determines current status of supplied role for a
Line 6524  sub check_user_status { Line 7028  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 7005  If the user's status includes multiple t Line 7509  If the user's status includes multiple t
 the largest default quota which applies to the user determines the  the largest default quota which applies to the user determines the
 default quota returned.  default quota returned.
   
   =back
   
 =cut  =cut
   
 ###############################################  ###############################################
Line 7153  sub user_picker { Line 7659  sub user_picker {
         #       loncreateuser::print_user_query_page()          #       loncreateuser::print_user_query_page()
         #       has been completed.          #       has been completed.
         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{'request.course.id'});          next if ($option eq 'crs' && !$env{'request.course.id'});
         if ($curr_selected{'srchin'} eq $option) {          if ($curr_selected{'srchin'} eq $option) {
             $srchinsel .= '               $srchinsel .= ' 
Line 7196  sub user_picker { Line 7703  sub user_picker {
                 if ($cancreate) {                  if ($cancreate) {
                     $new_user_create = '<p> <input type="submit" name="forcenew" value="'.&HTML::Entities::encode(&mt('Make new user "[_1]"',$srchterm),'<>&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" /> </p>';                      $new_user_create = '<p> <input type="submit" name="forcenew" value="'.&HTML::Entities::encode(&mt('Make new user "[_1]"',$srchterm),'<>&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" /> </p>';
                 } else {                  } else {
                     my $helplink = ' href="javascript:helpMenu('."'display'".')"';                      my $helplink = 'javascript:helpMenu('."'display'".')';
                     my %usertypetext = (                      my %usertypetext = (
                         official   => 'institutional',                          official   => 'institutional',
                         unofficial => 'non-institutional',                          unofficial => 'non-institutional',
                     );                      );
                     $new_user_create = '<br /><span class="LC_warning">'.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the <a[_1]>helpdesk</a> for assistance.',$helplink).'</span><br /><br />';                      $new_user_create = '<p class="LC_warning">'
                                         .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
                                         .' '
                                         .&mt('Please contact the [_1]helpdesk[_2] for assistance.'
                                             ,'<a href="'.$helplink.'">','</a>')
                                         .'</p><br />';
                 }                  }
             }              }
         }          }
Line 7238  ENDSCRIPT Line 7750  ENDSCRIPT
   
     my $output = <<"END_BLOCK";      my $output = <<"END_BLOCK";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function validateEntry(callingForm) {  function validateEntry(callingForm) {
   
     var checkok = 1;      var checkok = 1;
Line 7306  function validateEntry(callingForm) { Line 7819  function validateEntry(callingForm) {
   
 $newuserscript  $newuserscript
   
   // ]]>
 </script>  </script>
   
 $new_user_create  $new_user_create
   
 <table>  
  <tr>  
   <td>$lt{'doma'}:</td>  
   <td>$domform</td>  
   </td>  
  </tr>  
  <tr>  
   <td>$lt{'usr'}:</td>  
   <td>$srchbysel  
       $srchtypesel   
       <input type="text" size="15" name="srchterm" value="$srchterm" />  
       $srchinsel   
   </td>  
  </tr>  
 </table>  
 <br />  
 END_BLOCK  END_BLOCK
   
       $output .= &Apache::lonhtmlcommon::start_pick_box().
                  &Apache::lonhtmlcommon::row_title($lt{'doma'}).
                  $domform.
                  &Apache::lonhtmlcommon::row_closure().
                  &Apache::lonhtmlcommon::row_title($lt{'usr'}).
                  $srchbysel.
                  $srchtypesel. 
                  '<input type="text" size="15" name="srchterm" value="'.$srchterm.'" />'.
                  $srchinsel.
                  &Apache::lonhtmlcommon::row_closure(1)
                  &Apache::lonhtmlcommon::end_pick_box().
                  '<br />';
     return $output;      return $output;
 }  }
   
Line 7553  sub get_institutional_codes { Line 8063  sub get_institutional_codes {
   
 =pod  =pod
   
   =head1 Slot Helpers
   
   =over 4
   
   =item * sorted_slots()
   
   Sorts an array of slot names in order of slot start time (earliest first). 
   
   Inputs:
   
   =over 4
   
   slotsarr  - Reference to array of unsorted slot names.
   
   slots     - Reference to hash of hash, where outer hash keys are slot names.
   
   =back
   
   Returns:
   
   =over 4
   
   sorted   - An array of slot names sorted by the start time of the slot.
   
   =back
   
 =back  =back
   
   =cut
   
   
   sub sorted_slots {
       my ($slotsarr,$slots) = @_;
       my @sorted;
       if ((ref($slotsarr) eq 'ARRAY') && (ref($slots) eq 'HASH')) {
           @sorted =
               sort {
                        if (ref($slots->{$a}) && ref($slots->{$b})) {
                            return $slots->{$a}{'starttime'} <=> $slots->{$b}{'starttime'}
                        }
                        if (ref($slots->{$a})) { return -1;}
                        if (ref($slots->{$b})) { return 1;}
                        return 0;
                    } @{$slotsarr};
       }
       return @sorted;
   }
   
   
   =pod
   
 =head1 HTTP Helpers  =head1 HTTP Helpers
   
 =over 4  =over 4
Line 8151  sub csv_print_samples { Line 8710  sub csv_print_samples {
     $r->print(&mt('Samples').'<br />'.&start_data_table().      $r->print(&mt('Samples').'<br />'.&start_data_table().
               &start_data_table_header_row());                &start_data_table_header_row());
     foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) {       foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { 
         $r->print('<th>'.&mt('Column&nbsp;[_1]',($sample+1)).'</th>'); }          $r->print('<th>'.&mt('Column [_1]',($sample+1)).'</th>'); }
     $r->print(&end_data_table_header_row());      $r->print(&end_data_table_header_row());
     foreach my $hash (@$samples) {      foreach my $hash (@$samples) {
  $r->print(&start_data_table_row());   $r->print(&start_data_table_row());
Line 8195  sub csv_print_select_table { Line 8754  sub csv_print_select_table {
  my ($value,$display,$defaultcol)=@{ $array_ref };   my ($value,$display,$defaultcol)=@{ $array_ref };
  $r->print(&start_data_table_row().'<td>'.$display.'</td>');   $r->print(&start_data_table_row().'<td>'.$display.'</td>');
   
  $r->print('<td><select name=f'.$i.   $r->print('<td><select name="f'.$i.'"'.
   ' onchange="javascript:flip(this.form,'.$i.');">');    ' onchange="javascript:flip(this.form,'.$i.');">');
  $r->print('<option value="none"></option>');   $r->print('<option value="none"></option>');
  foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) {   foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) {
Line 8849  sub restore_settings { Line 9408  sub restore_settings {
   
 =item * &build_recipient_list()  =item * &build_recipient_list()
   
 Build recipient lists for four types of e-mail:  Build recipient lists for five types of e-mail:
 (a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors  (a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors
 (d) Help requests, generated by  (d) Help requests, (e) Course requests needing approval,  generated by
 lonerrorhandler.pm, CHECKRPMS, loncron, and lonsupportreq.pm respectively.  lonerrorhandler.pm, CHECKRPMS, loncron, lonsupportreq.pm and
   loncoursequeueadmin.pm respectively.
   
 Inputs:  Inputs:
 defmail (scalar - email address of default recipient),   defmail (scalar - email address of default recipient), 
Line 9022  sub extract_categories { Line 9582  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 9134  cathash - reference to hash of categorie Line 9696  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 9148  sub assign_categories_table { Line 9712  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 9164  sub assign_categories_table { Line 9733  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 9420  sub check_clone { Line 9997  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 ($env{'request.role.domain'} eq $args->{'clonedomain'}) {          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'}) && 
               (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) {
     $can_clone = 1;      $can_clone = 1;
  } else {   } else {
     my %clonehash = &Apache::lonnet::get('environment',['cloners'],      my %clonehash = &Apache::lonnet::get('environment',['cloners'],
Line 9436  sub check_clone { Line 10027  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 {                  } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) {
                     $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'});                      $can_clone = 1;
                   } else {
                       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 9453  sub check_clone { Line 10054  sub check_clone {
 }  }
   
 sub construct_course {  sub construct_course {
     my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context) = @_;      my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,$cnum,$category) = @_;
     my $outcome;      my $outcome;
     my $linefeed =  '<br />'."\n";      my $linefeed =  '<br />'."\n";
     if ($context eq 'auto') {      if ($context eq 'auto') {
Line 9491  sub construct_course { Line 10092  sub construct_course {
                                              $args->{'crscode'},                                               $args->{'crscode'},
                                              $args->{'ccuname'}.':'.                                               $args->{'ccuname'}.':'.
                                              $args->{'ccdomain'},                                               $args->{'ccdomain'},
                                              $args->{'crstype'});                                               $args->{'crstype'},
                                                $cnum,$context,$category);
   
     # Note: The testing routines depend on this being output; see       # Note: The testing routines depend on this being output; see 
     # Utils::Course. This needs to at least be output as a comment      # Utils::Course. This needs to at least be output as a comment
     # if anyone ever decides to not show this, and Utils::Course::new      # if anyone ever decides to not show this, and Utils::Course::new
     # will need to be suitably modified.      # will need to be suitably modified.
     $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed;      $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed;
       if ($$courseid =~ /^error:/) {
           return (0,$outcome);
       }
   
 #  #
 # Check if created correctly  # Check if created correctly
 #  #
     ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);      ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);
     my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);      my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);
       if ($crsuhome eq 'no_host') {
           $outcome .= &mt('Course creation failed, unrecognized course home server.').$linefeed;
           return (0,$outcome);
       }
     $outcome .= &mt('Created on').': '.$crsuhome.$linefeed;      $outcome .= &mt('Created on').': '.$crsuhome.$linefeed;
   
 #  #
Line 9521  sub construct_course { Line 10131  sub construct_course {
  $cenv{'url'}=$oldcenv{'url'};   $cenv{'url'}=$oldcenv{'url'};
 # Restore title  # Restore title
  $cenv{'description'}=$oldcenv{'description'};   $cenv{'description'}=$oldcenv{'description'};
   # Restore creation date, creator and creation context.
           $cenv{'internal.created'}=$oldcenv{'internal.created'};
           $cenv{'internal.creator'}=$oldcenv{'internal.creator'};
           $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'};
 # Mark as cloned  # Mark as cloned
  $cenv{'clonedfrom'}=$cloneid;   $cenv{'clonedfrom'}=$cloneid;
 # Need to clone grading mode  # Need to clone grading mode
Line 9767  sub construct_course { Line 10381  sub construct_course {
     $title=&mt('Syllabus');      $title=&mt('Syllabus');
             $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus';              $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus';
         } else {          } else {
             $title=&mt('Navigate Contents');              $title=&mt('Table of Contents');
             $url='/adm/navmaps';              $url='/adm/navmaps';
         }          }
   
Line 9784  sub construct_course { Line 10398  sub construct_course {
 ############################################################  ############################################################
 ############################################################  ############################################################
   
   #SD
   # only Community and Course, or anything else?
 sub course_type {  sub course_type {
     my ($cid) = @_;      my ($cid) = @_;
     if (!defined($cid)) {      if (!defined($cid)) {
Line 9800  sub group_term { Line 10416  sub group_term {
     my $crstype = &course_type();      my $crstype = &course_type();
     my %names = (      my %names = (
                   'Course' => 'group',                    'Course' => 'group',
                   'Group' => 'team',                    'Community' => 'group',
                 );                  );
     return $names{$crstype};      return $names{$crstype};
 }  }
   
   sub course_types {
       my @types = ('official','unofficial','community');
       my %typename = (
                            official   => 'Official course',
                            unofficial => 'Unofficial course',
                            community  => 'Community',
                      );
       return (\@types,\%typename);
   }
   
 sub icon {  sub icon {
     my ($file)=@_;      my ($file)=@_;
     my $curfext = lc((split(/\./,$file))[-1]);      my $curfext = lc((split(/\./,$file))[-1]);
Line 9864  sub escape_url { Line 10490  sub escape_url {
     return join('/',@urlslices).'/'.$lastitem;      return join('/',@urlslices).'/'.$lastitem;
 }  }
   
 # -------------------------------------------------------- Initliaze user login  sub compare_arrays {
       my ($arrayref1,$arrayref2) = @_;
       my (@difference,%count);
       @difference = ();
       %count = ();
       if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) {
           foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; }
           foreach my $element (keys(%count)) {
               if ($count{$element} == 1) {
                   push(@difference,$element);
               }
           }
       }
       return @difference;
   }
   
   # -------------------------------------------------------- Initialize user login
 sub init_user_environment {  sub init_user_environment {
     my ($r, $username, $domain, $authhost, $form, $args) = @_;      my ($r, $username, $domain, $authhost, $form, $args) = @_;
     my $lonids=$Apache::lonnet::perlvar{'lonIDsDir'};      my $lonids=$Apache::lonnet::perlvar{'lonIDsDir'};
Line 9918  sub init_user_environment { Line 10560  sub init_user_environment {
     my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,      my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,
         $clientunicode,$clientos) = &decode_user_agent($r);          $clientunicode,$clientos) = &decode_user_agent($r);
   
 # -------------------------------------- Any accessibility options to remember?  
     if (($form->{'interface'}) && ($form->{'remember'} eq 'true')) {  
  foreach my $option ('imagesuppress','appletsuppress',  
     'embedsuppress','fontenhance','blackwhite') {  
     if ($form->{$option} eq 'true') {  
  &Apache::lonnet::put('environment',{$option => 'on'},  
      $domain,$username);  
     } else {  
  &Apache::lonnet::del('environment',[$option],  
      $domain,$username);  
     }  
  }  
     }  
 # ------------------------------------------------------------- Get environment  # ------------------------------------------------------------- Get environment
   
     my %userenv = &Apache::lonnet::dump('environment',$domain,$username);      my %userenv = &Apache::lonnet::dump('environment',$domain,$username);
     my ($tmp) = keys(%userenv);      my ($tmp) = keys(%userenv);
     if ($tmp !~ /^(con_lost|error|no_such_host)/i) {      if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
  # default remote control to off  
  if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; }  
     } else {      } else {
  undef(%userenv);   undef(%userenv);
     }      }
     if (($userenv{'interface'}) && (!$form->{'interface'})) {      if (($userenv{'interface'}) && (!$form->{'interface'})) {
  $form->{'interface'}=$userenv{'interface'};   $form->{'interface'}=$userenv{'interface'};
     }      }
     $env{'environment.remote'}=$userenv{'remote'};  
     if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; }      if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; }
   
 # --------------- Do not trust query string to be put directly into environment  # --------------- Do not trust query string to be put directly into environment
     foreach my $option ('imagesuppress','appletsuppress',      foreach my $option ('interface','localpath','localres') {
  'embedsuppress','fontenhance','blackwhite',          $form->{$option}=~s/[\n\r\=]//gs;
  'interface','localpath','localres') {  
  $form->{$option}=~s/[\n\r\=]//gs;  
     }      }
 # --------------------------------------------------------- Write first profile  # --------------------------------------------------------- Write first profile
   
Line 9978  sub init_user_environment { Line 10602  sub init_user_environment {
     $initial_env{"browser.localres"}   = $form->{'localres'};      $initial_env{"browser.localres"}   = $form->{'localres'};
         }          }
   
  if ($public) {  
     $initial_env{"environment.remote"} = "off";  
  }  
  if ($form->{'interface'}) {   if ($form->{'interface'}) {
     $form->{'interface'}=~s/\W//gs;      $form->{'interface'}=~s/\W//gs;
     $initial_env{"browser.interface"} = $form->{'interface'};      $initial_env{"browser.interface"} = $form->{'interface'};
     $env{'browser.interface'}=$form->{'interface'};      $env{'browser.interface'}=$form->{'interface'};
     foreach my $option ('imagesuppress','appletsuppress',  
  'embedsuppress','fontenhance','blackwhite') {  
  if (($form->{$option} eq 'true') ||  
     ($userenv{$option} eq 'on')) {  
     $initial_env{"browser.$option"} = "on";  
  }  
     }  
  }   }
   
         foreach my $tool ('aboutme','blog','portfolio') {          foreach my $tool ('aboutme','blog','portfolio') {
Line 9999  sub init_user_environment { Line 10613  sub init_user_environment {
                 &Apache::lonnet::usertools_access($username,$domain,$tool,'reload');                  &Apache::lonnet::usertools_access($username,$domain,$tool,'reload');
         }          }
   
         foreach my $crstype ('official','unofficial') {          foreach my $crstype ('official','unofficial','community') {
             $userenv{'canrequest.'.$crstype} =              $userenv{'canrequest.'.$crstype} =
                 &Apache::lonnet::usertools_access($username,$domain,$crstype,                  &Apache::lonnet::usertools_access($username,$domain,$crstype,
                                                   'reload','requestcourses');                                                    'reload','requestcourses');

Removed from v.1.777  
changed lines
  Added in v.1.967


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