--- loncom/homework/edit.pm	2001/06/16 18:35:27	1.11
+++ loncom/homework/edit.pm	2001/07/23 22:40:59	1.20
@@ -23,7 +23,7 @@ sub tag_start {
     my $tag=$token->[1];
     if (!$description) { $description="<$tag>"; }
     $result.= &start_table($token)."<tr><td>$description</td>
-<td>Delete:".
+<td>Delete".
   &deletelist($target,$token)
   ."</td>
 <td>".
@@ -40,11 +40,11 @@ sub tag_end {
   if ($target eq 'edit') {
     my $tag=$token->[1];
     if (!defined($description)) {
-      $result.="</td></tr><tr><td>&lt;/$tag&gt;";
+      $result.="</td></tr><tr><td>&lt;/$tag&gt;</td><td colspan=\"2\">&nbsp;</td>";
     } else {
-      if ($description ne '') { $result.="</td></tr><tr><td>$description"; }
+      if ($description ne '') { $result.="</td></tr><tr><td>$description</td><td colspan=\"2\">&nbsp;</td>"; }
     }
-    $result.="</td><td>&nbsp;</td><td>&nbsp;</td></tr>".&end_table()."\n";
+    $result.="</tr>".&end_table()."\n";
   }
   return $result;
 }
@@ -64,7 +64,7 @@ sub start_table {
     $color = $Apache::edit::colorlist[$Apache::edit::colordepth];
   }
   $Apache::edit::colordepth++;
-  my $result="<table bgcolor=\"$color\" width=\"100%\" border=\"10\">";
+  my $result="<table bgcolor=\"$color\" width=\"100%\" border=\"5\">";
   return $result;
 }
 
@@ -77,13 +77,35 @@ sub end_table {
 sub deletelist {
   my ($target,$token) = @_;
   my $result = "<select name=\"delete_$Apache::lonxml::curdepth\">
-<option>Nothing</option>
-<option>Tag</option>
-<option>Subtags</option>
+<option></option>
+<option>Yes</option>
 </select>";
   return $result;
 }
 
+sub handle_delete {
+  if (!$ENV{"form.delete_$Apache::lonxml::curdepth"}) { return ''; }
+  my ($space,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+  my $result=0;
+  if ($space) {
+    my $sub1="$space\:\:delete_$token->[1]";
+    {
+      no strict 'refs';
+      if (defined &$sub1) {
+	$result=&$sub1($target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
+      }
+    }
+  }
+  if (!$result) {
+    my $endtag='/'.$token->[1];
+    my $bodytext=&Apache::lonxml::get_all_text($endtag,$$parser[$#$parser]);
+    $$parser['-1']->get_token();
+    &Apache::lonxml::debug("Deleting :$bodytext: for $token->[1]");
+    &Apache::lonxml::end_tag($tagstack,$parstack,$token);
+  }
+  return 1;
+}
+
 sub get_insert_list {
   my ($token) = @_;
   my $result='';
@@ -124,7 +146,7 @@ $optionlist
 }
 
 sub handle_insert {
-  if (!$ENV{"form.insert_$Apache::lonxml::curdepth"}) { return ''; }
+  if ($ENV{"form.insert_$Apache::lonxml::curdepth"} eq '') { return ''; }
   my $result;
   my $tagnum = $ENV{"form.insert_$Apache::lonxml::curdepth"};
   my $func=$Apache::lonxml::insertlist{"$tagnum.function"};
@@ -134,19 +156,49 @@ sub handle_insert {
     if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); }
     $result.="\n<$newtag>\n</$newtag>";
   } else {
-    {
-      no strict 'refs';
-      $result.=&$func();
+    if (defined(&$func)) {
+      {
+	no strict 'refs';
+	$result.=&$func();
+      }
+    } else {
+      my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"};
+      &Apache::lonxml::error("Unable to insert tag $newtag, $func was not defined.");
     }
   }
   return $result;
 }
 
+sub insert_responseparam {
+  return '
+    <responseparam />';
+}
+
+sub insert_numericalresponse {
+  return '
+<numericalresponse answer="">
+    <textline />
+    <hintgroup>
+    </hintgroup>
+</numericalresponse>';
+}
+
+sub insert_stringresponse {
+  return '
+<stringresponse answer="" type="">
+    <textline />
+    <hintgroup>
+    </hintgroup>
+</stringresponse>';
+}
+
 sub insert_optionresponse {
   return '
 <optionresponse max="10">
     <foilgroup options="">
     </foilgroup>
+    <hintgroup>
+    </hintgroup>
 </optionresponse>';
 }
 
@@ -188,8 +240,105 @@ sub modifiedfield {
 }
 
 sub insert_startouttext {
-  return "\n<startouttext />\n<endouttext />";
+  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) {
+    #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) {
+      $token->[2]->{$arg}=$newvalue;
+      $rebuild=1;
+    }
+  }
+  return $rebuild;
+}
+
+# looks for /> on start tags
+sub rebuild_tag {
+  my ($token) = @_;
+  my $result;
+  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.'"';
+    }
+    if ($token->[4] =~ m:/>$:) {
+      $result.=' />';
+    } else {
+      $result.='>';
+    }
+  } elsif ( $token->[0] eq 'E' ) {
+    $result = '</'.$token->[1].'>';
+  }
+  return $result;
+}
+
+sub text_arg {
+  my ($description,$name,$token,$size) = @_;
+  my $result;
+  if (!defined $size) { $size=20; }
+  my $arg=$token->[2]{$name};
+  $result=$description.'<input name="'."$Apache::lonxml::curdepth.$name".
+    '" type="text" value="'.$arg.'" size="'.$size.'" />';
+  return $result;
+}
+
+sub select_arg {
+  my ($description,$name,$list,$token) = @_;
+  my $result;
+  my $optionlist="";
+  my $selected=$token->[2]{$name};
+  foreach my $option (@$list) {
+    if ( $selected eq $option ) {
+      $optionlist.="<option selected=\"on\">$option</option>\n";
+    } else {
+      $optionlist.="<option>$option</option>\n";
+    }
+  }
+  $result.=$description.'<select name="'."$Apache::lonxml::curdepth.$name".'">
+       '.$optionlist.'
+      </select></td></tr><tr><td colspan="3">';
+  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__