Diff for /loncom/interface/loncommon.pm between versions 1.819 and 1.908

version 1.819, 2009/05/16 18:06:41 version 1.908, 2009/11/03 03:18:21
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,courseadvonly) {      function openstdbrowser(formname,uname,udom,roleflag,ignorefilter,courseadvonly) {
         var url = '/adm/pickstudent?';          var url = '/adm/pickstudent?';
Line 429  sub studentbrowser_javascript { Line 430  sub studentbrowser_javascript {
         stdeditbrowser = open(url,title,options,'1');          stdeditbrowser = open(url,title,options,'1');
         stdeditbrowser.focus();          stdeditbrowser.focus();
     }      }
   // ]]>
 </script>  </script>
 ENDSTDBRW  ENDSTDBRW
 }  }
Line 461  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 473  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)=@_;
     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 $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Community - for which you wish to add/modify a user role.');
    my $output = '      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";  
       $output .= <<"ENDSTDBRW";
     function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {      function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {
         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 524  sub coursebrowser_javascript { Line 520  sub coursebrowser_javascript {
                 }                  }
             }                   }     
         }          }
           if (formname == 'ccrs') {
               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 != '') {          if (multflag !=null && multflag != '') {
             url += '&multiple='+multflag;              url += '&multiple='+multflag;
         }          }
         if (crstype == 'Course/Group') {          if (crstype == 'Course/Community') {
             if (formname == 'cu') {              if (formname == 'cu') {
                 crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value;                   crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value; 
                 if (crstype == "") {                  if (crstype == "") {
Line 545  sub coursebrowser_javascript { Line 546  sub coursebrowser_javascript {
         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;   
     }      }
       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;
   }
   
     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 607  function setSect(sectionlist) { Line 716  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)=@_;
      my $linktext = &mt('Select Course');
      if ($selecttype eq 'Community') {
          $linktext = &mt('Select Community'); 
      } elsif ($selecttype eq 'Course/Community') {
          $linktext = &mt('Select Course/Community');
          $selecttype = 'Course';
      }
    return '<span class="LC_nobreak">'     return '<span class="LC_nobreak">'
          ."<a href='"           ."<a href='"
          .'javascript:opencrsbrowser("'.$form.'","'.$unameele           .'javascript:opencrsbrowser("'.$form.'","'.$unameele
          .'","'.$udomele.'","'.$desc.'","'.$extra_element           .'","'.$udomele.'","'.$desc.'","'.$extra_element
          .'","'.$multflag.'","'.$selecttype.'");'           .'","'.$multflag.'","'.$selecttype.'");'
          ."'>".&mt('Select Course').'</a>'           ."'>".$linktext.'</a>'
          .'</span>';           .'</span>';
 }  }
   
Line 629  sub selectauthor_link { Line 783  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 829  sub linked_select_forms { Line 991  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 874  function select1_changed() { Line 1037  function select1_changed() {
         }          }
     }      }
 }  }
   // ]]>
 </script>  </script>
 END  END
     # output the initial values for the selection lists      # output the initial values for the selection lists
Line 1007  sub general_help { Line 1171  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 1027  sub update_help_link { Line 1191  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 1101  sub help_menu_js { Line 1267  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 1127  function writeHelp(caller) { Line 1293  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 1394  sub resize_textarea_js { Line 1560  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 1432  function resize_textarea(textarea_id,bot Line 1599  function resize_textarea(textarea_id,bot
     }      }
     textarea.style.height=new_height+'px';      textarea.style.height=new_height+'px';
 }  }
   // ]]>
 </script>  </script>
 RESIZE  RESIZE
   
Line 1775  sub select_level_form { Line 1943  sub select_level_form {
   
 =pod  =pod
   
 =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$autosubmit)  =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange)
   
 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 1786  selected"); Line 1954  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 argumnet specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted.  
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
 sub select_dom_form {  sub select_dom_form {
     my ($defdom,$name,$includeempty,$showdomdesc,$autosubmit) = @_;      my ($defdom,$name,$includeempty,$showdomdesc,$onchange) = @_;
     my $onchange;      if ($onchange) {
     if ($autosubmit) {          $onchange = ' onchange="'.$onchange.'"';
         $onchange = ' onchange="this.form.submit()"';  
     }      }
     my @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); }
Line 2299  sub authform_internal{ Line 2466  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 2850  sub messagewrapper { Line 3017  sub messagewrapper {
 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
Line 2860  sub aboutmewrapper { Line 3027  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>';
 }  }
   
Line 2874  sub syllabuswrapper { Line 3041  sub syllabuswrapper {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
   
 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 2888  sub track_student_link { Line 3055  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>}.
Line 3564  sub findallcourses { Line 3732  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 3754  sub blockcheck { Line 3923  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 3819  sub parse_block_record { Line 3988  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 3993  sub determinedomain { Line 4110  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 4168  sub designparm { Line 4285  sub designparm {
     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;
       }
       return
            '<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"><tt><b>' #FIXME lonpubdir: target="_parent"
           .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."$lastitem</b></tt><br />"
           #FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />"
           .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
           .'</form>'
           .&Apache::lonmenu::constspaceform()
           .'</div>';
   }
   
 ###############################################  ###############################################
 ###############################################  ###############################################
   
Line 4200  Inputs: Line 4407  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  
                       in the title box that appears, this text  
                       is not auto translated like the $title is  
   
 =item * $no_nav_bar, if true, keep the 'what is this' info but remove the  =item * $no_nav_bar, if true, keep the 'what is this' info but remove the
                      navigational links                       navigational links
   
Line 4228  other decorations will be returned. Line 4431  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,
         $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;          $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;
   
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }      if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
Line 4257  sub bodytag { Line 4460  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);
Line 4283  sub bodytag { Line 4489  sub bodytag {
  $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 4314  ENDROLE Line 4502  ENDROLE
         $dc_info = '('.$dc_info.')';          $dc_info = '('.$dc_info.')';
     }      }
   
     if (($env{'environment.remote'} eq 'off') || ($args->{'suppress_header_logos'})) {      $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;
       &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
   
       if ($env{'environment.remote'} eq 'off') {
         # No Remote          # No Remote
  if ($env{'request.state'} eq 'construct') {          if ($no_nav_bar) { return $bodytag; } 
     $forcereg=1;  
  }  
   
  if (!$customtitle && $env{'request.state'} eq 'construct') {          if ($env{'request.state'} eq 'construct') { $forcereg=1; }
     # 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;  
     }  
     $titleinfo =   
  &Apache::loncommon::help_open_menu('','',3,'Authoring')  
  .'<b>'.&mt('Construction Space').'</b>:&nbsp;'  
  .'<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 />"  
  .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')  
  .'</form>'  
  .&Apache::lonmenu::constspaceform();  
         }  
   
         my $titletable = '<table id="LC_title_bar">'  
                         ."<tr><td> $titleinfo $dc_info</td>".$roleinfo  
                         .'</tr></table>';  
   
  if ($no_nav_bar) {          #    if ($env{'request.state'} eq 'construct') {
     $bodytag .= $titletable;          #        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
  } else {          #    }
         $bodytag .= qq|<div id="LC_nav_bar">$name ($role)<br />  
             <em>$realm</em> $dc_info</div>|;          $bodytag .= qq|<div id="LC_nav_bar">$name $role<br />
     if ($env{'request.state'} eq 'construct') {              <em>$realm</em> $dc_info</div>| unless $env{'form.inhibitmenu'};
                 $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg,  
   $titletable);          if (   $env{'form.inhibitmenu'} eq 'yes' 
             } else {              || $ENV{'REQUEST_URI'} eq '/adm/logout'
                 $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg).              || $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
     $titletable;  
             }              return $bodytag;
         }          }
   
           $bodytag .= Apache::lonhtmlcommon::scripttag(
               Apache::lonmenu::utilityfunctions(), 'start');
   
           $bodytag .= Apache::lonmenu::primary_menu();
   
           #don't show menus for public users
           if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){
               $bodytag .= Apache::lonmenu::secondary_menu();
               $bodytag .= Apache::lonmenu::serverform();
               $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); 
               $bodytag .= Apache::lonmenu::innerregister($forcereg) if $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'); 
           }
   
           #SD testing
           #$bodytag .= Apache::lonmenu::menubuttons($forcereg);
         return $bodytag;          return $bodytag;
     }      }
   
Line 4379  ENDROLE Line 4560  ENDROLE
   
     # Explicit link to get inline menu      # Explicit link to get inline menu
     my $menu= ($no_inline_link?''      my $menu= ($no_inline_link?''
        :'<br /><a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a>');         :'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>');
       $bodytag .= qq|<div id="LC_nav_bar">$name $role
               <em>$realm</em> $dc_info </div>
               <ol class="LC_primary_menu LC_right">
                   <li>$menu</li>
               </ol>| unless $env{'form.inhibitmenu'};
     #      #
     return(<<ENDBODY);      return(<<ENDBODY);
 $bodytag  $bodytag
Line 4388  $bodytag Line 4574  $bodytag
     <td>$messages&nbsp;</td>      <td>$messages&nbsp;</td>
 </tr>  </tr>
 <tr><td>$titleinfo $dc_info $menu</td>  <tr><td>$titleinfo $dc_info $menu</td>
 $roleinfo  
 </tr>  </tr>
 </table>  </table>
 ENDBODY  ENDBODY
Line 4510  sub standard_css { Line 4695  sub standard_css {
   
     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 4629  div.LC_confirm_box .LC_success img { Line 4814  div.LC_confirm_box .LC_success img {
   
 .LC_disc_action_links_bar {  .LC_disc_action_links_bar {
    background: $tabbg;     background: $tabbg;
    font-family: $sans;  
    border: none;     border: none;
    margin: 4px;     margin: 4px;
 }  }
Line 4672  table#LC_nav_location { Line 4856  table#LC_nav_location {
 table#LC_title_bar a {  table#LC_title_bar a {
   color: $fontmenu;    color: $fontmenu;
 }  }
       
 table#LC_title_bar {  table#LC_title_bar {
   clear: both;    clear: both;
   /*display: none;*/    display: none;
 }  }
   
 table#LC_title_bar,  table#LC_title_bar,
Line 4687  table#LC_title_bar.LC_with_remote { Line 4871  table#LC_title_bar.LC_with_remote {
   border-width: $border;    border-width: $border;
   background: $pgbg;    background: $pgbg;
   color: $fontmenu;    color: $fontmenu;
   font-family: $sans;  
   border-collapse: collapse;    border-collapse: collapse;
   padding: 0;    padding: 0;
   margin: 0;    margin: 0;
 }  }
   
 table.LC_docs_path {  
   width: 100%;  
   border: 0;  
   background: $pgbg;  
   font-family: $sans;  
   border-collapse: collapse;  
   padding: 0;  
 }  
   
 table#LC_title_bar td {  table#LC_title_bar td {
   background: $tabbg;    background: $tabbg;
 }  }
   
 table#LC_title_bar .LC_title_bar_who {  
   background: $tabbg;  
   color: $fontmenu;  
   font: small $sans;  
   text-align: right;  
   margin: 0;  
 }  
   
 table#LC_title_bar div.LC_title_bar_name {  
   margin: 0;  
 }  
   
 table#LC_title_bar div.LC_title_bar_role {  
   margin: 0;  
 }  
   
 table#LC_title_bar div.LC_title_bar_realm {  
   margin: 0;  
 }  
   
 span.LC_metadata {  
   font-family: $sans;  
 }  
   
 table#LC_menubuttons img{  table#LC_menubuttons img{
   border: none;    border: none;
 }  }
