--- loncom/homework/functionplotresponse.pm	2011/11/24 13:43:21	1.86
+++ loncom/homework/functionplotresponse.pm	2012/08/16 23:03:01	1.97
@@ -1,7 +1,7 @@
 # LearningOnline Network with CAPA
 # Functionplot responses
 #
-# $Id: functionplotresponse.pm,v 1.86 2011/11/24 13:43:21 www Exp $
+# $Id: functionplotresponse.pm,v 1.97 2012/08/16 23:03:01 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -38,42 +38,103 @@ BEGIN {
   &Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse','backgroundplot','spline',
                                                             'plotobject','plotvector',
                                                             'functionplotvectorrule','functionplotvectorsumrule',
+                                                            'drawvectorsum',
                                                             'functionplotcustomrule',
                                                             'functionplotrule','functionplotruleset',
                                                             'functionplotelements'));
 }
 
 #
+# Use old Java or HTML5/Javascript for GeoGebra? Depends on browser!
+# Return a true value if HTML5 should be used.
+
+sub useHTML5 {
+    return 1;
+}
+
+# Routines to start the applet (Java) or the HTML5/JavaScript
+#
 # There can be a number of applets on a page, each called ggbApplet_$id, 
 # where $id is the "_"-concatenated part and responseid
 #
 
 sub geogebra_startcode {
+    my ($id,$width,$height)=@_;
+    if (&useHTML5()) {
+        return &html5_geogebra_startcode(@_);
+    } else {
+        return &java_geogebra_startcode(@_).
+               &java_geogebra_code_param();
+    }
+}
+
+sub geogebra_endcode {
+    if (&useHTML5()) {
+        return '';
+    } else {
+        return &java_geogebra_endcode();
+    }
+}
+
+sub geogebra_default_parameters {
     my ($id)=@_;
+    if (&useHTML5()) {
+        return '';
+    } else {
+        return &java_geogebra_default_parameters($id);
+    }
+}
+# === Java code
+
+sub java_geogebra_startcode {
+    my ($id,$width,$height)=@_;
+    $width=int(1.*$width);
+    $height=int(1.*$height);
+    unless ($width) { $width=700; }
+    unless ($height) { $height=400; }
     return (<<ENDSTARTCODE);
 <applet name="ggbApplet_$id" code="geogebra.GeoGebraApplet" archive="geogebra.jar"
-         codebase="/adm/geogebra/"  width="722" height="447" MAYSCRIPT>
+         codebase="/adm/geogebra/"  width="$width" height="$height" MAYSCRIPT>
        <param name="java_arguments" value="-Xmx512m -Djnlp.packEnabled=true"/>
 ENDSTARTCODE
 }
 
