--- loncom/interface/portfolio.pm	2006/12/11 03:43:15	1.175
+++ loncom/interface/portfolio.pm	2007/07/10 20:57:10	1.184.2.1
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # portfolio browser
 #
-# $Id: portfolio.pm,v 1.175 2006/12/11 03:43:15 raeburn Exp $
+# $Id: portfolio.pm,v 1.184.2.1 2007/07/10 20:57:10 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -147,12 +147,12 @@ TABLE
     );
     $r->print('<span class="LC_current_location">'.&make_anchor($url,\%anchor_fields,$port_path).'/');
     if (@tree > 1){
-        my $newCurrentPath = '';
+        my $newCurrentPath = '/';
         for (my $i = 1; $i< @tree; $i++){
             $newCurrentPath .= $tree[$i].'/';
             my %anchor_fields = (
                 'selectfile' => $tree[$i],
-                'currentpath' => '/',
+                'currentpath' => $newCurrentPath,
                 'mode' => $env{"form.mode"},
                 'fieldname' => $env{"form.fieldname"},
                 'continue' => $env{"form.continue"}
@@ -567,7 +567,7 @@ sub delete_confirmed {
 					       $delete_file);
         if ($result ne 'ok') {
 	    $r->print('<span class="LC_error">'.
-                     &mt('An error occured ([_1]) while trying to delete 
+                     &mt('An error occurred ([_1]) while trying to delete 
                          [_2].',$result,&display_file(undef, $delete_file)).
                       '</span><br /><br />');
         } else {
@@ -588,7 +588,7 @@ sub delete_confirmed {
                     &Apache::lonnet::modify_access_controls($file_name,\%changes,
                                                             $udom,$uname);
                     if ($outcome ne 'ok') {
-                           $r->print('<br />'.&mt("An error occured ([_1]) while ".
+                           $r->print('<br />'.&mt("An error occurred ([_1]) while ".
                                "trying to delete access controls for the file.",$outcome).
                                '</span><br /><br />');
                     } else {
@@ -596,7 +596,7 @@ sub delete_confirmed {
                             $r->print('<br />'.&mt('Access controls also deleted for the file.').'<br /><br />');
                         } else {
                             $r->print('<span class="LC_error">'.'<br />'.
-                               &mt("An error occured ([_1]) while ".
+                               &mt("An error occurred ([_1]) while ".
                                    "trying to delete access controls for the file.",$deloutcome).
                                    '</span><br /><br />');
                         }
@@ -626,7 +626,7 @@ sub delete_dir_confirmed {
 					       $directory_name);
 					       
     if ($result ne 'ok') {
-	$r->print('<span class="LC_error"> An error occured (dir) ('.$result.
+	$r->print('<span class="LC_error"> An error occurred (dir) ('.$result.
 		  ') while trying to delete '.$directory_name.'</span><br />');
     } else {
         # now remove from recent
@@ -681,7 +681,7 @@ sub rename_confirmed {
         $chg_access = &access_for_renamed($filenewname,$group,$udom,$uname);
     } else {      
 	$r->print('<span class="LC_error">'.
-		  &mt('An error occured ([_1]) while trying to rename [_2]'
+		  &mt('An error occurred ([_1]) while trying to rename [_2]'
 		      .' to [_3]',$result,&display_file(),
 		      &display_file('',$filenewname)).'</span><br />');
         return;
@@ -718,13 +718,13 @@ sub access_for_renamed {
             &Apache::lonnet::modify_access_controls($oldfile,\%change_old,
 						    $udom,$uname);
         if ($outcome ne 'ok') {
-            $chg_text ='<br /><br />'.&mt("An error occured ([_1]) while ".
+            $chg_text ='<br /><br />'.&mt("An error occurred ([_1]) while ".
                 "trying to delete access control records for the old name.",$outcome).
                 '</span><br />';
         } else {
             if ($deloutcome ne 'ok') {
                 $chg_text = '<br /><br /><span class="LC_error"><br />'.
-		    &mt("An error occured ([_1]) while ".
+		    &mt("An error occurred ([_1]) while ".
 			"trying to delete access control records for the old name.",$deloutcome).
 			'</span><br />';
             }
@@ -734,7 +734,7 @@ sub access_for_renamed {
                                                     $udom,$uname);
         if ($outcome ne 'ok') {
             $chg_text .= '<br /><br />'.
-		&mt("An error occured ([_1]) while ".
+		&mt("An error occurred ([_1]) while ".
                 "trying to update access control records for the new name.",$outcome).
                 '</span><br />';
         }
@@ -1014,7 +1014,7 @@ sub update_access {
         } else {
             if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) {
                 $errors .= '<span class="LC_error">'.
-		    &mt('A problem occurred storing access control settings: [_1]',$outcome).
+		    &mt('A problem occurred saving access control settings: [_1]',$outcome).
 		    '</span>';
             }
         }
@@ -1347,7 +1347,7 @@ sub display_access_row {
                       '</th>');
             $colspan ++;
         } elsif ($type eq 'domains') {
-            @all_doms = &Apache::loncommon::get_domains();
+            @all_doms = sort(&Apache::lonnet::all_domains());
         }
         $r->print(&Apache::loncommon::end_data_table_header_row());
         foreach my $key (@{$items}) {
@@ -1733,7 +1733,8 @@ ENDSMP
                     fileList = fileList + document.forms.checkselect.currentpath.value + document.forms.checkselect[i].value + "," ;
                 }
             }
-            opener.document.forms.lonhomework.$env{'form.fieldname'}.value=fileList;
+            var hwfield = opener.document.getElementsByName('$env{'form.fieldname'}');
+            hwfield[0].value = fileList;
             self.close();
         }
         </script>
@@ -1750,24 +1751,23 @@ ENDSMP
     }
 }
 
-sub upload {
-    my ($r,$url,$group)=@_;
-    my $fname=$env{'form.uploaddoc.filename'};
-    my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?)
+
+sub check_for_upload {
+    my ($path,$fname,$group,$element) = @_;
     my $disk_quota = &get_quota($group);
-    $fname=&Apache::lonnet::clean_filename($fname);
+    my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?)
 
-    my $portfolio_root=&get_portfolio_root();
-    my ($uname,$udom) = &get_name_dom();
+    my $portfolio_root = &get_portfolio_root();
     my $port_path = &get_port_path();
+    my ($uname,$udom) = &get_name_dom();
     # Fixme --- Move the checking for existing file to LOND error return
-    my @dir_list=&get_dir_list($portfolio_root);
+    my @dir_list=&get_dir_list($portfolio_root,$path);
     my $found_file = 0;
     my $locked_file = 0;
     foreach my $line (@dir_list) {
         my ($file_name)=split(/\&/,$line,2);
         if ($file_name eq $fname){
-            $file_name = $env{'form.currentpath'}.$file_name;
+            $file_name = $path.$file_name;
             $file_name = &prepend_group($file_name);
             $found_file = 1;
             if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
@@ -1776,34 +1776,119 @@ sub upload {
         }
     }
     my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root);
+
     if (($current_disk_usage + $filesize) > $disk_quota){
-        $r->print('<span class="LC_error">Unable to upload <strong>'.$fname.' (size = '.$filesize.' kilobytes)</strong>. Disk quota will be exceeded.</span>'.
-                  '<br />Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.');
-        $r->print(&done('Back',$url));
-    } 
-    elsif ($found_file){
-        if ($locked_file){
-            $r->print('<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a <strong>locked</strong> file by that name was found in <strong>'.$port_path.$env{'form.currentpath'}.'</strong></span>'.
-                  '<br />You will be able to rename or delete existing '.$fname.' after a grade has been assigned.');
-            $r->print(&done('Back',$url));      
-        } else {   
-            $r->print('<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a file by that name was found in <strong>'.$port_path.$env{'form.currentpath'}.'</strong></span>'.
-                  '<br />To upload, rename or delete existing '.$fname.' in '.$port_path.$env{'form.currentpath'});
-            $r->print(&done('Back',$url));
-        }
-    } else {
-        my $result=&Apache::lonnet::userfileupload('uploaddoc','',
-	        	 $port_path.$env{'form.currentpath'});
-        if ($result !~ m|^/uploaded/|) {
-            $r->print('<span class="LC_error">'.'An errror occured ('.$result.
-	              ') while trying to upload '.&display_file().'</span><br />');
-	    $r->print(&done('Back',$url));
-        } else {
-            $r->print(&done(undef,$url));
-        }
+        my $msg = '<span class="LC_error">Unable to upload <strong>'.$fname.' (size = '.$filesize.' kilobytes)</strong>. Disk quota will be exceeded.</span>'.
+	    '<br />Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.';
+	return ('will_exceed_quota',$msg);
+    } elsif ($found_file) {
+        if ($locked_file) {
+            my $msg = '<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a <strong>locked</strong> file by that name was found in <strong>'.$port_path.$path.'</strong></span>'.
+		'<br />You will be able to rename or delete existing '.$fname.' after a grade has been assigned.';
+	    return ('file_locked',$msg);
+	} else {
+            my $msg = '<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a file by that name was found in <strong>'.$port_path.$path.'</strong></span>'.
+		'<br />To upload, rename or delete existing '.$fname.' in '.$port_path.$path;
+	    return ('file_exists',$msg);
+	}
+    }
+}
+
+sub upload {
+    my ($r,$url,$group)=@_;
+    my $fname=&Apache::lonnet::clean_filename($env{'form.uploaddoc.filename'});
+
+    my ($state,$msg) = &check_for_upload($env{'form.currentpath'},
+					 $fname,$group,'uploaddoc');
+
+    if ($state eq 'will_exceed_quota'
+	|| $state eq 'file_locked'
+	|| $state eq 'file_exists' ) {
+	$r->print($msg.&done('Back',$url));
+	return;
+    }
+
+    my $port_path = &get_port_path();
+    my (%allfiles,%codebase,$mode);
+    if ($env{'form.uploaddoc.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) {
+	$mode = 'parse';
+	
+    }
+    my $result=
+	&Apache::lonnet::userfileupload('uploaddoc','',
+					$port_path.$env{'form.currentpath'},
+					$mode,\%allfiles,\%codebase);
+    if ($result !~ m|^/uploaded/|) {
+	$r->print('<span class="LC_error">'.'An error occurred ('.$result.
+		  ') while trying to upload '.&display_file().'</span><br />');
+	$r->print(&done('Back',$url));
+    } else {
+	if (%allfiles) {
+	    my $state = <<STATE;
+    <input type="hidden" name="action"      value="upload_embedded" />
+    <input type="hidden" name="currentpath" value="$env{'form.currentpath'}" />
+    <input type="hidden" name="fieldname"   value="$env{'form.fieldname'}" />
+    <input type="hidden" name="mode"        value="$env{'form.mode'}" />
+STATE
+            $r->print("<h2>".&mt("Reference Warning")."</h2>");
+            $r->print("<p>".&mt("Completed upload of the file. This file contained references to other files. You must upload the referenced files or else the uploaded file may not work properly.")."</p>");
+            $r->print("<p>".&mt("Please select the locations from which the referenced files are to be uploaded.")."</p>");
+	    $r->print(&Apache::londocs::ask_for_embedded_content('/adm/portfolio',$state,\%allfiles,\%codebase,
+				      {'error_on_invalid_names'   => 1,
+				       'ignore_remote_references' => 1,}));
+	    $r->print('<p>Or '.&done('Return to directory listing',$url).'</p>');
+	} else {
+	    $r->print(&done(undef,$url));
+	}
     }
 }
 
+sub upload_embedded {
+    my ($r,$url,$group)=@_;
+    for (my $i=0; $i<$env{'form.number_embedded_items'}; $i++) {
+	next if (!exists($env{'form.embedded_item_'.$i.'.filename'}));
+	my $orig_uploaded_filename = 
+	    $env{'form.embedded_item_'.$i.'.filename'};
+
+	$env{'form.embedded_orig_'.$i} = 
+	    &unescape($env{'form.embedded_orig_'.$i});
+	my ($path,$fname) = 
+	    ($env{'form.embedded_orig_'.$i} =~ m{(.*/)([^/]*)});
+	# no path, whole string is fname
+	if (!$fname) { $fname = $env{'form.embedded_orig_'.$i} };
+
+	$path = $env{'form.currentpath'}.$path;
+	$fname = &Apache::lonnet::clean_filename($fname);
+
+	my ($state,$msg) = &check_for_upload($path,$fname,$group,
+					     'embedded_item_'.$i);
+
+	if ($state eq 'will_exceed_quota'
+	    || $state eq 'file_locked'
+	    || $state eq 'file_exists' ) {
+	    $r->print($msg);
+	    next;
+	}
+
+	my $port_path = &get_port_path();
+	my $src_path = $env{'form.embedded_orig_'.$i};
+	$env{'form.embedded_item_'.$i.'.filename'}=$fname;
+	
+	my $result=
+	    &Apache::lonnet::userfileupload('embedded_item_'.$i,'',
+					    $port_path.$path);
+	if ($result !~ m|^/uploaded/|) {
+	    $r->print('<span class="LC_error">'.'An error occurred ('.$result.
+		      ') while trying to upload '.$orig_uploaded_filename.' for embedded element '.$env{'form.embedded_orig_'.$i}.'</span><br />');
+	    next;
+	} else {
+	    $r->print("<p> Uploaded ".
+		      &display_file($port_path.$path,$fname).'</p>');
+	}
+    }
+    $r->print(&done(undef,$url));
+}
+
 sub lock_info {
     my ($r,$url,$group) = @_;
     my ($uname,$udom) = &get_name_dom();
@@ -1876,7 +1961,7 @@ sub createdir {
         my $result=&Apache::lonnet::mkdiruserfile($uname,$udom,
 	         $port_path.$env{'form.currentpath'}.$newdir);
         if ($result ne 'ok') {
-    	    $r->print('<span class="LC_error">'.'An errror occured ('.$result.
+    	    $r->print('<span class="LC_error">'.'An error occurred ('.$result.
 	    	      ') while trying to create a new directory '.&display_file().'</span><br />');
         }
     }
@@ -1921,10 +2006,10 @@ sub get_group_quota {
 } 
 
 sub get_dir_list {
-    my ($portfolio_root) = @_;
+    my ($portfolio_root,$path) = @_;
+    $path ||= $env{'form.currentpath'};
     my ($uname,$udom) = &get_name_dom();
-    return &Apache::lonnet::dirlist($env{'form.currentpath'},
-                                          $udom,$uname,$portfolio_root);
+    return &Apache::lonnet::dirlist($path,$udom,$uname,$portfolio_root);
 }
 
 sub get_name_dom {
@@ -2162,6 +2247,12 @@ sub handler {
         } else {
             &missing_priv($r,$url,'upload');
         }
+    } elsif ($env{'form.action'} eq 'upload_embedded') {
+	if ($can_upload) {
+	    &upload_embedded($r,$url,$group);
+        } else {
+            &missing_priv($r,$url,'upload');
+        }
     } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) {
         if ($can_delete) {
 	    &delete_confirmed($r,$url,$group);