--- loncom/interface/londocs.pm	2010/02/02 01:33:02	1.314.2.8
+++ loncom/interface/londocs.pm	2010/02/10 17:41:40	1.325.2.8
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.314.2.8 2010/02/02 01:33:02 raeburn Exp $
+# $Id: londocs.pm,v 1.325.2.8 2010/02/10 17:41:40 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,6 +26,8 @@
 # http://www.lon-capa.org/
 #
 
+
+
 package Apache::londocs;
 
 use strict;
@@ -53,15 +55,10 @@ my %alreadyseen=();
 
 my $hadchanges;
 
-# Available help topics
 
 my %help=();
 
-# Mapread read maps into LONCAPA::map:: global arrays 
-# @order and @resources, determines status
-# sets @order - pointer to resources in right order
-# sets @resources - array with the resources with correct idx
-#
+
 
 sub mapread {
     my ($coursenum,$coursedom,$map)=@_;
@@ -81,20 +78,20 @@ sub storemap {
     return ($errtext,0);
 }
 
-# ----------------------------------------- Return hash with valid author names
+
 
 sub authorhosts {
     my %outhash=();
     my $home=0;
     my $other=0;
-    foreach (keys %env) {
-	if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {
+    foreach my $key (keys(%env)) {
+	if ($key=~/^user\.role\.(au|ca)\.(.+)$/) {
 	    my $role=$1;
 	    my $realm=$2;
-	    my ($start,$end)=split(/\./,$env{$_});
+	    my ($start,$end)=split(/\./,$env{$key});
 	    if (($start) && ($start>time)) { next; }
 	    if (($end) && (time>$end)) { next; }
-	    my $ca; my $cd;
+	    my ($ca,$cd);
 	    if ($1 eq 'au') {
 		$ca=$env{'user.name'};
 		$cd=$env{'user.domain'};
@@ -116,21 +113,21 @@ sub authorhosts {
     }
     return ($home,$other,%outhash);
 }
-# ------------------------------------------------------ Generate "dump" button
+
 
 sub dumpbutton {
     my ($home,$other,%outhash)=&authorhosts();
-    my $type = &Apache::loncommon::course_type();
+    my $crstype = &Apache::loncommon::course_type();
     if ($home+$other==0) { return ''; }
     if ($home) {
 	return '<div>'.
 	    '<input type="submit" name="dumpcourse" value="'.
-	    &mt('Dump '.$type.' DOCS to Construction Space').'" />'.
+	    &mt('Dump '.$crstype.' DOCS to Construction Space').'" />'.
 	    &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs').
 	    '</div>';
     } else {
 	return '<div>'.
-     &mt('Dump '.$type.
+     &mt('Dump '.$crstype.
 	 ' DOCS to Construction Space: available on other servers').
 	 '</div>';
     }
@@ -141,14 +138,15 @@ sub clean {
     $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
     return $title;	
 }
-# -------------------------------------------------------- Actually dump course
+
+
 
 sub dumpcourse {
     my ($r) = @_;
-    my $type = &Apache::loncommon::course_type();
-    $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
-	      '<form name="dumpdoc" method="post">');
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' DOCS to Construction Space'));
+    my $crstype = &Apache::loncommon::course_type();
+    $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' DOCS to Construction Space').
+	      '<form name="dumpdoc" action="" method="post">');
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' DOCS to Construction Space'));
     my ($home,$other,%outhash)=&authorhosts();
     unless ($home) { return ''; }
     my $origcrsid=$env{'request.course.id'};
@@ -161,15 +159,15 @@ sub dumpcourse {
 	my $title=$env{'form.authorfolder'};
 	$title=&clean($title);
 	my %replacehash=();
-	foreach (keys %env) {
-	    if ($_=~/^form\.namefor\_(.+)/) {
-		$replacehash{$1}=$env{$_};
+	foreach my $key (keys(%env)) {
+	    if ($key=~/^form\.namefor\_(.+)/) {
+		$replacehash{$1}=$env{$key};
 	    }
 	}
 	my $crs='/uploaded/'.$env{'request.course.id'}.'/';
 	$crs=~s/\_/\//g;
-	foreach (keys %replacehash) {
-	    my $newfilename=$title.'/'.$replacehash{$_};
+	foreach my $item (keys(%replacehash)) {
+	    my $newfilename=$title.'/'.$replacehash{$item};
 	    $newfilename=~s/\.(\w+)$//;
 	    my $ext=$1;
 	    $newfilename=&clean($newfilename);
@@ -184,16 +182,16 @@ sub dumpcourse {
 		    unless(mkdir($makepath,0777)) { $fail=1; } 
 		}
 	    }
-	    $r->print('<br /><tt>'.$_.'</tt> => <tt>'.$newfilename.'</tt>: ');
+	    $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ');
 	    if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
-		if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
+		if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
 		    print $fh &Apache::lonclonecourse::rewritefile(
-         &Apache::lonclonecourse::readfile($env{'request.course.id'},$_),
+         &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),
 				     (%replacehash,$crs => '')
 								    );
 		} else {
 		    print $fh
-         &Apache::lonclonecourse::readfile($env{'request.course.id'},$_);
+         &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);
 		       }
 		$fh->close();
 	    } else {
@@ -211,8 +209,8 @@ sub dumpcourse {
 	    $r->print(
 		      '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');
 	}
-	foreach (sort keys %outhash) {
-	    if ($_=~/^home_(.+)$/) {
+	foreach my $key (sort(keys(%outhash))) {
+	    if ($key=~/^home_(.+)$/) {
 		if ($home==1) {
 		    $r->print(
 		  '<input type="hidden" name="authorspace" value="'.$1.'" />');
@@ -238,55 +236,67 @@ sub dumpcourse {
                  .'<th>'.&mt('Title').'</th>'
                  .'<th>'.&mt('Save as ...').'</th>'
                  .&Apache::loncommon::end_data_table_header_row());
-	foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
+	foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
 	    $r->print(&Apache::loncommon::start_data_table_row()
-                     .'<td>'.$_.'</td>');
-	    my ($ext)=($_=~/\.(\w+)$/);
+                     .'<td>'.$file.'</td>');
+	    my ($ext)=($file=~/\.(\w+)$/);
 	    my $title=$hash{'title_'.$hash{
-		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
+		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};
 	    $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
 	    if (!$title) {
-		$title=$_;
+		$title=$file;
 	    } else {
 		$title=~s|/|_|g;
 	    }
 	    $title=~s/\.(\w+)$//;
 	    $title=&clean($title);
 	    $title.='.'.$ext;
-	    $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td>"
+	    $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"
                      .&Apache::loncommon::end_data_table_row());
 	}
 	$r->print(&Apache::loncommon::end_data_table());
 	&untiehash();
 	$r->print(
-  '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $type DOCS").'" /></p></form>');
+  '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype DOCS").'" /></p></form>');
     }
 }
 
-# ------------------------------------------------------ Generate "export" button
+
 
 sub exportbutton {
-    my $type = &Apache::loncommon::course_type();
-    return '<div>'.
-            '<input type="submit" name="exportcourse" value="'.
-            &mt('Export '.$type.' to IMS').'" />'.
+    my $crstype = &Apache::loncommon::course_type();
+    return '<div><input type="submit" name="exportcourse"'
+          .' value="'.&mt('IMS Export').'"'
+          .' title="'.&mt('Export '.$crstype.' to IMS Package').'" />'.
     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'</div>';
 }
 
+
+
 sub exportcourse {
     my $r=shift;
-    my $type = &Apache::loncommon::course_type();
+    my $crstype = &Apache::loncommon::course_type();
     my %discussiontime = &Apache::lonnet::dump('discussiontimes',
                                                $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
-    my $numdisc = keys %discussiontime;
+    my $numdisc = keys(%discussiontime);
     my $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {
-        $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package').
-                  '<h2>IMS Export Failed</h2>'.
-                  '<div class="LC_error">'.
-                  &mt('Unable to retrieve information about course contents').
-                  '</div><a href="/adm/coursedocs">'.&mt('Return to Course Editor').'</a>');
-        &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($type).':'.$env{'request.course.id'});
+        $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package').
+                  '<h2>'.&mt('IMS Export Failed').'</h2>'.
+                  '<div class="LC_error">');
+        if ($crstype eq 'Community') {
+            $r->print(&mt('Unable to retrieve information about community contents'));
+        } else {
+            $r->print(&mt('Unable to retrieve information about course contents'));
+        }
+        $r->print('</div><a href="/adm/coursedocs">');
+        if ($crstype eq 'Community') {
+            $r->print(&mt('Return to Community Editor'));
+        } else {
+            $r->print(&mt('Return to Course Editor'));
+        }
+        $r->print('</a>');
+        &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});
         return;
     }
     my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
@@ -302,7 +312,17 @@ sub exportcourse {
         my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
         my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
         if (@exportitems == 0 && @discussions == 0) {
-            $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
+            $outcome = 
+                '<p class="LC_warning">'
+               .&mt('As you did not select any content items or discussions'
+                   .' for export, an IMS package has not been created.')
+               .'</p>'
+               .'<p>'
+               .&mt('Please [_1]go back[_2] to select either content items'
+                   .' or discussions for export.'
+                       ,'<a href="javascript:history.go(-1)">'
+                       ,'</a>')
+               .'</p>';
         } else {
             my $now = time;
             my %symbs;
@@ -325,35 +345,53 @@ sub exportcourse {
                 open(OUTPUT, "zip -r $imszip *  2> /dev/null |");
                 close(OUTPUT);
                 chdir $cwd;
-                $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,);
+                $outcome .= '<p>'
+                           .&mt('[_1]Your IMS package[_2] is ready for download.'
+                               ,'<a href="'.$imszipfile.'">','</a>')
+                           .'</p>';
                 if ($copyresult) {
-                    $outcome .= &mt('The following errors occurred during export - [_1]',$copyresult);
+                    $outcome .= '<p class="LC_error">'
+                               .&mt('The following errors occurred during export - [_1]'
+                                   ,$copyresult)
+                               .'</p>';
                 }
             } else {
-                $outcome = '<br />'.&mt('Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.').'<br />';
+                $outcome = '<p class="LC_error">'
+                          .&mt('Unfortunately you will not be able to retrieve'
+                              .' an IMS archive of this posts at this time,'
+                              .' because there was a problem creating a'
+                              .' manifest file.')
+                          .'</p>'
+                          .'<p><a href="javascript:history.go(-1)">'
+                          .&mt('Go Back')
+                          .'</a></p>';
             }
         }
-        $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
-	$r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
+        $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package'));
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export'));
         $r->print($outcome);
         $r->print(&Apache::loncommon::end_page());
     } else {
-        my $display;
-        $display = '<form name="exportdoc" method="post">'."\n";
-        $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />');
-        $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
-                    '<tr><td><fieldset><legend>&nbsp;<b>Content items</b></legend>'.
-                    '<input type="button" value="check all" '.
+        my $display='<form name="exportdoc" action="" method="post">'."\n".
+                    '<p>'.
+                    &mt('Choose which items you wish to export from your '.$crstype.'.').
+                    '</p>'.
+                    '<div class="LC_columnSection"><fieldset>'.
+                    '<legend>'.&mt('Content items').'</legend>'.
+                    '<input type="button" value="'.&mt('check all').'" '.
                     'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
-                    '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
-                    ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
-                    '<td>&nbsp;</td><td>&nbsp;</td>'.
-                    '<td align="right"><fieldset><legend>&nbsp;<b>Discussion posts'.
-                    '</b></legend><input type="button" value="check all"'.
-                    ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
-                    '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
-                    ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
-                    '</tr></table>';
+                    '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
+                    ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset>';
+        if ($numdisc > 0) {
+            $display .= '<fieldset>'.
+                        '<legend>'.&mt('Discussion posts').'</legend>'.
+                        '<input type="button" value="'.&mt('check all').'"'.
+                        ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
+                        '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
+                        ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" />'.
+                        '</fieldset>';
+        }
+        $display .= '</div>';
         my $curRes;
         my $depth = 0;
         my $count = 0;
@@ -362,13 +400,13 @@ sub exportcourse {
         my %parent = ();
         my %children = ();
         my $lastcontainer = $startcount;
-        my @bgcolors = ('#F6F6F6','#FFFFFF');
-        $display .= '<table cellspacing="0"><tr>'.
-            '<td><b>Export content item?<br /></b></td><td>&nbsp;</td><td align="right">'."\n";
+        $display .= &Apache::loncommon::start_data_table()
+                   .&Apache::loncommon::start_data_table_header_row()
+                   .'<th>'.&mt('Export content item?').'</th>';
         if ($numdisc > 0) {
-            $display.='<b>Export&nbsp;discussion posts?</b>'."\n";
+            $display .= '<th>'.&mt('Export discussion posts?').'</th>';
         }
-        $display.='&nbsp;</td></tr>';
+        $display .= &Apache::loncommon::end_data_table_header_row();
         while ($curRes = $it->next()) {
             if (ref($curRes)) {
                 $count ++;
@@ -389,38 +427,43 @@ sub exportcourse {
                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                     }
                 }
-                my $color = $count%2;
-                $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
-                    '<input type="checkbox" name="archive" value="'.$count.'" ';
+                my $currelem = $count+$boards+$startcount;
+                $display .= &Apache::loncommon::start_data_table_row()
+                           .'<td>'."\n"
+                           .'<input type="checkbox" name="archive" value="'.$count.'" ';
                 if (($curRes->is_sequence()) || ($curRes->is_page())) {
-                    my $checkitem = $count + $boards + $startcount;
-                    $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
+                    $lastcontainer = $currelem;
+                    $display .= 'onclick="javascript:propagateCheck('."'$currelem'".')"';
                 }
                 $display .= ' />'."\n";
                 for (my $i=0; $i<$depth; $i++) {
-                    $display .= '<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" /><img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" />'."\n";
+                    $display .= ('<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" />' x2)."\n";
                 }
                 if ($curRes->is_sequence()) {
-                    $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";
-                    $lastcontainer = $count + $startcount + $boards;
+                    $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />&nbsp;'."\n";
                 } elsif ($curRes->is_page()) {
-                    $display .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";
-                    $lastcontainer = $count + $startcount + $boards;
+                    $display .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />&nbsp;'."\n";
                 }
-                my $currelem = $count+$boards+$startcount;
                 $children{$parent{$depth}} .= $currelem.':';
-                $display .= '&nbsp;'.$curRes->title().'</td>';
+                $display .= '&nbsp;'.$curRes->title().'</td>'."\n";
+
+                # Existing discussion posts?
+
                 if ($discussiontime{$ressymb} > 0) {
                     $boards ++;
-                    $currelem = $count+$boards+$startcount;
-                    $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";
+                    $display .= '<td align="right">'
+                               .'<input type="checkbox" name="discussion" value="'.$count.'" />'
+                               .'</td>'."\n";
                 } else {
-                    $display .= '<td colspan="2">&nbsp;</td>'."\n";
+                    $display .= '<td>&nbsp;</td>'."\n";
                 }
+                $display .= &Apache::loncommon::end_data_table_row();
             }
         }
+        $display .= &Apache::loncommon::end_data_table();
         my $scripttag = qq|
-<script>
+<script type="text/javascript">
+// <![CDATA[
 
 function checkAll(field) {
     if (field.length > 0) {
@@ -457,8 +500,8 @@ function containerCheck(item) {
     }
         |;
 
-        foreach my $container (sort { $a <=> $b } keys %children) {
-            my @contents = split/:/,$children{$container};
+        foreach my $container (sort { $a <=> $b } (keys(%children))) {
+            my @contents = split(/:/,$children{$container});
             for (my $i=0; $i<@contents; $i ++) {
                 $scripttag .= '    parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
             }
@@ -472,15 +515,16 @@ function containerCheck(item) {
      }   
 }
 
+// ]]>
 </script>
         |;
-	$r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
-						 $scripttag));
-	$r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
-	$r->print($display.'</table>'.
-                  '<p><input type="hidden" name="finishexport" value="1">'.
+        $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package',
+ 						 $scripttag));
+	$r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($crstype).' to IMS content package'));
+	$r->print($display.
+                  '<p><input type="hidden" name="finishexport" value="1" />'.
                   '<input type="submit" name="exportcourse" value="'.
-                  &mt('Export '.$type.' DOCS').'" /></p></form>');
+                  &mt('Export').'" /></p></form>');
     }
 }
 
