Diff for /loncom/imspackages/imsimport.pm between versions 1.3 and 1.4

version 1.3, 2004/02/24 15:21:16 version 1.4, 2004/02/29 00:55:39
Line 1 Line 1
 package Apache::imsimport;  package Apache::imsimport;
   
   use strict;  use strict;
   use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
   use Apache::loncacc;  use Apache::loncacc;
   use Apache::loncommon();  use Apache::loncommon();
   use Apache::Log();  use Apache::Log();
   use Apache::lonnet;  use Apache::lonnet;
   use HTML::Parser;  use HTML::Parser;
   use HTML::Entities();  use HTML::Entities();
   use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonupload;  use Apache::lonupload;
   use File::Basename();                                                                                              use File::Basename();                                                                                            
 # ---------------------------------------------------------------- Display Control  # ---------------------------------------------------------------- Display Control
 sub display_control {  sub display_control { # figure out what page we're on and where we're heading.
 # figure out what page we're on and where we're heading.  
     my $page = $ENV{'form.page'};      my $page = $ENV{'form.page'};
     my $command = $ENV{'form.go'};      my $command = $ENV{'form.go'};
     my $current_page = &calculate_page($page,$command);      my $current_page = &calculate_page($page,$command);
     return $current_page;      return $current_page;
 }  }
                                                                                                
 # CALCULATE THE CURRENT PAGE  # ---------------------------------------------------------------- Calculate Page 
 sub calculate_page($$) {  sub calculate_page($$) {
     my ($prev,$dir) = @_;      my ($prev,$dir) = @_;
     return 0 if $prev eq '';    # start with first page      return 0 if $prev eq '';
     return $prev + 1 if $dir eq 'NextPage';      return $prev + 1 if $dir eq 'NextPage';
     return $prev - 1 if $dir eq 'PreviousPage';      return $prev - 1 if $dir eq 'PreviousPage';
     return $prev     if $dir eq 'ExitPage';      return $prev     if $dir eq 'ExitPage';
Line 305  Please choose a destination LON-CAPA dir Line 304  Please choose a destination LON-CAPA dir
 END_OF_ONE  END_OF_ONE
 }  }
   
 # ---------------------------------------------------------------- Expand bb5  # ---------------------------------------------------------------- Expand Blackboard 5 imsmanifest 
 sub expand_bb5 {  sub expand_bb5 {
     my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling) = @_;      my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling,$announce_handling) = @_;
     my @state = ();      my @state = ();
     my @seq = "Top";      my @seq = "Top";
     my $lastitem;      my $lastitem;
       my %revitm = ();
     my %resnum = ();      my %resnum = ();
     my %title = ();      my %title = ();
     my %filepath = ();      my %filepath = ();
Line 328  sub expand_bb5 { Line 328  sub expand_bb5 {
     my @timestamp = ();      my @timestamp = ();
     my @boards = ();      my @boards = ();
     my @groups = ();      my @groups = ();
       my @announcements = ();
       my @quizzes = ();
       my @surveys = ();
     my $board_count = 0;      my $board_count = 0;
     my $board_id = time;      my $board_id = time;
     my $totseq = 0;      my $totseq = 0;
     my $totpage = 0;      my $totpage = 0;
       my $totquiz = 0;
       my $totsurv = 0;
     my $totprob = 0;      my $totprob = 0;
     my $docroot = $ENV{'form.newdir'};      my $docroot = $ENV{'form.newdir'};
     if (!-e "$docroot/temp") {      if (!-e "$docroot/temp") {
Line 349  sub expand_bb5 { Line 354  sub expand_bb5 {
             print "$_<br />";              print "$_<br />";
         }          }
         close(OUTPUT);          close(OUTPUT);
     }      } else {
           return 'nozip';
       } 
   
       unless (-e "$docroot/temp/imsmanifest.xml") {
           return 'nomanifest';
       } 
     my $xmlfile = $docroot.'/temp/imsmanifest.xml';      my $xmlfile = $docroot.'/temp/imsmanifest.xml';
     my $p = HTML::Parser->new      my $p = HTML::Parser->new
     (      (
Line 374  sub expand_bb5 { Line 384  sub expand_bb5 {
                     if (("@state" eq $searchstr) && (@state > 3)) {                      if (("@state" eq $searchstr) && (@state > 3)) {
                         my $itm = $attr->{identifier};                          my $itm = $attr->{identifier};
                         $resnum{$itm} = $attr->{identifierref};                          $resnum{$itm} = $attr->{identifierref};
                           $revitm{$resnum{$itm}} = $itm;
                         $title{$itm} = $attr->{title};                          $title{$itm} = $attr->{title};
                           $contentscount{$itm} = 0;
                         if ($start > @seq) {                          if ($start > @seq) {
                             unless ($lastitem eq '') {                              unless ($lastitem eq '') {
                                 push @seq, $lastitem;                                  push @seq, $lastitem;
Line 430  sub expand_bb5 { Line 442  sub expand_bb5 {
     $p->parse_file($xmlfile);      $p->parse_file($xmlfile);
     $p->eof;      $p->eof;
   
     my $topnum = 0;  
     my $destdir = $docroot;      my $destdir = $docroot;
       my $seqstem ="/res/$udom/$uname/$newdir/sequences"; 
     if (!-e "$destdir") {      if (!-e "$destdir") {
         mkdir("$destdir",0755);          mkdir("$destdir",0755);
     }      }
Line 476  sub expand_bb5 { Line 488  sub expand_bb5 {
         } elsif ($type{$key} eq "resource/x-bb-discussionboard") {          } elsif ($type{$key} eq "resource/x-bb-discussionboard") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             unless ($bb_handling eq 'ignore') {              unless ($bb_handling eq 'ignore') {
                 $contentscount{Top} ++;  
                 push @boards, $key;                  push @boards, $key;
                 $timestamp[$board_count] = $board_id;                  $timestamp[$board_count] = $board_id;
                 &process_db($key,$docroot,$destdir,$board_id,$bb_crs,$bb_cdom,$bb_handling,$uname,\%{$resinfo{$key}});                  &process_db($key,$docroot,$destdir,$board_id,$bb_crs,$bb_cdom,$bb_handling,$uname,\%{$resinfo{$key}});
                 $board_id ++;                  $board_id ++;
                 $board_count ++;                  $board_count ++;
             }              }
         } elsif ($type{$key} eq "resource/x-bb-announcement") {  
             %{$resinfo{$key}} = ();  
             &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}});  
         } elsif ($type{$key} eq "assessment/x-bb-pool") {          } elsif ($type{$key} eq "assessment/x-bb-pool") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob);              &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname);
         } elsif ($type{$key} eq "assessment/x-bb-quiz") {          } elsif ($type{$key} eq "assessment/x-bb-quiz") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob);              &process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname);
               push @quizzes, $key;
   
         } elsif ($type{$key} eq "assessment/x-bb-survey") {          } elsif ($type{$key} eq "assessment/x-bb-survey") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob);              &process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname);
               push @surveys, $key;
         } elsif ($type{$key} eq "assessment/x-bb-group") {          } elsif ($type{$key} eq "assessment/x-bb-group") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             $contentscount{Top} ++;  
             push @groups, $key;              push @groups, $key;
             &process_group($key,$docroot,$destdir,\%{$resinfo{$key}});              &process_group($key,$docroot,$destdir,\%{$resinfo{$key}});
         } elsif ($type{$key} eq "resource/x-bb-user") {             } elsif ($type{$key} eq "resource/x-bb-user") {   
Line 505  sub expand_bb5 { Line 515  sub expand_bb5 {
             unless ($users_handling eq 'ignore') {              unless ($users_handling eq 'ignore') {
                 &process_user($key,$docroot,$destdir,\%{$resinfo{$key}},$users_crs,$users_cdom,$users_handling);                  &process_user($key,$docroot,$destdir,\%{$resinfo{$key}},$users_crs,$users_cdom,$users_handling);
             }              }
           } elsif ($type{$key} eq "resource/x-bb-announcement") {
               unless ($announce_handling eq 'ignore') {
                   push @announcements, $key;
                   %{$resinfo{$key}} = ();
                   &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}},\%resinfo,$seqstem,\%revitm);
               }
         }          }
     }      }
       if (@announcements) {
           $contentscount{Top} ++;
       }
       if (@boards) {
           $contentscount{Top} ++;
       }
       if (@quizzes) {
           $contentscount{Top} ++;
           $totquiz = @quizzes;
       }
       if (@surveys) {
           $contentscount{Top} ++;
           $totsurv = @surveys;
       }
   
       my $topnum = 0;
     my $nextnum = 0;      my $nextnum = 0;
     open(TOPFILE,">$destdir/sequences/ims_import.sequence");      open(TOPFILE,">$destdir/sequences/ims_import.sequence");
     print TOPFILE "<map>\n";      print TOPFILE "<map>\n";
Line 522  sub expand_bb5 { Line 553  sub expand_bb5 {
     my %seqflag = ();      my %seqflag = ();
     my %seqcount = ();      my %seqcount = ();
   
       if (@announcements) {
           &process_specials('announcements',\@announcements,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo);
       }
   
     foreach my $key (sort keys %resnum) {      foreach my $key (sort keys %resnum) {
         $pageflag{$key} = 0;          $pageflag{$key} = 0;
         $seqflag{$key} = 0;          $seqflag{$key} = 0;
Line 726  sub expand_bb5 { Line 761  sub expand_bb5 {
             }              }
         }          }
     }      }
     if (@boards > 0) {  
         $topnum ++;      if ($fileopen) {
         print TOPFILE qq|<resource id="$topnum" src="/res/$udom/$uname/$newdir/sequences/bulletinboards.sequence" title="Course Bulletin Boards"|;          if ($areacount == 0) {
         $nextnum = $topnum +1;              print AREAFILE qq|<resource id="1" src="" type="start">
         if ($topnum == 1) {  <link from="1" to="2" index="1"></link>
             print TOPFILE qq| type="start"></resource>  <resource id="2" src="" type="finish">\n|;
 <link from="$topnum" to="$nextnum" index="$topnum"></link>\n|;          } elsif ($areacount == 1) {
             if ($topnum == $contentscount{'Top'}) {              print AREAFILE qq|<resource id="2" src="" type="finish">\n|;
                 print TOPFILE qq|<resource id="$nextnum" src="" type="finish"></resource>\n|;  
             }  
         } else {  
             if ($topnum == $contentscount{'Top'}) {  
                 print TOPFILE qq| type="finish"></resource>\n|;  
             } else {  
                 print TOPFILE qq|></resource>  
 <link from="$topnum" to="$nextnum" index="$topnum"></link>\n|;  
             }  
         }  
         open(BOARD,">$destdir/sequences/bulletinboards.sequence");  
         print BOARD qq|<map>  
 <resource id="1" src="/adm/$udom/$uname/$timestamp[0]/bulletinboard" title="$resinfo{$boards[0]}{title}" type="start"></resource>  
 <link from="1" to="2" index="1"></link>|;  
         if (@boards == 1) {  
             print BOARD qq|  
 <resource id="2" src="" type="finish"></resource>\n|;  
         } else {          } else {
             for (my $i=1; $i<@boards; $i++) {              print AREAFILE qq|$lastentry\n|;
                 print BOARD qq|<resource id="$i" src="/adm/$udom/$uname/$timestamp[$i]/bulletinboard" title="$resinfo{$boards[$i]}{title}"|;  
                 my $curr = $i+1;  
                 my $next = $i+2;  
                 if (@boards == $i) {  
                     print BOARD qq| type="finish"></resource>\n|;  
                 } else {  
                     print BOARD qq|></resource>  
 <link from="$curr" to="$next" index="$next">\n|;  
                 }  
             }  
         }          }
         print BOARD qq|</map>|;          print AREAFILE "</map>\n";
         close(BOARD);          close(AREAFILE);
           $fileopen = 0;
       }
       if (@boards > 0) {
           &process_specials('boards',\@boards,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo);
       }
       if (@quizzes) {
           &process_specials('quizzes',\@quizzes,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo);
       }
       if (@surveys) {
           &process_specials('surveys',\@surveys,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo);
     }      }
     print TOPFILE "</map>";      print TOPFILE "</map>";
     close(TOPFILE);      close(TOPFILE);