Line 4745  table#LC_top_nav td { Line 4895  table#LC_top_nav td {
 table#LC_top_nav td a,  table#LC_top_nav td a,
 div#LC_top_nav a {  div#LC_top_nav a {
   color: $font;    color: $font;
   font-family: $sans;  
 }  }
   
 table#LC_top_nav td.LC_top_nav_logo {  table#LC_top_nav td.LC_top_nav_logo {
Line 4770  table#LC_top_nav td.LC_top_nav_login { Line 4919  table#LC_top_nav td.LC_top_nav_login {
   text-align: center;    text-align: center;
 }  }
   
 table.LC_breadcrumbs td,  .LC_breadcrumbs_component {
 table.LC_docs_path td  {      float: right;
   background: $tabbg;      margin: 0 1em;
   color: $fontmenu;  
   font-family: $sans;  
   font-size: smaller;  
 }  }
   .LC_breadcrumbs_component img {
 table.LC_breadcrumbs td.LC_breadcrumbs_component,      vertical-align: middle;
 table.LC_docs_path td.LC_docs_path_component {  
   background: $tabbg;  
   color: $fontmenu;  
   font-family: $sans;  
   font-size: larger;  
   text-align: right;  
 }  }
   
 td.LC_table_cell_checkbox {  td.LC_table_cell_checkbox {
Line 4799  table#LC_mainmenu td.LC_mainmenu_column Line 4939  table#LC_mainmenu td.LC_mainmenu_column
  font-size: 70%;   font-size: 70%;
 }  }
   
 #LC_head_subbox {  #LC_breadcrumbs {
  clear:both;   clear:both;
  background: $sidebg;   background: $sidebg;
  border-bottom: 1px solid #999999;   border-bottom: 1px solid $lg_border_color;
  height: 32px;   line-height: 2.5em; 
  line-height: 32px;    /* SD working here
  margin: 0 0 10px;   height: 2.5em;
    overflow: hidden; */
    margin: 0;
  padding: 0;   padding: 0;
 }  }
   
   /* Preliminary fix to hide breadcrumbs inside remote control window */
   #LC_remote #LC_breadcrumbs {
       display:none;
   }
   
   #LC_head_subbox {
    clear:both;
    background: #F8F8F8; /* $sidebg; */
    border-bottom: 1px solid $lg_border_color;
    margin: 0 0 10px 0;
    padding: 5px;
   }
   
 .LC_fontsize_medium {  .LC_fontsize_medium {
  font-size: 85%;   font-size: 85%;
 }  }