-sub geogebra_endcode {
+sub java_geogebra_endcode {
     return &Apache::lonhtmlcommon::java_not_enabled()."</applet>\n";
 }
 
+sub java_geogebra_code_param {
+    return '<param name="ggbBase64" value="'.&geogebra_internal_program().'" />';
+}
+
+# === HTML5 code
+
+sub html5_geogebra_startcode {
+    my ($id,$width,$height)=@_;
+    $width=int(1.*$width);
+    $height=int(1.*$height);
+    unless ($width) { $width=700; }
+    unless ($height) { $height=400; }
+    my $code=&geogebra_internal_program();
+    return (<<ENDSTARTCODE);
+<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-ggbbase64="$code"></article>
+ENDSTARTCODE
+}
+
 #
 # This is the internal GeoGebra bytecode which defines the spline functions
 #
-sub geogebra_spline_program {
-    return (<<ENDSPLINEPROGRAM);
-<param name="ggbBase64" value="UEsDBBQACAAIAKNNfz4AAAAAAAAAAAAAAAASAAAAZ2VvZ2VicmFfbWFjcm8ueG1s7Vxtb+pGGv3c/grLH6pk21wSIITeDbcqfq3U217pVquVVrsrBxzCLtjIOAnTX78zYxtCxsDYi/EA50MyjjOM7XPs55iZ8zz3Py2mE+3Fj+bjMOjpNx+udc0PBuFwHIx6+nP8eNXVf/r07f3ID0f+Q+Rpj2E09eKe3mY9F/PxxyD8zZv685k38L8Onvyp92s48GI+2lMczz42Gq+vrx+yz38Io1FjNIo/LOZD+vnpJJj39HTjIx1u7UOvLd69eX190/j751+T4a/GwTz2goGva/S8pt4gCrXBdMhOoqd/nU3Ggd/UtTgMJzm7XH8yW+76x5ebH7Sv9OdLk7bNf+raeBAG9njis1OaP4WvvwR/0A/1vainx9Gzr2cH/CWYPcead93Tf9Y174Y2Hm2bPb1PmxZtPL2R9f39OV52fkl799PeL7wbPeicDj9goGnxOE6O7z3HT2HEtoZezPbQnv7En/pBrMVkRvfMwnEQ69rEe/An7Ew+ffvNPTtrLXz4jz+I03PO/v/oTeY+O9439/T/RjgJI40OT1kc8d8P/Lc3mT15dIuyy7tOPOJH2os3Yf9N99DhPodDf22vF4ynnHVtHvszNsANhXDm+0N6U+npCdPxZ3RAfmu9OZ1BGEbDubZIDquR9Ob6M7kdeRd+qV/Hf6YHbb3dG5PJ23O5b6Qo7cCrfwJ4NQ+IF73F/2/Amre3qkDWOcQtdhqQtfcN2WIW+XMmOBkO3sO/F1R3FrNk82JxqfW0i6b2F23xr4vWpXaltZLt5qX2vXZzyf64+Jlts/0XWafmm06LtJNH9/OeF1er8b5fjZd06wtjvf0nG6N/qWsNge/H54CHbX3tSgTSE1izPvwWqCqwMGVLwI+fxoP/BhRoehO94ZptuOPh0GdyL0UNWVFDZKghMtQQOWrINmpIUWrIEVMzCKdTLxhqAX+rMZ6jF9/wotifj72AX9Z4+VLCn6H4MnnZ4KzxP+gbR5y8n7CLaKfHoJf65g2lnxw2PZgA6oAddrA87FIbSoopD26VQdspB+3ncRSF0TtI+Qsee3UTIfO+82bh/K/bgXuvpelndtyOVevDKsZfZbrY3FOQl8C0n2LaFzDtl8C0rxym15VC+jd6bTm3aQpC9q1EuFtftmP6koy6vFFfan6DEd9Csnfd1VCFw2o6bPKhOftNI9syqPEO9CtmFH9hjCTat/6UF+Kkv8ZJX+SkX4yTPjhJOOlv4KTx9gs1+5t/D980WdASJwta4mRB691kAW1btG3td9KAq7JBm1vaSM8hJJ820k9jTgFzCphTwJyC2pBhTgFzCphTqJsazClUNqewLYYbJ/Ca8P7Vv0rNM05D8zqVa97DYKl5bFNO88RgmKN5aVDcpXnGNs0z2BiGXGDlV3K8gTWXGrKiRlLzJKghctSQbdSQotSciebxZyjTPM6arObRb+NlNK9fUhkU0TzMo2Me/ejm0XMhNVJIDQFSowSkhnKQVnuXYmkCSxPnzcmmpQkJTow1TgyRE6MYJwY4STgx9rJc1BaXi9riclF7w3IRbdu0bVe6bKR5nZ5u0uaONqVXkZLRzHQ0rCrlv5NgVQmrSlhVUgUyrCphVQmrSnVTg1WlymbYsKqEVaV3kGFVCatKWFWqmxqsKtWieeYJaF7ngJpnnobmdSvXvMFwqXlsU07zxGCYo3lpUNyleeY2zTPZGKZcYOVXcryBNZcasqJGUvMkqCFy1JBt1JCi1JyJ5vFnKNM8zpqs5hlmKc0zSiqDIpoHJwWcFHBSwEmRC6mZQmoKkJolIDWVg7RdKaQwp8Ccct6cwJyiHiebzCkSnJhrnJgiJ2YxTkxwknBi7sUwdCsahm5Fw9DtDsMQbW9pe3tI45DmdXu6RZsfabM3H1EyupWODl9R/hs6fEXwFcFXpApk8BXBVwRfUd3UwFdUFFr4iuArKgsZfEXwFcFXVDc18BXVonnwFRXTPPiK4Cs6rsAKX5Gy1MBXVIvmWSeged0Dap51Gpp3c1256A39peixTTnRE6NhjuilUXGX6FnbRM9iY1hykZVfyfFG1lxqyIoaSdGToIbIUUO2UUOKUnMmosefoUz0OGuyomdapUTPLCkNiogezLQw01aAKcy0MNOeu5k2F1IrhdQSILVKQGopB2mnUkjhT4Y/+bw5gT9ZPU7gT1aPk03+ZAlOrDVOLJETqxgnFjhJOLH24hnviJ7xjugZ70h6xmnboW2nRu84HYOOZbOWDmZXZiZPjmdnx4O7PP8rK9zlcJfDXa4KZHCXw10Od3nd1MBdXhRauMvhLi8LGdzlcJfDXV43NXCX16J5cJcX0zy4y+EuP67ACne5stTAXV6L5sFdXkzz4C6Hu/zIIivc5cpSA3d5LaJnn4Do3Rxy0dg+EdXb+yqoEFr9x6XqsU051RPDYY7qpWFxl+rZ21TPZmPYcqGVX8nxhtZcasiKGknVk6CGyFFDtlFDilJzJqrHn6FM9Thrsqpn2aVUzyqpDYqoHnKqkFNVAabIqUJOFXKqkFN1CEjtFFJbgNQuAamtHKTdSiFFmlrpV1SkqZ0EJ0hTU48TpKmpxwnS1NTjZFOamgQn9hontsiJXYwTG5wknNh7SR28E1MH78TUwbuCqYO0vaPtnUophHSDjuawlg7nHC6nMD0DJzsDZBnmT+IgyxBZhsgyVAUyZBkiyxBZhnVTgyzDotAiyxBZhmUhQ5YhsgyRZVg3NcgyrEXzkGVYTPOQZYgsw+MKrMgyVJYaZBnWonnIMiymecgyRJbhkUVWZBkqSw2yDGsRPWQZFlQ9ZBkiy/DIQiuyDJWlBlmGtaiecwqqd0jrj3Miqle9keVxtFQ9timnemI4zFG9NCzuUj1nm+o5bAxHLrTyKzne0JpLDVlRI6l6EtQQOWrINmpIUWrORPX4M5SpHmdNVvVsp5Tq2SW1QRHVQ249cusrwBS59citR249cuuRW696bn0upE4KqSNA6pSA1FEO0ptq9Qn1Ckq/9qNewUlwgnoF6nGCegXqcYJ6BepxgnoF6nGyqV6BBCfOGieOyIlTjBMHnCScOBs4KVZDoivWkOiKNSS6JWtI0LZL267StSToBh3PZS0d0K2zuER6Tm52Tig3kT+viXITKDeBchOqQIZyEyg3gXITdVODchNFoUW5CZSbKAsZyk2g3ATKTdRNDcpN1KJ5KDdRTPNQbkJS81BuQpHAinITylKDchO1aB7KTRTTPJSbkBU9lJtQJLKi3ISy1KDcRC2ih3ITBVUP5SZkVQ/lJhQJrSg3oSw1KDdRi+qh3ERB1UO5CVnVQ7kJRUIryk0oSw3KTdSieu4pqN4hnSzuiahe9VaW0dNS9dimnOqJ4TBH9dKwuEv13G2q57IxXLnQyq/keENrLjVkRY2k6klQQ+SoIduoIUWpORPV489QpnqcNVnVc9xSqueU1AZFVA9FllBkqQJMUWQJRZZQZAlFllBkCUWWzq/IUi6mboqpK2DqlsDUVQ/TagUKhatKf5VC4aqT4ASFq9TjBIWr1OMEhavU4wSFq9TjBIWr1ONkU+EqCU7cNU5ckRO3GCcuOEk4cTdwsrGYWGPkhyP/IfI+/Q9QSwcIG2/gjX8KAABXRAEAUEsDBBQACAAIAKRNfz4AAAAAAAAAAAAAAAAWAAAAZ2VvZ2VicmFfamF2YXNjcmlwdC5qc0srzUsuyczPU0hPT/LP88zLLNHQVKiu5QIAUEsHCEXM3l0aAAAAGAAAAFBLAwQUAAgACACkTX8+AAAAAAAAAAAAAAAADAAAAGdlb2dlYnJhLnhtbO0YXW/bNvA5/RUHPae2+CXJgZ2iLYZ1Q1YMdVcMe5MlRiYii5pE2XHRH78jKdly03YaNuxlA+Icj7wv3h3vSC1fPO5K2MumVbpaBWQWBiCrTOeqKlZBZ+6fJ8GL22fLQupCbpoU7nWzS80q4JbysVU3lX6b7mRbp5lcZ1u5S+90lhonbWtMfTOfHw6H2cA/000xL4rN7LHNkX9XVu0q6Ac3KO6C6cAcOQ1DMv/1pzsv/rmqWpNWmQzA2tWp22dXy4Oqcn2Ag8rNdhUklAawlarYoqEiEQHMb6+WNW6ylplRe9ki5wgFla8Cs6sDK6pOK7t+5UdQnnYTQK72KpfNKghnnC44D1my6GEcgG6UrExPTKxOlDYfxC33Sh68XDtyKnkARutyk6LIKApgr1q1KeUquE/LFvenqvsGfXvCW3MspaPuJ87GkWvU2KqPSIzuCsA7BC29Dq956H7eopF6MtJomu4vKhzUJWE0TR39Wxtkgz4m2KU++hV9yci7BFMIPgEC6gED+OQGwuO8RyOPxj2a2H+Lbxju/TbFT0SMwiLCa/fnfk8D861c+Oc0LudDTi57R0G7tbR9Mhi5w8MZAluAWDiHgEA3CiALiNBDQIEI4IgncA0xMDvHgUECC5wgDDhHKOwq9x6NQBCIOETe7cA4CAaEIAXlADQESu2YAGVIIQQIZImtNGoFsAh4hBhLgKNVIdIw5MEh6qXACDDLR4XliCFKgEYQWZEEldrgCgpRCBGx0ngInAB3GmOgCTDLF/WxtynjAPWAecA9EB5EHsTQu1RVdWcu3Jjt8mFodH2KF1JjcTjXIF8sLkrU1bJMN7LESry20QbYp6U9CI7VFb6l7LJS5SqtPmAkLYeNPJzqoD2aQx3klATOxEzrJl8fWwwvPP4mG40yF3QWsZiEjBHOxQJP2NGv4OHCFRJhjWMxE7HAmtVmqU1MnszoQsQhETxMOLIj01eXnGa5X0tjcD8tpI+yHdxSNCofj39oX+kyP3mq1qoyr9PadI1rSmhcY7f0sipK6Tzjch6bQ/aw0Y9rn/vMy3p/rBELvf5N8VqXugE8NVRgVyh6uPHQ0VjDTlShowkdRS/DCj2tkwV1FA5uPHRUGDRvWr9RMuyShIMa1bqzjsLH2eIibntNVylzNyBGZQ/nnVr6t91ug8kysFlxrxvd2vNqG3OtW2Wz6CXOD4681Ev+Tb3L+WeJ+jRxbSnywsENbe55ky9SmtAkPOd0HIdfzWlKhLWoz2PmsT4/hTP2OMb+PEH7dPw/Q/8bGdrWjUzzdiul+WJxHaVh77ERB/q/21WD+3qOWHyLjkykoxPp2EQ6PpFOTKSLJtLFE+mSiXSLqX6eHJCpESFTQ0KmxoRMDQqZGhUyNSxkalzI1MCQqZGhUyNDJ5+VqZGhUyNDp0aGfiEysrR3O10BbNdZo8vSVYf9aJw5AW7YuPdNX6zTo8Zrpatv349uSxZ/49lf2bfAefbDF2dfodBWNj/jm7Q8P7pwwRv+BvchLxjeoXw3Cad6Wpb6sMZLqkrL73Jl9PkJ4pbe40vivapPtRXk7x0O3iFQjcwvSv3Ic71lALm8T7vS9OpcZX5SiZcPssEd+MZfYb/udNf62/FIeo427hD1C33bS21L/gU7iJ/NZdHIofGU7guFb4pu9eJy8dn0cj4YsWyzRtX21oA9qiq6tMBmVHVliQ0XX2UPF5u2Bre4NZ8HRhnbuda17cbwFp9//ZcYdGZntta3P9qPK3CX4oI5BpCnBhkCq38syb0I+k8st38AUEsHCA04kj02BQAA1BEAAFBLAQIUABQACAAIAKNNfz4bb+CNfwoAAFdEAQASAAAAAAAAAAAAAAAAAAAAAABnZW9nZWJyYV9tYWNyby54bWxQSwECFAAUAAgACACkTX8+RczeXRoAAAAYAAAAFgAAAAAAAAAAAAAAAAC/CgAAZ2VvZ2VicmFfamF2YXNjcmlwdC5qc1BLAQIUABQACAAIAKRNfz4NOJI9NgUAANQRAAAMAAAAAAAAAAAAAAAAAB0LAABnZW9nZWJyYS54bWxQSwUGAAAAAAMAAwC+AAAAjRAAAAAA"/>
-ENDSPLINEPROGRAM
+sub geogebra_internal_program {
+    return
+'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';
 }
 
 #
 # The standard set of parameters inside <applet>
 #
-sub geogebra_default_parameters {
+sub java_geogebra_default_parameters {
    my ($id)=@_;
    return(<<ENDDEFAULTPARAMETERS);
         <param name="image" value="/adm/lonIcons/lonanim.gif"  />
@@ -115,7 +176,13 @@ sub init_script {
       $script.="if (".join(' && ',map { "loaded_$_" } (@Apache::functionplotresponse::callscripts)).
                ") { setTimeout('ggbInitAll()',200) }";
       my $calls=join("\n",map { "ggbInit_$_();" } (@Apache::functionplotresponse::callscripts)); 
+      my $html5init='';
+      if (&useHTML5()) {
+          $html5init=
+           '<script type="text/javascript" language="javascript" src="/adm/geogebra/html5/web/test42/web/web.nocache.js"></script>';
+      }
       return (<<ENDGGBINIT);
+$html5init
 <script type="text/javascript">
 // <![CDATA[
 // Function that each applet will call when loaded
@@ -406,7 +473,7 @@ sub plotobject_script {
 #
 
 sub plotvector_script {
-   my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax)=@_;
+   my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax,$fixed)=@_;
    unless ($label) {
       $Apache::functionplotresponse::counter++;
       $label='V'.$Apache::functionplotresponse::counter;
@@ -417,8 +484,8 @@ sub plotvector_script {
    my $pointx=2.*($xmax-$xmin)+$xmax;
    my $anglelabel=$label.'Angle';
    return 
-       &new_point_coordinate($id,$startlabel,$xs,$ys,0).
-       &new_point_coordinate($id,$endlabel,$xe,$ye,0).
+       &new_point_coordinate($id,$startlabel,$xs,$ys,$fixed).
+       &new_point_coordinate($id,$endlabel,$xe,$ye,$fixed).
        (<<ENDVECTOR);
 document.ggbApplet_$id.evalCommand("$label=Vector[$startlabel,$endlabel]");
 document.ggbApplet_$id.setLabelVisible("$label",true);
@@ -546,13 +613,19 @@ sub start_plotvector {
    $label=~s/\W//gs;
    $label=ucfirst($label);
    unless ($label) { $label="NewVector"; }
+   if ($Apache::functionplotresponse::vectorlabels{$label}) {
+       &Apache::lonxml::warning(&mt('Vector labels must be unique: [_1]',$label));
+   }
+   $Apache::functionplotresponse::vectorlabels{$label}=1;
    if ($target eq 'web') {
       my ($xmin,$xmax,$ymin,$ymax)=&boundaries($parstack,$safeeval,-3);
       unless (defined($tailx)) { $tailx=$xmin; }
       unless (defined($taily)) { $taily=$ymin; }
       unless (defined($tipx)) { $tipx=$xmin; }
       unless (defined($tipy)) { $tipy=$ymin; }
-      $result.=&plotvector_script($internalid,$label,$tailx,$taily,$tipx,$tipy,$xmin,$xmax);
+      my $fixed=0;
+      if ((&Apache::response::show_answer()) || (&Apache::response::check_status()>=2)) { $fixed=1; }
+      $result.=&plotvector_script($internalid,$label,$tailx,$taily,$tipx,$tipy,$xmin,$xmax,$fixed);
    } elsif ($target eq 'edit') {
         $result=&Apache::edit::tag_start($target,$token,'Plot Vector').
              &Apache::edit::text_arg('Label on Plot:','label',
@@ -585,6 +658,95 @@ sub end_plotvector {
 }
 
 
+#
+# Vector sum - have GeoGebra draw a sum of specified vectors to help students draw
+#
+
+sub start_drawvectorsum {
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+    my $result='';
+    my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1];
+    my $tailx=&Apache::lonxml::get_param('tailx',$parstack,$safeeval);
+    my $taily=&Apache::lonxml::get_param('taily',$parstack,$safeeval);
+    my $showvalue=&Apache::lonxml::get_param('showvalue',$parstack,$safeeval);
+    my $vectorlist=&Apache::lonxml::get_param('vectorlist',$parstack,$safeeval);
+    my $label=&Apache::lonxml::get_param('label',$parstack,$safeeval);
+    $label=~s/\W//gs;
+    $label=ucfirst($label);
+    unless ($label) { $label="NewVector"; }
+    if ($target eq 'web') {
+        my ($xmin,$xmax,$ymin,$ymax)=&boundaries($parstack,$safeeval,-3);
+        unless (defined($tailx)) { $tailx=$xmin; }
+        unless (defined($taily)) { $taily=$ymin; }
+        unless (defined($vectorlist)) { $vectorlist=''; }
+        my @vectors=split(/\,/,$vectorlist);
+        if ($#vectors>0) {
+            my @sumx=();
+            my @sumy=();
+            foreach my $thisvector (@vectors) {
+                $thisvector=~s/\W//gs;
+                $thisvector=ucfirst($thisvector);
+                unless ($thisvector) { next; }
+                unless ($Apache::functionplotresponse::vectorlabels{$thisvector}) {
+                    &Apache::lonxml::warning(&mt('Vectors must be defined before using them for drawing vector sums: [_1]',$thisvector));
+                    next;
+                }
+                my $vectorx=$thisvector.'X';
+                my $vectory=$thisvector.'Y';
+                $result.=(<<ENDADDVEC);
+document.ggbApplet_$internalid.evalCommand("$vectorx=x($thisvector)");
+document.ggbApplet_$internalid.evalCommand("$vectory=y($thisvector)");
+document.ggbApplet_$internalid.evalCommand("Include$thisvector$label=Checkbox[]");
+ENDADDVEC
+                push(@sumx,"If[Include$thisvector$label,$vectorx,0]");
+                push(@sumy,"If[Include$thisvector$label,$vectory,0]");
+            }
+            $result.="document.ggbApplet_$internalid.evalCommand(".'"'."xTot$label=".join('+',@sumx).'");'."\n";
+            $result.="document.ggbApplet_$internalid.evalCommand(".'"'."yTot$label=".join('+',@sumy).'");'."\n";
+            my $show=0;
+            if ($showvalue=~/yes/i) {
+                $show=1;
+            }
+            $result.=(<<ENDMAKEVECTOR);
+document.ggbApplet_$internalid.evalCommand("$label=Vector[($tailx,$taily),($tailx+xTot$label,$taily+yTot$label)]");
+document.ggbApplet_$internalid.setLabelVisible("$label",true);
+document.ggbApplet_$internalid.setLineThickness("$label",8);
+document.ggbApplet_$internalid.setColor("$label",255,0,0);
+document.ggbApplet_$internalid.setLabelStyle("$label",VALUE=$show);
+ENDMAKEVECTOR
+        }
+    } elsif ($target eq 'edit') {
+        $result=&Apache::edit::tag_start($target,$token,'Draw Vector Sum').
+             &Apache::edit::text_arg('Label on Plot:','label',
+                                     $token,'16').
+             &Apache::edit::text_arg('Tail x:','tailx',
+                                     $token,'8').
+             &Apache::edit::text_arg('Tail y:','taily',
+                                     $token,'8').
+             &Apache::edit::select_arg('Show Value:','showvalue',
+                                  ['yes','no'],$token).'<br />'.
+             &Apache::edit::text_arg('Vector List:','vectorlist',
+                                     $token,'40').
+             &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        $env{'form.'.&Apache::edit::html_element_name('label')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('label')});
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'label','tailx','taily','showvalue','vectorlist');
+        if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); }
+    }
+    return $result;
+}
+
+
+sub end_drawvectorsum {
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+    my $result='';
+    if ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
+    }
+    return $result;
+}
+
+
 
 #
 # <backgroundplot function="..." fixed="yes/no" />
@@ -783,39 +945,17 @@ sub start_functionplotvectorrule {
       $vector=~s/\W//gs;
       $vector=ucfirst($vector);
 
-      my $attachpoint=&Apache::lonxml::get_param('attachpoint',$parstack,$safeeval);
-      $attachpoint=~s/\W//gs;
-      $attachpoint=ucfirst($attachpoint);
-
-      my $notattachpoint=&Apache::lonxml::get_param('notattachpoint',$parstack,$safeeval);
-      $notattachpoint=~s/\W//gs;
-      $notattachpoint=ucfirst($notattachpoint);
-
-      my $tailpoint=&Apache::lonxml::get_param('tailpoint',$parstack,$safeeval);
-      $tailpoint=~s/\W//gs;
-      $tailpoint=ucfirst($tailpoint);
-      my $tippoint=&Apache::lonxml::get_param('tippoint',$parstack,$safeeval);
-      $tippoint=~s/\W//gs;
-      $tippoint=ucfirst($tippoint);
-
-      my $nottailpoint=&Apache::lonxml::get_param('nottailpoint',$parstack,$safeeval);
-      $nottailpoint=~s/\W//gs;
-      $nottailpoint=ucfirst($nottailpoint);
-      my $nottippoint=&Apache::lonxml::get_param('nottippoint',$parstack,$safeeval);
-      $nottippoint=~s/\W//gs;
-      $nottippoint=ucfirst($nottippoint);
-
       push(@Apache::functionplotresponse::functionplotvectorrules,join(':',(
            $label,
            'vector',
            $internalid,
            $vector,
-           $attachpoint,
-           $notattachpoint,
-           $tailpoint,
-           $tippoint,
-           $nottailpoint,
-           $nottippoint,
+           &Apache::lonxml::get_param('attachpoint',$parstack,$safeeval),
+           &Apache::lonxml::get_param('notattachpoint',$parstack,$safeeval),
+           &Apache::lonxml::get_param('tailpoint',$parstack,$safeeval),
+           &Apache::lonxml::get_param('tippoint',$parstack,$safeeval),
+           &Apache::lonxml::get_param('nottailpoint',$parstack,$safeeval),
+           &Apache::lonxml::get_param('nottippoint',$parstack,$safeeval),
            &Apache::lonxml::get_param('length',$parstack,$safeeval),
            &Apache::lonxml::get_param('angle',$parstack,$safeeval),
            &Apache::lonxml::get_param('lengtherror',$parstack,$safeeval),
@@ -850,12 +990,6 @@ sub start_functionplotvectorrule {
              &Apache::edit::end_row();
   } elsif ($target eq 'modified') {
     $env{'form.'.&Apache::edit::html_element_name('vector')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('vector')});
-    $env{'form.'.&Apache::edit::html_element_name('attachpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('attachpoint')});
-    $env{'form.'.&Apache::edit::html_element_name('notattachpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('notattachpoint')});
-    $env{'form.'.&Apache::edit::html_element_name('tailpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('tailpoint')});
-    $env{'form.'.&Apache::edit::html_element_name('tippoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('tippoint')});
-    $env{'form.'.&Apache::edit::html_element_name('nottailpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('nottailpoint')});
-    $env{'form.'.&Apache::edit::html_element_name('nottippoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('nottippoint')});
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                                                  $safeeval,'index','vector','attachpoint','notattachpoint',
                                                            'tailpoint','tippoint','nottailpoint','nottipoint',
@@ -1240,6 +1374,8 @@ sub start_functionplotresponse {
   undef %Apache::functionplotresponse::previous;
   $Apache::functionplotresponse::inputfields='';
   $Apache::functionplotresponse::counter=0;
+# Remember vectors
+  undef %Apache::functionplotresponse::vectorlabels;
 # Remember rules
   undef @Apache::functionplotresponse::functionplotrules;
   undef @Apache::functionplotresponse::functionplotvectorrules;
@@ -1276,7 +1412,11 @@ sub start_functionplotresponse {
        .&Apache::edit::end_row()
        .&Apache::edit::start_spanning_row()
        ."\n";
-    $result.=&Apache::edit::text_arg('Label x-axis:','xlabel',
+    $result.=&Apache::edit::text_arg('Width (pixels):','width',
+                                     $token,'6').'&nbsp;'.
+             &Apache::edit::text_arg('Height (pixels):','height',
+                                     $token,'6').'<br />'.
+             &Apache::edit::text_arg('Label x-axis:','xlabel',
                                      $token,'6').'&nbsp;'.
              &Apache::edit::text_arg('Minimum x-value:','xmin',
                                      $token,'4').'&nbsp;'.
@@ -1299,7 +1439,7 @@ sub start_functionplotresponse {
              &Apache::edit::end_row().&Apache::edit::start_spanning_row();
   } elsif ($target eq 'modified') {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,
-                                                 $safeeval,'xlabel','xmin','xmax','ylabel','ymin','ymax',
+                                                 $safeeval,'width','height','xlabel','xmin','xmax','ylabel','ymin','ymax',
                                                            'xaxisvisible','yaxisvisible','gridvisible','answerdisplay');
     if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
 
@@ -1309,27 +1449,16 @@ sub start_functionplotresponse {
             ($env{'form.answer_output_mode'} ne 'tex') &&
             ($Apache::lonhomework::viewgrades == 'F')) {
       my (undef,undef,$udom,$uname)=&Apache::lonnet::whichuser();
-      my $windowopen=&Apache::lonhtmlcommon::javascript_docopen();
-      my $start_page = &Apache::loncommon::start_page('Rules Log', undef,
-                                               {'only_body' => 1,
-                                                'bgcolor'   => '#FFFFFF',
-                                                'js_ready'  => 1,});
-      my $end_page = &Apache::loncommon::end_page({'js_ready' => 1,});
       $uname =~s/\W//g;
       $udom  =~s/\W//g;
       my $function_name =
                 join('_','LONCAPA_scriptvars',$uname,$udom,
                      $env{'form.counter'},$Apache::lonxml::curdepth);
-      my $rules_var ="<script type=\"text/javascript\">
-// <![CDATA[
-    function $function_name() {newWindow=open('','new_W','width=500,height=500,scrollbars=1,resizable=yes');newWindow.$windowopen;newWindow.document.writeln('$start_page<pre>".
-    $Apache::functionplotresponse::ruleslog.
-    "<\\/pre>$end_page');newWindow.document.close();newWindow.focus()}
-// ]]>
-</script><a href=\"javascript:$function_name();void(0);\">".&mt('Rules Log')."</a><br />";
-            &Apache::lonxml::add_script_result($rules_var);
-        }
-
+      &Apache::lonxml::add_script_result(
+          &Apache::loncommon::modal_adhoc_window($function_name,700,500,
+             '<pre>'.$Apache::functionplotresponse::ruleslog.'</pre>',
+              &mt('Rules Log'))."<br />");
+  }
   return $result;
 }
 
@@ -1470,16 +1599,27 @@ sub objectcoords {
 }
 
 sub attached {
-   my ($id,$vector,$object,$xmin,$xmax,$ymin,$ymax)=@_;
+   my ($id,$vector,$objects,$xmin,$xmax,$ymin,$ymax)=@_;
    my ($xs,$xe,$ys,$ye)=&vectorcoords($id,$vector);
-   my ($xo,$yo)=&objectcoords($id,$object);
    my $tolx=($xmax-$xmin)/100.;
    my $toly=($ymax-$ymin)/100.;
    my $tail=0;
    my $tip=0;
-   &addlog("Proximity $vector ($xs,$ys)-($xe,$ye) to $object ($xo,$yo)");
-   if ((abs($xs-$xo)<$tolx) && (abs($ys-$yo)<$toly)) { $tail=1; }
-   if ((abs($xe-$xo)<$tolx) && (abs($ye-$yo)<$toly)) { $tip=1; }
+   foreach my $obj (split(/\s*\,\s*/,$objects)) {
+      $obj=~s/\W//g;
+      unless ($obj) { next; }
+      $obj=ucfirst($obj);
+      my ($xo,$yo)=&objectcoords($id,$obj);
+      &addlog("Proximity $vector ($xs,$ys)-($xe,$ye) to $obj ($xo,$yo)");
+      if ((abs($xs-$xo)<$tolx) && (abs($ys-$yo)<$toly)) {
+         $tail=1;
+         &addlog("Attached tail: $obj"); 
+      }
+      if ((abs($xe-$xo)<$tolx) && (abs($ye-$yo)<$toly)) { 
+         $tip=1;
+         &addlog("Attached tip: $obj"); 
+      }
+   }
    &addlog("Result tail:$tail tip:$tip");
    return($tail,$tip);
 }
@@ -1689,7 +1829,7 @@ sub functionplotrulecheck {
 #
 # Evaluate the value
 #
-   if ($value=~/\D/) {
+   if (($value=~/\D/) && ($value ne 'undef')) {
       $Apache::functionplotresponse::fpr_xmin=$xmin;
       $Apache::functionplotresponse::fpr_xmax=$xmax;
       $value=&Apache::run::run($value,$safeeval);
@@ -2003,9 +2143,9 @@ sub end_functionplotelements {
 # generate the input fields
      $result.=$Apache::functionplotresponse::inputfields;
 # actually start the <applet>-tag
-     $result.=&geogebra_startcode($internalid);
-# load the spline bytecode
-     $result.=&geogebra_spline_program();
+     $result.=&geogebra_startcode($internalid,
+                                  &Apache::lonxml::get_param('width',$parstack,$safeeval,-2),
+                                  &Apache::lonxml::get_param('height',$parstack,$safeeval,-2));
 # set default parameters
      $result.=&geogebra_default_parameters($internalid);
 # close the <applet>-tag