[LON-CAPA-cvs] cvs: modules /raeburn imsimport.pm imsimportdocs.pm imsprocessor.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Tue, 16 Mar 2004 19:20:58 -0000


This is a MIME encoded message

--raeburn1079464858
Content-Type: text/plain

raeburn		Tue Mar 16 14:20:58 2004 EDT

  Modified files:              
    /modules/raeburn	imsimportdocs.pm imsimport.pm imsprocessor.pm 
  Log:
  imsimport.pm - now allows choice of areas to be imported
  imsprocessor.pm - fixes to consolidation
  imsimportdocs.pm - modifications to accompany changes to imsprocessor.pm
  
  
--raeburn1079464858
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20040316142058.txt"

Index: modules/raeburn/imsimportdocs.pm
diff -u modules/raeburn/imsimportdocs.pm:1.2 modules/raeburn/imsimportdocs.pm:1.3
--- modules/raeburn/imsimportdocs.pm:1.2	Tue Mar  9 11:34:34 2004
+++ modules/raeburn/imsimportdocs.pm	Tue Mar 16 14:20:58 2004
@@ -114,29 +114,10 @@
     $r->send_http_header;
     return OK if $r->header_only;
 
-    my @areas = ("doc","extlink","announce","staff","board","quiz","survey","pool","users");
+    my @areas = ();
     my %cmsmap = ();
-    %{$cmsmap{bb5}} = (
-                announce => 'resource/x-bb-announcement',
-                board => 'resource/x-bb-discussionboard',
-                doc => 'resource/x-bb-document',
-                extlink => 'resource/x-bb-externallink',
-                pool => 'assessment/x-bb-pool',
-                quiz => 'assessment/x-bb-quiz',
-                staff => 'resource/x-bb-staffinfo',
-                survey => 'assessment/x-bb-survey',
-                users => 'course/x-bb-user',
-                );
- 
-    %{$cmsmap{angel}} =  (
-                board => 'BOARD',
-                extlink => 'LINK',
-                msg => 'MESSAGE',
-                quiz => 'QUIZ',
-                survey => 'FORM',
-                );
-
-    @{$cmsmap{angel}{doc}} = ('FILE','PAGE');
+    my %areaname = ();
+    &Apache::imsprocessor::ims_config(\@areas,\%cmsmap,\%areaname);
 
 # get course data
     my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
@@ -187,7 +168,7 @@
     if ($ENV{'form.phase'} eq 'one') {
         &display_one($r);       
     } elsif ($ENV{'form.phase'} eq 'two') {
-        &display_two($r,$coursenum,\@areas,%cmsmap);
+        &display_two($r,$coursenum,\@areas,\%areaname,%cmsmap);
     } elsif ($ENV{'form.phase'} eq 'three') {
         &display_three($r,$coursenum,$coursedom,$coursehome,$uname,$udom,\@areas,%cmsmap);
     }   
@@ -195,27 +176,6 @@
     return OK;
 } 
 
