Diff for /loncom/interface/statistics/lonproblemstatistics.pm between versions 1.8 and 1.12

version 1.8, 2002/07/30 23:08:56 version 1.12, 2002/08/05 18:10:08
Line 31 Line 31
 # 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei  # 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei
 # YEAR=2002  # YEAR=2002
 # 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei  # 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei
 # 5/12,5/14,5/15,5/19,5/26,7/16,7/25,7/29  Behrouz Minaei  # 5/12,5/14,5/15,5/19,5/26,7/16,7/25,7/29,8/5  Behrouz Minaei
 #  #
 ###  ###
   
Line 56  sub BuildProblemStatisticsPage { Line 56  sub BuildProblemStatisticsPage {
     $Ptr .= '<table border="0"><tbody>';      $Ptr .= '<table border="0"><tbody>';
     $Ptr .= '<tr><td align="right"><b>Select Map</b></td>'."\n";      $Ptr .= '<tr><td align="right"><b>Select Map</b></td>'."\n";
     $Ptr .= '<td align="left">';      $Ptr .= '<td align="left">';
     $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics');      $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics',
                                                  'Statistics');
       $Ptr .= '</td></tr>'."\n";
       $Ptr .= '<tr><td align="right"><b>Sorting Type:</b></td>'."\n";
       $Ptr .= '<td align="left">'."\n";
       $Ptr .= &Apache::lonhtmlcommon::AscendOrderOptions(
                                               $cache{'ProblemStatisticsAscend'}, 
                                               'ProblemStatistics',
                                               'Statistics');
     $Ptr .= '</td></tr>'."\n";      $Ptr .= '</td></tr>'."\n";
     $Ptr .= &AscendOrderOptions($cache{'Ascend'});  
     $Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'});      $Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'});
     $Ptr .= '</table>';      $Ptr .= '</table>';
     $Ptr .= &ProblemStatisticsLegend();      $Ptr .= &ProblemStatisticsLegend();
Line 80  sub BuildProblemStatisticsPage { Line 87  sub BuildProblemStatisticsPage {
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {
         return '<html><body>Unable to tie database.</body></html>';          return '<html><body>Unable to tie database.</body></html>';
     }      }
     my %discriminant=();  
     my @list=();  
     my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);  
     my $index=0;  
     foreach (@$students) {  
  $index++;  
  #&Apache::lonstatistics::Update_PrgWin(++$index,$r);  
         &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r, \%discriminant);  
     }  
     #&Apache::lonstatistics::Close_PrgWin($r);  
    
     my ($upper, $lower) = &Discriminant(\%discriminant,$r);  
     my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod",      my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod",
                   4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff",                    4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff",
                   9,"S.D.",10,"Skew.",11,"D.F.1st",12,"D.F.2nd", 13, "Disc.");                    9,"S.D.",10,"Skew.",11,"D.F.1st",12,"D.F.2nd", 13, "Disc.");
     my $color=&setbgcolor(0);      my $color=&setbgcolor(0);
     my %GraphDat= &BuildStatisticsTable(\%cache, $upper, $lower, \@list,   
                                         \%Header, $students, $r, $color);      my $state=$ENV{'form.ProblemStatisticsHeading'}; 
   
   #    my $state=&Apache::lonstatistics::CheckFormElement(\%cache,
   #                                                  'ProblemStatisticsHeading',
   #                                                  'ProblemStatisticsHeading',
   #                                                  'Homework Sets Order'); 
       $r->print("<br>state=".$state);
   
       my $TempCache;
   
       if ($state) {
    $TempCache=&CacheStatisticsTable($state,\%cache,\%Header,
    $r,$color);
       } else {    
    my %discriminant=();
    my @list=();
    my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);
    my $index=0;
    foreach (@$students) {
       $index++;
       #&Apache::lonstatistics::Update_PrgWin(++$index,$r);
       &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r,
                                   \%discriminant);
    }
    #&Apache::lonstatistics::Close_PrgWin($r);
    my ($upper, $lower) = &Discriminant(\%discriminant,$r);
    $TempCache= &BuildStatisticsTable(\%cache, $upper, $lower, 
      \@list, \%Header, $students,
      $r, $color);
       }
       untie(%cache);
   
       foreach (keys %$TempCache) {
           last if ($c->aborted());
           if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT,0640)) {
       $cache{$_}=$TempCache->{$_};
   
               untie(%cache);
           }
       }
       if($c->aborted()) { return; }
     untie(%cache);      untie(%cache);
 }  }
   
