--- loncom/homework/edit.pm	2001/07/10 22:06:42	1.17
+++ loncom/homework/edit.pm	2001/12/21 16:58:25	1.26
@@ -1,5 +1,30 @@
 # The LearningOnline Network with CAPA 
 # edit mode helpers
+#
+# $Id: edit.pm,v 1.26 2001/12/21 16:58:25 harris41 Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
 # 3/20 Guy
 package Apache::edit; 
 
@@ -21,7 +46,10 @@ sub tag_start {
   my $result='';
   if ($target eq "edit") {
     my $tag=$token->[1];
-    if (!$description) { $description="<$tag>"; }
+    if (!$description) {
+      $description=&Apache::lonxml::description($token);
+      if (!$description) { $description="<$tag>"; }
+    }
     $result.= &start_table($token)."<tr><td>$description</td>
 <td>Delete".
   &deletelist($target,$token)
@@ -30,6 +58,9 @@ sub tag_start {
   &insertlist($target,$token).
     "</td>
 </tr><tr><td colspan=\"3\">\n";
+#<td>".
+#  &movebuttons($target,$token).
+#    "</tr><tr><td colspan=\"3\">\n";
   }
   return $result;
 }
@@ -54,7 +85,7 @@ sub start_table {
   my $tag = $token->[1];
   my $tagnum;
   foreach my $namespace (reverse @Apache::lonxml::namespace) {
-    my $testtag=$Apache::lonxml::namespace['-1'].'::'.$tag;
+    my $testtag=$namespace.'::'.$tag;
     $tagnum=$Apache::lonxml::insertlist{"$testtag.num"};
     if (defined($tagnum)) { last; }
   }
@@ -74,6 +105,15 @@ sub end_table {
   return $result;
 }
 
+sub movebuttons {
+  my ($target,$token) = @_;
+  my $result='<input type="submit" name="moveup.'.
+    $Apache::lonxml::curdepth.'" value="Move Up" />';
+  $result.='<input type="submit" name="movedown.'.
+    $Apache::lonxml::curdepth.'" value="Move Down" />';
+  return $result;
+}
+
 sub deletelist {
   my ($target,$token) = @_;
   my $result = "<select name=\"delete_$Apache::lonxml::curdepth\">
@@ -174,6 +214,15 @@ sub insert_responseparam {
     <responseparam />';
 }
 
+sub insert_formularesponse {
+  return '
+<formularesponse answer="" samples="">
+    <textline />
+    <hintgroup>
+    </hintgroup>
+</formularesponse>';
+}
+
 sub insert_numericalresponse {
   return '
 <numericalresponse answer="">
@@ -183,6 +232,15 @@ sub insert_numericalresponse {
 </numericalresponse>';
 }
 
+sub insert_stringresponse {
+  return '
+<stringresponse answer="" type="">
+    <textline />
+    <hintgroup>
+    </hintgroup>
+</stringresponse>';
+}
+
 sub insert_optionresponse {
   return '
 <optionresponse max="10">
@@ -193,22 +251,61 @@ sub insert_optionresponse {
 </optionresponse>';
 }
 
-sub editfield {
-  my ($tag,$data,$description,$minwidth,$minheight)=@_;
-  
+sub insert_radiobuttonresponse {
+  return '
+<radiobuttonresponse max="10">
+    <foilgroup>
+    </foilgroup>
+    <hintgroup>
+    </hintgroup>
+</radiobuttonresponse>';
+}
+
+sub insert_displayduedate { return '<displayduedate />'; }
+sub insert_displaytitle   { return '<displaytitle />'; }
+sub insert_hintpart {
+  return '
+<hintpart on="default">
+    <startouttext/>
+    <endouttext />
+</hintpart>';
+}
+
+sub insert_numericalhint {
+  return '
+<numericalhint>
+</numericalhint>';
+}
+
+sub insert_startouttext {
+  return "<startouttext />\n<endouttext />";
+}
+
+sub insert_script {
+  return "\n<script type=\"loncapa/perl\">\n</script>";
+}
+
+sub textarea_sizes {
+  my ($data)=@_;
   my $count=0;
   my $maxlength=-1;
-  map { $count++;
-	if (length($_) > $maxlength) { $maxlength = length ($_); }
-      } split ("\n", $data);
-  if ($maxlength > 80) { $maxlength = 80; }
-  if ($maxlength < $minwidth) { $maxlength = $minwidth; }
-  if ( $count < $minheight) { $count = $minheight; }
-  if ($description) {
-    $description="<br />".$description."<br />";
-  }
-  return "$description\n&nbsp;&nbsp;&nbsp;<textarea rows=\"$count\" cols=\"$maxlength\" name=homework_edit_".$Apache::lonxml::curdepth.">$data</textarea>\n";
-#  return "<br />\n&lt;$tag&gt;<br />\n&nbsp;&nbsp;&nbsp;<textarea rows=\"$count\" cols=\"$maxlength\" name=homework_edit_".$Apache::lonxml::curdepth.">$data</textarea><br />\n&lt;/$tag&gt;<br />\n";
+  foreach (split ("\n", $$data)) { $count++;
+	if (length($_) > $maxlength) { $maxlength = length($_); }
+      }
+  my $rows = $count;
+  my $cols = $maxlength;
+  return ($rows,$cols);
+}
+
+sub editfield {
+  my ($tag,$data,$description,$minwidth,$minheight)=@_;
+
+  my ($rows,$cols)=&textarea_sizes(\$data);
+  if ($cols > 80) { $cols = 80; }
+  if ($cols < $minwidth ) { $cols = $minwidth; }
+  if ($rows < $minheight) { $rows = $minheight; }
+  if ($description) { $description="<br />".$description."<br />"; }
+  return "$description\n&nbsp;&nbsp;&nbsp;<textarea rows=\"$rows\" cols=\"$cols\" name=\"homework_edit_".$Apache::lonxml::curdepth."\">$data</textarea>\n";
 }
 
 sub modifiedfield {
@@ -230,21 +327,14 @@ sub modifiedfield {
   return $result;
 }
 
-sub insert_startouttext {
-  return "<startouttext />\n<endouttext />";
-}
-
-sub insert_script {
-  return "\n<script type=\"loncapa/perl\">\n</script>";
-}
-
 # Returns a 1 if the token has been modified and you should rebuild the tag
 # side-effects, will modify the $token if new values are found
 sub get_new_args {
   my ($token,$parstack,$safeeval,@args)=@_;
   my $rebuild=0;
   foreach my $arg (@args) {
-    my $value=&Apache::lonxml::get_param($arg,$parstack,$safeeval);
+    #just want the string that it was set to
+    my $value=$token->[2]->{$arg};
     my $newvalue=$ENV{"form.$Apache::lonxml::curdepth.$arg"};
     &Apache::lonxml::debug(" for:$arg: cur is :$value: new is :$newvalue:");
     if ($value ne $newvalue) {
@@ -262,6 +352,7 @@ sub rebuild_tag {
   if ($token->[0] eq 'S') {
     $result = '<'.$token->[1];
     while (my ($key,$val)= each(%{$token->[2]})) {
+      $val=~s:^\s+|\s+$::g;
       $val=~s:"::g; #"
       &Apache::lonxml::debug("setting :$key: to  :$val:");
       $result.=' '.$key.'="'.$val.'"';
@@ -305,5 +396,119 @@ sub select_arg {
   return $result;
 }
 
+sub select_or_text_arg {
+  my ($description,$name,$list,$token,$size) = @_;
+  my $result;
+  my $optionlist="";
+  my $found=0;
+  my $selected=$token->[2]{$name};
+  foreach my $option (@$list) {
+    if ( $selected eq $option ) {
+      $optionlist.="<option selected=\"on\">$option</option>\n";
+      $found=1;
+    } else {
+      $optionlist.="<option>$option</option>\n";
+    }
+  }
+  $optionlist.="<option value=\"TYPEDINVALUE\">Type in value</option>\n";
+  if ($found) {
+    $result.=$description.'<select name="'."$Apache::lonxml::curdepth.$name".'">
+       '.$optionlist.'
+      </select></td></tr><tr><td colspan="3">';
+  } else {
+    $result.=&text_arg($description,$name,$token,$size);
+  }
+  return $result;
+}
 1;
 __END__
+
+=head1 NAME
+
+Apache::edit - edit mode helpers
+
+=head1 SYNOPSIS
+
+Invoked by many homework and xml related modules.
+
+ &Apache::edit::SUBROUTINENAME(ARGUMENTS);
+
+=head1 INTRODUCTION
+
+This module outputs HTML syntax helpful for the rendering of edit
+mode interfaces.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 HANDLER SUBROUTINE
+
+There is no handler subroutine.
+
+=head1 OTHER SUBROUTINES
+
+=over 4
+
+=item *
+
+initialize_edit() : initialize edit (set colordepth to zero)
+
+=item *
+
+tag_start($target,$token,$description) : provide deletion and insertion lists
+for the manipulation of a start tag; return a scalar string
+
+=item *
+
+tag_end($target,$token,$description) : ending syntax corresponding to
+&tag_start. return a scalar string.
+
+=item *
+
+start_table($token) : start table; update colordepth; return scalar string.
+
+=item *
+
+end_table() : reduce color depth; end table; return scalar string
+
+=item *
+
+movebuttons($target,$token) : move-up and move-down buttons; return scalar
+string
+
+=item *
+
+deletelist($target,$token) : provide a yes option in an HTML select element;
+return scalar string
+
+=item *
+
+handle_delete($space,$target,$token,$tagstack,$parstack,$parser,$safeeval,
+$style) : respond to a user delete request by passing relevant stack
+and array information to various rendering functions; return a scalar string
+
+=item *
+
+get_insert_list($token) : provide an insertion list based on possibilities
+from lonxml; return a scalar string
+
+=item *
+
+insertlist($target,$token) : api that uses get_insert_list;
+return a scalar string
+
+=item *
+
+handleinsert($token) : provide an insertion list based on possibilities
+from lonxml; return a scalar string
+
+=item *
+
+get_insert_list($token) : provide an insertion list based on possibilities
+from lonxml; return a scalar string
+
+=back
+
+incomplete...
+
+=cut