Diff for /loncom/interface/loncommon.pm between versions 1.414 and 1.441

version 1.414, 2006/07/03 00:44:21 version 1.441, 2006/08/02 20:23:33
Line 285  sub browser_and_searcher_javascript { Line 285  sub browser_and_searcher_javascript {
  }   }
         url += 'element=' + elementname + '';          url += 'element=' + elementname + '';
         var title = 'Browser';          var title = 'Browser';
         var options = 'scrollbars=1,resizable=1,menubar=1,location=1';          var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1';
         options += ',width=700,height=600';          options += ',width=700,height=600';
         editbrowser = open(url,title,options,'1');          editbrowser = open(url,title,options,'1');
         editbrowser.focus();          editbrowser.focus();
Line 306  sub browser_and_searcher_javascript { Line 306  sub browser_and_searcher_javascript {
  }   }
         url += 'element=' + elementname + '';          url += 'element=' + elementname + '';
         var title = 'Search';          var title = 'Search';
         var options = 'scrollbars=1,resizable=1,menubar=0';          var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1';
         options += ',width=700,height=600';          options += ',width=700,height=600';
         editsearcher = open(url,title,options,'1');          editsearcher = open(url,title,options,'1');
         editsearcher.focus();          editsearcher.focus();
Line 672  sub help_open_topic { Line 672  sub help_open_topic {
     {      {
  $template .=    $template .= 
   "<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>".    "<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>".
   "<td bgcolor='#5555FF'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";    "<td bgcolor='#5555FF'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";
     }      }
   
     # Add the graphic      # Add the graphic
     my $title = &mt('Online Help');      my $title = &mt('Online Help');
     my $helpicon=&lonhttpdurl("/adm/help/gif/smallHelp.gif");      my $helpicon=&lonhttpdurl("/adm/help/gif/smallHelp.gif");
     $template .= <<"ENDTEMPLATE";      $template .= <<"ENDTEMPLATE";
  <a href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a>   <a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a>
 ENDTEMPLATE  ENDTEMPLATE
     if ($text ne '') { $template.='</td></tr></table>' };      if ($text ne '') { $template.='</td></tr></table>' };
     return $template;      return $template;
Line 706  sub helpLatexCheatsheet { Line 706  sub helpLatexCheatsheet {
  .'</td></tr></table>';   .'</td></tr></table>';
 }  }
   
 sub help_open_menu {  sub general_help {
     my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_;      my $helptopic='Student_Intro';
     $text = "" if (not defined $text);      if ($env{'request.role'}=~/^(ca|au)/) {
     $stayOnPage = 0 if (not defined $stayOnPage);   $helptopic='Authoring_Intro';
     if ($env{'browser.interface'} eq 'textual' ||      } elsif ($env{'request.role'}=~/^cc/) {
         $env{'environment.remote'} eq 'off' ) {   $helptopic='Course_Coordination_Intro';
         $stayOnPage=1;  
     }      }
     $width = 620 if (not defined $width);      return $helptopic;
     $height = 600 if (not defined $height);  }
     my $link='';  
     my $title = &mt('Get help');  sub update_help_link {
       my ($topic,$component_help,$faq,$bug,$stayOnPage) = @_;
     my $origurl = $ENV{'REQUEST_URI'};      my $origurl = $ENV{'REQUEST_URI'};
     $origurl=~s|^/~|/priv/|;      $origurl=~s|^/~|/priv/|;
     my $timestamp = time;      my $timestamp = time;
     foreach my $datum (\$topic,\$component_help,\$faq,\$bug,\$origurl) {      foreach my $datum (\$topic,\$component_help,\$faq,\$bug,\$origurl) {
         $$datum = &escape($$datum);          $$datum = &escape($$datum);
     }      }
     if (!$stayOnPage) {  
          $link = "javascript:helpMenu('open')";  
     } else {  
         $link = "javascript:helpMenu('display')";  
     }  
     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 $details_link = "/adm/helpmenu?page=body&amp;topic=$topic&amp;component_help=$component_help&amp;faq=$faq&amp;bug=$bug&amp;origurl=$origurl&amp;stamp=$timestamp";      my $output .= <<"ENDOUTPUT";
     my $template;  <script type="text/javascript">
     if ($text ne "") {  // <!-- BEGIN LON-CAPA Internal
  $template .=   banner_link = '$banner_link';
   "<table bgcolor='#CC3300' cellspacing='1' cellpadding='1' border='0'><tr>".  // END LON-CAPA Internal -->
   "<td bgcolor='#CC6600'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";  </script>
   ENDOUTPUT
       return $output;
   }
   
   # now just updates the help link and generates a blue icon
   sub help_open_menu {
       my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) 
    = @_;
       
       $stayOnPage = 0 if (not defined $stayOnPage);
       if ($env{'browser.interface'} eq 'textual' ||
    $env{'environment.remote'} eq 'off' ) {
    $stayOnPage=1;
     }      }
       my $output;
       if ($component_help) {
    if (!$text) {
       $output=&help_open_topic($component_help,undef,$stayOnPage,
          $width,$height);
    } else {
       my $help_text;
       $help_text=&unescape($topic);
       $output='<table><tr><td>'.
    &help_open_topic($component_help,$help_text,$stayOnPage,
    $width,$height).'</td></tr></table>';
    }
       }
       my $banner_link = &update_help_link($topic,$component_help,$faq,$bug,$stayOnPage);
       return $output.$banner_link;
   }
   
   sub top_nav_help {
       my ($text) = @_;
   
       $text = &mt($text);
   
       my $stayOnPage = 
    ($env{'browser.interface'}  eq 'textual' ||
    $env{'environment.remote'} eq 'off' );
       my $link=  ($stayOnPage) ? "javascript:helpMenu('display')"
                        : "javascript:helpMenu('open')";
       my $banner_link = &update_help_link(undef,undef,undef,undef,$stayOnPage);
   
       my $title = &mt('Get help');
   
       return <<"END";
   $banner_link
    <a href="$link" title="$title">$text</a>
   END
   }
   
   sub help_menu_js {
       my ($text) = @_;
   
       my $stayOnPage = 
    ($env{'browser.interface'}  eq 'textual' ||
    $env{'environment.remote'} eq 'off' );
   
       my $width = 620;
       my $height = 600;
       my $helptopic=&general_help();
       my $details_link = '/adm/help/'.$helptopic.'.hlp';
     my $nothing=&Apache::lonhtmlcommon::javascript_nothing();      my $nothing=&Apache::lonhtmlcommon::javascript_nothing();
     my $helpicon=&lonhttpdurl("/adm/lonIcons/helpgateway.gif");  
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Help Menu', undef,          &Apache::loncommon::start_page('Help Menu', undef,
        {'frameset'    => 1,         {'frameset'    => 1,
Line 750  sub help_open_menu { Line 806  sub help_open_menu {
         &Apache::loncommon::end_page({'frameset' => 1,          &Apache::loncommon::end_page({'frameset' => 1,
       'js_ready' => 1,});        'js_ready' => 1,});
   
     $template .= <<"ENDTEMPLATE";      my $template .= <<"ENDTEMPLATE";
  <script type="text/javascript">  <script type="text/javascript">
 // <!-- BEGIN LON-CAPA Internal  // <!-- BEGIN LON-CAPA Internal
 // <![CDATA[  // <![CDATA[
   var banner_link = '';
 function helpMenu(target) {  function helpMenu(target) {
     var caller = this;      var caller = this;
     if (target == 'open') {      if (target == 'open') {
Line 773  function helpMenu(target) { Line 830  function helpMenu(target) {
     return;      return;
 }  }
 function writeHelp(caller) {  function writeHelp(caller) {
     caller.document.writeln('$start_page<frame name="bannerframe"  src="$banner_link" /><frame name="bodyframe" src="$details_link" /> $end_page')      caller.document.writeln('$start_page<frame name="bannerframe"  src="'+banner_link+'" /><frame name="bodyframe" src="$details_link" /> $end_page')
     caller.document.close()      caller.document.close()
     caller.focus()      caller.focus()
 }  }
 // ]]>  // ]]>
 // END LON-CAPA Internal -->  // END LON-CAPA Internal -->
  </script>  </script>
  <a href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help Menu)" /></a>  
 ENDTEMPLATE  ENDTEMPLATE
     if ($component_help) {  
  if (!$text) {  
     $template=&help_open_topic($component_help,undef,$stayOnPage,  
        $width,$height).' '.$template;  
  } else {  
     my $help_text;  
     $help_text=&unescape($topic);  
     $template='<table><tr><td>'.  
  &help_open_topic($component_help,$help_text,$stayOnPage,  
  $width,$height).'</td><td>'.$template.  
  '</td></tr></table>';  
  }  
     }  
     if ($text ne '') { $template.='</td></tr></table>' };  
     return $template;      return $template;
 }  }
   
Line 830  sub help_open_bug { Line 872  sub help_open_bug {
     {      {
  $template .=    $template .= 
   "<table bgcolor='#AA3333' cellspacing='1' cellpadding='1' border='0'><tr>".    "<table bgcolor='#AA3333' cellspacing='1' cellpadding='1' border='0'><tr>".
   "<td bgcolor='#FF5555'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";    "<td bgcolor='#FF5555'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";
     }      }
   
     # Add the graphic      # Add the graphic
     my $title = &mt('Report a Bug');      my $title = &mt('Report a Bug');
     my $bugicon=&lonhttpdurl("/adm/lonMisc/smallBug.gif");      my $bugicon=&lonhttpdurl("/adm/lonMisc/smallBug.gif");
     $template .= <<"ENDTEMPLATE";      $template .= <<"ENDTEMPLATE";
  <a href="$link" title="$title"><img src="$bugicon" border="0" alt="(Bug: $topic)" /></a>   <a target="_top" href="$link" title="$title"><img src="$bugicon" border="0" alt="(Bug: $topic)" /></a>
 ENDTEMPLATE  ENDTEMPLATE
     if ($text ne '') { $template.='</td></tr></table>' };      if ($text ne '') { $template.='</td></tr></table>' };
     return $template;      return $template;
Line 875  sub help_open_faq { Line 917  sub help_open_faq {
     {      {
  $template .=    $template .= 
   "<table bgcolor='#337733' cellspacing='1' cellpadding='1' border='0'><tr>".    "<table bgcolor='#337733' cellspacing='1' cellpadding='1' border='0'><tr>".
   "<td bgcolor='#448844'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";    "<td bgcolor='#448844'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";
     }      }
   
     # Add the graphic      # Add the graphic
     my $title = &mt('View the FAQ');      my $title = &mt('View the FAQ');
     my $faqicon=&lonhttpdurl("/adm/lonMisc/smallFAQ.gif");      my $faqicon=&lonhttpdurl("/adm/lonMisc/smallFAQ.gif");
     $template .= <<"ENDTEMPLATE";      $template .= <<"ENDTEMPLATE";
  <a href="$link" title="$title"><img src="$faqicon" border="0" alt="(FAQ: $topic)" /></a>   <a target="_top" href="$link" title="$title"><img src="$faqicon" border="0" alt="(FAQ: $topic)" /></a>
 ENDTEMPLATE  ENDTEMPLATE
     if ($text ne '') { $template.='</td></tr></table>' };      if ($text ne '') { $template.='</td></tr></table>' };
     return $template;      return $template;
Line 1918  sub get_related_words { Line 1960  sub get_related_words {
         return ();          return ();
     }       } 
     my @Words=();      my @Words=();
       my $count=0;
     if (exists($thesaurus_db{$keyword})) {      if (exists($thesaurus_db{$keyword})) {
  # The first element is the number of times   # The first element is the number of times
  # the word appears.  We do not need it now.   # the word appears.  We do not need it now.
  (undef,@Words) = (split(/:/,$thesaurus_db{$keyword}));   my (undef,@RelatedWords) = (split(/:/,$thesaurus_db{$keyword}));
         for (my $i=0;$i<=$#Words;$i++) {   my (undef,$mostfrequentcount)=split(/\,/,$RelatedWords[0]);
             ($Words[$i],undef)= split(/\,/,$Words[$i]);   my $threshold=$mostfrequentcount/10;
           foreach my $possibleword (@RelatedWords) {
               my ($word,$wordcount)=split(/\,/,$possibleword);
               if ($wordcount>$threshold) {
    push(@Words,$word);
                   $count++;
                   if ($count>10) { last; }
       }
         }          }
     }      }
     untie %thesaurus_db;      untie %thesaurus_db;
Line 2002  sub nickname { Line 2052  sub nickname {
   
 sub getnames {  sub getnames {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
       if ($udom eq 'public' && $uname eq 'public') {
    return ('lastname' => &mt('Public'));
       }
     my $id=$uname.':'.$udom;      my $id=$uname.':'.$udom;
     my ($names,$cached)=&Apache::lonnet::is_cached_new('namescache',$id);      my ($names,$cached)=&Apache::lonnet::is_cached_new('namescache',$id);
     if ($cached) {      if ($cached) {
Line 2039  sub screenname { Line 2092  sub screenname {
 sub messagewrapper {  sub messagewrapper {
     my ($link,$username,$domain,$subject,$text)=@_;      my ($link,$username,$domain,$subject,$text)=@_;
     return       return 
         '<a href="/adm/email?compose=individual&'.          '<a href="/adm/email?compose=individual&amp;'.
         'recname='.$username.'&recdom='.$domain.          'recname='.$username.'&amp;recdom='.$domain.
  '&subject='.&escape($subject).'&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
Line 2822  sub bodytag { Line 2875  sub bodytag {
                    'alink'   => &designparm($function.'.alink',$domain),                     'alink'   => &designparm($function.'.alink',$domain),
    'vlink'   => &designparm($function.'.vlink',$domain),     'vlink'   => &designparm($function.'.vlink',$domain),
    'link'    => &designparm($function.'.link',$domain),);     'link'    => &designparm($function.'.link',$domain),);
     @$addentries{keys(%design)} = @design{keys(%design)};      @design{keys(%$addentries)} = @$addentries{keys(%$addentries)}; 
   
  # role and realm   # role and realm
     my ($role,$realm) = split(/\./,$env{'request.role'},2);      my ($role,$realm) = split(/\./,$env{'request.role'},2);
Line 2839  sub bodytag { Line 2892  sub bodytag {
     } else {      } else {
         $role = &Apache::lonnet::plaintext($role);          $role = &Apache::lonnet::plaintext($role);
     }      }
   
     if (!$realm) { $realm='&nbsp;'; }      if (!$realm) { $realm='&nbsp;'; }
 # Set messages  # Set messages
     my $messages=&domainlogo($domain);      my $messages=&domainlogo($domain);
Line 2846  sub bodytag { Line 2900  sub bodytag {
     my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'};      my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'};
     if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; }      if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; }
   
     my $extra_body_attr = &make_attr_string($forcereg,$addentries);      my $extra_body_attr = &make_attr_string($forcereg,\%design);
   
 # construct main body tag  # construct main body tag
     my $bodytag = "<body $extra_body_attr>".      my $bodytag = "<body $extra_body_attr>".
Line 2867  sub bodytag { Line 2921  sub bodytag {
     }      }
   
     my $name = &plainname($env{'user.name'},$env{'user.domain'});      my $name = &plainname($env{'user.name'},$env{'user.domain'});
       if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
    undef($role);
       } else {
    $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'});
       }
           
     my $roleinfo=(<<ENDROLE);      my $roleinfo=(<<ENDROLE);
 <td class="LC_title_bar_who">  <td class="LC_title_bar_who">
Line 3107  sub standard_css { Line 3166  sub standard_css {
     my $data_table_head      = $tabbg;      my $data_table_head      = $tabbg;
     my $data_table_light     = '#EEEEEE';      my $data_table_light     = '#EEEEEE';
     my $data_table_dark      = '#DDD';      my $data_table_dark      = '#DDD';
       my $data_table_darker    = '#CCC';
     my $data_table_highlight = '#FFFF00';      my $data_table_highlight = '#FFFF00';
     my $mail_new             = '#FFBB77';      my $mail_new             = '#FFBB77';
     my $mail_new_hover       = '#DD9955';      my $mail_new_hover       = '#DD9955';
Line 3124  sub standard_css { Line 3184  sub standard_css {
 h1, h2, h3, th { font-family: $sans }  h1, h2, h3, th { font-family: $sans }
 a:focus { color: red; background: yellow }   a:focus { color: red; background: yellow } 
 table.thinborder { border-collapse: collapse; }  table.thinborder { border-collapse: collapse; }
 table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px}  table.thinborder tr th {  border-style: solid; border-width: 1px; background: $tabbg;}
   table.thinborder tr td { border-style: solid; border-width: 1px}
   
 form, .inline { display: inline; }  form, .inline { display: inline; }
 .center { text-align: center; }  .center { text-align: center; }
 .LC_filename {font-family: $mono;}  .LC_filename {font-family: $mono;}
Line 3138  form, .inline { display: inline; } Line 3200  form, .inline { display: inline; }
 .LC_success {  .LC_success {
   color: green;    color: green;
 }  }
   .LC_icon {
     border: 0px;
   }
   
 table#LC_top_nav, table#LC_menubuttons {  table#LC_top_nav, table#LC_menubuttons {
   width: 100%;    width: 100%;
Line 3175  table#LC_title_bar td { Line 3240  table#LC_title_bar td {
 table#LC_title_bar td.LC_title_bar_who {  table#LC_title_bar td.LC_title_bar_who {
   background: $tabbg;    background: $tabbg;
   color: $font;    color: $font;
   font: medium $sans;    font: small $sans;
   text-align: right;    text-align: right;
 }  }
 span.LC_title_bar_title {  span.LC_title_bar_title {
   font: bold xx-large $sans;    font: bold x-large $sans;
 }  }
 table#LC_title_bar td.LC_title_bar_domain_logo {  table#LC_title_bar td.LC_title_bar_domain_logo {
   background: $sidebg;    background: $sidebg;
Line 3213  table#LC_top_nav td a, div#LC_top_nav a Line 3278  table#LC_top_nav td a, div#LC_top_nav a
 }  }
 table#LC_top_nav td.LC_top_nav_logo {  table#LC_top_nav td.LC_top_nav_logo {
   background: $tabbg;    background: $tabbg;
   text-align: right;    text-align: left;
   white-space: nowrap;    white-space: nowrap;
   font-weight: bold;    width: 31px;
 }  }
 table#LC_top_nav td.LC_top_nav_logo img {  table#LC_top_nav td.LC_top_nav_logo img {
   margin-left: 0.2em;    border: 0px;
   vertical-align: bottom;    vertical-align: bottom;
 }  }
   table#LC_top_nav td.LC_top_nav_exit,
   table#LC_top_nav td.LC_top_nav_help {
     width: 2.0em;
   }
 table.LC_breadcrumbs td, table.LC_docs_path td  {  table.LC_breadcrumbs td, table.LC_docs_path td  {
   background: $tabbg;    background: $tabbg;
   color: $font;    color: $font;
Line 3261  td.LC_menubuttons_img { Line 3330  td.LC_menubuttons_img {
   font-weight: bold;    font-weight: bold;
 }  }
   
   table.LC_aboutme_port {
     border: 0px;
     border-collapse: collapse;
     border-spacing: 0px;
   }
 table.LC_data_table, table.LC_mail_list {  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;
   }
   .LC_data_table_dense {
     font-size: small;
 }  }
 table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th {  table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th {
   font-weight: bold;    font-weight: bold;
   background-color: $data_table_head;    background-color: $data_table_head;
     font-size: smaller;
 }  }
 table.LC_data_table tr td {  table.LC_data_table tr td, 
   table.LC_aboutme_port tr td {
   background-color: $data_table_light;    background-color: $data_table_light;
     padding: 2px;
 }  }
 table.LC_data_table tr.LC_even_row td {  table.LC_data_table tr.LC_even_row td,
   table.LC_aboutme_port tr.LC_even_row td {
   background-color: $data_table_dark;    background-color: $data_table_dark;
 }  }
 table.LC_data_table tr.LC_empty td {  table.LC_data_table tr.LC_data_table_highlight td {
     background-color: $data_table_darker;
   }
   table.LC_data_table tr.LC_empty_row td {
   background-color: #FFFFFF;    background-color: #FFFFFF;
     font-weight: bold;
     font-style: italic;
     text-align: center;
     padding: 8px;
 }  }
   
 table.LC_calendar {  table.LC_calendar {
Line 3461  table#LC_helpmenu_links a:hover { Line 3550  table#LC_helpmenu_links a:hover {
   color: $vlink;    color: $vlink;
 }  }
   
   .LC_chrt_popup_exists {
     border: 1px solid #339933;
     margin: -1px;
   }
   .LC_chrt_popup_up {
     border: 1px solid yellow;
     margin: -1px;
   }
   .LC_chrt_popup {
     border: 1px solid #8888FF;
     background: #CCCCFF;
   }
   
   table.LC_pick_box {
     width: 100%;
     border-collapse: separate;
     background: white;
     border: 1px solid black;
     border-spacing: 1px;
   }
   table.LC_pick_box td.LC_pick_box_title {
     background: $tabbg;
     font-weight: bold;
     text-align: right;
     width: 184px;
     padding: 8px;
   }
   table.LC_pick_box td.LC_pick_box_separator {
     padding: 0px;
     height: 1px;
     background: black;
   }
   table.LC_pick_box td.LC_pick_box_submit {
     text-align: right;
   }
   
   table.LC_group_priv_box {
     background: white;
     border: 1px solid black;
     border-spacing: 1px;
   }
   table.LC_group_priv_box td.LC_pick_box_title {
     background: $tabbg;
     font-weight: bold;
     text-align: right;
     width: 184px;
   }
   table.LC_group_priv_box td.LC_groups_fixed {
     background: $data_table_light;
     text-align: center;
   }
   table.LC_group_priv_box td.LC_groups_optional {
     background: $data_table_dark;
     text-align: center;
   }
   table.LC_group_priv_box td.LC_groups_functionality {
     background: $data_table_darker;
     text-align: center;
     font-weight: bold;
   }
   table.LC_group_priv td {
     text-align: left;
     padding: 0px;
   }
   
   table.LC_notify_front_page {
     background: white;
     border: 1px solid black;
     padding: 8px;
   }
   table.LC_notify_front_page td {
     padding: 8px;
   }
   .LC_navbuttons {
     margin: 2ex 0ex 2ex 0ex;
   }
   .LC_topic_bar {
     font-family: $sans;
     font-weight: bold;
     width: 100%;
     background: $tabbg;
     vertical-align: middle;
     margin: 2ex 0ex 2ex 0ex;
   }
   .LC_topic_bar span {
     vertical-align: middle;
   }
   .LC_topic_bar img {
     vertical-align: bottom;
   }
   table.LC_course_group_status {
     margin: 20px;
   }
   table.LC_status_selector td {
     vertical-align: top;
     text-align: center;
     padding: 4px;
   }
   table.LC_descriptive_input td.LC_description {
     vertical-align: top;
     text-align: right;
     font-weight: bold;
   }
   
 END  END
 }  }
   
Line 3477  Inputs: $title - optional title for the Line 3670  Inputs: $title - optional title for the
         $args - optional arguments          $args - optional arguments
             force_register - if is true call registerurl so the remote is               force_register - if is true call registerurl so the remote is 
                              informed                               informed
             redirect       -> array ref of seconds before redirect occurs              redirect       -> array ref of
                                     url to redirect to                                     1- seconds before redirect occurs
                                      2- url to redirect to
                                      3- whether the side effect should occur
                            (side effect of setting                              (side effect of setting 
                                $env{'internal.head.redirect'} to the url                                  $env{'internal.head.redirect'} to the url 
                                redirected too)                                 redirected too)
Line 3497  sub headtag { Line 3692  sub headtag {
     my $function = $args->{'function'} || &get_users_function();      my $function = $args->{'function'} || &get_users_function();
     my $domain   = $args->{'domain'}   || &determinedomain();      my $domain   = $args->{'domain'}   || &determinedomain();
     my $bgcolor  = $args->{'bgcolor'}  || &designparm($function.'.pgbg',$domain);      my $bgcolor  = $args->{'bgcolor'}  || &designparm($function.'.pgbg',$domain);
     my $url = join(':',$env{'user.name'},$env{'user.domain'},time(),      my $url = join(':',$env{'user.name'},$env{'user.domain'},
    #$env{'environment.color.timestamp'},     #time(),
      $env{'environment.color.timestamp'},
    $function,$domain,$bgcolor);     $function,$domain,$bgcolor);
   
     $url = '/adm/css/'.&escape($url).'.css';      $url = '/adm/css/'.&escape($url).'.css';
Line 3511  sub headtag { Line 3707  sub headtag {
     if ($args->{'force_register'}) {      if ($args->{'force_register'}) {
  $result .= &Apache::lonmenu::registerurl(1);   $result .= &Apache::lonmenu::registerurl(1);
     }      }
       if (!$args->{'no_nav_bar'} 
    && !$args->{'only_body'}
    && !$args->{'frameset'}) {
    $result .= &help_menu_js();
       }
   
     if (ref($args->{'redirect'})) {      if (ref($args->{'redirect'})) {
  my ($time,$url,$inhibit_continue) = @{$args->{'redirect'}};   my ($time,$url,$inhibit_continue) = @{$args->{'redirect'}};
Line 3680  sub start_page { Line 3881  sub start_page {
     #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));      #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));
     my %head_args;      my %head_args;
     foreach my $arg ('redirect','force_register','domain','function',      foreach my $arg ('redirect','force_register','domain','function',
      'bgcolor') {       'bgcolor','frameset','no_nav_bar','only_body') {
  if (defined($args->{$arg})) {   if (defined($args->{$arg})) {
     $head_args{$arg} = $args->{$arg};      $head_args{$arg} = $args->{$arg};
  }   }
Line 3828  sub simple_error_page { Line 4029  sub simple_error_page {
 {  {
     my $row_count;      my $row_count;
     sub start_data_table {      sub start_data_table {
    my ($add_class) = @_;
    my $css_class = (join(' ','LC_data_table',$add_class));
  undef($row_count);   undef($row_count);
  return '<table class="LC_data_table">'."\n";   return '<table class="'.$css_class.'">'."\n";
     }      }
   
     sub end_data_table {      sub end_data_table {
Line 3838  sub simple_error_page { Line 4041  sub simple_error_page {
     }      }
   
     sub start_data_table_row {      sub start_data_table_row {
    my ($add_class) = @_;
  $row_count++;   $row_count++;
  return  '<tr '.(($row_count % 2)?'':'class="LC_even_row"').'>'."\n";;   my $css_class = ($row_count % 2)?'':'LC_even_row';
    $css_class = (join(' ',$css_class,$add_class));
    return  '<tr class="'.$css_class.'">'."\n";;
     }      }
   
     sub end_data_table_row {      sub end_data_table_row {
  return '</tr>'."\n";;   return '</tr>'."\n";;
     }      }
   
       sub start_data_table_empty_row {
    $row_count++;
    return  '<tr class="LC_empty_row" >'."\n";;
       }
   
       sub end_data_table_empty_row {
    return '</tr>'."\n";;
       }
   
     sub start_data_table_header_row {      sub start_data_table_header_row {
  return  '<tr class="LC_header_row">'."\n";;   return  '<tr class="LC_header_row">'."\n";;
     }      }
Line 3946  sub check_user_status { Line 4161  sub check_user_status {
   
 Determines all the sections for a course including  Determines all the sections for a course including
 sections with students and sections containing other roles.  sections with students and sections containing other roles.
 Incoming parameters: domain, course number,   Incoming parameters: 
 reference to array containing roles for which sections should   
 be gathered (optional). If the third argument is undefined,  1. domain
 sections are gathered for any role.  2. course number 
   3. reference to array containing roles for which sections should 
   be gathered (optional).
   4. reference to array containing status types for which sections 
   should be gathered (optional).
   
   If the third argument is undefined, sections are gathered for any role. 
   If the fourth argument is undefined, sections are gathered for any status.
   Permissible values are 'active' or 'future' or 'previous'.
     
 Returns section hash (keys are section IDs, values are  Returns section hash (keys are section IDs, values are
 number of users in each section), subject to the  number of users in each section), subject to the
 optional roles filter.  optional roles filter, optional status filter 
   
 =cut  =cut
   
 ###############################################  ###############################################
 sub get_sections {  sub get_sections {
     my ($cdom,$cnum,$possible_roles) = @_;      my ($cdom,$cnum,$possible_roles,$possible_status) = @_;
     if (!defined($cdom) || !defined($cnum)) {      if (!defined($cdom) || !defined($cnum)) {
         my $cid =  $env{'request.course.id'};          my $cid =  $env{'request.course.id'};
   
Line 3970  sub get_sections { Line 4193  sub get_sections {
     }      }
   
     my %sectioncount;      my %sectioncount;
       my $now = time;
   
     if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) {      if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) {
  my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum);   my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum);
  my $sec_index = &Apache::loncoursedata::CL_SECTION();   my $sec_index = &Apache::loncoursedata::CL_SECTION();
  my $status_index = &Apache::loncoursedata::CL_STATUS();   my $status_index = &Apache::loncoursedata::CL_STATUS();
           my $start_index = &Apache::loncoursedata::CL_START();
           my $end_index = &Apache::loncoursedata::CL_END();
           my $status;
  while (my ($student,$data) = each(%$classlist)) {   while (my ($student,$data) = each(%$classlist)) {
     my ($section,$status) = ($data->[$sec_index],      my ($section,$stu_status,$start,$end) = ($data->[$sec_index],
      $data->[$status_index]);                       $data->[$status_index],
     unless ($section eq '-1' || $section =~ /^\s*$/) {                                                       $data->[$start_index],
  $sectioncount{$section}++;                                                       $data->[$end_index]);
               if ($stu_status eq 'Active') {
                   $status = 'active';
               } elsif ($end < $now) {
                   $status = 'previous';
               } elsif ($start > $now) {
                   $status = 'future';
               } 
       if ($section ne '-1' && $section !~ /^\s*$/) {
                   if ((!defined($possible_status)) || (($status ne '') && 
                       (grep/^\Q$status\E$/,@{$possible_status}))) { 
       $sectioncount{$section}++;
                   }
     }      }
  }   }
     }      }
Line 3988  sub get_sections { Line 4227  sub get_sections {
  if ($user !~ /^(\w{2})/) { next; }   if ($user !~ /^(\w{2})/) { next; }
  my ($role) = ($user =~ /^(\w{2})/);   my ($role) = ($user =~ /^(\w{2})/);
  if ($possible_roles && !(grep(/^$role$/,@$possible_roles))) { next; }   if ($possible_roles && !(grep(/^$role$/,@$possible_roles))) { next; }
  my $section;   my ($section,$status);
  if ($role eq 'cr' &&   if ($role eq 'cr' &&
     $user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) {      $user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) {
     $section=$1;      $section=$1;
  }   }
  if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) { $section=$1; }   if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) { $section=$1; }
  if (!defined($section) || $section eq '-1') { next; }   if (!defined($section) || $section eq '-1') { next; }
  $sectioncount{$section}++;          my ($end,$start) = ($courseroles{$user} =~ /^([^:]*):([^:]*)$/);
           if ($end == -1 && $start == -1) {
               next; #deleted role
           }
           if (!defined($possible_status)) { 
               $sectioncount{$section}++;
           } else {
               if ((!$end || $end >= $now) && (!$start || $start <= $now)) {
                   $status = 'active';
               } elsif ($end < $now) {
                   $status = 'future';
               } elsif ($start > $now) {
                   $status = 'previous';
               }
               if (($status ne '') && (grep/^\Q$status\E$/,@{$possible_status})) {
                   $sectioncount{$section}++;
               }
           }
     }      }
     return %sectioncount;      return %sectioncount;
 }  }
Line 4034  of the possibility of multiple values fo Line 4290  of the possibility of multiple values fo
 sub get_course_users {  sub get_course_users {
     my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_;      my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_;
     my %idx = ();      my %idx = ();
       my %seclists;
   
     $idx{udom} = &Apache::loncoursedata::CL_SDOM();      $idx{udom} = &Apache::loncoursedata::CL_SDOM();
     $idx{uname} =  &Apache::loncoursedata::CL_SNAME();      $idx{uname} =  &Apache::loncoursedata::CL_SNAME();
Line 4050  sub get_course_users { Line 4307  sub get_course_users {
         foreach my $student (keys(%{$classlist})) {          foreach my $student (keys(%{$classlist})) {
             my $match = 0;              my $match = 0;
             my $secmatch = 0;              my $secmatch = 0;
               my $section = $$classlist{$student}[$idx{section}];
               if ($section eq '') {
                   $section = 'none';
               }
             if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) {              if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) {
                 if (grep/^all$/,@{$sections}) {                  if (grep(/^all$/,@{$sections})) {
                     $secmatch = 1;                      $secmatch = 1;
                 } elsif ($$classlist{$student}[$idx{section}] eq '') {                  } elsif ($$classlist{$student}[$idx{section}] eq '') {
                     if (grep/^none$/,@{$sections}) {                      if (grep(/^none$/,@{$sections})) {
                         $secmatch = 1;                          $secmatch = 1;
                     }                      }
                 } else {                    } else {  
     if (grep(/^\Q$$classlist{$student}[$idx{section}]\E$/,      if (grep(/^\Q$section\E$/,@{$sections})) {
     @{$sections})) {  
         $secmatch = 1;          $secmatch = 1;
                     }                      }
  }   }
                 if (!$secmatch) {                  if (!$secmatch) {
                     next;                      next;
                 }                  }
             }               }
               push(@{$seclists{$student}},$section); 
             if (defined($$types{'active'})) {              if (defined($$types{'active'})) {
                 if ($$classlist{$student}[$idx{status}] eq 'Active') {                  if ($$classlist{$student}[$idx{status}] eq 'Active') {
                     push(@{$$users{st}{$student}},'active');                      push(@{$$users{st}{$student}},'active');
Line 4091  sub get_course_users { Line 4352  sub get_course_users {
         }          }
     }      }
     if ((@{$roles} > 1) || ((@{$roles} == 1) && ($$roles[0] ne "st"))) {      if ((@{$roles} > 1) || ((@{$roles} == 1) && ($$roles[0] ne "st"))) {
         my @coursepersonnel = &Apache::lonnet::getkeys('nohist_userroles',$cdom,$cnum);          my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
         foreach my $person (@coursepersonnel) {          my $now = time;
           foreach my $person (sort(keys(%coursepersonnel))) {
             my $match = 0;              my $match = 0;
             my $secmatch = 0;              my $secmatch = 0;
               my $status;
             my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/);              my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/);
             $user =~ s/:$//;              $user =~ s/:$//;
             if (($role) && (grep(/^\Q$role\E$/,@{$roles}))) {              my ($end,$start) = split(/:/,$coursepersonnel{$person});
               if ($end == -1 || $start == -1) {
                   next;
               }
               if (($role) && ((grep(/^\Q$role\E$/,@{$roles})) ||
                   (grep(/^cr$/,@{$roles}) && $role =~ /^cr\//))) {
                 my ($uname,$udom) = split(/:/,$user);                  my ($uname,$udom) = split(/:/,$user);
                 if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) {                  if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) {
                     if (grep/^all$/,@{$sections}) {                      if (grep(/^all$/,@{$sections})) {
                         $secmatch = 1;                          $secmatch = 1;
                     } elsif ($usec eq '') {                      } elsif ($usec eq '') {
                         if (grep/^none$/,@{$sections}) {                          if (grep(/^none$/,@{$sections})) {
                             $secmatch = 1;                              $secmatch = 1;
                         }                          }
                     } else {                      } else {
Line 4115  sub get_course_users { Line 4383  sub get_course_users {
                         next;                          next;
                     }                      }
                 }                  }
                   if ($usec eq '') {
                       $usec = 'none';
                   }
                 if ($uname ne '' && $udom ne '') {                  if ($uname ne '' && $udom ne '') {
                     my $status = &check_user_status($udom,$uname,$cdom,$cnum,$role,                      if ($end < $now) {
                                                     $usec);                          $status = 'previous';
                       } elsif ($start > $now) {
                           $status = 'future';
                       } else {
                           $status = 'active';
                       }
                     foreach my $type (keys(%{$types})) {                       foreach my $type (keys(%{$types})) { 
                         if ($status eq $type) {                          if ($status eq $type) {
                             @{$$users{$role}{$user}} = $type;                              if (!grep(/^\Q$type\E$/,@{$$users{$role}{$user}})) {
                                   push(@{$$users{$role}{$user}},$type);
                               }
                             $match = 1;                              $match = 1;
                         }                          }
                     }                      }
                     if (($match) && (ref($userdata) eq 'HASH') &&                      if (($match) && (ref($userdata) eq 'HASH')) {
                         (!exists($$userdata{$uname.':'.$udom}))) {                          if (!exists($$userdata{$uname.':'.$udom})) {
  &get_user_info($udom,$uname,\%idx,$userdata);      &get_user_info($udom,$uname,\%idx,$userdata);
                           }
                           if (!grep(/^\Q$usec\E$/,@{$seclists{$uname.':'.$udom}})) {
                               push(@{$seclists{$uname.':'.$udom}},$usec);
                           }
                     }                      }
                 }                  }
             }              }
Line 4136  sub get_course_users { Line 4418  sub get_course_users {
                 my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum);                  my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum);
                 if ( defined($csettings{'internal.courseowner'}) ) {                  if ( defined($csettings{'internal.courseowner'}) ) {
                     my $owner = $csettings{'internal.courseowner'};                      my $owner = $csettings{'internal.courseowner'};
                     @{$$users{'ow'}{$owner.':'.$cdom}} = 'any';                      if ($owner !~ /^[^:]+:[^:]+$/) {
                           $owner = $owner.':'.$cdom;
                       }
                       @{$$users{'ow'}{$owner}} = 'any';
                     if (defined($userdata) &&                       if (defined($userdata) && 
  !exists($$userdata{$owner.':'.$cdom})) {   !exists($$userdata{$owner.':'.$cdom})) {
  &get_user_info($cdom,$owner,\%idx,$userdata);   &get_user_info($cdom,$owner,\%idx,$userdata);
                           if (!grep(/^none$/,@{$seclists{$owner.':'.$cdom}})) {
                               push(@{$seclists{$owner.':'.$cdom}},'none');
                           }
     }      }
                 }                  }
             }              }
         }          }
           foreach my $user (keys(%seclists)) {
               @{$seclists{$user}} = (sort {$a <=> $b} @{$seclists{$user}});
               $$userdata{$user}[$idx{section}] = join(',',@{$seclists{$user}});
           }
     }      }
     return;      return;
 }  }

Removed from v.1.414  
changed lines
  Added in v.1.441


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