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

version 1.1, 2004/02/10 23:36:32 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 32  sub calculate_page($$) { Line 31  sub calculate_page($$) {
   
 # ----------------------------------------------------------------  Jscript Zero  # ----------------------------------------------------------------  Jscript Zero
 sub jscript_zero {  sub jscript_zero {
     my ($fullpath,$jsref) = @_;      my ($fullpath,$jsref,$uname,$dom) = @_;
     my $source = '';      my $source = '';
     if (exists($ENV{'form.go'}) ) {      if (exists($ENV{'form.go'}) ) {
         $source = $ENV{'form.go'};          $source = $ENV{'form.go'};
     }      }
       my %crsentry = ();
       my $course_list;
       my $title_list;
       my @crslist = ();
       @crslist = &get_ccroles($uname,$dom,\%crsentry);
       if (@crslist > 0) {
           $crsentry{$crslist[0]} =~ s/("|,)//g;
           $title_list = '"'.$crsentry{$crslist[0]}.'"';
           if (@crslist > 1) {
               for (my $i=1; $i<@crslist; $i++) {
                   $crsentry{$crslist[$i]} =~ s/("|,)//g;
                   $title_list .= ',"'.$crsentry{$crslist[$i]}.'"';
               }
           }
       }
       $course_list = '"'.join('","',@crslist).'"';
   
     $$jsref = <<"END_OF_ONE";      $$jsref = <<"END_OF_ONE";
 function verify() {  function verify() {
  if ((document.forms.dataForm.newdir.value == '')  || (!document.forms.dataForm.newdir.value)) {   if ((document.forms.dataForm.newdir.value == '')  || (!document.forms.dataForm.newdir.value)) {
Line 46  function verify() { Line 62  function verify() {
  if (document.forms.dataForm.source.selectedIndex == 0) {   if (document.forms.dataForm.source.selectedIndex == 0) {
    alert("You must choose the Course Management System from which the IMS package was exported");     alert("You must choose the Course Management System from which the IMS package was exported");
    return false     return false
  }    }
  return true   return true
 }  }
                                                                                                 
 function nextPage() {  function nextPage() {
  if (verify()) {   if (verify()) {
    document.forms.dataForm.go.value="NextPage"     document.forms.dataForm.go.value="NextPage"
Line 80  function createWin() { Line 96  function createWin() {
   newWindow.document.close()    newWindow.document.close()
   newWindow.focus()    newWindow.focus()
 }  }
   
   function setCourse(caller) {
    courseID_array = new Array($course_list)
    courseTitle_array = new Array($title_list)
    var step1Form = document.forms.dataForm
    var curVal = step1Form.elements[caller*2+3].options[step1Form.elements[caller*2+3].selectedIndex].value
    step1Form.elements[caller*2+4].length = 0
    if (step1Form.elements[caller*2+3].options[step1Form.elements[caller*2+3].selectedIndex].value == "-1") {
      step1Form.elements[caller*2+4].options[0] = new Option("<--- Set type ","-1",true,true)
    }
    else {
      if ((step1Form.elements[caller*2+3].selectedIndex == 2 ) || (step1Form.elements[caller*2+3].selectedIndex == 3)) {
        step1Form.elements[caller*2+4].options[0] = new Option("Please Select","-1",true,true)
        if (courseID_array.length > 0) {
            step1Form.elements[caller*2+4].options[0] = new Option("Please Select","-1",true,true)
            for (var i=0; i<courseID_array.length; i++) {
                step1Form.elements[caller*2+4].options[i+1] = new Option(courseTitle_array[i],courseID_array[i],false,false)
            }
        }
        else {
             step1Form.elements[caller*2+4].options[0] = new Option("No courses available","-2",true,true)
             step1Form.elements[caller*2+3].selectedIndex == 1
        }
        step1Form.elements[caller*2+4].selectedIndex = 0
      }
      else {
          step1Form.elements[caller*2+4].options[0] = new Option("Not required","0",true,true)
      }
    }
   }
   
 END_OF_ONE  END_OF_ONE
   
 }  }
   
 # ---------------------------------------------------------------- Display Zero  # ---------------------------------------------------------------- Display Zero
 sub display_zero {  sub display_zero {
     my ($r,$uname,$fn,$page) = @_;      my ($r,$uname,$fn,$page,$fullpath) = @_;
   
     $r->print(<<"END_OF_ONE");      $r->print(<<"END_OF_ONE");
  <h3><font face='arial,helvetica,sans-serif'>Step 1: Selection of IMS package type and destination directory for the package contents</b>&nbsp;</font></h3>  
 <form name="dataForm" method="post">  <form name="dataForm" method="post">
 <table border='0' bgcolor='#CCFFDD' cellspacing='0' cellpadding ='0' width='100%'>  <table border='0' bgcolor='#CCFFDD' cellspacing='0' cellpadding ='0' width='100%'>
     <tr>      <tr>
Line 100  sub display_zero { Line 145  sub display_zero {
         </td>          </td>
        </tr>         </tr>
        <tr bgcolor='#ccddaa'>         <tr bgcolor='#ccddaa'>
         <td width='30' align='top'>&nbsp;          <td valign='middle'><img src='/res/adm/pages/bl_step1.gif'>&nbsp;
         </td>          </td>
         <td width='100%' align='left'>&nbsp;&nbsp;          <td width='100%' align='left'>&nbsp;&nbsp;
          <font size='+1' face='arial,helvetica,sans-serif'><b>Specify the Course Management system used to create the package.</b></font>           <font face='arial,helvetica,sans-serif'><b>Specify the Course Management system used to create the package.</b>&nbsp;&nbsp;
            </font>
        </td>         </td>
       </tr>        </tr>
       <tr>        <tr>
Line 113  sub display_zero { Line 159  sub display_zero {
        <td>&nbsp;</td>         <td>&nbsp;</td>
        <td>         <td>
         <font face='Arial,Helvetica,sans-serif'>          <font face='Arial,Helvetica,sans-serif'>
 Please choose the CMS used to create your IMS content package.</font>  Please choose the CMS used to create your IMS content package.&nbsp;&nbsp;
        </td>  
       </tr>  
       <tr>  
        <td colspan='2'>&nbsp;</td>  
       </tr>  
       <tr>  
       <tr>  
        <td>&nbsp;</td>  
        <td>  
         <font face='Arial,Helvetica,sans-serif'>  
         <select name="source">          <select name="source">
          <option value='-1' selected="true">Please select           <option value='-1' selected="true">Please select
          <option value='bb5'>Blackboard 4 or 5           <option value='bb5'>Blackboard 5
          <option value='bb6'>Blackboard 6  
          <option value='angel'>ANGEL           <option value='angel'>ANGEL
          <option value='webct'>WebCT  
         </select>          </select>
           </font>
        </td>         </td>
       </tr>        </tr>
       <tr>        <tr>
        <td colspan='2'>&nbsp;</td>         <td colspan='2'>&nbsp;</td>
       </tr>        </tr>
         <tr>
          <td colspan='2'>&nbsp;</td>
         </tr>
       <tr bgcolor='#ccddaa'>        <tr bgcolor='#ccddaa'>
        <td width='30' align='top'>&nbsp;         <td valign='middle'><img src='/res/adm/pages/bl_step2.gif'>
        </td>         </td>
        <td width='100%' align='left'>&nbsp;&nbsp;         <td width='100%' align='left'>&nbsp;&nbsp;
         <font size='+1' face='arial,helvetica,sans-serif'><b>Create a directory where you will unpack your IMS package.</b></font>          <font face='arial,helvetica,sans-serif'><b>Create a directory where you will unpack your IMS package.</b>&nbsp;&nbsp;</font></td>
        </td>  
       </tr>        </tr>
       <tr>        <tr>
        <td colspan='2'>&nbsp;</td>         <td colspan='2'>&nbsp;</td>
       </tr>        </tr>
       <tr>  
        <td>&nbsp;</td>         <td>&nbsp;</td>
        <td>         <td>
         <font face='Arial,Helvetica,sans-serif'>          <font face='Arial,Helvetica,sans-serif'>
 Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file</font>  Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file. <input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></font>
          </td>
         </tr>
         <tr>
          <td colspan='2'>&nbsp;<br /><br /></td>
         </tr>
         <tr bgcolor='#ccddaa'>
          <td valign='middle'><img src='/res/adm/pages/bl_step3.gif'>
          </td>
          <td width='100%' align='left'>&nbsp;&nbsp;
           <font face='arial,helvetica,sans-serif'><b>Indicate how any discussion boards and user data in the package should be handled</b></font>
        </td>         </td>
       </tr>        </tr>
       <tr>        <tr>
Line 158  Please choose a destination LON-CAPA dir Line 204  Please choose a destination LON-CAPA dir
       </tr>        </tr>
       <tr>        <tr>
        <td>&nbsp;</td>         <td>&nbsp;</td>
        <td><input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></td>         <td>
           <table border='0' cellspacing='0' cellpadding='1' bgcolor='#000000'>
            <tr>
             <td>
              <table border='0' cellspacing='0' cellpadding='0' bgcolor='#ffffff' width='100%'>
               <tr>
                <td>
                 <table border='0' cellspacing='1' cellpadding='1' bgcolor='#CCFFDD' width='100%'>
                  <tr bgcolor='#ccddaa'>
                   <td align='center'><font face='arial,helvetica,sans-serif'><b>Type of data</b></font></td>
                   <td align='center'><font face='arial,helvetica,sans-serif'><b>Action</b></font></td>
                   <td align='center'><font face='arial,helvetica,sans-serif'><b>Target course</b></font></td>
                  </tr>
                  <tr bgcolor='#eeeeee'>
                   <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;Discussion boards&nbsp&nbsp;</font></td>
                   <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;
                    <select name='bb_handling' onChange="setCourse('0')">
                     <option value='-1'>Select
                     <option value='ignore'>Disregard
                     <option value='topics'>Import topics only
                     <option value='importall'>Import topics &amp; posts
                    </select>
                    </font>&nbsp;&nbsp;
                   </td>
                   <td align='left'>&nbsp;&nbsp;<font face='arial,helvetica,sans-serif'>
                    <select name='bb_crs'>
                     <option value='-1'>&lt;--Pick action first
                    </select>
                    </font>&nbsp;&nbsp;
                   </td>
                  </tr>
                  <tr bgcolor='#dddddd'>
                   <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;User information</font>&nbsp;&nbsp;</td>
                   <td align='left'>&nbsp;&nbsp;
                    <select name='user_handling' onChange="setCourse('1')">
                     <option value='-1'>Select
                     <option value='ignore'>Disregard
                     <option value='students'>Enroll students only
                     <option value='enrollall'>Emroll all users
                    </select>
                    </font>&nbsp;&nbsp;
                   </td>
                   <td align='left'>&nbsp;&nbsp;
                    <font face='arial,helvetica,sans-serif'>
                     <select name='user_crs'>
                      <option value='-1'>&lt;--Pick action first
                     </select>
                    </font>&nbsp;&nbsp;
                   </td>
                  </tr>
                 </table>
                </td>
               </tr>
              </table>
             </td>
            </tr>
           </table>
          </td>
       </tr>        </tr>
       <tr>        <tr>
        <td colspan='2'>&nbsp;</td>         <td colspan='2'>&nbsp;<br /><br /></td>
       </tr>        </tr>
       <tr>        <tr>
        <td>&nbsp;</td>         <td>&nbsp;</td>
        <td><font face='arial,helvetica,sans-serif'>If you have created a destination directory you should use the "Next Page" button to complete the process of unpacking your IMS package.</font></td>         <td><font face='arial,helvetica,sans-serif'>If you have created a destination directory, and have made your selections for the disposition of bulletin boards and user information, you should click the 'Convert' button to unpack your IMS package.</font></td>
       </tr>        </tr>
       <tr>        <tr>
        <td colspan='2'>         <td colspan='2'>
Line 183  Please choose a destination LON-CAPA dir Line 286  Please choose a destination LON-CAPA dir
        <td colspan='2'>         <td colspan='2'>
         <table border='0' cellspacing='0' cellpadding='0' width="100%">          <table border='0' cellspacing='0' cellpadding='0' width="100%">
          <tr>           <tr>
           <td align='left'>&nbsp;            <td align='left'>
              <input type='button' name='exitpage' value='Exit now' onClick="javascript:location.href='$fullpath'">
           </td>            </td>
           <td align='right'>            <td align='right'>
            <input type="button" name="nextpage" value="Continue to step 2" onClick="javascript:nextPage()">             <input type="button" name="nextpage" value="Convert" onClick="javascript:nextPage()">
           </td>            </td>
          </tr>           </tr>
         </table>          </table>
Line 200  Please choose a destination LON-CAPA dir Line 304  Please choose a destination LON-CAPA dir
 END_OF_ONE  END_OF_ONE
 }  }
   
 # ---------------------------------------------------------------- Display One  # ---------------------------------------------------------------- Expand Blackboard 5 imsmanifest 
                                                                                                 
 sub expand_bb5 {  sub expand_bb5 {
     my ($r,$uname,$udom,$fn,$page) = @_;      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 221  sub expand_bb5 { Line 325  sub expand_bb5 {
     my %resinfo = ();      my %resinfo = ();
     my $numfolders = 0;      my $numfolders = 0;
     my $numpages = 0;      my $numpages = 0;
       my @timestamp = ();
       my @boards = ();
       my @groups = ();
       my @announcements = ();
       my @quizzes = ();
       my @surveys = ();
       my $board_count = 0;
       my $board_id = time;
       my $totseq = 0;
       my $totpage = 0;
       my $totquiz = 0;
       my $totsurv = 0;
       my $totprob = 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 232  sub expand_bb5 { Line 349  sub expand_bb5 {
     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);
     }      } else {
           return 'nozip';
       } 
   
       unless (-e "$docroot/temp/imsmanifest.xml") {
           return 'nomanifest';
       } 
     my $xmlfile = $docroot.'/temp/imsmanifest.xml';      my $xmlfile = $docroot.'/temp/imsmanifest.xml';
 #    print STDERR "XML file is $xmlfile\n";  
     my $p = HTML::Parser->new      my $p = HTML::Parser->new
     (      (
        xml_mode => 1,         xml_mode => 1,
Line 252  sub expand_bb5 { Line 373  sub expand_bb5 {
                 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 "tableofcontents") ) {                  if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "tableofcontents") ) {
                   my $searchstr = "manifest organizations tableofcontents";                      my $searchstr = "manifest organizations tableofcontents";
                   while ($num > 0) {                      while ($num > 0) {
                     $searchstr .= " item";                          $searchstr .= " item";
                     $num --;                           $num --; 
                   }                      }
                   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};
                     $title{$itm} = $attr->{title};                          $revitm{$resnum{$itm}} = $itm;
                     if ($start > @seq) {                          $title{$itm} = $attr->{title};
                         unless ($lastitem eq '') {                          $contentscount{$itm} = 0;
                             push @seq, $lastitem;                          if ($start > @seq) {
                             unless ( defined($contents{$seq[-1]}) ) {                              unless ($lastitem eq '') {
                                 @{$contents{$seq[-1]}} = ();                                  push @seq, $lastitem;
                                   unless ( defined($contents{$seq[-1]}) ) {
                                       @{$contents{$seq[-1]}} = ();
                                   }
                                   push @{$contents{$seq[-1]}},$itm;
                                   $parentseq{$itm} = $seq[-1];
                             }                              }
                             push @{$contents{$seq[-1]}},$itm;  
                             $parentseq{$itm} = $seq[-1];   
                         }                          }
                           elsif ($start < @seq) {
                               my $diff = @seq - $start;
                               while ($diff > 0) {
                                   pop @seq;
                                   $diff --;
                               }
                               if (@seq) {
                                   push @{$contents{$seq[-1]}}, $itm;
                               }
                           } else {
                               push @{$contents{$seq[-1]}}, $itm;
                           }
                           my $path;
                           if (@seq > 1) {
                               $path = join(',',@seq);
                           } elsif (@seq > 0) {
                               $path = $seq[0];
                           }
                           $filepath{$itm} = $path;
                           $contentscount{$seq[-1]} ++;
                           $lastitem = $itm;
                     }                      }
                     elsif ($start < @seq) {  
                       my $diff = @seq - $start;  
                       while ($diff > 0) {  
                         pop @seq;  
                         $diff --;  
                       }  
                       if (@seq) {  
                         push @{$contents{$seq[-1]}}, $itm;  
                       }  
                     } else {  
                        push @{$contents{$seq[-1]}}, $itm;  
                     }  
                     my $path;  
                     if (@seq > 1) {  
                       $path = join(',',@seq);  
                     } elsif (@seq > 0) {  
                       $path = $seq[0];  
                     }  
                     $filepath{$itm} = $path;  
                     $contentscount{$seq[-1]} ++;  
                     $lastitem = $itm;  
                   }  
                 } elsif ("@state" eq "manifest resources resource" ) {                  } elsif ("@state" eq "manifest resources resource" ) {
                     $identifier = $attr->{identifier};                      $identifier = $attr->{identifier};
                     $base{$identifier} = $attr->{baseurl};                                       $base{$identifier} = $attr->{baseurl};                 
                     $file{$identifier} = $attr->{file};                      $file{$identifier} = $attr->{file};
                     $type{$identifier} = $attr->{type};                      $type{$identifier} = $attr->{type};
                 } elsif ("@state" eq "manifest resources resource file") {                  } elsif ("@state" eq "manifest resources resource file") {
                     push@{$href{$identifier}},$attr->{href};                      push @{$href{$identifier}},$attr->{href};
                 }                  }
            }, "tagname, attr"],             }, "tagname, attr"],
         text_h =>          text_h =>
Line 319  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;
 #    print STDERR "Destdir is $destdir\n";      my $seqstem ="/res/$udom/$uname/$newdir/sequences"; 
     if (!-e "$destdir") {      if (!-e "$destdir") {
         mkdir("$destdir",0755);          mkdir("$destdir",0755);
     }      }
Line 337  sub expand_bb5 { Line 459  sub expand_bb5 {
     if (!-e "$destdir/problems") {      if (!-e "$destdir/problems") {
         mkdir("$destdir/problems",0755);          mkdir("$destdir/problems",0755);
     }      }
     open(FILE,">$destdir/sequences/ims_import.sequence");  
     print FILE "<map>\n";  
   
     foreach my $key (sort keys %href) {      foreach my $key (sort keys %href) {
         foreach my $file (@{$href{$key}}) {          foreach my $file (@{$href{$key}}) {
             my $filepath = $file;              my $filepath = $file;
Line 362  sub expand_bb5 { Line 481  sub expand_bb5 {
             &process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname);              &process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname);
         } elsif ($type{$key} eq "resource/x-bb-staffinfo") {          } elsif ($type{$key} eq "resource/x-bb-staffinfo") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_staff($key,$docroot,$destdir,\%{$resinfo{$key}});              &process_staff($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
         } elsif ($type{$key} eq "resource/x-bb-externallink") {          } elsif ($type{$key} eq "resource/x-bb-externallink") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_link($key,$docroot,$destdir,\%{$resinfo{$key}});              &process_link($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
         } elsif ($type{$key} eq "resource/x-bb-discussionboard") {          } elsif ($type{$key} eq "resource/x-bb-discussionboard") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_db($key,$docroot,$destdir,\%{$resinfo{$key}});              unless ($bb_handling eq 'ignore') {
         } elsif ($type{$key} eq "resource/x-bb-announcement") {                  push @boards, $key;
             %{$resinfo{$key}} = ();                  $timestamp[$board_count] = $board_id;
             &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}});                  &process_db($key,$docroot,$destdir,$board_id,$bb_crs,$bb_cdom,$bb_handling,$uname,\%{$resinfo{$key}});
                   $board_id ++;
                   $board_count ++;
               }
         } 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}});              &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}});              &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}});              &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}} = ();
               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") {   
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_user($key,$docroot,$destdir,\%{$resinfo{$key}});              unless ($users_handling eq 'ignore') {
                   &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 404  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) {
 #        print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n";  
         $pageflag{$key} = 0;          $pageflag{$key} = 0;
         $seqflag{$key} = 0;          $seqflag{$key} = 0;
         $seqcount{$key} = 0;          $seqcount{$key} = 0;
Line 453  sub expand_bb5 { Line 605  sub expand_bb5 {
             $areacount = 0;              $areacount = 0;
         } else {          } else {
             if ($filepath{$key} eq "Top,$areakey") {              if ($filepath{$key} eq "Top,$areakey") {
 #                print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n";  
                 my $src = '';                  my $src = '';
                 if ($areacount == 0) {                  if ($areacount == 0) {
                     if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") {                      if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") {
Line 512  sub expand_bb5 { Line 663  sub expand_bb5 {
             my $next_id = 1;              my $next_id = 1;
             my $curr_id = 0;              my $curr_id = 0;
             if ( (($type{$resnum{$key}} eq "resource/x-bb-document") || ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") || ($type{$resnum{$key}} eq "resource/x-bb-externallink")) && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) {              if ( (($type{$resnum{$key}} eq "resource/x-bb-document") || ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") || ($type{$resnum{$key}} eq "resource/x-bb-externallink")) && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) {
 #   if ( ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) {  
 #      print "$key $filepath{$key} $resnum{$key} $title{$key}\n";  
 #      print "Folder for item - $key - res - $resnum{$key}\n";   
 #      print "$key, $contentscount{$key}\n";  
 #      foreach (@{$contents{$key}}) {  
 #          print "$key, $_\n";  
 #      }  
 #                print STDERR "Contents Count for $key is $contentscount{$key}\n";  
                 open(LOCFILE,">$destdir/sequences/$key.sequence");                  open(LOCFILE,">$destdir/sequences/$key.sequence");
                 print LOCFILE "<map>\n";                  print LOCFILE "<map>\n";
                   $totseq ++;
                 if ($contentscount{$key} == 0) {                  if ($contentscount{$key} == 0) {
                     print LOCFILE qq|<resource id="1" src="" type="start"></resource>                      print LOCFILE qq|<resource id="1" src="" type="start"></resource>
 <link from="1" to="2" index="1"></link>  <link from="1" to="2" index="1"></link>
Line 603  sub expand_bb5 { Line 747  sub expand_bb5 {
                             } else {                              } else {
                                 print LOCFILE qq| type="finish"></resource>\n|;                                  print LOCFILE qq| type="finish"></resource>\n|;
                             }                              }
                             print STDERR "seqcount is $seqcount{$key}, pagecount is $pagecount{$key} for $key\n";  
                         } else {                          } else {
                             $curr_id ++;                              $curr_id ++;
                             $next_id ++;                              $next_id ++;
Line 618  sub expand_bb5 { Line 761  sub expand_bb5 {
             }              }
         }          }
     }      }
   
       if ($fileopen) {
           if ($areacount == 0) {
               print AREAFILE qq|<resource id="1" src="" type="start">
   <link from="1" to="2" index="1"></link>
   <resource id="2" src="" type="finish">\n|;
           } elsif ($areacount == 1) {
               print AREAFILE qq|<resource id="2" src="" type="finish">\n|;
           } else {
               print AREAFILE qq|$lastentry\n|;
           }
           print AREAFILE "</map>\n";
           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);
     foreach my $key (sort keys %pagecontents) {      foreach my $key (sort keys %pagecontents) {
         for (my $i=0; $i<@{$pagecontents{$key}}; $i++) {          for (my $i=0; $i<@{$pagecontents{$key}}; $i++) {
             my $filestem = "/res/$udom/$uname/$newdir";              my $filestem = "/res/$udom/$uname/$newdir";
             my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';              my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';
               $totpage ++;
             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]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource>
Line 647  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('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) = @_;    my ($res,$docroot,$destdir,$settings,$user_crs,$user_cdom,$user_handling) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";    my $xmlfile = $docroot."/temp/".$res.".dat";
   my $filecount = 0;    my $filecount = 0;
   my @state;    my @state;
Line 665  sub process_user { Line 920  sub process_user {
      [sub {       [sub {
         my ($tagname, $attr) = @_;          my ($tagname, $attr) = @_;
         push @state, $tagname;          push @state, $tagname;
         if (@state eq " USERS USER") {          if (@state eq "USERS USER") {
             $userid = $attr->{value};              $userid = $attr->{value};
             %{$$$settings{$userid}} = ();              %{$$settings{$userid}} = ();
             @{$$settings{$userid}{links}} = ();              @{$$settings{$userid}{links}} = ();
         } elsif (@state eq "USERS USER LOGINID") {            } elsif (@state eq "USERS USER LOGINID") {  
             $$settings{$userid}{loginid} = $attr->{value};              $$settings{$userid}{loginid} = $attr->{value};
Line 718  sub process_user { Line 973  sub process_user {
   $p->unbroken_text(1);    $p->unbroken_text(1);
   $p->parse_file($xmlfile);    $p->parse_file($xmlfile);
   $p->eof;    $p->eof;
     
     my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf');
     my $xmlstem =  $$configvars{'lonDaemons'}."/tmp/".$user_cdom."_".$user_crs."_";
   
     foreach my $user_id (keys %{$settings}) {
         if ($$settings{$user_id}{user_role} eq "s") {
              
         } elsif ($user_handling eq 'enrollall') {
   
         }
     }
 }  }
   
   # ---------------------------------------------------------------- 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 770  sub process_group { Line 1037  sub process_group {
   $p->eof;    $p->eof;
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Staff
 sub process_staff {  sub process_staff {
   my ($res,$docroot,$destdir,$settings) = @_;    my ($res,$docroot,$dirname,$destdir,$settings) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";    my $xmlfile = $docroot."/temp/".$res.".dat";
   my $filecount = 0;    my $filecount = 0;
   my @state;    my @state;
Line 787  sub process_staff { Line 1055  sub process_staff {
         push @state, $tagname;          push @state, $tagname;
         if (@state eq "STAFFINFO TITLE") {          if (@state eq "STAFFINFO TITLE") {
             $$settings{title} = $attr->{value};              $$settings{title} = $attr->{value};
         } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") {            } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") {
             $$settings{textcolor} = $attr->{value};              $$settings{textcolor} = $attr->{value};
         } elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") {            } elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") {
             $$settings{ishtml} = $attr->{value};                                             $$settings{ishtml} = $attr->{value};
         } elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) {          } elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) {
             $$settings{isavailable} = $attr->{value};              $$settings{isavailable} = $attr->{value};
         } elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) {          } elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) {
Line 834  sub process_staff { Line 1102  sub process_staff {
   $p->unbroken_text(1);    $p->unbroken_text(1);
   $p->parse_file($xmlfile);    $p->parse_file($xmlfile);
   $p->eof;    $p->eof;
   
       my $fontcol = '';
       if (defined($$settings{textcolor})) {
           $fontcol =  qq|color="$$settings{textcolor}"|;
       }
       if (defined($$settings{text})) {
           if ($$settings{ishtml} eq "true") {
               $$settings{text} = &HTML::Entities::decode($$settings{text});
           }
       }
       my $staffentry = qq|
   <table border="0" cellpadding="0" cellspacing="0" width="100%">
     <tr>
       <td colspan="2"><hr /><font face="arial,helv" size="3"><b>$$settings{name}{formaltitle} $$settings{name}{given} $$settings{name}{family}</b></font>
       </td>
     </tr>
     <tr>
       <td valign="top">
         <table width="100% border="0" cols="2" cellpadding="0" cellspacing="0">|;
       if ( defined($$settings{email}) && $$settings{email} ne '') {
           $staffentry .= qq|
           <tr>
             <td width="100" valign="top">
              <font face="arial" size="2"><b>Email:</b></font>
             </td>
             <td>
              <font face="arial" size="2"><a href="mailto:$$settings{email}">$$settings{email}</a></font>
             </td>
           </tr>
           |;
       }
       if (defined($$settings{phone}) && $$settings{phone} ne '') {
           $staffentry .= qq|
           <tr>
             <td width="100" valign="top">
               <font face="arial" size="2"><b>Phone:</b></font>
             </td>
             <td>
               <font face="arial" size="2">$$settings{phone}</font>
             </td>
           </tr>
           |;
       }
       if (defined($$settings{office}{address}) && $$settings{office}{address} ne '') {
           $staffentry .= qq|
           <tr>
            <td width="100" valign="top">
              <font face="arial" size="2"><b>Address:</b></font>
            </td>
            <td>
              <font face="arial" size="2">$$settings{office}{address}</font>
            </td>
           </tr>
           |;
       }
       if (defined($$settings{office}{hours}) && $$settings{office}{hours} ne '') {
           $staffentry .= qq|
           <tr>
             <td width="100" valign="top">
               <font face="arial" size="2"><b>Office Hours:</b></font>
             </td>
             <td>
               <font face=arial size=2>$$settings{office}{hours}</font>
             </td>
           </tr>
           |;
       }
       if ( defined($$settings{homepage}) && $$settings{homepage} ne '') {
           $staffentry .= qq|
           <tr>
             <td width="100" valign="top">
               <font face="arial" size="2"><b>Personal Link:</b></font>
             </td>
             <td>
               <font face="arial" size="2"><a href="$$settings{homepage}">$$settings{homepage}</a></font>
             </td>
           </tr>
           |;
       }
       if (defined($$settings{text}) && $$settings{text} ne '') {
           $staffentry .= qq|
           <tr>
             <td colspan="2">
               <font face="arial" size="2" $fontcol><b>Other Information:</b><br/>$$settings{text}</font>
             </td>
           </tr>
           |;
        }
        $staffentry .= qq|
         </table>
       </td>
       <td align="right" valign="top">
        |;
        if ( defined($$settings{image}) ) {
            $staffentry .= qq|
         <img src="$dirname/resfiles/$res/$$settings{image}">
            |;
        }
        $staffentry .= qq|
       </td>
     </tr>
   </table>
       |;
       open(FILE,">$destdir/resfiles/$res.html");
       print FILE qq|<html>
   <head>
   <title>$$settings{title}</title>
   </head>
   <body bgcolor='#ffffff'>
   $staffentry
   </body>
   </html>|;
       close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Links
 sub process_link {  sub process_link {
   my ($res,$docroot,$destdir,$settings) = @_;      my ($res,$docroot,$dirname,$destdir,$settings) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
   my @state = ();      my @state = ();
   %{$$settings{name}} = ();      my $p = HTML::Parser->new
   %{$$settings{office}} = ();    
   
   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 "EXTERNALLINK TITLE") {              if (@state eq "EXTERNALLINK TITLE") {
             $$settings{title} = $attr->{value};                  $$settings{title} = $attr->{value};
         } elsif (@state eq "EXTERNALLINK TEXTCOLOR") {                } elsif (@state eq "EXTERNALLINK TEXTCOLOR") {  
             $$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"],
           text_h =>
           [sub {
               my ($text) = @_;
               if ("@state" eq "EXTERNALLINK DESCRIPTION TEXT") {
                  $$settings{text} = $text;
               }
           }, "dtext"],
           end_h =>
           [sub {
               my ($tagname) = @_;
               pop @state;
           }, "tagname"],
       );
       $p->unbroken_text(1);
       $p->parse_file($xmlfile);
       $p->eof;
   
       my $linktag = '';
       my $fontcol = '';
       if (defined($$settings{textcolor})) {
           $fontcol =  qq|<font color="$$settings{textcolor}">|;
       }
       if (defined($$settings{text})) {
           if ($$settings{ishtml} eq "true") {
               $$settings{text} = &HTML::Entities::decode($$settings{text});
         }          }
      }, "tagname, attr"],      }
      text_h =>  
      [sub {      if (defined($$settings{url}) ) {
         my ($text) = @_;          $linktag = qq|<a href="$$settings{url}"|;
         if ("@state" eq "EXTERNALLINKS DESCRIPTION TEXT") {          if ($$settings{newwindow} eq "true") {
           $$settings{text} = $text;              $linktag .= qq| target="launch"|;
         }          }
       }, "dtext"],          $linktag .= qq|>$$settings{title}</a>|;
      end_h =>      }
      [sub {  
         my ($tagname) = @_;      open(FILE,">$destdir/resfiles/$res.html");
         pop @state;      print FILE qq|<html>
      }, "tagname"],  <head>
     );  <title>$$settings{title}</title>
   $p->unbroken_text(1);  </head>
   $p->parse_file($xmlfile);  <body bgcolor='#ffffff'>
   $p->eof;  $fontcol
   $linktag
   $$settings{text}
   |;
       if (defined($$settings{textcolor})) {
           print FILE qq|</font>|;
       }
       print FILE qq|
     </body>
    </html>|;
       close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process Blackboard Discussion Boards
 sub process_db {  sub process_db {
   my ($res,$docroot,$destdir,$settings) = @_;      my ($res,$docroot,$destdir,$timestamp,$crs,$cdom,$handling,$uname,$settings) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";      my $xmlfile = $docroot."/temp/".$res.".dat";
   my @state = ();      my @state = ();
   my %threads; # all quotes, keyed by message ID      my @allmsgs = ();
   my $msg_id; # the current message ID      my %msgidx = ();
   my %message; # the current message being accumulated for $msg_id      my $longcrs = '';
       if ($crs =~ m/^(\d)(\d)(\d)/) {
           $longcrs = $1.'/'.$2.'/'.$3.'/'.$crs;
       }
       my %threads; # all threads, keyed by message ID
       my $msg_id; # the current message ID
       my %message; # the current message being accumulated for $msg_id
   
   my $p = HTML::Parser->new      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;
         my $depth = 0;             my $depth = 0;
         my @seq = ();             my @seq = ();
         if (@state eq "FORUM TITLE") {             if ("@state" eq "FORUM TITLE") {
             $$settings{title} = $attr->{value};                 $$settings{title} = $attr->{value};
         } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") {               } elsif ("@state" eq "FORUM DESCRIPTION TEXTCOLOR") {  
             $$settings{textcolor} = $attr->{value};                 $$settings{textcolor} = $attr->{value};
         } elsif (@state eq "FORUM DESCRIPTION FLAGS ISHTML") {               } elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISHTML") {  
             $$settings{ishtml} = $attr->{value};                 $$settings{ishtml} = $attr->{value};
         } elsif (@state eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") {               } elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") {  
             $$settings{newline} = $attr->{value};                 $$settings{newline} = $attr->{value};
         } elsif ("@state" eq "FORUM POSITION" ) {             } elsif ("@state" eq "FORUM POSITION" ) {
             $$settings{position} = $attr->{value};                 $$settings{position} = $attr->{value};
         } elsif ("@state" eq "FORUM FLAGS ISREADONLY") {             } elsif ("@state" eq "FORUM FLAGS ISREADONLY") {
             $$settings{isavailable} = $attr->{value};                                                                       $$settings{isreadonly} = $attr->{value};
         } elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) {             } elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) {
             $$settings{isavailable} = $attr->{value};                 $$settings{isavailable} = $attr->{value};
         } elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) {             } elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) {
             $$settings{isfolder} = $attr->{value};                 $$settings{allowanon} = $attr->{value};
         } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {             } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {
             if ($state[@state-1] eq "MSG") {                 if ($state[-1] eq "MSG") {
                 $depth = @state - 3;                     unless ($msg_id eq '') {
                 if ($depth > @seq) {                         push @{$threads{$msg_id}}, { %message };
                     unless ($msg_id eq '') {                         $depth = @state - 3;
                         push @seq, $msg_id;                          if ($depth > @seq) {
                     }                             push @seq, $msg_id; 
                 }                         }
                 if ($depth < @seq) {                     }
                     pop @seq;                     if ($depth < @seq) {
                 }                                         pop @seq;
                 $msg_id = $attr->{value};                                     }                
                 %message = ();                     $msg_id = $attr->{id};
                 $message{depth} = $depth;                     push @allmsgs, $msg_id;
                 if ($depth > 0) {                     $msgidx{$msg_id} = @allmsgs;
                     $message{parent} = $seq[-1];                     %message = ();
                 } else {                     $message{depth} = $depth;
                     $message{parent} = "None";                     if ($depth > 0) {
                 }                         $message{parent} = $seq[-1];
             } elsif ($state[@state-1] eq "TITLE") {                     } else {
                 $message{title} = $attr->{value};                         $message{parent} = "None";
             } elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISHTML" ) ) {                     }
                 $message{ishtml} = $attr->{value};                 } elsif ($state[-1] eq "TITLE") {
             } elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISNEWLINELITERAL" ) ) {                     $message{title} = $attr->{value};
                 $message{newline} = $attr->{value};                 } elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISHTML" ) ) {
             } elsif ( ( $state[@state-2] eq "DATES" ) && ( $state[@state-1] eq "CREATED" ) ) {                     $message{ishtml} = $attr->{value};
                 $message{created} = $attr->{value};                 } elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISNEWLINELITERAL" ) ) {
             } elsif ( $state[@state-2] eq "FLAGS") {                     $message{newline} = $attr->{value};
                 if ($state[@state-1] eq "ISANONYMOUS") {                 } elsif ( ( $state[-2] eq "DATES" ) && ( $state[-1] eq "CREATED" ) ) {
                     $message{isanonymous} =  $attr->{value};                     $message{created} = $attr->{value};
                 }                 } elsif ( $state[@state-2] eq "FLAGS") {
             } elsif ( $state[@state-2] eq "USER" ) {                     if ($state[@state-1] eq "ISANONYMOUS") {
                 if ($state[@state-1] eq "USERID") {                         $message{isanonymous} =  $attr->{value};
                     $message{userid} =  $attr->{value};                     }
                 } elsif ($state[@state-1] eq "USERNAME") {                 } elsif ( $state[-2] eq "USER" ) {
                     $message{username} =  $attr->{value};                     if ($state[-1] eq "USERID") {
                 } elsif ($state[@state-1] eq "EMAIL") {                         $message{userid} =  $attr->{value};
                     $message{email} =  $attr->{value};                     } elsif ($state[@state-1] eq "USERNAME") {
                 }                                   $message{username} =  $attr->{value};
             } elsif ( ($state[@state-2] eq "FILELIST") && ($state[@state-2] eq "IMAGE") ) {                     } elsif ($state[@state-1] eq "EMAIL") {
                 $message{attachment} = $attr->{value};                         $message{email} =  $attr->{value};
                      }          
                  } elsif ( ($state[-2] eq "FILELIST") && ($state[-1] eq "IMAGE") ) {
                      $message{attachment} = $attr->{value};
                  }
              }
          }, "tagname, attr"],
          text_h =>
          [sub {
              my ($text) = @_;
              if ("@state" eq "FORUM DESCRIPTION TEXT") {
                  $$settings{text} = $text;
              } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {
                  if ( ($state[-2] eq "MESSAGETEXT") && ($state[-1] eq "TEXT") ){
                      $message{text} = $text;
                  }
              }
          }, "dtext"],
          end_h =>
          [sub {
              my ($tagname) = @_;
              if ( $state[-1] eq "MESSAGETHREADS" ) {
                  push @{$threads{$msg_id}}, { %message };
              }
              pop @state;
          }, "tagname"],
       );
       $p->unbroken_text(1);
       $p->parse_file($xmlfile);
       $p->eof;
   
       if (defined($$settings{text})) {
           if ($$settings{ishtml} eq "false") {
               if ($$settings{isnewline} eq "true") {
                   $$settings{text} =~ s#\n#<br/>#g;
             }              }
           } else {
               $$settings{text} = &HTML::Entities::decode($$settings{text});
         }          }
      }, "tagname, attr"],          if (defined($$settings{fontcolor}) ) {
      text_h =>              $$settings{text} = "<font color=\"".$$settings{textcolor}."\">".$$settings{text}."</font>";
      [sub {  
         my ($text) = @_;  
         if ("@state" eq "FORUM DESCRIPTION TEXT") {  
             $$settings{text} = $text;  
         } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {  
               if ( ($state[@state-2] eq "MESSAGETEXT") && ($state[@state-1] eq "TEXT") ){  
                   $message{text} = $text;  
               }  
         }          }
       }, "dtext"],      }
      end_h =>      my $boardname = 'bulletinpage_'.$timestamp;
      [sub {      my %boardinfo = (
         my ($tagname) = @_;                    'aaa_title' => $$settings{title},
         if ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {                    'bbb_content' => $$settings{text},
             if ($state[@state-1] eq "MSG") {                    'ccc_webreferences' => '',
                 push @{$threads{$msg_id}}, { %message };                    'uploaded.lastmodified' => time,
                     );
     
       my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$cdom,$crs);
       if ($handling eq 'importall') {
           foreach my $msg_id (@allmsgs) {
               foreach my $message ( @{$threads{$msg_id}} ) {
                   my %contrib = (
                               'sendername' => $$message{userid},
                               'senderdomain' => $cdom,
                               'screenname' => '',
                               'plainname' => $$message{username},
                               );
                   unless ($$message{parent} eq 'None') {
                       $contrib{replyto} = $msgidx{$$message{parent}};
                   }
                   if (defined($$message{isanonymous}) ) {
                       if ($$message{isanonymous} eq 'true') {
                           $contrib{'anonymous'} = 'true';
                       }
                   }
                   if ( defined($$message{attachment}) )  {
                       my $url = $$message{attachment};
                       my $oldurl = $url;
                       my $newurl = $url;
                       unless ($url eq '') {
                           $newurl =~ s/\//_/g;
                           unless ($longcrs eq '') {
                               if (!-e "/home/httpd/lonUsers/$cdom/$longcrs/userfiles") {
                                   mkdir("/home/httpd/lonUsers/$cdom/$longcrs/userfiles",0755);
                               }
                               if (!-e "/home/httpd/lonUsers/$cdom/$longcrs/userfiles/$newurl") {
                                   system("cp $destdir/resfiles/$res/$$message{attachment} /home/httpd/lonUsers/$cdom/$longcrs/userfiles/$newurl");
                               }
                               $contrib{attachmenturl} = '/uploaded/'.$cdom.'/'.$crs.'/'.$newurl;
                           }
                       }
                   }
                   if (defined($$message{title}) ) {
                       $contrib{'message'} = $$message{title};
                   }
                   if (defined($$message{text})) {
                       if ($$message{ishtml} eq "false") {
                           if ($$message{isnewline} eq "true") {
                               $$message{text} =~ s#\n#<br/>#g;
                           }
                       } else {
                           $$message{text} = &HTML::Entities::decode($$message{text});
                       }
                       $contrib{'message'} .= '<br /><br />'.$$message{text};
                       my $symb = 'bulletin___'.$timestamp.'___adm/wrapper/adm/'.$cdom.'/'.$uname.'/'.$timestamp.'/bulletinboard';
                       my $postresult = &addposting($symb,\%contrib,$cdom,$crs);
                   }
             }              }
         }          }
         pop @state;      }
      }, "tagname"],  
     );  
   $p->unbroken_text(1);  
   $p->parse_file($xmlfile);  
   $p->eof;  
 }  }
   
   # ---------------------------------------------------------------- Add Posting to Bulletin Board
   sub addposting {
       my ($symb,$contrib,$cdom,$crs)=@_;
       my $status='';
       if (($symb) && ($$contrib{message})) {
            my $crsdom = $cdom.'_'.$crs;
            &Apache::lonnet::store($contrib,$symb,$crsdom,$cdom,$crs);
            my %storenewentry=($symb => time);
            &Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs);
       }
       my %record=&Apache::lonnet::restore('_discussion');
       my ($temp)=keys %record;
       unless ($temp=~/^error\:/) {
           my %newrecord=();
           $newrecord{'resource'}=$symb;
           $newrecord{'subnumber'}=$record{'subnumber'}+1;
           &Apache::lonnet::cstore(\%newrecord,'_discussion');
           $status = 'ok';
       } else {
           $status.='Failed.';
       }
       return $status;
   }
   # ---------------------------------------------------------------- Process Blackboard Assessments - pools, quizzes, surveys
 sub process_assessment {  sub process_assessment {
   my ($res,$docroot,$container,$dirname,$destdir,$settings) = @_;      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 1017  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 1046  sub process_assessment { Line 1569  sub process_assessment {
         }              }    
         if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") {            if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") {  
             $id = $attr->{id};              $id = $attr->{id};
             push @allids, $id;              unless ($container eq 'pool') {
                   push @allids, $id;
               }
             %{$$settings{$id}} = ();              %{$$settings{$id}} = ();
             @{$allanswers{$id}} = ();              @{$allanswers{$id}} = ();
             $$settings{$id}{class} = $attr->{class};              $$settings{$id}{class} = $attr->{class};
Line 1056  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 1082  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 1134  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";
   foreach my $id (@allids) {      my $pagedir = "$destdir/pages";
 #      print "Current ID is $id, type is $$settings{$id}{class} \n";      my $curr_id = 0;
       if ($$settings{$id}{class} eq "QUESTION_ESSAY") {      my $next_id = 1;
           my $output;      unless ($container eq 'pool') {
           if ($container eq 'pool') {          open(PAGEFILE,">$pagedir/$res.page");
               $output = qq|<problem>          print PAGEFILE qq|<map>
  <startouttext />$$settings{$id}{text}<endouttext />  
 |;  
           } else {  
               $output = qq|<problem>  
  <startouttext />$$settings{$id}{text}<endouttext />  
 |;  
           }  
           $output .= qq|  
    <essayresponse>  
    <textfield></textfield>  
    </essayresponse>  
    <postanswerdate>  
    $$settings{$id}{feedbackcorr}  
    </postanswerdate>  
 |;  
           if ($container eq 'pool') {  
               $output .= qq|</problem>  
         |;  
               open(PROB,">$newdir/$id.problem");  
               print PROB $output;  
               close PROB;  
           } else {  
               $output .= qq|</problem>  
         |;  
               open(PROB,">$newdir/$id.problem");  
               print PROB $output;  
               close PROB;  
           }  
       } else {  
     my $output;  
     if ($container eq 'pool') {   
         $output = qq|<problem>  
 |;  |;
     } else {          $$totpageref ++; 
         $output = qq|<problem>          print PAGEFILE qq|<resource id="1" src="/res/$udom/$uname/$resdir/problems/$dirtitle/$allids[0].problem" type="start"></resource>|;
 |;          if (@allids == 1) {
     }              print PAGEFILE qq|
     $output .= qq|<startouttext />$$settings{$id}{text}\n|;  <link from="1" to="2" index="1"></link>
     if ( defined($$settings{$id}{image}) ) {   <resource id="2" src="" type="finish">\n|;
         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>
    </radiobuttonresponse>     </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++) {
             unless ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/^\d+\.?\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>
         |;  
     }  
     if ($container eq 'pool') {  
         $output .= qq|</problem>  
         |;  
         open(PROB,">$newdir/$id.problem");  
         print PROB $output;  
         close PROB;  
     } else {  
         $output .= qq|</problem>  
         |;  
         open(PROB,">$newdir/$id.problem");  
         print PROB $output;  
         close PROB;  
     }  
   
       }  
   }  
 }  
   
   
 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 $id;      my @assess = ();
   my $p = HTML::Parser->new      my $id;
       my $p = HTML::Parser->new
     (      (
      xml_mode => 1,       xml_mode => 1,
      start_h =>       start_h =>
Line 1447  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}} = ();
               push @assess,$id;
         } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) {          } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) {
             my $key = $attr->{key};              my $key = $attr->{key};
             $$settings{startassessment}{$id}{$key} = $attr->{value};              $$settings{startassessment}{$id}{$key} = $attr->{value};
Line 1466  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{maindata}{text} = $text;              $$settings{text} = $text;
 #          print "TEXT $text\n";  
         }          }
       }, "dtext"],        }, "dtext"],
      end_h =>       end_h =>
