--- loncom/interface/statistics/lonstathelpers.pm	2005/04/19 13:59:35	1.50
+++ loncom/interface/statistics/lonstathelpers.pm	2008/12/12 10:01:30	1.57
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstathelpers.pm,v 1.50 2005/04/19 13:59:35 matthew Exp $
+# $Id: lonstathelpers.pm,v 1.57 2008/12/12 10:01:30 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -60,6 +60,9 @@ use Time::Local();
 use Spreadsheet::WriteExcel();
 use GDBM_File;
 use Storable qw(freeze thaw);
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
+ 
 
 ####################################################
 ####################################################
@@ -83,7 +86,7 @@ sub render_resource {
     ## Render the problem
     my ($base) = ($resource->src =~ m|^(.*/)[^/]*$|);
     $base="http://".$ENV{'SERVER_NAME'}.$base;
-    my ($src,$symb)=($resource->src,&Apache::lonnet::escape($resource->symb));
+    my ($src,$symb)=($resource->link,&escape($resource->shown_symb));
     my $rendered_problem = &Apache::lonnet::ssi_body($src.'?symb='.$symb);
     $rendered_problem =~ s/<\s*form\s*/<nop /g;
     $rendered_problem =~ s|(<\s*/form\s*>)|<\/nop>|g;
@@ -155,7 +158,7 @@ sub problem_selector {
                                                      resptype=>$resptype});
                         my $checked = '';
                         if ($env{'form.problemchoice'} eq $value) {
-                            $checked = 'checked ';
+                            $checked = 'checked="checked" ';
                         }
                         my $title = $res->compTitle;
                         if (! defined($title) || $title eq '') {
@@ -168,10 +171,9 @@ sub problem_selector {
                         if (scalar(@response_ids) > 1) {
                             $seq_str .= &mt('response').' '.$respid;
                         }
-                        my $link = $res->src.'?symb='.
-                            &Apache::lonnet::escape($res->symb);
+                        my $link = $res->link.'?symb='.&escape($res->shown_symb);
                         $seq_str .= ('&nbsp;'x2).
-                            qq{<a target="preview" href="$link">view</a>};
+                            '<a target="preview" href="'.$link.'">'.&mt('view').'</a>';
                         $seq_str .= "</td></tr>\n";
                         $rb_count++;
                     }
@@ -179,12 +181,12 @@ sub problem_selector {
             }
         }
         if ($seq_str ne '') {
-            $Str .= '<tr><td>&nbsp</td>'.
+            $Str .= '<tr><td>&nbsp;</td>'.
                 '<td colspan="2"><b>'.$seq->compTitle.'</b></td>'.
                 "</tr>\n".$seq_str;
             if (defined($sequence_addendum)) {
                 $Str .= '<tr>'.
-                    ('<td>&nbsp</td>'x2).
+                    ('<td>&nbsp;</td>'x2).
                     '<td align="right">'.$sequence_addendum.'</td>'.
                     "</tr>\n";
             }
@@ -227,8 +229,9 @@ sub MultipleProblemSelector {
     if (! defined($navmap)) {
         $navmap = Apache::lonnavmaps::navmap->new();
         if (! defined($navmap)) {
-            $Str .= 
-                '<h1>'.&mt('Error: cannot process course structure').'</h1>';
+            $Str .= '<div class="LC_error">'
+                   .&mt('Error: cannot process course structure')
+                   .'</div>';
             return $Str;
         }
     }
@@ -319,15 +322,15 @@ sub new_accumulator {
                 $target.='<tr><td><label>'.
                     '<input type="checkbox" name="'.$inputname.'" ';
                 if ($checked) {
-                    $target .= 'checked ';
+                    $target .= 'checked="checked" ';
                 }
                 $target .= 'id="'.$seq_id.':'.$item_id++.'" ';
                 $target.= 
-                    'value="'.&Apache::lonnet::escape($res->symb).'" />'.
+                    'value="'.&escape($res->symb).'" />'.
                     '&nbsp;'.$res->compTitle.'</label>'.
                     ('&nbsp;'x2).'<a target="preview" '.
-                    'href="'.$res->src.'?symb='.
-                         &Apache::lonnet::escape($res->symb).'">view</a>'.
+                    'href="'.$res->link.'?symb='.
+                    &escape($res->shown_symb).'">'.&mt('view').'</a>'.
                     '</td></tr>'.$/;
             } else { 
                 if (defined($target)) {
@@ -346,7 +349,7 @@ sub get_selected_symbs {
     my ($inputfield) = @_;
     my $field = 'form.'.$inputfield;
     my @symbs = (map {
-                     &Apache::lonnet::unescape($_);
+                     &unescape($_);
                      } &Apache::loncommon::get_env_multiple($field));
     return @symbs;
 }
@@ -373,10 +376,10 @@ Used by Apache::lonstathelpers::ProblemS
 ####################################################
 sub make_target_id {
     my ($target) = @_;
-    my $id = &Apache::lonnet::escape($target->{'symb'}).':'.
-             &Apache::lonnet::escape($target->{'part'}).':'.
-             &Apache::lonnet::escape($target->{'respid'}).':'.
-             &Apache::lonnet::escape($target->{'resptype'});
+    my $id = &escape($target->{'symb'}).':'.
+             &escape($target->{'part'}).':'.
+             &escape($target->{'respid'}).':'.
+             &escape($target->{'resptype'});
     return $id;
 }
 
@@ -401,18 +404,18 @@ sub get_target_from_id {
     my ($id) = @_;
     if (! ref($id)) {
         my ($symb,$part,$respid,$resptype) = split(':',$id);
-        return ({ symb     => &Apache::lonnet::unescape($symb),
-                  part     => &Apache::lonnet::unescape($part),
-                  respid   => &Apache::lonnet::unescape($respid),
-                  resptype => &Apache::lonnet::unescape($resptype)});
+        return ({ symb     => &unescape($symb),
+                  part     => &unescape($part),
+                  respid   => &unescape($respid),
+                  resptype => &unescape($resptype)});
     } elsif (ref($id) eq 'ARRAY') {
         my @Return;
         foreach my $selected (@$id) {
             my ($symb,$part,$respid,$resptype) = split(':',$selected);
-            push(@Return,{ symb     => &Apache::lonnet::unescape($symb),
-                           part     => &Apache::lonnet::unescape($part),
-                           respid   => &Apache::lonnet::unescape($respid),
-                           resptype => &Apache::lonnet::unescape($resptype)});
+            push(@Return,{ symb     => &unescape($symb),
+                           part     => &unescape($part),
+                           respid   => &unescape($respid),
+                           resptype => &unescape($resptype)});
         }
         return \@Return;
     }
@@ -431,7 +434,7 @@ current resource.
 Inputs: $target (see &Apache::lonstathelpers::get_target_from_id())
   $AcceptableResponseTypes, regular expression matching acceptable
                             response types,
-  $granularity, either 'part', 'response', or 'part_survey'
+  $granularity, either 'part', 'response', 'part_survey', or 'part_task'
 
 Returns: three hash references, $prev, $curr, $next, which refer to the
 preceeding, current, or following problem parts or responses, depending
@@ -467,6 +470,12 @@ sub get_prev_curr_next {
                             part     => $part,
                             resource => $res,
                         } );
+		} elsif ($res->is_task($part) && ($granularity eq 'part_task')){
+                    push (@Resource,
+                          { symb     => $res->symb,
+                            part     => $part,
+                            resource => $res,
+                        } );
                 } elsif ($granularity eq 'part') {
                     push (@Resource,
                           { symb     => $res->symb,
@@ -499,7 +508,7 @@ sub get_prev_curr_next {
     my $curr_idx;
     for ($curr_idx=0;$curr_idx<$#Resource;$curr_idx++) {
         my $curr_item = $Resource[$curr_idx];
-        if ($granularity eq 'part' || $granularity eq 'part_survey') {
+        if ($granularity =~ /^(part|part_survey|part_task)$/) {
             if ($curr_item->{'symb'} eq $target->{'symb'} &&
                 $curr_item->{'part'} eq $target->{'part'}) {
                 last;
@@ -514,7 +523,7 @@ sub get_prev_curr_next {
         }
     }
     my $curr_item = $Resource[$curr_idx];
-    if ($granularity eq 'part' || $granularity eq 'part_survey') {
+    if ($granularity =~ /^(part|part_survey|part_task)$/) {
         if ($curr_item->{'symb'}     ne $target->{'symb'} ||
             $curr_item->{'part'}     ne $target->{'part'}) {
             # bogus symb - return nothing
@@ -727,11 +736,16 @@ sub get_answer {
     my ($prefix,$key,%Answer) = @_;
     my $returnvalue;
     if (exists($Answer{$key})) {
-        my $student_answer = $Answer{$key}->[0];
-        if (! defined($student_answer)) {
-            $student_answer = $Answer{$key}->[1];
-        }
-        $returnvalue = $student_answer;
+	if (ref($Answer{$key}) eq 'HASH') {
+	    my $which = 'INTERNAL';
+	    if (!exists($Answer{$key}{$which})) {
+		$which = (sort(keys(%{ $Answer{$key} })))[0];
+	    }
+	    my $student_answer = $Answer{$key}{$which}[0][0];
+	    $returnvalue = $student_answer; 
+	} else {
+	    &Apache::lonnet::logthis("error analyzing problem. got a answer of type ".ref($Answer{$key}));
+	}
     } else {
         if (exists($Answer{$prefix.'.shown'})) {
             # The response has foils
@@ -789,7 +803,7 @@ sub load_analysis_cache {
         my $storedstring;
         my %cache_db;
         if (tie(%cache_db,'GDBM_File',$cache_filename,&GDBM_READER(),0640)) {
-            $storedstring = $cache_db{&Apache::lonnet::escape($symb)};
+            $storedstring = $cache_db{&escape($symb)};
             untie(%cache_db);
         }
         if (defined($storedstring)) {
@@ -841,7 +855,7 @@ Writes the in memory cache to disk so th
 sub write_analysis_cache {
     return if (! defined($current_symb) || ! defined($cache_filename));
     my %cache_db;
-    my $key = &Apache::lonnet::escape($current_symb);
+    my $key = &escape($current_symb);
     if (tie(%cache_db,'GDBM_File',$cache_filename,&GDBM_WRCREAT(),0640)) {
         my $storestring = freeze(\%cache);
         $cache_db{$key}=$storestring;
@@ -1135,8 +1149,8 @@ sub get_problem_data {
                 }
             }
             # End of logging code
-            next if ($key !~ /^$part/);
-            $key =~ s/^$part\.//;
+            next if ($key !~ /^\Q$part\E/);
+            $key =~ s/^\Q$part\E\.//;
             if (ref($value) eq 'ARRAY') {
                 if ($key eq 'options') {
                     $Partdata{$part}->{'_Options'}=$value;
@@ -1304,7 +1318,7 @@ sub manage_caches {
     my $sectionkey = 
         join(',',
              map {
-                     &Apache::lonnet::escape($_);
+                     &escape($_);
                  } sort(&Apache::lonstatistics::get_selected_sections())
              );
     my $statuskey = $Apache::lonstatistics::enrollment_status;