--- loncom/interface/statistics/lonstudentassessment.pm 2006/02/27 19:40:30 1.131 +++ loncom/interface/statistics/lonstudentassessment.pm 2006/03/05 02:00:01 1.132 @@ -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 @@ 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.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; +} + +JS + # # Let the user know what we are doing my $studentcount = scalar(@Apache::lonstatistics::Students); @@ -1748,6 +1803,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 +1885,7 @@ sub student_tries_on_sequence { $sum++; } elsif ($tries > 0) { if ($tries > 9) { - $symbol = '*'; + $symbol = show_star($tries); } else { $symbol = $tries; } @@ -1953,7 +2020,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 '') {