Diff for /loncom/homework/functionplotresponse.pm between versions 1.97 and 1.108

version 1.97, 2012/08/16 23:03:01 version 1.108, 2015/03/09 16:22:59
Line 49  BEGIN { Line 49  BEGIN {
 # Return a true value if HTML5 should be used.  # Return a true value if HTML5 should be used.
   
 sub useHTML5 {  sub useHTML5 {
     return 1;      if ($env{'browser.type'} eq 'chrome') {
           if ($env{'browser.version'} >= 14) {
               return 1;
           }
       } elsif ($env{'browser.type'} eq 'safari') {
           if ($env{'browser.os'} eq 'mac') {
               my ($prefix,$version) = ($env{'browser.version'} =~ /^(\d*)(\d{3})\./); 
               if ((!$env{'browser.mobile'}) || 
                   (($env{'browser.mobile'}) && length($prefix))) {
                   if ($version >= 536) {
                       return 1;
                   }
               }
           }
       } elsif ($env{'browser.type'} eq 'mozilla') {
           if ($env{'browser.info'} =~ /^firefox\-(\d+)/) {
               my $firefox = $1;
               if ((($env{'browser.os'} eq 'mac') && ($firefox >= 20)) ||
                   (($env{'browser.os'} eq 'unix') && ($firefox >= 17)) ||
                   (($env{'browser.os'} eq 'win') && ($firefox >= 14))) {
                   return 1;
               }
           }
       } elsif ($env{'browser.type'} eq 'explorer') { 
           if (($env{'browser.os'} eq 'win') && ($env{'browser.version'} == 10)) {
               return 1;
           }
       } elsif ($env{'browser.type'} eq 'opera') {
           if ($env{'browser.version'} >= 18) {
               return 1;
           }
       }
       return 0;
   }
   
   #
   # HTML5 version does not understand "_" in IDs
   #
   sub appid {
       my ($id)=@_;
       $id=~s/\_/rid/gs;
       $id=~s/\W//gs;
       return $id;
 }  }
   
   #
 # Routines to start the applet (Java) or the HTML5/JavaScript  # Routines to start the applet (Java) or the HTML5/JavaScript
 #  #
 # There can be a number of applets on a page, each called ggbApplet_$id,   # There can be a number of applets on a page, each called ggbApplet_$id, 
Line 88  sub geogebra_default_parameters { Line 131  sub geogebra_default_parameters {
   
 sub java_geogebra_startcode {  sub java_geogebra_startcode {
     my ($id,$width,$height)=@_;      my ($id,$width,$height)=@_;
       my $appid=&appid($id);
     $width=int(1.*$width);      $width=int(1.*$width);
     $height=int(1.*$height);      $height=int(1.*$height);
     unless ($width) { $width=700; }      unless ($width) { $width=700; }
     unless ($height) { $height=400; }      unless ($height) { $height=400; }
     return (<<ENDSTARTCODE);      return (<<ENDSTARTCODE);
 <applet name="ggbApplet_$id" code="geogebra.GeoGebraApplet" archive="geogebra.jar"  <applet name="ggbApplet$appid" code="geogebra.GeoGebraApplet" archive="geogebra.jar"
          codebase="/adm/geogebra/"  width="$width" height="$height" MAYSCRIPT>           codebase="/adm/geogebra/"  width="$width" height="$height" MAYSCRIPT>
        <param name="java_arguments" value="-Xmx512m -Djnlp.packEnabled=true"/>         <param name="java_arguments" value="-Xmx512m -Djnlp.packEnabled=true"/>
 ENDSTARTCODE  ENDSTARTCODE
Line 111  sub java_geogebra_code_param { Line 155  sub java_geogebra_code_param {
   
 sub html5_geogebra_startcode {  sub html5_geogebra_startcode {
     my ($id,$width,$height)=@_;      my ($id,$width,$height)=@_;
       my $appid=&appid($id);
     $width=int(1.*$width);      $width=int(1.*$width);
     $height=int(1.*$height);      $height=int(1.*$height);
     unless ($width) { $width=700; }      unless ($width) { $width=700; }
Line 118  sub html5_geogebra_startcode { Line 163  sub html5_geogebra_startcode {
     my $code=&geogebra_internal_program();      my $code=&geogebra_internal_program();
     return (<<ENDSTARTCODE);      return (<<ENDSTARTCODE);
 <article class="geogebraweb" data-param-enableLabelDrags="false" data-param-enableShiftDragZoom="false"   <article class="geogebraweb" data-param-enableLabelDrags="false" data-param-enableShiftDragZoom="false" 
 data-param-width="$width" data-param-height="$height" data-param-id="ggbApplet_$id"   data-param-width="$width" data-param-height="$height" data-param-id="ggbApplet$appid" 
 data-param-ggbbase64="$code"></article>  data-param-ggbbase64="$code"></article>
 ENDSTARTCODE  ENDSTARTCODE
 }  }
Line 136  sub geogebra_internal_program { Line 181  sub geogebra_internal_program {
 #  #
 sub java_geogebra_default_parameters {  sub java_geogebra_default_parameters {
    my ($id)=@_;     my ($id)=@_;
      my $appid=&appid($id);
    return(<<ENDDEFAULTPARAMETERS);     return(<<ENDDEFAULTPARAMETERS);
         <param name="image" value="/adm/lonIcons/lonanim.gif"  />          <param name="image" value="/adm/lonIcons/lonanim.gif"  />
         <param name="boxborder" value="false"  />          <param name="boxborder" value="false"  />
         <param name="centerimage" value="true"  />          <param name="centerimage" value="true"  />
  <param name="cache_archive" value="geogebra.jar, geogebra_main.jar, geogebra_gui.jar, geogebra_cas.jar, geogebra_export.jar, geogebra_algos.jar, geogebra_javascript.jar, geogebra_properties.jar, jlatexmath.jar, jlm_cyrillic.jar, jlm_greek.jar" />   <param name="cache_archive" value="geogebra.jar, geogebra_main.jar, geogebra_gui.jar, geogebra_cas.jar, geogebra_export.jar, geogebra_algos.jar, geogebra_javascript.jar, geogebra_properties.jar, jlatexmath.jar, jlm_cyrillic.jar, jlm_greek.jar" />
  <param name="cache_version" value="4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0,4.0.1.0" />   <param name="cache_version" value="4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0,4.4.3.0" />
         <param name="framePossible" value="false" />          <param name="framePossible" value="false" />
   
         <param name="showResetIcon" value="false" />          <param name="showResetIcon" value="false" />
Line 156  sub java_geogebra_default_parameters { Line 202  sub java_geogebra_default_parameters {
         <param name="enableShiftDragZoom" value="false" />          <param name="enableShiftDragZoom" value="false" />
         <param name="allowRescaling" value="false" />          <param name="allowRescaling" value="false" />
         <param name="enableLabelDrags" value="false" />          <param name="enableLabelDrags" value="false" />
         <param name="ggbOnInitParam" value="applet_$id" />          <param name="ggbOnInitParam" value="ggbApplet$appid" />
 ENDDEFAULTPARAMETERS  ENDDEFAULTPARAMETERS
 }  }
   
Line 171  sub init_script { Line 217  sub init_script {
    if ($#Apache::functionplotresponse::callscripts>=0) {     if ($#Apache::functionplotresponse::callscripts>=0) {
       my $script='';        my $script='';
       foreach my $id (@Apache::functionplotresponse::callscripts) {        foreach my $id (@Apache::functionplotresponse::callscripts) {
           $script.="if (param=='applet_$id') { loaded_$id=true; }\n";            $script.="if (param=='ggbApplet".&appid($id)."') { loaded_$id=true; }\n";
       }        }
       $script.="if (".join(' && ',map { "loaded_$_" } (@Apache::functionplotresponse::callscripts)).        $script.="if (".join(' && ',map { "loaded_$_" } (@Apache::functionplotresponse::callscripts)).
                ") { setTimeout('ggbInitAll()',200) }";                 ") { setTimeout('ggbInitAll()',200) }";
Line 179  sub init_script { Line 225  sub init_script {
       my $html5init='';        my $html5init='';
       if (&useHTML5()) {        if (&useHTML5()) {
           $html5init=            $html5init=
            '<script type="text/javascript" language="javascript" src="/adm/geogebra/html5/web/test42/web/web.nocache.js"></script>';             '<script type="text/javascript" language="javascript" src="/adm/geogebra/web/web.nocache.js"></script>';
       }        }
       return (<<ENDGGBINIT);        return (<<ENDGGBINIT);
 $html5init  $html5init
Line 206  ENDGGBINIT Line 252  ENDGGBINIT
 #  #
 sub update_script {  sub update_script {
     my ($id)=@_;      my ($id)=@_;
       my $appid=&appid($id);
     return (<<ENDUPDATESCRIPT);      return (<<ENDUPDATESCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function updatePointCoordinates_$id(coordinateName) {  function updatePointCoordinates_$id(coordinateName) {
             var x = document.ggbApplet_$id.getXcoord(coordinateName);              var x = document.ggbApplet$appid.getXcoord(coordinateName);
             var y = document.ggbApplet_$id.getYcoord(coordinateName);              var y = document.ggbApplet$appid.getYcoord(coordinateName);
             document.lonhomework.elements["HWVAL_$id\_" + coordinateName + "_x"].value = x;              document.lonhomework.elements["HWVAL_$id\_" + coordinateName + "_x"].value = x;
             document.lonhomework.elements["HWVAL_$id\_" + coordinateName + "_y"].value = y;              document.lonhomework.elements["HWVAL_$id\_" + coordinateName + "_y"].value = y;
         }          }
Line 226  ENDUPDATESCRIPT Line 273  ENDUPDATESCRIPT
   
 sub update_register {  sub update_register {
    my ($id,$variable)=@_;     my ($id,$variable)=@_;
    return "document.ggbApplet_$id.registerObjectUpdateListener('$variable','updatePointCoordinates_$id');\n";     my $appid=&appid($id);
      return "document.ggbApplet$appid.registerObjectUpdateListener('$variable','updatePointCoordinates_$id');\n";
 }  }
   
 #  #
Line 234  sub update_register { Line 282  sub update_register {
 #  #
 sub set_point_coordinate {  sub set_point_coordinate {
    my ($id,$variable,$x,$y,$fixed)=@_;     my ($id,$variable,$x,$y,$fixed)=@_;
      my $appid=&appid($id);
    my $mult=($fixed?'a*':'');     my $mult=($fixed?'a*':'');
 # Get rid of wild exponents, make sure it's a number  # Get rid of wild exponents, make sure it's a number
    $x=1.*$x;     $x=1.*$x;
Line 244  sub set_point_coordinate { Line 293  sub set_point_coordinate {
    $y=~s/[e|E]/\*10\^/;     $y=~s/[e|E]/\*10\^/;
    $y=~s/\+//;     $y=~s/\+//;
    return (<<ENDSETVARIABLE);     return (<<ENDSETVARIABLE);
 document.ggbApplet_$id.evalCommand("a=1");  document.ggbApplet$appid.evalCommand("a=1");
 document.ggbApplet_$id.evalCommand("$variable=$mult($x,$y)");  document.ggbApplet$appid.evalCommand("$variable=$mult($x,$y)");
 document.ggbApplet_$id.setLabelVisible("$variable",false);  document.ggbApplet$appid.setLabelVisible("$variable",false);
 ENDSETVARIABLE  ENDSETVARIABLE
 }  }
   
Line 255  ENDSETVARIABLE Line 304  ENDSETVARIABLE
 #  #
 sub set_slope_coordinate {  sub set_slope_coordinate {
    my ($id,$variable,$xrel,$yrel,$xmin,$xmax,$ymin,$ymax,$pointname,$fixed)=@_;     my ($id,$variable,$xrel,$yrel,$xmin,$xmax,$ymin,$ymax,$pointname,$fixed)=@_;
      my $appid=&appid($id);
    my $xvariable=$variable.'x';     my $xvariable=$variable.'x';
    my $yvariable=$variable.'y';     my $yvariable=$variable.'y';
    my $domain=$xmax-$xmin;     my $domain=$xmax-$xmin;
Line 263  sub set_slope_coordinate { Line 313  sub set_slope_coordinate {
    my $yinterval=$range/200.;     my $yinterval=$range/200.;
    my $mult=($fixed?'a*':'');     my $mult=($fixed?'a*':'');
    return (<<ENDSETSVARIABLE);     return (<<ENDSETSVARIABLE);
 document.ggbApplet_$id.evalCommand("a=1");  document.ggbApplet$appid.evalCommand("a=1");
 document.ggbApplet_$id.evalCommand("$xvariable=Slider[$xinterval,$domain,$xinterval]");  document.ggbApplet$appid.evalCommand("$xvariable=Slider[$xinterval,$domain,$xinterval]");
 document.ggbApplet_$id.setVisible("$xvariable", false);  document.ggbApplet$appid.setVisible("$xvariable", false);
 document.ggbApplet_$id.evalCommand("$xvariable=$xrel");  document.ggbApplet$appid.evalCommand("$xvariable=$xrel");
 document.ggbApplet_$id.evalCommand("$yvariable=Slider[-$range,$range,$yinterval]");  document.ggbApplet$appid.evalCommand("$yvariable=Slider[-$range,$range,$yinterval]");
 document.ggbApplet_$id.setVisible("$yvariable", false);  document.ggbApplet$appid.setVisible("$yvariable", false);
 document.ggbApplet_$id.evalCommand("$yvariable=$yrel");  document.ggbApplet$appid.evalCommand("$yvariable=$yrel");
 document.ggbApplet_$id.evalCommand("$variable=$mult($xvariable+x($pointname),$yvariable+y($pointname))");  document.ggbApplet$appid.evalCommand("$variable=$mult($xvariable+x($pointname),$yvariable+y($pointname))");
 document.ggbApplet_$id.setLabelVisible("$variable", false);  document.ggbApplet$appid.setLabelVisible("$variable", false);
 ENDSETSVARIABLE  ENDSETSVARIABLE
 }  }
   
Line 367  ENDSTARTINIT Line 417  ENDSTARTINIT
   
 sub axes_script {  sub axes_script {
     my ($id,$xmin,$xmax,$ymin,$ymax,$xvisible,$yvisible,$gvisible)=@_;      my ($id,$xmin,$xmax,$ymin,$ymax,$xvisible,$yvisible,$gvisible)=@_;
       my $appid=&appid($id);
     return (<<ENDAXESSCRIPT);      return (<<ENDAXESSCRIPT);
             // changes (xmin, xmax, ymin, ymax)              // changes (xmin, xmax, ymin, ymax)
             document.ggbApplet_$id.setCoordSystem($xmin,$xmax,$ymin,$ymax);              document.ggbApplet$appid.setCoordSystem($xmin,$xmax,$ymin,$ymax);
   
             // makes the (x,y) axis (in)visible              // makes the (x,y) axis (in)visible
             document.ggbApplet_$id.setAxesVisible($xvisible,$yvisible);              document.ggbApplet$appid.setAxesVisible($xvisible,$yvisible);
             // makes the grid (in)visible              // makes the grid (in)visible
             document.ggbApplet_$id.setGridVisible($gvisible);              document.ggbApplet$appid.setGridVisible($gvisible);
 ENDAXESSCRIPT  ENDAXESSCRIPT
 }  }
   
 sub axes_label {  sub axes_label {
     my ($id,$xmin,$xmax,$ymin,$ymax,$xlabel,$ylabel)=@_;      my ($id,$xmin,$xmax,$ymin,$ymax,$xlabel,$ylabel)=@_;
       my $appid=&appid($id);
     unless ($xlabel || $ylabel) { return ''; }      unless ($xlabel || $ylabel) { return ''; }
     my $return='document.ggbApplet_'.$id.'.evalCommand("topRight=Corner[3]");';      my $return='document.ggbApplet'.$appid.'.evalCommand("topRight=Corner[3]");';
     if ($xlabel) {      if ($xlabel) {
       if (($ymin<0) && ($ymax>0)) {        if (($ymin<0) && ($ymax>0)) {
        $return.=(<<ENDXAXISLABELSCRIPT);         $return.=(<<ENDXAXISLABELSCRIPT);
 document.ggbApplet_$id.evalCommand("Xlabel=(x(topRight)-AxisStepX[],AxisStepY[]/6)");  document.ggbApplet$appid.evalCommand("Xlabel=(x(topRight)-AxisStepX[],AxisStepY[]/6)");
 document.ggbApplet_$id.setVisible("Xlabel",false);  document.ggbApplet$appid.setVisible("Xlabel",false);
 document.ggbApplet_$id.evalCommand("Text[\\"$xlabel\\", Xlabel]");  document.ggbApplet$appid.evalCommand("Text[\\"$xlabel\\", Xlabel]");
 ENDXAXISLABELSCRIPT  ENDXAXISLABELSCRIPT
       } else {        } else {
        $return.=(<<ENDXOFFAXISLABEL);         $return.=(<<ENDXOFFAXISLABEL);
 document.ggbApplet_$id.evalCommand("LowerRight=Corner[2]");  document.ggbApplet$appid.evalCommand("LowerRight=Corner[2]");
 document.ggbApplet_$id.evalCommand("Text[\\"$xlabel\\", (x(LowerRight) - AxisStepX[], y(LowerRight) + AxisStepY[] / 2)]");  document.ggbApplet$appid.evalCommand("Text[\\"$xlabel\\", (x(LowerRight) - AxisStepX[], y(LowerRight) + AxisStepY[] / 2)]");
 ENDXOFFAXISLABEL  ENDXOFFAXISLABEL
       }        }
     }      }
     if ($ylabel) {      if ($ylabel) {
       if (($xmin<0) && ($xmax>0)) {        if (($xmin<0) && ($xmax>0)) {
        $return.=(<<ENDYAXISLABELSCRIPT);         $return.=(<<ENDYAXISLABELSCRIPT);
 document.ggbApplet_$id.evalCommand("Ylabel=(AxisStepX[]/6,y(topRight)-AxisStepY[]/3)");  document.ggbApplet$appid.evalCommand("Ylabel=(AxisStepX[]/6,y(topRight)-AxisStepY[]/3)");
 document.ggbApplet_$id.setVisible("Ylabel",false);  document.ggbApplet$appid.setVisible("Ylabel",false);
 document.ggbApplet_$id.evalCommand("Text[\\"$ylabel\\", Ylabel]");  document.ggbApplet$appid.evalCommand("Text[\\"$ylabel\\", Ylabel]");
 ENDYAXISLABELSCRIPT  ENDYAXISLABELSCRIPT
       } else {        } else {
        $return.=(<<ENDYOFFAXISLABEL);         $return.=(<<ENDYOFFAXISLABEL);
 document.ggbApplet_$id.evalCommand("UpperLeft=Corner[4]");  document.ggbApplet$appid.evalCommand("UpperLeft=Corner[4]");
 document.ggbApplet_$id.evalCommand("Text[\\"$ylabel\\", (x(UpperLeft) + AxisStepX[] / 5, y(UpperLeft) - AxisStepY[] / 1.8)]");  document.ggbApplet$appid.evalCommand("Text[\\"$ylabel\\", (x(UpperLeft) + AxisStepX[] / 5, y(UpperLeft) - AxisStepY[] / 1.8)]");
 ENDYOFFAXISLABEL  ENDYOFFAXISLABEL
       }        }
     }      }
Line 419  ENDYOFFAXISLABEL Line 471  ENDYOFFAXISLABEL
   
 sub plot_script {  sub plot_script {
    my ($id,$function,$fixed,$label,$color,$xmin,$xmax,$thickness)=@_;     my ($id,$function,$fixed,$label,$color,$xmin,$xmax,$thickness)=@_;
      my $appid=&appid($id);
    $label=~s/\W//g;     $label=~s/\W//g;
    if (($label) && ($label!~/^[A-Za-z]/)) {     if (($label) && ($label!~/^[A-Za-z]/)) {
       $label='C'.$label;        $label='C'.$label;
Line 440  sub plot_script { Line 493  sub plot_script {
       $bc=hex($bh);        $bc=hex($bh);
    }     }
    if ($fixed) {     if ($fixed) {
       return "document.ggbApplet_$id.evalCommand('$label=Function[$function,$xmin,$xmax]');\n".        return "document.ggbApplet$appid.evalCommand('$label=Function[$function,$xmin,$xmax]');\n".
              ($visible?'':"document.ggbApplet_$id.setLabelVisible('$label', false);\n").               ($visible?'':"document.ggbApplet$appid.setLabelVisible('$label', false);\n").
              ($color?"document.ggbApplet_$id.setColor('$label',$rc,$gc,$bc);\n":'').               ($color?"document.ggbApplet$appid.setColor('$label',$rc,$gc,$bc);\n":'').
              ($thickness?"document.ggbApplet_$id.setLineThickness('$label',$thickness);\n":'');               ($thickness?"document.ggbApplet$appid.setLineThickness('$label',$thickness);\n":'');
    } else {     } else {
        return "document.ggbApplet_$id.evalCommand('y=$function');\n";         return "document.ggbApplet$appid.evalCommand('y=$function');\n";
    }     }
 }  }
   
Line 455  sub plot_script { Line 508  sub plot_script {
   
 sub plotobject_script {  sub plotobject_script {
    my ($id,$label,$x,$y)=@_;     my ($id,$label,$x,$y)=@_;
      my $appid=&appid($id);
    unless ($label) {     unless ($label) {
       $Apache::functionplotresponse::counter++;        $Apache::functionplotresponse::counter++;
       $label='O'.$Apache::functionplotresponse::counter;        $label='O'.$Apache::functionplotresponse::counter;
    }     }
    &generate_input_field($id,$label,$x,$y);     &generate_input_field($id,$label,$x,$y);
    return "document.ggbApplet_$id.evalCommand('a=1');\n".     return "document.ggbApplet$appid.evalCommand('a=1');\n".
           "document.ggbApplet_$id.setVisible('a', false);\n".            "document.ggbApplet$appid.setVisible('a', false);\n".
           "document.ggbApplet_$id.setLabelVisible('a', false);\n".            "document.ggbApplet$appid.setLabelVisible('a', false);\n".
           "document.ggbApplet_$id.evalCommand('$label=a*($x,$y)');\n".            "document.ggbApplet$appid.evalCommand('$label=a*($x,$y)');\n".
           "document.ggbApplet_$id.setVisible('$label', true);\n".            "document.ggbApplet$appid.setVisible('$label', true);\n".
           "document.ggbApplet_$id.setLabelVisible('$label', true);\n";            "document.ggbApplet$appid.setLabelVisible('$label', true);\n";
 }  }
   
 #  #
Line 474  sub plotobject_script { Line 528  sub plotobject_script {
   
 sub plotvector_script {  sub plotvector_script {
    my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax,$fixed)=@_;     my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax,$fixed)=@_;
      my $appid=&appid($id);
    unless ($label) {     unless ($label) {
       $Apache::functionplotresponse::counter++;        $Apache::functionplotresponse::counter++;
       $label='V'.$Apache::functionplotresponse::counter;        $label='V'.$Apache::functionplotresponse::counter;
Line 487  sub plotvector_script { Line 542  sub plotvector_script {
        &new_point_coordinate($id,$startlabel,$xs,$ys,$fixed).         &new_point_coordinate($id,$startlabel,$xs,$ys,$fixed).
        &new_point_coordinate($id,$endlabel,$xe,$ye,$fixed).         &new_point_coordinate($id,$endlabel,$xe,$ye,$fixed).
        (<<ENDVECTOR);         (<<ENDVECTOR);
 document.ggbApplet_$id.evalCommand("$label=Vector[$startlabel,$endlabel]");  document.ggbApplet$appid.evalCommand("$label=Vector[$startlabel,$endlabel]");
 document.ggbApplet_$id.setLabelVisible("$label",true);  document.ggbApplet$appid.setLabelVisible("$label",true);
 document.ggbApplet_$id.setLineThickness("$label",8);  document.ggbApplet$appid.setLineThickness("$label",8);
 document.ggbApplet_$id.evalCommand("$pointlabel=($pointx,y($startlabel))");  document.ggbApplet$appid.evalCommand("$pointlabel=($pointx,y($startlabel))");
 document.ggbApplet_$id.evalCommand("$anglelabel=Angle[$pointlabel,$startlabel,$endlabel]");  document.ggbApplet$appid.evalCommand("$anglelabel=Angle[$pointlabel,$startlabel,$endlabel]");
 document.ggbApplet_$id.setLabelVisible("$anglelabel",true);  document.ggbApplet$appid.setLabelVisible("$anglelabel",true);
 document.ggbApplet_$id.setLabelStyle("$anglelabel",VALUE=2);  document.ggbApplet$appid.setLabelStyle("$anglelabel",VALUE=2);
 ENDVECTOR  ENDVECTOR
 }  }
   
Line 504  ENDVECTOR Line 559  ENDVECTOR
   
 sub answer_spline_script {  sub answer_spline_script {
    my ($id,@points)=@_;     my ($id,@points)=@_;
      my $appid=&appid($id);
    my $order=int(($#points+1)/4);     my $order=int(($#points+1)/4);
    if ($order<2) { $order=2; }     if ($order<2) { $order=2; }
    if ($order>8) { $order=8; }     if ($order>8) { $order=8; }
    $Apache::functionplotresponse::counter++;     $Apache::functionplotresponse::counter++;
    my $label='CSpline'.$Apache::functionplotresponse::counter;     my $label='CSpline'.$Apache::functionplotresponse::counter;
    my $output='document.ggbApplet_'.$id.'.evalCommand("'.$label.'=Spline'.$order.'[';     my $output='document.ggbApplet'.$appid.'.evalCommand("'.$label.'=Spline'.$order.'[';
    for (my $i=0;$i<=$#points;$i+=4) {     for (my $i=0;$i<=$#points;$i+=4) {
       $output.="($points[$i],$points[$i+1]),($points[$i+2],$points[$i+3]),";        $output.="($points[$i],$points[$i+1]),($points[$i+2],$points[$i+3]),";
    }     }
    $output=~s/\,$//;     $output=~s/\,$//;
    $output.=']");'."\n";     $output.=']");'."\n";
    for (my $i=2; $i<2*$order; $i+=2) {     for (my $i=2; $i<2*$order; $i+=2) {
        $output.='document.ggbApplet_'.$id.'.setColor("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",0,170,0);'."\n";         $output.='document.ggbApplet'.$appid.'.setColor("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",0,170,0);'."\n";
    }     }
    for (my $i=1; $i<2*$order; $i+=2) {     for (my $i=1; $i<2*$order; $i+=2) {
        $output.='document.ggbApplet_'.$id.'.setVisible("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",false);'."\n";         $output.='document.ggbApplet'.$appid.'.setVisible("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",false);'."\n";
    }     }
   
    return $output;     return $output;
Line 531  sub answer_spline_script { Line 587  sub answer_spline_script {
   
 sub generate_spline {  sub generate_spline {
    my ($id,$label,$xmin,$xmax,$ymin,$ymax,$fixed)=@_;     my ($id,$label,$xmin,$xmax,$ymin,$ymax,$fixed)=@_;
      my $appid=&appid($id);
    my $result='';     my $result='';
    my $order=$Apache::functionplotresponse::splineorder{$label};     my $order=$Apache::functionplotresponse::splineorder{$label};
    my $x=$Apache::functionplotresponse::splineinitx{$label};     my $x=$Apache::functionplotresponse::splineinitx{$label};
Line 547  sub generate_spline { Line 604  sub generate_spline {
        $x+=$sx/(2.*($order-1));         $x+=$sx/(2.*($order-1));
        push(@coords,$label.'S'.$i);         push(@coords,$label.'S'.$i);
    }     }
    $result.='document.ggbApplet_'.$id.'.evalCommand("Spline'.$order.'['.join(',',@coords).']");'."\n";     $result.='document.ggbApplet'.$appid.'.evalCommand("Spline'.$order.'['.join(',',@coords).']");'."\n";
    return $result;     return $result;
 }  }
   
Line 666  sub start_drawvectorsum { Line 723  sub start_drawvectorsum {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1];      my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1];
       my $internalappid=&appid($internalid);
     my $tailx=&Apache::lonxml::get_param('tailx',$parstack,$safeeval);      my $tailx=&Apache::lonxml::get_param('tailx',$parstack,$safeeval);
     my $taily=&Apache::lonxml::get_param('taily',$parstack,$safeeval);      my $taily=&Apache::lonxml::get_param('taily',$parstack,$safeeval);
     my $showvalue=&Apache::lonxml::get_param('showvalue',$parstack,$safeeval);      my $showvalue=&Apache::lonxml::get_param('showvalue',$parstack,$safeeval);
Line 694  sub start_drawvectorsum { Line 752  sub start_drawvectorsum {
                 my $vectorx=$thisvector.'X';                  my $vectorx=$thisvector.'X';
                 my $vectory=$thisvector.'Y';                  my $vectory=$thisvector.'Y';
                 $result.=(<<ENDADDVEC);                  $result.=(<<ENDADDVEC);
 document.ggbApplet_$internalid.evalCommand("$vectorx=x($thisvector)");  document.ggbApplet$internalappid.evalCommand("$vectorx=x($thisvector)");
 document.ggbApplet_$internalid.evalCommand("$vectory=y($thisvector)");  document.ggbApplet$internalappid.evalCommand("$vectory=y($thisvector)");
 document.ggbApplet_$internalid.evalCommand("Include$thisvector$label=Checkbox[]");  document.ggbApplet$internalappid.evalCommand("Include$thisvector$label=Checkbox[]");
 ENDADDVEC  ENDADDVEC
                 push(@sumx,"If[Include$thisvector$label,$vectorx,0]");                  push(@sumx,"If[Include$thisvector$label,$vectorx,0]");
                 push(@sumy,"If[Include$thisvector$label,$vectory,0]");                  push(@sumy,"If[Include$thisvector$label,$vectory,0]");
             }              }
             $result.="document.ggbApplet_$internalid.evalCommand(".'"'."xTot$label=".join('+',@sumx).'");'."\n";              $result.="document.ggbApplet$internalappid.evalCommand(".'"'."xTot$label=".join('+',@sumx).'");'."\n";
             $result.="document.ggbApplet_$internalid.evalCommand(".'"'."yTot$label=".join('+',@sumy).'");'."\n";              $result.="document.ggbApplet$internalappid.evalCommand(".'"'."yTot$label=".join('+',@sumy).'");'."\n";
             my $show=0;              my $show=0;
             if ($showvalue=~/yes/i) {              if ($showvalue=~/yes/i) {
                 $show=1;                  $show=1;
             }              }
             $result.=(<<ENDMAKEVECTOR);              $result.=(<<ENDMAKEVECTOR);
 document.ggbApplet_$internalid.evalCommand("$label=Vector[($tailx,$taily),($tailx+xTot$label,$taily+yTot$label)]");  document.ggbApplet$internalappid.evalCommand("$label=Vector[($tailx,$taily),($tailx+xTot$label,$taily+yTot$label)]");
 document.ggbApplet_$internalid.setLabelVisible("$label",true);  document.ggbApplet$internalappid.setLabelVisible("$label",true);
 document.ggbApplet_$internalid.setLineThickness("$label",8);  document.ggbApplet$internalappid.setLineThickness("$label",8);
 document.ggbApplet_$internalid.setColor("$label",255,0,0);  document.ggbApplet$internalappid.setColor("$label",255,0,0);
 document.ggbApplet_$internalid.setLabelStyle("$label",VALUE=$show);  document.ggbApplet$internalappid.setLabelStyle("$label",VALUE=$show);
 ENDMAKEVECTOR  ENDMAKEVECTOR
         }          }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
Line 781  sub start_backgroundplot { Line 839  sub start_backgroundplot {
              &Apache::edit::text_arg('Label on Plot:','label',               &Apache::edit::text_arg('Label on Plot:','label',
                                      $token,'8').                                       $token,'8').
              &Apache::edit::text_arg('Color (hex code):','color',               &Apache::edit::text_arg('Color (hex code):','color',
                                      $token,'8').                                       $token,'8', 'colorchooser').
              &Apache::edit::select_arg('Fixed location:','fixed',               &Apache::edit::select_arg('Fixed location:','fixed',
                                   ['yes','no'],$token).                                    ['yes','no'],$token).
              &Apache::edit::end_row();               &Apache::edit::end_row();
Line 858  sub start_functionplotrule { Line 916  sub start_functionplotrule {
         $result=&Apache::edit::tag_start($target,$token,'Function Plot Graph Rule').          $result=&Apache::edit::tag_start($target,$token,'Function Plot Graph Rule').
              &Apache::edit::text_arg('Index/Name:','index',               &Apache::edit::text_arg('Index/Name:','index',
                                      $token,'10').'&nbsp;'.                                       $token,'10').'&nbsp;'.
              &Apache::edit::select_arg(&mt('Function:'),'derivativeorder',               &Apache::edit::select_arg('Function:','derivativeorder',
                                   [['0','Function itself'],                                    [['0','Function itself'],
                                    ['1','First derivative'],                                     ['1','First derivative'],
                                    ['2','Second derivative'],                                     ['2','Second derivative'],
Line 1402  sub start_functionplotresponse { Line 1460  sub start_functionplotresponse {
   my $ylabel=&Apache::lonxml::get_param('ylabel',$parstack,$safeeval);    my $ylabel=&Apache::lonxml::get_param('ylabel',$parstack,$safeeval);
   if ($target eq 'edit') {    if ($target eq 'edit') {
     $result.=&Apache::edit::start_table($token)      $result.=&Apache::edit::start_table($token)
        .'<tr><td><span class="LC_nobreak">'.&mt('Function Plot Question').'</span></td>'         .'<tr><td><span class="LC_nobreak">'.&Apache::loncommon::insert_folding_button().&mt('Function Plot Question').'</span></td>'
        .'<td><span class="LC_nobreak">'.&mt('Delete?').' '         .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
        .&Apache::edit::deletelist($target,$token).'&nbsp;&nbsp;&nbsp;'         .&Apache::edit::deletelist($target,$token).'&nbsp;&nbsp;&nbsp;'
        .&Apache::edit::insertlist($target,$token).'&nbsp;&nbsp;&nbsp;'         .&Apache::edit::insertlist($target,$token).'&nbsp;&nbsp;&nbsp;'
Line 1456  sub start_functionplotresponse { Line 1514  sub start_functionplotresponse {
                      $env{'form.counter'},$Apache::lonxml::curdepth);                       $env{'form.counter'},$Apache::lonxml::curdepth);
       &Apache::lonxml::add_script_result(        &Apache::lonxml::add_script_result(
           &Apache::loncommon::modal_adhoc_window($function_name,700,500,            &Apache::loncommon::modal_adhoc_window($function_name,700,500,
              '<pre>'.$Apache::functionplotresponse::ruleslog.'</pre>',               '<pre style="background-color:#ffffff;">'.$Apache::functionplotresponse::ruleslog.'</pre>',
               &mt('Rules Log'))."<br />");                &mt('Rules Log'))."<br />");
   }    }
   return $result;    return $result;
Line 1989  sub start_functionplotruleset { Line 2047  sub start_functionplotruleset {
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
    if ($target eq 'edit') {     if ($target eq 'edit') {
       return &Apache::edit::start_table($token).        return &Apache::edit::start_table($token).
         '<tr><td><span class="LC_nobreak">'.&mt('Function Plot Rule Set').'</span></td>'          '<tr><td><span class="LC_nobreak">'.&Apache::loncommon::insert_folding_button().&mt('Function Plot Rule Set').'</span></td>'
        .'<td><span class="LC_nobreak">'.&mt('Delete?').' '         .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
        .&Apache::edit::deletelist($target,$token).'&nbsp;&nbsp;&nbsp;'.         .&Apache::edit::deletelist($target,$token).'&nbsp;&nbsp;&nbsp;'.
         &Apache::edit::insertlist($target,$token).'&nbsp;&nbsp;&nbsp;'          &Apache::edit::insertlist($target,$token).'&nbsp;&nbsp;&nbsp;'
Line 2182  sub start_functionplotelements { Line 2240  sub start_functionplotelements {
   
    if ($target eq 'edit') {     if ($target eq 'edit') {
       return &Apache::edit::start_table($token).        return &Apache::edit::start_table($token).
         '<tr><td><span class="LC_nobreak">'.&mt('Function Plot Elements').'</span></td>'          '<tr><td><span class="LC_nobreak">'.&Apache::loncommon::insert_folding_button()
          .&mt('Function Plot Elements').'</span></td>'
        .'<td><span class="LC_nobreak">'.&mt('Delete?').' '         .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
        .&Apache::edit::deletelist($target,$token).'&nbsp;&nbsp;&nbsp;'.         .&Apache::edit::deletelist($target,$token).'&nbsp;&nbsp;&nbsp;'.
         &Apache::edit::insertlist($target,$token).'&nbsp;&nbsp;&nbsp;'          &Apache::edit::insertlist($target,$token).'&nbsp;&nbsp;&nbsp;'

Removed from v.1.97  
changed lines
  Added in v.1.108


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>