--- loncom/homework/edit.pm	2008/11/10 14:11:16	1.117
+++ loncom/homework/edit.pm	2010/11/13 03:22:58	1.133
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # edit mode helpers
 #
-# $Id: edit.pm,v 1.117 2008/11/10 14:11:16 jms Exp $
+# $Id: edit.pm,v 1.133 2010/11/13 03:22:58 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,6 +26,8 @@
 # http://www.lon-capa.org/
 #
 
+=pod
+
 =head1 NAME
 
 Apache::edit - edit mode helpers
@@ -44,102 +46,87 @@ 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
+=head1 SUBROUTINES
 
 =over 4
 
-=item *
+=item initialize_edit() 
 
-initialize_edit() : initialize edit (set colordepth to zero)
+initialize edit (set colordepth to zero)
 
-=item *
+=item tag_start($target,$token,$description)
 
-tag_start($target,$token,$description) : provide deletion and insertion lists
+provide deletion and insertion lists
 for the manipulation of a start tag; return a scalar string
 
-=item *
+=item tag_end($target,$token,$description)
 
-tag_end($target,$token,$description) : ending syntax corresponding to
+ending syntax corresponding to
 &tag_start. return a scalar string.
 
-=item *
+=item  start_table($token)
 
-start_table($token) : start table; update colordepth; return scalar string.
+start table; update colordepth; return scalar string.
 
-=item *
+=item end_table()
 
-end_table() : reduce color depth; end table; return scalar string
+reduce color depth; end table; return scalar string
 
-=item *
+=item start_spanning_row()
 
-start_spanning_row() : start a new table row spanning the 'edit' environment.
+start a new table row spanning the 'edit' environment.
 
-=item *
+=item start_row()
 
-start_row() : start a new table row and element. 
+start a new table row and element. 
 
-=item *
+=item end_row() 
 
-end_row() : end current table element and row.
+end current table element and row.
 
-=item *
+=item movebuttons($target,$token)
 
-movebuttons($target,$token) : move-up and move-down buttons; return scalar
-string
+move-up and move-down buttons; return scalar string
 
-=item *
+=item deletelist($target,$token)
 
-deletelist($target,$token) : provide a yes option in an HTML select element;
-return scalar string
+provide a yes option in an HTML select element; return scalar string
 
-=item *
+=item handle_delete($space,$target,$token,$tagstack,$parstack,$parser,$safeeval,
+$style)
 
-handle_delete($space,$target,$token,$tagstack,$parstack,$parser,$safeeval,
-$style) : respond to a user delete request by passing relevant stack
+respond to a user delete request by passing relevant stack
 and array information to various rendering functions; return a scalar string
 
-=item *
+=item get_insert_list($token)
 
-get_insert_list($token) : provide an insertion list based on possibilities
-from lonxml; return a scalar string
+provide an insertion list based on possibilities from lonxml; return a scalar string
 
-=item *
+=item insertlist($target,$token)
 
-insertlist($target,$token) : api that uses get_insert_list;
-return a scalar string
+api that uses get_insert_list; return a scalar string
 
-=item *
+=item handleinsert($token)
 
-handleinsert($token) : provide an insertion list based on possibilities
-from lonxml; return a scalar string
+provide an insertion list based on possibilities from lonxml; return a scalar string
 
-=item *
+=item get_insert_list($token)
 
-get_insert_list($token) : provide an insertion list based on possibilities
-from lonxml; return a scalar string
+provide an insertion list based on possibilities from lonxml; return a scalar string
 
-=item *
-browse($elementname) : provide a link which will open up the filesystem
-browser (lonindexer) and, once a file is selected, place the result in
-the form element $elementname.
+=item browse($elementname)
 
-=item *
-search($elementname) : provide a link which will open up the filesystem
-searcher (lonsearchcat) and, once a file is selected, place the result in
-the form element $elementname.
+provide a link which will open up the filesystem browser (lonindexer) and, once a file is selected, place the result in the form element $elementname.
 
-=item *
-editline(tag,data,description,size): Provide a <input type="text" ../> for
-single-line text entry.  This is to be used for text enclosed by tags, not
-arguements/parameters associated with a tag.
+=item search($elementname)
 
-=back
+provide a link which will open up the filesystem searcher (lonsearchcat) and, once a file is selected, place the result in the form element $elementname.
+
+=item editline(tag,data,description,size)
 
-incomplete...
+Provide a <input type="text" ../> for single-line text entry.  This is to be used for text enclosed by tags, not arguements/parameters associated with a tag.
+
+=back
 
 =cut
 
@@ -217,7 +204,7 @@ sub start_table {
     $Apache::edit::colordepth++;
     push(@Apache::edit::inserttag,$token->[1]);
     my $result='<div align="right">';
-    $result.='<table bgcolor="'.$color.'" width="97%" border="0" cellspacing="5" cellpadding="3">';
+    $result.='<table bgcolor="'.$color.'" width="97%" border="0" cellspacing="3" cellpadding="2">';
     return $result;
 }
 