@@ -507,7 +551,7 @@ sub create_ims_store {
     my $manifestfilename = $$tempexport.$manifest;
     if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
         $$manifestok=1;
-        print $ims_manifest
+        print $ims_manifest 
 '<?xml version="1.0" encoding="UTF-8"?>'."\n".
 '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
 ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
@@ -565,7 +609,7 @@ sub build_package {
             if ($curRes->is_sequence() || $curRes->is_page()) {
                 $lastcontainer = $count;
             }
-            if (grep/^$count$/,@$exportitems) {
+            if (grep(/^$count$/,@$exportitems)) {
                 &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
             }
         }
@@ -589,7 +633,7 @@ sub build_package {
 
         if (ref($curRes)) {
             $count ++;
-            if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
+            if ((grep(/^$count$/,@$exportitems)) || (grep(/^$count$/,@dependencies))) {
                 my $symb = $curRes->symb();
                 my $isvisible = 'true';
                 my $resourceref;
@@ -623,11 +667,11 @@ sub build_package {
                      '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
                      '" type="webcontent" href="'.$content_file.'">'."\n".
                      '       <file href="'.$content_file.'" />'."\n";
-                        foreach (@hrefs) {
+                        foreach my $item (@hrefs) {
                             $imsresources .=
-                     '        <file href="'.$_.'" />'."\n";
+                     '        <file href="'.$item.'" />'."\n";
                         }
-                        if (grep/^$count$/,@$discussions) {
+                        if (grep(/^$count$/,@$discussions)) {
                             my $ressymb = $symb;
                             my $mode;
                             if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
@@ -668,8 +712,8 @@ sub build_package {
 sub get_dependencies {
     my ($exportitems,$parent,$depth,$dependencies) = @_;
     if ($depth > 1) {
-        if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
-            push @$dependencies, $$parent{$depth};
+        if ((!grep(/^$$parent{$depth}$/,@$exportitems)) && (!grep(/^$$parent{$depth}$/,@$dependencies))) {
+            push(@{$dependencies},$$parent{$depth});
             if ($depth > 2) {
                 &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
             }
@@ -875,7 +919,7 @@ sub extract_media {
             my $copiedfile;
             if ($copiedfile = Apache::File->new('>'.$destination)) {
                 print $copiedfile $embed_content;
-                push @{$href}, 'resources/'.$count.'/res/'.$filename;
+                push(@{$href},'resources/'.$count.'/res/'.$filename);
                 my $attrib_regexp = '';
                 if (@{$allfiles{$embed_file}} > 1) {
                     $attrib_regexp = join('|',@{$allfiles{$embed_file}});
@@ -919,8 +963,7 @@ sub store_template {
     }
 }
 
-# Imports the given (name, url) resources into the course
-# coursenum, coursedom, and folder must precede the list
+
 sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
 
@@ -966,7 +1009,7 @@ sub group_import {
 }
 
 sub breadcrumbs {
-    my ($where,$allowed,$type)=@_;
+    my ($allowed,$crstype)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     my (@folders);
     if ($env{'form.pagepath'}) {
@@ -1001,9 +1044,9 @@ sub breadcrumbs {
 	    if ($4 ne '') { $is_random_order = 1; }
             if ($folder eq 'supplemental') {
                 if ($allowed) {
-                    $name = &mt('Supplemental '.$type.' Documents');
+                    $name = &mt('Supplemental '.$crstype.' Documents');
                 } else {
-                    $name = &mt($type.' Documents');
+                    $name = &mt($crstype.' Documents');
                 }
             }
 	    &Apache::lonhtmlcommon::add_breadcrumb(
@@ -1055,7 +1098,7 @@ sub log_docs {
                        'currentfolder' => $env{'form.folder'});
         if ($parmidx) {
            $storehash{'parameter_res'}=$oldresources[$parmidx];
-           foreach my $parm (keys %parmaction) {
+           foreach my $parm (keys(%parmaction)) {
               $storehash{'parameter_action_'.$parm}=$parmaction{$parm};
               $storehash{'parameter_value_'.$parm}=$parmvalue{$parm};
            }
@@ -1082,9 +1125,9 @@ sub log_docs {
 }
 
 
-#
-# Docs Change Log
-#
+
+
+
 sub docs_change_log {
     my ($r)=@_;
     my $folder=$env{'form.folder'};
@@ -1279,7 +1322,9 @@ ENDPASTE
 sub do_paste_from_buffer {
     my ($coursenum,$coursedom,$folder) = @_;
 
-    return 0 if (!$env{'form.pastemarked'});
+    if (!$env{'form.pastemarked'}) {
+        return;
+    }
 
 # paste resource to end of list
     my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
@@ -1287,7 +1332,7 @@ sub do_paste_from_buffer {
 # Maps need to be copied first
     if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) {
 	$title=&mt('Copy of').' '.$title;
-        my $newid=$$.int(rand(100)).time;
+	my $newid=$$.int(rand(100)).time;
 	my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
         if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) {
             my $path = $1;
@@ -1316,8 +1361,16 @@ sub do_paste_from_buffer {
         }
 	my $storefn=$newurl;
 	$storefn=~s{^/\w+/$match_domain/$match_username/}{};
-	&Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
-					   &Apache::lonnet::getfile($url));
+	my $paste_map_result =
+            &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
+					       &Apache::lonnet::getfile($url));
+        if ($paste_map_result eq '/adm/notfound.html') {
+            if ($url=~/\.page$/) {
+                return &mt('Paste failed: an error occurred saving the composite page');
+            } else {
+                return &mt('Paste failed: an error occurred saving the folder');
+            }
+        }
 	$url = $newurl;
     }
 # published maps can only exists once, so remove it from paste buffer when done
@@ -1359,6 +1412,7 @@ sub do_paste_from_buffer {
 
     $LONCAPA::map::resources[$newidx]= 	$title.':'.$url.':'.$ext.':normal:res';
     push(@LONCAPA::map::order, $newidx);
+    return 'ok';
 # Store the result
 }
 
@@ -1449,7 +1503,7 @@ sub handle_edit_cmd {
 }
 
 sub editor {
-    my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_;
+    my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype)=@_;
 
     my $container= ($env{'form.pagepath'}) ? 'page'
 		                           : 'sequence';
@@ -1466,7 +1520,7 @@ sub editor {
     }
     
     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=
-	&breadcrumbs($folder,$allowed,$type);
+	&breadcrumbs($allowed,$crstype);
     $r->print($breadcrumbtrail);
     
 # ------------------------------------------------------------ Process commands
@@ -1491,9 +1545,14 @@ sub editor {
 	}
 	    
 	if ($env{'form.pastemarked'}) {
-	    &do_paste_from_buffer($coursenum,$coursedom,$folder);
-	    ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
-	    return $errtext if ($fatal);
+            my $paste_res = 
+                &do_paste_from_buffer($coursenum,$coursedom,$folder);
+            if ($paste_res eq 'ok') {
+                ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
+                return $errtext if ($fatal);
+            } elsif ($paste_res ne '') {
+                $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');
+            }
 	}
 
 	$r->print($upload_output);
@@ -1505,10 +1564,10 @@ sub editor {
 # Group import/search
 	if ($env{'form.importdetail'}) {
 	    my @imports;
-	    foreach (split(/\&/,$env{'form.importdetail'})) {
-		if (defined($_)) {
+	    foreach my $item (split(/\&/,$env{'form.importdetail'})) {
+		if (defined($item)) {
 		    my ($name,$url,$residx)=
-			map {&unescape($_)} split(/\=/,$_);
+			map {&unescape($_)} split(/\=/,$item);
 		    push(@imports, [$name, $url, $residx]);
 		}
 	    }
@@ -1560,7 +1619,7 @@ sub editor {
 	unless ($name) {  $name=(split(/\//,$url))[-1]; }
 	unless ($name) { $idx++; next; }
 	$r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,
-			     $coursenum));
+			     $coursenum,$crstype));
 	$idx++;
 	$shown++;
     }
@@ -1638,7 +1697,7 @@ sub process_file_upload {
             return 'failed';
         } else {
             if ($parseaction eq 'parse') {
-                my $total_embedded = keys(%{$allfiles});
+                my $total_embedded = scalar(keys(%{$allfiles}));
                 if ($total_embedded > 0) {
                     my $num = 0;
 		    my $state = '
@@ -1712,7 +1771,7 @@ sub parse_supplemental_title {
 # --------------------------------------------------------------- An entry line
 
 sub entryline {
-    my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
+    my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_;
 
     my ($foldertitle,$pagetitle,$renametitle);
     if (&is_supplemental_title($title)) {
@@ -1786,8 +1845,8 @@ sub entryline {
 		# no copy for published maps
 		$nocopy = 1;
 	    } else {
-		foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
-		    my ($title,$url,$ext,$type)=split(/\:/,$_);
+		foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
+		    my ($title,$url,$ext,$type)=split(/\:/,$item);
 		    if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
 			$nocopy=1;
 			last;
@@ -1952,7 +2011,7 @@ END
     	my $ro_set=
 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
 	$rand_order_text ='
-<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onClick="this.form.changeparms.value=\'randomorder\';this.form.submit()" '.$ro_set.' /> '.&mt('Random Order').' </label></span>';
+<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onclick="this.form.changeparms.value=\'randomorder\';this.form.submit()" '.$ro_set.' /> '.&mt('Random Order').' </label></span>';   
     }
     if ($ispage) {
         my $pagename=&escape($pagetitle);
@@ -1978,12 +2037,18 @@ END
     } else {
 	undef($external);
     }
+    my $reinit;
+    if ($crstype eq 'Community') {
+        $reinit = &mt('(re-initialize community to access)');
+    } else {
+        $reinit = &mt('(re-initialize course to access)');
+    }  
     $line.='
   <td class="LC_docs_entry_icon">
     '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'
   </td>
   <td class="LC_docs_entry_title">
-    '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.&mt('(re-initialize course to access)').'</span>').$external."
+    '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.$reinit.'</span>').$external."
   </td>";
     if (($allowed) && ($folder!~/^supplemental/)) {
  	my %lt=&Apache::lonlocal::texthash(
@@ -1996,12 +2061,12 @@ END
 	$line.=(<<ENDPARMS);
   <td class="LC_docs_entry_parameter">
     $form_start
-    <label><input type="checkbox" name="hiddenresource_$orderidx" onClick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
+    <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
     $form_end
   </td>
   <td class="LC_docs_entry_parameter">
     $form_start
-    <label><input type="checkbox" name="encrypturl_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>
+    <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>
     $form_end
   </td>
   <td class="LC_docs_entry_parameter">$form_start $rand_order_text $form_end</td>
@@ -2012,7 +2077,13 @@ ENDPARMS
     return $line;
 }
 
-# ---------------------------------------------------------------- tie the hash
+=pod
+
+=item tiehash()
+
+tie the hash
+
+=cut
 
 sub tiehash {
     my ($mode)=@_;
@@ -2038,7 +2109,8 @@ sub untiehash {
     return OK;
 }
 
-# --------------------------------------------------------------- check on this
+
+
 
 sub checkonthis {
     my ($r,$url,$level,$title)=@_;
@@ -2077,7 +2149,7 @@ sub checkonthis {
                  if (($errorcount) ||
                      ($warningcount)) {
 		     if ($errorcount) {
-                        $r->print('<img src="/adm/lonMisc/bomb.gif" /><span class="LC_error">'.
+                        $r->print('<img src="/adm/lonMisc/bomb.gif" alt="'.&mt('bomb').'" /><span class="LC_error">'.
                           &mt('[quant,_1,error]',$errorcount).'</span>');
                      }
 		     if ($warningcount) {
@@ -2091,9 +2163,9 @@ sub checkonthis {
              }
 	     my $dependencies=
                 &Apache::lonnet::metadata($url,'dependencies');
-             foreach (split(/\,/,$dependencies)) {
-		 if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
-                    &checkonthis($r,$_,$level+1);
+             foreach my $dep (split(/\,/,$dependencies)) {
+		 if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) {
+                    &checkonthis($r,$dep,$level+1);
                  }
              }
           } elsif ($result eq 'unavailable') {
@@ -2102,7 +2174,7 @@ sub checkonthis {
 	      unless ($url=~/\$/) {
 		  $r->print('<span class="LC_error">'.&mt('not found').'</b></span>');
 	      } else {
-		  $r->print('<span class="LC_unknown">'.&mt('unable to verify variable URL').'</span>');
+		  $r->print('<span class="LC_error">'.&mt('unable to verify variable URL').'</span>');
 	      }
           } else {
              $r->print('<span class="LC_error">'.&mt('access denied').'</span>');
@@ -2112,13 +2184,19 @@ sub checkonthis {
 }
 
 
-#
-# ----------------------------------------------------------------- List Symbs
-# 
+
+=pod
+
+=item list_symbs()
+
+List Symbs
+
+=cut
+
 sub list_symbs {
     my ($r) = @_;
 
-    my $type = &Apache::loncommon::course_type();
+    my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Symb List'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
     my $navmap = Apache::lonnavmaps::navmap->new();
@@ -2127,7 +2205,7 @@ sub list_symbs {
                   '<div class="LC_error">'.
                   &mt('Unable to retrieve information about course contents').
                   '</div>');
-        &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($type).':'.$env{'request.course.id'});
+        &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});
     } else {
         $r->print("<pre>\n");
         foreach my $res ($navmap->retrieveResources()) {
@@ -2139,31 +2217,28 @@ sub list_symbs {
 }
 
 
-#
-# -------------------------------------------------------------- Verify Content
-# 
 sub verifycontent {
     my ($r) = @_;
-    my $type = &Apache::loncommon::course_type();
+    my $crstype = &Apache::loncommon::course_type();
    my $loaderror=&Apache::lonnet::overloaderror($r);
    if ($loaderror) { return $loaderror; }
-   $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
-   $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
+   $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));
+   $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));
    $hashtied=0;
    undef %alreadyseen;
    %alreadyseen=();
    &tiehash();
-   foreach (keys %hash) {
-       if ($hash{$_}=~/\.(page|sequence)$/) {
-	   if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
+   foreach my $key (keys(%hash)) {
+       if ($hash{$key}=~/\.(page|sequence)$/) {
+	   if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {
 	       $r->print('<hr /><span class="LC_error">'.
-			 &mt('The following sequence or page is included more than once in your '.$type.': ').
-			 &unescape($hash{$_}).'</span><br />'.
+                         &mt('The following sequence or page is included more than once in your '.$crstype.': ').
+			 &unescape($hash{$key}).'</span><br />'.
 			 &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
 	   }
        }
-       if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
-           &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
+       if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {
+           &checkonthis($r,$hash{$key},0,$hash{'title_'.$1});
        }
    }
    &untiehash();
@@ -2172,8 +2247,6 @@ sub verifycontent {
 }
 
 
-# -------------------------------------------------------------- Check Versions
-
 sub devalidateversioncache {
     my $src=shift;
     &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
@@ -2182,9 +2255,9 @@ sub devalidateversioncache {
 
 sub checkversions {
     my ($r) = @_;
-    my $type = &Apache::loncommon::course_type();
-    $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
+    my $crstype = &Apache::loncommon::course_type();
+    $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));
     my $header='';
     my $startsel='';
     my $monthsel='';
@@ -2203,16 +2276,16 @@ sub checkversions {
     my %newsetversions=();
     if ($env{'form.setmostrecent'}) {
 	$haschanged=1;
-	foreach (keys %hash) {
-	    if ($_=~/^ids\_(\/res\/.+)$/) {
+	foreach my $key (keys(%hash)) {
+	    if ($key=~/^ids\_(\/res\/.+)$/) {
 		$newsetversions{$1}='mostrecent';
                 &devalidateversioncache($1);
 	    }
 	}
     } elsif ($env{'form.setcurrent'}) {
 	$haschanged=1;
-	foreach (keys %hash) {
-	    if ($_=~/^ids\_(\/res\/.+)$/) {
+	foreach my $key (keys(%hash)) {
+	    if ($key=~/^ids\_(\/res\/.+)$/) {
 		my $getvers=&Apache::lonnet::getversion($1);
 		if ($getvers>0) {
 		    $newsetversions{$1}=$getvers;
@@ -2222,11 +2295,11 @@ sub checkversions {
 	}
     } elsif ($env{'form.setversions'}) {
 	$haschanged=1;
-	foreach (keys %env) {
-	    if ($_=~/^form\.set_version_(.+)$/) {
+	foreach my $key (keys(%env)) {
+	    if ($key=~/^form\.set_version_(.+)$/) {
 		my $src=$1;
-		if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
-		    $newsetversions{$src}=$env{$_};
+		if (($env{$key}) && ($env{$key} ne $setversions{$src})) {
+		    $newsetversions{$src}=$env{$key};
 		    &devalidateversioncache($src);
 		}
 	    }
@@ -2245,10 +2318,10 @@ sub checkversions {
     &changewarning($r,'');
     if ($env{'form.timerange'} eq 'all') {
 # show all documents
-	$header=&mt('All Documents in '.$type);
+        $header=&mt('All Documents in '.$crstype);
 	$allsel=1;
-	foreach (keys %hash) {
-	    if ($_=~/^ids\_(\/res\/.+)$/) {
+	foreach my $key (keys(%hash)) {
+	    if ($key=~/^ids\_(\/res\/.+)$/) {
 		my $src=$1;
 		$changes{$src}=1;
 	    }
@@ -2258,7 +2331,7 @@ sub checkversions {
 	%changes=&Apache::lonnet::dump
 	 ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                      $env{'course.'.$env{'request.course.id'}.'.num'});
-	my $firstkey=(keys %changes)[0];
+	my $firstkey=(keys(%changes))[0];
 	unless ($firstkey=~/^error\:/) {
 	    unless ($env{'form.timerange'}) {
 		$env{'form.timerange'}=604800;
@@ -2290,7 +2363,7 @@ sub checkversions {
 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
 			  $env{'course.'.$env{'request.course.id'}.'.num'});
     my %lt=&Apache::lonlocal::texthash
-	      ('st' => 'Version changes since start of '.$type,
+              ('st' => 'Version changes since start of '.$crstype,
 	       'lm' => 'Version changes since last Month',
 	       'lw' => 'Version changes since last Week',
 	       'sy' => 'Version changes since Yesterday',
@@ -2299,9 +2372,9 @@ sub checkversions {
 	       'fi' => 'File',
 	       'md' => 'Modification Date',
                'mr' => 'Most recently published Version',
-	       've' => 'Version used in '.$type,
-               'vu' => 'Set Version to be used in '.$type,
-'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
+	       've' => 'Version used in '.$crstype,
+               'vu' => 'Set Version to be used in '.$crstype,
+'sv' => 'Set Versions to be used in '.$crstype.' according to Selections below',
 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
 	       'di' => 'Differences');
@@ -2322,14 +2395,14 @@ sub checkversions {
 <input type="submit" name="setversions" value="$lt{'sv'}" />
 <table border="0">
 ENDHEADERS
-    foreach (sort keys %changes) {
-	if ($changes{$_}>$starttime) {
-	    my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
-	    my $currentversion=&Apache::lonnet::getversion($_);
+    foreach my $key (sort(keys(%changes))) {
+	if ($changes{$key}>$starttime) {
+	    my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
+	    my $currentversion=&Apache::lonnet::getversion($key);
 	    if ($currentversion<0) {
 		$currentversion=&mt('Could not be determined.');
 	    }
-	    my $linkurl=&Apache::lonnet::clutter($_);
+	    my $linkurl=&Apache::lonnet::clutter($key);
 	    $r->print(
 		      '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
 		      &Apache::lonnet::gettitle($linkurl).
@@ -2348,7 +2421,7 @@ ENDHEADERS
                       '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.
                       '<font size="+1">'.$currentversion.'</font>'.
                       '</span></td>'.
-                      '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$type.': '.
+                      '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$crstype.': '.
                       '<font size="+1">');
 # Used in course
 	    my $usedversion=$hash{'version_'.$linkurl};
@@ -2365,7 +2438,7 @@ ENDHEADERS
 						      ('select_form_order' =>
 						       ['',1..$currentversion,'mostrecent'],
 						       '' => '',
-						       'mostrecent' => 'most recent',
+						       'mostrecent' => &mt('most recent'),
 						       map {$_,$_} (1..$currentversion))));
 	    $r->print('</span></td></tr><tr><td></td>');
 	    my $lastold=1;
@@ -2466,23 +2539,27 @@ sub changewarning {
 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
     }
     $r->print("\n\n".
-'<script type="text/javascript">function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
+'<script type="text/javascript">'."\n".
+'// <![CDATA['."\n".
+'function reinit(tf) { tf.submit();'.$postexec.' }'."\n".
+'// ]]>'."\n".
+'</script>'."\n".
 '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
 '<input type="hidden" name="orgurl" value="'.$url.
-'" /><input type="hidden" name="selectrole" value="1" /><h3><span class="LC_warning">'.
+'" /><input type="hidden" name="selectrole" value="1" /><p class="LC_warning">'.
 &mt($message,' <input type="hidden" name="'.
     $env{'request.role'}.'" value="1" /><input type="button" value="'.
-    &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
-$help{'Caching'}.'</span></h3></form>'."\n\n");
+    &mt('re-initializing '.$course_type).'" onclick="reinit(this.form)" />').
+$help{'Caching'}.'</p></form>'."\n\n");
+
 }
 
-# =========================================== Breadcrumbs for special functions
 
 sub init_breadcrumbs {
     my ($form,$text)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
-					    text=>"Edit ".&Apache::loncommon::course_type(),
+					    text=>&Apache::loncommon::course_type().' Editor',
 					    faq=>273,
 					    bug=>'Instructor Interface',
                                             help => 'Docs_Adding_Course_Doc'});
@@ -2492,22 +2569,24 @@ sub init_breadcrumbs {
 					    bug=>'Instructor Interface'});
 }
 
-# ================================================================ Main Handler
+
+
+
 sub handler {
     my $r = shift;
     &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
     return OK if $r->header_only;
-    my $type = &Apache::loncommon::course_type();
+    my $crstype = &Apache::loncommon::course_type();
 
 # --------------------------------------------- Initialize help topics for this
-    foreach ('Adding_Course_Doc','Main_Course_Documents',
-	     'Adding_External_Resource','Navigate_Content',
-	     'Adding_Folders','Docs_Overview', 'Load_Map',
-	     'Supplemental','Score_Upload_Form','Adding_Pages',
-	     'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
-	     'Check_Resource_Versions','Verify_Content') {
-	$help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
+    foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
+	               'Adding_External_Resource','Navigate_Content',
+	               'Adding_Folders','Docs_Overview', 'Load_Map',
+	               'Supplemental','Score_Upload_Form','Adding_Pages',
+	               'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
+	               'Check_Resource_Versions','Verify_Content') {
+	$help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }
     # Composite help files
     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
@@ -2541,7 +2620,7 @@ sub handler {
       &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space');
       &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {
-      &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
+      &init_breadcrumbs('exportcourse','IMS Export');
       &exportcourse($r);
   } else {
 # is this a standard course?
@@ -2570,7 +2649,7 @@ sub handler {
     }
     if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
         $env{'form.folderpath'} = 'supplemental&'.
-                                  &escape(&mt('Supplemental '.$type.' Documents')).'&'.
+                                  &escape(&mt('Supplemental '.$crstype.' Documents')).'&'.
                                   $env{'form.folderpath'};
     }
     &Apache::loncommon::store_course_settings('docs_folderpath',
@@ -2625,9 +2704,15 @@ sub handler {
 	$script .= &editing_js($udom,$uname);
     }
 # -------------------------------------------------------------------- Body tag
-    $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
-    $r->print(&Apache::loncommon::start_page("$type Documents", $script,
-					     {'force_register' => $showdoc,}).
+    $script = '<script type="text/javascript">'."\n"
+              .'// <![CDATA['."\n"
+              .$script."\n"
+              .'// ]]>'."\n"
+              .'</script>'."\n";
+    my $brcrum = [{href=>"/adm/createuser",text=>"$crstype Documents"}];
+    $r->print(&Apache::loncommon::start_page("$crstype Documents", $script,
+				    {'force_register' => $showdoc,
+                                     'bread_crumbs' => $brcrum}).
 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
   
   my %allfiles = ();
@@ -2666,12 +2751,12 @@ sub handler {
                   }
                   my @attributes = ();
                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
-                      @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
+                      @attributes = split(/:/,$env{'form.embedded_attrib_'.$i});
                   } else {
                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   }
-                  foreach (@attributes) {
-                      push(@{$attribs{$i}},&unescape($_));
+                  foreach my $attr (@attributes) {
+                      push(@{$attribs{$i}},&unescape($attr));
                   }
                   if ($javacodebase) {
                       $codebase{$i} = $javacodebase;
@@ -2689,7 +2774,7 @@ sub handler {
               my $updateflag = 0;
               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
               if ($getstatus eq 'ok') {
-                  foreach my $item (keys %newname) {
+                  foreach my $item (keys(%newname)) {
                       if ($newname{$item} ne $origname{$item}) {
                           my $attrib_regexp = '';
                           if (@{$attribs{$item}} > 1) {
@@ -2720,8 +2805,8 @@ sub handler {
   unless ($showdoc ||  $upload_result eq 'phasetwo') {
 # -----------------------------------------------------------------------------
        my %lt=&Apache::lonlocal::texthash(
-                'uplm' => 'Upload a new main '.lc($type).' document',
-                'upls' => 'Upload a new supplemental '.lc($type).' document',
+                'uplm' => 'Upload a new main '.lc($crstype).' document',
+                'upls' => 'Upload a new supplemental '.lc($crstype).' document',
                 'impp' => 'Import a document',
                 'pubd' => 'Published documents',
 		'copm' => 'All documents out of a published map into this folder',
@@ -2738,22 +2823,33 @@ sub handler {
                 'extr' => 'External Resource',
                 'syll' => 'Syllabus',
                 'navc' => 'Navigate Contents',
-                'sipa' => 'Simple Page',
+                'sipa' => 'Simple Course Page',
                 'sipr' => 'Simple Problem',
                 'drbx' => 'Drop Box',
                 'scuf' => 'Score Upload Form',
-                'bull' => 'Bulletin Board',
-                'mypi' => 'My Personal Info',
-                'grpo' => 'Group Files',
+                'bull' => 'Discussion Board',
+                'mypi' => 'My Personal Information Page',
+                'grpo' => 'Group Portfolios',
                 'rost' => 'Course Roster',
 		'abou' => 'About User',
-                'imsf' => 'Import IMS package',
+                'imsf' => 'IMS Import',
+                'imsl' => 'Import IMS package',
                 'file' =>  'File',
                 'title' => 'Title',
                 'comment' => 'Comment',
                 'parse' => 'If HTML file, upload embedded images/multimedia files'
 					  );
 # -----------------------------------------------------------------------------
+    my %tabtitles = (
+                       main => {
+                                 Course => &mt('Main Course Documents'),
+                                 Community => &mt('Main Community Documents'),
+                               },
+                       supplemental => {
+                                 Course => &mt('Supplemental Course Documents'),        
+                                 Community => &mt('Supplemental Community Documents'),
+                               },
+                    );
     if ($allowed) {
 	&update_paste_buffer($coursenum,$coursedom);
        my $dumpbut=&dumpbutton();
@@ -2769,8 +2865,7 @@ sub handler {
        if (!$folderpath) {
 	   if ($env{'form.folder'} eq '' ||
 	       $env{'form.folder'} eq 'supplemental') {
-	       $folderpath='default&'.
-		   &escape(&mt('Main '.$type.' Documents'));
+	       $folderpath='default&'.&escape($tabtitles{'main'}{$crstype});
 	   }
        }
        unless ($env{'form.pagepath'}) {
@@ -2813,7 +2908,7 @@ sub handler {
 <div style="clear: both; height: 0px;">&nbsp;</div>
 ENDCOURSEVERIFY
        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
-		     &mt('Editing the Table of Contents for your '.$type)));
+		     &mt('Editing the Table of Contents for your '.$crstype)));
     }
 # --------------------------------------------------------- Standard documents
     $r->print('<table class="LC_docs_documents">');
@@ -2825,24 +2920,29 @@ ENDCOURSEVERIFY
        my $folder=$env{'form.folder'};
        if ($folder eq '' || $folder eq 'supplemental') {
            $folder='default';
-	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
+	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$crstype.' Documents'));
            $uploadtag = '<input type="hidden" name="folderpath" value="'.
 	       &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }
        my $postexec='';
        if ($folder eq 'default') {
-	   $r->print('<script type="text/javascript">this.window.name="loncapaclient";</script>');
+           $r->print('<script type="text/javascript">'."\n"
+                    .'// <![CDATA['."\n"
+                    .'this.window.name="loncapaclient";'."\n"
+                    .'// ]]>'."\n"
+                    .'</script>'."\n"
+       );
        } else {
            #$postexec='self.close();';
        }
        $hadchanges=0;
        my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,
-			   $upload_output,$type);
+			   $upload_output,$crstype);
        if ($error) {
 	   $r->print('<p><span class="LC_error">'.$error.'</span></p>');
        }
        if ($hadchanges) {
-	   &mark_hash_old()
+	   &mark_hash_old();
        }
        &changewarning($r,$postexec);
        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
@@ -2889,27 +2989,27 @@ $uploadtag
 <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
 $lt{'pubd'}<br />
 $uploadtag
-<input type="button" onClick="javascript:groupsearch()" value="$lt{'srch'}" />
+<input type="button" onclick="javascript:groupsearch()" value="$lt{'srch'}" />
 <br />
 <span class="LC_nobreak">
-<input type="button" onClick="javascript:groupimport();" value="$lt{'impo'}" />
+<input type="button" onclick="javascript:groupimport();" value="$lt{'impo'}" />
 $help{'Importing_LON-CAPA_Resource'}
 </span>
 <br />
-<input type="button" onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
+<input type="button" onclick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
 <hr />
 <p>
 $lt{'copm'}<br />
 <input type="text" size="40" name="importmap" /><br />
 <span class="LC_nobreak"><input type="button" 
-onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
+onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
 value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />
 $help{'Load_Map'}</span>
 </p>
 </form>
 <hr />
 <form action="/adm/groupsort" method="post" name="recover">
-<input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
+<input type="button" name="recovermap" onclick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
 </form>
 ENDFORM
        unless ($env{'form.pagepath'}) {
@@ -2919,13 +3019,13 @@ ENDFORM
 $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
-<input name="newext" type="button" onClick="javascript:makenewext('newext');"
+<input name="newext" type="button" onclick="javascript:makenewext('newext');"
 value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
 </span>
 </form>
 <br /><form action="/adm/imsimportdocs" method="post" name="ims">
 <input type="hidden" name="folder" value="$folder" />
-<input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
+<input name="imsimport" type="button" value="$lt{'imsf'}" title="$lt{imsl}" onclick="javascript:makeims();" />
 </form>
 ENDFORM
        }
@@ -2938,7 +3038,7 @@ ENDFORM
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newfolder" type="button"
-onClick="javascript:makenewfolder(this.form,'$folderseq');"
+onclick="javascript:makenewfolder(this.form,'$folderseq');"
 value="$lt{'newf'}" />$help{'Adding_Folders'}
 </span>
 </form>
@@ -2947,7 +3047,7 @@ value="$lt{'newf'}" />$help{'Adding_Fold
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newpage" type="button"
-onClick="javascript:makenewpage(this.form,'$pageseq');"
+onclick="javascript:makenewpage(this.form,'$pageseq');"
 value="$lt{'newp'}" />$help{'Adding_Pages'}
 </span>
 </form>
@@ -2974,7 +3074,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newsmppg" type="button" value="$lt{'sipa'}"
-onClick="javascript:makesmppage();" /> $help{'Simple Page'}
+onclick="javascript:makesmppage();" /> $help{'Simple Page'}
 </span>
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
@@ -2982,7 +3082,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
-onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
+onclick="javascript:makesmpproblem();" />$help{'Simple Problem'}
 </span>
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
@@ -2990,7 +3090,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">          
 <input name="newdropbox" type="button" value="$lt{'drbx'}"
-onClick="javascript:makedropbox();" />
+onclick="javascript:makedropbox();" />
 </span>         
 </form> 
 <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
@@ -2998,7 +3098,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newexamupload" type="button" value="$lt{'scuf'}"
-onClick="javascript:makeexamupload();" />
+onclick="javascript:makeexamupload();" />
 $help{'Score_Upload_Form'}
 </span>
 </form>
@@ -3007,7 +3107,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newbulletin" type="button" value="$lt{'bull'}"
-onClick="javascript:makebulboard();" />
+onclick="javascript:makebulboard();" />
 $help{'Bulletin Board'}
 </span>
 </form>
@@ -3025,7 +3125,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
-onClick="javascript:makeabout();" />
+onclick="javascript:makeabout();" />
 </span>
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
@@ -3055,7 +3155,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
-onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
+onclick="javascript:makesmpproblem();" />$help{'Simple Problem'}
 </span>
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
@@ -3063,7 +3163,7 @@ $uploadtag
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newexamupload" type="button" value="$lt{'scuf'}"
-onClick="javascript:makeexamupload();" />
+onclick="javascript:makeexamupload();" />
 $help{'Score_Upload_Form'}
 </span>
 </form>
@@ -3085,9 +3185,9 @@ ENDBLOCK
        if ($folder =~ /^supplemental$/ &&
 	   (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
           $env{'form.folderpath'} = 'supplemental&'.
-                                    &escape(&mt('Supplemental '.$type.' Documents'));
+                                    &escape($tabtitles{'supplemental'}{$crstype});
        }
-       my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type);
+       my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);
        if ($error) {
 	   $r->print('<p><span class="LC_error">'.$error.'</span></p>');
        }
@@ -3131,7 +3231,7 @@ $lt{'comment'}:<br />
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newfolder" type="button"
-onClick="javascript:makenewfolder(this.form,'$folderseq');"
+onclick="javascript:makenewfolder(this.form,'$folderseq');"
 value="$lt{'newf'}" /> $help{'Adding_Folders'}
 </span>
 </form>
@@ -3140,7 +3240,7 @@ value="$lt{'newf'}" /> $help{'Adding_Fol
 <input type="hidden" name="importdetail" value="" />
 <span class="LC_nobreak">
 <input name="newext" type="button" 
-onClick="javascript:makenewext('supnewext');"
+onclick="javascript:makenewext('supnewext');"
 value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
 </span>
 </form>
@@ -3201,10 +3301,10 @@ sub editing_js {
                                           p_mnp => 'Name of New Page',
                                           t_mnp => 'New Page',
                                           p_mxu => 'Title for the Uploaded Score',
-                                          p_msp => 'Title for the Page',
+                                          p_msp => 'Name of the Simple Course Page',
                                           p_msb => 'Title for the Problem',
                                           p_mdb => 'Title for the Drop Box',
-                                          p_mbb => 'Title for the Bulletin Board',
+                                          p_mbb => 'Title for the Discussion Board',
                                           p_mab => "Enter user:domain for User's 'About Me' Page",
                                           p_mab2 => "About [_99]",
                                           p_mab_alrt1 => 'Not a valid user:domain',
@@ -3397,3 +3497,126 @@ ENDNEWSCRIPT
 }
 1;
 __END__
+
+
+=head1 NAME
+
+Apache::londocs.pm
+
+=head1 SYNOPSIS
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 SUBROUTINES
+
+=over
+
+=item %help=()
+
+Available help topics
+
+=item mapread()
+
+Mapread read maps into LONCAPA::map:: global arrays 
+@order and @resources, determines status
+sets @order - pointer to resources in right order
+sets @resources - array with the resources with correct idx
+
+=item authorhosts()
+
+Return hash with valid author names
+
+=item dumpbutton()
+
+Generate "dump" button
+
+=item clean()
+
+=item dumpcourse()
+
+    Actually dump course
+
+
+=item exportbutton()
+
+    Generate "export" button
+
+=item exportcourse()
+
+=item create_ims_store()
+
+=item build_package()
+
+=item get_dependencies()
+
+=item process_content()
+
+=item replicate_content()
+
+=item extract_media()
+
+=item store_template()
+
+=item group_import()
+
+    Imports the given (name, url) resources into the course
+    coursenum, coursedom, and folder must precede the list
+
+=item breadcrumbs()
+
+=item log_docs()
+
+=item docs_change_log()
+
+=item update_paste_buffer()
+
+=item print_paste_buffer()
+
+=item do_paste_from_buffer()
+
+=item update_parameter()
+
+=item handle_edit_cmd()
+
+=item editor()
+
+=item process_file_upload()
+
+=item process_secondary_uploads()
+
+=item is_supplemental_title()
+
+=item parse_supplemental_title()
+
+=item entryline()
+
+=item tiehash()
+
+=item untiehash()
+
+=item checkonthis()
+
+check on this
+
+=item verifycontent()
+
+Verify Content
+
+=item devalidateversioncache() & checkversions()
+
+Check Versions
+
+=item mark_hash_old()
+
+=item is_hash_old()
+
+=item changewarning()
+
+=item init_breadcrumbs()
+
+Breadcrumbs for special functions
+
+=back
+
+=cut