--- loncom/homework/edit.pm 2002/03/22 14:45:11 1.31 +++ loncom/homework/edit.pm 2007/10/03 00:24:48 1.112 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # edit mode helpers # -# $Id: edit.pm,v 1.31 2002/03/22 14:45:11 matthew Exp $ +# $Id: edit.pm,v 1.112 2007/10/03 00:24:48 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,418 +25,924 @@ # # http://www.lon-capa.org/ # -# 3/20 Guy -# 01/10/02 Matthew -# 03/06/02 Matthew + package Apache::edit; use strict; use Apache::lonnet; +use HTML::Entities(); +use Apache::lonlocal; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + # Global Vars # default list of colors to use in editing @Apache::edit::colorlist=('#ffffff','#ff0000','#00ff00','#0000ff','#0ff000','#000ff0','#f0000f'); # depth of nesting of edit $Apache::edit::colordepth=0; +@Apache::edit::inserttag=(); +# image-type responses: active background image and curdepth at definition +$Apache::edit::bgimgsrc=''; +$Apache::edit::bgimgsrccurdepth=''; sub initialize_edit { - $Apache::edit::colordepth=0; + $Apache::edit::colordepth=0; + @Apache::edit::inserttag=(); } sub tag_start { - my ($target,$token,$description) = @_; - my $result=''; - if ($target eq "edit") { - my $tag=$token->[1]; - if (!$description) { - $description=&Apache::lonxml::description($token); - if (!$description) { $description="<$tag>"; } - } - $result.= &start_table($token)."$description -Delete". - &deletelist($target,$token) - ." -". - &insertlist($target,$token).&end_row().&start_spanning_row(); + my ($target,$token,$description) = @_; + my $result=''; + if ($target eq "edit") { + my $tag=$token->[1]; + if (!$description) { + $description=&Apache::lonxml::description($token); + if (!$description) { $description="<$tag>"; } + } + $result.= &start_table($token)."$description + Delete". + &deletelist($target,$token) + ." + ". + &insertlist($target,$token); #". # &movebuttons($target,$token). # "\n"; - } - return $result; + my @help = Apache::lonxml::helpinfo($token); + if ($help[0]) { + $result .= '' . + Apache::loncommon::help_open_topic(@help); + } else { $result .= " "; } + $result .= &end_row().&start_spanning_row(); + } + return $result; } sub tag_end { - my ($target,$token,$description) = @_; - my $result=''; - if ($target eq 'edit') { - my $tag=$token->[1]; - if (!defined($description)) { - $result.="</$tag> "; - } else { - if ($description ne '') { $result.="$description "; } + my ($target,$token,$description) = @_; + my $result=''; + if ($target eq 'edit') { + $result.="".&end_table()."\n"; } - $result.="".&end_table()."\n"; - } - return $result; + return $result; } sub start_table { - my ($token)=@_; - my $tag = $token->[1]; - my $tagnum; - foreach my $namespace (reverse @Apache::lonxml::namespace) { - my $testtag=$namespace.'::'.$tag; - $tagnum=$Apache::lonxml::insertlist{"$testtag.num"}; - if (defined($tagnum)) { last; } - } - if (!defined ($tagnum)) { $tagnum=$Apache::lonxml::insertlist{"$tag.num"}; } - my $color = $Apache::lonxml::insertlist{"$tagnum.color"}; - if (!defined($color)) { - $color = $Apache::edit::colorlist[$Apache::edit::colordepth]; - } - $Apache::edit::colordepth++; - my $result=""; - return $result; + my ($token)=@_; + my $tag = &Apache::lonxml::get_tag($token); + + my $color = $Apache::lonxml::insertlist{"$tag.color"}; + &Apache::lonxml::debug(" $tag -- $color"); + if (!defined($color)) { + $color = $Apache::edit::colorlist[$Apache::edit::colordepth]; + } + $Apache::edit::colordepth++; + push(@Apache::edit::inserttag,$token->[1]); + my $result='
'; + $result.='
'; + return $result; } sub end_table { - $Apache::edit::colordepth--; - my $result="
"; - return $result; + $Apache::edit::colordepth--; + my $result=''; + $result.='
'; + + my ($tagname,$closingtag); + if (defined($Apache::edit::inserttag[-2])) { + $tagname=$Apache::edit::inserttag[-2]; + } else { + if ($Apache::lonhomework::parsing_a_task) { + $tagname='Task'; + } else { + $tagname='problem'; + } + } + if (defined($Apache::edit::inserttag[-1])) { + $closingtag=$Apache::edit::inserttag[-1]; + } + $result.=&innerinsertlist('edit',$tagname,$closingtag). + "
"; + my $last = pop(@Apache::edit::inserttag); + return $result; } -sub start_spanning_row { return '';} -sub start_row { return ''; } +sub start_spanning_row { return '';} +sub start_row { return ''; } sub end_row { return ''; } sub movebuttons { - my ($target,$token) = @_; - my $result=''; - $result.=''; - return $result; + my ($target,$token) = @_; + my $result=''; + $result.=''; + return $result; } sub deletelist { - my ($target,$token) = @_; - my $result = " "; - return $result; + 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; + 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,$style); + $$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=''; - my @tagnums= (); - #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist)))); - if ($Apache::lonxml::insertlist{"$token->[1].which"}) { - push (@tagnums, @{ $Apache::lonxml::insertlist{"$token->[1].which"} }); - } - foreach my $namespace (@Apache::lonxml::namespace) { - if ($Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"}) { - push (@tagnums, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"} }); - } - } - if (@tagnums) { - foreach my $tagnum (@tagnums) { - $result.='\n"; - } - if ($result) { $result=''.$result; } - } - return $result; + my ($tagname) = @_; + my $result=''; + my @tags= (); + #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist)))); + if ($Apache::lonxml::insertlist{"$tagname.which"}) { + push (@tags, @{ $Apache::lonxml::insertlist{"$tagname.which"} }); + } + foreach my $namespace (@Apache::lonxml::namespace) { + if ($Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"}) { + push (@tags, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"} }); + } + } + if (@tags) { + my %options; + foreach my $tag (@tags) { + my $descrip=$Apache::lonxml::insertlist{"$tag.description"}; + my $tagnum =$Apache::lonxml::insertlist{"$tag.num"}; + $options{$descrip} ="\n"; + } + foreach my $option (sort(keys(%options))) {$result.=$options{$option};} + if ($result) { $result=''.$result; } + } + return $result; } sub insertlist { - my ($target,$token) = @_; - my $result; - if ($target eq 'edit') { - my $optionlist= &get_insert_list($token); - if ($optionlist) { - $result = "Insert: -" - } else { - $result=" "; + my ($target,$token) = @_; + return &innerinsertlist($target,$token->[1]); +} + +sub innerinsertlist { + my ($target,$tagname,$closingtag) = @_; + my $result; + my $after=''; + if ($closingtag) { + $after='_after_'.$closingtag; + } + if ($target eq 'edit') { + my $optionlist= &get_insert_list($tagname); + if ($optionlist) { + $result = "Insert: + " + } else { + $result=" "; + } } - } - return $result; + return $result; } sub handle_insert { - 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"}; - if ($func eq 'default') { - my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; - my $namespace; - if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); } - $result.="\n<$newtag>\n"; - } else { - if (defined(&$func)) { - { - no strict 'refs'; - $result.=&$func(); - } + if ($env{"form.insert_$Apache::lonxml::curdepth"} eq '') { return ''; } + my $tagnum = $env{"form.insert_$Apache::lonxml::curdepth"}; + return &do_insert($tagnum); +} + +sub handle_insertafter { + my $tagname=shift; + if ($env{"form.insert_after_$tagname\_$Apache::lonxml::curdepth"} eq '') { + return ''; + } + my $tagnum =$env{"form.insert_after_$tagname\_$Apache::lonxml::curdepth"}; + return &do_insert($tagnum,1); +} + +sub do_insert { + my ($tagnum,$after) = @_; + my $result; + + my $newtag = $Apache::lonxml::insertlist{"$tagnum.tag"}; + my $func = $Apache::lonxml::insertlist{"$newtag.function"}; + if ($func eq 'default') { + my $namespace; + if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); } + my $depth = scalar(@Apache::lonxml::depthcounter); + $depth -- if ($after); + my $inset = "\t"x$depth; + $result.="\n$inset<$newtag>\n$inset"; } else { - my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; - &Apache::lonxml::error("Unable to insert tag $newtag, $func was not defined."); + if (defined(&$func)) { + { + no strict 'refs'; + $result.=&$func(); + } + } else { + &Apache::lonxml::error("Unable to insert tag $newtag, $func was not defined. ($tagnum)"); + } } - } - return $result; + return $result; +} + +sub insert_img { + return ' + '; } sub insert_responseparam { - return ' + return ' '; } +sub insert_parameter { + return ' + '; +} + sub insert_formularesponse { - return ' + return ' - + + + '; } sub insert_numericalresponse { - return ' + return ' + + + '; } +sub insert_customresponse { + return ' + + + + + + + +'; +} + +sub insert_customresponse_answer { + return ' + + +'; +} + +sub insert_customhint { + return ' + + + + '; +} + +sub insert_customhint_answer { + return ' + + +'; +} + +sub insert_mathresponse { + return ' + + + + + + + + +'; +} + +sub insert_mathresponse_answer { + return ' + + +'; +} + +sub insert_mathhint { + return ' + + + + '; +} + +sub insert_mathhint_answer { + return ' + + +'; +} + sub insert_stringresponse { - return ' + return ' + '; } +sub insert_essayresponse { + return ' + + +'; +} + +sub insert_imageresponse { + return ' + + + + + + + + +'; +} + sub insert_optionresponse { - return ' + return ' + + + + '; } +sub insert_organicresponse { + return ' + + + + + +'; +} + +sub insert_organicstructure { + return ' + +'; +} + sub insert_radiobuttonresponse { - return ' + return ' + + + + '; } +sub insert_reactionresponse { + return ' + + + + + +'; +} + +sub insert_rankresponse { + return ' + + + + + + + + + +'; +} + +sub insert_matchresponse { + return ' + + + + + + + + + + + +'; +} + sub insert_displayduedate { return ''; } sub insert_displaytitle { return ''; } sub insert_hintpart { - return ' + return ' - - + '; } -sub insert_numericalhint { +sub insert_hintgroup { return ' + + +'; +} + +sub insert_numericalhint { + return ' '; } +sub insert_stringhint { + return ' + +'; +} + +sub insert_formulahint { + return ' + +'; +} + +sub insert_radiobuttonhint { + return ' + +'; +} + +sub insert_optionhint { + return ' + +'; +} + sub insert_startouttext { - return "\n"; + return ""; } sub insert_script { - return "\n"; + return "\n"; +} + +sub js_change_detection { + my $unsaved=&mt("There are unsaved changes"); + return (< +var clean = true; +var is_submit = false; +var still_ask = false; +function compareForm(event_) { + if (!event_ && window.event) { + event_ = window.event; + } + if ((!is_submit || (is_submit && still_ask)) && !clean) { + still_ask = false; + is_submit = false; + event_.returnValue = "$unsaved"; + return "$unsaved"; + } +} +function unClean() { + clean=false; +} +window.onbeforeunload = compareForm; + +SCRIPT +} + +sub form_change_detection { + return ' onsubmit="is_submit=true;" '; +} + +sub element_change_detection { + return ' onchange="unClean();" '; +} + +sub submit_ask_anyway { + return ' onclick="still_ask=true;" '; } sub textarea_sizes { - my ($data)=@_; - my $count=0; - my $maxlength=-1; - foreach (split ("\n", $$data)) { $count++; + my ($data)=@_; + my $count=0; + my $maxlength=-1; + foreach (split ("\n", $$data)) { + $count+=int(length($_)/79); + $count++; if (length($_) > $maxlength) { $maxlength = length($_); } - } - my $rows = $count; - my $cols = $maxlength; - return ($rows,$cols); + } + my $rows = $count; + my $cols = $maxlength; + return ($rows,$cols); } -sub textfield { +sub editline { my ($tag,$data,$description,$size)=@_; - if ($description) { $description="
".$description."
"; } + $data=&HTML::Entities::encode($data,'<>&"'); + if ($description) { $description=$description."
"; } + my $change_code = &element_change_detection(); my $result = <<"END"; $description + value="$data" size="$size" $change_code /> END return $result; } sub editfield { - my ($tag,$data,$description,$minwidth,$minheight)=@_; + my ($tag,$data,$description,$minwidth,$minheight,$usehtmlarea)=@_; - my ($rows,$cols)=&textarea_sizes(\$data); - if ($cols > 80) { $cols = 80; } - if ($cols < $minwidth ) { $cols = $minwidth; } - if ($rows < $minheight) { $rows = $minheight; } - if ($description) { $description="
".$description."
"; } - return "$description\n   \n"; + my ($rows,$cols)=&textarea_sizes(\$data); + if (&Apache::lonhtmlcommon::htmlareabrowser() && + !&Apache::lonhtmlcommon::htmlareablocked()) { + $rows+=7; # make room for HTMLarea + $minheight+=7; # make room for HTMLarea + } + if ($cols > 80) { $cols = 80; } + if ($cols < $minwidth ) { $cols = $minwidth; } + if ($rows < $minheight) { $rows = $minheight; } + if ($description) { $description=$description."
"; } + 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]*$//; + + return $description."\n".''. + ($usehtmlarea?&Apache::lonhtmlcommon::spelllink('lonhomework', + 'homework_edit_'.$Apache::lonxml::curdepth):'')."\n"; } sub modifiedfield { - my ($token) = @_; - my $result; -# foreach my $envkey (sort keys %ENV) { -# &Apache::lonxml::debug("$envkey ---- $ENV{$envkey}"); -# } -# &Apache::lonxml::debug("I want homework_edit_$Apache::lonxml::curdepth"); -# &Apache::lonxml::debug($ENV{"form.homework_edit_$Apache::lonxml::curdepth"}); - $result=$ENV{"form.homework_edit_$Apache::lonxml::curdepth"}; - return $result; + my ($endtag,$parser) = @_; + my $result; + $result=$env{"form.homework_edit_$Apache::lonxml::curdepth"}; + my $bodytext=&Apache::lonxml::get_all_text($endtag,$parser); + # textareas throw away intial \n + if ($bodytext=~/^\n/) { + $result="\n".$result; + } + # if there is typesetting whitespace from between the data and the end tag + # restore to keep the source looking pretty + if ($bodytext =~ /(\n?[ \t]*)$/) { + $result .= $1; + } + return $result; } # 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; + 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 $element=&html_element_name($arg); + my $newvalue=$env{"form.$element"}; + &Apache::lonxml::debug("for:$arg: cur is :$value: new is :$newvalue:"); + if (defined($newvalue) && $value ne $newvalue) { + if (ref($newvalue) eq 'ARRAY') { + $token->[2]->{$arg}=join(',',@$newvalue); + } else { + $token->[2]->{$arg}=$newvalue; + } + $rebuild=1; + # add new attributes to the of the attribute seq + if (!grep { $arg eq $_ } (@{ $token->[3] })) { + push(@{ $token->[3] },$arg); + } + } elsif (!defined($newvalue) && defined($value)) { + delete($token->[2]->{$arg}); + $rebuild=1; + } } - } - return $rebuild; + 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.'"'; + my ($token) = @_; + my $result; + if ($token->[0] eq 'S') { + $result = '<'.$token->[1]; + foreach my $attribute (@{ $token->[3] }) { + my $value = $token->[2]{$attribute}; + next if ($value eq ''); + $value =~s/^\s+|\s+$//g; + $value =~s/\"//g; + &Apache::lonxml::debug("setting :$attribute: to :$value:"); + $result.=' '.$attribute.'="'.$value.'"'; + } + if ($token->[4] =~ m:/>$:) { + $result.=' />'; + } else { + $result.='>'; + } + } elsif ( $token->[0] eq 'E' ) { + $result = '[1].'>'; } - if ($token->[4] =~ m:/>$:) { - $result.=' />'; - } else { - $result.='>'; + return $result; +} + +sub html_element_name { + my ($name) = @_; + return $name.'_'.$Apache::lonxml::curdepth; +} + +sub hidden_arg { + my ($name,$token) = @_; + my $result; + my $arg=$token->[2]{$name}; + $result=''; + return $result; +} + +sub checked_arg { + my ($description,$name,$list,$token) = @_; + my $result; + my $optionlist=""; + my $allselected=$token->[2]{$name}; + $result=&mt($description); + foreach my $option (@$list) { + my ($value,$text); + if ( ref($option) eq 'ARRAY') { + $value='value="'.$$option[0].'"'; + $text=$$option[1]; + $option=$$option[0]; + } else { + $text=$option; + $value='value="'.$option.'"'; + } + $result.="\n"; } - } elsif ( $token->[0] eq 'E' ) { - $result = '[1].'>'; - } - return $result; + return $result; } sub text_arg { - my ($description,$name,$token,$size) = @_; - my $result; - if (!defined $size) { $size=20; } - my $arg=$token->[2]{$name}; - $result=$description.''; - return $result; + my ($description,$name,$token,$size) = @_; + my $result; + if (!defined $size) { $size=20; } + my $arg=$token->[2]{$name}; + $result=&mt($description).' '; + 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.="\n"; - } else { - $optionlist.="\n"; + my ($description,$name,$list,$token) = @_; + 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.="\n"; + } else { + $optionlist.="\n"; + } } - } - $result.=$description.' '.$optionlist.' - '; - return $result; + '; + 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.="\n"; - $found=1; - } else { - $optionlist.="\n"; + my ($description,$name,$list,$token,$size) = @_; + my $result; + 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.="\n"; + $found=1; + } else { + $optionlist.="\n"; + } } - } - $optionlist.="\n"; - if ($found) { - $result.=$description.''; - } else { - $result.=&text_arg($description,$name,$token,$size); - } - return $result; + $optionlist.="\n"; +# + my $change_code=&element_change_detection(); + my $element=&html_element_name($name); + my $selectelement='select_list_'.$element; + my $typeinelement='type_in_'.$element; + my $typeinvalue=($found?'':$selected); +# + my $hiddenvalue='this.form.'.$element.'.value'; + my $selectedindex='this.form.'.$selectelement.'.selectedIndex'; + my $selectedvalue='this.form.'.$selectelement. + '.options['.$selectedindex.'].value'; + my $typedinvalue='this.form.'.$typeinelement.'.value'; + my $selecttypeinindex='this.form.'.$selectelement.'.options.length'; + $description=&mt($description); +# + return (< +$description +  + + + +ENDSELECTORTYPE +} + +#----------------------------------------------------- image coordinates +# single image coordinates, x, y +sub entercoords { + my ($idx,$idy,$mode,$width,$height) = @_; + unless ($Apache::edit::bgimgsrc) { return ''; } + if ($idx) { $idx.='_'; } + if ($idy) { $idy.='_'; } + my $bgfile=&escape(&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$Apache::edit::bgimgsrc)); + my $form = 'lonhomework'; + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &escape("$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between ... + $element = &escape('homework_edit_'. + $Apache::lonxml::curdepth); + } + my $id=$Apache::lonxml::curdepth; + my %data=("imagechoice.$id.type" =>'point', + "imagechoice.$id.formname" =>$form, + "imagechoice.$id.formx" =>"$idx$element", + "imagechoice.$id.formy" =>"$idy$element", + "imagechoice.$id.file" =>$bgfile, + "imagechoice.$id.formcoord" =>$element); + if ($height) { + $data{"imagechoice.$id.formheight"}=$height.'_'. + $Apache::edit::bgimgsrccurdepth; + } + if ($width) { + $data{"imagechoice.$id.formwidth"}=$width.'_'. + $Apache::edit::bgimgsrccurdepth; + } + &Apache::lonnet::appenv(%data); + my $text="Click Coordinates"; + my $result=''.$text.''; + return $result; +} + +# coordinates (x1,y1)-(x2,y2)... +# mode can be either box, or polygon +sub entercoord { + my ($idx,$mode,$width,$height,$type) = @_; + unless ($Apache::edit::bgimgsrc) { return ''; } + my $bgfile=&escape(&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$Apache::edit::bgimgsrc)); + my $form = 'lonhomework'; + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &escape("$idx\_$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between ... + $element = &escape('homework_edit_'. + $Apache::lonxml::curdepth); + } + my $id=$Apache::lonxml::curdepth; + my %data=("imagechoice.$id.type" =>$type, + "imagechoice.$id.formname" =>$form, + "imagechoice.$id.file" =>$bgfile, + "imagechoice.$id.formcoord" =>$element); + if ($height) { + $data{"imagechoice.$id.formheight"}=$height.'_'. + $Apache::edit::bgimgsrccurdepth; + } + if ($width) { + $data{"imagechoice.$id.formwidth"}=$width.'_'. + $Apache::edit::bgimgsrccurdepth; + } + &Apache::lonnet::appenv(%data); + my $text="Enter Coordinates"; + if ($type eq 'polygon') { $text='Create Polygon Data'; } + my $result=''.$text.''; + return $result; +} + +sub deletecoorddata { + &Apache::lonnet::delenv("imagechoice\\."); } #----------------------------------------------------- browse sub browse { # insert a link to call up the filesystem browser (lonindexer) - $_ = shift; + my ($id, $mode, $titleid, $only) = @_; my $form = 'lonhomework'; - my $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth.$_"); + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &escape("$id\_$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between ... + $element = &escape('homework_edit_'. + $Apache::lonxml::curdepth); + } + my $titleelement; + if ($titleid) { + $titleelement=",'$only','','".&escape("$titleid\_$Apache::lonxml::curdepth")."'"; + } else { + $titleelement=",'$only'"; + } my $result = <<"ENDBUTTON"; -Browse +Select ENDBUTTON return $result; } @@ -444,11 +950,21 @@ ENDBUTTON #----------------------------------------------------- browse sub search { # insert a link to call up the filesystem browser (lonindexer) - $_ = shift; + my ($id, $mode, $titleid) = @_; my $form = 'lonhomework'; - my $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth.$_"); + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &escape("$id\_$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between ... + $element = &escape('homework_edit_'. + $Apache::lonxml::curdepth); + } + my $titleelement; + if ($titleid) { + $titleelement=",'".&escape("$titleid\_$Apache::lonxml::curdepth")."'"; + } my $result = <<"ENDBUTTON"; -Search +Search ENDBUTTON return $result; } @@ -563,8 +1079,8 @@ search($elementname) : provide a link wh searcher (lonsearchcat) and, once a file is selected, place the result in the form element $elementname. -= item * -textfield(tag,data,description,size): Provide a for +=item * +editline(tag,data,description,size): Provide a for single-line text entry. This is to be used for text enclosed by tags, not arguements/parameters associated with a tag. 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.