Line 797  sub expand_bb5 { Line 815  sub expand_bb5 {
             close(PAGEFILE);              close(PAGEFILE);
         }          }
     }      }
     system(" rm -r $docroot/temp");      system(" rm -r $docroot/temp"); # Need to add sanity checking
     return($totseq,$totpage,$totprob);      return('ok',$totseq,$totpage,$board_count,$totquiz,$totsurv,$totprob);
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard specials - announcements, bulletin boards, quizzes and surveys
   sub process_specials {
       my ($type,$items,$topnum,$contentscount,$destdir,$udom,$uname,$newdir,$timestamp,$resinfo) = @_;
       my $src = '';
       my $itemsrc = '';
       my $nextnum = 0;
       my $seqstem = '/res/'.$udom.'/'.$uname.'/'.$newdir;
       my %seqnames = (
                     boards => 'bulletinboards',
                     quizzes => 'quizzes',
                     surveys => 'surveys',
                     announcements => 'announcements',
                     );
       my %seqtitles = (
                     boards => 'Course Bulletin Boards',
                     quizzes => 'Course Quizzes',
                     surveys => 'Course Surveys',
                     announcements => 'Course Announcements',
                      );
       $$topnum ++;
       if ($type eq 'announcements') {
           $src = "$seqstem/pages/$seqnames{$type}.page";
       } else {
           $src = "$seqstem/sequences/$seqnames{$type}.sequence";
       }     
       print TOPFILE qq|<resource id="$$topnum" src="$src" title="$seqtitles{$type}"|;
       $nextnum = $$topnum +1;
       if ($$topnum == 1) {
           print TOPFILE qq| type="start"></resource>
   <link from="$$topnum" to="$nextnum" index="$$topnum"></link>\n|;
           if ($$topnum == $$contentscount{'Top'}) {
               print TOPFILE qq|<resource id="$nextnum" src="" type="finish"></resource>\n|;
           }
       } else {
           if ($$topnum == $$contentscount{'Top'}) {
               print TOPFILE qq| type="finish"></resource>\n|;
           } else {
               print TOPFILE qq|></resource>
   <link from="$$topnum" to="$nextnum" index="$$topnum"></link>\n|;
           }
       }
   
       if ($type eq "announcements") {
           open(ITEM,">$destdir/pages/$seqnames{$type}.page");
       } else {
           open(ITEM,">$destdir/sequences/$seqnames{$type}.sequence");
       }
   
       if ($type eq 'boards') {
           $itemsrc = "/adm/$udom/$uname/$$timestamp[0]/bulletinboard";
       } elsif ($type eq 'announcements') {
           $itemsrc = "/res/$udom/$uname/$newdir/resfiles/$$items[0].html";
       } else {
           $itemsrc = "/res/$udom/$uname/$newdir/pages/$$items[0].page";
       }
       print ITEM qq|<map>
   <resource id="1" src="$itemsrc" title="$$resinfo{$$items[0]}{title}" type="start"></resource>
   <link from="1" to="2" index="1"></link>|;
       if (@{$items} == 1) {
           print ITEM qq|
   <resource id="2" src="" type="finish"></resource>\n|;
       } else {
           for (my $i=1; $i<@{$items}; $i++) {
               my $curr = $i+1;
               my $next = $i+2;
               if ($type eq 'boards') {
                   $itemsrc = "/adm/$udom/$uname/$$timestamp[$i]/bulletinboard";
               } elsif ($type eq 'announcements') {
                   $itemsrc = "/res/$udom/$uname/$newdir/resfiles/$$items[$i].html";
               } else {
                   $itemsrc = "/res/$udom/$uname/$newdir/pages/$$items[$i].page";
               }
               print ITEM qq|<resource id="$curr" src="$itemsrc" title="$$resinfo{$$items[$i]}{title}"|;
               if (@{$items} == $i+1) {
                   print ITEM qq| type="finish"></resource>\n|;
               } else {
                   print ITEM qq|></resource>
   <link from="$curr" to="$next" index="$next">\n|;
               }
           }
       }
       print ITEM qq|</map>|;
       close(ITEM);
   }
   
   # ---------------------------------------------------------------- Process Blackboard users
 sub process_user {  sub process_user {
   my ($res,$docroot,$destdir,$settings,$user_crs,$user_cdom,$user_handling) = @_;    my ($res,$docroot,$destdir,$settings,$user_crs,$user_cdom,$user_handling) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";    my $xmlfile = $docroot."/temp/".$res.".dat";
Line 883  sub process_user { Line 986  sub process_user {
   }    }
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard groups
 sub process_group {    sub process_group {  
   my ($res,$docroot,$destdir,$settings) = @_;    my ($res,$docroot,$destdir,$settings) = @_;
   my $xmlfile = $docroot."/".$res.".dat";    my $xmlfile = $docroot."/".$res.".dat";
Line 933  sub process_group { Line 1037  sub process_group {
   $p->eof;    $p->eof;
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Staff
 sub process_staff {  sub process_staff {
   my ($res,$docroot,$dirname,$destdir,$settings) = @_;    my ($res,$docroot,$dirname,$destdir,$settings) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";    my $xmlfile = $docroot."/temp/".$res.".dat";
Line 1112  $staffentry Line 1217  $staffentry
     close(FILE);      close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Links
 sub process_link {  sub process_link {
     my ($res,$docroot,$dirname,$destdir,$settings) = @_;      my ($res,$docroot,$dirname,$destdir,$settings) = @_;
     my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
Line 1129  sub process_link { Line 1235  sub process_link {
                 $$settings{textcolor} = $attr->{value};                  $$settings{textcolor} = $attr->{value};
             } elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") {                } elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") {  
                 $$settings{ishtml} = $attr->{value};                                                 $$settings{ishtml} = $attr->{value};                               
             } elsif ("@state" eq "EXTERNALLINKS FLAGS ISAVAILABLE" ) {              } elsif ("@state" eq "EXTERNALLINK FLAGS ISAVAILABLE" ) {
                 $$settings{isavailable} = $attr->{value};                  $$settings{isavailable} = $attr->{value};
             } elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) {              } elsif ("@state" eq "EXTERNALLINK FLAGS LAUNCHINNEWWINDOW" ) {
                 $$settings{newwindow} = $attr->{value};                  $$settings{newwindow} = $attr->{value};
             } elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) {              } elsif ("@state" eq "EXTERNALLINK FLAGS ISFOLDER" ) {
                 $$settings{isfolder} = $attr->{value};                  $$settings{isfolder} = $attr->{value};
             } elsif ("@state" eq "EXTERNALLINKS POSITION" ) {              } elsif ("@state" eq "EXTERNALLINK POSITION" ) {
                 $$settings{position} = $attr->{value};                  $$settings{position} = $attr->{value};
             } elsif ("@state" eq "EXTERNALLINKS URL" ) {              } elsif ("@state" eq "EXTERNALLINK URL" ) {
               $$settings{url} = $attr->{value};                $$settings{url} = $attr->{value};
             }              }
         }, "tagname, attr"],          }, "tagname, attr"],
         text_h =>          text_h =>
         [sub {          [sub {
             my ($text) = @_;              my ($text) = @_;
             if ("@state" eq "EXTERNALLINKS DESCRIPTION TEXT") {              if ("@state" eq "EXTERNALLINK DESCRIPTION TEXT") {
                $$settings{text} = $text;                 $$settings{text} = $text;
             }              }
         }, "dtext"],          }, "dtext"],
Line 1196  $$settings{text} Line 1302  $$settings{text}
     close(FILE);      close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Discussion Boards
 sub process_db {  sub process_db {
     my ($res,$docroot,$destdir,$timestamp,$crs,$cdom,$handling,$uname,$settings) = @_;      my ($res,$docroot,$destdir,$timestamp,$crs,$cdom,$handling,$uname,$settings) = @_;
     my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
Line 1206  sub process_db { Line 1313  sub process_db {
     if ($crs =~ m/^(\d)(\d)(\d)/) {      if ($crs =~ m/^(\d)(\d)(\d)/) {
         $longcrs = $1.'/'.$2.'/'.$3.'/'.$crs;          $longcrs = $1.'/'.$2.'/'.$3.'/'.$crs;
     }      }
     my %threads; # all quotes, keyed by message ID      my %threads; # all threads, keyed by message ID
     my $msg_id; # the current message ID      my $msg_id; # the current message ID
     my %message; # the current message being accumulated for $msg_id      my %message; # the current message being accumulated for $msg_id
   
Line 1381  sub process_db { Line 1488  sub process_db {
     }      }
 }  }
   
   # ---------------------------------------------------------------- Add Posting to Bulletin Board
 sub addposting {  sub addposting {
     my ($symb,$contrib,$cdom,$crs)=@_;      my ($symb,$contrib,$cdom,$crs)=@_;
     my $status='';      my $status='';
     if (($symb) && ($$contrib{message})) {      if (($symb) && ($$contrib{message})) {
        my $crsdom = $cdom.'_'.$crs;           my $crsdom = $cdom.'_'.$crs;
        &Apache::lonnet::store($contrib,$symb,$crsdom,$cdom,$crs);           &Apache::lonnet::store($contrib,$symb,$crsdom,$cdom,$crs);
        my %storenewentry=($symb => time);           my %storenewentry=($symb => time);
        &Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs);           &Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs);
     }      }
     my %record=&Apache::lonnet::restore('_discussion');      my %record=&Apache::lonnet::restore('_discussion');
     my ($temp)=keys %record;      my ($temp)=keys %record;
Line 1403  sub addposting { Line 1511  sub addposting {
     }      }
     return $status;      return $status;
 }  }
   # ---------------------------------------------------------------- Process Blackboard Assessments - pools, quizzes, surveys
 sub process_assessment {  sub process_assessment {
   my ($res,$docroot,$container,$dirname,$destdir,$settings,$totpageref,$totprobref) = @_;      my ($res,$docroot,$container,$dirname,$destdir,$settings,$totpageref,$totprobref,,$udom,$uname) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
 #  print "XML file is $xmlfile\n";  #  print "XML file is $xmlfile\n";
   my @state = ();      my @state = ();
   my @allids = ();      my @allids = ();
   my %allanswers = ();      my %allanswers = ();
   my %allchoices = ();      my %allchoices = ();
   my $id; # the current question ID      my $resdir = '';
   my $answer_id; # the current answer ID      if ($docroot =~ m|public_html/(.+)$|) {
   my %toptag = ( pool => 'POOL',          $resdir = $1;
       }
       my $id; # the current question ID
       my $answer_id; # the current answer ID
       my %toptag = ( pool => 'POOL',
                  quiz => 'ASSESSMENT',                   quiz => 'ASSESSMENT',
                  survey => 'ASSESSMENT'                   survey => 'ASSESSMENT'
                );                 );
 #  print "process_assessment is called, incoming: $res,$docroot,$container,$destdir\n";  
   
   my $p = HTML::Parser->new      my $p = HTML::Parser->new
     (      (
      xml_mode => 1,       xml_mode => 1,
      start_h =>       start_h =>
Line 1431  sub process_assessment { Line 1542  sub process_assessment {
         my @seq = ();          my @seq = ();
         my $class;          my $class;
         my $state_str = join(" ",@state);          my $state_str = join(" ",@state);
 #        print "Current state is $state_str\n";  
         if ($container eq "pool") {          if ($container eq "pool") {
             if ("@state" eq "POOL TITLE") {              if ("@state" eq "POOL TITLE") {
                 $$settings{title} = $attr->{value};                  $$settings{title} = $attr->{value};
 #                print "Title is $attr->{value}\n";  
             }              }
         } else {          } else {
             if ("@state" eq "ASSESSMENT TITLE") {                if ("@state" eq "ASSESSMENT TITLE") {  
Line 1472  sub process_assessment { Line 1581  sub process_assessment {
             @{$$settings{$id}{correctanswer}} = ();                                            @{$$settings{$id}{correctanswer}} = ();                              
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[-1] =~ m/^QUESTION_(\w+)$/) ) {          } elsif ( ($state[0] eq $toptag{$container}) && ($state[-1] =~ m/^QUESTION_(\w+)$/) ) {
             $id = $attr->{id};              $id = $attr->{id};
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") && ($state[4] eq "ISHTML") ) {          } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") ) {
             $$settings{$id}{html} = $attr->{value};              if ($state[4] eq "ISHTML") {
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") && ($state[4] eq "ISNEWLINELITERAL") ) {                  $$settings{$id}{html} = $attr->{value};
             $$settings{$id}{newline} = $attr->{value};              } elsif ($state[4] eq "ISNEWLINELITERAL") {
                   $$settings{$id}{newline} = $attr->{value};
               }
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "IMAGE") ) {          } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "IMAGE") ) {
             $$settings{$id}{image} = $attr->{value};              $$settings{$id}{image} = $attr->{value};
             $$settings{$id}{style} = $attr->{style};              $$settings{$id}{style} = $attr->{style};
Line 1498  sub process_assessment { Line 1609  sub process_assessment {
             $$settings{$id}{$answer_id}{position} = $attr->{position};              $$settings{$id}{$answer_id}{position} = $attr->{position};
             $$settings{$id}{$answer_id}{placement} = $attr->{placement};              $$settings{$id}{$answer_id}{placement} = $attr->{placement};
             $$settings{$id}{$answer_id}{type} = 'choice';              $$settings{$id}{$answer_id}{type} = 'choice';
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "IMAGE") ) {          } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") ) {
             $$settings{$id}{$answer_id}{image} = $attr->{value};              if ($state[3] eq "IMAGE") {
             $$settings{$id}{$answer_id}{style} = $attr->{style};                  $$settings{$id}{$answer_id}{image} = $attr->{value};
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "URL") ) {                  $$settings{$id}{$answer_id}{style} = $attr->{style};
             $$settings{$id}{$answer_id}{url} = $attr->{value};              } elsif ($state[3] eq "URL") {
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "IMAGE") ) {                  $$settings{$id}{$answer_id}{url} = $attr->{value};
             $$settings{$id}{$answer_id}{image} = $attr->{value};              }
             $$settings{$id}{$answer_id}{style} = $attr->{style};          } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") ) {
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "URL") ) {              if ($state[3] eq "IMAGE") {
             $$settings{$id}{$answer_id}{url} = $attr->{value};                              $$settings{$id}{$answer_id}{image} = $attr->{value};
                   $$settings{$id}{$answer_id}{style} = $attr->{style};
               } elsif ($state[3] eq "URL") {
                   $$settings{$id}{$answer_id}{url} = $attr->{value};
               }
         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "CORRECTANSWER") ) {          } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "CORRECTANSWER") ) {
             my $corr_answer = $attr->{answer_id};              my $corr_answer = $attr->{answer_id};
             push @{$$settings{$id}{correctanswer}}, $corr_answer;              push @{$$settings{$id}{correctanswer}}, $corr_answer;
 #            print "Answer $corr_answer for question $id is correct\n";         
             my $type = $1;              my $type = $1;
             if ($type eq 'TRUEFALSE') {              if ($type eq 'TRUEFALSE') {
                 $$settings{$id}{$corr_answer}{answer_position} = $attr->{position};                  $$settings{$id}{$corr_answer}{answer_position} = $attr->{position};
Line 1550  sub process_assessment { Line 1664  sub process_assessment {
         pop @state;          pop @state;
      }, "tagname"],       }, "tagname"],
     );      );
   $p->unbroken_text(1);      $p->unbroken_text(1);
   $p->parse_file($xmlfile);      $p->parse_file($xmlfile);
   $p->eof;      $p->eof;
   
   my $dirtitle = $$settings{'title'};      my $dirtitle = $$settings{'title'};
   $dirtitle =~ s/\W//g;      $dirtitle =~ s/\W//g;
   $dirtitle .= '_'.$res;      $dirtitle .= '_'.$res;
   if (!-e "$destdir/problems/$dirtitle") {      if (!-e "$destdir/problems/$dirtitle") {
       mkdir("$destdir/problems/$dirtitle",0755);          mkdir("$destdir/problems/$dirtitle",0755);
   }      }
   my $newdir = "$destdir/problems/$dirtitle";      my $newdir = "$destdir/problems/$dirtitle";
   my $pagedir = "$destdir/pages";      my $pagedir = "$destdir/pages";
   my $curr_id = 0;      my $curr_id = 0;
   my $next_id = 0;      my $next_id = 1;
   unless ($container eq 'pool') {      unless ($container eq 'pool') {
       open(PAGEFILE,">$pagedir/$res.page");          open(PAGEFILE,">$pagedir/$res.page");
       print PAGEFILE qq|<map>          print PAGEFILE qq|<map>
 |;  |;
       $$totpageref ++;           $$totpageref ++; 
   }          print PAGEFILE qq|<resource id="1" src="/res/$udom/$uname/$resdir/problems/$dirtitle/$allids[0].problem" type="start"></resource>|;
   foreach my $id (@allids) {          if (@allids == 1) {
       $curr_id ++;              print PAGEFILE qq|
       $next_id = $curr_id + 1;  <link from="1" to="2" index="1"></link>
       if ($curr_id == 0) {  
           print PAGEFILE qq|<resource id="1" src="$newdir/$id.problem" type="start"></resource>\n|;  
       } else {  
           print PAGEFILE qq|  
 <link from="$curr_id" to="$next_id" index="$curr_id"></link>  
 <resource id="$curr_id" src="$newdir/$id.problem"|;  
           $curr_id ++;  
           $next_id = $curr_id + 1;  
           if ($curr_id == @allids) {  
               print PAGEFILE qq| type="finish"></resource>\n|;  
           } else {  
               print PAGEFILE qq|></resource>|;  
           }  
       }  
 #      print "Current ID is $id, type is $$settings{$id}{class} \n";  
       if (@allids == 1) {  
           print PAGEFILE qq|<link from="1" to="2" index="1"></link>  
 <resource id="2" src="" type="finish">\n|;  <resource id="2" src="" type="finish">\n|;
       }  
   
       my $output = qq|<problem>  
 |;  
       $$totprobref ++;  
       if ($$settings{$id}{class} eq "QUESTION_ESSAY") {  
           $output .= qq|<startouttext />$$settings{$id}{text}<endouttext />  
    <essayresponse>  
    <textfield></textfield>  
    </essayresponse>  
    <postanswerdate>  
    $$settings{$id}{feedbackcorr}  
    </postanswerdate>  
 |;  
       } else {  
     $output .= qq|<startouttext />$$settings{$id}{text}\n|;  
     if ( defined($$settings{$id}{image}) ) {   
         if ( $$settings{$id}{style} eq 'embed' ) {  
             $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{image}" /><br />|;  
         } else {          } else {
             $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{image}">Link to file</a><br />|;              for (my $j=1; $j<@allids; $j++) {
                   $curr_id = $j;
                   $next_id = $curr_id + 1;
                   print PAGEFILE qq|
   <link from="$curr_id" to="$next_id" index="$curr_id"></link>
   <resource id="$next_id" src="/res/$udom/$uname/$resdir/problems/$dirtitle/$allids[$j].problem"|;
                   if ($next_id == @allids) {
                       print PAGEFILE qq| type="finish"></resource>\n|;
                   } else {
                       print PAGEFILE qq|></resource>|;
                   }
               }
         }          }
           print PAGEFILE qq|</map>|;
           close(PAGEFILE);
     }      }
     if ( defined($$settings{$id}{url}) ) {      foreach my $id (@allids) {
         $output .= qq|<br /><a href="$$settings{$id}{url}">$$settings{$id}{name}</a><br />|;          my $output = qq|<problem>
     }  |;
     $output .= qq|          $$totprobref ++;
 <endouttext />|;          if ($$settings{$id}{class} eq "QUESTION_ESSAY") {
     if ($$settings{$id}{class} eq 'QUESTION_MULTIPLECHOICE') {              $output .= qq|<startouttext />$$settings{$id}{text}<endouttext />
         my $numfoils = @{$allanswers{$id}};   <essayresponse>
         $output .= qq|   <textfield></textfield>
    <radiobuttonresponse max="$numfoils" randomize="yes">   </essayresponse>
     <foilgroup>   <postanswerdate>
         |;   $$settings{$id}{feedbackcorr}
         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {   </postanswerdate>
             $output .= "   <foil name=\"foil".$k."\" value=\"";  |;
             if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {          } else {
                 $output .= "true\" location=\"";              $output .= qq|<startouttext />$$settings{$id}{text}\n|;
             } else {              if ( defined($$settings{$id}{image}) ) { 
                 $output .= "false\" location=\"";                  if ( $$settings{$id}{style} eq 'embed' ) {
             }                      $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{image}" /><br />|;
             if (lc ($allanswers{$id}[$k]) =~ m/^\s?([Aa]ll)|([Nn]one)\sof\sthe\sabove\.?/) {  
                 $output .= "bottom\"";  
             } else {  
                 $output .= "random\"";  
             }  
             $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text};  
             if ( defined($$settings{$id}{$allanswers{$id}[$k]}{image}) ) {  
                 if ( $$settings{$id}{$allanswers{$id}[$k]}{style} eq 'embed' ) {  
                     $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" /><br />|;  
                 } else {                  } else {
                     $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" />Link to file</a><br/>|;                      $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{image}">Link to file</a><br />|;
                 }                  }
             }              }
             $output .= qq|<endouttext /></foil>\n|;              if ( defined($$settings{$id}{url}) ) {
         }                  $output .= qq|<br /><a href="$$settings{$id}{url}">$$settings{$id}{name}</a><br />|;
         chomp($output);              }
         $output .= qq|              $output .= qq|
     </foilgroup>  <endouttext />|;
    </radiobuttonresponse>              if ($$settings{$id}{class} eq 'QUESTION_MULTIPLECHOICE') {
   |;                  my $numfoils = @{$allanswers{$id}};
     } elsif ($$settings{$id}{class} eq 'QUESTION_TRUEFALSE') {                  $output .= qq|
         my $numfoils = @{$allanswers{$id}};   <radiobuttonresponse max="$numfoils" randomize="yes">
 #        print "Number of foils is $numfoils\n";    <foilgroup>
         $output .= qq|  |;
                   for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
                       $output .= "   <foil name=\"foil".$k."\" value=\"";
                       if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
                           $output .= "true\" location=\"";
                       } else {
                           $output .= "false\" location=\"";
                       }
                       if (lc ($allanswers{$id}[$k]) =~ m/^\s?([Aa]ll)|([Nn]one)\sof\sthe\sabove\.?/) {
                           $output .= "bottom\"";
                       } else {
                           $output .= "random\"";
                       }
                       $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text};
                       if ( defined($$settings{$id}{$allanswers{$id}[$k]}{image}) ) {
                           if ( $$settings{$id}{$allanswers{$id}[$k]}{style} eq 'embed' ) {
                               $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" /><br />|;
                           } else {
                               $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" />Link to file</a><br/>|;
                           }
                       }
                       $output .= qq|<endouttext /></foil>\n|;
                   }
                   chomp($output);
                   $output .= qq|
     </foilgroup>
    </radiobuttonresponse>
   |;
               } elsif ($$settings{$id}{class} eq 'QUESTION_TRUEFALSE') {
                   my $numfoils = @{$allanswers{$id}};
                   $output .= qq|
    <radiobuttonresponse max="$numfoils" randomize="yes">     <radiobuttonresponse max="$numfoils" randomize="yes">
     <foilgroup>      <foilgroup>
         |;  |;
         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {                  for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
             $output .= "   <foil name=\"foil".$k."\" value=\"";                      $output .= "   <foil name=\"foil".$k."\" value=\"";
             if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {                      if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
                 $output .= "true\" location=\"random\"";                          $output .= "true\" location=\"random\"";
             } else {                      } else {
                 $output .= "false\" location=\"random\"";                          $output .= "false\" location=\"random\"";
             }                      }
             $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";                      $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
         }                  }
         chomp($output);                  chomp($output);
         $output .= qq|                  $output .= qq|
     </foilgroup>      </foilgroup>
    </radiobuttonresponse>     </radiobuttonresponse>
   |;  |;
     } elsif ($$settings{$id}{class} eq 'QUESTION_MULTIPLEANSWER') {              } elsif ($$settings{$id}{class} eq 'QUESTION_MULTIPLEANSWER') {
         my $numfoils = @{$allanswers{$id}};                  my $numfoils = @{$allanswers{$id}};
 #        print "Number of foils is $numfoils\n";                  $output .= qq|
         $output .= qq|  
    <optionresponse max="$numfoils" randomize="yes">     <optionresponse max="$numfoils" randomize="yes">
     <foilgroup options="('True','False')">      <foilgroup options="('True','False')">
         |;  |;
         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {                  for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
             $output .= "   <foil name=\"foil".$k."\" value=\"";                      $output .= "   <foil name=\"foil".$k."\" value=\"";
             if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {                      if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
                 $output .= "True\"";                          $output .= "True\"";
             } else {                      } else {
                 $output .= "False\"";                          $output .= "False\"";
             }                      }
             $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";                      $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
         }                  }
         chomp($output);                  chomp($output);
         $output .= qq|                  $output .= qq|
     </foilgroup>      </foilgroup>
    </optionresponse>     </optionresponse>
   |;  |;
     } elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') {              } elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') {
         my $numfoils = @{$allanswers{$id}};                  my $numfoils = @{$allanswers{$id}};
         $output .= qq|                  $output .= qq|
    <rankresponse max="$numfoils" randomize="yes">     <rankresponse max="$numfoils" randomize="yes">
     <foilgroup>      <foilgroup>
         |;  |;
         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {                  for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
             $output .= "   <foil location=\"random\" name=\"foil".$k."\" value=\"".$$settings{$id}{$allanswers{$id}[$k]}{order}."\"><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";                      $output .= "   <foil location=\"random\" name=\"foil".$k."\" value=\"".$$settings{$id}{$allanswers{$id}[$k]}{order}."\"><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
         }                  }
         chomp($output);                  chomp($output);
         $output .= qq|                  $output .= qq|
     </foilgroup>      </foilgroup>
    </rankresponse>     </rankresponse>
         |;  |;
     } elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') {              } elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') {
         my $numerical = 1;                  my $numerical = 1;
         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {                  for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
             if ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/([^\d\.]|\.\.)/) {                      if ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/([^\d\.]|\.\.)/) {
                 $numerical = 0;                          $numerical = 0;
             }  
         }  
         if ($numerical) {  
             my $numans;  
             my $tol;  
             if (@{$allanswers{$id}} == 1) {  
                 $tol = 5;  
                 $numans = $$settings{$id}{$allanswers{$id}[0]}{text};  
             } else {  
                 my $min = $$settings{$id}{$allanswers{$id}[0]}{text};  
                 my $max = $$settings{$id}{$allanswers{$id}[0]}{text};  
                 for (my $k=1; $k<@{$allanswers{$id}}; $k++) {  
                     if ($$settings{$id}{$allanswers{$id}[$k]}{text} <= $min) {  
                         $min = $$settings{$id}{$allanswers{$id}[$k]}{text};  
                     }  
                     if ($$settings{$id}{$allanswers{$id}[$k]}{text} >= $max) {  
                         $max = $$settings{$id}{$allanswers{$id}[$k]}{text};  
                     }                      }
                 }                  }
                 $numans = ($max + $min)/2;                  if ($numerical) {
                 $tol = 100*($max - $min)/($numans*2);                      my $numans;
             }                      my $tol;
             $output .= qq|                      if (@{$allanswers{$id}} == 1) {
                           $tol = 5;
                           $numans = $$settings{$id}{$allanswers{$id}[0]}{text};
                       } else {
                           my $min = $$settings{$id}{$allanswers{$id}[0]}{text};
                           my $max = $$settings{$id}{$allanswers{$id}[0]}{text};
                           for (my $k=1; $k<@{$allanswers{$id}}; $k++) {
                               if ($$settings{$id}{$allanswers{$id}[$k]}{text} <= $min) {
                                   $min = $$settings{$id}{$allanswers{$id}[$k]}{text};
                               }
                               if ($$settings{$id}{$allanswers{$id}[$k]}{text} >= $max) {
                                   $max = $$settings{$id}{$allanswers{$id}[$k]}{text};
                               }
                           }
                           $numans = ($max + $min)/2;
                           $tol = 100*($max - $min)/($numans*2);
                       }
                       $output .= qq|
 <numericalresponse answer="$numans">  <numericalresponse answer="$numans">
         <responseparam type="tolerance" default="$tol%" name="tol" description="Numerical Tolerance" />          <responseparam type="tolerance" default="$tol%" name="tol" description="Numerical Tolerance" />
         <responseparam name="sig" type="int_range,0-16" default="0,15" description="Significant Figures"          <responseparam name="sig" type="int_range,0-16" default="0,15" description="Significant Figures"
 />  />
         <textline />          <textline />
 </numericalresponse>  </numericalresponse>
             |;  |;
         } else {                  } else {
             if (@{$allanswers{$id}} == 1) {                      if (@{$allanswers{$id}} == 1) {
                 $output .= qq|                          $output .= qq|
 <stringresponse answer="$$settings{$id}{$allanswers{$id}[0]}{text}" type="ci">  <stringresponse answer="$$settings{$id}{$allanswers{$id}[0]}{text}" type="ci">
 <textline>  <textline>
 </textline>  </textline>
 </stringresponse>  </stringresponse>
             |;  |;
             } else {                      } else {
                 my @answertext = ();                          my @answertext = ();
                 for (my $k=0; $k<@{$allanswers{$id}}; $k++) {                          for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
                     $$settings{$id}{$allanswers{$id}[$k]}{text} =~ s/\|/\|/g;                              $$settings{$id}{$allanswers{$id}[$k]}{text} =~ s/\|/\|/g;
                     push @answertext, $$settings{$id}{$allanswers{$id}[$k]}{text};                              push @answertext, $$settings{$id}{$allanswers{$id}[$k]}{text};
                 }                          }
                 my $regexpans = join('|',@answertext);                          my $regexpans = join('|',@answertext);
                 $regexpans = '/^('.$regexpans.')\b/';                          $regexpans = '/^('.$regexpans.')\b/';
                 $output .= qq|                          $output .= qq|
 <stringresponse answer="$regexpans" type="re">  <stringresponse answer="$regexpans" type="re">
 <textline>  <textline>
 </textline>  </textline>
 </stringresponse>  </stringresponse>
             |;  |;
             }                      }
         }                  }
     } elsif ($$settings{$id}{class} eq "QUESTION_MATCH") {              } elsif ($$settings{$id}{class} eq "QUESTION_MATCH") {
         $output .= qq|                  $output .= qq|
 <matchresponse max="10" randomize="yes">  <matchresponse max="10" randomize="yes">
     <foilgroup>      <foilgroup>
         <itemgroup>          <itemgroup>
 |;  |;
         for (my $k=0; $k<@{$allchoices{$id}}; $k++) {                  for (my $k=0; $k<@{$allchoices{$id}}; $k++) {
             $output .= qq|                      $output .= qq|
 <item name="$allchoices{$id}[$k]">  <item name="$allchoices{$id}[$k]">
 <startouttext />$$settings{$id}{$allchoices{$id}[$k]}{text}<endouttext />  <startouttext />$$settings{$id}{$allchoices{$id}[$k]}{text}<endouttext />
 </item>  </item>
             |;                      |;
         }                  }
         $output .= qq|                  $output .= qq|
         </itemgroup>          </itemgroup>
 |;  |;
         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {                  for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
             $output .= qq|                      $output .= qq|
 <foil location="random" value="$$settings{$id}{$allanswers{$id}[$k]}{choice_id}" name="$allanswers{$id}[$k]">          <foil location="random" value="$$settings{$id}{$allanswers{$id}[$k]}{choice_id}" name="$allanswers{$id}[$k]">
 <startouttext />$$settings{$id}{$allanswers{$id}[$k]}{text}<endouttext />           <startouttext />$$settings{$id}{$allanswers{$id}[$k]}{text}<endouttext />
 </foil>          </foil>
             |;  |;
         }                  }
         $output .= qq|                  $output .= qq|
     </foilgroup>      </foilgroup>
 </matchresponse>  </matchresponse>
         |;  
     }  
       }  
       $output .= qq|</problem>  
 |;  
       open(PROB,">$newdir/$id.problem");  
       print PROB $output;  
       close PROB;  
   }  
   unless ($container eq 'pool') {  
       print PAGEFILE qq|</map>|;  
       close(PAGEFILE);  
   }  
 }  
   
   
 sub create_ess {  
     my ($newdir,$qnid,$qsettings,$container) = @_;  
     my $output;  
     if ($container eq 'pool') {  
         $output = qq|<problem>  
  <startouttext />$$qsettings{text}<endouttext />  
 |;  |;
     } else {              }
         $output = qq|<problem>          }
  <startouttext />$$qsettings{text}<endouttext />  
 |;  
     }  
     $output .= qq|  
    <essayresponse>  
    <textfield></textfield>  
    </essayresponse>  
    <postanswerdate>  
    $$qsettings{feedbackcorr}  
    </postanswerdate>  
 |;  
     if ($container eq 'pool') {  
         $output .= qq|</problem>  
         |;  
         open(PROB,">$newdir/$qnid.problem");  
         print PROB $output;  
         close PROB;  
     } else {  
         $output .= qq|</problem>          $output .= qq|</problem>
         |;  |;
         open(PROB,">$newdir/$qnid.problem");          open(PROB,">$newdir/$id.problem");
         print PROB $output;          print PROB $output;
         close PROB;          close PROB;
     }      }
     return;  
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Announcements
 sub process_announce {  sub process_announce {
   my ($res,$docroot,$destdir,$settings) = @_;      my ($res,$docroot,$destdir,$settings,$globalresref,$seqstem,$revitmref) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
   my @state = ();      my @state = ();
   my @assess = ();      my @assess = ();
   my $id;      my $id;
   my $p = HTML::Parser->new      my $p = HTML::Parser->new
     (      (
      xml_mode => 1,       xml_mode => 1,
      start_h =>       start_h =>
Line 1861  sub process_announce { Line 1932  sub process_announce {
         if ("@state" eq "ANNOUNCEMENT TITLE") {          if ("@state" eq "ANNOUNCEMENT TITLE") {
             $$settings{title} = $attr->{value};              $$settings{title} = $attr->{value};
             $$settings{startassessment} = ();              $$settings{startassessment} = ();
 #            print "Title is $$settings{title}\n";  
         } elsif (@state eq "ANNOUNCEMENT DESCRIPTION FLAGS ISHTML") {            } elsif (@state eq "ANNOUNCEMENT DESCRIPTION FLAGS ISHTML") {  
             $$settings{ishtml} = $attr->{value};                        $$settings{ishtml} = $attr->{value};          
         } elsif ("@state" eq "ANNOUNCEMENT DESCRIPTION FLAGS ISNEWLINELITERAL" ) {          } elsif ("@state" eq "ANNOUNCEMENT DESCRIPTION FLAGS ISNEWLINELITERAL" ) {
             $$settings{isnewline} = $attr->{value};              $$settings{isnewline} = $attr->{value};
         } elsif ("@state" eq "CONTENT ISPERMANENT" ) {          } elsif ("@state" eq "ANNOUNCEMENT ISPERMANENT" ) {
             $$settings{ispermanent} = $attr->{value};              $$settings{ispermanent} = $attr->{value};
           } elsif ("@state" eq "ANNOUNCEMENT DATES UPDATED") {
               $$settings{dates} = $attr->{value}; 
         } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) {          } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) {
             $id = $attr->{id};              $id = $attr->{id};
             %{$$settings{startassessment}{$id}} = ();              %{$$settings{startassessment}{$id}} = ();
Line 1881  sub process_announce { Line 1953  sub process_announce {
      [sub {       [sub {
         my ($text) = @_;          my ($text) = @_;
         if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") {          if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") {
           $$settings{text} = $text;              $$settings{text} = $text;
 #          print "TEXT $text\n";  
         }          }
       }, "dtext"],        }, "dtext"],
      end_h =>       end_h =>
Line 1891  sub process_announce { Line 1962  sub process_announce {
         pop @state;          pop @state;
      }, "tagname"],       }, "tagname"],
     );      );
   $p->unbroken_text(1);      $p->unbroken_text(1);
   $p->parse_file($xmlfile);      $p->parse_file($xmlfile);
   $p->eof;      $p->eof;
   
   if (defined($$settings{text})) {      if (defined($$settings{text})) {
       if ($$settings{ishtml} eq "false") {          if ($$settings{ishtml} eq "false") {
           if ($$settings{isnewline} eq "true") {              if ($$settings{isnewline} eq "true") {
               $$settings{text} =~ s#\n#<br/>#g;                  $$settings{text} =~ s#\n#<br/>#g;
           }              }
       } else {          } else {
           $$settings{text} = &HTML::Entities::decode($$settings{text});              $$settings{text} = &HTML::Entities::decode($$settings{text});
       }          }
   }      }
       
   if (@assess > 0) {      if (@assess > 0) {
       foreach my $id (@assess) {          foreach my $id (@assess) {
           $$settings{text} .= "Please use 'NAV' to locate the link to the folder of problems entitled -";              $$settings{text} = "A $$settings{startassessment}{$id}{assessment_type}, entitled $$globalresref{$$settings{startassessment}{$id}{assessment_id}}{title} is available. Click <a href='$seqstem/$$revitmref{$$settings{startassessment}{$id}{assessment_id}}.sequence'>here</a> to enter the folder the contains the problems in this assessment.";
           foreach my $key (keys %{$$settings{startassessment}{$id}}) {          }
 #              print STDERR "Quiz announcement - $id, key: $key, value: $$settings{startassessment}{$id}{$key}\n";      }
           }  
       }  
   }  
   
   open(FILE,">$destdir/resfiles/$res.html");      open(FILE,">$destdir/resfiles/$res.html");
   print FILE qq|<html>      print FILE qq|<html>
 <head>  <head>
 <title>$$settings{title}</title>  <title>$$settings{title}</title>
 </head>  </head>
 <body bgcolor='#ffffff'>  <body bgcolor='#ffffff'>
   <table>
    <tr>
     <td bgcolor='#CCCCFF'>$$settings{title} - announcement date: $$settings{date}</td>
    </tr>
   </table>
   <br/>
 $$settings{text}  $$settings{text}
 |;  |;
   print FILE qq|      print FILE qq|
   </body>    </body>
  </html>|;   </html>|;
   close(FILE);      close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Content
 sub process_content {  sub process_content {
   my ($res,$docroot,$destdir,$settings,$dom,$user) = @_;      my ($res,$docroot,$destdir,$settings,$dom,$user) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
   my $destresdir = $destdir;      my $destresdir = $destdir;
   $destresdir =~ s|/home/$user/public_html/|/res/$dom/$user/|;      $destresdir =~ s|/home/$user/public_html/|/res/$dom/$user/|;
   my $filecount = 0;      my $filecount = 0;
   my @state;      my @allrelfiles = ();
   @{$$settings{files}} = ();       my @state;
   my $p = HTML::Parser->new      @{$$settings{files}} = (); 
       my $p = HTML::Parser->new
     (      (
      xml_mode => 1,        xml_mode => 1,
      start_h =>        start_h =>
      [sub {        [sub {
         my ($tagname, $attr) = @_;          my ($tagname, $attr) = @_;
         push @state, $tagname;          push @state, $tagname;
         if (@state eq "CONTENT MAINDATA") {          if (@state eq "CONTENT MAINDATA") {
Line 1957  sub process_content { Line 2033  sub process_content {
             $$settings{isfolder} = $attr->{value};              $$settings{isfolder} = $attr->{value};
         } elsif ("@state" eq "CONTENT FLAGS LAUNCHINNEWWINDOW" ) {          } elsif ("@state" eq "CONTENT FLAGS LAUNCHINNEWWINDOW" ) {
             $$settings{newwindow} = $attr->{value};              $$settings{newwindow} = $attr->{value};
         } elsif ("@state" eq "CONTENT FILES") {  
 #            @{$$settings{files}} = ();  
         } elsif ("@state" eq "CONTENT FILES FILEREF") {          } elsif ("@state" eq "CONTENT FILES FILEREF") {
             %{$$settings{files}[$filecount]} = ();              %{$$settings{files}[$filecount]} = ();
             %{$$settings{files}[$filecount]{registry}} = ();               %{$$settings{files}[$filecount]{registry}} = (); 
         } elsif ("@state" eq "CONTENT FILES FILEREF RELFILE" ) {          } elsif ("@state" eq "CONTENT FILES FILEREF RELFILE" ) {
             $$settings{files}[$filecount]{'relfile'} = $attr->{value};              $$settings{files}[$filecount]{'relfile'} = $attr->{value};
               push @allrelfiles, $attr->{value};
         } elsif ("@state" eq "CONTENT FILES FILEREF MIMETYPE") {          } elsif ("@state" eq "CONTENT FILES FILEREF MIMETYPE") {
             $$settings{files}[$filecount]{mimetype} = $attr->{value};              $$settings{files}[$filecount]{mimetype} = $attr->{value};
         } elsif ("@state" eq "CONTENT FILES FILEREF CONTENTTYPE") {          } elsif ("@state" eq "CONTENT FILES FILEREF CONTENTTYPE") {
Line 1978  sub process_content { Line 2053  sub process_content {
             my $key = $attr->{key};              my $key = $attr->{key};
             $$settings{files}[$filecount]{registry}{$key} = $attr->{value};              $$settings{files}[$filecount]{registry}{$key} = $attr->{value};
         }          }
      }, "tagname, attr"],        }, "tagname, attr"],
      text_h =>        text_h =>
      [sub {        [sub {
         my ($text) = @_;          my ($text) = @_;
         if ("@state" eq "CONTENT TITLE") {          if ("@state" eq "CONTENT TITLE") {
             $$settings{title} = $text;              $$settings{title} = $text;
Line 1989  sub process_content { Line 2064  sub process_content {
         }  elsif ("@state" eq "CONTENT FILES FILEREF REFTEXT") {          }  elsif ("@state" eq "CONTENT FILES FILEREF REFTEXT") {
             $$settings{files}[$filecount]{reftext} = $text;              $$settings{files}[$filecount]{reftext} = $text;
         }          }
       }, "dtext"],         }, "dtext"],
      end_h =>        end_h =>
      [sub {        [sub {
         my ($tagname) = @_;          my ($tagname) = @_;
         if ("@state" eq "CONTENT FILES FILEREF") {          if ("@state" eq "CONTENT FILES FILEREF") {
             $filecount ++;              $filecount ++;
         }          }
         pop @state;          pop @state;
      }, "tagname"],        }, "tagname"],
     );       );
   $p->unbroken_text(1);      $p->unbroken_text(1);
   $p->parse_file($xmlfile);      $p->parse_file($xmlfile);
   $p->eof;      $p->eof;
   my $linktag = '';      my $linktag = '';
   my $fontcol = '';      my $fontcol = '';
   if (@{$$settings{files}} > 0) {      if (@{$$settings{files}} > 0) {
       for (my $filecount=0;  $filecount<@{$$settings{files}}; $filecount++) {          for (my $filecount=0;  $filecount<@{$$settings{files}}; $filecount++) {
           if ($$settings{files}[$filecount]{'fileaction'} eq 'embed') {              if ($$settings{files}[$filecount]{'fileaction'} eq 'embed') {
               if ( $$settings{files}[$filecount]{reftext} =~ m#<\!\-\-\s_(\d+)\\_\s\-\-\>#) {                   if ( $$settings{files}[$filecount]{reftext} =~ m#<\!\-\-\s_(\d+)\\_\s\-\-\>#) { 
                   my $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"/>|;                      my $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"/>|;
                   $$settings{maindata}{text} =~ s#<\!\-\-\s_/($1)\\_\s\-\-\>#$newtag#;                      $$settings{maindata}{text} =~ s#<\!\-\-\s_/($1)\\_\s\-\-\>#$newtag#;
               } elsif ( $$settings{files}[$filecount]{reftext} =~m#^_/(\d+)\\_$# ) {                  } elsif ( $$settings{files}[$filecount]{reftext} =~m#^_/(\d+)\\_$# ) {
                   my $reftag = $1;                      my $reftag = $1;
                   my $newtag;                      my $newtag;
                   if ($$settings{files}[$filecount]{mimetype} =~ m/^image/) {                      if ($$settings{files}[$filecount]{mimetype} =~ m/^image/) {
                       $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;                          $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;
                       if ( defined($$settings{files}[$filecount]{registry}{alttext}) ) {                          if ( defined($$settings{files}[$filecount]{registry}{alttext}) ) {
                           $newtag .= qq| alt="$$settings{files}[$filecount]{registry}{alttext}"|;                              $newtag .= qq| alt="$$settings{files}[$filecount]{registry}{alttext}"|;
                       }                          }
                       if ( defined($$settings{files}[$filecount]{registry}{alignment}) )                          if ( defined($$settings{files}[$filecount]{registry}{alignment}) )
 {  {
                           $newtag .= qq| align="$$settings{files}[$filecount]{registry}{alignment}"|;                               $newtag .= qq| align="$$settings{files}[$filecount]{registry}{alignment}"|; 
                       }                          }
                       if ( defined($$settings{files}[$filecount]{registry}{border}) ) {                          if ( defined($$settings{files}[$filecount]{registry}{border}) ) {
                           $newtag .= qq| border="$$settings{files}[$filecount]{registry}{border}"|;                              $newtag .= qq| border="$$settings{files}[$filecount]{registry}{border}"|;
                       }                          }
                       $newtag .= " />";                          $newtag .= " />";
                       my $reftext =  $$settings{files}[$filecount]{reftext};                          my $reftext =  $$settings{files}[$filecount]{reftext};
                       my $fname = $$settings{files}[$filecount]{'relfile'};                          my $fname = $$settings{files}[$filecount]{'relfile'};
                       $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//;                          $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//;
 #                      $$settings{maindata}{text} =~ s/DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//;  #                      $$settings{maindata}{text} =~ s/DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//;
                       $$settings{maindata}{text} =~ s/Move\swhole\scomment\sto\schange\sfile\splacement\swithin\spage\.[\s\n]+//;                          $$settings{maindata}{text} =~ s/Move\swhole\scomment\sto\schange\sfile\splacement\swithin\spage\.[\s\n]+//;
                       $$settings{maindata}{text} =~ s/_\/$reftag\\_/$newtag/;                          $$settings{maindata}{text} =~ s/_\/$reftag\\_/$newtag/;
                       $$settings{maindata}{text} =~ s/END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n]+//;                          $$settings{maindata}{text} =~ s/END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n]+//;
                       $$settings{maindata}{text} =~ s/\-\->//;                          $$settings{maindata}{text} =~ s/\-\->//;
 #                      $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n\]+_\/$reftag\\_[\s\n]+END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n\]+\-\->/$newtag/;  #                      $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n\]+_\/$reftag\\_[\s\n]+END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n\]+\-\->/$newtag/;
 #                      print STDERR $$settings{maindata}{text};  #                      print STDERR $$settings{maindata}{text};
                   }                      }
               } else {                  } else {
                   my $filename=$$settings{files}[$filecount]{'relfile'};                      my $filename=$$settings{files}[$filecount]{'relfile'};
 #                  print "File is $filename\n";  #                  print "File is $filename\n";
                   my $newfilename="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}";                      my $newfilename="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}";
 #                  print "New filename is $newfilename\n";  #                  print "New filename is $newfilename\n";
                   $$settings{maindata}{text} =~ s#(src|SRC|value)="$filename"#$1="$newfilename"#g;                      $$settings{maindata}{text} =~ s#(src|SRC|value)="$filename"#$1="$newfilename"#g;
               }                  }
           } elsif ($$settings{files}[$filecount]{fileaction} eq 'link') {              } elsif ($$settings{files}[$filecount]{fileaction} eq 'link') {
               $linktag = qq|<a href="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;                  unless (($$settings{files}[$filecount]{packageparent} ne '') && (grep/^$$settings{files}[$filecount]{packageparent}$/,@{$$settings{files}}) ) {
               if ($$settings{newwindow} eq "true") {                      $linktag .= qq|<a href="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;
                   $linktag .= qq| target="$res$filecount"|;                      if ($$settings{newwindow} eq "true") {
               }                          $linktag .= qq| target="$res$filecount"|;
               foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) {                      }
                   $linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|;                      foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) {
               }                          $linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|;
               $linktag .= qq|>$$settings{files}[$filecount]{linkname}</a>|;                      }
           } elsif ($$settings{files}[$filecount]{fileaction} eq 'package') {                        $linktag .= qq|>$$settings{files}[$filecount]{linkname}</a><br/>\n|;
                   }
               } elsif ($$settings{files}[$filecount]{fileaction} eq 'package') {
 #              print "Found a package\n";  #              print "Found a package\n";
           }              }
       }          }
   }      }
   if (defined($$settings{maindata}{textcolor})) {      if (defined($$settings{maindata}{textcolor})) {
       $fontcol =  qq|<font color="$$settings{maindata}{textcolor}">|;          $fontcol =  qq|<font color="$$settings{maindata}{textcolor}">|;
   }      }
   if (defined($$settings{maindata}{text})) {      if (defined($$settings{maindata}{text})) {
       if ($$settings{maindata}{ishtml} eq "false") {          if ($$settings{maindata}{ishtml} eq "false") {
           if ($$settings{maindata}{isnewline} eq "true") {              if ($$settings{maindata}{isnewline} eq "true") {
               $$settings{maindata}{text} =~ s#\n#<br/>#g;                  $$settings{maindata}{text} =~ s#\n#<br/>#g;
           }              }
       } else {          } else {
           $$settings{maindata}{text} = &HTML::Entities::decode($$settings{maindata}{text});              $$settings{maindata}{text} = &HTML::Entities::decode($$settings{maindata}{text});
       }          }
   }      }
   
   open(FILE,">$destdir/resfiles/$res.html");      open(FILE,">$destdir/resfiles/$res.html");
   print FILE qq|<html>      print FILE qq|<html>
 <head>  <head>
 <title>$$settings{title}</title>  <title>$$settings{title}</title>
 </head>  </head>
 <body bgcolor='#ffffff'>  <body bgcolor='#ffffff'>
 $fontcol  $fontcol
   |;  |;
   unless ($$settings{title} eq '') {       unless ($$settings{title} eq '') { 
       print FILE qq|$$settings{title}<br/><br/>\n|;          print FILE qq|$$settings{title}<br/><br/>\n|;
   }      }
   print FILE qq|      print FILE qq|
 $$settings{maindata}{text}  $$settings{maindata}{text}
 $linktag|;  $linktag|;
   if (defined($$settings{maindata}{textcolor})) {      if (defined($$settings{maindata}{textcolor})) {
       print FILE qq|</font>|;          print FILE qq|</font>|;
   }      }
   print FILE qq|      print FILE qq|
   </body>    </body>
  </html>|;   </html>|;
   close(FILE);      close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Expand ANGEL IMS package
 sub expand_angel {  sub expand_angel {
     my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling) = @_;      my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling) = @_;
     my @state = ();      my @state = ();
Line 2114  sub expand_angel { Line 2192  sub expand_angel {
     my %resinfo = ();      my %resinfo = ();
     my $numfolders = 0;      my $numfolders = 0;
     my $numpages = 0;      my $numpages = 0;
       my $totseq = 0;
       my $totpage = 0;
       my $totquiz = 0;
       my $totsurv = 0;
     my $docroot = $ENV{'form.newdir'};      my $docroot = $ENV{'form.newdir'};
     if (!-e "$docroot/temp") {      if (!-e "$docroot/temp") {
         mkdir "$docroot/temp";          mkdir "$docroot/temp";
Line 2125  sub expand_angel { Line 2207  sub expand_angel {
     my $dirname = "/res/$udom/$uname/$newdir";      my $dirname = "/res/$udom/$uname/$newdir";
     my $zipfile = '/home/'.$uname.'/public_html'.$fn;      my $zipfile = '/home/'.$uname.'/public_html'.$fn;
     if ($fn =~ m|\.zip$|i) {      if ($fn =~ m|\.zip$|i) {
             open(OUTPUT, "unzip -o $zipfile -d $docroot/temp  2> /dev/null |");          open(OUTPUT, "unzip -o $zipfile -d $docroot/temp  2> /dev/null |");
             while (<OUTPUT>) {          while (<OUTPUT>) {
                 print "$_<br />";              print "$_<br />";
             }          }
             close(OUTPUT);          close(OUTPUT);
     }      }
                                                                                                                                                                                                           
     my $xmlfile = $docroot.'/temp/imsmanifest.xml';      my $xmlfile = $docroot.'/temp/imsmanifest.xml';
Line 2144  sub expand_angel { Line 2226  sub expand_angel {
                 my $start = $num;                  my $start = $num;
                 my $statestr = '';                  my $statestr = '';
                 foreach (@state) {                  foreach (@state) {
                   $statestr .= "$_ ";                      $statestr .= "$_ ";
                 }                  }
                 if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "organization") ) {                  if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "organization") ) {
                   my $searchstr = "manifest organizations organization";                    my $searchstr = "manifest organizations organization";
Line 2154  sub expand_angel { Line 2236  sub expand_angel {
                   }                    }
                   if (("@state" eq $searchstr) && (@state > 3)) {                    if (("@state" eq $searchstr) && (@state > 3)) {
                     $itm = $attr->{identifier};                      $itm = $attr->{identifier};
                       $contentscount{$itm} = 0;
                     if ($attr->{identifierref} =~ m/^res(.+)$/) {                      if ($attr->{identifierref} =~ m/^res(.+)$/) {
                         $resnum{$itm} = $1;                          $resnum{$itm} = $1;
                     }                      }
Line 2169  sub expand_angel { Line 2252  sub expand_angel {
                         }                          }
                     }                      }
                     elsif ($start < @seq) {                      elsif ($start < @seq) {
                       my $diff = @seq - $start;                          my $diff = @seq - $start;
                       while ($diff > 0) {                          while ($diff > 0) {
                         pop @seq;                              pop @seq;
                         $diff --;                              $diff --;
                       }                          }
                       if (@seq) {                          if (@seq) {
                         push @{$contents{$seq[-1]}}, $itm;                              push @{$contents{$seq[-1]}}, $itm;
                       }                          }
                     } else {                      } else {
                        push @{$contents{$seq[-1]}}, $itm;                         push @{$contents{$seq[-1]}}, $itm;
                     }                      }
                     my $path;                      my $path;
                     if (@seq > 1) {                      if (@seq > 1) {
                       $path = join(',',@seq);                          $path = join(',',@seq);
                     } elsif (@seq > 0) {                      } elsif (@seq > 0) {
                       $path = $seq[0];                          $path = $seq[0];
                     }                      }
                     $filepath{$itm} = $path;                      $filepath{$itm} = $path;
                     $contentscount{$seq[-1]} ++;                      $contentscount{$seq[-1]} ++;
Line 2240  sub expand_angel { Line 2323  sub expand_angel {
     }      }
     foreach my $key (sort keys %href) {      foreach my $key (sort keys %href) {
         foreach my $file (@{$href{$key}}) {          foreach my $file (@{$href{$key}}) {
             print STDERR "File is $file, for $key\n";  
             $file =~ s-\\-/-g;              $file =~ s-\\-/-g;
             my $filepath = $file;              unless ($file eq 'pg'.$key.'.htm') {
             if (!-e "$destdir/resfiles/$key") {                  if (!-e "$destdir/resfiles/$key") {
                 mkdir("$destdir/resfiles/$key",0755);                      mkdir("$destdir/resfiles/$key",0755);
                   }
             }              }
               my $filepath = $file;
             while ($filepath =~ m-(\w+)/(.+)-) {               while ($filepath =~ m-(\w+)/(.+)-) { 
                 $filepath = $2;                  $filepath = $2;
                 if (!-e "$destdir/resfiles/$key/$1") {                  if (!-e "$destdir/resfiles/$key/$1") {
                     mkdir("$destdir/resfiles/$key/$1",0755);                      mkdir("$destdir/resfiles/$key/$1",0755);
                 }                  }
             }              }
             system("cp $docroot/temp/_assoc/$key/$file $destdir/resfiles/$key/$file");              unless ($file eq 'pg'.$key.'.htm') { 
                   system("cp $docroot/temp/_assoc/$key/$file $destdir/resfiles/$key/$file");
               }
         }          }
     }      }
   
   # ANGEL types FILE FOLDER PAGE LINK MESSAGE FORM QUIZ BOARD DROPBOX IMS
 # ANGEL types FILE FOLDER PAGE LINK MESSAGE FORM QUIZ BOARD  
     my $currboard = '';      my $currboard = '';
     my @boards = ();      my @boards = ();
     my %messages = ();      my %messages = ();
Line 2276  sub expand_angel { Line 2361  sub expand_angel {
             $board_count ++;              $board_count ++;
         } elsif ($type{$key} eq "MESSAGE") {          } elsif ($type{$key} eq "MESSAGE") {
             push @{$messages{$currboard}}, $key;              push @{$messages{$currboard}}, $key;
         } elsif ($type{$key} eq "FILE" || $type{$key} eq "FOLDER" || $type{$key} eq "PAGE" || $type{$key} eq "LINK") {          } elsif ($type{$key} eq "PAGE" || $type{$key} eq "LINK") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
               &angel_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname,$type{$key},$title{$revitm{$key}});
         } elsif ($type{$key} eq "QUIZ") {          } elsif ($type{$key} eq "QUIZ") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
 #            &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});  #            &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
         } elsif ($type{$key} eq "FORM") {          } elsif ($type{$key} eq "FORM") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
 #            &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});  #            &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
           } elsif ($type{$key} eq "DROPBOX") {
               %{$resinfo{$key}} = ();
         }          }
     }      }
   
Line 2295  sub expand_angel { Line 2383  sub expand_angel {
         my %msgidx = ();          my %msgidx = ();
         my $forumtext = '';          my $forumtext = '';
         my $boardname = 'bulletinpage_'.$timestamp[$i];          my $boardname = 'bulletinpage_'.$timestamp[$i];
         my $forumfile = "$destdir/resfiles/$boards[$i]/$file{$boards[$i]}";          my $forumfile = $docroot.'/temp/_assoc/'.$boards[$i].'/pg'.$boards[$i].'.htm';
         my @state = ();          my @state = ();
         my $p = HTML::Parser->new          my $p = HTML::Parser->new
         (          (
Line 2318  sub expand_angel { Line 2406  sub expand_angel {
                   pop @state;                    pop @state;
                }, "tagname"],                 }, "tagname"],
         );          );
         $p->parse_file($xmlfile);          $p->parse_file($forumfile);
         $p->eof;          $p->eof;
   
         my %boardinfo = (          my %boardinfo = (
Line 2330  sub expand_angel { Line 2418  sub expand_angel {
         my $msgcount = 0;           my $msgcount = 0; 
                                                                                                                                                                                                             
         my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$bb_cdom,$bb_crs);          my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$bb_cdom,$bb_crs);
           print STDERR "putresult is $putresult for $boardname $bb_cdom $bb_crs\n";
         if ($bb_handling eq 'importall') {          if ($bb_handling eq 'importall') {
             foreach my $msg_id (@{$messages{$boards[$i]}}) {              foreach my $msg_id (@{$messages{$boards[$i]}}) {
                 $msgcount ++;                  $msgcount ++;
                 $msgidx{$msg_id} = $msgcount;                  $msgidx{$msg_id} = $msgcount;
                 my %contrib = (                  my %contrib = (
                             'sendername' => 'Username not recorded',                              'sendername' => 'NoName',
                             'senderdomain' => $bb_cdom,                              'senderdomain' => $bb_cdom,
                             'screenname' => '',                              'screenname' => '',
                             'message' => $title{$revitm{$msg_id}}                              'message' => $title{$revitm{$msg_id}}
                             );                              );
                 unless ( $parentseq{$revitm{$msg_id}} eq $revitm{$boards[$i]} ) {                  unless ( $parentseq{$revitm{$msg_id}} eq $revitm{$boards[$i]} ) {
                     $contrib{replyto} = $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}};                      unless ( $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}} eq ''){
                           $contrib{replyto} = $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}};
                           print STDERR "$msgidx{$resnum{$revitm{$msg_id}}} is replying to $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}}\n";
                       }
                 }                  }
                 if ( @{$href{$msg_id}} > 1 )  {                  if ( @{$href{$msg_id}} > 1 )  {
                     my $newurl = '';                      my $newurl = '';
                     foreach my $file (@{$href{$msg_id}}) {                      foreach my $file (@{$href{$msg_id}}) {
                         unless ($file eq 'pg'.$msg_id.'.htm') {                          unless ($file eq 'pg'.$msg_id.'.htm') {
                             $newurl = $msg_id.$file;                              $newurl = $msg_id.$file;
                               print STDERR "Msg is $msg_id, File is $file, newurl is $newurl\n";
                             unless ($longcrs eq '') {                              unless ($longcrs eq '') {
                                 if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles") {                                  if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles") {
                                     mkdir("/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles",0755);                                      mkdir("/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles",0755);
                                 }                                  }
                                 if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl") {                                  if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl") {
                                     system("cp $destdir/resfiles/$file /home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl");                                      system("cp $destdir/resfiles/$msg_id/$file /home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl");
                                 }                                  }
                                 $contrib{attachmenturl} = '/uploaded/'.$bb_cdom.'/'.$bb_crs.'/'.$newurl;                                  $contrib{attachmenturl} = '/uploaded/'.$bb_cdom.'/'.$bb_crs.'/'.$newurl;
                             }                              }
                         }                          }
                     }                      }
                 }                  }
                 my $xmlfile = "$destdir/resfiles/$msg_id/$file{$msg_id}";                  my $xmlfile = $docroot.'/temp/_assoc/'.$msg_id.'/'.$file{$msg_id};
                 &angel_message($msg_id,\%contrib,$xmlfile);                  &angel_message($msg_id,\%contrib,$xmlfile);
                 unless ($file{$msg_id} eq '') {                  unless ($file{$msg_id} eq '') {
                     unlink($xmlfile);                      unlink($xmlfile);
Line 2383  sub expand_angel { Line 2476  sub expand_angel {
     my %seqcount = ();      my %seqcount = ();
     my %boardflag = ();      my %boardflag = ();
     my %boardcount = ();      my %boardcount = ();
       my %fileflag = ();
       my %filecount = ();
   
     foreach my $key (@resources) {      foreach my $key (@resources) {
         print STDERR "Key is $key, resnum is $resnum{$key}, type is $type{$resnum{$key}}\n";  
         $pageflag{$key} = 0;          $pageflag{$key} = 0;
         $seqflag{$key} = 0;          $seqflag{$key} = 0;
         $seqcount{$key} = 0;          $seqcount{$key} = 0;
         $pagecount{$key} = -1;          $pagecount{$key} = -1;
         $boardflag{$key} = 0;          $boardflag{$key} = 0;
         $boardcount{$key} = 0;          $boardcount{$key} = 0;
           $fileflag{$key} = 0;
           $filecount{$key} = 0;
         my $src ="";          my $src ="";
           my $srcstem = "/res/$udom/$uname/$newdir";
         my $next_id = 1;          my $next_id = 1;
         my $curr_id = 0;          my $curr_id = 0;
         if ($type{$resnum{$key}} eq "FOLDER") {          if ($type{$resnum{$key}} eq "FOLDER") {
Line 2404  sub expand_angel { Line 2501  sub expand_angel {
 <resource id="2" src="" type="finish"></resource>\n|;  <resource id="2" src="" type="finish"></resource>\n|;
             } else {              } else {
                 if ($type{$resnum{$contents{$key}[0]}} eq "FOLDER") {                  if ($type{$resnum{$contents{$key}[0]}} eq "FOLDER") {
                     $src = 'sequences/'.$contents{$key}[0].".sequence";                      $src = $srcstem.'/sequences/'.$contents{$key}[0].".sequence";
                     $pageflag{$key} = 0;                      $pageflag{$key} = 0;
                     $seqflag{$key} = 1;                      $seqflag{$key} = 1;
                     $seqcount{$key} ++;                      $seqcount{$key} ++;
                 } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") {                  } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") {
                     $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$key}]/bulletinboard";                       $src = '/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$boardnum{$resnum{$contents{$key}[0]}}].'/bulletinboard'; 
                     $pageflag{$key} = 0;                      $pageflag{$key} = 0;
                     $boardflag{$key} = 1;                      $boardflag{$key} = 1;
                     $boardcount{$key} ++;                      $boardcount{$key} ++;
                 } elsif ($type{$resnum{$contents{$key}[0]}} ne "MESSAGE") {                  } elsif ($type{$resnum{$contents{$key}[0]}} eq "FILE") {
                       foreach my $file (@{$href{$resnum{$contents{$key}[0]}}}) {
                           unless ($file eq 'pg'.$resnum{$contents{$key}[0]}.'.htm') {
                               $src = $srcstem.'/resfiles/'.$resnum{$contents{$key}[0]}.'/'.$file;
                           }
                       }
                       $pageflag{$key} = 0;
                       $fileflag{$key} = 1;
                   } elsif ( ($type{$resnum{$contents{$key}[0]}} eq "PAGE") || ($type{$resnum{$contents{$key}[0]}} eq "LINK") )  {
                     if ($pageflag{$key}) {                      if ($pageflag{$key}) {
                         push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0];                          if ($pagecount{key} == -1) {
                               print STDERR "Array index is -1, we shouldnt be here\n";
                           } else { 
                               push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0];
                           }
                     } else {                      } else {
                         $pagecount{$key} ++;                          $pagecount{$key} ++;
                         $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';                          $src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page';
                         @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[0]");                          @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[0]");
                         $seqflag{$key} = 0;                          $seqflag{$key} = 0;
                     }                      }
                 }                  }
                 unless ($pageflag{$key}) {                  unless ($pageflag{$key}) {
                     print LOCFILE qq|<resource id="1" src="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[0]}" type="start"|;                      print LOCFILE qq|<resource id="1" src="$src" title="$title{$contents{$key}[0]}" type="start"|;
                     unless ($seqflag{$key} || $boardflag{$key}) {                      unless ($seqflag{$key} || $boardflag{$key} || $fileflag{$key}) {
                         $pageflag{$key} = 1;                          $pageflag{$key} = 1;
                     }                      }
                 }                  }
Line 2437  sub expand_angel { Line 2546  sub expand_angel {
                     if ($contentscount{$key} > 2 ) {                      if ($contentscount{$key} > 2 ) {
                         for (my $i=1; $i<$contentscount{$key}-1; $i++) {                          for (my $i=1; $i<$contentscount{$key}-1; $i++) {
                             if ($type{$resnum{$contents{$key}[$i]}} eq "FOLDER") {                              if ($type{$resnum{$contents{$key}[$i]}} eq "FOLDER") {
                                 $src = 'sequences/'.$contents{$key}[$i].".sequence";                                  $src = $srcstem.'/sequences/'.$contents{$key}[$i].".sequence";
                                 $pageflag{$key} = 0;                                  $pageflag{$key} = 0;
                                 $seqflag{$key} = 1;                                  $seqflag{$key} = 1;
                                 $seqcount{$key} ++;                                  $seqcount{$key} ++;
                             } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") {                              } elsif ($type{$resnum{$contents{$key}[$i]}} eq "BOARD") {
                                 $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$key}]/bulletinboard";                                  $src = '/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$boardnum{$resnum{$contents{$key}[$i]}}].'/bulletinboard';
                                 $pageflag{$key} = 0;                                  $pageflag{$key} = 0;
                                 $boardflag{$key} = 1;                                  $boardflag{$key} = 1;
                                 $boardcount{$key} ++;                                  $boardcount{$key} ++;
                             } elsif ($type{$resnum{$contents{$key}[0]}} ne "MESSAGE") {                              } elsif ($type{$resnum{$contents{$key}[$i]}} eq "FILE") {
                                   foreach my $file (@{$href{$resnum{$contents{$key}[$i]}}}) {
                                       unless ($file eq 'pg'.$resnum{$contents{$key}[$i]}.'.htm') {
                                           $src = $srcstem.'/resfiles/'.$resnum{$contents{$key}[$i]}.'/'.$file;
                                       }
                                   }
                                   $pageflag{$key} = 0;
                                   $fileflag{$key} = 1;
                                   $filecount{$key} ++;
                               } elsif ( ($type{$resnum{$contents{$key}[$i]}} eq "PAGE") || ($type{$resnum{$contents{$key}[$i]}} eq "LINK") ) {
                                 if ($pageflag{$key}) {                                  if ($pageflag{$key}) {
                                     push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i];                                      if ($pagecount{$key} == -1) {
                                           print STDERR "array index is -1, we shouldnt be here\n";
                                       } else {
                                           push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i];
                                       }
                                 } else {                                  } else {
                                     $pagecount{$key} ++;                                      $pagecount{$key} ++;
                                     $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';                                      $src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page';
                                     @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$i]");                                      @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$i]");
                                     $seqflag{$key} = 0;                                      $seqflag{$key} = 0;
                                 }                                  }
Line 2461  sub expand_angel { Line 2583  sub expand_angel {
                                 $next_id ++;                                  $next_id ++;
                                 print LOCFILE qq|></resource>                                  print LOCFILE qq|></resource>
 <link from="$curr_id" to="$next_id" index="$curr_id"></link>  <link from="$curr_id" to="$next_id" index="$curr_id"></link>
 <resource id="$next_id" src="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[$i]}"|;  <resource id="$next_id" src="$src" title="$title{$contents{$key}[$i]}"|;
                                 unless ($seqflag{$key} || $boardflag{$key}) {                                  unless ($seqflag{$key} || $boardflag{$key} || $fileflag{$key}) {
                                     $pageflag{$key} = 1;                                      $pageflag{$key} = 1;
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                     if ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "FOLDER") {                      if ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "FOLDER") {
                         $src = 'sequences/'.$contents{$key}[$contentscount{$key}-1].".sequence";                          $src = $srcstem.'/sequences/'.$contents{$key}[$contentscount{$key}-1].".sequence";
                         $pageflag{$key} = 0;                          $pageflag{$key} = 0;
                         $seqflag{$key} = 1;                          $seqflag{$key} = 1;
                     } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") {                      } elsif ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "BOARD") {
                         $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$key}]/bulletinboard";                          $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$resnum{$contents{$key}[$contentscount{$key}-1]}}]/bulletinboard";
                         $pageflag{$key} = 0;                          $pageflag{$key} = 0;
                         $boardflag{$key} = 1;                          $boardflag{$key} = 1;
                     } elsif ($type{$resnum{$contents{$key}[0]}} ne "MESSAGE") {                      } elsif ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "FILE") {
                           foreach my $file (@{$href{$resnum{$contents{$key}[$contentscount{$key}-1]}}}) {
                               unless ($file eq 'pg'.$resnum{$contents{$key}[$contentscount{$key}-1]}.'.htm') {
                                   $src = $srcstem.'/resfiles/'.$resnum{$contents{$key}[$contentscount{$key}-1]}.'/'.$file;
                               }
                           }
                           $pageflag{$key} = 0;
                           $fileflag{$key} = 1;
                           $filecount{$key} ++;
                       } elsif ( ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "PAGE") || ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "LINK") ) {
                         if ($pageflag{$key}) {                          if ($pageflag{$key}) {
                             push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$contentscount{$key}-1];                              push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$contentscount{$key}-1];
                         } else {                          } else {
                             $pagecount{$key} ++;                              $pagecount{$key} ++;
                             $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';                              $src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page';
                             @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$contentscount{$key}-1]");                              @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$contentscount{$key}-1]");
                         }                          }
                     }                      }
                     if ($pageflag{$key}) {                      if ($pageflag{$key}) {
                         if ($seqcount{$key} + $pagecount{$key} + $boardcount{$key} +1 == 1) {                          if ($seqcount{$key} + $pagecount{$key} + $boardcount{$key} + $filecount{$key} +1 == 1) {
                             print LOCFILE qq|></resource>                              print LOCFILE qq|></resource>
 <link from="1" index="1" to="2">  <link from="1" index="1" to="2">
 <resource id ="2" src="" title="" type="finish"></resource>\n|;  <resource id ="2" src="" title="" type="finish"></resource>\n|;
Line 2498  sub expand_angel { Line 2629  sub expand_angel {
                         $next_id ++;                          $next_id ++;
                         print LOCFILE qq|></resource>                          print LOCFILE qq|></resource>
 <link from="$curr_id" to="$next_id" index="$curr_id"></link>  <link from="$curr_id" to="$next_id" index="$curr_id"></link>
 <resource id="$next_id" src="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[$contentscount{$key}-1]}" type="finish"></resource>\n|;  <resource id="$next_id" src="$src" title="$title{$contents{$key}[$contentscount{$key}-1]}" type="finish"></resource>\n|;
                     }                      }
                 }                  }
             }              }
             print LOCFILE "</map>\n";              print LOCFILE "</map>\n";
             close(LOCFILE);              close(LOCFILE);
               $pagecount{$key} ++;
               $totpage += $pagecount{$key};
         }          }
           $totseq += $seqcount{$key};
     }      }
   
     foreach my $key (sort keys %pagecontents) {      foreach my $key (sort keys %pagecontents) {
Line 2513  sub expand_angel { Line 2647  sub expand_angel {
             my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';              my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';
             open(PAGEFILE,">$filename");              open(PAGEFILE,">$filename");
             print PAGEFILE qq|<map>              print PAGEFILE qq|<map>
 <resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][0]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource>  <resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][0]}/$resnum{$pagecontents{$key}[$i][0]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource>
 <link to="2" index="1" from="1">\n|;  <link to="2" index="1" from="1">\n|;
             if (@{$pagecontents{$key}[$i]} == 1) {              if (@{$pagecontents{$key}[$i]} == 1) {
                 print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>|;                  print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>|;
             } elsif (@{$pagecontents{$key}[$i]} == 2)  {              } elsif (@{$pagecontents{$key}[$i]} == 2)  {
                 print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][1]}.html" id="2" type="finish" title="$title{$pagecontents{$key}[$i][1]}"></resource>|;                  print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][1]}/$resnum{$pagecontents{$key}[$i][1]}.html" id="2" type="finish" title="$title{$pagecontents{$key}[$i][1]}"></resource>|;
             } else {              } else {
                 for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) {                  for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) {
                     my $curr_id = $j+1;                      my $curr_id = $j+1;
                     my $next_id = $j+2;                      my $next_id = $j+2;
                     my $resource = $filestem.'/resfiles/'.$resnum{$pagecontents{$key}[$i][$j]}.'.html';                      my $resource = $filestem.'/resfiles/'.$resnum{$pagecontents{$key}[$i][1]}.'/'.$resnum{$pagecontents{$key}[$i][$j]}.'.html';
                     print PAGEFILE qq|<resource src="$resource" id="$curr_id" title="$title{$pagecontents{$key}[$i][$j]}"></resource>                      print PAGEFILE qq|<resource src="$resource" id="$curr_id" title="$title{$pagecontents{$key}[$i][$j]}"></resource>
 <link to="$next_id" index="$curr_id" from="$curr_id">\n|;  <link to="$next_id" index="$curr_id" from="$curr_id">\n|;
                 }                  }
                 my $final_id = @{$pagecontents{$key}[$i]};                  my $final_id = @{$pagecontents{$key}[$i]};
                 print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][-1]}.html" id="$final_id" type="finish" title="$title{$pagecontents{$key}[$i][-1]}"></resource>\n|;                  print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][-1]}/$resnum{$pagecontents{$key}[$i][-1]}.html" id="$final_id" type="finish" title="$title{$pagecontents{$key}[$i][-1]}"></resource>\n|;
             }              }
             print PAGEFILE "</map>";              print PAGEFILE "</map>";
             close(PAGEFILE);              close(PAGEFILE);
         }          }
     }      }
 #    system(" rm -r $docroot/temp");      system(" rm -r $docroot/temp"); # Need to add sanity checking
       return('ok',$totseq,$totpage,$board_count);
   }
   
   # ---------------------------------------------------------------- ANGEL content
   sub angel_content {
       my ($res,$docroot,$destdir,$settings,$dom,$user,$type,$title) = @_;
       my $xmlfile = $docroot.'/temp/_assoc/'.$res.'/pg'.$res.'.htm';
       my $filecount = 0;
       my $firstline;
       my $lastline;
       my @buffer = ();
       my @state;
       @{$$settings{links}} = ();
       my $p = HTML::Parser->new
       (
          xml_mode => 1,
          start_h =>
          [sub {
                my ($tagname, $attr) = @_;
                push @state, $tagname;
               },  "tagname, attr"],
          text_h =>
          [sub {
                my ($text) = @_;
                if ("@state" eq "html body table tr td div small span") {
                    $$settings{'subtitle'} = $text;
                } elsif ("@state" eq "html body div div") {
                    $$settings{'text'} = $text;
                } elsif ("@state" eq "html body div div a") {
                   push @{$$settings{'links'}}, $text;
                }
               }, "dtext"],
          end_h =>
          [sub {
                my ($tagname) = @_;
                pop @state;
               }, "tagname"],
       );
       $p->parse_file($xmlfile);
       $p->eof;
       if ($type eq "PAGE") {
           open(FILE,"<$xmlfile");
           @buffer = <FILE>;
           close(FILE);
           chomp(@buffer);
           $firstline = -1;
           $lastline = 0;
           for (my $i=0; $i<@buffer; $i++) {
               if (($firstline == -1) && ($buffer[$i] =~ m/<div\sclass="normalDiv"><div\sclass="normalSpan">/)) {
                   $firstline = $i;
                   $buffer[$i] = substr($buffer[$i],index($buffer[$i],'"normalSpan"')+13);
               }
               if (($firstline > -1) && ($buffer[$i] =~ m-<p></p></div></div>-)) {
                   $buffer[$i] = substr($buffer[$i],0,index($buffer[$i],'<p></p></div></div>'));
                   $lastline = $i;
               }
           }
       }
       if (!-e "$destdir/resfiles/$res") {
           mkdir("$destdir/resfiles/$res/",0755);
       }
       open(FILE,">$destdir/resfiles/$res/$res.html");
       print FILE qq|<html>
   <head>
   <title>$title</title>
   </head>
   <body bgcolor='#ffffff'>
       |;
       unless ($title eq '') {
           print FILE qq|<b>$title</b><br/>\n|;
       }
       unless ($$settings{subtitle} eq '') {
           print FILE qq|$$settings{subtitle}<br/>\n|;
       }
       print FILE "<br/>\n";
       if ($type eq "LINK") {
           foreach my $link (@{$$settings{links}}) {
               print FILE qq|<a href="$link">$link</a><br/>\n|; 
           }
       } elsif ($type eq "PAGE") {
           if ($firstline > -1) {
               for (my $i=$firstline; $i<=$lastline; $i++) {
                   print FILE "$buffer[$i]\n";
               }
           }
       }
       print FILE qq|
     </body>
    </html>|;
       close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process ANGEL message board messages
 sub angel_message {  sub angel_message {
     my ($msg_id,$contrib,$xmlfile) = @_;      my ($msg_id,$contrib,$xmlfile) = @_;
     my @state = ();      my @state = ();
Line 2562  sub angel_message { Line 2787  sub angel_message {
                my ($tagname) = @_;                 my ($tagname) = @_;
                pop @state;                 pop @state;
             }, "tagname"],              }, "tagname"],
      );      );
      $p->parse_file($xmlfile);      $p->parse_file($xmlfile);
      $p->eof;      $p->eof;
 }  }
   
   # ---------------------------------------------------------------- Get LON-CAPA Course Coordinator roles for this user
 sub get_ccroles {  sub get_ccroles {
     my ($uname,$dom,$crsentry) = @_;      my ($uname,$dom,$crsentry) = @_;
     my %roles = ();      my %roles = ();
Line 2716  sub handler { Line 2942  sub handler {
         my $bb_crs = '';          my $bb_crs = '';
         my $bb_cdom = '';          my $bb_cdom = '';
         my $bb_handling = '';          my $bb_handling = '';
           my $announce_handling = 'ok';
         my $source = $ENV{'form.source'};          my $source = $ENV{'form.source'};
         if ( defined($ENV{'form.bb_crs'}) ) {          if ( defined($ENV{'form.bb_crs'}) ) {
             ($bb_cdom,$bb_crs) = split/\//,$ENV{'form.bb_crs'};              ($bb_cdom,$bb_crs) = split/\//,$ENV{'form.bb_crs'};
Line 2732  sub handler { Line 2959  sub handler {
         if ( defined($ENV{'form.user_handling'}) ) {          if ( defined($ENV{'form.user_handling'}) ) {
             $users_handling = $ENV{'form.user_handling'};              $users_handling = $ENV{'form.user_handling'};
         }          }
         my ($totseq,$totpage,$totprob);          my ($result,$totseq,$totpage,$totprob,$totboard,$totquiz,$totsurv);
         print STDERR "Page name is $page_name\n";  
         if ($page_name eq 'ChooseDir') {          if ($page_name eq 'ChooseDir') {
             &display_zero ($r,$uname,$fn,$current_page,$fullpath);              &display_zero ($r,$uname,$fn,$current_page,$fullpath);
         } elsif ($page_name eq 'Confirmation') {          } elsif ($page_name eq 'Confirmation') {
             ($totseq,$totpage,$totprob) = &expand_bb5 ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling) if $source eq 'bb5';              ($result,$totseq,$totpage,$totboard,$totquiz,$totsurv,$totprob) = &expand_bb5 ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling,$announce_handling) if $source eq 'bb5';
             ($totseq,$totpage,$totprob) = &expand_angel ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling) if $source eq 'angel';              ($totseq,$totpage,$totboard) = &expand_angel ($result,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling) if $source eq 'angel';
             &expand_webct ($r,$uname,$udom,$fn,$current_page) if $source eq 'webct';              &expand_webct ($r,$uname,$udom,$fn,$current_page) if $source eq 'webct';
         }          }
         $r->print("<h3>Step 3: Publish your new LON-CAPA materials</h3>");          
         $r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, and $totprob problems have been created.<br /><br />\n");          if ($result eq 'nozip') {
               $r->print("<font face='arial,helvetica,sans-serif'>Processing of your IMS package failed, because you did not upload a IMS content package compressed in zip format.");
           } elsif ($result eq 'nomanifest') {
                $r->print("<font face='arial,helvetica,sans-serif'>Processing of your IMS package failed, because the IMS content package did not contain an IMS manifest file .");
           } else {
               $r->print("<h3>Step 3: Publish your new LON-CAPA materials</h3>");
               if ($source eq 'bb5') {
                   $r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, $totboard bulletin boards, $totquiz quizzes, $totsurv surveys and $totprob problems have been created.<br /><br />\n");
               } elsif ($source eq 'angel') {
                   $r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, and $totboard bulletin boards have been created.<br /><br />\n");
               }
           }
     } elsif ($ENV{'form.phase'} eq 'two') {      } elsif ($ENV{'form.phase'} eq 'two') {
         my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport');          my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport');
         if ($flag eq 'ok') {          if ($flag eq 'ok') {

Removed from v.1.3  
changed lines
  Added in v.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>