--- loncom/interface/statistics/lonstathelpers.pm	2008/12/12 10:01:30	1.57
+++ loncom/interface/statistics/lonstathelpers.pm	2011/07/04 09:25:02	1.67
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstathelpers.pm,v 1.57 2008/12/12 10:01:30 bisitz Exp $
+# $Id: lonstathelpers.pm,v 1.67 2011/07/04 09:25:02 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -135,9 +135,20 @@ Skips 'survey' problems.
 ####################################################
 ####################################################
 sub problem_selector {
-    my ($AcceptedResponseTypes,$sequence_addendum) = @_;
+    my ($AcceptedResponseTypes,$sequence_addendum,$symbmode,$all,$prefix,$smallbox,$onclick) = @_;
+# all: also make sequences selectable
+# prefix: prefix for all form names
+# smallbox: use smaller box
+# onclick: javascript to execute when clicked
     my $Str;
-    $Str = "\n<table>\n";
+    my $jsadd='';
+    if ($onclick) {
+        $jsadd="onClick='$onclick'";
+    }
+    $Str =  &Apache::loncommon::start_scrollbox(($smallbox?'420px':'620px'),
+                                                ($smallbox?'400px':'600px'),
+                                                ($smallbox?'60px':'300px')).
+            &Apache::loncommon::start_data_table();
     my $rb_count =0;
     my ($navmap,@sequences) = 
         &Apache::lonstatistics::selected_sequences_with_assessments('all');
@@ -158,41 +169,48 @@ sub problem_selector {
                                                      resptype=>$resptype});
                         my $checked = '';
                         if ($env{'form.problemchoice'} eq $value) {
-                            $checked = 'checked="checked" ';
+                            $checked = ' checked="checked"';
                         }
                         my $title = $res->compTitle;
                         if (! defined($title) || $title eq '') {
                             ($title) = ($res->src =~ m:/([^/]*)$:);
                         }
-                        $seq_str .= '<tr>'.
-                            qq{<td><input type="radio" id="$rb_count" name="problemchoice" value="$value" $checked /></td>}.
-                            '<td><label for="'.$rb_count.'">'.$resptype.'</label></td>'.
-                            '<td><label for="'.$rb_count.'">'.$title.'</label>';
+                        $seq_str .=  &Apache::loncommon::start_data_table_row().
+                            ($symbmode?
+                             '<td><input type="radio" id="'.$prefix.$rb_count.'" name="'.$prefix.'symb" value="'.&HTML::Entities::encode($res->symb,'<>&"').'" '.$checked.' '.
+                             $jsadd.
+                             ' /></td>'
+                            :qq{<td><input type="radio" id="$rb_count" name="problemchoice" value="$value"$checked /></td>}).
+                            '<td><label for="'.$prefix.$rb_count.'">'.$resptype.'</label></td>'.
+                            '<td><label for="'.$prefix.$rb_count.'">'.$title.'</label>';
                         if (scalar(@response_ids) > 1) {
                             $seq_str .= &mt('response').' '.$respid;
                         }
                         my $link = $res->link.'?symb='.&escape($res->shown_symb);
                         $seq_str .= ('&nbsp;'x2).
                             '<a target="preview" href="'.$link.'">'.&mt('view').'</a>';
-                        $seq_str .= "</td></tr>\n";
+                        $seq_str .= "</td>". &Apache::loncommon::end_data_table_row()."\n";
                         $rb_count++;
                     }
                 }
             }
         }
         if ($seq_str ne '') {
-            $Str .= '<tr><td>&nbsp;</td>'.
-                '<td colspan="2"><b>'.$seq->compTitle.'</b></td>'.
-                "</tr>\n".$seq_str;
+            $Str .= &Apache::loncommon::start_data_table_header_row().
+                '<th colspan="3">'.
+                ($all?'<input type="radio" id="'.$prefix.'s'.$rb_count.'" name="'.$prefix.'symb" value="'.&HTML::Entities::encode($seq->symb,'<>&').'" '.$jsadd.' />':'').
+                $seq->compTitle.'</th>'.
+                &Apache::loncommon::end_data_table_header_row()."\n".$seq_str;
             if (defined($sequence_addendum)) {
-                $Str .= '<tr>'.
+                $Str .= &Apache::loncommon::start_data_table_header_row().
                     ('<td>&nbsp;</td>'x2).
                     '<td align="right">'.$sequence_addendum.'</td>'.
-                    "</tr>\n";
+                    &Apache::loncommon::end_data_table_header_row()."\n";
             }
         }
+
     }
