--- loncom/imspackages/imsprocessor.pm	2006/04/04 17:42:28	1.36
+++ loncom/imspackages/imsprocessor.pm	2007/09/30 13:20:08	1.41
@@ -2178,6 +2178,10 @@ sub parse_webctvista4_assessment {
         my ($tagname, $attr) = @_;
         push @state, $tagname;
         my @seq = ();
+        if ("@state" eq "questestinterop assessment") {
+            $$qzparams{$res}{id} = $attr->{'ident'};
+            $$qzparams{$res}{title} = $attr->{'title'};
+        }
         if ("@state" eq "questestinterop assessment section itemref") {
             $id = $attr->{linkrefid};
             push(@{$allids},$id);
@@ -2186,7 +2190,6 @@ sub parse_webctvista4_assessment {
         if ("@state" eq "questestinterop assessment section selection_ordering order") {
            $$qzparams{$res}{order_type} = $attr->{order_type};
         }
-
      }, "tagname, attr"],
      text_h =>
      [sub {
@@ -2267,6 +2270,7 @@ sub parse_webctvista4_question {
     my $currindex;
     my %varinfo = ();
     my $formula;
+    my $jumbnum = 0;
     my $p = HTML::Parser->new
     (
      xml_mode => 1,
@@ -2332,6 +2336,8 @@ sub parse_webctvista4_question {
             %{$$settings{$id}{$list}} = ();
             @{$$allanswers{$id}{$list}} = ();
             @{$$settings{$id}{$list}{correctanswer}} = ();
+            @{$$settings{$id}{$list}{jumbledtext}} = ();
+            @{$$settings{$id}{$list}{jumbledtype}} = ();
             @{$$settings{$id}{$list}{jumbled}} = ();
             $$settings{$id}{$list}{rcardinality} = $attr->{rcardinality};
         }
@@ -2350,12 +2356,20 @@ sub parse_webctvista4_question {
             $currtexttype = lc($attr->{texttype});
             $$settings{$id}{$list}{$jumble_item}{texttype} = $currtexttype;
         }
+        if ("@state" eq "questestinterop item resprocessing respcondition") { # Jumbled
+            if ($$settings{$id}{class} eq 'jumbled') {
+                $jumbnum ++;
+                @{$$settings{$id}{$list}{jumbled}[$jumbnum]} = (); 
+            }
+        }
+
         if ("@state" eq "questestinterop item resprocessing respcondition conditionvar and varequal") { # Jumbled
             $currindex = $attr->{index};
         }
         if ("@state" eq "questestinterop item presentation flow response_lid render_choice") {
             $$settings{$id}{$list}{randomize} = $attr->{shuffle};
         }
+# Multiple Choice, True/False and Combination
         if ("@state" eq "questestinterop item presentation flow response_lid render_choice flow_label response_label") {
             $answer_id = $attr->{ident};
             push(@{$$allanswers{$id}{$list}},$answer_id);
@@ -2403,7 +2417,7 @@ sub parse_webctvista4_question {
             %{$$settings{$id}{$str_id}{$label}} = ();
             $$settings{$id}{$str_id}{$label}{fibtype} = $fibtype;
             if ($$settings{$id}{class} eq 'string') {
-                $$settings{$id}{text} .= '[blank]';
+                $$settings{$id}{text} .= '________';
             }
         }
         if ("@state" eq "questestinterop item presentation flow response_str render_fib response_label material mattext") { # Paragraph
@@ -2414,6 +2428,7 @@ sub parse_webctvista4_question {
             $grp = $attr->{ident};
             push(@{$$settings{$id}{grps}},$grp);
             %{$$settings{$id}{$grp}} = ();
+            @{$$allanswers{$id}{$grp}} = ();
             @{$$settings{$id}{$grp}{correctanswer}} = ();
             $$settings{$id}{$grp}{rcardinality} = $attr->{rcardinality};
         }
@@ -2421,7 +2436,7 @@ sub parse_webctvista4_question {
             $currtexttype = lc($attr->{texttype});
             $$settings{$id}{$grp}{texttype} = $currtexttype;
         }
-        if ("@state" eq "questestinterop item presentation flow flow response_grp render_choice response_label") {
+        if ("@state" eq "questestinterop item presentation flow flow response_grp render_choice flow_label response_label") {
             $answer_id = $attr->{ident};
             push(@{$$allanswers{$id}{$grp}},$answer_id);
             %{$$settings{$id}{$grp}{$answer_id}} = ();
@@ -2436,6 +2451,7 @@ sub parse_webctvista4_question {
             } elsif (($$settings{$id}{class} eq 'string') ||
                      ($$settings{$id}{class} eq 'shortanswer')) {
                 $label = $attr->{respident};
+                $$settings{$id}{$label}{case} = $attr->{'case'};
             } elsif ($$settings{$id}{class} eq 'match') {
                 $grp = $attr->{respident};
             }
@@ -2535,18 +2551,22 @@ sub parse_webctvista4_question {
                 $$settings{$id}{$str_id}{$label}{$textlabel} = $text;
             }
         }
+# Matching
         if ("@state" eq "questestinterop item presentation flow response_lid render_choice flow_label response_label material mattext") {
             $$settings{$id}{$list}{$answer_id}{text} .= $text;
         }
+# Multiple choice, True/False, Combination
         if ("@state" eq "questestinterop item presentation flow response_lid render_choice flow_label response_label material mat_extension webct:localizable_mattext") {
             $$settings{$id}{$list}{$answer_id}{text} = $text;
         }
         if ("@state" eq "questestinterop item presentation flow response_lid render_extension ims_render_object material mattext")  {
-            $$settings{$id}{$list}{text} .= $text;
+            push(@{$$settings{$id}{$list}{jumbledtext}},$text);
+            push(@{$$settings{$id}{$list}{jumbledtype}},'No');
         }
         if ("@state" eq "questestinterop item presentation flow response_lid render_extension ims_render_object response_label material mattext")  {
             $$settings{$id}{$list}{$jumble_item}{text} = $text;
-            $$settings{$id}{$list}{text} .= $text;
+            push(@{$$settings{$id}{$list}{jumbledtext}},$text);
+            push(@{$$settings{$id}{$list}{jumbledtype}},'Yes');
         }
         if ("@state" eq "questestinterop item presentation flow material mattext")  {
             $$settings{$id}{text} .= $text;
@@ -2559,6 +2579,17 @@ sub parse_webctvista4_question {
                 }
             }
         }
+# Matching
+        if ("@state" eq "questestinterop item presentation flow flow response_grp material mattext")  {
+            $$settings{$id}{$grp}{text} = $text;
+            unless ($text eq '') {
+                push(@{$$allchoices{$id}},$grp);
+            }
+        }
+        if ("@state" eq "questestinterop item presentation flow flow response_grp render_choice flow_label response_label material mattext") {
+            $$settings{$id}{$grp}{$answer_id}{text} = $text;
+        }
+# Numerical
         if ("@state" eq "questestinterop item resprocessing itemproc_extension unit_eval conditionvar varequal") {
             $$settings{$id}{$numid}{$unitid}{text} = $text;
         }
@@ -2582,8 +2613,9 @@ sub parse_webctvista4_question {
                 }
             }
         }
+
         if ("@state" eq "questestinterop item resprocessing respcondition conditionvar and varequal") { # Jumbled
-            $$settings{$id}{$list}{jumbled}[$currindex] = $text;
+            $$settings{$id}{$list}{jumbled}[$jumbnum][$currindex] = $text;
         }
         if ("@state" eq "questestinterop item resprocessing respcondition setvar") {
             if ($setvar{varname} eq "SCORE") { # Multiple Choice, String or Match
@@ -2802,6 +2834,12 @@ sub parse_webct4_questionDB {
             $$settings{$id}{texttype} = $attr->{texttype};
             $currtexttype = $attr->{texttype};
         }
+        if ("@state" eq "questestinterop section item presentation flow material matimage") {
+            $$settings{$id}{imagtype} = $attr->{imagtype};
+            $currimagtype = $attr->{imagtype};
+            $$settings{$id}{uri} = $attr->{uri};
+
+        }
         if ("@state" eq "questestinterop section item presentation flow response_lid") {
             $$settings{$id}{class} = 'multiplechoice';
             $list = $attr->{ident};
@@ -3021,12 +3059,18 @@ sub parse_webct4_questionDB {
             }
         }
         if ("@state" eq "questestinterop section item resprocessing respcondition setvar") {
-            if ($setvar{varname} eq "answerValue") { # Multiple Choice
+            if ($setvar{varname} eq "answerValue") { # Multiple Choice WebCT4.0
                 if ($text =~ m/^\d+$/) {
                     if ($text > 0) {
                         push(@{$$settings{$id}{$list}{correctanswer}},$answer_id);   
                     }
                 }
+            } elsif ($setvar{varname} eq "que_score") { # Multiple Choice WebCT4.1
+                if ($text =~ m/^\d+$/) {
+                    if ($text > 0) {
+                        push(@{$$settings{$id}{$list}{correctanswer}},$answer_id);
+                    }
+                }
             }
         }
         if ("@state" eq "questestinterop section item resprocessing itemproc_extension webct:x_webct_v01_autocalculate webct:x_webct_v01_anstolerance") {
@@ -3112,21 +3156,22 @@ sub process_assessment {
         unless($$dbparse) {
             foreach my $res (sort keys %{$allquestions}) {
                 my $parent = $$allquestions{$res};
-                &parse_webctvista4_question($res,$docroot,$resources,$hrefs,$settings,\@allquestids,\%allanswers,\%allchoices,$parent,$catinfo);
+                &parse_webctvista4_question($res,$docroot,$resources,$hrefs,$qzdbsettings,\@allquestids,\%allanswers,\%allchoices,$parent,$catinfo);
             }
             &build_category_sequences($destdir,$catinfo,$sequencesfiles,$pagesfiles,$destresdir,$newdir,$cms,$total,$randompickflag,$context,$udom,$uname,$dirname,$cid,$cdom,$cnum,$qzdbsettings);
             $$dbparse = 1;
         }
-        &parse_webctvista4_assessment($res,$docroot,$hrefs,\@allids,\%qzparams);
+        &parse_webctvista4_assessment($res,$docroot,$$resources{$res}{file},\@allids,\%qzparams);
         if ($qzparams{$res}{numpick} < @allids) {
             $$randompicks{$$resources{$res}{revitm}} = $qzparams{$res}{numpick};
             $randompickflag = 1;
         }
     }
     my $dirtitle;
-    unless ($cms eq 'webctce4') {
+    unless ($cms eq 'webctce4' || $cms eq 'webctvista4') {
         $dirtitle = $$settings{'title'};
-        $dirtitle =~ s/\W//g;
+        $dirtitle =~ s/\s+/_/g;
+        $dirtitle =~ s/:/_/g;
         $dirtitle .= '_'.$res;
         if (!-e "$destdir/problems") {
             mkdir("$destdir/problems",0755);
@@ -3140,14 +3185,14 @@ sub process_assessment {
     if ($cms eq 'webctce4') {
         &build_problem_container($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@allids,$udom,$uname,$dirname,\$containerdir,$cid,$cdom,$cnum,$catinfo,$qzdbsettings);
     } else {
-        &build_problem_container($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@allids,$udom,$uname,$dirname,\$containerdir,$cid,$cdom,$cnum,$catinfo,$settings);
+        &build_problem_container($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@allids,$udom,$uname,$dirname,\$containerdir,$cid,$cdom,$cnum,$catinfo,$qzdbsettings,\%qzparams);
     }
     if ($cms eq 'bb5') {
         &write_bb5_questions(\@allids,$containerdir,$context,$settings,$dirname,$destdir,$res,\%allanswers,\%allchoices,$total,$newdir,$cid,$cdom,$cnum,$docroot);
     } elsif ($cms eq 'bb6') {
         &write_bb6_questions(\@allids,$containerdir,$context,$settings,$dirname,$destdir,$res,$total,$newdir,$cid,$cdom,$cnum,$docroot);
     } elsif ($cms eq 'webctvista4') {
-        &write_webct4_questions($cms,\@allquestids,$context,$settings,$dirname,\%allanswers,\%allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo);
+        &write_webct4_questions($cms,\@allquestids,$context,$qzdbsettings,$dirname,\%allanswers,\%allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo,$dirtitle);
     }
 }
 
@@ -3163,9 +3208,14 @@ sub build_category_sequences {
     open($fh,">$destdir/sequences/question_database.sequence");
     push @{$sequencesfiles},'question_database.sequence';
     foreach my $category (sort keys %{$catinfo}) {
-        my $seqname = $$catinfo{$category}{title}.'_'.$category;
-        $seqname =~ s/\s/_/g;
-        $seqname =~ s/\W//g;
+        my $seqname;
+        if ($cms eq 'webctce4') { 
+            $seqname = $$catinfo{$category}{title}.'_'.$category;
+        } else {
+            $seqname = $$catinfo{$category}{title};
+        }
+        $seqname =~ s/\s+/_/g;
+        $seqname =~ s/:/_/g;
         push(@{$sequencesfiles},$seqname.'.sequence');
         my $catsrc = "$destresdir/sequences/$seqname.sequence";
         if ($curr_id == 0) {
@@ -3203,28 +3253,35 @@ sub build_category_sequences {
 }
 
 sub build_problem_container {
-    my ($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,$allids,$udom,$uname,$dirname,$containerdir,$cid,$cdom,$cnum,$catinfo,$settings) = @_;
+    my ($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,$allids,$udom,$uname,$dirname,$containerdir,$cid,$cdom,$cnum,$catinfo,$settings,$qzparams) = @_;
     my $seqdir = "$destdir/sequences";
     my $pagedir = "$destdir/pages";
     my $curr_id = 0;
     my $next_id = 1;
     my $fh;
+    my $mapname = $res;
+    if ($cms eq 'webctvista4' && ref($$qzparams{$res}) eq 'HASH') {
+        if ($$qzparams{$res}{title}) {
+            $mapname = $$qzparams{$res}{title};
+            $mapname =~ s/\s+/_/g;
+        }
+    }
     if ($container eq 'pool' || $randompickflag || $container eq 'database') {
-        $$containerdir = $seqdir.'/'.$res.'.sequence';
+        $$containerdir = $seqdir.'/'.$mapname.'.sequence';
         if (!-e "$seqdir") {
             mkdir("$seqdir",0770);
         }
         open($fh,">$$containerdir");
         $$total{seq} ++;
-        push @{$sequencesfiles},$res.'.sequence';
+        push @{$sequencesfiles},$mapname.'.sequence';
     } else {
-        $$containerdir = $pagedir.'/'.$res.'.page';
+        $$containerdir = $pagedir.'/'.$mapname.'.page';
         if (!-e "$destdir/pages") {
             mkdir("$destdir/pages",0770);
         }
         open($fh,">$$containerdir");
         $$total{page} ++;
-        push @{$pagesfiles},$res.'.page';
+        push @{$pagesfiles},$mapname.'.page';
     }
     print $fh qq|<map>
 |;
@@ -3237,16 +3294,26 @@ sub build_problem_container {
             } else {
                 $probtitle{$id} = $$settings{title};
             }
-            $probtitle{$id} =~ s/\s/_/g;
-            $probtitle{$id} =~ s/\W//g;
+            $probtitle{$id} =~ s/\s+/_/g;
+            $probtitle{$id} =~ s/:/_/g;
             $probtitle{$id} .= '_'.$id;
         }
-        if ($cms eq 'webctce4' && $container ne 'database') {
+        if (($cms eq 'webctce4' && $container ne 'database') ||
+            ($cms eq 'webctvista4'))   {
+            my $probdir;
             my $catid = $$settings{$$allids[0]}{category};
-            my $probdir = $$catinfo{$catid}{title}.'_'.$catid;
-            $probdir =~ s/\s/_/g;
-            $probdir =~ s/\W//g;
-            $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[0]}.problem";
+            if ($catid) {
+                if ($cms eq 'webctce4') { 
+                    $probdir = $$catinfo{$catid}{title}.'_'.$catid;
+                } else {
+                    $probdir = $$catinfo{$catid}{title};
+                }
+                $probdir =~ s/\s+/_/g;
+                $probdir =~ s/:/_/g;
+                $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[0]}.problem";
+            } else {
+                $probsrc="$dirname/problems/$dirtitle/$probtitle{$$allids[0]}.problem";
+            }
         } else {
             $probsrc="$dirname/problems/$dirtitle/$probtitle{$$allids[0]}.problem";
         }
@@ -3265,12 +3332,22 @@ sub build_problem_container {
             $curr_id = $j;
             $next_id = $curr_id + 1;
             if ($context eq 'CSTR') {
-                if ($cms eq 'webctce4' && $container ne 'database') {
+                if (($cms eq 'webctce4' && $container ne 'database') ||
+                    ($cms eq 'webctvista4')) {
+                    my $probdir;
                     my $catid = $$settings{$$allids[$j]}{category};
-                    my $probdir = $$catinfo{$catid}{title}.'_'.$catid;
-                    $probdir =~ s/\s/_/g;
-                    $probdir =~ s/\W//g;
-                    $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[$j]}.problem";
+                    if ($catid) {
+                        if ($cms eq 'webctce4') {
+                            $probdir = $$catinfo{$catid}{title}.'_'.$catid;
+                        } else {
+                            $probdir = $$catinfo{$catid}{title};
+                        }
+                        $probdir =~ s/\s/_/g;
+                        $probdir =~ s/:/_/g;
+                        $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[$j]}.problem";
+                    } else {
+                        $probsrc = "$dirname/problems/$dirtitle/$probtitle{$$allids[$j]}.problem";
+                    }
                 } else {
                     $probsrc = "$dirname/problems/$dirtitle/$probtitle{$$allids[$j]}.problem";
                 }
@@ -3656,7 +3733,7 @@ sub write_bb5_questions {
             $title =~ s/\s/_/g;
             $title =~ s/\W//g;
             $title .= '_'.$id;
-            open(PROB,">:utf8", "$newdir/$title.problem");
+            open(PROB,">$newdir/$title.problem");
             print PROB $output;
             close PROB;
         } else {
@@ -3668,7 +3745,7 @@ sub write_bb5_questions {
 }
 
 sub write_webct4_questions {
-    my ($cms,$alldbquestids,$context,$settings,$dirname,$allanswers,$allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo) = @_;
+    my ($cms,$alldbquestids,$context,$settings,$dirname,$allanswers,$allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo,$dirtitle) = @_;
     my $qnum = 0;
     foreach my $id (@{$alldbquestids}) {
         $qnum ++;
@@ -3691,7 +3768,7 @@ sub write_webct4_questions {
         if ($$settings{$id}{class} eq 'numerical') {
             foreach my $numid (@{$$settings{$id}{numids}}) {
                 foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) {
-                    if ($cms eq 'webct4ce') {
+                    if ($cms eq 'webctce4') {
                         $$settings{$id}{text} =~ s/{($var)}/\$$1 /g;
                     } elsif ($cms eq 'webctvista4') {
                         $$settings{$id}{text} =~ s/\[($var)\]/\$$1 /g;
@@ -3717,8 +3794,9 @@ sub write_webct4_questions {
             }
         }
         $$total{prob} ++;
+
         if (exists($$settings{$id}{uri})) {
-            if ($cms eq 'webct4ce') {
+            if ($cms eq 'webctce4') {
                 if ($$settings{$id}{imagtype} =~ /^image\//) {
                     $questionimage = '<p><img src="../../resfiles/'.$$settings{$id}{uri}.'" /></p>'."\n";
                 } else {
@@ -3749,6 +3827,62 @@ sub write_webct4_questions {
                 $resourcedata{$symb.'hiddenparts'} = '!essay';
                 $resourcedata{$symb.'questiontype'} = 'essay';
             }
+        } elsif ($$settings{$id}{class} eq 'jumbled') {
+            if ($context eq 'CSTR') {
+                my %foiloptions = ();
+                foreach my $list (@{$$settings{$id}{lists}}) {
+                    @{$foiloptions{$list}} = ();
+                    my $numalternates = @{$$settings{$id}{$list}{jumbled}} - 1;
+                    my $loopstop = 2; #Hard coded for now, so only one permutation of answers is correct; <or> functionality is needed to support the case where multiple permutations are correct.  
+                    for (my $i=1; $i<$loopstop; $i++) {  
+                        $foiloptions{$list}[$i]  = '(';
+                        for (my $j=@{$$settings{$id}{$list}{jumbled}[$i]}-1; $j>0; $j--) {
+                            my $jumble_item = $$settings{$id}{$list}{jumbled}[$i][$j];
+                            $foiloptions{$list}[$i] .= "'".$$settings{$id}{$list}{$jumble_item}{text}."',";
+                        }
+                        $foiloptions{$list}[$i] =~ s/,$//;
+                        $foiloptions{$list}[$i] .= ')';
+                        my $jnum = 0; 
+                        for (my $k=0; $k<@{$$settings{$id}{$list}{jumbledtype}}; $k++) {
+                            if ($$settings{$id}{$list}{jumbledtype}[$k] eq 'No') {
+                                $output .= qq|
+<startouttext />
+$$settings{$id}{$list}{jumbledtext}[$k]
+<endouttext />|;
+                            } elsif ($$settings{$id}{$list}{jumbledtype}[$k] eq 'Yes') {
+                                $jnum ++;
+                                my $jumble_item = $$settings{$id}{$list}{jumbled}[$i][$jnum];
+                                $output .= qq|
+<optionresponse max="1" randomize="yes" TeXlayout="horizontal">
+    <foilgroup options="$foiloptions{$list}[$i]">
+        <foil location="random" value="$$settings{$id}{$list}{$jumble_item}{text}" name="$jumble_item"></foil>
+    </foilgroup>
+</optionresponse>
+|;
+                            }
+                        }
+                    }
+                    if ($numalternates > 0) { # for now alternates are stored in an instructorcomment.  In the future these alternates could be moved into the main response area once <or> functionality is available.
+                        $output .= '<instructorcomment>(Not shown to students) '."\n".'The following alternates were imported from the corresponding WebCT Vista 4 jumbled sentence question, but are not included in the LON-CAPA version, because this style of question does not currently support multiple correct solutions.'."\n";
+                        for (my $i=2; $i<@{$$settings{$id}{$list}{jumbled}}; $i++) {
+                            my $altid = $i-1;
+                            my $jnum = 0;
+                            $output .= $altid.'. '; 
+                            for (my $k=0; $k<@{$$settings{$id}{$list}{jumbledtype}}; $k++) {
+                                if ($$settings{$id}{$list}{jumbledtype}[$k] eq 'No') {
+                                    $output .= "$$settings{$id}{$list}{jumbledtext}[$k]" ;
+                                } elsif ($$settings{$id}{$list}{jumbledtype}[$k] eq 'Yes') {
+                                    $jnum ++;
+                                    my $jumble_item = $$settings{$id}{$list}{jumbled}[$i][$jnum];
+                                    $output .= '['.$$settings{$id}{$list}{$jumble_item}{text}.']';
+                                }
+                            }
+                            $output .= " \n";
+                        }
+                        $output .= '</instructorcomment>';
+                    }  
+                }
+            }
         } else {
             if ($context eq 'CSTR') {
                 $output .= qq|<startouttext /><p>$$settings{$id}{text}</p>$questionimage<endouttext />\n|;
@@ -3831,7 +3965,6 @@ sub write_webct4_questions {
                             if ($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{texttype} eq 'text/html') {
                                 $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &HTML::Entities::decode($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text});
                                 $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text});
-
                                 $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~  s#(<img src=")([^>]+)>#$1../../resfiles/$2 />#gi;
                                 $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~  s#</?p>##g;
                             }
@@ -3972,7 +4105,7 @@ sub write_webct4_questions {
                      ($$settings{$id}{class} eq 'shortanswer')) {
                 my $labelnum = 0;
                 my @str_labels = ();
-                if ($cms eq 'webct4ce') {
+                if ($cms eq 'webctce4') {
                     foreach my $str_id (@{$$settings{$id}{str}}) {
                         foreach my $label (@{$$settings{$id}{$str_id}{labels}}) {
                             push(@str_labels,$label);
@@ -4132,7 +4265,7 @@ sub write_webct4_questions {
                             }
                             $increment .= '1';
                         }
-                        if ($cms eq 'webct4ce') { 
+                        if ($cms eq 'webctce4') { 
                             $formula =~ s/{($var)}/(\$$1)/g;
                         } elsif ($cms eq 'webctvista4') {
                             $formula =~ s/\[($var)\]/(\$$1)/g;
@@ -4182,10 +4315,19 @@ sub write_webct4_questions {
             }
         }
         if ($context eq 'CSTR') {
+            my $probdir;
             my $catid = $$settings{$id}{category};
-            my $probdir = $$catinfo{$catid}{title}.'_'.$catid;
-            $probdir =~ s/\s/_/g;
-            $probdir =~ s/\W//g;
+            if ($catid) {
+                if ($cms eq 'webctce4') {
+                    $probdir = $$catinfo{$catid}{title}.'_'.$catid;
+                } else {
+                    $probdir = $$catinfo{$catid}{title};
+                }
+                $probdir =~ s/\s/_/g;
+                $probdir =~ s/://g;
+            } elsif (defined($dirtitle)) {
+                $probdir = $dirtitle;
+            }
             if (!-e "$destdir/problems/$probdir") {
                 mkdir("$destdir/problems/$probdir",0755);
             }
@@ -4193,9 +4335,9 @@ sub write_webct4_questions {
 |;
             my $title = $$settings{$id}{title};
             $title =~ s/\s/_/g;
-            $title =~ s/\W//g;
-            $title .= '_'.$id; 
-            open(PROB,">:utf8", "$destdir/problems/$probdir/$title.problem");
+            $title =~ s/:/_/g;
+            $title .= '_'.$id;
+            open(PROB,">$destdir/problems/$probdir/$title.problem");
             print PROB $output;
             close PROB;
         } else {
@@ -4593,7 +4735,7 @@ sub write_bb6_questions {
             $title =~ s/\s/_/g;
             $title =~ s/\W//g;
             $title .= '_'.$id;
-            open(PROB,">:utf8", "$newdir/$title.problem");
+            open(PROB,">$newdir/$title.problem");
             print PROB $output;
             close PROB;
         } else {