-sub uploadzip {
-    my $tempdir = shift;
-    my $fname=$ENV{'form.uploadname.filename'};
-# Replace Windows backslashes by forward slashes
-    $fname=~s/\\/\//g;
-# Get rid of everything but the actual filename
-    $fname=~s/^.*\/([^\/]+)$/$1/;
-# Replace spaces by underscores
-    $fname=~s/\s+/\_/g;
-# Replace all other weird characters by nothing
-    $fname=~s/[^\w\.\-]//g;
-# See if there is anything left
-    unless ($fname) { return 'error: no uploaded file'; }
-
-# Save the file
-    chomp($ENV{'form.uploadname'});
-    open(my $fh,'>'.$tempdir.'/'.$fname);
-    print $fh $ENV{'form.uploadname'};
-    close($fh);
-    return $fname;   
-}
 
 sub display_one {
     my ($r) = @_;
@@ -313,12 +273,12 @@
 
 
 sub display_two {
-    my ($r,$crs,$areasref,%cmsmap) = @_;
+    my ($r,$crs,$areasref,$areaname,%cmsmap) = @_;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folder','source']);
     my $cms = $ENV{'form.source'};
     my $timenow = time;
     my $tempdir = &Apache::imsprocessor::create_tempdir('DOCS',$crs,$timenow);
-    my $fname = &uploadzip($tempdir);
+    my $fname = &Apache::imsprocessor::uploadzip('DOCS',$tempdir);
     my $unzip_result = '';
     my $manifest_result = '';
     unless ($tempdir eq '') {
@@ -346,18 +306,6 @@
                 users => 0,
                 );
 
-    my %areaname = (
-                announce => 'Announcements',
-                board => 'Discussion Boards',
-                doc => 'Documents, pages & folders',
-                extlink => 'Links to external sites',
-                pool => 'Question pools',
-                quiz => 'Quizzes',
-                staff => 'Staff information',
-                survey => 'Surveys',
-                users => 'Enrollment',
-                );
-         
     if ($unzip_result eq 'ok') {
         $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo);
         if ($manifest_result eq 'ok') {
@@ -425,7 +373,7 @@
                         $r->print(qq|onClick='javascript:setOptions("$area","$counter")'|);
                     }
                     $r->print("/></font></td>
-                <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;$areaname{$area}&nbsp;&nbsp; - $count{$area} item(s)</font></td>");
+                <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;$$areaname{$area}&nbsp;&nbsp; - $count{$area} item(s)</font></td>");
                     if ($area eq 'board') {
                         $r->print("            <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;
                  <select name='db_handling'>
@@ -607,21 +555,21 @@
 
         &Apache::imsprocessor::process_resinfo($cms,$tempdir,$destdir,\%items,\%resources,\@boards,\@announcements,\@quizzes,\@surveys,\@groups,\%messages,\@timestamp,\%boardnum,\%resinfo,$udom,$uname,$cdom,$crs,$db_handling,$user_handling,\%total,$dirname,$seqstem,\@resrcfiles);
 
-        &Apache::imsprocessor::build_structure($cms,'DOCS',$destdir,\%resinfo,\%items,\%resources,\%hrefs,$udom,$uname,'',$timenow,$cdom,$crs,\@timestamp,\%total,\@boards,\@announcements,\@quizzes,\@surveys,\%boardnum,\@pages,\@sequences,\@topurls,\@topnames);
+        &Apache::imsprocessor::build_structure($cms,'DOCS',$destdir,\%items,\%resinfo,\%resources,\%hrefs,$udom,$uname,'',$timenow,$cdom,$crs,\@timestamp,\%total,\@boards,\@announcements,\@quizzes,\@surveys,\%boardnum,\@pages,\@sequences,\@topurls,\@topnames);
  
         foreach my $item (@pages) {
-            my $path = $timenow.'/pages/';
-            &copy_items($item,$path,$cdom,$chome,$crs);
+            my $filename = $timenow.'/pages/'.$item;
+            my $fetchresult= &Apache::lonnet::process_coursefile('propagate',$crs,$cdom,$chome,$filename,'');
         }
         foreach my $item (@sequences) {
             unless ($item eq 'Top.sequence' && $toplevel eq 'oldfolder') {
-                my $path = $timenow.'/sequences/';
-                &copy_items($item,$path,$cdom,$chome,$crs);
+                my $filename = $timenow.'/sequences/'.$item;
+                my $fetchresult= &Apache::lonnet::process_coursefile('propagate',$crs,$cdom,$chome,$filename,'');
             }
         }
         foreach my $item (@resrcfiles) {
-            my $path = $timenow.'/resfiles/';
-            &copy_items($item,$path,$cdom,$chome,$crs);
+            my $filename = $timenow.'/resfiles/'.$item;
+            my $fetchresult= &Apache::lonnet::process_coursefile('propagate',$crs,$cdom,$chome,$filename,'');
         }
 
         my @imports = ();
@@ -648,6 +596,9 @@
             print STDERR "Fatal error during group_import\n";
         }
     }
+    if ($tempdir =~ m/^\/home\/httpd\/perl\/tmp\/$crs\/\d{10}/) {
+        system("rm -r -f $tempdir");
+    }
     $r->print(<<ENDBLOCK);
   <table border='0' bgcolor='#F6F6F6'' cellspacing='0' cellpadding ='0' width='100%'>
    <tr>
@@ -689,11 +640,6 @@
    </tr>
   </table>
 ENDBLOCKTWO
-}
-
-sub copy_items {
-    my ($filename,$fpath,$cdom,$chome,$crs) = @_;    
-    my $fetchresult= &Apache::lonnet::reply('fetchuserfile:'.$cdom.'/'.$crs.'/'.$filename.':'.$fpath,$chome);
 }
 
 1;
Index: modules/raeburn/imsimport.pm
diff -u modules/raeburn/imsimport.pm:1.4 modules/raeburn/imsimport.pm:1.5
--- modules/raeburn/imsimport.pm:1.4	Sat Feb 28 19:55:39 2004
+++ modules/raeburn/imsimport.pm	Tue Mar 16 14:20:58 2004
@@ -6,53 +6,16 @@
 use Apache::loncommon();
 use Apache::Log();
 use Apache::lonnet;
+use Apache::imsprocessor;
 use HTML::Parser;
 use HTML::Entities();
 use Apache::lonlocal;
 use Apache::lonupload;
-use File::Basename();                                                                                            
-# ---------------------------------------------------------------- Display Control
-sub display_control { # figure out what page we're on and where we're heading.
-    my $page = $ENV{'form.page'};
-    my $command = $ENV{'form.go'};
-    my $current_page = &calculate_page($page,$command);
-    return $current_page;
-}
-
-# ---------------------------------------------------------------- Calculate Page 
-sub calculate_page($$) {
-    my ($prev,$dir) = @_;
-    return 0 if $prev eq '';
-    return $prev + 1 if $dir eq 'NextPage';
-    return $prev - 1 if $dir eq 'PreviousPage';
-    return $prev     if $dir eq 'ExitPage';
-    return 0 if $dir eq 'BackToStart';
-}
-
-# ----------------------------------------------------------------  Jscript Zero
-sub jscript_zero {
-    my ($fullpath,$jsref,$uname,$dom) = @_;
-    my $source = '';
-    if (exists($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).'"';
-
+use File::Basename();
+                                                                                            
+# ----------------------------------------------------------------  Jscript One
+sub jscript_one {
+    my ($fullpath,$jsref) = @_;
     $$jsref = <<"END_OF_ONE";
 function verify() {
  if ((document.forms.dataForm.newdir.value == '')  || (!document.forms.dataForm.newdir.value)) {
@@ -67,10 +30,9 @@
 }
 
 function nextPage() {
- if (verify()) {
-   document.forms.dataForm.go.value="NextPage"
-   document.forms.dataForm.submit()
- }
+  if (verify()) {
+    document.forms.dataForm.submit()
+  }
 }
 
 function createWin() {
@@ -97,43 +59,189 @@
   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
+# ----------------------------------------------------------------  Jscript Two
+sub jscript_two {
+    my ($javascript,$user,$dom,$numcrs) = @_;
+    my %crsentry = ();
+    my $course_list;
+    my $title_list;
+    my @crslist = ();
+    &get_ccroles($user,$dom,\%crsentry,\@crslist);
+    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).'"';
+    $$numcrs = @crslist;
+
+    $$javascript = qq#
+
+function checkCourse() {
+  courseID_array = new Array($course_list)
+  courseTitle_array = new Array($title_list)
+  var step2Form = document.forms.pickoptions
+  var conditionType = step2Form.conditions.value
+  var curVal = step2Form.targetcourse.options[step2Form.targetcourse.selectedIndex].value
+  if (curVal == -1) {
+      if ( conditionType == 'both'  )  {
+          if ( step2Form.board.checked == true || step2Form.users.checked == true ) {
+              setCourse(step2Form,'add')
+          }
+      }
+      if ( conditionType == 'users'  )  {
+          if ( step2Form.users.checked == true ) {
+              setCourse(step2Form,'add')
+          }
+      }
+      if ( conditionType == 'board'  )  {
+          if ( step2Form.board.checked == true ) {
+              setCourse(step2Form,'add')
+          }
+      }
+  }
+  else { 
+      if ( conditionType == 'both'  )  {
+          if ( step2Form.board.checked == false && step2Form.users.checked == false ) {
+              setCourse(step2Form,'clear')
+          }
+      }
+      if ( conditionType == 'users'  )  {
+          if ( step2Form.users.checked == false ) {
+              setCourse(step2Form,'clear')
+          }
+      }
+      if ( conditionType == 'board'  )  {
+          if ( step2Form.board.checked == false ) {
+              setCourse(step2Form,'clear')
+          }
+      }
+  }
+}
+
+function setCourse(step2Form,call) {
+    step2Form.targetcourse.length = 0
+    if (call == 'add') {
+        step2Form.targetcourse.length = 0
+        step2Form.targetcourse.options[0] = new Option("Please Select","0",true,true)
+        for (var i=0; i<courseID_array.length; i++) {
+            step2Form.targetcourse.options[i+1] = new Option(courseTitle_array[i],courseID_array[i],false,false)
+        }
+        step2Form.targetcourse.selectedIndex = 0
+    }
+    else {
+        step2Form.targetcourse.options[0] = new Option("Not required","-1",true,true)
+        step2Form.targetcourse.selectedIndex = 0
+    }
+}
+
+
+function setOptions(caller,itemnum) {
+  var numCrs = $$numcrs
+  var opForm = document.forms.pickoptions
+  var menu = 1 + itemnum*2
+  opForm.elements[menu].length = 0
+  if (opForm.elements[itemnum*2].checked == true) {
+    if (caller == "board") {
+      opForm.elements[menu].options[0] = new Option("Select","-1",true,true)
+      opForm.elements[menu].options[1] = new Option("Import topics only","topics",true,true)
+      opForm.elements[menu].options[2] = new Option("Import topics + posts (with author)","allpost",true,true)
+      opForm.elements[menu].options[3] = new Option("Import topics + posts (no author)","allanon",true,true)
+    }
+    else { 
+      if (caller == "users") {
+        opForm.elements[menu].length = 0
+        opForm.elements[menu].options[0] = new Option("Select","-1",true,true)
+        opForm.elements[menu].options[1] = new Option("Enroll students only","students",true,true)
+        opForm.elements[menu].options[2] = new Option("Enroll all users","all",true,true)
+      }
+    }
+  }
+  else {
+    opForm.elements[menu].options[0] = new Option("Not required","0",true,true)
+  }
+  opForm.elements[menu].selectedIndex = 0
+  if (numCrs > 0) {
+      checkCourse()
+  }
+}
+
+function verify(caller) {
+  var numCrs = $$numcrs
+  var opForm = document.forms.pickoptions
+  var totcheck = 0;
+  var totchg = 0;
+  for (var i=0; i<caller; i++) {
+    if (opForm.elements[2*i].checked == true) {
+      totcheck ++
+      if (opForm.elements[2*i].name == "board") { 
+        if (opForm.elements[2*i+1].selectedIndex == 0) {     
+          alert("You must select one of the additional options when importing Discussion Boards ")
+          return false
+        }
+        if (numCrs == 0) {
+            opForm.elements[2*i].checked = false
+            totchg ++
+        }
+        else {
+          if (opForm.targetcourse.selectedIndex == 0) {
+            alert("You must select a target course when importing Discussion Boards")
+            return false
+          }
+        }
+      }
+      if (opForm.elements[2*i].name == "users") {
+        if (opForm.elements[2*i+1].selectedIndex == 0) {     
+          alert("You must select one of the additional options when importing Enrollment")
+          return false
+        }
+        if (numCrs == 0) {
+            opForm.elements[2*i].checked = false
+            totchg ++ 
+        }
+        else {
+          if (opForm.targetcourse.selectedIndex == 0) {
+            alert("You must select a target course when importing enrollment information")
+            return false
+          }
+        }
+      }
+    }
+  }
+  if (totcheck == 0) {
+    alert("You must check the Checkbox for at least one Content Type");
+    return false
+  }
+  return true
+}
+
+function nextPage(caller) {
+  if (verify(caller)) {
+    document.forms.pickoptions.submit()
+  }
+}
+
+#;
+
+}
 
+# ----------------------------------------------------------------  Jscript Three
+sub jscript_three {
+    my $javascript = shift;
 }
 
-# ---------------------------------------------------------------- Display Zero
-sub display_zero {
-    my ($r,$uname,$fn,$page,$fullpath) = @_;
+# ---------------------------------------------------------------- Display One
+sub display_one {
+    my ($r,$uname,$fn,$fullpath) = @_;
     $r->print(<<"END_OF_ONE");
 <form name="dataForm" method="post">
 <table border='0' bgcolor='#CCFFDD' cellspacing='0' cellpadding ='0' width='100%'>
@@ -192,11 +300,127 @@
       <tr>
        <td colspan='2'>&nbsp;<br /><br /></td>
       </tr>
+      <tr>
+       <td>&nbsp;</td>
+       <td><font face='arial,helvetica,sans-serif'>If you have selected the CMS used to create the IMS package, and have created a destination directory, click the 'Proceed' button to continue the IMS package upload process.</font></td>
+      </tr>
+      <tr>
+       <td colspan='2'>
+          <input type="hidden" name="uploaduname" value="$uname">
+          <input type="hidden" name="filename" value="$fn">
+          <input type="hidden" name="phase" value="three">
+       </td>
+      </tr>
+      <tr>
+       <td colspan='2'>&nbsp;</td>
+      </tr>
+      <tr>
+       <td colspan='2'>
+        <table border='0' cellspacing='0' cellpadding='0' width="100%">
+         <tr>
+          <td align='left'>
+           <input type='button' name='exitpage' value='Exit now' onClick="javascript:location.href='$fullpath'">
+          </td>
+          <td align='right'>
+           <input type="button" name="nextpage" value="Proceed" onClick="javascript:nextPage()">
+          </td>
+         </tr>
+        </table>
+       </td>
+      </tr>
+     </table>
+    </td>
+   </tr>
+  </table>
+</form>
+END_OF_ONE
+}
+
+# ---------------------------------------------------------------- Display Two
+sub display_two {
+    my ($r,$zipupload,$areas,$areaname,$cmsmap,$uname,$newdir,$numcrs,$fullpath) = @_;
+    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folder','source']);
+    my $cms = $ENV{'form.source'};
+    my $dirname = $ENV{'form.newdir'};
+    my $tempdir = &Apache::imsprocessor::create_tempdir('CSTR',$dirname,'');
+    my $fname = &Apache::imsprocessor::uploadzip('CSTR',$tempdir,$zipupload);
+    my $unzip_result = '';
+    my $manifest_result = '';
+    unless ($tempdir eq '') {
+        $unzip_result = &Apache::imsprocessor::expand_zip($tempdir,$fname);
+    }
+    my %resources = ();
+    my %items = ();
+    my %hrefs = ();
+    my %resinfo = ();
+    my %count = ();
+    my @bgcolors = ("#eeeeee","#dddddd");
+
+    my $counter = 0;
+    my $iter = 0;
+    my %count = (
+                announce => 0,
+                board => 0,
+                doc => 0,
+                extlink => 0,
+                msg => 0,
+                pool => 0,
+                quiz => 0,
+                staff => 0,
+                survey => 0,
+                users => 0,
+                );
+    my $conditions;
+
+    if ($unzip_result eq 'ok') {
+        $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo);
+        if ($manifest_result eq 'ok') {
+            foreach my $res (sort keys %resources) {
+                if ($cms eq 'bb5') {
+                    foreach my $area (keys %{$$cmsmap{$cms}}) {
+                        if ($resources{$res}{type} eq $$cmsmap{$cms}{$area}) {
+                            $count{$area} ++;
+                        }
+                    }
+                } elsif ($cms eq 'angel') {
+                    foreach my $area (keys %{$$cmsmap{$cms}}) {
+                        if ($area eq 'doc') {
+                            if (grep/^$resources{$res}{type}$/,@{$$cmsmap{$cms}{doc}}) {
+                                $count{$area} ++;
+                            }
+                        } elsif ($resources{$res}{type} eq $$cmsmap{$cms}{$area}) {
+                            $count{$area} ++;                                
+                        }
+                    }
+                }
+            }
+            if ($count{board} > 0) {
+                if ($count{users} > 0) {
+                    $conditions = 'both';
+                } else {
+                    $conditions = 'board';
+                }
+            } elsif ($count{users} > 0) {
+                $conditions = 'users';
+            } else {
+                $conditions = 'none';
+            }
+
+            $r->print(<<ENDBLOCK);
+<form name="pickoptions" method="post">
+  <table border='0' cellspacing='0' cellpadding ='0' width='100%'>
+   <tr>
+    <td colspan='2'>
+     <table border='0' cellspacing='0' cellpadding='0'>
+      <tr>
+       <td colspan='2'  align='left'>&nbsp;
+       </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>
+        <font face='arial,helvetica,sans-serif'><b>Choose which content types you wish to import</b></font>
        </td>
       </tr>
       <tr>
@@ -211,48 +435,44 @@
            <table border='0' cellspacing='0' cellpadding='0' bgcolor='#ffffff' width='100%'>
             <tr>
              <td>
-              <table border='0' cellspacing='1' cellpadding='1' bgcolor='#CCFFDD' width='100%'>
+              <table border='0' cellspacing='1' cellpadding='1' bgcolor='#ffffff' 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>
+                <td align='center'><font face='arial,helvetica,sans-serif'><b>Import?</b></font></td>           
+                <td align='center'><font face='arial,helvetica,sans-serif'><b>Content type</b></font></td>
+                <td align='center'><font face='arial,helvetica,sans-serif'><b>Additional options</b></font></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
+ENDBLOCK
+            foreach my $area (@{$areas}) {
+                if ($count{$area} > 0) {
+                    my $count_tag = 'flag_'.$counter;
+                    $r->print("               <tr bgcolor='@bgcolors[$iter]'>
+                <td align='left'><font face='arial,helvetica,sans-serif'><input name='$area' type='checkbox' ");
+                    if ($area eq 'board' || $area eq 'users') {
+                        $r->print(qq|onClick='javascript:setOptions("$area","$counter")'|);
+                    }
+                    $r->print("/></font></td>
+                <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;$$areaname{$area}&nbsp;&nbsp; - $count{$area} item(s)</font></td>");
+                    if ($area eq 'board') {
+                        $r->print("            <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;
+                 <select name='db_handling'>
+                  <option value='-2'>&lt;-- Check Import first
+                 </select></font>
+                </td>");
+                    } elsif ($area eq 'users') {
+                        $r->print("            <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;
+                 <select name='user_handling'>
+                  <option value='-2'>&lt;-- Check Import first
                  </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>
+                 </font>        
+                </td>");
+                    } else {
+                        $r->print("            <td align='left'><font face='arial,helvetica,sans-serif'>&nbsp;&nbsp;None<input type='hidden' name='$count_tag' /></font></td>");
+                    }
+                    $counter ++;
+                    $iter = $counter%2;
+                }
+            }
+            $r->print(<<ENDBLOCKTWO);
                </tr>
               </table>
              </td>
@@ -264,25 +484,70 @@
        </td>
       </tr>
       <tr>
+       <td colspan='2'  align='left'>&nbsp;
+       </td>
+      </tr>
+ENDBLOCKTWO
+            if ($count{board} + $count{users} > 0) {
+                $r->print("
+      <tr bgcolor='#ccddaa'>
+       <td valign='middle'><img src='/res/adm/pages/bl_step4.gif'>
+       </td>
+       <td width='100%' align='left'>&nbsp;&nbsp;
+        <font face='arial,helvetica,sans-serif'><b>Choose a course to receive bulletin boards and user enrollment.</b></font>
+       </td>
+      </tr>
+      <tr>
+       <td colspan='2'>&nbsp;</td>
+      </tr>
+                ");
+                if ($$numcrs > 0) {
+                    $r->print("      <tr>
+       <td>&nbsp;</td>
+       <td><font face='arial,helvetica,sans-serif'>A listing of possible course targets will be displayed if import of bulletin boards and/or enrollment is checked above (step 3). If you do not plan to import either of these content types, there is no need to specify a course.
+<br /><br />
+Choose course:&nbsp;&nbsp;
+                 <select name='targetcourse'>
+                  <option value='-1'>Not required
+                 </select></font>
+       </td>
+      </tr>
+");
+                } else {
+                    $r->print("       <tr>
+<td>&nbsp;</td>
+<td><font face='arial,helvetica,sans-serif'>You do not have active course coordinator status in any LON-CAPA courses currently, so bulletin boards and enrollment information included in your IMS package will be discarded, regardless of your import choice for these two items above (step 3). If you wish to import bulletin boards and/or user information into LON-CAPA please click 'Exit now' to quit the current IMS import process, and contact your domain coordinator and request a course coordinator role in a LON-CAPA course into which you can upload bulletin boards and/or enroll users.</font>
+        ");
+                }
+            }
+            $r->print(<<ENDBLOCK);
+      <tr>
        <td colspan='2'>&nbsp;<br /><br /></td>
       </tr>
       <tr>
        <td>&nbsp;</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>
+       <td><font face='arial,helvetica,sans-serif'>Once you have checked the checkboxes for all areas you wish to import from the IMS package, and selected additional options (if available) you should click the 'Import package' button.</font></td>
       </tr>
       <tr>
-       <td colspan='2'>
-          <input type='hidden' name="go" value="">
+       <td colspan='2'>&nbsp;
+          <input type="hidden" name="newdir" value="$ENV{'form.newdir'}" />
+          <input type="hidden" name="conditions" value="$conditions" />
+          <input type="hidden" name="source" value="$cms" />
+          <input type="hidden" name="tempdir" value="$tempdir" />
           <input type="hidden" name="uploaduname" value="$uname">
-          <input type="hidden" name="filename" value="$fn">
-          <input type='hidden' name="page" value="$page">
-          <input type="hidden" name="phase" value="three">
+          <input type="hidden" name="filename" value="$fname">
+          <input type="hidden" name="phase" value="four" />
+ENDBLOCK
+            if ($count{board} == 0) {
+                $r->print('            <input type="hidden" name="board" value="" />'."\n");
+            }
+            if ($count{users} == 0) {
+                $r->print('            <input type="hidden" name="users" value="" />'."\n");
+            }
+            $r->print(<<ENDDOCUMENT);
        </td>
       </tr>
       <tr>
-       <td colspan='2'>&nbsp;</td>
-      </tr>
-      <tr>
        <td colspan='2'>
         <table border='0' cellspacing='0' cellpadding='0' width="100%">
          <tr>
@@ -290,7 +555,7 @@
            <input type='button' name='exitpage' value='Exit now' onClick="javascript:location.href='$fullpath'">
           </td>
           <td align='right'>
-           <input type="button" name="nextpage" value="Convert" onClick="javascript:nextPage()">
+           <input type="button" name="nextpage" value="Import package" onClick="javascript:nextPage($counter)">
           </td>
          </tr>
         </table>
@@ -300,2557 +565,172 @@
     </td>
    </tr>
   </table>
-</form>
-END_OF_ONE
-}
-
-# ---------------------------------------------------------------- Expand Blackboard 5 imsmanifest 
-sub expand_bb5 {
-    my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling,$announce_handling) = @_;
-    my @state = ();
-    my @seq = "Top";
-    my $lastitem;
-    my %revitm = ();
-    my %resnum = ();
-    my %title = ();
-    my %filepath = ();
-    my %contentscount = ('Top' => 0);
-    my %contents = ();
-    my %parentseq = ();
-    my %base = ();
-    my %file = ();
-    my %type = ();
-    my %href = ();
-    my $identifier = '';
-    my %resinfo = ();
-    my $numfolders = 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'};
-    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 />";
+ENDDOCUMENT
+        } else {
+            $r->print("Unpacking of your IMS package failed because an IMS manifest file was not located in the package\n");
         }
-        close(OUTPUT);
     } else {
-        return 'nozip';
-    } 
+        $r->print("Processing of your IMS package failed because the file you uploaded could not be unzipped\n");
+    }
+}
 
-    unless (-e "$docroot/temp/imsmanifest.xml") {
-        return 'nomanifest';
+# ---------------------------------------------------------------- Display Three
+sub display_three {
+    my ($r,$uname,$udom,$areas,$areaname,$cmsmap,$destdir,$newdir) = @_;
+    my $crs = '';
+    my $cdom = '';
+    my $chome = '';
+    my $db_handling = '';
+    my $timenow = time; 
+    my $announce_handling = 'ok';
+    my $cms = $ENV{'form.source'};
+    if ( defined($ENV{'form.bb_crs'}) ) {
+        ($cdom,$crs) = split/\//,$ENV{'form.bb_crs'};
+        $chome = &Apache::lonnet::homeserver($crs,$cdom);
     } 
-    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 "tableofcontents") ) {
-                    my $searchstr = "manifest organizations tableofcontents";
-                    while ($num > 0) {
-                        $searchstr .= " item";
-                        $num --; 
-                    }
-                    if (("@state" eq $searchstr) && (@state > 3)) {
-                        my $itm = $attr->{identifier};
-                        $resnum{$itm} = $attr->{identifierref};
-                        $revitm{$resnum{$itm}} = $itm;
-                        $title{$itm} = $attr->{title};
-                        $contentscount{$itm} = 0;
-                        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};
-                    $base{$identifier} = $attr->{baseurl};                 
-                    $file{$identifier} = $attr->{file};
-                    $type{$identifier} = $attr->{type};
-                } elsif ("@state" eq "manifest resources resource file") {
-                    push @{$href{$identifier}},$attr->{href};
-                }
-           }, "tagname, attr"],
-        text_h =>
-            [sub {
-                my ($text) = @_;
-              }, "dtext"],
-        end_h =>
-              [sub {
-                  my ($tagname) = @_;
-                  pop @state;
-               }, "tagname"],
-    );
-
-    $p->parse_file($xmlfile);
-    $p->eof;
-
-    my $destdir = $docroot;
-    my $seqstem ="/res/$udom/$uname/$newdir/sequences"; 
-    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}}) {
-            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);
+    if ( defined($ENV{'form.bb_handling'}) ) {
+        $db_handling = $ENV{'form.bb_handling'};
+    }
+    my $user_crs = '';
+    my $user_cdom = '';
+    my $user_handling = '';
+    if ( defined($ENV{'form.user_crs'}) ) {
+        ($user_cdom,$user_crs) = split/\//,$ENV{'form.user_crs'};
+    }
+    if ( defined($ENV{'form.user_handling'}) ) {
+        $user_handling = $ENV{'form.user_handling'};
+    }
+    my $seqstem = "/res/$udom/$uname/$newdir";
+    my %imports = ();
+    my @targets = ();
+    my %resources = ();
+    my %items = ();
+    my %hrefs = ();
+    my %urls = ();
+    my %resinfo = ();
+    my %total = (
+                   page => 0,
+                   prob => 0,
+                   seq => 0,
+                   board => 0,         
+                   quiz => 0,
+                   surv => 0,
+    );
+
+    my @pages = ();
+    my @sequences = ();
+    my @resrcfiles = ();
+
+    my $tempdir = $ENV{'form.tempdir'};
+
+    foreach my $area (@{$areas}) {
+        if (defined($ENV{"form.$area"}) ) {          
+            if ($cms eq 'angel' && $area eq 'doc') {
+                foreach (@{$$cmsmap{$cms}{$area}}) {
+                    $imports{$_} = 1;
                 }
+            } else {
+                $imports{$$cmsmap{$cms}{$area}} = 1;
             }
-            system("cp $docroot/temp/$key/$file $destdir/resfiles/$key/$file");
-        }
-    }   
-
-    foreach my $key (sort keys %type) {
-        if ($type{$key} eq "resource/x-bb-document") {
-            %{$resinfo{$key}} = ();
-            &process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname);
-        } elsif ($type{$key} eq "resource/x-bb-staffinfo") {
-            %{$resinfo{$key}} = ();
-            &process_staff($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
-        } elsif ($type{$key} eq "resource/x-bb-externallink") {
-            %{$resinfo{$key}} = ();
-            &process_link($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}});
-        } elsif ($type{$key} eq "resource/x-bb-discussionboard") {
-            %{$resinfo{$key}} = ();
-            unless ($bb_handling eq 'ignore') {
-                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 "assessment/x-bb-pool") {
-            %{$resinfo{$key}} = ();
-            &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname);
-        } elsif ($type{$key} eq "assessment/x-bb-quiz") {
-            %{$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") {
-            %{$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") {
-            %{$resinfo{$key}} = ();
-            push @groups, $key;
-            &process_group($key,$docroot,$destdir,\%{$resinfo{$key}});
-        } elsif ($type{$key} eq "resource/x-bb-user") {   
-            %{$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 ($area eq 'board') {
+                $db_handling = $ENV{'form.db_handling'};
+            } elsif ($area eq 'users') {
+                $user_handling = $ENV{'form.user_handling'};
             }
         }
     }
-    if (@announcements) {
-        $contentscount{Top} ++;
+    my $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo);
+    if ($manifest_result eq 'ok') {
+        &Apache::imsprocessor::target_resources(\%resources,\%imports,\@targets);
+        my $copy_result = &Apache::imsprocessor::copy_resources('CSTR',$cms,\%hrefs,$tempdir,\@targets,\%urls,$crs,$cdom,$chome,$destdir,$timenow);
+
+        my @boards = ();
+        my @announcements = ();
+        my @quizzes = ();
+        my @surveys = ();
+        my @groups = ();
+        my %messages = ();
+        my @timestamp = ();
+        my %boardnum = ();
+        my @topurls = ();
+        my @topnames = ();
+
+        &Apache::imsprocessor::process_resinfo($cms,$tempdir,$destdir,\%items,\%resources,\@boards,\@announcements,\@quizzes,\@surveys,\@groups,\%messages,\@timestamp,\%boardnum,\%resinfo,$udom,$uname,$cdom,$crs,$db_handling,$user_handling,\%total,$newdir,$seqstem,\@resrcfiles);
+   
+        &Apache::imsprocessor::build_structure($cms,'CSTR',$destdir,\%items,\%resinfo,\%resources,\%hrefs,$udom,$uname,$newdir,$timenow,$cdom,$crs,\@timestamp,\%total,\@boards,\@announcements,\@quizzes,\@surveys,\%boardnum,\@pages,\@sequences,\@topurls,\@topnames);
+
+        $r->print("<h3>Step 3: Publish your new LON-CAPA materials</h3>");
+
+        if ($cms eq 'bb5') {
+            $r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $total{seq} sequences, $total{page} pages, $total{board} bulletin boards, $total{quiz} quizzes, $total{surv} surveys and $total{prob} problems have been created.<br /><br />\n");
+        } elsif ($cms eq 'angel') {
+            $r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $total{seq} sequences, $total{page} pages, and $total{board} bulletin boards have been created.<br /><br />\n");
+        }
+#        system (" rm -r -f $destdir/temp");
+    } elsif ($manifest_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 .");
     }
-    if (@boards) {
-        $contentscount{Top} ++;
+}
+
+# ---------------------------------------------------------------- Get LON-CAPA Course Coordinator roles for this user
+sub get_ccroles {
+    my ($user,$dom,$crsentry,$crslist) = @_;
+    my %roles = ();
+    unless ($user eq '') {
+        %roles = &Apache::lonnet::dump('roles',$dom,$user);
     }
-    if (@quizzes) {
-        $contentscount{Top} ++;
-        $totquiz = @quizzes;
-    }
-    if (@surveys) {
-        $contentscount{Top} ++;
-        $totsurv = @surveys;
-    }
-
-    my $topnum = 0;
-    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 = ();
-
-    if (@announcements) {
-        &process_specials('announcements',\@announcements,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo);
-    }
-
-    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|;
+    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;
                 }
-            } 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 ($role_start > 0) {
+                if (time < $role_start) {
+                    $active_chk = 0;
                 }
             }
-            my $seqname = $title{$key};
-            $seqname =~ s/\s//g;
-            $seqname =~ tr/A-Z/a-z/;
-            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|;
+            if ($role_end > 0) {
+                if (time > $role_end) {
+                    $active_chk = 0;
                 }
-                print AREAFILE "</map>\n"; 
-                close(AREAFILE);
-                $fileopen = 0;
             }
-            $areakey = $key;
-            @{$pagecontents{$areakey}} = ();
-            open(AREAFILE,">$destdir/sequences/$key.sequence");
-            print AREAFILE "<map>\n";
-            $fileopen = 1;
-            $areacount = 0;
-        } else {
-            if ($filepath{$key} eq "Top,$areakey") {
-                my $src = '';
-                if ($areacount == 0) {
-                    if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") {
-                        $src = 'sequences/'.$key.".sequence";
-                        $pageflag{$areakey} = 0;
-                        $seqflag{$areakey} = 1;
-                    } else {
-                        if ($pageflag{$areakey}) {
-                            push @{$pagecontents{$areakey}[$pagecount{$areakey}]},$key;
-                        } else {
-                            $pagecount{$areakey} ++;
-                            $src = 'pages/'.$areakey.'_'.$pagecount{$areakey}.'.page';
-                            @{$pagecontents{$areakey}[$pagecount{$areakey}]} = ("$key");
-                            $seqflag{$areakey} = 0;
-                        }
-                    }
-                    unless ($pageflag{$areakey}) {
-                        print AREAFILE qq|<resource id="1" src="/res/$udom/$uname/$newdir/$src" title="$title{$key}" type="start">
-<link from="1" to="2" index="1"></link>\n|;
-                        $areacount ++;
-                        $notlastentry = "";
-                        unless ($seqflag{$areakey}) {
-                            $pageflag{$areakey} = 1;
-                        }
-                    }
+            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 {
-                    my $id = $areacount +1;
-                    my $nextid = $id +1;
-                    $areacount ++;
-                    if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") {
-                        $src = 'sequences/'.$key.".sequence";
-                        $pageflag{$areakey} = 0;
-                        $seqflag{$areakey} = 1;
-                    } else {
-                        if ($pageflag{$areakey}) {
-                            push @{$pagecontents{$areakey}[$pagecount{$areakey}]},$key;
-                        } else {
-                            $pagecount{$areakey} ++ ;
-                            $src = 'pages/'.$areakey.'_'.$pagecount{$areakey}.'.page';
-                            @{$pagecontents{$areakey}[$pagecount{$areakey}]} = ("$key");
-                            $seqflag{$areakey} = 0;
-                        } 
-                    }
-                    unless ($pageflag{$areakey}) {
-                        print AREAFILE $notlastentry.qq|<resource id="$id" src="/res/$udom/$uname/$newdir/$src" title="$title{$key}" |;
-                        unless ($seqflag{$areakey}) {
-                            $pageflag{$areakey} = 1;
-                        }
+                    $descrip{$crs} = 'Unknown';
+                }
+                if (defined($settings{'internal.coursecode'}) ) {
+                    $currcode = $settings{'internal.coursecode'};
+                    if ($currcode eq '') {
+                        $currcode = "____".$iter;
+                        $iter ++;
                     }
-                    $lastentry = qq|type="finish"></resource>|;
-                    $notlastentry = qq|></resource>
-<link from="$id" to="$nextid" index="$id"></link>\n|;
+                } else {
+                    $currcode = "____".$iter;
+                    $iter ++;
+                }
+                unless (grep/^$currcode$/,@codes) {
+                    push @codes,$currcode;
+                    @{$courses{$currcode}} = ();
                 }
-            }
-            my $src ="";
-            my $next_id = 1;
-            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") ) {
-                open(LOCFILE,">$destdir/sequences/$key.sequence");
-                print LOCFILE "<map>\n";
-                $totseq ++;
-                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 ($resinfo{$resnum{$contents{$key}[0]}}{'isfolder'} eq "true") {
-                        $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);
-            }
-        }
-    }
-
-    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>";
-    close(TOPFILE);
-    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';
-            $totpage ++;
-            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"); # 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 {
-  my ($res,$docroot,$destdir,$settings,$user_crs,$user_cdom,$user_handling) = @_;
-  my $xmlfile = $docroot."/temp/".$res.".dat";
-  my $filecount = 0;
-  my @state;
-  my $userid = '';
-  my $linknum = 0;
-
-  my $p = HTML::Parser->new
-    (
-     xml_mode => 1,
-     start_h =>
-     [sub {
-        my ($tagname, $attr) = @_;
-        push @state, $tagname;
-        if (@state eq "USERS USER") {
-            $userid = $attr->{value};
-            %{$$settings{$userid}} = ();
-            @{$$settings{$userid}{links}} = ();
-        } elsif (@state eq "USERS USER LOGINID") {  
-            $$settings{$userid}{loginid} = $attr->{value};
-        } elsif (@state eq "USERS USER PASSPHRASE") {  
-            $$settings{$userid}{passphrase} = $attr->{value};
-        } elsif ("@state" eq "USERS USER STUDENTID" ) {
-            $$settings{$userid}{studentid} = $attr->{value};
-        } elsif ("@state" eq "USERS USER NAMES FAMILY" ) {
-            $$settings{$userid}{family} = $attr->{value};
-        } elsif ("@state" eq "USERS USER NAMES GIVEN" ) {
-            $$settings{$userid}{given} = $attr->{value};
-        } elsif ("@state" eq "USERS USER ADDRESSES BUSINESS DATA EMAIL") {
-            $$settings{$userid}{email} = $attr->{value};
-        } elsif ("@state" eq "USERS USER USER_ROLE") {
-            $$settings{$userid}{user_role} = $attr->{value};
-        } elsif ("@state" eq "USERS USER FLAGS ISAVAILABLE") {
-            $$settings{$userid}{isavailable} = $attr->{value};
-        } elsif ("@state" eq "USERS USER PERSONALPAGE FILELIST IMAGE") {
-            $$settings{$userid}{image} = $attr->{value};
-        } elsif ( ($state[-2] eq "LINKLIST") && ($state[-1] eq "LINK") ) {
-            %{$$settings{$userid}{links}[$linknum]} = ();
-            $$settings{$userid}{links}[$linknum]{url} = $attr->{value};
-            $linknum ++;
-        }
-     }, "tagname, attr"],
-     text_h =>
-     [sub {
-        my ($text) = @_;
-        if ("@state" eq "USERS USER PERSONALPAGE TITLE") {
-            $$settings{$userid}{title} = $text;
-        } elsif ("@state" eq "USERS USER PERSONALPAGE DESCRIPTION") {
-            $$settings{$userid}{description} = $text;
-        } elsif (($state[-2] eq "LINK") && ($state[-1] eq "TITLE")) {
-            $$settings{$userid}{links}[$linknum]{title} = $text;
-        } elsif (($state[-3] eq "LINK") && ($state[-2] eq  "DESCRIPTION") && ($state[-1] eq "TEXT")) {
-            $$settings{$userid}{links}[$linknum]{text} = $text;
-        }
-      }, "dtext"],
-     end_h =>
-     [sub {
-        my ($tagname) = @_;
-        if (@state eq "USERS USER") {
-            $linknum = 0;
-        }
-        pop @state;
-     }, "tagname"],
-    );
-  $p->unbroken_text(1);
-  $p->parse_file($xmlfile);
-  $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 {  
-  my ($res,$docroot,$destdir,$settings) = @_;
-  my $xmlfile = $docroot."/".$res.".dat";
-  my $filecount = 0;
-  my @state;
-  my $grp;
-
-  my $p = HTML::Parser->new
-    (
-     xml_mode => 1,
-     start_h =>
-     [sub {
-        my ($tagname, $attr) = @_;
-        push @state, $tagname;
-        if (@state eq "GROUPS GROUP") {
-            $grp = $attr->{id};
-        }        
-        if (@state eq "GROUPS GROUP TITLE") {
-            $$settings{$grp}{title} = $attr->{value};
-        } elsif (@state eq "GROUPS GROUP FLAGS ISAVAILABLE") {  
-            $$settings{$grp}{isavailable} = $attr->{value};
-        } elsif (@state eq "GROUPS GROUP FLAGS HASCHATROOM") {  
-            $$settings{$grp}{chat} = $attr->{value};
-        } elsif ("@state" eq "GROUPS GROUP FLAGS HASDISCUSSIONBOARD") {
-            $$settings{$grp}{discussion} = $attr->{value};
-        } elsif ("@state" eq "GROUPS GROUP FLAGS HASTRANSFERAREA") {
-            $$settings{$grp}{transfer} = $attr->{value};
-        } elsif ("@state" eq "GROUPS GROUP FLAGS ISPUBLIC") {
-            $$settings{$grp}{public} = $attr->{value};
-        }
-     }, "tagname, attr"],
-     text_h =>
-     [sub {
-        my ($text) = @_;
-        if ("@state" eq "GROUPS DESCRIPTION") {
-          $$settings{$grp}{description} = $text;
-#          print "Staff text is $text\n";
-        }
-      }, "dtext"],
-     end_h =>
-     [sub {
-        my ($tagname) = @_;
-        pop @state;
-     }, "tagname"],
-    );
-  $p->unbroken_text(1);
-  $p->parse_file($xmlfile);
-  $p->eof;
-}
-
-# ---------------------------------------------------------------- Process Blackboard Staff
-sub process_staff {
-  my ($res,$docroot,$dirname,$destdir,$settings) = @_;
-  my $xmlfile = $docroot."/temp/".$res.".dat";
-  my $filecount = 0;
-  my @state;
-  %{$$settings{name}} = ();
-  %{$$settings{office}} = ();  
-
-  my $p = HTML::Parser->new
-    (
-     xml_mode => 1,
-     start_h =>
-     [sub {
-        my ($tagname, $attr) = @_;
-        push @state, $tagname;
-        if (@state eq "STAFFINFO TITLE") {
-            $$settings{title} = $attr->{value};
-        } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") {
-            $$settings{textcolor} = $attr->{value};
-        } elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") {
-            $$settings{ishtml} = $attr->{value};
-        } elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) {
-            $$settings{isavailable} = $attr->{value};
-        } elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) {
-            $$settings{isfolder} = $attr->{value};
-        } elsif ("@state" eq "STAFFINFO POSITION" ) {
-            $$settings{position} = $attr->{value};
-        } elsif ("@state" eq "STAFFINFO HOMEPAGE" ) {
-            $$settings{homepage} = $attr->{value};
-        } elsif ("@state" eq "STAFFINFO IMAGE") {
-            $$settings{image} = $attr->{value};
-        }
-     }, "tagname, attr"],
-     text_h =>
-     [sub {
-        my ($text) = @_;
-        if ("@state" eq "STAFFINFO BIOGRAPHY TEXT") {
-          $$settings{text} = $text;
-#          print "Staff text is $text\n";
-        } elsif ("@state" eq "STAFFINFO CONTACT PHONE") {
-          $$settings{phone} = $text;
-        } elsif ("@state" eq "STAFFINFO CONTACT EMAIL") {
-          $$settings{email} = $text;
-        } elsif ("@state" eq "STAFFINFO CONTACT NAME FORMALTITLE") {
-          $$settings{name}{formaltitle} = $text;
-        } elsif ("@state" eq "STAFFINFO CONTACT NAME FAMILY") {
-          $$settings{name}{family} = $text;
-        } elsif ("@state" eq "STAFFINFO CONTACT NAME GIVEN") {
-          $$settings{name}{given} = $text;
-        } elsif ("@state" eq "STAFFINFO CONTACT OFFICE HOURS") {
-          $$settings{office}{hours} = $text;
-        }  elsif ("@state" eq "STAFFINFO CONTACT OFFICE ADDRESS") {
-          $$settings{office}{address} = $text;
-        }        
-      }, "dtext"],
-     end_h =>
-     [sub {
-        my ($tagname) = @_;
-        pop @state;
-     }, "tagname"],
-    );
-  $p->unbroken_text(1);
-  $p->parse_file($xmlfile);
-  $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 {
-    my ($res,$docroot,$dirname,$destdir,$settings) = @_;
-    my $xmlfile = $docroot."/temp/".$res.".dat";
-    my @state = ();
-    my $p = HTML::Parser->new
-    (
-        xml_mode => 1,
-        start_h =>
-        [sub {
-            my ($tagname, $attr) = @_;
-            push @state, $tagname;
-            if (@state eq "EXTERNALLINK TITLE") {
-                $$settings{title} = $attr->{value};
-            } elsif (@state eq "EXTERNALLINK TEXTCOLOR") {  
-                $$settings{textcolor} = $attr->{value};
-            } elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") {  
-                $$settings{ishtml} = $attr->{value};                               
-            } elsif ("@state" eq "EXTERNALLINK FLAGS ISAVAILABLE" ) {
-                $$settings{isavailable} = $attr->{value};
-            } elsif ("@state" eq "EXTERNALLINK FLAGS LAUNCHINNEWWINDOW" ) {
-                $$settings{newwindow} = $attr->{value};
-            } elsif ("@state" eq "EXTERNALLINK FLAGS ISFOLDER" ) {
-                $$settings{isfolder} = $attr->{value};
-            } elsif ("@state" eq "EXTERNALLINK POSITION" ) {
-                $$settings{position} = $attr->{value};
-            } elsif ("@state" eq "EXTERNALLINK URL" ) {
-              $$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});
-        }
-    }
-
-    if (defined($$settings{url}) ) {
-        $linktag = qq|<a href="$$settings{url}"|;
-        if ($$settings{newwindow} eq "true") {
-            $linktag .= qq| target="launch"|;
-        }
-        $linktag .= qq|>$$settings{title}</a>|;
-    }
-
-    open(FILE,">$destdir/resfiles/$res.html");
-    print FILE qq|<html>
-<head>
-<title>$$settings{title}</title>
-</head>
-<body bgcolor='#ffffff'>
-$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 {
-    my ($res,$docroot,$destdir,$timestamp,$crs,$cdom,$handling,$uname,$settings) = @_;
-    my $xmlfile = $docroot."/temp/".$res.".dat";
-    my @state = ();
-    my @allmsgs = ();
-    my %msgidx = ();
-    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
-    (
-       xml_mode => 1,
-       start_h =>
-       [sub {
-           my ($tagname, $attr) = @_;
-           push @state, $tagname;
-           my $depth = 0;
-           my @seq = ();
-           if ("@state" eq "FORUM TITLE") {
-               $$settings{title} = $attr->{value};
-           } elsif ("@state" eq "FORUM DESCRIPTION TEXTCOLOR") {  
-               $$settings{textcolor} = $attr->{value};
-           } elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISHTML") {  
-               $$settings{ishtml} = $attr->{value};
-           } elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") {  
-               $$settings{newline} = $attr->{value};
-           } elsif ("@state" eq "FORUM POSITION" ) {
-               $$settings{position} = $attr->{value};
-           } elsif ("@state" eq "FORUM FLAGS ISREADONLY") {
-               $$settings{isreadonly} = $attr->{value};
-           } elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) {
-               $$settings{isavailable} = $attr->{value};
-           } elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) {
-               $$settings{allowanon} = $attr->{value};
-           } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {
-               if ($state[-1] eq "MSG") {
-                   unless ($msg_id eq '') {
-                       push @{$threads{$msg_id}}, { %message };
-                       $depth = @state - 3;
-                       if ($depth > @seq) {
-                           push @seq, $msg_id; 
-                       }
-                   }
-                   if ($depth < @seq) {
-                       pop @seq;
-                   }                
-                   $msg_id = $attr->{id};
-                   push @allmsgs, $msg_id;
-                   $msgidx{$msg_id} = @allmsgs;
-                   %message = ();
-                   $message{depth} = $depth;
-                   if ($depth > 0) {
-                       $message{parent} = $seq[-1];
-                   } else {
-                       $message{parent} = "None";
-                   }
-               } elsif ($state[-1] eq "TITLE") {
-                   $message{title} = $attr->{value};
-               } elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISHTML" ) ) {
-                   $message{ishtml} = $attr->{value};
-               } elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISNEWLINELITERAL" ) ) {
-                   $message{newline} = $attr->{value};
-               } elsif ( ( $state[-2] eq "DATES" ) && ( $state[-1] eq "CREATED" ) ) {
-                   $message{created} = $attr->{value};
-               } elsif ( $state[@state-2] eq "FLAGS") {
-                   if ($state[@state-1] eq "ISANONYMOUS") {
-                       $message{isanonymous} =  $attr->{value};
-                   }
-               } elsif ( $state[-2] eq "USER" ) {
-                   if ($state[-1] eq "USERID") {
-                       $message{userid} =  $attr->{value};
-                   } elsif ($state[@state-1] eq "USERNAME") {
-                       $message{username} =  $attr->{value};
-                   } elsif ($state[@state-1] eq "EMAIL") {
-                       $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});
-        }
-        if (defined($$settings{fontcolor}) ) {
-            $$settings{text} = "<font color=\"".$$settings{textcolor}."\">".$$settings{text}."</font>";
-        }
-    }
-    my $boardname = 'bulletinpage_'.$timestamp;
-    my %boardinfo = (
-                  'aaa_title' => $$settings{title},
-                  'bbb_content' => $$settings{text},
-                  'ccc_webreferences' => '',
-                  '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);
-                }
-            }
-        }
-    }
-}
-
-# ---------------------------------------------------------------- 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 {
-    my ($res,$docroot,$container,$dirname,$destdir,$settings,$totpageref,$totprobref,,$udom,$uname) = @_;
-    my $xmlfile = $docroot."/temp/".$res.".dat";
-#  print "XML file is $xmlfile\n";
-    my @state = ();
-    my @allids = ();
-    my %allanswers = ();
-    my %allchoices = ();
-    my $resdir = '';
-    if ($docroot =~ m|public_html/(.+)$|) {
-        $resdir = $1;
-    }
-    my $id; # the current question ID
-    my $answer_id; # the current answer ID
-    my %toptag = ( pool => 'POOL',
-                 quiz => 'ASSESSMENT',
-                 survey => 'ASSESSMENT'
-               );
-
-    my $p = HTML::Parser->new
-    (
-     xml_mode => 1,
-     start_h =>
-     [sub {
-        my ($tagname, $attr) = @_;
-        push @state, $tagname;
-        my $depth = 0;
-        my @seq = ();
-        my $class;
-        my $state_str = join(" ",@state);
-        if ($container eq "pool") {
-            if ("@state" eq "POOL TITLE") {
-                $$settings{title} = $attr->{value};
-            }
-        } else {
-            if ("@state" eq "ASSESSMENT TITLE") {  
-                $$settings{title} = $attr->{value};          
-            } elsif ("@state" eq "ASSESSMENT FLAG" ) {
-                $$settings{isnewline} = $attr->{value};
-            } elsif ("@state" eq "ASSESSMENT FLAGS ISAVAILABLE") {
-                $$settings{isavailable} = $attr->{value};
-            } elsif ("@state" eq "ASSESSMENT FLAGS ISANONYMOUS" ) {
-                $$settings{isanonymous} = $attr->{id};
-            } elsif ("@state" eq "ASSESSMENT FLAGS GIVE FEEDBACK" ) {
-                $$settings{feedback} = $attr->{id};        
-            } elsif ("@state" eq "ASSESSMENT FLAGS SHOWCORRECT" ) {
-                $$settings{showcorrect} = $attr->{id};        
-            } elsif ("@state" eq "ASSESSMENT FLAGS SHOWRESULTS" ) {
-                $$settings{showresults} = $attr->{id};        
-            } elsif ("@state" eq "ASSESSMENT FLAGS ALLOWMULTIPLE" ) {
-                $$settings{allowmultiple} = $attr->{id};        
-            } elsif ("@state" eq "ASSESSMENT ASSESSMENTTYPE" ) {
-                $$settings{type} = $attr->{id};        
-            }
-        }    
-        if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") {  
-            $id = $attr->{id};
-            unless ($container eq 'pool') {
-                push @allids, $id;
-            }
-            %{$$settings{$id}} = ();
-            @{$allanswers{$id}} = ();
-            $$settings{$id}{class} = $attr->{class};
-            unless ($container eq "pool") {
-                $$settings{$id}{points} = $attr->{points};
-            }
-            @{$$settings{$id}{correctanswer}} = ();                              
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[-1] =~ m/^QUESTION_(\w+)$/) ) {
-            $id = $attr->{id};
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") ) {
-            if ($state[4] eq "ISHTML") {
-                $$settings{$id}{html} = $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") ) {
-            $$settings{$id}{image} = $attr->{value};
-            $$settings{$id}{style} = $attr->{style};
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "URL") ) {
-            $$settings{$id}{url} = $attr->{value};
-            $$settings{$id}{name} = $attr->{name};
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[-1] eq "ANSWER") ) {
-            $answer_id = $attr->{id};
-            push @{$allanswers{$id}},$answer_id;
-            %{$$settings{$id}{$answer_id}} = ();
-            $$settings{$id}{$answer_id}{position} = $attr->{position};
-            if ($$settings{$id}{class} eq 'QUESTION_MATCH') {
-                $$settings{$id}{$answer_id}{placement} = $attr->{placement};
-                $$settings{$id}{$answer_id}{type} = 'answer';
-            }
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[-1] eq "CHOICE") ) {
-            $answer_id = $attr->{id};
-            push @{$allchoices{$id}},$answer_id; 
-            %{$$settings{$id}{$answer_id}} = ();
-            $$settings{$id}{$answer_id}{position} = $attr->{position};
-            $$settings{$id}{$answer_id}{placement} = $attr->{placement};
-            $$settings{$id}{$answer_id}{type} = 'choice';
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") ) {
-            if ($state[3] eq "IMAGE") {
-                $$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 "CHOICE") ) {
-            if ($state[3] eq "IMAGE") {
-                $$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") ) {
-            my $corr_answer = $attr->{answer_id};
-            push @{$$settings{$id}{correctanswer}}, $corr_answer;
-            my $type = $1;
-            if ($type eq 'TRUEFALSE') {
-                $$settings{$id}{$corr_answer}{answer_position} = $attr->{position};
-            } elsif ($type eq 'ORDER') {
-                $$settings{$id}{$corr_answer}{order} = $attr->{order};
-            } elsif ($type eq 'MATCH') {
-                $$settings{$id}{$corr_answer}{choice_id} = $attr->{choice_id};
-            }
-        }
-     }, "tagname, attr"],
-     text_h =>
-     [sub {
-        my ($text) = @_;
-        unless ($container eq "pool") {        
-            if ("@state" eq "ASSESSMENT DESCRIPTION TEXT") {
-                $$settings{description} = $text;
-            } elsif ("@state" eq "ASSESSMENT INSTRUCTIONS ") {
-                $$settings{instructions}{text} = $text;
-            }
-        }
-        if ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "TEXT") ) {
-            $$settings{$id}{text} = $text;
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "TEXT") ) {
-            $$settings{$id}{$answer_id}{text} = $text;
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "TEXT") ) {
-            $$settings{$id}{$answer_id}{text} = $text;            
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "FEEDBACK_WHEN_CORRECT") ) {
-            $$settings{$id}{feedback_corr} = $text;
-        } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "FEEDBACK_WHEN_INCORRECT") ) {
-            $$settings{$id}{feedback_incorr} = $text;       
-        }
-      }, "dtext"],
-     end_h =>
-     [sub {
-        my ($tagname) = @_;
-        pop @state;
-     }, "tagname"],
-    );
-    $p->unbroken_text(1);
-    $p->parse_file($xmlfile);
-    $p->eof;
-
-    my $dirtitle = $$settings{'title'};
-    $dirtitle =~ s/\W//g;
-    $dirtitle .= '_'.$res;
-    if (!-e "$destdir/problems/$dirtitle") {
-        mkdir("$destdir/problems/$dirtitle",0755);
-    }
-    my $newdir = "$destdir/problems/$dirtitle";
-    my $pagedir = "$destdir/pages";
-    my $curr_id = 0;
-    my $next_id = 1;
-    unless ($container eq 'pool') {
-        open(PAGEFILE,">$pagedir/$res.page");
-        print PAGEFILE qq|<map>
-|;
-        $$totpageref ++; 
-        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|
-<link from="1" to="2" index="1"></link>
-<resource id="2" src="" type="finish">\n|;
-        } else {
-            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);
-    }
-    foreach my $id (@allids) {
-        my $output = qq|<problem>
-|;
-        $$totprobref ++;
-        if ($$settings{$id}{class} eq "QUESTION_ESSAY") {
-            $output .= qq|<startouttext />$$settings{$id}{text}<endouttext />
- <essayresponse>
- <textfield></textfield>
- </essayresponse>
- <postanswerdate>
- $$settings{$id}{feedbackcorr}
- </postanswerdate>
-|;
-        } else {
-            $output .= qq|<startouttext />$$settings{$id}{text}\n|;
-            if ( defined($$settings{$id}{image}) ) { 
-                if ( $$settings{$id}{style} eq 'embed' ) {
-                    $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{image}" /><br />|;
-                } else {
-                    $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{image}">Link to file</a><br />|;
-                }
-            }
-            if ( defined($$settings{$id}{url}) ) {
-                $output .= qq|<br /><a href="$$settings{$id}{url}">$$settings{$id}{name}</a><br />|;
-            }
-            $output .= qq|
-<endouttext />|;
-            if ($$settings{$id}{class} eq 'QUESTION_MULTIPLECHOICE') {
-                my $numfoils = @{$allanswers{$id}};
-                $output .= qq|
- <radiobuttonresponse max="$numfoils" randomize="yes">
-  <foilgroup>
-|;
-                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">
-    <foilgroup>
-|;
-                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=\"random\"";
-                    } else {
-                        $output .= "false\" location=\"random\"";
-                    }
-                    $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
-                }
-                chomp($output);
-                $output .= qq|
-    </foilgroup>
-   </radiobuttonresponse>
-|;
-            } elsif ($$settings{$id}{class} eq 'QUESTION_MULTIPLEANSWER') {
-                my $numfoils = @{$allanswers{$id}};
-                $output .= qq|
-   <optionresponse max="$numfoils" randomize="yes">
-    <foilgroup options="('True','False')">
-|;
-                for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
-                    $output .= "   <foil name=\"foil".$k."\" value=\"";
-                    if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
-                        $output .= "True\"";
-                    } else {
-                        $output .= "False\"";
-                    }
-                    $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
-                }
-                chomp($output);
-                $output .= qq|
-    </foilgroup>
-   </optionresponse>
-|;
-            } elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') {
-                my $numfoils = @{$allanswers{$id}};
-                $output .= qq|
-   <rankresponse max="$numfoils" randomize="yes">
-    <foilgroup>
-|;
-                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";
-                }
-                chomp($output);
-                $output .= qq|
-    </foilgroup>
-   </rankresponse>
-|;
-            } elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') {
-                my $numerical = 1;
-                for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
-                    if ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/([^\d\.]|\.\.)/) {
-                        $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;
-                        $tol = 100*($max - $min)/($numans*2);
-                    }
-                    $output .= qq|
-<numericalresponse answer="$numans">
-        <responseparam type="tolerance" default="$tol%" name="tol" description="Numerical Tolerance" />
-        <responseparam name="sig" type="int_range,0-16" default="0,15" description="Significant Figures"
-/>
-        <textline />
-</numericalresponse>
-|;
-                } else {
-                    if (@{$allanswers{$id}} == 1) {
-                        $output .= qq|
-<stringresponse answer="$$settings{$id}{$allanswers{$id}[0]}{text}" type="ci">
-<textline>
-</textline>
-</stringresponse>
-|;
-                    } else {
-                        my @answertext = ();
-                        for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
-                            $$settings{$id}{$allanswers{$id}[$k]}{text} =~ s/\|/\|/g;
-                            push @answertext, $$settings{$id}{$allanswers{$id}[$k]}{text};
-                        }
-                        my $regexpans = join('|',@answertext);
-                        $regexpans = '/^('.$regexpans.')\b/';
-                        $output .= qq|
-<stringresponse answer="$regexpans" type="re">
-<textline>
-</textline>
-</stringresponse>
-|;
-                    }
-                }
-            } elsif ($$settings{$id}{class} eq "QUESTION_MATCH") {
-                $output .= qq|
-<matchresponse max="10" randomize="yes">
-    <foilgroup>
-        <itemgroup>
-|;
-                for (my $k=0; $k<@{$allchoices{$id}}; $k++) {
-                    $output .= qq|
-<item name="$allchoices{$id}[$k]">
-<startouttext />$$settings{$id}{$allchoices{$id}[$k]}{text}<endouttext />
-</item>
-                    |;
-                }
-                $output .= qq|
-        </itemgroup>
-|;
-                for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
-                    $output .= qq|
-        <foil location="random" value="$$settings{$id}{$allanswers{$id}[$k]}{choice_id}" name="$allanswers{$id}[$k]">
-         <startouttext />$$settings{$id}{$allanswers{$id}[$k]}{text}<endouttext />
-        </foil>
-|;
-                }
-                $output .= qq|
-    </foilgroup>
-</matchresponse>
-|;
-            }
-        }
-        $output .= qq|</problem>
-|;
-        open(PROB,">$newdir/$id.problem");
-        print PROB $output;
-        close PROB;
-    }
-}
-
-# ---------------------------------------------------------------- Process Blackboard Announcements
-sub process_announce {
-    my ($res,$docroot,$destdir,$settings,$globalresref,$seqstem,$revitmref) = @_;
-    my $xmlfile = $docroot."/temp/".$res.".dat";
-    my @state = ();
-    my @assess = ();
-    my $id;
-    my $p = HTML::Parser->new
-    (
-     xml_mode => 1,
-     start_h =>
-     [sub {
-        my ($tagname, $attr) = @_;
-        push @state, $tagname;
-        if ("@state" eq "ANNOUNCEMENT TITLE") {
-            $$settings{title} = $attr->{value};
-            $$settings{startassessment} = ();
-        } elsif (@state eq "ANNOUNCEMENT DESCRIPTION FLAGS ISHTML") {  
-            $$settings{ishtml} = $attr->{value};          
-        } elsif ("@state" eq "ANNOUNCEMENT DESCRIPTION FLAGS ISNEWLINELITERAL" ) {
-            $$settings{isnewline} = $attr->{value};
-        } elsif ("@state" eq "ANNOUNCEMENT ISPERMANENT" ) {
-            $$settings{ispermanent} = $attr->{value};
-        } elsif ("@state" eq "ANNOUNCEMENT DATES UPDATED") {
-            $$settings{dates} = $attr->{value}; 
-        } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) {
-            $id = $attr->{id};
-            %{$$settings{startassessment}{$id}} = ();
-            push @assess,$id;
-        } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) {
-            my $key = $attr->{key};
-            $$settings{startassessment}{$id}{$key} = $attr->{value};
-        }
-     }, "tagname, attr"],
-     text_h =>
-     [sub {
-        my ($text) = @_;
-        if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") {
-            $$settings{text} = $text;
-        }
-      }, "dtext"],
-     end_h =>
-     [sub {
-        my ($tagname) = @_;
-        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});
-        }
-    }
-  
-    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 {
-    my ($res,$docroot,$destdir,$settings,$dom,$user) = @_;
-    my $xmlfile = $docroot."/temp/".$res.".dat";
-    my $destresdir = $destdir;
-    $destresdir =~ s|/home/$user/public_html/|/res/$dom/$user/|;
-    my $filecount = 0;
-    my @allrelfiles = ();
-    my @state;
-    @{$$settings{files}} = (); 
-    my $p = HTML::Parser->new
-    (
-      xml_mode => 1,
-      start_h =>
-      [sub {
-        my ($tagname, $attr) = @_;
-        push @state, $tagname;
-        if (@state eq "CONTENT MAINDATA") {
-            %{$$settings{maindata}} = ();
-        } elsif (@state eq "CONTENT MAINDATA TEXTCOLOR") {
-            $$settings{maindata}{color} = $attr->{value};
-        } elsif (@state eq "CONTENT MAINDATA FLAGS ISHTML") {  
-            $$settings{maindata}{ishtml} = $attr->{value}; 
-        } elsif (@state eq "CONTENT MAINDATA FLAGS ISNEWLINELITERAL") {  
-            $$settings{maindata}{isnewline} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FLAGS ISAVAILABLE" ) {
-            $$settings{isavailable} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FLAGS ISFOLDER" ) {
-            $$settings{isfolder} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FLAGS LAUNCHINNEWWINDOW" ) {
-            $$settings{newwindow} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF") {
-            %{$$settings{files}[$filecount]} = ();
-            %{$$settings{files}[$filecount]{registry}} = (); 
-        } elsif ("@state" eq "CONTENT FILES FILEREF RELFILE" ) {
-            $$settings{files}[$filecount]{'relfile'} = $attr->{value};
-            push @allrelfiles, $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF MIMETYPE") {
-            $$settings{files}[$filecount]{mimetype} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF CONTENTTYPE") {
-            $$settings{files}[$filecount]{contenttype} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF FILEACTION") {
-            $$settings{files}[$filecount]{fileaction} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF PACKAGEPARENT") {
-            $$settings{files}[$filecount]{packageparent} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF LINKNAME") {
-            $$settings{files}[$filecount]{linkname} = $attr->{value};
-        } elsif ("@state" eq "CONTENT FILES FILEREF REGISTRY REGISTRYENTRY") {
-            my $key = $attr->{key};
-            $$settings{files}[$filecount]{registry}{$key} = $attr->{value};
-        }
-      }, "tagname, attr"],
-      text_h =>
-      [sub {
-        my ($text) = @_;
-        if ("@state" eq "CONTENT TITLE") {
-            $$settings{title} = $text;
-        } elsif ("@state" eq "CONTENT MAINDATA TEXT") {
-            $$settings{maindata}{text} = $text;
-        }  elsif ("@state" eq "CONTENT FILES FILEREF REFTEXT") {
-            $$settings{files}[$filecount]{reftext} = $text;
-        }
-       }, "dtext"],
-      end_h =>
-      [sub {
-        my ($tagname) = @_;
-        if ("@state" eq "CONTENT FILES FILEREF") {
-            $filecount ++;
-        }
-        pop @state;
-      }, "tagname"],
-     );
-    $p->unbroken_text(1);
-    $p->parse_file($xmlfile);
-    $p->eof;
-    my $linktag = '';
-    my $fontcol = '';
-    if (@{$$settings{files}} > 0) {
-        for (my $filecount=0;  $filecount<@{$$settings{files}}; $filecount++) {
-            if ($$settings{files}[$filecount]{'fileaction'} eq 'embed') {
-                if ( $$settings{files}[$filecount]{reftext} =~ m#<\!\-\-\s_(\d+)\\_\s\-\-\>#) { 
-                    my $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"/>|;
-                    $$settings{maindata}{text} =~ s#<\!\-\-\s_/($1)\\_\s\-\-\>#$newtag#;
-                } elsif ( $$settings{files}[$filecount]{reftext} =~m#^_/(\d+)\\_$# ) {
-                    my $reftag = $1;
-                    my $newtag;
-                    if ($$settings{files}[$filecount]{mimetype} =~ m/^image/) {
-                        $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;
-                        if ( defined($$settings{files}[$filecount]{registry}{alttext}) ) {
-                            $newtag .= qq| alt="$$settings{files}[$filecount]{registry}{alttext}"|;
-                        }
-                        if ( defined($$settings{files}[$filecount]{registry}{alignment}) )
-{
-                            $newtag .= qq| align="$$settings{files}[$filecount]{registry}{alignment}"|; 
-                        }
-                        if ( defined($$settings{files}[$filecount]{registry}{border}) ) {
-                            $newtag .= qq| border="$$settings{files}[$filecount]{registry}{border}"|;
-                        }
-                        $newtag .= " />";
-                        my $reftext =  $$settings{files}[$filecount]{reftext};
-                        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/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/_\/$reftag\\_/$newtag/;
-                        $$settings{maindata}{text} =~ s/END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n]+//;
-                        $$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/;
-#                      print STDERR $$settings{maindata}{text};
-                    }
-                } else {
-                    my $filename=$$settings{files}[$filecount]{'relfile'};
-#                  print "File is $filename\n";
-                    my $newfilename="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}";
-#                  print "New filename is $newfilename\n";
-                    $$settings{maindata}{text} =~ s#(src|SRC|value)="$filename"#$1="$newfilename"#g;
-                }
-            } elsif ($$settings{files}[$filecount]{fileaction} eq 'link') {
-                unless (($$settings{files}[$filecount]{packageparent} ne '') && (grep/^$$settings{files}[$filecount]{packageparent}$/,@{$$settings{files}}) ) {
-                    $linktag .= qq|<a href="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;
-                    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}"|;
-                    }
-                      $linktag .= qq|>$$settings{files}[$filecount]{linkname}</a><br/>\n|;
-                }
-            } elsif ($$settings{files}[$filecount]{fileaction} eq 'package') {
-#              print "Found a package\n";
-            }
-        }
-    }
-    if (defined($$settings{maindata}{textcolor})) {
-        $fontcol =  qq|<font color="$$settings{maindata}{textcolor}">|;
-    }
-    if (defined($$settings{maindata}{text})) {
-        if ($$settings{maindata}{ishtml} eq "false") {
-            if ($$settings{maindata}{isnewline} eq "true") {
-                $$settings{maindata}{text} =~ s#\n#<br/>#g;
-            }
-        } else {
-            $$settings{maindata}{text} = &HTML::Entities::decode($$settings{maindata}{text});
-        }
-    }
-
-    open(FILE,">$destdir/resfiles/$res.html");
-    print FILE qq|<html>
-<head>
-<title>$$settings{title}</title>
-</head>
-<body bgcolor='#ffffff'>
-$fontcol
-|;
-    unless ($$settings{title} eq '') { 
-        print FILE qq|$$settings{title}<br/><br/>\n|;
-    }
-    print FILE qq|
-$$settings{maindata}{text}
-$linktag|;
-    if (defined($$settings{maindata}{textcolor})) {
-        print FILE qq|</font>|;
-    }
-    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>
- </html>|;
-    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;
+                push @{$courses{$currcode}}, $cdom.'/'.$crs;
             }
         }
     }