Line 1476  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 ($$settings{ishtml} eq "false") {
               if ($$settings{isnewline} eq "true") {
                   $$settings{text} =~ s#\n#<br/>#g;
               }
           } else {
               $$settings{text} = &HTML::Entities::decode($$settings{text});
           }
       }
     
       if (@assess > 0) {
           foreach my $id (@assess) {
               $$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.";
           }
       }
   
       open(FILE,">$destdir/resfiles/$res.html");
       print FILE qq|<html>
   <head>
   <title>$$settings{title}</title>
   </head>
   <body bgcolor='#ffffff'>
   <table>
    <tr>
     <td bgcolor='#CCCCFF'>$$settings{title} - announcement date: $$settings{date}</td>
    </tr>
   </table>
   <br/>
   $$settings{text}
   |;
       print FILE qq|
     </body>
    </html>|;
       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 1510  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 1531  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 1542  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>
    </html>|;
       close(FILE);
   }
   
   # ---------------------------------------------------------------- Expand ANGEL IMS package
   sub expand_angel {
       my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling) = @_;
       my @state = ();
       my @seq = "Top";
       my $lastitem;
       my $itm = '';
       my %resnum = ();
       my %revitm = ();
       my %title = ();
       my %filepath = ();
       my %contentscount = ("Top" => 0);
       my %contents = ();
       my %parentseq = ();
       my %file = ();
       my %type = ();
       my %href = ();
       my $identifier = '';
       my %resinfo = ();
       my $numfolders = 0;
       my $numpages = 0;
       my $totseq = 0;
       my $totpage = 0;
       my $totquiz = 0;
       my $totsurv = 0;
       my $docroot = $ENV{'form.newdir'};
       if (!-e "$docroot/temp") {
           mkdir "$docroot/temp";
       }
       my $newdir = '';
       if ($docroot =~ m|public_html/(.+)$|) {
           $newdir = $1;
       }
       my $dirname = "/res/$udom/$uname/$newdir";
       my $zipfile = '/home/'.$uname.'/public_html'.$fn;
       if ($fn =~ m|\.zip$|i) {
           open(OUTPUT, "unzip -o $zipfile -d $docroot/temp  2> /dev/null |");
           while (<OUTPUT>) {
               print "$_<br />";
           }
           close(OUTPUT);
       }
                                                                                                       
       my $xmlfile = $docroot.'/temp/imsmanifest.xml';
       my $p = HTML::Parser->new
       (
          xml_mode => 1,
          start_h =>
              [sub {
                   my ($tagname, $attr) = @_;
                   push @state, $tagname;
                   my $num = @state - 3;
                   my $start = $num;
                   my $statestr = '';
                   foreach (@state) {
                       $statestr .= "$_ ";
                   }
                   if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "organization") ) {
                     my $searchstr = "manifest organizations organization";
                     while ($num > 0) {
                       $searchstr .= " item";
                       $num --;
                     }
                     if (("@state" eq $searchstr) && (@state > 3)) {
                       $itm = $attr->{identifier};
                       $contentscount{$itm} = 0;
                       if ($attr->{identifierref} =~ m/^res(.+)$/) {
                           $resnum{$itm} = $1;
                       }
                       $revitm{$resnum{$itm}} = $itm;
                       if ($start > @seq) {
                           unless ($lastitem eq '') {
                               push @seq, $lastitem;
                               unless ( defined($contents{$seq[-1]}) ) {
                                   @{$contents{$seq[-1]}} = ();
                               }
                               push @{$contents{$seq[-1]}},$itm;
                               $parentseq{$itm} = $seq[-1];
                           }
                       }
                       elsif ($start < @seq) {
                           my $diff = @seq - $start;
                           while ($diff > 0) {
                               pop @seq;
                               $diff --;
                           }
                           if (@seq) {
                               push @{$contents{$seq[-1]}}, $itm;
                           }
                       } else {
                          push @{$contents{$seq[-1]}}, $itm;
                       }
                       my $path;
                       if (@seq > 1) {
                           $path = join(',',@seq);
                       } elsif (@seq > 0) {
                           $path = $seq[0];
                       }
                       $filepath{$itm} = $path;
                       $contentscount{$seq[-1]} ++;
                       $lastitem = $itm;
                     }
                   } elsif ("@state" eq "manifest resources resource" ) {
                       $identifier = $attr->{identifier};
                       $identifier = substr($identifier,3);
                       if ($attr->{href} =~ m-^_assoc/$identifier/(.+)$-) {
                           $file{$identifier} = $1;
                       }
                       @{$href{$identifier}} = ();
                   } elsif ("@state" eq "manifest resources resource file") {
                       if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) {
                           push @{$href{$identifier}},$1;
                       } elsif ($attr->{href} =~ m/^Icons\\icon(\w+)\.gif/) {
                           $type{$identifier} = $1;
                       }
                   }
              }, "tagname, attr"],
           text_h =>
               [sub {
                   my ($text) = @_;
                   if ($state[0] eq "manifest" && $state[1] eq "organizations" && $state[2] eq "organization" && $state[-1] eq "title") {
                       $title{$itm} = $text;
                   }
                 }, "dtext"],
           end_h =>
                 [sub {
                     my ($tagname) = @_;
                     pop @state;
                  }, "tagname"],
       );
       $p->parse_file($xmlfile);
       $p->eof;
                                                                                                       
       my $topnum = 0;
       my $destdir = $docroot;
       if (!-e "$destdir") {
           mkdir("$destdir",0755);
       }
       if (!-e "$destdir/sequences") {
           mkdir("$destdir/sequences",0755);
       }
       if (!-e "$destdir/resfiles") {
           mkdir("$destdir/resfiles",0755);
       }
       if (!-e "$destdir/pages") {
           mkdir("$destdir/pages",0755);
       }
       if (!-e "$destdir/problems") {
           mkdir("$destdir/problems",0755);
       }
       foreach my $key (sort keys %href) {
           foreach my $file (@{$href{$key}}) {
               $file =~ s-\\-/-g;
               unless ($file eq 'pg'.$key.'.htm') {
                   if (!-e "$destdir/resfiles/$key") {
                       mkdir("$destdir/resfiles/$key",0755);
                   }
               }
               my $filepath = $file;
               while ($filepath =~ m-(\w+)/(.+)-) { 
                   $filepath = $2;
                   if (!-e "$destdir/resfiles/$key/$1") {
                       mkdir("$destdir/resfiles/$key/$1",0755);
                   }
               }
               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
       my $currboard = '';
       my @boards = ();
       my %messages = ();
       my @timestamp = ();
       my %boardnum = ();
       my $board_id = time;
       my $board_count = 0;
       foreach my $key (sort keys %type) {
           if ($type{$key} eq "BOARD") {
               push @boards, $key;
               $boardnum{$revitm{$key}} = $board_count ;
               $currboard = $key;
               @{$messages{$key}} = ();
               $timestamp[$board_count] = $board_id;
               $board_id ++;
               $board_count ++;
           } elsif ($type{$key} eq "MESSAGE") {
               push @{$messages{$currboard}}, $key;
           } elsif ($type{$key} eq "PAGE" || $type{$key} eq "LINK") {
               %{$resinfo{$key}} = ();
               &angel_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname,$type{$key},$title{$revitm{$key}});
           } elsif ($type{$key} eq "QUIZ") {
               %{$resinfo{$key}} = ();
   #            &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
           } elsif ($type{$key} eq "FORM") {
               %{$resinfo{$key}} = ();
   #            &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
           } elsif ($type{$key} eq "DROPBOX") {
               %{$resinfo{$key}} = ();
           }
       }
   
       my $longcrs = '';
       if ($bb_crs =~ m/^(\d)(\d)(\d)/) {
           $longcrs = $1.'/'.$2.'/'.$3.'/'.$bb_crs;
       }
       for (my $i=0; $i<@boards; $i++) {
           my %msgidx = ();
           my $forumtext = '';
           my $boardname = 'bulletinpage_'.$timestamp[$i];
           my $forumfile = $docroot.'/temp/_assoc/'.$boards[$i].'/pg'.$boards[$i].'.htm';
           my @state = ();
           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 div div") {
                       $forumtext = $text;
                   }
                 }, "dtext"],
               end_h =>
               [sub {
                     my ($tagname) = @_;
                     pop @state;
                  }, "tagname"],
           );
           $p->parse_file($forumfile);
           $p->eof;
   
           my %boardinfo = (
                     'aaa_title' => $title{$revitm{$boards[$i]}},
                     'bbb_content' => $forumtext,
                     'ccc_webreferences' => '',
                     'uploaded.lastmodified' => time,
                     );
           my $msgcount = 0; 
                                                                                                        
           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') {
               foreach my $msg_id (@{$messages{$boards[$i]}}) {
                   $msgcount ++;
                   $msgidx{$msg_id} = $msgcount;
                   my %contrib = (
                               'sendername' => 'NoName',
                               'senderdomain' => $bb_cdom,
                               'screenname' => '',
                               'message' => $title{$revitm{$msg_id}}
                               );
                   unless ( $parentseq{$revitm{$msg_id}} eq $revitm{$boards[$i]} ) {
                       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 )  {
                       my $newurl = '';
                       foreach my $file (@{$href{$msg_id}}) {
                           unless ($file eq 'pg'.$msg_id.'.htm') {
                               $newurl = $msg_id.$file;
                               print STDERR "Msg is $msg_id, File is $file, newurl is $newurl\n";
                               unless ($longcrs eq '') {
                                   if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles") {
                                       mkdir("/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles",0755);
                                   }
                                   if (!-e "/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;
                               }
                           }
                       }
                   }
                   my $xmlfile = $docroot.'/temp/_assoc/'.$msg_id.'/'.$file{$msg_id};
                   &angel_message($msg_id,\%contrib,$xmlfile);
                   unless ($file{$msg_id} eq '') {
                       unlink($xmlfile);
                   }
                   my $symb = 'bulletin___'.$timestamp[$i].'___adm/wrapper/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$i].'/bulletinboard';
                   my $postresult = &addposting($symb,\%contrib,$bb_cdom,$bb_crs);
               }
           }
       }
   
       my @resources = sort keys %resnum;
       unshift @resources, "Top";
       $resnum{'Top'} = 'toplevel';
       $type{'toplevel'} = "FOLDER";
   
       my %pagecount = ();
       my %pagecontents = ();
       my %pageflag = ();
       my %seqflag = ();
       my %seqcount = ();
       my %boardflag = ();
       my %boardcount = ();
       my %fileflag = ();
       my %filecount = ();
   
       foreach my $key (@resources) {
           $pageflag{$key} = 0;
           $seqflag{$key} = 0;
           $seqcount{$key} = 0;
           $pagecount{$key} = -1;
           $boardflag{$key} = 0;
           $boardcount{$key} = 0;
           $fileflag{$key} = 0;
           $filecount{$key} = 0;
           my $src ="";
           my $srcstem = "/res/$udom/$uname/$newdir";
           my $next_id = 1;
           my $curr_id = 0;
           if ($type{$resnum{$key}} eq "FOLDER") {
               open(LOCFILE,">$destdir/sequences/$key.sequence");
               print LOCFILE "<map>\n";
               if ($contentscount{$key} == 0) {
                   print LOCFILE qq|<resource id="1" src="" type="start"></resource>
   <link from="1" to="2" index="1"></link>
   <resource id="2" src="" type="finish"></resource>\n|;
               } else {
                   if ($type{$resnum{$contents{$key}[0]}} eq "FOLDER") {
                       $src = $srcstem.'/sequences/'.$contents{$key}[0].".sequence";
                       $pageflag{$key} = 0;
                       $seqflag{$key} = 1;
                       $seqcount{$key} ++;
                   } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") {
                       $src = '/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$boardnum{$resnum{$contents{$key}[0]}}].'/bulletinboard'; 
                       $pageflag{$key} = 0;
                       $boardflag{$key} = 1;
                       $boardcount{$key} ++;
                   } 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 ($pagecount{key} == -1) {
                               print STDERR "Array index is -1, we shouldnt be here\n";
                           } else { 
                               push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0];
                           }
                       } else {
                           $pagecount{$key} ++;
                           $src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page';
                           @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[0]");
                           $seqflag{$key} = 0;
                       }
                   }
                   unless ($pageflag{$key}) {
                       print LOCFILE qq|<resource id="1" src="$src" title="$title{$contents{$key}[0]}" type="start"|;
                       unless ($seqflag{$key} || $boardflag{$key} || $fileflag{$key}) {
                           $pageflag{$key} = 1;
                       }
                   }
                   if ($contentscount{$key} == 1) {
                       print LOCFILE qq|></resource>
   <link from="1" to="2" index="1"></link>
   <resource id="2" src="" type="finish"></resource>\n|;
                   } else {
                       if ($contentscount{$key} > 2 ) {
                           for (my $i=1; $i<$contentscount{$key}-1; $i++) {
                               if ($type{$resnum{$contents{$key}[$i]}} eq "FOLDER") {
                                   $src = $srcstem.'/sequences/'.$contents{$key}[$i].".sequence";
                                   $pageflag{$key} = 0;
                                   $seqflag{$key} = 1;
                                   $seqcount{$key} ++;
                               } elsif ($type{$resnum{$contents{$key}[$i]}} eq "BOARD") {
                                   $src = '/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$boardnum{$resnum{$contents{$key}[$i]}}].'/bulletinboard';
                                   $pageflag{$key} = 0;
                                   $boardflag{$key} = 1;
                                   $boardcount{$key} ++;
                               } 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 ($pagecount{$key} == -1) {
                                           print STDERR "array index is -1, we shouldnt be here\n";
                                       } else {
                                           push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i];
                                       }
                                   } else {
                                       $pagecount{$key} ++;
                                       $src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page';
                                       @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$i]");
                                       $seqflag{$key} = 0;
                                   }
                               }
                               unless ($pageflag{$key}) {
                                   $curr_id ++;
                                   $next_id ++;
                                   print LOCFILE qq|></resource>
   <link from="$curr_id" to="$next_id" index="$curr_id"></link>
   <resource id="$next_id" src="$src" title="$title{$contents{$key}[$i]}"|;
                                   unless ($seqflag{$key} || $boardflag{$key} || $fileflag{$key}) {
                                       $pageflag{$key} = 1;
                                   }
                               }
                           }
                       }
                       if ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "FOLDER") {
                           $src = $srcstem.'/sequences/'.$contents{$key}[$contentscount{$key}-1].".sequence";
                           $pageflag{$key} = 0;
                           $seqflag{$key} = 1;
                       } elsif ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "BOARD") {
                           $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$resnum{$contents{$key}[$contentscount{$key}-1]}}]/bulletinboard";
                           $pageflag{$key} = 0;
                           $boardflag{$key} = 1;
                       } 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}) {
                               push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$contentscount{$key}-1];
                           } else {
                               $pagecount{$key} ++;
                               $src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page';
                               @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$contentscount{$key}-1]");
                           }
                       }
                       if ($pageflag{$key}) {
                           if ($seqcount{$key} + $pagecount{$key} + $boardcount{$key} + $filecount{$key} +1 == 1) {
                               print LOCFILE qq|></resource>
   <link from="1" index="1" to="2">
   <resource id ="2" src="" title="" type="finish"></resource>\n|;
                           } else {
                               print LOCFILE qq| type="finish"></resource>\n|;
                           }
                       } else {
                           $curr_id ++;
                           $next_id ++;
                           print LOCFILE qq|></resource>
   <link from="$curr_id" to="$next_id" index="$curr_id"></link>
   <resource id="$next_id" src="$src" title="$title{$contents{$key}[$contentscount{$key}-1]}" type="finish"></resource>\n|;
                       }
                   }
               }
               print LOCFILE "</map>\n";
               close(LOCFILE);
               $pagecount{$key} ++;
               $totpage += $pagecount{$key};
           }
           $totseq += $seqcount{$key};
       }
   
       foreach my $key (sort keys %pagecontents) {
           for (my $i=0; $i<@{$pagecontents{$key}}; $i++) {
               my $filestem = "/res/$udom/$uname/$newdir";
               my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';
               open(PAGEFILE,">$filename");
               print PAGEFILE qq|<map>
   <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|;
               if (@{$pagecontents{$key}[$i]} == 1) {
                   print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>|;
               } elsif (@{$pagecontents{$key}[$i]} == 2)  {
                   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 {
                   for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) {
                       my $curr_id = $j+1;
                       my $next_id = $j+2;
                       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>
   <link to="$next_id" index="$curr_id" from="$curr_id">\n|;
                   }
                   my $final_id = @{$pagecontents{$key}[$i]};
                   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>";
               close(PAGEFILE);
           }
       }
       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>    </body>
  </html>|;   </html>|;
   close(FILE);      close(FILE);
 }  }
   
   # ---------------------------------------------------------------- Process ANGEL message board messages
   sub angel_message {
       my ($msg_id,$contrib,$xmlfile) = @_;
       my @state = ();
       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") {
                     $$contrib{'plainname'} = $text;
                } elsif ("@state" eq "html body div div") {
                     $$contrib{'message'} .= '<br /><br />'.$text;
                }
              }, "dtext"],
            end_h =>
            [sub {
                  my ($tagname) = @_;
                  pop @state;
               }, "tagname"],
       );
       $p->parse_file($xmlfile);
       $p->eof;
   }
   
   # ---------------------------------------------------------------- Get LON-CAPA Course Coordinator roles for this user
   sub get_ccroles {
       my ($uname,$dom,$crsentry) = @_;
       my %roles = ();
       unless ($uname eq '') {
           %roles = &Apache::lonnet::dump('roles',$dom,$uname);
       }
       my $iter = 0;
       my @codes = ();
       my %courses = ();
       my @crslist = ();
       my %descrip =();
       foreach my $key (keys %roles ) {
           if ($key =~ m/^\/(\w+)\/(\w+)_cc$/) {
               my $cdom = $1;
               my $crs = $2;
               my $role_end = 0;
               my $role_start = 0;
               my $active_chk = 1;
               if ( $roles{$key} =~ m/^cc_(\d+)/ ) {
                   $role_end = $1;
                   if ( $roles{$key} =~ m/^cc_($role_end)_(\d+)$/ )
                   {
                       $role_start = $2;
                   }
               }
               if ($role_start > 0) {
                   if (time < $role_start) {
                       $active_chk = 0;
                   }
               }
               if ($role_end > 0) {
                   if (time > $role_end) {
                       $active_chk = 0;
                   }
               }
               if ($active_chk) {
                   my $currcode = '';
                   my %settings = &Apache::lonnet::get('environment',['internal.coursecode','description'],$cdom,$crs);
                   if (defined($settings{'description'}) ) {
                       $descrip{$crs} = $settings{'description'};
                   } else {
                       $descrip{$crs} = 'Unknown';
                   }
                   if (defined($settings{'internal.coursecode'}) ) {
                       $currcode = $settings{'internal.coursecode'};
                       if ($currcode eq '') {
                           $currcode = "____".$iter;
                           $iter ++;
                       }
                   } else {
                       $currcode = "____".$iter;
                       $iter ++;
                   }
                   unless (grep/^$currcode$/,@codes) {
                       push @codes,$currcode;
                       @{$courses{$currcode}} = ();
                   }
                   push @{$courses{$currcode}}, $cdom.'/'.$crs;
               }
           }
       }
       foreach my $code (sort @codes) {
           foreach my $crsdom (@{$courses{$code}}) {
               my ($cdom,$crs) = split/\//,$crsdom;
               my $showcode = '';
               unless ($code =~m/^____\d+$/) {  $showcode = $code; }
               $$crsentry{$crsdom} = $showcode.':'.$descrip{$crs};
               push @crslist, $crsdom;
           }
       }
       return @crslist;
   }
   
                                                                                                
 # ---------------------------------------------------------------- Main Handler  # ---------------------------------------------------------------- Main Handler
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
Line 1701  sub handler { Line 2918  sub handler {
                                                                                                                                                                                             
     if ($ENV{'form.phase'} eq 'three') {      if ($ENV{'form.phase'} eq 'three') {
         $current_page = &display_control();          $current_page = &display_control();
         my @PAGES = ('ChooseDir','Blackboard5','ANGEL','WebCT');          my @PAGES = ('ChooseDir','Confirmation');
         $page_name = $PAGES[$current_page];          $page_name = $PAGES[$current_page];
                   
         if ($page_name eq 'ChooseDir') {          if ($page_name eq 'ChooseDir') {
             &jscript_zero($fullpath,\$javascript);              &jscript_zero($fullpath,\$javascript,$uname,$udom);
         } elsif ($page_name eq 'Confirmation') {          } elsif ($page_name eq 'Confirmation') {
             &jscript_two(\$javascript,$uname);  #            &jscript_two(\$javascript,$uname);
         }          }
     } elsif ($ENV{'form.phase'} eq 'two') {      } elsif ($ENV{'form.phase'} eq 'two') {
         &jscript_zero($fullpath,\$javascript);          &jscript_zero($fullpath,\$javascript,$uname,$udom);
     }      }
     $r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>");      $r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>");
                                                                                                                                                                                             
Line 1722  sub handler { Line 2939  sub handler {
     }      }
                                                                                                                                                                                             
     if ($ENV{'form.phase'} eq 'three') {      if ($ENV{'form.phase'} eq 'three') {
         &display_zero ($r,$uname,$fn,$current_page) if $page_name eq 'ChooseDir';          my $bb_crs = '';
         &expand_bb5 ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'Blackboard5';          my $bb_cdom = '';
         &expand_angel ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'ANGEL';          my $bb_handling = '';
         &expand_webct ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'WebCT';          my $announce_handling = 'ok';
           my $source = $ENV{'form.source'};
           if ( defined($ENV{'form.bb_crs'}) ) {
               ($bb_cdom,$bb_crs) = split/\//,$ENV{'form.bb_crs'};
           }
           if ( defined($ENV{'form.bb_handling'}) ) {
               $bb_handling = $ENV{'form.bb_handling'};
           }
           my $users_crs = '';
           my $users_cdom = '';
           my $users_handling = '';
           if ( defined($ENV{'form.user_crs'}) ) {
               ($users_cdom,$users_crs) = split/\//,$ENV{'form.user_crs'};
           }
           if ( defined($ENV{'form.user_handling'}) ) {
               $users_handling = $ENV{'form.user_handling'};
           }
           my ($result,$totseq,$totpage,$totprob,$totboard,$totquiz,$totsurv);
           if ($page_name eq 'ChooseDir') {
               &display_zero ($r,$uname,$fn,$current_page,$fullpath);
           } elsif ($page_name eq 'Confirmation') {
               ($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,$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';
           }
           
           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') {
             my $current_page = 0;              my $current_page = 0;
             &display_zero($r,$uname,$fn,$current_page);              &display_zero($r,$uname,$fn,$current_page,$fullpath);
         }          }
     } else {      } else {
         &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport');          &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport');

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


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