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

version 1.1, 2004/02/10 23:36:32 version 1.2, 2004/02/23 14:14:45
Line 32  sub calculate_page($$) { Line 32  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 63  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 97  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 146  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 160  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 205  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 287  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 305  Please choose a destination LON-CAPA dir
 END_OF_ONE  END_OF_ONE
 }  }
   
 # ---------------------------------------------------------------- Display One  # ---------------------------------------------------------------- Expand bb5
                                                                                                 
 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) = @_;
     my @state = ();      my @state = ();
     my @seq = "Top";      my @seq = "Top";
     my $lastitem;      my $lastitem;
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 $board_count = 0;
       my $board_id = time;
       my $totseq = 0;
       my $totpage = 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 344  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);
     }      }
   
     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 363  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};                          $title{$itm} = $attr->{title};
                     if ($start > @seq) {                          if ($start > @seq) {
                         unless ($lastitem eq '') {                              unless ($lastitem eq '') {
                             push @seq, $lastitem;                                  push @seq, $lastitem;
                             unless ( defined($contents{$seq[-1]}) ) {                                  unless ( defined($contents{$seq[-1]}) ) {
                                 @{$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 321  sub expand_bb5 { Line 432  sub expand_bb5 {
   
     my $topnum = 0;      my $topnum = 0;
     my $destdir = $docroot;      my $destdir = $docroot;
 #    print STDERR "Destdir is $destdir\n";  
     if (!-e "$destdir") {      if (!-e "$destdir") {
         mkdir("$destdir",0755);          mkdir("$destdir",0755);
     }      }
Line 337  sub expand_bb5 { Line 447  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 469  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') {
                   $contentscount{Top} ++;
                   push @boards, $key;
                   $timestamp[$board_count] = $board_id;
                   &process_db($key,$docroot,$destdir,$board_id,$bb_crs,$bb_cdom,$bb_handling,$uname,\%{$resinfo{$key}});
                   $board_id ++;
                   $board_count ++;
               }
         } elsif ($type{$key} eq "resource/x-bb-announcement") {          } elsif ($type{$key} eq "resource/x-bb-announcement") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}});              &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}});
         } elsif ($type{$key} eq "assessment/x-bb-pool") {          } elsif ($type{$key} eq "assessment/x-bb-pool") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
             &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}});              &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob);
         } 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);
         } 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);
         } elsif ($type{$key} eq "assessment/x-bb-group") {          } elsif ($type{$key} eq "assessment/x-bb-group") {
             %{$resinfo{$key}} = ();              %{$resinfo{$key}} = ();
               $contentscount{Top} ++;
               push @groups, $key;
             &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 ($user_handling eq 'ignore') {
                   &process_user($key,$docroot,$destdir,\%{$resinfo{$key}},$user_crs,$user_cdom,$user_handling);
               }
         }          }
     }      }
   
