[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstudentassessment.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Sun, 05 Mar 2006 02:00:02 -0000


bowersj2		Sat Mar  4 21:00:02 2006 EDT

  Modified files:              
    /loncom/interface/statistics	lonstudentassessment.pm 
  Log:
  When * is displayed on the chart, add code to make a pop-up-like thing
  appear and show the real value for that cell.
  
  
Index: loncom/interface/statistics/lonstudentassessment.pm
diff -u loncom/interface/statistics/lonstudentassessment.pm:1.131 loncom/interface/statistics/lonstudentassessment.pm:1.132
--- loncom/interface/statistics/lonstudentassessment.pm:1.131	Mon Feb 27 14:40:30 2006
+++ loncom/interface/statistics/lonstudentassessment.pm	Sat Mar  4 21:00:01 2006
@@ -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.132 2006/03/05 02:00:01 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -719,6 +719,61 @@
     $Str .= "<pre>";
     $r->print($Str);
     $r->rflush();
+
+    $r->print(<<JS);
+<script>
+// 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.children[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;
+}
+</script>
+JS
+
     #
     # Let the user know what we are doing
     my $studentcount = scalar(@Apache::lonstatistics::Students); 
@@ -1748,6 +1803,18 @@
 
 }
 
+# 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 "<span onmouseover='popup_score(this, \"$popup\");return false;' onmouseout='popdown_score();return false;' style='border: 1px solid #339933; margin: -1px;'>$symbol</span>";
+}
+
 #######################################################
 #######################################################
 
@@ -1818,7 +1885,7 @@
                     $sum++;
                 } elsif ($tries > 0) {
                     if ($tries > 9) {
-                        $symbol = '*';
+                        $symbol = show_star($tries);
                     } else {
                         $symbol = $tries;
                     }
@@ -1953,7 +2020,7 @@
                 $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 '') {