-    $Str .= "</table>\n";
+    $Str .= &Apache::loncommon::end_data_table().&Apache::loncommon::end_scrollbox()."\n";
     return $Str;
 }
 
@@ -222,7 +240,7 @@ and their contents.  A checkbox is provi
 ####################################################
 ####################################################
 sub MultipleProblemSelector {
-    my ($navmap,$inputname,$formname)=@_;
+    my ($navmap,$inputname,$formname,$anoncounter)=@_;
     my $cid = $env{'request.course.id'};
     my $Str;
     # Massage the input as needed.
@@ -238,7 +256,7 @@ sub MultipleProblemSelector {
     my $selected = {map { ($_,1) } (&get_selected_symbs($inputname))};
     # Header
     $Str .= <<"END";
-<script language="JavaScript" type="text/javascript">
+<script type="text/javascript" language="JavaScript">
     function checkall(value,seqid) {
         for (i=0; i<document.forms.$formname.elements.length; i++) {
             ele = document.forms.$formname.elements[i];
@@ -257,7 +275,64 @@ sub MultipleProblemSelector {
     }
 </script>
 END
-    $Str .= 
+    my $checkanonjs = <<"END";
+ 
+<script type="text/javascript" language="JavaScript">
+    function checkanon() {
+        return true;
+    }
+</script>
+
+END
+    if (ref($anoncounter) eq 'HASH') {
+        if (keys(%{$anoncounter}) > 0) {
+            my $anonwarning = &mt('Your selection includes both problems with and without anonymous submissions.').'\n'.&mt('You must select either only anonymous or only named problems.').'\n\n'.&mt('If a selection contains both anonymous and named parts, [_1]use the Anoymous/Named buttons to ensure selections will be either all anonymous [_1]or all named.','\n');
+            $checkanonjs = <<"END";
+
+<script type="text/javascript" language="JavaScript">
+    function checkanon() {
+        anoncount = 0;
+        namedcount = 0;
+        for (i=0; i<document.forms.$formname.elements.length; i++) {
+            ele = document.forms.$formname.elements[i];
+            if (ele.name == '$inputname') {
+                itemid = document.forms.$formname.elements[i].id;
+                if (document.forms.$formname.elements[i].checked) {
+                    anonid = 'anonymous_'+itemid;
+                    mixid = 'mixed_'+itemid;
+                    anonele = document.getElementById(anonid);
+                    mixele = document.getElementById(mixid);
+                    if (anonele.value > 0) {
+                        if (mixele.value == 'none') {
+                            anoncount ++;
+                        } else {
+                            if (mixele.value == '0') {
+                                if (mixele.checked) {
+                                    anoncount ++; 
+                                } else {
+                                    namedcount ++;
+                                } 
+                            } else {
+                                namedcount ++;
+                            }
+                        }
+                    } else {
+                        namedcount ++;
+                    }
+                }
+            }
+        }
+        if (anoncount > 0 && namedcount > 0) {
+            alert("$anonwarning");
+            return false;
+        } 
+    }
+</script>
+
+END
+        }
+    }
+    $Str .= $checkanonjs.
         '<a href="javascript:checkall(true)">'.&mt('Select All').'</a>'.
         ('&nbsp;'x4).
         '<a href="javascript:checkall(false)">'.&mt('Unselect All').'</a>';
@@ -288,9 +363,27 @@ END
                                                $seq_id++,
                                                $inputname));
         } elsif ($curRes->is_problem) {
+            my $anonpart = 0;
+            my $namedpart = 0;
+            my @parts = @{$curRes->parts()};
+            if (ref($anoncounter) eq 'HASH') {
+                if (keys(%{$anoncounter}) > 0) {
+                    my @parts = @{$curRes->parts()};
+                    my $symb = $curRes->symb();
+                    foreach my $part (@parts) {
+                        if ((exists($anoncounter->{$symb."\0".$part})) ||
+                            $curRes->is_anonsurvey($part)) {
+                            $anonpart ++;
+                        } else {
+                            $namedpart ++ 
+                        }
+                    }
+                }
+            }
             if (@Accumulator && $Accumulator[-1] ne '') {
                 &{$Accumulator[-1]}($curRes,
-                                    exists($selected->{$curRes->symb}));
+                                    exists($selected->{$curRes->symb}),
+                                    $anonpart,$namedpart);
             }
         }
     }