Line 4819  table#LC_mainmenu td.LC_mainmenu_column Line 4974  table#LC_mainmenu td.LC_mainmenu_column
   
 .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;
 }  }
Line 4831  table#LC_mainmenu td.LC_mainmenu_column Line 4985  table#LC_mainmenu td.LC_mainmenu_column
 .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;
 }  }
Line 4841  td.LC_menubuttons_text { Line 4994  td.LC_menubuttons_text {
 }  }
   
 .LC_current_location {  .LC_current_location {
   font-family: $sans;  
   background: $tabbg;    background: $tabbg;
 }  }
   
 .LC_new_mail {  .LC_new_mail {
   font-family: $sans;  
   background: $tabbg;    background: $tabbg;
   font-weight: bold;    font-weight: bold;
 }  }
   
 .LC_preferences_labeltext {  
   font-family: $sans;  
   text-align: right;  
 }  
   
 .LC_roleslog_note {  
   font-size: small;  
 }  
   
 .LC_mail_functions {  
     font-weight: bold;  
 }  
   
 table.LC_data_table,  table.LC_data_table,
 table.LC_mail_list {  table.LC_mail_list {
   border: 1px solid #000000;    border: 1px solid #000000;
Line 4883  table.LC_nested_outer { Line 5021  table.LC_nested_outer {
   width: 100%;    width: 100%;
 }  }
   
   table.LC_innerpickbox,
 table.LC_nested {  table.LC_nested {
   border: none;    border: none;
   border-collapse: collapse;    border-collapse: collapse;
Line 4893  table.LC_nested { Line 5032  table.LC_nested {
 table.LC_data_table tr th,   table.LC_data_table tr th, 
 table.LC_calendar tr th,   table.LC_calendar tr th, 
 table.LC_mail_list tr th,  table.LC_mail_list tr th,
 table.LC_prior_tries tr th {  table.LC_prior_tries tr th,
   table.LC_innerpickbox tr th {
   font-weight: bold;    font-weight: bold;
   background-color: $data_table_head;    background-color: $data_table_head;
   color:$fontmenu;    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;
Line 4910  table.LC_data_table tr.LC_odd_row > td, Line 5055  table.LC_data_table tr.LC_odd_row > td,
 table.LC_pick_box tr > td.LC_odd_row {  table.LC_pick_box tr > td.LC_odd_row {
   background-color: $data_table_light;    background-color: $data_table_light;
   padding: 2px;    padding: 2px;
     vertical-align: top;
 }  }
   
 table.LC_data_table tr.LC_even_row > td,  table.LC_data_table tr.LC_even_row > td,
 table.LC_pick_box tr > td.LC_even_row {  table.LC_pick_box tr > td.LC_even_row {
   background-color: $data_table_dark;    background-color: $data_table_dark;
   padding: 2px;    padding: 2px;
     vertical-align: top;
 }  }
   
 table.LC_data_table tr.LC_data_table_highlight td {  table.LC_data_table tr.LC_data_table_highlight td {
Line 4936  table.LC_nested tr.LC_empty_row td { Line 5083  table.LC_nested tr.LC_empty_row td {
   padding: 8px;    padding: 8px;
 }  }
   
   table.LC_caption {
   }
   
 table.LC_nested tr.LC_empty_row td {  table.LC_nested tr.LC_empty_row td {
   padding: 4ex    padding: 4ex
 }  }
Line 5059  table.LC_mail_list tr.LC_mail_other:hove Line 5209  table.LC_mail_list tr.LC_mail_other:hove
   
 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,
Line 5068  table.LC_data_table tr > td.LC_browser_f Line 5218  table.LC_data_table tr > td.LC_browser_f
 }  }
   
 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 {
Line 5111  span.LC_current_location { Line 5261  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 {
Line 5166  table#LC_helpmenu { Line 5315  table#LC_helpmenu {
   
 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 {
Line 5219  table.LC_pick_box { Line 5367  table.LC_pick_box {
 }  }
   
 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;
Line 5267  table.LC_pick_box td.LC_oddrow_value { Line 5407  table.LC_pick_box td.LC_oddrow_value {
   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: 0;  
   height: 1px;  
   background: black;  
 }  
   
 span.LC_helpform_receipt_cat {  span.LC_helpform_receipt_cat {
   font-weight: bold;    font-weight: bold;
 }  }
Line 5354  table.LC_notify_front_page td { Line 5460  table.LC_notify_front_page td {
 }  }
   
 .LC_topic_bar {  .LC_topic_bar {
   font-family: $sans;  
   font-weight: bold;    font-weight: bold;
   width: 100%;    width: 100%;
   background: $tabbg;    background: $tabbg;
Line 5383  table.LC_status_selector td { Line 5488  table.LC_status_selector td {
   
 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 5411  table.LC_prior_tries td { Line 5544  table.LC_prior_tries td {
   
 .LC_answer_correct {  .LC_answer_correct {
   background: lightgreen;    background: lightgreen;
   font-family: $sans;  
   color: darkgreen;    color: darkgreen;
   padding: 6px;    padding: 6px;
 }  }
   
 .LC_answer_charged_try {  .LC_answer_charged_try {
   background: #FFAAAA;    background: #FFAAAA;
   font-family: $sans;  
   color: darkred;    color: darkred;
   padding: 6px;    padding: 6px;
 }  }
Line 5427  table.LC_prior_tries td { Line 5558  table.LC_prior_tries td {
 .LC_answer_no_grade,  .LC_answer_no_grade,
 .LC_answer_late {  .LC_answer_late {
   background: lightyellow;    background: lightyellow;
   font-family: $sans;  
   color: black;    color: black;
   padding: 6px;    padding: 6px;
 }  }
   
 .LC_answer_previous {  .LC_answer_previous {
   background: lightblue;    background: lightblue;
   font-family: $sans;  
   color: darkblue;    color: darkblue;
   padding: 6px;    padding: 6px;
 }  }
   
 .LC_answer_no_message {  .LC_answer_no_message {
   background: #FFFFFF;    background: #FFFFFF;
   font-family: $sans;  
   color: black;    color: black;
   padding: 6px;    padding: 6px;
 }  }
   
 .LC_answer_unknown {  .LC_answer_unknown {
   background: orange;    background: orange;
   font-family: $sans;  
   color: black;    color: black;
   padding: 6px;    padding: 6px;
 }  }
Line 5483  table.LC_prior_match tr td { Line 5610  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 5508  table.LC_docs_documents td.LC_docs_docum Line 5634  table.LC_docs_documents td.LC_docs_docum
   padding: 4px;    padding: 4px;
 }  }
   
 .LC_docs_entry_move {  div.LC_docs_entry_move {
   border: none;    border: 1px solid #BBBBBB;
   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;
 }  }
Line 5544  table.LC_docs_documents td.LC_docs_docum Line 5673  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 5591  table.LC_double_column tr td.LC_right_co Line 5709  table.LC_double_column tr td.LC_right_co
   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 5686  div.LC_edit_problem_editxml_header div { Line 5800  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;
Line 5721  div.LC_edit_problem_saves { Line 5829  div.LC_edit_problem_saves {
   padding-bottom: 5px;    padding-bottom: 5px;
 }  }
   
 hr.LC_edit_problem_divide {  
   clear: both;  
   color: $tabbg;  
   background-color: $tabbg;  
   height: 3px;  
   border: none;  
 }  
   
 img.stift{  img.stift{
   border-width: 0;    border-width: 0;
   vertical-align: middle;    vertical-align: middle;
Line 5747  table#LC_mainmenu td.LC_mainmenu_col_fie Line 5847  table#LC_mainmenu td.LC_mainmenu_col_fie
 .LC_mainmenu_fieldset_category {  .LC_mainmenu_fieldset_category {
   color: $font;    color: $font;
   background: $pgbg;    background: $pgbg;
   font-family: $sans;  
   font-size: small;    font-size: small;
   font-weight: bold;    font-weight: bold;
 }  }
Line 5764  div.LC_createcourse { Line 5863  div.LC_createcourse {
 # --------------------------*/  # --------------------------*/
   
 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:#BF2317;
         text-decoration:none;      text-decoration:none;
 }  }
   
 h1 {  h1 {
Line 5793  h2,h3,h4,h5,h6 { Line 5892  h2,h3,h4,h5,h6 {
  border-bottom:solid 1px $lg_border_color;   border-bottom:solid 1px $lg_border_color;
 }  }
   
   .LC_Box > .LC_hcell {
       margin: 0 -10px 10px -10px;
   }
   
 .LC_noBorder {  .LC_noBorder {
         border: 0;          border: 0;
 }  }
   
   
 /* Main Header with discription of Person, Course, etc. */  
   
 .LC_Right {  .LC_Right {
         float: right;          float: right;
         margin: 0;          margin: 0;
Line 5828  dl,ul,div,fieldset { Line 5928  dl,ul,div,fieldset {
 /* overflow: hidden; */  /* overflow: hidden; */
 }  }
   
   fieldset > legend {
       font-weight: bold;
       padding: 0 5px 0 5px;
   }
   
 #LC_nav_bar {  #LC_nav_bar {
     float: left;      float: left;
     margin: 0;      margin: 0.2em 0 0 0;
 }  }
   
 #LC_nav_bar em{  #LC_nav_bar em{
Line 5838  dl,ul,div,fieldset { Line 5943  dl,ul,div,fieldset {
     font-style: normal;      font-style: normal;
 }  }
   
 ol.LC_smallMenu {  ol.LC_primary_menu {
     float: right;      float: right;
       margin: 0.2em 0 0 0;
 }  }
   
 ol.LC_smallMenu, ol#LC_PathBreadcrumbs {  ol#LC_PathBreadcrumbs {
  margin: 0;   margin: 0;
 }  }
   
 ol.LC_smallMenu li {  ol.LC_primary_menu li {
  display: inline;   display: inline;
  padding: 5px 5px 0 10px;   padding: 5px 5px 0 10px;
  vertical-align: top;   vertical-align: top;
 }  }
   
 ol.LC_smallMenu li img {  ol.LC_primary_menu li img {
  vertical-align: bottom;   vertical-align: bottom;
 }  }
   
 ol.LC_smallMenu a {  ol.LC_primary_menu a {
  font-size: 90%;   font-size: 90%;
  color: RGB(80, 80, 80);   color: RGB(80, 80, 80);
  text-decoration: none;   text-decoration: none;
 }  }
   
 ul#LC_TabMainMenuContent {  ul#LC_secondary_menu {
     clear: both;      clear: both;
     color: $fontmenu;      color: $fontmenu;
     background: $tabbg;      background: $tabbg;
     list-style: none;      list-style: none;
     padding: 0;      padding: 0;
     margin: 0;      margin: 0;
     float:left;  
     width: 100%;      width: 100%;
 }  }
   
 ul#LC_TabMainMenuContent li {  ul#LC_secondary_menu li {
     float: left;  
     font-weight: bold;      font-weight: bold;
     line-height: 1.8em;      line-height: 1.8em;
     padding: 0 0.8em;       padding: 0 0.8em; 
Line 5883  ul#LC_TabMainMenuContent li { Line 5987  ul#LC_TabMainMenuContent li {
     vertical-align: middle;      vertical-align: middle;
 }  }
   
 ul.LC_TabContent ,  ul.LC_TabContent {
 ul.LC_TabContentBigger {  
  display:block;   display:block;
    background: $sidebg;
    border-bottom: solid 1px $lg_border_color;
  list-style:none;   list-style:none;
  margin: 0;   margin: 0 -10px;
  padding: 0;   padding: 0;
 }  }
   
 ul.LC_TabContent li,  ul.LC_TabContent li,
 ul.LC_TabContentBigger li {  ul.LC_TabContentBigger li {
  display: inline;  
  border-right: solid 1px $lg_border_color;  
  float:left;   float:left;
  line-height:140%;  
  white-space:nowrap;  
 }  }
   
 ul#LC_TabMainMenuContent li a {  ul#LC_secondary_menu li a {
     color: $fontmenu;      color: $fontmenu;
  text-decoration: none;   text-decoration: none;
 }  }
   
 ul.LC_TabContent {  ul.LC_TabContent {
  min-height:1.6em;   min-height:1.5em;
 }  }
   
 ul.LC_TabContent li {  ul.LC_TabContent li {
Line 5916  ul.LC_TabContent li { Line 6017  ul.LC_TabContent li {
  border-bottom:solid 1px $lg_border_color;   border-bottom:solid 1px $lg_border_color;
 }  }
   
   ul.LC_TabContent .right {
    float:right;
   }
   
 ul.LC_TabContent li a, ul.LC_TabContent li {  ul.LC_TabContent li a, ul.LC_TabContent li {
  color:rgb(47,47,47);   color:rgb(47,47,47);
  text-decoration:none;   text-decoration:none;
Line 5926  ul.LC_TabContent li a, ul.LC_TabContent Line 6031  ul.LC_TabContent li a, ul.LC_TabContent
   
 ul.LC_TabContent li:hover, ul.LC_TabContent li.active {  ul.LC_TabContent li:hover, ul.LC_TabContent li.active {
         background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;          background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;
  border-bottom:solid 1px #FFFFFF;   border-bottom:solid 2px #FFFFFF;
  padding-right: 16px;   padding-right: 16px;
 }  }
   
 ul.LC_TabContentBigger li {  #maincoursedoc {
  vertical-align:bottom;   clear:both;
  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 {
 ul.LC_TabContentBigger li.active {          display:block;
  background:url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom;          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,   
 ul.LC_TabContentBigger li a {  ul.LC_TabContentBigger li a {
  font-size:110%;          background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;
  font-weight:bold;   height: 30px;
    line-height: 30px;
    text-align: center;
    display: block;
    text-decoration: none;
 }  }
   
 ol#LC_MenuBreadcrumbs,   ul.LC_TabContentBigger li:hover a, 
 ol#LC_PathBreadcrumbs,   ul.LC_TabContentBigger li.active a {
    background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;
    color:$font;
    text-decoration: underline;
   }
   
   
   ul.LC_TabContentBigger li b {
    background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;
    display: block;
    float: left;
    padding: 0 30px;
   }
   
   ul.LC_TabContentBigger li:hover b,
   ul.LC_TabContentBigger li.active b {
           background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;
           color:$font;
    border-bottom: 1px solid #FFFFFF;
   }
   
   
 ul.LC_CourseBreadcrumbs {  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;   padding-left: 10px;
  margin: 0;   margin: 0;
  list-style-position: inside;   list-style-position: inside;
       /* SD working here
       white-space: nowrap; */
 }  }
   
 ol#LC_MenuBreadcrumbs li,   ol#LC_MenuBreadcrumbs li, 
 ol#LC_PathBreadcrumbs li,   ol#LC_PathBreadcrumbs li, 
 ul.LC_CourseBreadcrumbs li {  ul.LC_CourseBreadcrumbs li {
  display: inline;      display: inline;
  padding: 0 0 0 10px;      white-space: nowrap;
  overflow:hidden;      /* SD working here
       white-space: normal; */
 }  }
   
 ol#LC_MenuBreadcrumbs li a, ul.LC_CourseBreadcrumbs li a {  ol#LC_MenuBreadcrumbs li a,
   ul.LC_CourseBreadcrumbs li a {
  text-decoration: none;   text-decoration: none;
  font-size:90%;   font-size:90%;
 }  }
Line 5977  ol#LC_PathBreadcrumbs li a { Line 6125  ol#LC_PathBreadcrumbs li a {
  font-weight:bold;   font-weight:bold;
 }  }
   
 .LC_BoxPadding {  .LC_Box {
  padding: 10px;      border: solid 1px $lg_border_color;
 }      padding: 0 10px 10px 10px;
   
 .LC_ContentBoxSpecial {  
  border: solid 1px $lg_border_color;  
 }  
   
 .LC_ContentBoxSpecialContactInfo {  
  border: solid 1px $lg_border_color;  
  max-width:25%;  
  min-width:25%;  
 }  }
   
 .LC_AboutMe_Image {  .LC_AboutMe_Image {
Line 6077  div.LC_columnSection>* { Line 6216  div.LC_columnSection>* {
  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 {  
  clear: both;  
  line-height: 0;  
  font-size: 0;  
  height: 0;  
 }  
   
 .LC_loginpage_container {  .LC_loginpage_container {
  text-align:left;   text-align:left;
  margin : 0 auto;   margin : 0 auto;
Line 6151  table em { Line 6270  table em {
 table.LC_tableBrowseRes,  table.LC_tableBrowseRes,
 table.LC_tableOfContent {  table.LC_tableOfContent {
         border:none;          border:none;
  border-spacing: 1;   border-spacing: 1px;
  padding: 3px;   padding: 3px;
  background-color: #FFFFFF;   background-color: #FFFFFF;
  font-size: 90%;   font-size: 90%;
Line 6245  a.LC_toolbarItem { Line 6364  a.LC_toolbarItem {
  background-color:transparent;   background-color:transparent;
 }  }
   
 ul.LC_functionslist li {  ul.LC_funclist li {
   float: left;    float: left;
   white-space: nowrap;    white-space: nowrap;
   height: 35px; /* at least as high as heighest list item */    height: 35px; /* at least as high as heighest list item */
Line 6380  sub xml_begin { Line 6499  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;
 }  }
Line 6456  $args - additional optional args support Line 6576  $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>
              skip_phases    -> hash ref of                skip_phases    -> hash ref of 
Line 6470  $args - additional optional args support Line 6587  $args - additional optional args support
              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 6502  sub start_page { Line 6621  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->{'no_inline_link'},
  $args->{'no_inline_link'},                           $args);
  $args);          }
  }  
     }      }
   
     if ($args->{'js_ready'}) {      if ($args->{'js_ready'}) {
Line 6676  sub simple_error_page { Line 6794  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 6707  sub simple_error_page { Line 6825  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 6777  sub get_users_function { Line 6900  sub get_users_function {
     if ($env{'request.role'}=~/^(st)/) {      if ($env{'request.role'}=~/^(st)/) {
         $function='student';          $function='student';
     }      }
     if ($env{'request.role'}=~/^(cc|in|ta|ep)/) {      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 6794  sub get_users_function { Line 6917  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 6816  sub check_user_status { Line 6971  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 7447  sub user_picker { Line 7602  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 7537  ENDSCRIPT Line 7693  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 7605  function validateEntry(callingForm) { Line 7762  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 8499  sub csv_print_samples { Line 8653  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 8543  sub csv_print_select_table { Line 8697  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 9197  sub restore_settings { Line 9351  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 9768  sub check_clone { Line 9923  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->{'type'});
       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->{'type'} 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->{'type'} 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 9784  sub check_clone { Line 9953  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->{'type'} eq 'Community') {
                       $ccrole = 'co';
                   }
         my %roleshash =          my %roleshash =
     &Apache::lonnet::get_my_roles($args->{'ccuname'},      &Apache::lonnet::get_my_roles($args->{'ccuname'},
  $args->{'ccdomain'},   $args->{'ccdomain'},
                                          'userroles',['active'],['cc'],                                           'userroles',['active'],[$ccrole],
  [$args->{'clonedomain'}]);   [$args->{'clonedomain'}]);
         if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {          if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
     $can_clone = 1;      $can_clone = 1;
         } else {          } else {
                     $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});                      if ($args->{'type'} 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 9801  sub check_clone { Line 9978  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 9839  sub construct_course { Line 10016  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
Line 10148  sub group_term { Line 10326  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 10212  sub escape_url { Line 10400  sub escape_url {
     return join('/',@urlslices).'/'.$lastitem;      return join('/',@urlslices).'/'.$lastitem;
 }  }
   
   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  # -------------------------------------------------------- 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) = @_;
Line 10325  sub init_user_environment { Line 10529  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.819  
changed lines
  Added in v.1.908


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