Line 166  sub ExtractStudentData { Line 202  sub ExtractStudentData {
   
     foreach my $sequence (split(':', $cache->{'orderedSequences'})) {      foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
  my $tempProblemOrder=100;   my $tempProblemOrder=100;
  $tempSequenceOrder++;          if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&
 #        if($cache->{'ProblemStatisticsMap'} ne 'All Maps'  &&             $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
 #           $cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) {  
 #    $r->print("<br>sequences=$cache->{'orderedSequences'}");  #    $r->print("<br>sequences=$cache->{'orderedSequences'}");
 #    $r->print("<br>".$cache->{$sequence.':title'});  #    $r->print("<br>".$cache->{$sequence.':title'});
 #            next;              next;
 #        }          }
    $tempSequenceOrder++;
   
         #$discrim .= '&';          #$discrim .= '&';
         foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {          foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {
Line 342  sub ExtractStudentData { Line 378  sub ExtractStudentData {
 }  }
   
   
 =pod  
 sub MySort {            sub MySort {
     if ( $Pos > 0 ) {      my $pos=shift;
       if ( $pos > 0 ) {
  if ($ENV{'form.order'} eq 'Descending') {$b <=> $a;}   if ($ENV{'form.order'} eq 'Descending') {$b <=> $a;}
  else { $a <=> $b; }   else { $a <=> $b; }
     }      }
     else {      else {
  if ($ENV{'form.order'} eq 'Descending') {$b cmp $a;}  # if ($ENV{'form.order'} eq 'Descending') {$b cmp $a;}
  else { $a cmp $b; }  # else { $a cmp $b; }
    $a cmp $b;
     }      }
 }  }
 =cut  
   
   
 sub BuildStatisticsTable {  sub BuildStatisticsTable {
     my ($cache,$upper,$lower,$list,$headings,$students,$r,$color)=@_;      my ($cache,$upper,$lower,$list,$headings,$students,$r,$color)=@_;
     my $NoElements = scalar @$list;      my $NoElements = scalar @$list;
     my @List=sort(@$list);      my @list=sort(@$list);
   
 #6666666  #6666666
 #    my $file="/home/httpd/perl/tmp/183d.txt";  #    my $file="/home/httpd/perl/tmp/183d.txt";
Line 379  sub BuildStatisticsTable { Line 417  sub BuildStatisticsTable {
     my $dummy;      my $dummy;
     my $p_val;      my $p_val;
     my $ResId;      my $ResId;
     my %GraphDat;      my %TempCache;
     my $cIdx=0;      my $cIdx=0;
   
     foreach my $sequence (split(':', $cache->{'orderedSequences'})) {      foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
           if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&
         &CreateProblemStatisticsTableHeading(1,$cache->{$sequence.':source'},             $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
               next;
           }
           &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, 
                                                $cache->{$sequence.':source'},
                                              $cache->{$sequence.':title'},                                                $cache->{$sequence.':title'}, 
                                              $headings,$r);                                               $headings,$r);
  my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,   my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
                                                    $List[$cIdx]);                                                     $list[$cIdx]);
         my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);          my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
  $sequence+=100;   $sequence+=100;
  while ($SqOrd==$sequence && $cIdx<$NoElements) {   while ($SqOrd==$sequence && $cIdx<$NoElements) {
Line 415  sub BuildStatisticsTable { Line 457  sub BuildStatisticsTable {
  elsif( $Code eq 'O' ) { $Override++; }   elsif( $Code eq 'O' ) { $Override++; }
  elsif( $Code eq '-' ) { $StdNo--; }   elsif( $Code eq '-' ) { $StdNo--; }
  ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,   ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
                                                      $List[$cIdx]);                                                       $list[$cIdx]);
         ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);          ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
     }      }
   
Line 439  sub BuildStatisticsTable { Line 481  sub BuildStatisticsTable {
     $urlres=$Map;      $urlres=$Map;
 #######################  #######################
   
 #    $res = '<a href="'.$cache->{'src_'.$ResId}.'">'.$res.'</a>';  #    $res = '<a href="'.$cache->{$ResId.':source'}.'">'.$res.'</a>';
     #$Map = '<a href="'.$Map.'">'.$res.'</a>';      #$Map = '<a href="'.$Map.'">'.$res.'</a>';
   
 #------------------------ Compute the Average of Tries about one problem  #------------------------ Compute the Average of Tries about one problem
Line 499  sub BuildStatisticsTable { Line 541  sub BuildStatisticsTable {
     my $SD = sprintf( "%.1f", $StdDev );      my $SD = sprintf( "%.1f", $StdDev );
     my $DoD = sprintf( "%.2f", $DoDiff );      my $DoD = sprintf( "%.2f", $DoDiff );
     my $Sk = sprintf( "%.1f", $Skewness );      my $Sk = sprintf( "%.1f", $Skewness );
     my $join = $Prob.'&'.$Temp.'&'.$StdNo.'&'.      my $join = $sequence.'@'.$pOrd.'&'.$Temp.'&'.$StdNo.'&'.
                        $TotalTries.'&'.$MxTries.'&'.$Avg.'&'.                         $TotalTries.'&'.$MxTries.'&'.$Avg.'&'.
                        $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'.                         $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'.
        $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.         $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.
                        $DiscNo.'&'.$Prob;                         $DiscNo.'&'.$Prob;
 ##8888    $CachData{($p_count-1)}=$join;  
   #####{$sequence.'@'.$pOrd}
       $TempCache{'CacheTable:'.($p_count-1)}=$join;
   
 #6666666  #6666666
 #    $r->print('<br>'.$out.'&'.$DoD);  #    $r->print('<br>'.$out.'&'.$DoD);
Line 516  sub BuildStatisticsTable { Line 560  sub BuildStatisticsTable {
  &Apache::lonnet::put('resevaldata',\%storestats,$1,$2);    &Apache::lonnet::put('resevaldata',\%storestats,$1,$2); 
     }      }
 #-------------------------------- Row of statistical table  #-------------------------------- Row of statistical table
             &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,\%GraphDat);              &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,
                         \%TempCache);
  }   }
    $TempCache{'ProblemCount'}=$p_count;
  &CloseTable($cache,$r);   &CloseTable($cache,$r);
     }      }
 ###    &Close_PrgWin();  ###    &Close_PrgWin();
 #666666  #666666
 #    close( OUT );  #    close( OUT );
 #666666  #666666
       return \%TempCache;
 }  }
   
 =pod  
 sub Cache_Statistics {  sub CacheStatisticsTable {
     my ($cache,$color)=@_;      my ($state,$cache,$Header,$r,$color)=@_;
     my @list = ();      my @list = ();
     my $Useful;      my $Useful;
     my $UnUseful;      my $UnUseful; 
 #    $r->print('<input type="hidden" name="show" value="excel" />'."\n");       my %TempCache;
     my %myHeader = reverse( %Header );      my %myHeader = reverse( %$Header );
     $Pos = $myHeader{$ENV{'form.sort'}};      my $pos = $myHeader{$state};
     if ($Pos > 0) {$Pos++;}      if ($pos > 0) {$pos++;}
     my $p_count = 0;      my $p_count = $cache->{'ProblemCount'};
     foreach my $key( keys %CachData) {   
  my @Temp=split(/\&/,$CachData{$key});      for ( my $k=0; $k<$p_count;$k++) {
  if ( $Pos == 0 ) {   my $key=$cache->{'CacheTable:'.$k};
     ($UnUseful,$Useful)=split(/\>/,$Temp[$Pos]);   my @Temp=split(/\&/,$key);
    if ( $pos == 0 ) {
       ($UnUseful,$Useful)=split(/\>/,$Temp[$pos]);
  }   }
  else {   else {
     $Useful = $Temp[$Pos];      $Useful = $Temp[$pos];
  }      }   
  $list[$p_count]=$Useful.'@'.$CachData{$key};   $list[$k]=$Useful.'@'.$key;
         $p_count++;   $r->print('<br>'.$list[$k]);
     }      }
   
   
     @list = sort MySort (@list);      @list = sort MySort (@list);
   
     my $nIndex=0;      my $nIndex=0;
   
       return \%TempCache;
   }
   
   
   =pod
   
     if ( $Pos == 0 ) {      if ( $Pos == 0 ) {
  foreach (sort keys %mapsort) {   foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
     my ($Hid,$pr)=split(/\:/,$mapsort{$_});      if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&
     &CreateProblemStatisticsTableHeading($cache,1,$Hid);         $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
    next;
       }
       &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, 
                                                $cache->{$sequence.':source'},
                                                $cache->{$sequence.':title'}, 
                                                $headings,$r);
   
       my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
                                                          $list[$cIdx]);
       my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
       $sequence+=100;
    while ($SqOrd==$sequence && $cIdx<$NoElements) {
       my %storestats=();
     my @lpr=split(/\&/,$pr);      my @lpr=split(/\&/,$pr);
     for (my $i=1; $i<=$#lpr; $i++) {      for (my $i=1; $i<=$#lpr; $i++) {
  my($Pre, $Post) = split(/\@/,$list[$nIndex]);    my($Pre, $Post) = split(/\@/,$list[$nIndex]); 
Line 568  sub Cache_Statistics { Line 637  sub Cache_Statistics {
  }   }
     }      }
     else {      else {
  &CreateProblemStatisticsTableHeading($cache,0);          &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, 
                                                $cache->{$sequence.':source'},
                                                $cache->{$sequence.':title'}, 
                                                $headings,$r);
  for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) {   for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) {
     my($Pre, $Post) = split(/\@/,$list[$nIndex]);       my($Pre, $Post) = split(/\@/,$list[$nIndex]); 
     &TableRow($cache,$Post,$nIndex,$nIndex,$color,\%GraphDat);      &TableRow($cache,$Post,$nIndex,$nIndex,$color,\%GraphDat);
  }    } 
  &CloseTable($cache);   &CloseTable($cache);
     }      }
   
       return \%TempCache;
 }  }
 =cut   
   =cut
   
   
 sub TableRow {  sub TableRow {
     my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_;      my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_;
     my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override,      my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override,
        $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str);         $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str);
 #    $r->print('<br>'.$Str);  
     my $Ptr;      my $Ptr;
     if ($ENV{'form.showcsv'}) {      if($cache->{'DisplayFormat'} eq 'Display CSV Format') {
         my ($ResId,$Dummy)=split(/\*/,$Prob);          my ($ResId,$Dummy)=split(/\*/,$Prob);
         $Ptr="\n".'<br>'.          $Ptr="\n".'<br>'.
              "\n".'"'.($RealIdx+1).'",'.               "\n".'"'.($RealIdx+1).'",'.
              "\n".'"'.$cache->{'title_'.$ResId}.$Dummy.'",'.               "\n".'"'.$cache->{$ResId.':title'}.$Dummy.'",'.
              "\n".'"'.$cache->{'src_'.$ResId}.'",'.               "\n".'"'.$cache->{$ResId.':source'}.'",'.
              "\n".'"'.$StdNo.'",'.               "\n".'"'.$StdNo.'",'.
              "\n".'"'.$TotalTries.'",'.               "\n".'"'.$TotalTries.'",'.
              "\n".'"'.$MxTries.'",'.               "\n".'"'.$MxTries.'",'.
Line 625  sub TableRow { Line 700  sub TableRow {
              "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>';               "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>';
         $r->print("\n".$Ptr.'</tr>' );          $r->print("\n".$Ptr.'</tr>' );
     }      }
 #    $GraphDat->{$RealIdx}=$DoD.':'.$Wrng;      $GraphDat->{'graph_gif:'.$RealIdx}=$DoD.':'.$Wrng;
 }  }
   
   