@@ -318,20 +411,45 @@ sub new_accumulator {
     return 
         sub {
             if (@_) { 
-                my ($res,$checked) = @_;
+                my ($res,$checked,$anonpart,$namedpart) = @_;
                 $target.='<tr><td><label>'.
                     '<input type="checkbox" name="'.$inputname.'" ';
                 if ($checked) {
                     $target .= 'checked="checked" ';
                 }
+                my $anon_id = $item_id;
                 $target .= 'id="'.$seq_id.':'.$item_id++.'" ';
+                my $esc_symb = &escape($res->symb);
                 $target.= 
-                    'value="'.&escape($res->symb).'" />'.
+                    'value="'.$esc_symb.'" />'.
                     '&nbsp;'.$res->compTitle.'</label>'.
                     ('&nbsp;'x2).'<a target="preview" '.
                     'href="'.$res->link.'?symb='.
                     &escape($res->shown_symb).'">'.&mt('view').'</a>'.
-                    '</td></tr>'.$/;
+                    '<input type="hidden" id="anonymous_'.$seq_id.':'.$anon_id.'" name="hidden_'.$seq_id.':'.$anon_id.'" value="'.$anonpart.'" />';
+                my $mixed = '<input type="hidden" id="mixed_'.$seq_id.':'.$anon_id.'" value="none" name="mixed_'.$seq_id.':'.$anon_id.'" />';
+                if ($anonpart) {
+                    if ($namedpart) {
+                        my $checknamed = '';
+                        my $checkedanon = ' checked="checked"';
+                        if ($env{'form.mixed_'.$seq_id.':'.$anon_id} eq $esc_symb) {
+                            $checknamed = $checkedanon;
+                            $checkedanon = '';
+                        }
+                        $mixed = '&nbsp;('.
+    &mt('Both anonymous and named submissions -- display: [_1]Anonymous [_2]Named[_3]',
+    '<span class="LC_nobreak"><label>'.
+    '<input type="radio" name="mixed_'.$seq_id.':'.$anon_id.
+    '" value="0" id="mixed_'.$seq_id.':'.$anon_id.'"'.$checkedanon.' />',
+    '</label></span>'.('&nbsp;'x2).' <span class="LC_nobreak">'.
+    '<label><input type="radio" name="mixed_'.$seq_id.':'.$anon_id.
+    '" value="symb_'.$esc_symb.'" id="named_'.$seq_id.':'.$anon_id.'"'.$checknamed.' />',
+    '</label></span>').')';
+                    } else {
+                        $target .= '&nbsp;'.&mt('(Anonymous Survey)');
+                    }
+                }
+                $target.= $mixed.'</td></tr>'.$/;
             } else { 
                 if (defined($target)) {
                     return { title => $title,
@@ -464,7 +582,8 @@ sub get_prev_curr_next {
         my @resources = &get_resources($navmap,$seq);
         foreach my $res (@resources) {
             foreach my $part (@{$res->parts}) {
-                if ($res->is_survey($part) && ($granularity eq 'part_survey')){
+                if (($res->is_survey($part) || ($res->is_anonsurvey($part))) && 
+                    ($granularity eq 'part_survey')) {
                     push (@Resource,
                           { symb     => $res->symb,
                             part     => $part,
@@ -609,7 +728,7 @@ sub GetStudentAnswers {
         my $answer = &Apache::lonstathelpers::get_student_answer
             ($resource,$sname,$sdom,$partid,$respid);
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
-                                                 &mt('last student'));
+                                                     'last student');
         $answers{$answer}++;
         $student->{'answer'} = $answer;
     }
@@ -885,7 +1004,7 @@ prior to every analysis lookup.
 sub ensure_proper_cache {
     my ($symb) = @_;
     my $cid = $env{'request.course.id'};
-    my $new_filename =  '/home/httpd/perl/tmp/'.
+    my $new_filename = LONCAPA::tempdir() .
         'problemanalysis_'.$cid.'_analysis_cache.db';
     if (! defined($cache_filename) ||
         $cache_filename ne $new_filename ||
@@ -1255,7 +1374,7 @@ sub limit_by_time_form {
     my $enddateform = &Apache::lonhtmlcommon::date_setter
         ('Statistics','limitby_enddate',$endtime,undef,undef,$state);
     my $Str;
-    $Str .= '<script language="Javascript" >';
+    $Str .= '<script type="text/javascript" language="JavaScript">';
     $Str .= 'function toggle_limitby_activity(state) {';
     $Str .= '    if (state) {';
     $Str .= '        limitby_startdate_enable();';
@@ -1420,7 +1539,7 @@ sub submission_report_form {
              ' enough input.');
     }
     my $html = $/.
-        '<script type="Text/JavaScript">'.
+        '<script type="text/javascript" language="JavaScript">'.
         "document.Statistics.reportSelected.value='$original_report';".
         '</script>'.
         '<input type="hidden" name="correctans" value="true" />'.