@@ -2860,10 +740,10 @@
             my $showcode = '';
             unless ($code =~m/^____\d+$/) {  $showcode = $code; }
             $$crsentry{$crsdom} = $showcode.':'.$descrip{$crs};
-            push @crslist, $crsdom;
+            push @{$crslist}, $crsdom;
         }
     }
-    return @crslist;
+    return;
 }
 
 # ---------------------------------------------------------------- Main Handler
@@ -2876,8 +756,13 @@
     my $current_page = '';
     my $loadentries = '';
     my $qcount = '';
+
+# get personal information for this user
+    my $user=$ENV{'user.name'};
+    my $dom=$ENV{'user.domain'};
+
 #
-# phase two: re-attach user
+# re-attach user
 #
     if ($ENV{'form.uploaduname'}) {
         $ENV{'form.filename'}='/priv/'.$ENV{'form.uploaduname'}.'/'.
@@ -2906,28 +791,30 @@
                        ' unspecified filename for upload', $r->filename);
         return HTTP_NOT_FOUND;
     }
+    my $zipupload = '/home/'.$uname.'/public_html'.$fn;
     my $pathname = &File::Basename::dirname($fn);
     my $fullpath = '/priv/'.$uname.$pathname;
     unless ($pathname eq '/') {
         $fullpath .= '/';
     }
     my $loadentries = '';