Line 650  sub setbgcolor { Line 725  sub setbgcolor {
     return \%color;      return \%color;
 }  }
   
   
 sub StatusOptions {  
     my ($cache)=@_;  
   
     my $Status = $cache->{'Status'};  
     my $OpSel1 = '';  
     my $OpSel2 = '';  
     my $OpSel3 = '';  
   
     if($Status eq 'Any')         { $OpSel3 = ' selected'; }  
     elsif($Status eq 'Expired' ) { $OpSel2 = ' selected'; }  
     else                         { $OpSel1 = ' selected'; }  
   
     my $Ptr = '';  
     $Ptr .= '<tr><td align="right"><b>Student Status:</b></td>'."\n";  
     $Ptr .= '<td align="left"><select name="Status">';  
     $Ptr .= '<option'.$OpSel1.'>Active</option>'."\n";  
     $Ptr .= '<option'.$OpSel2.'>Expired</option>'."\n";  
     $Ptr .= '<option'.$OpSel3.'>Any</option>'."\n";  
     $Ptr .= '</select></td></tr>'."\n";  
   
     return $Ptr;  
 }  
   
 sub AscendOrderOptions {  
     my ($order)=@_;  
   
     my $OpSel1 = '';  
     my $OpSel2 = '';  
   
     if($order eq 'Ascending') {  
         $OpSel1 = ' selected';  
     } else {  
         $OpSel2 = ' selected';  
     }  
   
     my $Ptr = '';  
     $Ptr .= '<tr><td align="right"><b>Sorting Type:</b></td>'."\n";  
     $Ptr .= '<td align="left"><select name="Ascend">'."\n";  
     $Ptr .= '<option'.$OpSel1.'>Ascending</option>'."\n".  
     '<option'.$OpSel2.'>Descending</option>'."\n";  
     $Ptr .= '</select></td></tr>'."\n";  
   
     return $Ptr;  
 }  
   
 sub ProblemStatisticsButtons {  sub ProblemStatisticsButtons {
     my ($displayFormat)=@_;      my ($displayFormat)=@_;
   
     my $Ptr = '<tr><td></td><td align="left">';      my $Ptr = '<tr><td></td><td align="left">';
     $Ptr .= '<input type=submit name="ProblemStatisticsRecalculate" ';  
     $Ptr .= 'value="Recalculate Statistics"/>'."\n";  
     $Ptr .= '&nbsp;&nbsp;&nbsp;';  
     $Ptr .= '<input type="submit" name="DoDiffGraph" ';      $Ptr .= '<input type="submit" name="DoDiffGraph" ';
     $Ptr .= 'value="DoDiff Graph" />'."\n";      $Ptr .= 'value="DoDiff Graph" />'."\n";
     $Ptr .= '&nbsp;&nbsp;&nbsp;';      $Ptr .= '&nbsp;&nbsp;&nbsp;';
Line 711  sub ProblemStatisticsButtons { Line 737  sub ProblemStatisticsButtons {
     $Ptr .= '&nbsp;&nbsp;&nbsp;';      $Ptr .= '&nbsp;&nbsp;&nbsp;';
     $Ptr .= '<input type="submit" name="DisplayCSVFormat" ';      $Ptr .= '<input type="submit" name="DisplayCSVFormat" ';
     if($displayFormat eq 'Display CSV Format') {      if($displayFormat eq 'Display CSV Format') {
         $Ptr .= 'value="Display CSV Format" />'."\n";  
     } else {  
         $Ptr .= 'value="Display Table Format" />'."\n";          $Ptr .= 'value="Display Table Format" />'."\n";
       } else {
           $Ptr .= 'value="Display CSV Format" />'."\n";
     }      }
     $Ptr .= '</td></tr>';      $Ptr .= '</td></tr>';
   
Line 858  sub BuildDiffGraph { Line 884  sub BuildDiffGraph {
     my ($r)=@_;      my ($r)=@_;
   
     my $graphData = &GetGraphData('DiffGraph', $r);      my $graphData = &GetGraphData('DiffGraph', $r);
     return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />';      $r->print('<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />');
   
       return;
 }  }
   
 sub BuildWrongGraph {  sub BuildWrongGraph {
     my ($r)=@_;      my ($r)=@_;
   
     my $graphData = &GetGraphData('WrongGraph', $r);      my $graphData = &GetGraphData('WrongGraph', $r);
     return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />';      $r->print('<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />');
   
       return;
 }  }
   
   

Removed from v.1.8  
changed lines
  Added in v.1.12


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