--- loncom/interface/londocs.pm	2006/11/22 14:07:13	1.256
+++ loncom/interface/londocs.pm	2007/06/13 23:44:10	1.276
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.256 2006/11/22 14:07:13 albertel Exp $
+# $Id: londocs.pm,v 1.276 2007/06/13 23:44:10 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,7 +42,7 @@ use HTML::Entities;
 use GDBM_File;
 use Apache::lonlocal;
 use Cwd;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
 
 my $iconpath;
 
@@ -99,7 +99,7 @@ sub authorhosts {
 		$ca=$env{'user.name'};
 		$cd=$env{'user.domain'};
 	    } else {
-		($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
+		($cd,$ca)=($realm=~/^\/($match_domain)\/($match_username)$/);
 	    }
 	    my $allowed=0;
 	    my $myhome=&Apache::lonnet::homeserver($ca,$cd);
@@ -147,6 +147,7 @@ sub dumpcourse {
     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 ($home,$other,%outhash)=&authorhosts();
     unless ($home) { return ''; }
     my $origcrsid=$env{'request.course.id'};
@@ -234,7 +235,6 @@ sub dumpcourse {
 	    my ($ext)=($_=~/\.(\w+)$/);
 	    my $title=$hash{'title_'.$hash{
 		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
-	    $title=~s/&colon;/:/g;
 	    $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
 	    if (!$title) {
 		$title=$_;
@@ -315,6 +315,7 @@ sub exportcourse {
             }
         }
         $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($outcome);
         $r->print(&Apache::loncommon::end_page());
     } else {
@@ -364,7 +365,7 @@ sub exportcourse {
             if (ref($curRes)) {
                 my $symb = $curRes->symb();
                 my $ressymb = $symb;
-                if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
+                if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
                     unless ($ressymb =~ m|adm/wrapper/adm|) {
                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                     }
@@ -456,6 +457,7 @@ function containerCheck(item) {
         |;
 	$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">'.
                   '<input type="submit" name="exportcourse" value="'.
@@ -610,7 +612,7 @@ sub build_package {
                         if (grep/^$count$/,@$discussions) {
                             my $ressymb = $symb;
                             my $mode;
-                            if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
+                            if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
                                 unless ($ressymb =~ m|adm/wrapper/adm|) {
                                     $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                                 }
@@ -695,7 +697,7 @@ sub process_content {
         }
     } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
         $content_type = 'examupload';
-    } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
+    } elsif ($symb =~ m-adm/($match_domain)/($match_username)/(\d+)/bulletinboard$-) {
         $content_type = 'bulletinboard';
         my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
         if ($contents) {
@@ -910,7 +912,7 @@ sub group_import {
     while (@_) {
 	my $name = shift;
 	my $url = shift;
-        if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
+        if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) && ($caller eq 'londocs')) {
             my $errtext = '';
             my $fatal = 0;
             my $newmapstr = '<map>'."\n".
@@ -933,9 +935,9 @@ sub group_import {
 	    my $idx = &LONCAPA::map::getresidx($url);
 	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
 	    my $ext = 'false';
-	    if ($url=~/^http:\/\//) { $ext = 'true'; }
-	    $url =~ s/:/\&colon;/g;
-	    $name =~ s/:/\&colon;/g;
+	    if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
+	    $url  = &LONCAPA::map::qtunescape($url);
+	    $name = &LONCAPA::map::qtunescape($name);
 	    $LONCAPA::map::resources[$idx] = 
 		join ':', ($name, $url, $ext, 'normal', 'res');
 	}
@@ -985,7 +987,8 @@ sub breadcrumbs {
 		      {'href'=>$url.$cpinfo,
 		       'title'=>$name,
 		       'text'=>'<font size="+1">'.
-			   $name.'</font>'
+			   $name.'</font>',
+		       'no_mt'=>1,
 		       });
 	$plain.=$name.' &gt; ';
     }
@@ -1025,7 +1028,8 @@ sub log_docs {
 
     sub log_differences {
         my ($plain)=@_;
-        my %storehash=('folder' => $plain);
+        my %storehash=('folder' => $plain,
+                       'currentfolder' => $env{'form.folder'});
         if ($parmidx) {
            $storehash{'parameter_res'}=$oldresources[$parmidx];
            foreach my $parm (keys %parmaction) {
@@ -1060,9 +1064,9 @@ sub log_docs {
 #
 sub docs_change_log {
     my ($r)=@_;
+    my $folder=$env{'form.folder'};
     $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
-
     my %docslog=&Apache::lonnet::dump('nohist_docslog',
                                       $env{'course.'.$env{'request.course.id'}.'.domain'},
                                       $env{'course.'.$env{'request.course.id'}.'.num'});
@@ -1083,12 +1087,8 @@ sub docs_change_log {
 	    'randompick'     => 'Randomly pick',
 	    'set'            => 'set to',
 	    'del'            => 'deleted');
-
-    my $countselect =
-        &Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
-                                    (&mt('all'),10,20,50,100,1000,10000));
-
-    $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
+    $r->print(&Apache::loncommon::display_filter().
+              '<input type="hidden" name="folder" value="'.$folder.'" />'.
               '<input type="submit" value="'.&mt('Display').'" /></form>');
     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
               '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
@@ -1096,7 +1096,18 @@ sub docs_change_log {
               &Apache::loncommon::end_data_table_header_row());
     my $shown=0;
     foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
+	if ($env{'form.displayfilter'} eq 'currentfolder') {
+	    if ($docslog{$id}{'logentry'}{'currentfolder'} ne $folder) { next; }
+	}
         my @changes=keys(%{$docslog{$id}{'logentry'}});
+        if ($env{'form.displayfilter'} eq 'containing') {
+	    my $wholeentry=$docslog{$id}{'exe_uname'}.':'.$docslog{$id}{'exe_udom'}.':'.
+		&Apache::loncommon::plainname($docslog{$id}{'exe_uname'},$docslog{$id}{'exe_udom'});
+	    foreach my $key (@changes) {
+		$wholeentry.=':'.$docslog{$id}{'logentry'}{$key};
+	    }
+	    if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }         
+	}
         my $count = 0;
         my $time =
             &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
@@ -1212,27 +1223,33 @@ sub editor {
 	    if ($env{'form.changeparms'}) {
 		my $idx=$env{'form.setparms'};
 # set parameters
-		if ($env{'form.randpick_'.$idx}) {
-		    &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
-                    &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
-		} else {
-		    &LONCAPA::map::delparameter($idx,'parameter_randompick');
-                    &remember_parms($idx,'randompick','del');
+		if ($env{'form.changeparms'} eq 'randompick') {
+		    if ($env{'form.randpick_'.$idx}) {
+			&LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
+			&remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
+		    } else {
+			&LONCAPA::map::delparameter($idx,'parameter_randompick');
+			&remember_parms($idx,'randompick','del');
+		    }
+		}
+		if ($env{'form.changeparms'} eq 'hiddenresource') {
+		    if ($env{'form.hidprs_'.$idx}) {
+			&LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
+			&remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
+		    } else {
+			&LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
+			&remember_parms($idx,'hiddenresource','del');
+		    }
+		}
+		if ($env{'form.changeparms'} eq 'encrypturl') {
+		    if ($env{'form.encprs_'.$idx}) {
+			&LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
+			&remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
+		    } else {
+			&LONCAPA::map::delparameter($idx,'parameter_encrypturl');
+			&remember_parms($idx,'encrypturl','del');
+		    }
 		}
-		if ($env{'form.hidprs_'.$idx}) {
-		    &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
-                    &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
- 		} else {
-		    &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
-                    &remember_parms($idx,'hiddenresource','del');
- 		}
-		if ($env{'form.encprs_'.$idx}) {
-		    &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
-                    &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
- 		} else {
-		    &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
-                    &remember_parms($idx,'encrypturl','del');
- 		}
 # store the changed version
 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
 		if ($fatal) {
@@ -1292,18 +1309,16 @@ sub editor {
 		    $url=~/^(.+)\.(\w+)$/;
 		    my $newurl=$1.$newid.'.'.$2;
 		    my $storefn=$newurl;
-                    $storefn=~s/^\/\w+\/\w+\/\w+\///;
+                    $storefn=~s{^/\w+/$match_domain/$match_username/}{};
 		    &Apache::lonclonecourse::writefile
 			($env{'request.course.id'},$storefn,
 			 &Apache::lonnet::getfile($url));
 		    $url=$newurl;
 		}
-		$title=~s/\</\&lt\;/g;
-		$title=~s/\>/\&gt\;/g;
-		$title=~s/\:/\&colon;/g;
+		$title = &LONCAPA::map::qtunescape($title);
 		my $ext='false';
 		if ($url=~/^http\:\/\//) { $ext='true'; }
-		$url=~s/\:/\&colon;/g;
+		$url   = &LONCAPA::map::qtunescape($url);
 # Now insert the URL at the bottom
                 my $newidx=&LONCAPA::map::getresidx($url);
 		$LONCAPA::map::resources[$newidx]=
@@ -1355,19 +1370,14 @@ sub editor {
                     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
                     my ($rtitle,@rrest)=split(/\:/,
                        $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
-                    my $comment=
-                     &HTML::Entities::decode($env{'form.title'});
-                    $comment=~s/\</\&lt\;/g;
-                    $comment=~s/\>/\&gt\;/g;
-                    $comment=~s/\:/\&colon;/g;
+                    my $comment=$env{'form.title'};
+                    $comment = &LONCAPA::map::qtunescape($comment);
 		    if ($comment=~/\S/) {
 			$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
 			    $comment.':'.join(':',@rrest);
 		    }
 # Devalidate title cache
-                    my $renamed_url=$rrest[0];
-# Has the &colon;-escaping
-                    $renamed_url=~s/\&colon\;/\:/g;
+                    my $renamed_url=&LONCAPA::map::qtescape($rrest[0]);
 		    &Apache::lonnet::devalidate_title_cache($renamed_url);
                 }
 # Store the changed version
@@ -1521,11 +1531,9 @@ sub process_file_upload {
 						$codebase);
         my $ext='false';
         if ($url=~/^http\:\/\//) { $ext='true'; }
-        $url=~s/\:/\&colon;/g;
+	$url     = &LONCAPA::map::qtunescape($url);
         my $comment=$env{'form.comment'};
-        $comment=~s/\</\&lt\;/g;
-        $comment=~s/\>/\&gt\;/g;
-        $comment=~s/\:/\&colon;/g;
+	$comment = &LONCAPA::map::qtunescape($comment);
         if ($folder=~/^supplemental/) {
               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   $env{'user.domain'}.'___&&&___'.$comment;
@@ -1544,38 +1552,18 @@ sub process_file_upload {
                 my $total_embedded = keys(%{$allfiles});
                 if ($total_embedded > 0) {
                     my $num = 0;
-                    $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
-   <form name="upload_embedded" action="/adm/coursedocs"
-                  method="post" enctype="multipart/form-data">
-   <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />
+		    my $state = '
+   <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />
+   <input type="hidden" name="cmd" value="upload_embedded" />
    <input type="hidden" name="newidx" value="'.$newidx.'" />
    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
-                    $$upload_output .= '<b>Upload embedded files</b>:<br />
-   <table>';
-                    foreach my $embed_file (keys(%{$allfiles})) {
-                        $$upload_output .= '<tr><td>'.$embed_file.
-          '<input name="embedded_item_'.$num.'" type="file" />
-           <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
-                        my $attrib;
-                        if (@{$$allfiles{$embed_file}} > 1) {
-                            $attrib = join(':',@{$$allfiles{$embed_file}});
-                        } else {
-                            $attrib = $$allfiles{$embed_file}[0];
-                        }
-                        $$upload_output .=
-           '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
-                        if (exists($$codebase{$embed_file})) {
-                            $$upload_output .= 
-          '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';
-                        }
-                        $$upload_output .= '</td></tr>';
-                        $num ++;
-                    }
-                    $phase_status = 'phasetwo';
-                    $$upload_output .= '</table><br />
-   <input type ="submit" value="Complete upload" />
-   </form>';
+		    $phase_status = 'phasetwo';
+
+                    $$upload_output .= 
+			'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.
+			&ask_for_embedded_content('/adm/coursedocs',
+						  $state,$allfiles,$codebase);
                 } else {
                     $$upload_output .= 'No embedded items identified<br />';
                 }
@@ -1585,6 +1573,55 @@ sub process_file_upload {
     return $phase_status;
 }
 
+sub ask_for_embedded_content {
+    my ($actionurl,$state,$allfiles,$codebase,$args)=@_;
+    my $upload_output = '
+   <form name="upload_embedded" action="'.$actionurl.'"
+                  method="post" enctype="multipart/form-data">';
+    $upload_output .= $state;
+    $upload_output .= '<b>Upload embedded files</b>:<br />'.
+	&Apache::loncommon::start_data_table();
+
+    my $num = 0;
+    foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) {
+	$upload_output .= &Apache::loncommon::start_data_table_row().
+	    '<td>'.$embed_file.'</td><td>';
+	if ($args->{'ignore_remote_references'}
+	    && $embed_file =~ m{^\w+://}) {
+	    $upload_output.='<span class="LC_warning">'.&mt("URL points to other server.").'</span>';
+	} elsif ($args->{'error_on_invalid_names'}
+	    && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) {
+	    
+	    $upload_output.='<span class="LC_warning">'.&mt("Invalid characters").'</span>';
+	    
+	} else {
+
+	    $upload_output .='
+           <input name="embedded_item_'.$num.'" type="file" value="bob" />
+           <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
+	    my $attrib = join(':',@{$$allfiles{$embed_file}});
+	    $upload_output .=
+		"\n\t\t".
+		'<input name="embedded_attrib_'.$num.'" type="hidden" value="'.
+		$attrib.'" />';
+	    if (exists($$codebase{$embed_file})) {
+		$upload_output .= 
+		    "\n\t\t".
+		    '<input name="codebase_'.$num.'" type="hidden" value="'.
+		    &escape($$codebase{$embed_file}).'" />';
+	    }
+	}
+	$upload_output .= '</td>'.&Apache::loncommon::end_data_table_row();
+	$num++;
+    }
+    $upload_output .= &Apache::loncommon::end_data_table().'<br />
+   <input type ="hidden" name="number_embedded_items" value="'.$num.'" />
+   <input type ="submit" value="'.&mt('Upload Listed Files').'" />
+   '.&mt('(only files for which a location has been provided will be uploaded)').'
+   </form>';
+    return $upload_output;
+}
+
 sub process_secondary_uploads {
     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
     my $folder=$env{'form.folder'};
@@ -1600,7 +1637,7 @@ sub process_secondary_uploads {
     $destination .= $newidx;
     my ($url,$filename);
     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
-    ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
+    ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
     return $filename;
 }
 
@@ -1608,14 +1645,12 @@ sub process_secondary_uploads {
 
 sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
-    $title=~s/\&colon\;/\:/g;
-    $title=&HTML::Entities::encode(&HTML::Entities::decode(
-     &unescape($title)),'"<>&\'');
+    $title=&HTML::Entities::encode($title,'"<>&\'');
     my $renametitle=$title;
     my $foldertitle=$title;
     my $pagetitle=$title;
     my $orderidx=$LONCAPA::map::order[$index];
-    if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/	) { 
+    if ($title=~ /^(\d+)___&amp;&amp;&amp;___($match_username)___&amp;&amp;&amp;___($match_domain)___&amp;&amp;&amp;___(.*)$/	) { 
 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
 	$renametitle=$4;
 	$title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
@@ -1677,6 +1712,7 @@ sub entryline {
 		'rn' => 'Rename',
 		'cp' => 'Copy');
 	my $nocopy=0;
+        my $nocut=0;
         if ($url=~/\.(page|sequence)$/) {
 	    foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
 		my ($title,$url,$ext,$type)=split(/\:/,$_);
@@ -1686,13 +1722,24 @@ sub entryline {
 		}
 	    }
 	}
+        if ($url=~/^\/res\/lib\/templates\//) { 
+           $nocopy=1; 
+           $nocut=1;
+        }
         my $copylink='&nbsp;';
+        my $cutlink='&nbsp;';
         if ($env{'form.pagepath'}) {
-           unless ($nocopy) {
+           if (!$nocopy) {
                $copylink=(<<ENDCOPY);
 <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 ENDCOPY
+           }
+           if (!$nocut) {
+               $cutlink=(<<ENDCUT);
+<a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
+<font size="-2" color="#550044">$lt{'ct'}</font></a>
+ENDCUT
             }
             $line.=(<<END);
 <form name="entry_$index" action="/adm/coursedocs" method="post">
@@ -1714,19 +1761,24 @@ ENDCOPY
 </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>
-<a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
-<font size="-2" color="#550044">$lt{'ct'}</font></a>
+$cutlink
 <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a>
 $copylink
 END
         } else {
-           unless ($nocopy) {
+           if (!$nocopy) {
                $copylink=(<<ENDCOPY);
 <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 ENDCOPY
             }
+            if (!$nocut) {
+               $cutlink=(<<ENDCUT);
+<a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
+<font size="-2" color="#550044">$lt{'ct'}</font></a>
+ENDCUT
+            }
             $line.=(<<END); 
 <form name="entry_$index" action="/adm/coursedocs" method="post">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
@@ -1746,8 +1798,7 @@ ENDCOPY
 </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>
-<a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
-<font size="-2" color="#550044">$lt{'ct'}</font></a>
+$cutlink
 <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a>
 $copylink
@@ -1766,13 +1817,13 @@ END
     if ($uploaded) {
 	if ($extension eq 'sequence') {
 	    $icon=$iconpath.'/folder_closed.gif';
-	    $url=~/$coursenum\/([\/\w]+)\.sequence$/;
+	    $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
 	    $url='/adm/coursedocs?';
 	    $folderarg=$1;
 	    $isfolder=1;
         } elsif ($extension eq 'page') {
             $icon=$iconpath.'/page.gif';
-            $url=~/$coursenum\/([\/\w]+)\.page$/;
+            $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
             $pagearg=$1;
             $url='/adm/coursedocs?';
             $ispage=1;
@@ -1831,11 +1882,11 @@ END
                                               'parameter_encrypturl'))[0]=~/^yes$/i);
 	$url.='folderpath='.&escape($folderpath).$cpinfo;
 	$parameterset='<label>'.&mt('Randomly Pick: ').
-	    '<input type="text" size="4" onChange="this.form.changeparms.value=1;this.form.submit()" name="randpick_'.$orderidx.'" value="'.
+	    '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randpick_'.$orderidx.'" value="'.
 	    (&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randompick'))[0].
                                               '" />'.
-'<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
+'<font size="-2"><a href="javascript:void(0)">'.&mt('Save').'</a></font></label>';
        
     }
     if ($ispage) {
@@ -1870,9 +1921,9 @@ END
 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
 	$line.=(<<ENDPARMS);
 <td bgcolor="#BBBBFF"><font size='-2'>
-<nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.changeparms.value=1;this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
+<nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size='-2'>
-<nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value=1;this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
+<nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
 ENDPARMS
     }
@@ -1986,6 +2037,7 @@ sub list_symbs {
     my ($r) = @_;
 
     $r->print(&Apache::loncommon::start_page('Symb List'));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
     my $navmap = Apache::lonnavmaps::navmap->new();
     $r->print("<pre>\n");
     foreach my $res ($navmap->retrieveResources()) {
@@ -2005,6 +2057,7 @@ sub verifycontent {
    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'));
    $hashtied=0;
    undef %alreadyseen;
    %alreadyseen=();
@@ -2040,6 +2093,7 @@ 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 $header='';
     my $startsel='';
     my $monthsel='';
@@ -2091,9 +2145,9 @@ sub checkversions {
         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
-	    $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
+	    $r->print('<h1>'.&mt('Your Version Settings have been Saved').'</h1>');
 	} else {
-	    $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
+	    $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</font></h1>');
 	}
 	&mark_hash_old();
     }
@@ -2331,6 +2385,22 @@ sub changewarning {
 $help{'Caching'}.'</font></h3></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=>&Apache::loncommon::course_type()." Documents",
+					    faq=>273,
+					    bug=>'Instructor Interface',
+                                            help => 'Docs_Adding_Course_Doc'});
+    &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
+					    text=>$text,
+					    faq=>273,
+					    bug=>'Instructor Interface'});
+}
+
 # ================================================================ Main Handler
 sub handler {
     my $r = shift;
@@ -2364,18 +2434,23 @@ sub handler {
 
 # does this user have privileges to modify docs
     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
-
   if ($allowed && $env{'form.verify'}) {
+      &init_breadcrumbs('verify','Verify Content');
       &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {
+      &init_breadcrumbs('listsymbs','List Symbs');
       &list_symbs($r);
   } elsif ($allowed && $env{'form.docslog'}) {
+      &init_breadcrumbs('docslog','Show Log');
       &docs_change_log($r);
   } elsif ($allowed && $env{'form.versions'}) {
+      &init_breadcrumbs('versions','Check/Set Resource Versions');
       &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {
+      &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');
       &exportcourse($r);
   } else {
 # is this a standard course?
@@ -2449,7 +2524,8 @@ sub handler {
   my %codebase = ();
   my ($upload_result,$upload_output);
   if ($allowed) {
-      if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
+      if (($env{'form.uploaddoc.filename'}) &&
+	  ($env{'form.cmd'}=~/^upload_(\w+)/)) {
 # Process file upload - phase one - upload and parse primary file.  
           $upload_result = &process_file_upload(\$upload_output,$coursenum,
 						$coursedom,\%allfiles,
@@ -2608,6 +2684,7 @@ $exportbut
 </td><td bgcolor="#DDDDCC">
     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
 </td><td bgcolor="#DDDDCC">
+    <input type="hidden" name="folder" value="$env{'form.folder'}" />
     <input type="submit" name="docslog" value="$lt{'sl'}" />
 </td></tr></table>
 </form>