@@ -245,7 +232,7 @@ sub end_table {
     return $result;
 }
 
-sub start_spanning_row { return '<tr><td colspan="5" bgcolor="#DDDDDD">';}
+sub start_spanning_row { return '<tr><td colspan="5" bgcolor="#F0F0F0">';}
 sub start_row          { return '<tr><td bgcolor="#DDDDDD">';            }
 sub end_row            { return '</td></tr>';          }
 
@@ -370,7 +357,7 @@ sub do_insert {
 	my $depth = scalar(@Apache::lonxml::depthcounter);
 	$depth -- if ($after);
 	my $inset = "\t"x$depth;
-	$result.="\n$inset<$newtag>\n$inset</$newtag>";
+	$result.="\n$inset<$newtag></$newtag>";
     } else {
 	if (defined(&$func)) {
 	    {
@@ -410,6 +397,47 @@ sub insert_formularesponse {
 </formularesponse>';
 }
 
+sub insert_functionplotresponse {
+    return '
+<functionplotresponse>
+<functionplotelements>
+<spline />
+</functionplotelements>
+<functionplotruleset>
+<functionplotrule />
+</functionplotruleset>
+</functionplotresponse>';
+}
+
+sub insert_spline {
+    return '
+<spline />';
+}
+
+sub insert_backgroundplot {
+    return '
+<backgroundplot />';
+}
+
+sub insert_functionplotrule {
+    return '
+<functionplotrule />';
+}
+
+sub insert_functionplotruleset {
+    return '
+<functionplotruleset>
+<functionplotrule />
+</functionplotruleset>';
+}
+
+sub insert_functionplotelements {
+    return '
+<functionplotelements>
+<spline />
+</functionplotelements>';
+}
+
 sub insert_numericalresponse {
     return '
 <numericalresponse answer="">
@@ -605,6 +633,9 @@ sub insert_matchresponse {
 </matchresponse>';
 }
 
+sub insert_startpartmarker { return '<startpartmarker />'; }
+sub insert_endpartmarker { return '<endpartmarker />'; }
+
 sub insert_displayduedate { return '<displayduedate />'; }
 sub insert_displaytitle   { return '<displaytitle />'; }
 sub insert_hintpart {
@@ -627,6 +658,18 @@ sub insert_numericalhint {
 </numericalhint>';
 }
 
+sub insert_reactionhint {
+    return '
+<reactionhint>
+</reactionhint>';
+}
+
+sub insert_organichint {
+    return '
+<organichint>
+</organichint>';
+}
+
 sub insert_stringhint {
     return '
 <stringhint>
@@ -729,19 +772,18 @@ sub editfield {
     my ($tag,$data,$description,$minwidth,$minheight,$usehtmlarea)=@_;
 
     my ($rows,$cols)=&textarea_sizes(\$data);
-    if (&Apache::lonhtmlcommon::htmlareabrowser() &&
-	!&Apache::lonhtmlcommon::htmlareablocked()) {
+    my $textareaclass;
+ 
+    if (&Apache::lonhtmlcommon::htmlareabrowser() && $usehtmlarea) { 
 	$rows+=7;      # make room for HTMLarea
 	$minheight+=7; # make room for HTMLarea
+        $textareaclass = ' class="LC_richDefaultOff"';
     }
     if ($cols > 80) { $cols = 80; }
     if ($cols < $minwidth ) { $cols = $minwidth; }
     if ($rows < $minheight) { $rows = $minheight; }
     if ($description) { $description=$description."<br />"; }
-    if ($usehtmlarea) {
-	&Apache::lonhtmlcommon::add_htmlareafields('homework_edit_'.
-						   $Apache::lonxml::curdepth);
-    }
+
     # remove typesetting whitespace from between data and the end tag
     # to make the edit look prettier
     $data =~ s/\n?[ \t]*$//;
@@ -749,7 +791,8 @@ sub editfield {
     return $description."\n".'<textarea style="width:100%" rows="'.$rows.
 	'" cols="'.$cols.'" name="homework_edit_'.
 	$Apache::lonxml::curdepth.'" id="homework_edit_'.
-	$Apache::lonxml::curdepth.'" '.&element_change_detection().'>'.
+	$Apache::lonxml::curdepth.'" '.&element_change_detection().
+        $textareaclass.'>'.
 	&HTML::Entities::encode($data,'<>&"').'</textarea>'.
 	($usehtmlarea?&Apache::lonhtmlcommon::spelllink('lonhomework',
 			 'homework_edit_'.$Apache::lonxml::curdepth):'')."\n";
@@ -857,15 +900,15 @@ sub checked_arg {
 	    $text=$option;
 	    $value='value="'.$option.'"';
 	}
-	$result.="<nobr><label><input type=\"checkbox\" $value name=\"".
-	    &html_element_name($name)."\"";
+	$result.='<span class="LC_nobreak"><label><input type="checkbox" '.$value.' name="'.
+	    &html_element_name($name).'"';
 	foreach my $selected (split(/,/,$allselected)) {
 	    if ( $selected eq $option ) {
-		$result.=" checked=\"checked\" ";
+		$result.=' checked="checked" ';
 		last;
 	    }
 	}
-	$result.=&element_change_detection()." />$text</label></nobr>\n";
+	$result.=&element_change_detection().' />'.$text.'</label></span>'."\n";
     }
     return $result;
 }
@@ -878,7 +921,7 @@ sub text_arg {
     $result=&mt($description).'&nbsp;<input name="'.&html_element_name($name).
 	'" type="text" value="'.$arg.'" size="'.$size.'" '.
 	&element_change_detection().'/>';
-    return '<nobr>'.$result.'</nobr>';
+    return '<span class="LC_nobreak">'.$result.'</span>';
 }
 
 sub select_arg {
@@ -886,26 +929,28 @@ sub select_arg {
     my $result;
     my $optionlist="";
     my $selected=$token->[2]{$name};
-    foreach my $option (@$list) {
-	my ($text,$value);
-	if ( ref($option) eq 'ARRAY') {
-	    $value='value="'.&HTML::Entities::encode($$option[0]).'"';
-	    $text=$$option[1];
-	    $option=$$option[0];
-	} else {
-	    $text=$option;
-	    $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"';
-	}
-	if ( $selected eq $option ) {
-	    $optionlist.="<option $value selected=\"selected\">".&mt($text)."</option>\n";
-	} else {
-	    $optionlist.="<option $value >".&mt($text)."</option>\n";
-	}
+    if (ref($list) eq 'ARRAY') {
+        foreach my $option (@{$list}) {
+	    my ($text,$value);
+	    if (ref($option) eq 'ARRAY') {
+	        $value='value="'.&HTML::Entities::encode($option->[0]).'"';
+	        $text=$option->[1];
+	        $option=$option->[0];
+	    } else {
+	        $text=$option;
+	        $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"';
+	    }
+	    if ( $selected eq $option ) {
+	        $optionlist.="<option $value selected=\"selected\">".&mt($text)."</option>\n";
+	    } else {
+	        $optionlist.="<option $value >".&mt($text)."</option>\n";
+	    }
+        }
     }
-    $result.='<nobr>'.&mt($description).'&nbsp;<select name="'.
+    $result.='<span class="LC_nobreak">'.&mt($description).'&nbsp;<select name="'.
 	&html_element_name($name).'" '.&element_change_detection().' >
        '.$optionlist.'
-      </select></nobr>';
+      </select></span>';
     return $result;
 }
 
@@ -915,22 +960,24 @@ sub select_or_text_arg {
     my $optionlist="";
     my $found=0;
     my $selected=$token->[2]{$name};
-    foreach my $option (@$list) {
-	my ($text,$value);
-	if ( ref($option) eq 'ARRAY') {
-	    $value='value="'.&HTML::Entities::encode($$option[0]).'"';
-	    $text=$$option[1];
-	    $option=$$option[0];
-	} else {
-	    $text=$option;
-	    $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"';
-	}
-	if ( $selected eq $option ) {
-	    $optionlist.="<option $value selected=\"selected\">$text</option>\n";
-	    $found=1;
-	} else {
-	    $optionlist.="<option $value>$text</option>\n";
-	}
+    if (ref($list) eq 'ARRAY') {
+        foreach my $option (@{$list}) {
+	    my ($text,$value);
+	    if (ref($option) eq 'ARRAY') {
+	        $value='value="'.&HTML::Entities::encode($option->[0]).'"';
+	        $text=$option->[1];
+	        $option=$option->[0];
+	    } else {
+	        $text=$option;
+	        $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"';
+	    }
+	    if ( $selected eq $option ) {
+	        $optionlist.="<option $value selected=\"selected\">$text</option>\n";
+	        $found=1;
+	    } else {
+	        $optionlist.="<option $value>$text</option>\n";
+	    }
+        }
     }
     $optionlist.="<option value=\"TYPEDINVALUE\"".
  	((!$found)?' selected="selected"':'').
@@ -951,7 +998,7 @@ sub select_or_text_arg {
     $description=&mt($description);
 #
     return (<<ENDSELECTORTYPE);
-<nobr>
+<span class="LC_nobreak">
 $description
 &nbsp;<select name="$selectelement"
 onChange="if ($selectedvalue!='TYPEDINVALUE') { $hiddenvalue=$selectedvalue; $typedinvalue=''; }" >
@@ -962,7 +1009,7 @@ $optionlist
 onChange="$hiddenvalue=$typedinvalue;"
 onFocus="$selectedindex=$selecttypeinindex-1;" />
 <input type="hidden" name="$element" value="$selected" $change_code />
-</nobr>
+</span>
 ENDSELECTORTYPE
 }
 
@@ -1038,7 +1085,7 @@ sub entercoord {
 }
 
 sub deletecoorddata {
-    &Apache::lonnet::delenv("imagechoice\\.");
+    &Apache::lonnet::delenv('imagechoice.');
 }
 
 #----------------------------------------------------- browse