--- loncom/interface/statistics/lonstudentassessment.pm 2006/02/27 19:40:30 1.131 +++ loncom/interface/statistics/lonstudentassessment.pm 2006/03/21 16:49:59 1.135 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.131 2006/02/27 19:40:30 albertel Exp $ +# $Id: lonstudentassessment.pm,v 1.135 2006/03/21 16:49:59 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -650,6 +650,18 @@ sub html_initialize { &mt('Unable to retrieve course information.'). ''); } + + # If we're showing links, show a checkbox to open in new + # windows. + if ($show_links ne 'no') { + $r->print(<new_window = true; +

+NEW_WINDOW_CHECKBOX + } + # $r->print("

".$env{'course.'.$env{'request.course.id'}.'.description'}. "  ".localtime(time)."

"); @@ -719,6 +731,61 @@ sub html_initialize { $Str .= "
";
     $r->print($Str);
     $r->rflush();
+
+    $r->print(<
+// get the left offset of a given widget as an absolute position
+function getLeftOffset (element) {
+    return collect(element, "offsetLeft");
+}
+
+// get the top offset of a given widget as an absolute position
+function getTopOffset (element) {
+    return collect(element, "offsetTop");
+}
+
+function collect(element, att) {
+    var val = 0;
+    while(element) {
+        val += element[att];
+        element = element.offsetParent;
+    }
+    return val;
+}
+
+var currentDiv;
+var oldBorder;
+var currentElement;
+function popup_score(element, score) {
+    popdown_score();
+    var left = getLeftOffset(element);
+    var top = getTopOffset(element);
+    var div = document.createElement("div");
+    div.style.border = "1px solid #8888FF";
+    div.style.backgroundColor = "#CCCCFF";
+    div.appendChild(document.createTextNode(score));
+    div.style.position = "absolute";
+    div.style.top = (top - 25) + "px";
+    div.style.left = (left - 10) + "px";
+    currentDiv = div;
+    document.body.insertBefore(div, document.body.childNodes[0]);
+    oldBorder = element.style.border;
+    element.style.border = "1px solid yellow";
+    currentElement = element;
+}
+
+function popdown_score() {
+    if (currentDiv) {
+        document.body.removeChild(currentDiv);
+    }
+    if (currentElement) {
+        currentElement.style.border = oldBorder;
+    }
+    currentDiv = undefined;
+}
+
+JS
+
     #
     # Let the user know what we are doing
     my $studentcount = scalar(@Apache::lonstatistics::Students); 
@@ -1748,6 +1815,18 @@ sub csv_finish {
 
 }
 
+# This function will return an HTML string including a star, with
+# a mouseover popup showing the "real" value. An optional second
+# argument lets you show something other than a star.
+sub show_star {
+    my $popup = shift;
+    my $symbol = shift || '*';
+    # Escape the popup for JS.
+    $popup =~ s/([^-a-zA-Z0-9:;,._ ()|!\/?=&*])/'\\' . sprintf("%lo", ord($1))/ge;
+    
+    return "$symbol";
+}
+
 #######################################################
 #######################################################
 
@@ -1818,7 +1897,7 @@ sub student_tries_on_sequence {
                     $sum++;
                 } elsif ($tries > 0) {
                     if ($tries > 9) {
-                        $symbol = '*';
+                        $symbol = show_star($tries);
                     } else {
                         $symbol = $tries;
                     }
@@ -1861,11 +1940,12 @@ sub student_tries_on_sequence {
                 if (length($symbol) > 1) {
                     &Apache::lonnet::logthis('length of symbol "'.$symbol.'" > 1');
                 }
-                $symbol = ''.$symbol.'';
+                                '&command=submission';
+                $symbol = &link($symbol, $link);
             }
             $value .= $symbol;
         }
@@ -1880,6 +1960,37 @@ sub student_tries_on_sequence {
     return ($Str,$performance_length,$sum,$max,\@TriesData);
 }
 
+=pod
+
+=item &link
+
+Inputs:
+
+=over 4
+
+=item $text
+
+=item $target
+
+=back
+
+Takes the text and creates a link to the $text that honors
+the value of 'new window' if clicked on, but uses a real 
+'href' so middle and right clicks still work.
+
+$target and $text are assumed to be already correctly escaped; i.e., it
+can be dumped out directly into the output stream as-is.
+
+=cut
+
+sub link {
+    my ($text,$target) = @_;
+    return 
+        "$text";
+}
+
 #######################################################
 #######################################################
 
@@ -1953,7 +2064,7 @@ sub student_performance_on_sequence {
                 $symbol = sprintf("%.0f",$symbol);
             }
             if (length($symbol) > 1) {
-                $symbol = '*';
+                $symbol = show_star($symbol);
             }
             if (exists($resource_data->{'resource.'.$part.'.solved'}) &&
                 $resource_data->{'resource.'.$part.'.solved'} ne '') {
@@ -1984,11 +2095,12 @@ sub student_performance_on_sequence {
             push (@ScoreData,$partscore);
             #
             if ( ($links eq 'yes' && $symbol ne ' ') || ($links eq 'all')) {
-                $symbol = ''.$symbol.'';
+                    '&command=submission';
+                $symbol = &link($symbol, $link);
             }
             $Str .= $symbol;
         }