--- loncom/interface/londocs.pm	2006/12/05 02:55:52	1.264
+++ 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.264 2006/12/05 02:55:52 albertel Exp $
+# $Id: londocs.pm,v 1.276 2007/06/13 23:44:10 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -235,7 +235,6 @@ sub dumpcourse {
 	    my ($ext)=($_=~/\.(\w+)$/);
 	    my $title=$hash{'title_'.$hash{
 		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
-	    $title=~s/:/:/g;
 	    $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
 	    if (!$title) {
 		$title=$_;
@@ -913,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".
@@ -937,8 +936,8 @@ sub group_import {
 	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
 	    my $ext = 'false';
 	    if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
-	    $url =~ s/:/\&colon;/g;
-	    $name =~ s/:/\&colon;/g;
+	    $url  = &LONCAPA::map::qtunescape($url);
+	    $name = &LONCAPA::map::qtunescape($name);
 	    $LONCAPA::map::resources[$idx] = 
 		join ':', ($name, $url, $ext, 'normal', 'res');
 	}
@@ -988,7 +987,8 @@ sub breadcrumbs {
 		      {'href'=>$url.$cpinfo,
 		       'title'=>$name,
 		       'text'=>'<font size="+1">'.
-			   $name.'</font>'
+			   $name.'</font>',
+		       'no_mt'=>1,
 		       });
 	$plain.=$name.' &gt; ';
     }
@@ -1315,12 +1315,10 @@ sub editor {
 			 &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]=
@@ -1372,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
@@ -1538,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;
@@ -1561,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 />';
                 }
@@ -1602,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'};
@@ -1617,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;
 }
 
@@ -1625,9 +1645,7 @@ 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;
@@ -1694,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(/\:/,$_);
@@ -1703,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">
@@ -1731,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'}" />
@@ -1763,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
@@ -1852,7 +1886,7 @@ END
 	    (&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) {
@@ -2111,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();
     }