Line 405  sub expand_bb5 { Line 523  sub expand_bb5 {
     my %seqcount = ();      my %seqcount = ();
   
     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 570  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 522  sub expand_bb5 { Line 638  sub expand_bb5 {
 #                print STDERR "Contents Count for $key is $contentscount{$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 720  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 734  sub expand_bb5 {
             }              }
         }          }
     }      }
       if (@boards > 0) {
           $topnum ++;
           print TOPFILE qq|<resource id="$topnum" src="/res/$udom/$uname/$newdir/sequences/bulletinboards.sequence" title="Course Bulletin Boards"|;
           $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|;
               }
           }
           open(BOARD,">$destdir/sequences/bulletinboards.sequence");
           print BOARD qq|<map>
   <resource id="1" src="/adm/$udom/$uname/$timestamp[0]/bulletinboard" title="$resinfo{$boards[0]}{title}" type="start"></resource>
   <link from="1" to="2" index="1"></link>|;
           if (@boards == 1) {
               print BOARD qq|
   <resource id="2" src="" type="finish"></resource>\n|;
           } else {
               for (my $i=1; $i<@boards; $i++) {
                   print BOARD qq|<resource id="$i" src="/adm/$udom/$uname/$timestamp[$i]/bulletinboard" title="$resinfo{$boards[$i]}{title}"|;
                   my $curr = $i+1;
                   my $next = $i+2;
                   if (@boards == $i) {
                       print BOARD qq| type="finish"></resource>\n|;
                   } else {
                       print BOARD qq|></resource>
   <link from="$curr" to="$next" index="$next">\n|;
                   }
               }
           }
           print BOARD qq|</map>|;
           close(BOARD);
       }
     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 648  sub expand_bb5 { Line 806  sub expand_bb5 {
         }          }
     }      }
     system(" rm -r $docroot/temp");      system(" rm -r $docroot/temp");
       return($totseq,$totpage,$totprob);
 }  }
   
   
 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 825  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 878  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/".$dom."_".$crs."_";
   
     open (STUFILE,">
     foreach my $user_id (keys %{$settings}) {
         if ($$settings{$user_id}{user_role} eq "s") {
   # enroll as a single student           
         } elsif ($user_handling eq 'enrollall') {
   # enroll as another user type
         }
     }
 }  }
   
 sub process_group {    sub process_group {  
Line 771  sub process_group { Line 943  sub process_group {
 }  }
   
 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 959  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 1006  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);
 }  }
   
 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 "EXTERNALLINKS FLAGS ISAVAILABLE" ) {
             $$settings{isavailable} = $attr->{value};                  $$settings{isavailable} = $attr->{value};
         } elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) {              } elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) {
             $$settings{newwindow} = $attr->{value};                  $$settings{newwindow} = $attr->{value};
         } elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) {              } elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) {
             $$settings{isfolder} = $attr->{value};                  $$settings{isfolder} = $attr->{value};
         } elsif ("@state" eq "EXTERNALLINKS POSITION" ) {              } elsif ("@state" eq "EXTERNALLINKS POSITION" ) {
             $$settings{position} = $attr->{value};                  $$settings{position} = $attr->{value};
         } elsif ("@state" eq "EXTERNALLINKS URL" ) {              } elsif ("@state" eq "EXTERNALLINKS URL" ) {
             $$settings{url} = $attr->{value};                $$settings{url} = $attr->{value};
               }
           }, "tagname, attr"],
           text_h =>
           [sub {
               my ($text) = @_;
               if ("@state" eq "EXTERNALLINKS 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);
 }  }
   
 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 quotes, 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 ($destcourse =~ m/^(\d)(\d)(\d)/) {
   #      $longcourse = $1.'/'.$2.'/'.$3.'/'.$destcourse;
   #  }
   #  my $bbfilename = '/home/httpd/lonUsers/'.$udom.'/'.$longcourse.'bulletinpage_'.$timestamp.'.db';
   #  my %hash;
   #  tie(%hash,'GDBM_File',$bbfilename,&GDBM_WRCREAT,0640);
   #  $hash{'aaa_title'}=$$settings{title};
   #  untie %hash;
       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);  sub addposting {
   $p->parse_file($xmlfile);      my ($symb,$contrib,$cdom,$crs)=@_;
   $p->eof;      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;
 }  }
   
 sub process_assessment {  sub process_assessment {
   my ($res,$docroot,$container,$dirname,$destdir,$settings) = @_;    my ($res,$docroot,$container,$dirname,$destdir,$settings,$totpageref,$totprobref) = @_;
   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 = ();
Line 1046  sub process_assessment { Line 1477  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 1145  sub process_assessment { Line 1578  sub process_assessment {
       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 = 0;
           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 />  
 |;  |;
         $$totpageref ++; 
     }
     foreach my $id (@allids) {
         $curr_id ++;
         $next_id = $curr_id + 1;
         if ($curr_id == 0) {
             print PAGEFILE qq|<resource id="1" src="$newdir/$id.problem" type="start"></resource>\n|;
         } else {
             print PAGEFILE qq|
   <link from="$curr_id" to="$next_id" index="$curr_id"></link>
   <resource id="$curr_id" src="$newdir/$id.problem"|;
             $curr_id ++;
             $next_id = $curr_id + 1;
             if ($curr_id == @allids) {
                 print PAGEFILE qq| type="finish"></resource>\n|;
           } else {            } else {
               $output = qq|<problem>                print PAGEFILE qq|></resource>|;
  <startouttext />$$settings{$id}{text}<endouttext />  
 |;  
           }            }
           $output .= qq|        }
   #      print "Current ID is $id, type is $$settings{$id}{class} \n";
         if (@allids == 1) {
             print PAGEFILE qq|<link from="1" to="2" index="1"></link>
   <resource id="2" src="" type="finish">\n|;
         }
   
         my $output = qq|<problem>
   |;
         $$totprobref ++;
         if ($$settings{$id}{class} eq "QUESTION_ESSAY") {
             $output .= qq|<startouttext />$$settings{$id}{text}<endouttext />
    <essayresponse>     <essayresponse>
    <textfield></textfield>     <textfield></textfield>
    </essayresponse>     </essayresponse>
Line 1166  sub process_assessment { Line 1622  sub process_assessment {
    $$settings{$id}{feedbackcorr}     $$settings{$id}{feedbackcorr}
    </postanswerdate>     </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 {        } else {
     my $output;  
     if ($container eq 'pool') {   
         $output = qq|<problem>  
 |;  
     } else {  
         $output = qq|<problem>  
 |;  
     }  
     $output .= qq|<startouttext />$$settings{$id}{text}\n|;      $output .= qq|<startouttext />$$settings{$id}{text}\n|;
     if ( defined($$settings{$id}{image}) ) {       if ( defined($$settings{$id}{image}) ) { 
         if ( $$settings{$id}{style} eq 'embed' ) {          if ( $$settings{$id}{style} eq 'embed' ) {
Line 1274  sub process_assessment { Line 1709  sub process_assessment {
         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}};
Line 1293  sub process_assessment { Line 1728  sub process_assessment {
     } 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;
             }              }
         }          }
Line 1377  sub process_assessment { Line 1812  sub process_assessment {
 </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;  
     }  
   
       }        }
         $output .= qq|</problem>
   |;
         open(PROB,">$newdir/$id.problem");
         print PROB $output;
         close PROB;
     }
     unless ($container eq 'pool') {
         print PAGEFILE qq|</map>|;
         close(PAGEFILE);
   }    }
 }  }
   
Line 1436  sub process_announce { Line 1866  sub process_announce {
   my ($res,$docroot,$destdir,$settings) = @_;    my ($res,$docroot,$destdir,$settings) = @_;
   my $xmlfile = $docroot."/temp/".$res.".dat";    my $xmlfile = $docroot."/temp/".$res.".dat";
   my @state = ();    my @state = ();
     my @assess = ();
   my $id;    my $id;
   my $p = HTML::Parser->new    my $p = HTML::Parser->new
     (      (
Line 1456  sub process_announce { Line 1887  sub process_announce {
             $$settings{ispermanent} = $attr->{value};              $$settings{ispermanent} = $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 1898  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";  #          print "TEXT $text\n";
         }          }
       }, "dtext"],        }, "dtext"],
Line 1479  sub process_announce { Line 1911  sub process_announce {
   $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} .= "Please use 'NAV' to locate the link to the folder of problems entitled -";
             foreach my $key (keys %{$$settings{startassessment}{$id}}) {
   #              print STDERR "Quiz announcement - $id, key: $key, value: $$settings{startassessment}{$id}{$key}\n";
             }
         }
     }
   
     open(FILE,">$destdir/resfiles/$res.html");
     print FILE qq|<html>
   <head>
   <title>$$settings{title}</title>
   </head>
   <body bgcolor='#ffffff'>
   $$settings{text}
   |;
     print FILE qq|
     </body>
    </html>|;
     close(FILE);
 }  }
   
 sub process_content {  sub process_content {
Line 1647  $linktag|; Line 2111  $linktag|;
   close(FILE);    close(FILE);
 }  }
   
   sub expand_angel {
       my ($r,$uname,$udom,$fn,$page) = @_;
       my @state = ();
       my @seq = "Top";
       my $lastitem;
       my $itm = '';
       my %resnum = ();
       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 $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};
                       $resnum{$itm} = $attr->{identifierref};
                       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};
                       $file{$identifier} = $attr->{href};
                       @{$href{$identifier}} = ();
                   } elsif ("@state" eq "manifest resources resource file") {
                       push @{$href{$identifier}},$attr->{href};
                       if ($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}}) {
               if ($file =~ m/^_assoc/) {
                   my $filepath = $file;
                   if (!-e "$destdir/resfiles/$key") {
                       mkdir("$destdir/resfiles/$key",0755);
                   }
                   while ($filepath =~ m-(\w+)\\(.+)-) { 
                       $filepath = $2;
                       if (!-e "$destdir/resfiles/$key/$1") {
                           mkdir("$destdir/resfiles/$key/$1",0755);
                       }
                   }
                   system("cp $docroot/temp/$key/$file $destdir/resfiles/$key/$file");
               }
           }
       }
   
   # ANGEL types FILE FOLDER PAGE MESSAGE FORM QUIZ BOARD
   
       foreach my $key (sort keys %type) {
           if ($type{$key} eq "BOARD") {
               %{$resinfo{$key}} = ();
               &angel_db($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname);
           } elsif ($type{$key} eq "FILE" || $type{$key} eq "FOLDER" || $type{$key} eq "PAGE") {
               %{$resinfo{$key}} = ();
               &angel_content($key,$docroot,$dirname,$destdir,\%{$resinfo{$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}});
           }
       }
   
       my $nextnum = 0;
       open(TOPFILE,">$destdir/sequences/ims_import.sequence");
       print TOPFILE "<map>\n";
       my $fileopen = 0;
       my $areakey;
       my $areacount = 0;
       my $lastentry = '';
       my $notlastentry = '';
       my %pagecount = ();
       my %pagecontents = ();
       my %pageflag = ();
       my %seqflag = ();
       my %seqcount = ();
   
       foreach my $key (sort keys %resnum) {
           $pageflag{$key} = 0;
           $seqflag{$key} = 0;
           $seqcount{$key} = 0;
           $pagecount{$key} = -1;
           if ($filepath{$key} eq 'Top') {
               $topnum ++;
               $nextnum = $topnum +1;
               print TOPFILE qq|<resource id="$topnum" src="/res/$udom/$uname/$newdir/sequences/$key.sequence" title="$title{$key}"|;
               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|;
                   }
               }
   
               my $src ="";
               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 = 'sequences/'.$contents{$key}[0].".sequence";
                           $pageflag{$key} = 0;
                           $seqflag{$key} = 1;
                           $seqcount{$key} ++;
                       } else {
                           if ($pageflag{$key}) {
                               push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0];                        } else {
                               $pagecount{$key} ++;
                               $src = '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="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[0]}" type="start"|;
                           unless ($seqflag{$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 ($resinfo{$resnum{$contents{$key}[$i]}}{'isfolder'} eq "true") {
                                       $src = 'sequences/'.$contents{$key}[$i].".sequence";
                                       $pageflag{$key} = 0;
                                       $seqflag{$key} = 1;
                                       $seqcount{$key} ++;
                                   } else {
                                       if ($pageflag{$key}) {
                                           push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i];
                                       } else {
                                           $pagecount{$key} ++;
                                           $src = '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="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[$i]}"|;
                                       unless ($seqflag{$key}) {
                                           $pageflag{$key} = 1;
                                       }
                                   }
                               }
                           }
                           if ($resinfo{$resnum{$contents{$key}[$contentscount{$key}-1]}}{'isfolder'} eq "true") {
                               $src = 'sequences/'.$contents{$key}[$contentscount{$key}-1].".sequence";
                               $pageflag{$key} = 0;
                               $seqflag{$key} = 1;
                           } else {
                               if ($pageflag{$key}) {
                                   push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$contentscount{$key}-1];
                               } else {
                                   $pagecount{$key} ++;
                                   $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';
                                   @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$contentscount{$key}-1]");
                               }
                           }
                           if ($pageflag{$key}) {
                               if ($seqcount{$key} + $pagecount{$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="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[$contentscount{$key}-1]}" type="finish"></resource>\n|;
                           }
                       }
                   }
                   print LOCFILE "</map>\n";
                   close(LOCFILE);
               }
       }
   
       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]}.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]}.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][$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]}.html" id="$final_id" type="finish" title="$title{$pagecontents{$key}[$i][-1]}"></resource>\n|;
               }
               print PAGEFILE "</map>";
               close(PAGEFILE);
           }
       }
       system(" rm -r $docroot/temp");
   }
   
   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 1705  sub handler { Line 2580  sub handler {
         $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 2597  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';          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 ($totseq,$totpage,$totprob);
           &display_zero ($r,$uname,$fn,$current_page,$fullpath) if $page_name eq 'ChooseDir';
           ($totseq,$totpage,$totprob) = &expand_bb5 ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling) if $page_name eq 'Blackboard5';
           ($totseq,$totpage,$totprob) = &expand_angel ($r,$uname,$udom,$fn,$current_page) if $page_name eq 'ANGEL';
           &expand_webct ($r,$uname,$udom,$fn,$current_page) if $page_name eq 'WebCT';
           $r->print("<h3>Step 3: Publish your new LON-CAPA materials</h3>");
           $r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, and $totprob problems have been created.<br /><br />\n");
   
     } 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.2


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