Diff for /loncom/auth/lonlogin.pm between versions 1.136 and 1.151

version 1.136, 2010/03/31 23:11:48 version 1.151, 2012/04/18 18:57:34
Line 64  sub handler { Line 64  sub handler {
   
   
 # Are we re-routing?  # Are we re-routing?
     if (-e '/home/httpd/html/lon-status/reroute.txt') {      my $londocroot = $r->dir_config('lonDocRoot'); 
       if (-e "$londocroot/lon-status/reroute.txt") {
  &Apache::lonauth::reroute($r);   &Apache::lonauth::reroute($r);
  return OK;   return OK;
     }      }
   
       $env{'form.firsturl'} =~ s/(`)/'/g;
   
 # -------------------------------- Prevent users from attempting to login twice  # -------------------------------- Prevent users from attempting to login twice
     my $handle = &Apache::lonnet::check_for_valid_session($r);      my $handle = &Apache::lonnet::check_for_valid_session($r);
Line 90  sub handler { Line 92  sub handler {
             }              }
     $r->print(      $r->print(
                   $start_page                    $start_page
                  .'<h1>'.&mt('You are already logged in!').'</h1>'                   .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
                  .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',                   .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',
                   '<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>').'</p>'                    '<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>').'</p>'
                  .$end_page                   .$end_page
Line 130  sub handler { Line 132  sub handler {
     }      }
     my $role    = $r->dir_config('lonRole');      my $role    = $r->dir_config('lonRole');
     my $loadlim = $r->dir_config('lonLoadLim');      my $loadlim = $r->dir_config('lonLoadLim');
       my $uloadlim= $r->dir_config('lonUserLoadLim');
     my $servadm = $r->dir_config('lonAdmEMail');      my $servadm = $r->dir_config('lonAdmEMail');
     my $tabdir  = $r->dir_config('lonTabDir');      my $tabdir  = $r->dir_config('lonTabDir');
     my $include = $r->dir_config('lonIncludes');      my $include = $r->dir_config('lonIncludes');
Line 149  sub handler { Line 152  sub handler {
  $loadavg=<$loadfile>;   $loadavg=<$loadfile>;
     }      }
     $loadavg =~ s/\s.*//g;      $loadavg =~ s/\s.*//g;
     my $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);  
     my $userloadpercent=&Apache::lonnet::userload();  
   
 # ------------------------------------------------------- Do the load balancing      my ($loadpercent,$userloadpercent);
     my $otherserver= &Apache::lonnet::absolute_url($host_name);      if ($loadlim) {
           $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
       }
       if ($uloadlim) {
           $userloadpercent=&Apache::lonnet::userload();
       }
   
     my $firsturl=      my $firsturl=
     ($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'});      ($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'});
 # ---------------------------------------------------------- Are we overloaded?  
     if ((($userloadpercent>100.0)||($loadpercent>100.0))) {  
         my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent);  
  if ($unloaded) { $otherserver=$unloaded; }  
     }  
   
 # ----------------------------------------------------------- Get announcements  # ----------------------------------------------------------- Get announcements
     my $announcements=&Apache::lonnet::getannounce();      my $announcements=&Apache::lonnet::getannounce();
Line 199  sub handler { Line 201  sub handler {
        'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras,         'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras,
        $lonhost);         $lonhost);
   
 # ------------------- If we cannot talk to ourselves, we are in serious trouble  # -- If we cannot talk to ourselves, or hostID does not map to a hostname
   #    we are in serious trouble
   
     if ($logtoken eq 'con_lost') {      if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
           if ($logtoken eq 'no_such_host') {
               &Apache::lonnet::logthis('No valid logtoken for log-in page -- unable to determine hostname for hostID: '.$lonhost.'. Check entry in hosts.tab');
           }
         my $spares='';          my $spares='';
  my $last;   my $last;
         foreach my $hostid (sort          foreach my $hostid (sort
Line 212  sub handler { Line 218  sub handler {
     keys(%Apache::lonnet::spareid)) {      keys(%Apache::lonnet::spareid)) {
             next if ($hostid eq $lonhost);              next if ($hostid eq $lonhost);
     my $hostname = &Apache::lonnet::hostname($hostid);      my $hostname = &Apache::lonnet::hostname($hostid);
     next if ($last eq $hostname);      next if (($last eq $hostname) || ($hostname eq ''));
             $spares.='<br /><font size="+1"><a href="http://'.              $spares.='<br /><font size="+1"><a href="http://'.
                 $hostname.                  $hostname.
                 '/adm/login?domain='.$authdomain.'">'.                  '/adm/login?domain='.$authdomain.'">'.
Line 220  sub handler { Line 226  sub handler {
                 ' '.&mt('(preferred)').'</font>'.$/;                  ' '.&mt('(preferred)').'</font>'.$/;
     $last=$hostname;      $last=$hostname;
         }          }
 $spares.= '<br />';          if ($spares) {
 my %all_hostnames = &Apache::lonnet::all_hostnames();              $spares.= '<br />';
 foreach my $hostid (sort          }
           my %all_hostnames = &Apache::lonnet::all_hostnames();
           foreach my $hostid (sort
     {      {
  &Apache::lonnet::hostname($a) cmp   &Apache::lonnet::hostname($a) cmp
     &Apache::lonnet::hostname($b);      &Apache::lonnet::hostname($b);
     }      }
     keys(%all_hostnames)) {      keys(%all_hostnames)) {
     next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});              next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});
     my $hostname = &Apache::lonnet::hostname($hostid);              my $hostname = &Apache::lonnet::hostname($hostid);
     next if ($last eq $hostname);              next if (($last eq $hostname) || ($hostname eq ''));
     $spares.='<br /><a href="http://'.              $spares.='<br /><a href="http://'.
  $hostname.               $hostname.
  '/adm/login?domain='.$authdomain.'">'.               '/adm/login?domain='.$authdomain.'">'.
  $hostname.'</a>';               $hostname.'</a>';
     $last=$hostname;              $last=$hostname;
 }           }
 $r->print(           $r->print(
    '<html>'     '<html>'
   .'<head><title>'    .'<head><title>'
   .&mt('The LearningOnline Network with CAPA')    .&mt('The LearningOnline Network with CAPA')
Line 245  $r->print( Line 253  $r->print(
   .'<body bgcolor="#FFFFFF">'    .'<body bgcolor="#FFFFFF">'
   .'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'    .'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'
   .'<img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />'    .'<img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />'
   .'<h3>'.&mt('This LON-CAPA server is temporarily not available for login.').'</h3>'    .'<h3>'.&mt('This LON-CAPA server is temporarily not available for login.').'</h3>');
   .'<p>'.&mt('Please attempt to login to one of the following servers:').'</p>'          if ($spares) {
   .$spares              $r->print('<p>'.&mt('Please attempt to login to one of the following servers:')
   .'</body>'                       .'</p>'
   .'</html>'                       .$spares);
 );          }
 return OK;          $r->print('</body>'
 }                   .'</html>'
           );
           return OK;
       }
   
 # ----------------------------------------------- Apparently we are in business  # ----------------------------------------------- Apparently we are in business
 $servadm=~s/\,/\<br \/\>/g;      $servadm=~s/\,/\<br \/\>/g;
   
 # ----------------------------------------------------------- Front page design  # ----------------------------------------------------------- Front page design
 my $pgbg=&Apache::loncommon::designparm('login.pgbg',$domain);      my $pgbg=&Apache::loncommon::designparm('login.pgbg',$domain);
 my $font=&Apache::loncommon::designparm('login.font',$domain);      my $font=&Apache::loncommon::designparm('login.font',$domain);
 my $link=&Apache::loncommon::designparm('login.link',$domain);      my $link=&Apache::loncommon::designparm('login.link',$domain);
 my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);      my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);
 my $alink=&Apache::loncommon::designparm('login.alink',$domain);      my $alink=&Apache::loncommon::designparm('login.alink',$domain);
 my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);      my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);
 my $logo=&Apache::loncommon::designparm('login.logo',$domain);      my $loginbox_bg=&Apache::loncommon::designparm('login.sidebg',$domain);
 my $img=&Apache::loncommon::designparm('login.img',$domain);      my $loginbox_header_bgcol=&Apache::loncommon::designparm('login.bgcol',$domain);
 my $domainlogo='<div>'.&Apache::loncommon::domainlogo($domain).'</div>';      my $loginbox_header_textcol=&Apache::loncommon::designparm('login.textcol',$domain);
 my $login=&Apache::loncommon::designparm('login.login',$domain);      my $logo=&Apache::loncommon::designparm('login.logo',$domain);
 if ($login eq '') {      my $img=&Apache::loncommon::designparm('login.img',$domain);
 $login = $iconpath.'/'.&mt('userauthentication.gif');      my $domainlogo=&Apache::loncommon::domainlogo($domain);
 }      my $showbanner = 1;
 my $showbanner = 1;      my $showmainlogo = 1;
 my $showmainlogo = 1;      if (defined(&Apache::loncommon::designparm('login.showlogo_img',$domain))) {
 if (defined(&Apache::loncommon::designparm('login.showlogo_img',$domain))) {          $showbanner = &Apache::loncommon::designparm('login.showlogo_img',$domain);
     $showbanner = &Apache::loncommon::designparm('login.showlogo_img',$domain);      }
 }      if (defined(&Apache::loncommon::designparm('login.showlogo_logo',$domain))) {
 if (defined(&Apache::loncommon::designparm('login.showlogo_logo',$domain))) {          $showmainlogo = &Apache::loncommon::designparm('login.showlogo_logo',$domain);
     $showmainlogo = &Apache::loncommon::designparm('login.showlogo_logo',$domain);      }
 }      my $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);
 my $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);      my $showcoursecat =
 my $showcoursecat =          &Apache::loncommon::designparm('login.coursecatalog',$domain);
 &Apache::loncommon::designparm('login.coursecatalog',$domain);      my $shownewuserlink = 
 my $loginheader =&Apache::loncommon::designparm('login.loginheader',$domain);          &Apache::loncommon::designparm('login.newuser',$domain);
 my $shownewuserlink =       my $now=time;
 &Apache::loncommon::designparm('login.newuser',$domain);      my $js = (<<ENDSCRIPT);
 my $now=time;  
 my $js = (<<ENDSCRIPT);  
   
 <script type="text/javascript" language="JavaScript">  <script type="text/javascript" language="JavaScript">
 // <![CDATA[  // <![CDATA[
Line 315  this.document.client.elements.upass$now. Line 324  this.document.client.elements.upass$now.
 this.document.server.submit();  this.document.server.submit();
 return false;  return false;
 }  }
   
   function enableInput() {
       this.document.client.elements.upass$now.removeAttribute("readOnly");
       this.document.client.elements.uname.removeAttribute("readOnly");
       this.document.client.elements.udom.removeAttribute("readOnly");
       return;
   }
   
 // ]]>  // ]]>
 </script>  </script>
   
Line 322  ENDSCRIPT Line 339  ENDSCRIPT
   
 # --------------------------------------------------- Print login screen header  # --------------------------------------------------- Print login screen header
   
 my %add_entries = (      my %add_entries = (
        bgcolor      => "$mainbg",         bgcolor      => "$mainbg",
        text         => "$font",         text         => "$font",
        link         => "$link",         link         => "$link",
        vlink        => "$vlink",         vlink        => "$vlink",
        alink        => "$alink",);         alink        => "$alink",
                  onload       => 'javascript:enableInput();',);
   
 $r->print(&Apache::loncommon::start_page('The LearningOnline Network with CAPA Login',$js,      $r->print(&Apache::loncommon::start_page('The LearningOnline Network with CAPA Login',$js,
        { 'redirect'       => [$expire,'/adm/roles'],          { 'redirect'       => [$expire,'/adm/roles'], 
  'add_entries' => \%add_entries,   'add_entries' => \%add_entries,
  'only_body'   => 1,}));   'only_body'   => 1,}));
   
 # ----------------------------------------------------------------------- Texts  # ----------------------------------------------------------------------- Texts
   
 my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
           'un'       => 'Username',            'un'       => 'Username',
           'pw'       => 'Password',            'pw'       => 'Password',
           'dom'      => 'Domain',            'dom'      => 'Domain',
Line 354  my %lt=&Apache::lonlocal::texthash( Line 372  my %lt=&Apache::lonlocal::texthash(
        );         );
 # -------------------------------------------------- Change password field name  # -------------------------------------------------- Change password field name
   
 my $forgotpw = &forgotpwdisplay(%lt);      my $forgotpw = &forgotpwdisplay(%lt);
 $forgotpw .= '<br />' if $forgotpw;      $forgotpw .= '<br />' if $forgotpw;
 my $loginhelp = &loginhelpdisplay($authdomain,%lt);      my $loginhelp = &loginhelpdisplay($authdomain,%lt);
 $loginhelp .= '<br />' if $loginhelp;      $loginhelp .= '<br />' if $loginhelp;
   
 # ---------------------------------------------------- Serve out DES JavaScript  # ---------------------------------------------------- Serve out DES JavaScript
 {      {
 my $jsh=Apache::File->new($include."/londes.js");      my $jsh=Apache::File->new($include."/londes.js");
 $r->print(<$jsh>);      $r->print(<$jsh>);
 }      }
 # ---------------------------------------------------------- Serve rest of page  # ---------------------------------------------------------- Serve rest of page
   
 $r->print(      $r->print(
   '<div class="LC_loginpage_container">');      '<div class="LC_Box"'
      .' style="margin:0 auto; padding:10px; width:90%; height: auto; background-color:#FFFFFF;">'
 #  );
 #  If the loadbalancing yielded just http:// because perhaps there's no loadbalancing?  
 #  then just us a relative link to authenticate:  
 #  
   
 $r->print(<<ENDSERVERFORM);      $r->print(<<ENDSERVERFORM);
 <form name="server" action="$otherserver/adm/authenticate" method="post" target="_top">  <form name="server" action="/adm/authenticate" method="post" target="_top">
    <input type="hidden" name="logtoken" value="$logtoken" />     <input type="hidden" name="logtoken" value="$logtoken" />
    <input type="hidden" name="serverid" value="$lonhost" />     <input type="hidden" name="serverid" value="$lonhost" />
    <input type="hidden" name="uname" value="" />     <input type="hidden" name="uname" value="" />
Line 387  $r->print(<<ENDSERVERFORM); Line 402  $r->print(<<ENDSERVERFORM);
    <input type="hidden" name="localres" value="$env{'form.localres'}" />     <input type="hidden" name="localres" value="$env{'form.localres'}" />
   </form>    </form>
 ENDSERVERFORM  ENDSERVERFORM
 my $coursecatalog;      my $coursecatalog;
 if (($showcoursecat eq '') || ($showcoursecat)) {      if (($showcoursecat eq '') || ($showcoursecat)) {
     $coursecatalog = &coursecatalog_link($lt{'catalog'}).'<br />';          $coursecatalog = &coursecatalog_link($lt{'catalog'}).'<br />';
 }      }
 my $newuserlink;      my $newuserlink;
 if ($shownewuserlink) {      if ($shownewuserlink) {
     $newuserlink = &newuser_link($lt{'newuser'}).'<br />';          $newuserlink = &newuser_link($lt{'newuser'}).'<br />';
 }      }
 my $logintitle;      my $logintitle =
 if ($loginheader eq 'text') {          '<h2 class="LC_hcell"'
     $logintitle ='<h2>'.$lt{'log'}.'</h2>';         .' style="background:'.$loginbox_header_bgcol.';'
 } else {         .' color:'.$loginbox_header_textcol.'">'
     $logintitle = '<img src="'.$login.'" alt="'.         .$lt{'log'}
                   &mt('User Authentication').'" />';         .'</h2>';
 }  
       my $noscript_warning='<noscript><span class="LC_warning"><b>'
 my $noscript_warning='<noscript><span class="LC_warning"><b>'                          .&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.')
                      .&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.')                          .'</b></span></noscript>';
                     .'</b></span></noscript>';      my $helpdeskscript;
 my $helpdeskscript;      my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,
 my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,                                         $authdomain,\$helpdeskscript);
                                    $authdomain,\$helpdeskscript);  
   
 my $loginform=(<<LFORM);      my $loginform=(<<LFORM);
 <form name="client" action="" onsubmit="return(send())">  <form name="client" action="" onsubmit="return(send())">
   <input type="hidden" name="lextkey" value="$lextkey" />    <input type="hidden" name="lextkey" value="$lextkey" />
   <input type="hidden" name="uextkey" value="$uextkey" />    <input type="hidden" name="uextkey" value="$uextkey" />
   <b><label for="uname">$lt{'un'}</label>:</b><br />    <b><label for="uname">$lt{'un'}</label>:</b><br />
   <input type="text" name="uname" id="uname" size="15" value="$authusername" /><br />    <input type="text" name="uname" id="uname" size="15" value="$authusername" readonly="readonly" /><br />
   <b><label for="upass$now">$lt{'pw'}</label>:</b><br />    <b><label for="upass$now">$lt{'pw'}</label>:</b><br />
   <input type="password" name="upass$now" id="upass$now" size="15" /><br />    <input type="password" name="upass$now" id="upass$now" size="15" readonly="readonly" /><br />
   <b><label for="udom">$lt{'dom'}</label>:</b><br />    <b><label for="udom">$lt{'dom'}</label>:</b><br />
   <input type="text" name="udom" id="udom" size="15" value="$authdomain" /><br />    <input type="text" name="udom" id="udom" size="15" value="$authdomain" readonly="readonly" /><br />
   <input type="submit" value="$lt{'log'}" />    <input type="submit" value="$lt{'log'}" />
 </form>  </form>
 LFORM  LFORM
Line 433  LFORM Line 447  LFORM
 HEADER  HEADER
     }      }
     $r->print(<<ENDTOP);      $r->print(<<ENDTOP);
 <div class="LC_loginpage_space">&nbsp;</div>  <div style="float:left;margin-top:0;">
 <div class="LC_loginpage_floatLeft">  <div class="LC_Box" style="background:$loginbox_bg;">
 <div class="LC_loginpage_loginContainer">  
   $logintitle    $logintitle
    <table border="0" align="left" cellspacing="1" cellpadding="2" width="100%">    $loginform
       <tr>    $noscript_warning
    <td>  
  $loginform  
            </td>  
       </tr>  
    </table>    
    $noscript_warning  
 </div>  </div>
       
 <div class="LC_loginpage_loginInfo">  <div class="LC_Box" style="padding-top: 10px;">
   $loginhelp    $loginhelp
   $forgotpw    $forgotpw
   $contactblock    $contactblock
Line 455  HEADER Line 462  HEADER
   $coursecatalog    $coursecatalog
 </div>  </div>
 </div>  </div>
   
   <div>
 ENDTOP  ENDTOP
     if ($showmainlogo) {      if ($showmainlogo) {
         $r->print(' <img src="'.$logo.'" alt="" />'."\n");          $r->print(' <img src="'.$logo.'" alt="" />'."\n");
     }      }
 $r->print(<<ENDTOP);  $r->print(<<ENDTOP);
 $announcements  $announcements
 $domainlogo  </div>
 <div class="LC_loginpage_space">&nbsp;</div>  <hr style="clear:both;" />
 ENDTOP  ENDTOP
       my ($domainrow,$serverrow,$loadrow,$userloadrow,$versionrow);
 $r->print(<<ENDDOCUMENT);      $domainrow = <<"END";
      <table border="0" cellspacing="0" cellpadding="0">  
       <tr>        <tr>
        <td  align="left" valign="top">         <td  align="left" valign="top">
         <small><b>$lt{'dom'}:&nbsp;</b></small>          <small><b>$lt{'dom'}:&nbsp;</b></small>
Line 475  $r->print(<<ENDDOCUMENT); Line 483  $r->print(<<ENDDOCUMENT);
         <small><tt>&nbsp;$domain</tt></small>          <small><tt>&nbsp;$domain</tt></small>
        </td>         </td>
       </tr>        </tr>
   END
       $serverrow = <<"END";
       <tr>        <tr>
        <td  align="left" valign="top">         <td  align="left" valign="top">
         <small><b>$lt{'serv'}:&nbsp;</b></small>          <small><b>$lt{'serv'}:&nbsp;</b></small>
Line 483  $r->print(<<ENDDOCUMENT); Line 493  $r->print(<<ENDDOCUMENT);
         <small><tt>&nbsp;$lonhost ($role)</tt></small>          <small><tt>&nbsp;$lonhost ($role)</tt></small>
        </td>         </td>
       </tr>        </tr>
   END
       if ($loadlim) {
           $loadrow = <<"END";
       <tr>        <tr>
        <td align="left" valign="top">         <td align="left" valign="top">
         <small><b>$lt{'load'}:&nbsp;</b></small>          <small><b>$lt{'load'}:&nbsp;</b></small>
Line 491  $r->print(<<ENDDOCUMENT); Line 504  $r->print(<<ENDDOCUMENT);
         <small><tt>&nbsp;$loadpercent $lt{'perc'}</tt></small>          <small><tt>&nbsp;$loadpercent $lt{'perc'}</tt></small>
        </td>         </td>
       </tr>        </tr>
   END
       }
       if ($uloadlim) {
           $userloadrow = <<"END";
       <tr>        <tr>
        <td align="left" valign="top">         <td align="left" valign="top">
         <small><b>$lt{'userload'}:&nbsp;</b></small>          <small><b>$lt{'userload'}:&nbsp;</b></small>
Line 499  $r->print(<<ENDDOCUMENT); Line 516  $r->print(<<ENDDOCUMENT);
         <small><tt>&nbsp;$userloadpercent $lt{'perc'}</tt></small>          <small><tt>&nbsp;$userloadpercent $lt{'perc'}</tt></small>
        </td>         </td>
       </tr>        </tr>
   END
       }
       if (($version ne '') && ($version ne '<!-- VERSION -->')) {
           $versionrow = <<"END";
       <tr>        <tr>
        <td colspan="2" align="left">         <td colspan="2" align="left">
         <small>$version</small>          <small>$version</small>
        </td>         </td>
       </tr>        </tr>
   END
       }
   
       $r->print(<<ENDDOCUMENT);
       <div style="float: left;">
        <table border="0" cellspacing="0" cellpadding="0">
   $domainrow
   $serverrow
   $loadrow    
   $userloadrow
   $versionrow
      </table>       </table>
       </div>
       <div style="float: right;">
       $domainlogo
       </div>
       <br style="clear:both;" />
  </div>   </div>
   
 <script type="text/javascript">  <script type="text/javascript">
Line 642  sub loginhelpdisplay { Line 679  sub loginhelpdisplay {
 sub coursecatalog_link {  sub coursecatalog_link {
     my ($linkname) = @_;      my ($linkname) = @_;
     return <<"END";      return <<"END";
       <span class="LC_nobreak"><a href="/adm/coursecatalog">$linkname</a></span>        <a href="/adm/coursecatalog">$linkname</a>
 END  END
 }  }
   

Removed from v.1.136  
changed lines
  Added in v.1.151


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