--- loncom/homework/lonsimpleproblemedit.pm	2003/07/07 07:32:16	1.1
+++ loncom/homework/lonsimpleproblemedit.pm	2003/11/04 19:18:16	1.8
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Simple Problem Parameter Setting "Editor"
 #
-# $Id: lonsimpleproblemedit.pm,v 1.1 2003/07/07 07:32:16 www Exp $
+# $Id: lonsimpleproblemedit.pm,v 1.8 2003/11/04 19:18:16 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,9 +32,45 @@ use strict;
 use Apache::Constants qw(:common :http);
 use Apache::loncommon;
 use Apache::lonnet;
+use Apache::lonlocal;
+
+my %qparms;
+my $prefix;
+my $qtype;
+
+sub evaloptionhash {
+    my $options=shift;
+    $options=~s/^\(\'//;
+    $options=~s/\'\)$//;
+    my %returnhash=();
+    foreach (split(/\'\,\'/,$options)) {
+	$returnhash{$_}=$_;
+    }
+    return %returnhash;
+}
+
+sub rawrendering {
+    my ($request,$uri)=@_;
+    my $problem=&Apache::lonnet::getfile
+                            (&Apache::lonnet::filelocation('',$uri));
+    &Apache::lonnet::devalidatecourseresdata(
+		     $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
+		     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'});
+    my $uname=$ENV{'user.name'};
+    my $udom=$ENV{'user.domain'};
+    $ENV{'user.name'}=time;
+    $ENV{'user.domain'}=time;
+    my $result = &Apache::lonxml::xmlparse($request,'web', $problem);
+    undef($Apache::lonhomework::parsing_a_problem);
+    $ENV{'user.name'}=$uname;
+    $ENV{'user.domain'}=$udom;
+    $result=~s/^.*\<body[^\>]*\>//si;
+    $result=~s/\<\/body[^\>]*\>.*$//si;
+    return $result;
+}
 
 sub questiontext {
-    my $text=shift;
+    my $text=$qparms{$prefix.'questiontext'};
     return (<<ENDQUESTION);
 <table bgcolor="#dddd22" cellspacing="4" cellpadding="2">
 <tr><td><b>Question Text</b><br />
@@ -46,7 +82,7 @@ ENDQUESTION
 }
 
 sub hint {
-    my $text=shift;
+    my $text=$qparms{$prefix.'hinttext'};
     return (<<ENDHINT);
 <table bgcolor="#accacc" cellspacing="4" cellpadding="2">
 <tr><td><b>Hint Text</b><br />
@@ -58,10 +94,18 @@ ENDHINT
 }
 
 sub foil {
-    my ($number,$value,$position,$text,%values)=@_;
+    my $number=shift;
+    my %values='';
+    if ($qtype eq 'radio') {
+	%values=('true' => 'True', 'false' => 'False');
+    } elsif ($qtype eq 'option') {
+	%values=&evaloptionhash($qparms{$prefix.'options'});
+    }
     $values{'unused'}='Not shown, not used';
+    my $value=$qparms{$prefix.'value'.$number};
     unless (defined($value)) { $value='unused'; }
     unless ($values{$value}) { $value='unused'; }
+    my $position=$qparms{$prefix.'position'.$number};
     my %positions=('random' => 'Random position',
 		   'top'    => 'Show always at top position',
 		   'bottom' => 'Show always at bottom position');
@@ -73,6 +117,7 @@ sub foil {
 	                                ($value,'value'.$number,%values);
     my $selectposition=&Apache::loncommon::select_form
                                ($position,'position'.$number,%positions);
+    my $text=$qparms{$prefix.'text'.$number};
     return (<<ENDFOIL);
 <table bgcolor="#dd55ff" cellspacing="4" cellpadding="2">
 <tr><td colspan="2"><b>Foil</b></td></tr>
@@ -89,36 +134,48 @@ sub handler {
     my $r = shift;
 
     if ($r->header_only) {
-        $r->content_type('text/html');
+        &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         return OK;
     }
 
 # -------------------------------------------------------------------- Allowed?
-    unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
+    unless (&Apache::lonnet::allowed('mdc',$ENV{'request.course.id'})) {
 	return HTTP_NOT_ACCEPTABLE; 
     }
 # ----------------------------------------------------------------- Send header
-    $r->content_type('text/html');
+    &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
 # ----------------------------------------------------- Figure out where we are
     my $uri=$r->uri;
     $uri=~s/\/smpedit$//;
     my $symb=&Apache::lonnet::symbread($uri);
 
+# ------------------------------------------------ Prefix for everything stored
+    $prefix=$ENV{'request.course.id'}.'.'.$symb.'.0.';
 # ---------------------------------------------------------- Anything to store?
 
-    if (($symb) && ($ENV{'form.storeproblem'})) {
+    if (($symb) && (defined($ENV{'form.questiontype'}))) {
         my %storecontent=();
         undef %storecontent;
+        if ($ENV{'form.questiontype'} eq 'option') {
+	    my %curoptions=&evaloptionhash($ENV{'form.options'});
+	    if ($ENV{'form.delopt'}) {
+		delete $curoptions{$ENV{'form.delopt'}};
+	    }
+	    if ($ENV{'form.newopt'}) {
+		$ENV{'form.newopt'}=~s/\'/\\\'/g;
+                $curoptions{$ENV{'form.newopt'}}=$ENV{'form.newopt'};
+	    }
+            $ENV{'form.options'}="('".join("','",keys %curoptions)."')";
+	}
+	$ENV{'form.hiddenparts'}='!'.$ENV{'form.questiontype'};
         foreach (keys %ENV) {
 	    if ($_=~/^form\.(\w+)$/) {
-		my $spnam=$1;
-		my $symbparm=$symb.'.'.$spnam;
-	
-		my $courselevelr=$ENV{'request.course.id'}.'.'.$symbparm;
-
-		$storecontent{$courselevelr}=$ENV{'form.'.$spnam};;
+                my $parm=$1;
+		$storecontent{$prefix.$parm}=$ENV{'form.'.$parm};
+                $storecontent{$prefix.$parm}=~s/^\s+//s;
+		$storecontent{$prefix.$parm}=~s/\s+$//s;
 	    }
 	}
 	my $reply=&Apache::lonnet::cput
@@ -127,6 +184,13 @@ sub handler {
 	     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
 
     }
+# ------------------------------------------------------------------- Read Data
+
+    %qparms=&Apache::lonnet::dump('resourcedata',
+		     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+		     $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
+		     $ENV{'request.course.id'}.'.'.$symb);
+
 # ------------------------------------------------------------ Print the screen
     $r->print(<<ENDDOCUMENT);
 <html>
@@ -136,17 +200,96 @@ ENDDOCUMENT
     $r->print(&Apache::loncommon::bodytag('Simple Problem Editor'));
     if ($symb) {
 	$r->print('<h1>'.&Apache::lonnet::gettitle($symb).'</h1>');
-#
-#
-	$r->print(&questiontext('What color?').
-                  &foil(3,'green','bottom','Tomato',
-                  ('green'=>'green','red'=>'red')).
-		  &hint('This is the hint.'));
-#
-#
+	$r->print('<table border="2" bgcolor="#FFFFFF" width="100%"><tr><td>'.
+                  &rawrendering($r,$uri).
+                  '</td></tr></table><br />');
+        $r->print('<form method="post">');
+# Question Type        
+	my %questiontypes=('radio'  => 
+                               '1 out of N multiple choice (radio button)',
+			   'option' => 'Option response',
+                           'string' => 'Short string response',
+                           'essay'  => 'Essay, open end');
+        $qtype=$qparms{$prefix.'questiontype'};
+        unless (defined($qtype)) { $qtype='radio'; }
+        unless ($questiontypes{$qtype}) { $qtype='radio'; }
+        $r->print('<b>Question Type: '.&Apache::loncommon::select_form
+	                               ($qtype,'questiontype',%questiontypes).
+  '</b><br /><input type="submit" value="'.&mt('Store Changes').
+  '" /><p>&nbsp;</p>');
+# Question Text
+        $r->print(&questiontext());
+# Radio, Option ===
+	if (($qtype eq 'radio') || ($qtype eq 'option')) {
+# Response
+            my $maxfoils=$qparms{$prefix.'maxfoils'};
+            unless (defined($maxfoils)) { $maxfoils=10; }
+            unless ($maxfoils=~/^\d+$/) { $maxfoils=10; }
+            if ($maxfoils<=0) { $maxfoils=10; }
+	    my %randomizes=('yes' => 'Display foils in random order',
+			    'no'  => 'Display foils in order given');
+	    my $randomize=$qparms{$prefix.'randomize'};
+            unless (defined($randomize)) { $randomize='yes'; }
+            unless ($randomizes{$randomize}) { $randomize='yes'; }
+	    $r->print(
+		  '<table bgcolor="#00ee44" cellspacing="4" cellpadding="2">'.
+	          '<tr><td>'.&mt('Max number of foils displayed').
+': <input type="text" size="3" name="maxfoils" value="'.$maxfoils.'" />&nbsp;&nbsp;'.
+		      &Apache::loncommon::select_form
+		      ($randomize,'randomize',%randomizes).
+		  '</td></tr><tr><td bgcolor="#AAAAAA">');
+# Option Response: Options
+	    if ($qtype eq 'option') {
+		my $options=$qparms{$prefix.'options'};
+                unless (defined($options)) { $options="('true','false')"; }
+                my %optionshash=&evaloptionhash($options);
+		$r->print(
+		  '<table bgcolor="#ffcc22" cellspacing="4" cellpadding="2">'.
+		  '<tr><td><input type="hidden" name="options" value="'.
+                  $options.'" />Add new option: '.
+          '<input type="text" name="newopt" size="15" />'.
+          &mt('Delete an option').': '.
+          &Apache::loncommon::select_form('','delopt',('' => '',%optionshash)).
+          '</td></tr><tr><td>');
+	    }
+# Foils
+	    for (my $i=1;$i<=10;$i++) {
+		$r->print(&foil($i));
+	    }
+# End Options
+	    if ($qtype eq 'option') {
+		$r->print('</td></tr></table>');
+	    }
 
+# End Response
+	    $r->print('</td></tr></table><br />');
+# Hint
+	    $r->print(&hint());
+	}
+	if ($qtype eq 'string') {
+            my %stringtypes=(
+	       'cs' => 'Case sensitive',
+	       'ci' => 'Case Insensitive',
+	       'mc' => 'Multiple Choice, Order of characters unchecked');
+            my $stringanswer=$qparms{$prefix.'stringanswer'};
+            unless (defined($stringanswer)) { $stringanswer=''; }
+            my $stringtype=$qparms{$prefix.'stringtype'};
+            unless (defined($stringtype)) { $stringtype='cs'; }
+            unless ($stringtypes{$stringtype}) { $stringtype='cs'; }
+	    $r->print(
+		  '<table bgcolor="#00ee44" cellspacing="4" cellpadding="2">'.
+	          '<tr><td>'.&mt('Correct answer').': <input type="text" size="20" name="stringanswer" value="'.$stringanswer.'" />&nbsp;&nbsp;'.
+		      &Apache::loncommon::select_form
+		      ($stringtype,'stringtype',%stringtypes).
+		  '</td></tr></table><br />');
+# Hint
+	    $r->print(&hint());
+	}
+# Store Button
+	$r->print(
+  '<input type="submit" value="'.&mt('Store Changes').'" /></form>');
     } else {
-	$r->print('Could not identify problem.');
+	$r->print(&mt('Could not identify problem.'));
     }
     $r->print('</body></html>');
     return OK;