+
+    my @areas = ();
+    my %cmsmap = ();
+    my %areaname = ();
+    my $numcrs = 0;
+             
+    &Apache::imsprocessor::ims_config(\@areas,\%cmsmap,\%areaname);
 # ----------------------------------------------------------- Start page output
     &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
-                                                                                             
-    if ($ENV{'form.phase'} eq 'three') {
-        $current_page = &display_control();
-        my @PAGES = ('ChooseDir','Confirmation');
-        $page_name = $PAGES[$current_page];
-        
-        if ($page_name eq 'ChooseDir') {
-            &jscript_zero($fullpath,\$javascript,$uname,$udom);
-        } elsif ($page_name eq 'Confirmation') {
-#            &jscript_two(\$javascript,$uname);
-        }
-    } elsif ($ENV{'form.phase'} eq 'two') {
-        &jscript_zero($fullpath,\$javascript,$uname,$udom);
+
+    if ($ENV{'form.phase'} eq 'two') {
+        &jscript_one($fullpath,\$javascript,$uname,$udom);
+    } elsif ($ENV{'form.phase'} eq 'three') {
+        &jscript_two(\$javascript,$user,$dom,\$numcrs);
+    } elsif ($ENV{'form.phase'} eq 'four') {
+        &jscript_three(\$javascript);
     }
     $r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>");
                                                                                              
@@ -2936,55 +823,22 @@
     if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
         $r->print('<h3><font color=red>'.&mt('Co-Author').': '.$uname.
                   &mt(' at ').$udom.'</font></h3>');
-    }
-                                                                                             
-    if ($ENV{'form.phase'} eq 'three') {
-        my $bb_crs = '';
-        my $bb_cdom = '';
-        my $bb_handling = '';
-        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') {
+    }   
+    if ($ENV{'form.phase'} eq 'two') {
         my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport');
         if ($flag eq 'ok') {
-            my $current_page = 0;
-            &display_zero($r,$uname,$fn,$current_page,$fullpath);
+            &display_one($r,$uname,$fn,$fullpath);
+        }
+    } elsif ( ($ENV{'form.phase'} eq 'three') || ($ENV{'form.phase'} eq 'four') ) {
+        my $docroot = $ENV{'form.newdir'};
+        my $newdir = '';
+        if ($docroot =~ m|public_html/(.+)$|) {
+            $newdir = $1;
+        }
+        if ($ENV{'form.phase'} eq 'three') {
+            &display_two ($r,$zipupload,\@areas,\%areaname,\%cmsmap,$uname,$newdir,\$numcrs,$fullpath);
+        } elsif ($ENV{'form.phase'} eq 'four') {
+            &display_three ($r,$uname,$udom,\@areas,\%areaname,\%cmsmap,$docroot,$newdir);
         }
     } else {
         &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport');
Index: modules/raeburn/imsprocessor.pm
diff -u modules/raeburn/imsprocessor.pm:1.2 modules/raeburn/imsprocessor.pm:1.3
--- modules/raeburn/imsprocessor.pm:1.2	Tue Mar  9 11:44:01 2004
+++ modules/raeburn/imsprocessor.pm	Tue Mar 16 14:20:58 2004
@@ -3,12 +3,52 @@
 use Apache::lonnet;
 use LONCAPA::Configuration;
 use strict;
+
+sub ims_config {
+    my ($areas,$cmsmap,$areaname) = @_;
+    @{$areas} = ("doc","extlink","announce","staff","board","quiz","survey","pool","users");
+    %{$$cmsmap{bb5}} = (
+                announce => 'resource/x-bb-announcement',
+                board => 'resource/x-bb-discussionboard',
+                doc => 'resource/x-bb-document',
+                extlink => 'resource/x-bb-externallink',
+                pool => 'assessment/x-bb-pool',
+                quiz => 'assessment/x-bb-quiz',
+                staff => 'resource/x-bb-staffinfo',
+                survey => 'assessment/x-bb-survey',
+                users => 'course/x-bb-user',
+                );
+ 
+    %{$$cmsmap{angel}} =  (
+                board => 'BOARD',
+                extlink => 'LINK',
+                msg => 'MESSAGE',
+                quiz => 'QUIZ',
+                survey => 'FORM',
+                );
+
+    @{$$cmsmap{angel}{doc}} = ('FILE','PAGE');
+
+
+    %{$areaname} = (
+                announce => 'Announcements',
+                board => 'Discussion Boards',
+                doc => 'Documents, pages, and folders',
+                extlink => 'Links to external sites',
+                pool => 'Question pools',
+                quiz => 'Quizzes',
+                staff => 'Staff information',
+                survey => 'Surveys',
+                users => 'Enrollment',
+                );
+         
+}
  
 sub create_tempdir {
-    my ($caller,$pathinfo,$timenow) = @_;   
+    my ($context,$pathinfo,$timenow) = @_;   
     my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf');
     my $tempdir;
-    if ($caller eq 'DOCS') {
+    if ($context eq 'DOCS') {
         $tempdir =  $$configvars{'lonDaemons'}.'/tmp/'.$pathinfo;
         if (!-e "$tempdir") {
             mkdir("$tempdir",0770);
@@ -17,7 +57,7 @@
         if (!-e "$tempdir") {
             mkdir("$tempdir",0770);
         } 
-    } elsif ($caller eq "CSTR") {
+    } elsif ($context eq "CSTR") {
         if (!-e "$pathinfo/temp") {
             mkdir("$pathinfo/temp",0770);
         }
@@ -26,6 +66,36 @@
     return $tempdir;
 }
 
+sub uploadzip {
+    my ($context,$tempdir,$source) = @_;
+    my $fname;
+    if ($context eq 'DOCS') {
+        $fname=$ENV{'form.uploadname.filename'};
+# Replace Windows backslashes by forward slashes
+        $fname=~s/\\/\//g;
+# Get rid of everything but the actual filename
+        $fname=~s/^.*\/([^\/]+)$/$1/;
+# Replace spaces by underscores
+        $fname=~s/\s+/\_/g;
+# Replace all other weird characters by nothing
+        $fname=~s/[^\w\.\-]//g;
+# See if there is anything left
+        unless ($fname) { return 'error: no uploaded file'; }
+# Save the file
+        chomp($ENV{'form.uploadname'});
+        open(my $fh,'>'.$tempdir.'/'.$fname);
+        print $fh $ENV{'form.uploadname'};
+        close($fh);
+    } elsif ($context eq 'CSTR') {
+        if ($source =~ m/\/([^\/]+)$/) {
+            $fname = $1;
+            my $destination = $tempdir.'/'.$fname;
+            rename($source,$destination);
+        }
+    }
+    return $fname;   
+}
+
 sub expand_zip {
     my ($tempdir,$filename) = @_;
     my $zipfile = "$tempdir/$filename";
@@ -60,7 +130,9 @@
                       contentscount => 0,
                       resnum => 'toplevel',
                       );
-    %{$$resources{'toplevel'}} = ();
+    %{$$resources{'toplevel'}} = (
+                                  revitm => 'Top'
+                                 );
  
     if ($cms eq 'angel') {
         $$resources{'toplevel'}{type} = "FOLDER";
@@ -212,31 +284,15 @@
                 foreach my $file (@{$$hrefs{$key}}) {
                     my $source = $tempdir.'/'.$key.'/'.$file;
                     my $filename = '';
-                    my $fpath = $timenow.'/resfiles/'.$key.'/'; 
-                    if ($cms eq 'bb5') {
-                        if ($file =~ m-/-) {
-                            my @items = split/\//,$file;
-                            $filename = pop @items;
-                            $fpath .= join('/',@items);
-                            $fpath .= '/';
-                        } else {
-                            $filename = $file;
-                        }
-                        &Apache::lonnet::userfileupload(undef,'1',$filename,$fpath,$source);                            
-                    } elsif ($cms eq 'angel') {
-                        $file =~ s-\\-/-g;
-                        unless ($file eq 'pg'.$key.'.htm') {
-                            if ($file =~ m-/-) {
-                                my @items = split/\//,$file;
-                                $filename = pop @items;
-                                $fpath = join('/',@items);
-                                $fpath .= '/';
-                            } else {
-                                $filename = $file;
-                            }
-                            &Apache::lonnet::userfileupload(undef,'1',$filename,$fpath,$source);                            
+                    my $fpath = $timenow.'/resfiles/'.$key.'/';
+                    if ($cms eq 'angel') {
+                        if ($file eq 'pg'.$key.'.htm') {
+                            next;
                         }
                     }
+                    $file =~ s-\\-/-g;
+                    $file = $fpath.$file;
+                    my $fileresult = &Apache::lonnet::process_coursefile('copy',$crs,$cdom,$chome,$file,$source);
                 }
             }
         }
@@ -274,6 +330,36 @@
     }
 }
 
+sub process_coursefile {
+    my ($crs,$cdom,$chome,$file,$source)=@_;
+    my $fetchresult = '';
+    my $fpath = '';
+    my $fname = $file;
+    ($fpath,$fname) = ($file =~ m/^(.*)\/([^\/])$/);
+    $fpath=$cdom.'/'.$crs.'/'.$fpath;
+    my $filepath=$Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles';
+    unless ($fpath eq '') {
+        my @parts=split(/\//,$fpath);
+        foreach my $part (@parts) {
+            $filepath.= '/'.$part;
+            if ((-e $filepath)!=1) {
+                mkdir($filepath,0777);
+            }
+        }
+    }
+    if ($source eq '') {
+        $fetchresult eq 'no source file provided';
+    } else {
+        my $destination = $filepath.'/'.$fname;
+        rename($source,$destination);
+        $fetchresult= &Apache::lonnet::reply('fetchuserfile:'.$cdom.'/'.$crs.'/'.$file,$chome);
+        unless ($fetchresult eq 'ok') {
+            &Apache::lonnet::logthis('Failed to transfer '.$cdom.'/'.$crs.'/'.$fname.' to host '.$chome.': '.$fetchresult);
+        }
+    }
+    return $fetchresult;
+}
+
 sub process_resinfo {
     my ($cms,$docroot,$destdir,$items,$resources,$boards,$announcements,$quizzes,$surveys,$groups,$messages,$timestamp,$boardnum,$resinfo,$udom,$uname,$cdom,$crs,$db_handling,$user_handling,$total,$dirname,$seqstem,$resrcfiles) = @_;
     my $board_id = time;
@@ -301,9 +387,11 @@
                 &angel_content($key,$docroot,$destdir,\%{$$resinfo{$key}},$udom,$uname,$$resources{$key}{type},$$items{$$resources{$key}{revitm}}{title},$resrcfiles);
             } elsif ($$resources{$key}{type} eq "QUIZ") {
                 %{$$resinfo{$key}} = ();
+                push @{$quizzes}, $key;
 #               &angel_assessment($key,$docroot,$dirname,$destdir,\%{$$resinfo{$key}},$resrcfiles);
             } elsif ($$resources{$key}{type} eq "FORM") {
                 %{$$resinfo{$key}} = ();
+                push @{$surveys}, $key;
 #                &angel_assessment($key,$docroot,$dirname,$destdir,\%{$$resinfo{$key}},$resrcfiles);
             } elsif ($$resources{$key}{type} eq "DROPBOX") {
                 %{$$resinfo{$key}} = ();
@@ -312,8 +400,8 @@
     } elsif ($cms eq 'bb5') {
         foreach my $key (sort keys %{$resources}) {
             if ($$resources{$key}{type} eq "resource/x-bb-document") {
-                %{$$resinfo{$key}} = ();
                 unless ($$items{$$resources{$key}{revitm}}{filepath} eq 'Top') {
+                    %{$$resinfo{$key}} = ();
                     &process_content($key,$docroot,$destdir,\%{$$resinfo{$key}},$udom,$uname,$resrcfiles);
                 }
             } elsif ($$resources{$key}{type} eq "resource/x-bb-staffinfo") {
@@ -355,32 +443,32 @@
                 unless ($announce_handling eq 'ignore') {
                     push @{$announcements}, $key;
                     %{$$resinfo{$key}} = ();
-                    &process_announce($key,$docroot,$destdir,\%{$$resinfo{$key}},$items,$resinfo,$seqstem,$resrcfiles);
+                    &process_announce($key,$docroot,$destdir,\%{$$resinfo{$key}},$resinfo,$seqstem,$resrcfiles);
                 }
             }
         }
+        if (@{$announcements}) {
+            $$items{'Top'}{'contentscount'} ++;
+        }
+        if (@{$boards}) {
+            $$items{'Top'}{'contentscount'} ++;
+        }
+        if (@{$quizzes}) {
+            $$items{'Top'}{'contentscount'} ++;
+        }
+        if (@{$surveys}) {
+            $$items{'Top'}{'contentscount'} ++;
+        
+        }
     }
-    $$total{'board'} = $board_count;
 
-    if (@{$announcements}) {
-        $$items{'Top'}{'contentscount'} ++;
-    }
-    if (@{$boards}) {
-        $$items{'Top'}{'contentscount'} ++;
-    }
-    if (@{$quizzes}) {
-        $$items{'Top'}{'contentscount'} ++;
-        $$total{'quiz'} = @{$quizzes};
-    }
-    if (@{$surveys}) {
-        $$items{'Top'}{'contentscount'} ++;
-        $$total{'surv'} = @{$surveys};
-    }
+    $$total{'board'} = $board_count;
+    $$total{'quiz'} = @{$quizzes};
+    $$total{'surv'} = @{$surveys};
 }
 
 sub build_structure {
-    my ($cms,$context,$destdir,$resinfo,$items,$resources,$hrefs,$udom,$uname,$newdir,$timenow,$cdom,$crs,$timestamp,$total,$boards,$announcements,$quizzes,$surveys,$boardnum,$pagesfiles,$seqfiles,$topurls,$topnames) = @_;
-
+    my ($cms,$context,$destdir,$items,$resinfo,$resources,$hrefs,$udom,$uname,$newdir,$timenow,$cdom,$crs,$timestamp,$total,$boards,$announcements,$quizzes,$surveys,$boardnum,$pagesfiles,$seqfiles,$topurls,$topnames) = @_;
     my %flag = ();
     my %count = ();
     my %pagecontents = ();
@@ -571,12 +659,12 @@
             my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';
             open(PAGEFILE,">$filename");
             print PAGEFILE qq|<map>
-<resource src="$filestem/resfiles/$$items{$pagecontents{$key}[$i][0]}{resnum}/$$items{$pagecontents{$key}[$i][0]}{resnum}.html" id="1" type="start" title="$$items{$pagecontents{$key}[$i][0]}{title}"></resource>
+<resource src="$filestem/resfiles/$$items{$pagecontents{$key}[$i][0]}{resnum}.html" id="1" type="start" title="$$items{$pagecontents{$key}[$i][0]}{title}"></resource>
 <link to="2" index="1" from="1">\n|;
             if (@{$pagecontents{$key}[$i]} == 1) {
-                print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>|;
+                print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>\n|;
             } elsif (@{$pagecontents{$key}[$i]} == 2)  {
-                print PAGEFILE qq|<resource src="$filestem/resfiles/$$items{$pagecontents{$key}[$i][1]}{resnum}.html" id="2" type="finish" title="$$items{$pagecontents{$key}[$i][1]}{title}"></resource>|;
+                print PAGEFILE qq|<resource src="$filestem/resfiles/$$items{$pagecontents{$key}[$i][1]}{resnum}.html" id="2" type="finish" title="$$items{$pagecontents{$key}[$i][1]}{title}"></resource>\n|;
             } else {
                 for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) {
                     my $curr_id = $j+1;
@@ -586,7 +674,7 @@
 <link to="$next_id" index="$curr_id" from="$curr_id">\n|;
                 }
                 my $final_id = @{$pagecontents{$key}[$i]};
-                print PAGEFILE qq|<resource src="$filestem/resfiles/$$items{$pagecontents{$key}[$i][-1]}{resnum}/$$items{$pagecontents{$key}[$i][-1]}{resnum}.html" id="$final_id" type="finish" title="$$items{$pagecontents{$key}[$i][-1]}{title}"></resource>\n|;
+                print PAGEFILE qq|<resource src="$filestem/resfiles/$$items{$pagecontents{$key}[$i][-1]}{resnum}.html" id="$final_id" type="finish" title="$$items{$pagecontents{$key}[$i][-1]}{title}"></resource>\n|;
             }
             print PAGEFILE "</map>";
             close(PAGEFILE);
@@ -618,8 +706,8 @@
         $$flag{$key}{file} = 1;
     } elsif ($cms eq 'angel' && (($type eq "PAGE") || ($type eq "LINK")) )  {
         if ($$flag{$key}{page}) {
-            if ($$count{key}{page} == -1) {
-                print STDERR "Array index is -1, we shouldnt be here\n";
+            if ($$count{$key}{page} == -1) {
+                print STDERR "Array index is -1, we shouldnt be here, key is $key, type is $type\n";
             } else { 
                 push @{$$pagecontents{$key}[$$count{$key}{page}]},$contitem;
             }
@@ -651,7 +739,7 @@
     my $nextnum = 0;
     my $seqstem = '';
     if ($context eq 'CSTR') {
-        $seqstem = '/res/'.$udom.'/'.$uname.'/'.$newdir;
+        $seqstem = "/res/$udom/$uname/$newdir";
     } elsif ($context eq 'DOCS') {
         $seqstem = '/uploaded/'.$cdom.'/'.$crs.'/'.$timenow;
     }
@@ -1542,7 +1630,7 @@
     foreach my $id (@allids) {
         my $output = qq|<problem>
 |;
-        $$total{problem} ++;
+        $$total{prob} ++;
         if ($$settings{$id}{class} eq "QUESTION_ESSAY") {
             $output .= qq|<startouttext />$$settings{$id}{text}<endouttext />
  <essayresponse>
@@ -1751,7 +1839,7 @@
 
 # ---------------------------------------------------------------- Process Blackboard Announcements
 sub process_announce {
-    my ($res,$docroot,$destdir,$settings,$items,$globalresref,$seqstem,$resrcfiles) = @_;
+    my ($res,$docroot,$destdir,$settings,$globalresref,$seqstem,$resrcfiles) = @_;
     my $xmlfile = $docroot.'/'.$res.".dat";
     my @state = ();
     my @assess = ();
@@ -1812,7 +1900,7 @@
   
     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/$$items{$$settings{startassessment}{$id}{assessment_id}}{revitm}.sequence'>here</a> to enter the folder the contains the problems in this assessment.";
+            $$settings{text} = "A $$settings{startassessment}{$id}{assessment_type}, entitled $$globalresref{$$settings{startassessment}{$id}{assessment_id}}{title} is available. Click <a href='$seqstem/pages/$$settings{startassessment}{$id}{assessment_id}.page' target='quizpage'>here</a> to enter the page that contains the problems in this assessment.";
         }
     }
 
@@ -1825,7 +1913,7 @@
 <body bgcolor='#ffffff'>
 <table>
  <tr>
-  <td bgcolor='#CCCCFF'>$$settings{title} - announcement date: $$settings{date}</td>
+  <td bgcolor='#CCCCFF'>$$settings{title} - announcement date: $$settings{dates}</td>
  </tr>
 </table>
 <br/>

--raeburn1079464858--