--- loncom/interface/statistics/lonproblemanalysis.pm	2002/09/07 23:07:38	1.10
+++ loncom/interface/statistics/lonproblemanalysis.pm	2002/11/25 18:12:52	1.15
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # (Publication Handler
 #
-# $Id: lonproblemanalysis.pm,v 1.10 2002/09/07 23:07:38 minaeibi Exp $
+# $Id: lonproblemanalysis.pm,v 1.15 2002/11/25 18:12:52 minaeibi Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -27,11 +27,11 @@
 #
 # (Navigate problems for statistical reports
 # YEAR=2002
-# 5/12,7/26  Behrouz Minaei
+# 5/12,7/26,9/7,11/22 Behrouz Minaei
 #
 ###
 
-package Apache::lonproblemanalysis; 
+package Apache::lonproblemanalysis;
 
 use strict;
 use Apache::lonnet();
@@ -90,7 +90,9 @@ sub BuildAnalyzePage {
 
     # Remove students who don't have the proper section.
     my @sectionsSelected = split(':',$cache{'sectionsSelected'});
-    for(my $studentIndex=((scalar @$students)-1); $studentIndex>=0;
+
+    my $studentCount = scalar @$students;
+    for(my $studentIndex=$studentCount-1; $studentIndex>=0;
         $studentIndex--) {
         my $value = $cache{$students->[$studentIndex].':section'};
         my $found = 0;
@@ -115,19 +117,22 @@ sub BuildAnalyzePage {
         $r->print('Can not untie hash.');
         $r->rflush();
     }
+    #if($status eq 'true')
+    { &Apache::lonhtmlcommon::Close_PrgWin($r); }
 
-    my $error = 
-        &Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,
-                                                                  'true',
-                                                                  $cacheDB,
-                                                                  'true', 
-                                                                  'true',
-                                                                  $courseID,
-                                                                  $r, $c);
-    if($error ne 'OK') {
-        $r->print($error.'<br>Error downloading course data<br>');
-        return;
-    }
+
+#    my $error =
+#        &Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,
+#                                                                  'true',
+#                                                                  $cacheDB,
+#                                                                  'true',
+#                                                                  'true',
+#                                                                  $courseID,
+#                                                                  $r, $c);
+#    if($error ne 'OK') {
+#        $r->print($error.'<br>Error downloading course data<br>');
+#        return;
+#    }
 
 
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
@@ -138,15 +143,19 @@ sub BuildAnalyzePage {
 
     my ($problemId, $part, $responseId)=split(':',$cache{'AnalyzeInfo'});
     my $uri      = $cache{$problemId.':source'};
-    my $problem  = $cache{$problemId.':problem'}; 
+    my $problem  = $cache{$problemId.':problem'};
     my $title    = $cache{$problemId.':title'};
     my $interval = $cache{'Interval'};
 
+#    my $title = 'LON-CAPA Statistics';
+    my $heading = 'Restore this particular Option Response Problem '.
+                  'Results, Please wait...';
+
     my %ConceptData;
     $ConceptData{"Interval"} = $interval;
 
     #Initialize the option response true answers
-    my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem, 
+    my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem,
                                       $students->[0], $courseID);
     if(defined($analyzeData->{'error'})) {
         $Str .= $analyzeData->{'error'}.'<br>Incorrect part requested.<br>';
@@ -159,7 +168,7 @@ sub BuildAnalyzePage {
     if($c->aborted()) {  untie(%cache); return; }
 
     #compute the intervals
-    &Interval($part, $problem, $interval, $analyzeData->{'concepts'}, 
+    &Interval($part, $problem, $interval, $analyzeData->{'concepts'},
               \%ConceptData);
 
     $title =~ s/\ /"_"/eg;
@@ -168,18 +177,26 @@ sub BuildAnalyzePage {
     $r->print($Str);
     $Str = '';
     if($c->aborted()) {  untie(%cache); return; }
-         
+
+    &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading);
+
+    my $count=0;
     #Java script Progress window
     for(my $index=0; $index<(scalar @$students); $index++) {
         if($c->aborted()) {  untie(%cache); return; }
-	&OpStatus($problemId, $students->[$index], \%ConceptData, 
-                  $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);
+        $count++;
+        my $displayString = $count.'/'.$studentCount.': '.$_;
+        &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r);
+	&OpStatus($problemId, $students->[$index], \%ConceptData,
+                  $analyzeData->{'foil_to_concept'}, $analyzeData,
+		  \%cache, $courseID);
     }
+    &Apache::lonhtmlcommon::Close_PrgWin($r);
 
     $Str .= '<br>';
     for (my $k=0; $k<$interval; $k++ ) {
         if($c->aborted()) {  untie(%cache); return $Str; }
-	$Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'}, 
+	$Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'},
                            \%ConceptData);
         $r->print($Str);
         $Str = '';
@@ -242,7 +259,7 @@ sub OptionResponseTable {
             $sequences{$sequence} .= ':::'.$_;
         }
     }
-    
+
     my $Str = '';
 
     foreach my $sequence (@orderedSequences) {
@@ -289,12 +306,14 @@ sub OptionResponseTable {
 
 #---- Analyze Web Page -------------------------------------------------------
 
-#restore the student submissions and finding the result
+# Joson code for reading data from cache
+=pod
 sub OpStatus {
-    my ($problemID, $student, $ConceptData, $foil_to_concept, 
+    my ($problemID, $student, $ConceptData, $foil_to_concept,
         $analyzeData, $cache)=@_;
 
     my $ids = $analyzeData->{'parts'};
+
     my @True = ();
     my @False = ();
     my $flag=0;
@@ -302,7 +321,7 @@ sub OpStatus {
     my $tries=0;
 
     foreach my $id (@$ids) {
-        my ($part, $response) = split(/\./, $id);
+	my ($part, $response) = split(/\./, $id);
         my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'};
         my @submissions = split(':::', $cache->{$student.':'.$problemID.':'.
                                                 $part.':'.$response.
@@ -313,10 +332,10 @@ sub OpStatus {
                 if($submission{$_}) {
                     my $answer = $analyzeData->{$id.'.foil.value.'.$_};
                     if($submission{$_} eq $answer) {
-                        &Decide("true", $foil_to_concept->{$_}, 
+                        &Decide("true", $foil_to_concept->{$_},
                                 $time, $ConceptData);
                     } else {
-                        &Decide("false", $foil_to_concept->{$_}, 
+                        &Decide("false", $foil_to_concept->{$_},
                                 $time, $ConceptData);
                     }
                 }
@@ -326,6 +345,62 @@ sub OpStatus {
 
     return;
 }
+=cut
+
+
+#restore the student submissions and finding the result
+
+sub OpStatus {
+    my ($problemID, $student, $ConceptData, $foil_to_concept,
+        $analyzeData, $cache, $courseID)=@_;
+
+    my $ids = $analyzeData->{'parts'};
+    my ($uname,$udom)=split(/\:/,$student);
+    my $symb  = $cache->{$problemID.':problem'};
+
+    my @True = ();
+    my @False = ();
+    my $flag=0;
+    my $tries=0;
+
+    foreach my $id (@$ids) {
+	my ($part, $response) = split(/\./, $id);
+    	my %reshash=&Apache::lonnet::restore($symb,$courseID,$udom,$uname);
+    	if ($reshash{'version'}) {
+            my $tries=0;
+            for (my $version=1;$version<=$reshash{'version'};$version++) {
+	    	my $time=$reshash{"$version:timestamp"};
+	    	foreach my $key (sort(split(/\:/,$reshash{$version.':keys'}))) {
+                    if (($key=~/\.(\w+)\.(\w+)\.submission$/)) {
+		        my $Id1 = $1; my $Id2 = $2;
+		        #check if this is a repeat submission, if so skip it
+          	        if ($reshash{"$version:resource.$Id1.previous"}) { next; }
+		        #if no solved this wasn't a real submission, ignore it
+		        if (!defined($reshash{"$version:resource.$Id1.solved"})) {
+			    &Apache::lonxml::debug("skipping ");
+			    next;
+		        }
+		        my $Resp = $reshash{"$version:$key"};
+		        my %submission=&Apache::lonnet::str2hash($Resp);
+		        foreach (keys %submission) {
+			    my $Ansr = $analyzeData->{"$Id1.$Id2.foil.value.$_"};
+                    	    if($submission{$_} eq $Ansr) {
+                        	&Decide("true", $foil_to_concept->{$_},
+                                	$time, $ConceptData);
+                    	    } else {
+                        	&Decide("false", $foil_to_concept->{$_},
+					$time, $ConceptData);
+                    	    }
+		        }
+	            }
+	        }
+            }
+        }
+    }
+
+    return;
+}
+
 
 sub DrawGraph {
     my ($k,$Src,$Concepts,$ConceptData)=@_;
@@ -333,7 +408,7 @@ sub DrawGraph {
     my @data1;
     my @data2;
 
-    # Adjust Data and find the Max 
+    # Adjust Data and find the Max
     for (my $n=0; $n<(scalar @$Concepts); $n++ ) {
 	my $tmp=$Concepts->[$n];
 	$data1[$n]=$ConceptData->{$tmp.'.'.$k.'.true'};
@@ -392,7 +467,7 @@ sub DrawTable {
     my $P_No = (scalar @data1);
     my $Str = '';
 #    $Str .= '<br><b>From: ['.localtime($ConceptData->{'Int.'.($k-1)});
-#    $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).']</b>'; 
+#    $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).']</b>';
     $Str .= "\n".'<table border=2>'.
             "\n".'<tr>'.
             "\n".'<th> # </th>'.
@@ -518,7 +593,7 @@ sub Interval {
     for(my $i=1; $i<$Int; $i++) {
 	$ConceptData->{'Int.'.$i}=$opn+$i*$add;
     }
-    $ConceptData->{'Int.'.$Int}=$due;     
+    $ConceptData->{'Int.'.$Int}=$due;
     for(my $i=0; $i<$Int; $i++) {
 	for(my $n=0; $n<(scalar @$Concepts); $n++ ) {
 	    my $tmp=$Concepts->[$n];