--- loncom/interface/lonmeta.pm	2009/05/28 17:08:32	1.235
+++ loncom/interface/lonmeta.pm	2014/06/12 12:08:02	1.253
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Metadata display handler
 #
-# $Id: lonmeta.pm,v 1.235 2009/05/28 17:08:32 bisitz Exp $
+# $Id: lonmeta.pm,v 1.253 2014/06/12 12:08:02 kruse Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -351,7 +351,7 @@ sub pre_select_course {
     if ($group) {
         $group_input = '<input type="hidden" name="group" value="'.$group.'" />';
     } 
-    $r->print('<br /><br /><form method="post" action="'.$port_path.'">'.
+    $r->print(' <form method="post" action="'.$port_path.'">'.
               '<input type="hidden" name="currentpath" value="'.$path.'" />'.
 	      $group_input.
 	      '<input type="submit" name="cancel" value="'.&mt('Cancel').'" />'.
@@ -389,9 +389,9 @@ sub select_course {
                     &mt('You can choose to transfer data from the added fields to the "Notes" field if you are planning to change the course association.').'<br /><br />'.
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
-                    '<th>Copy to notes?</th>'."\n".
-                    '<th>Field name</th>'."\n".
-                    '<th>Values</th>'."\n".
+                    '<th>'.&mt('Copy to notes?').'</th>'."\n".
+                    '<th>'.&mt('Field Name').'</th>'."\n".
+                    '<th>'.&mt('Values').'</th>'."\n".
                     &Apache::loncommon::end_data_table_header_row().
                     $transfernotes.
                     &Apache::loncommon::end_data_table().'<br />';
@@ -425,7 +425,7 @@ sub select_course {
 # Pretty printing of metadata field
 
 sub prettyprint {
-    my ($type,$value,$target,$prefix,$form,$noformat)=@_;
+    my ($type,$value,$target,$prefix,$form)=@_;
 # $target,$prefix,$form are optional and for filecrumbs only
     if (! defined($value)) { 
         return '&nbsp;'; 
@@ -455,7 +455,7 @@ sub prettyprint {
     }
     # MIME
     if ($type eq 'mime') {
-        return '<img src="'.&Apache::loncommon::icon($value).'" />&nbsp;'.
+        return '<img src="'.&Apache::loncommon::icon($value).'" alt="" />&nbsp;'.
             &Apache::loncommon::filedescription($value);
     }
     # Person
@@ -500,8 +500,8 @@ sub prettyprint {
                 } 
             }
             $_ = '<li>'.$title.' '.
-		&Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'0',$noformat).
-                '</li>'
+                 &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form).
+                 '</li>'
 	    } split(/\s*\,\s*/,$value)).'</ul>';
     }
     # Evaluations
@@ -638,7 +638,7 @@ sub prettyinput {
             
             if ($values) {
                 if ($only_one) {
-                    $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
+                    $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,\%meta_options));
                 } else {
                     $output .= (&Apache::loncommon::multiple_select_form('new_'.$type,\@cur_values_inst,undef,\%meta_options));
                 }
@@ -744,9 +744,19 @@ sub prettyinput {
 
 # Create pageheader
 sub pageheader {
-    return &Apache::lonhtmlcommon::breadcrumbs()
-          .&Apache::loncommon::head_subbox(
-               &Apache::loncommon::CSTR_pageheader());
+    my $output = '';
+    # No CSTR? Include breadcrumbs
+    if ($env{'request.state'} ne 'construct') {
+        # loncommon::bodytag already includes breadcrumbs for CSTR
+        # by calling lonmenu::innerregister
+        $output = &Apache::lonhtmlcommon::breadcrumbs();
+    }
+    # CSTR? Include CSTR header
+    if ($env{'request.state'} eq 'construct') {
+          $output .= &Apache::loncommon::head_subbox(
+                         &Apache::loncommon::CSTR_pageheader());
+    }
+    return $output;
 }
 
 # Main Handler
@@ -765,10 +775,13 @@ sub handler {
 
     # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();
-    &Apache::lonhtmlcommon::add_breadcrumb({
-        'text'  => 'Construction Space',
-        'href'  => &Apache::loncommon::authorspace(),
-    });
+
+    if ($env{'request.state'} eq 'construct') {
+        &Apache::lonhtmlcommon::add_breadcrumb({
+            'text'  => 'Authoring Space',
+            'href'  => &Apache::loncommon::authorspace($uri),
+        });
+    }
 
     if ($uri=~m:/adm/bombs/(.*)$:) {
         &Apache::lonhtmlcommon::add_breadcrumb({
@@ -815,8 +828,8 @@ sub handler {
 						 {'domain' => $resdomain,}));
         $r->print(&pageheader());
         &present_editable_metadata($r,$uri,'groups');    
-    } elsif ($uri=~m|^/~|) { 
-        # Construction space
+    } elsif ($uri=~m|^/priv|) { 
+        # Authoring space
         &Apache::lonhtmlcommon::add_breadcrumb({
             'text'  => 'Edit Metadata',
             'href'  => '',
@@ -833,10 +846,14 @@ sub handler {
             'text'  => 'Metadata',
             'href'  => '',
         });
-        $r->print(&Apache::loncommon::start_page('Metadata',
-						 undef,
-						 {'domain' => $resdomain,}));
-        $r->print(&pageheader());
+        $r->print(
+            &Apache::loncommon::start_page(
+                'Metadata',
+                undef,
+                {'domain' => $resdomain,
+                'only_body' => 1,})
+           .'<h1>'.&mt('Metadata').'</h1>'
+        );
         &present_uneditable_metadata($r,$uri);
     }
     $r->print(&Apache::loncommon::end_page());
@@ -855,22 +872,50 @@ sub report_bombs {
     # Set document type
     $uri =~ s:/adm/bombs/::;
     $uri = &Apache::lonnet::declutter($uri);
-    $r->print('<h1>'.&Apache::lonnet::clutter($uri).'</h1>');
+    $r->print(
+        '<p>'.&mt('Folder: [_1]',
+                  '<span class="LC_filename">'.&Apache::lonnet::clutter($uri).'</span>')
+       .'</p>'
+    );
     my ($domain,$author)=($uri=~/^($match_domain)\/($match_username)\//);
-    if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {
-	if ($env{'form.clearbombs'}) {
-	    &Apache::lonmsg::clear_author_res_msg($uri);
-	}
-        my $clear=&mt('Clear all Messages in Subdirectory');
-        my $cancel=&mt('Back to Directory');
-        my $cancelurl=$uri;
-        $cancelurl=~s/^\Q$domain\E/\/priv/;
-        $r->print(<<ENDCLEAR);
-<form method="post">
-<input type="submit" name="clearbombs" value="$clear" />
-<a href="$cancelurl">$cancel</a>
-</form><hr />
-ENDCLEAR
+    if (!&Apache::lonnet::constructaccess('/priv/'.$domain.'/'.$author.'/')) {
+        $r->print('<p class="LC_error">'.&mt('Not authorized').'</p>');
+        return;
+    }
+
+    my $showbuttons=1;
+    my $message='';
+    if ($env{'form.clearbombs'}) {
+        my $rc=&Apache::lonmsg::clear_author_res_msg($uri);
+        if ($rc eq 'ok') {
+                $message=&Apache::lonhtmlcommon::confirm_success(
+                    &mt('Messages cleared.'));
+                $showbuttons=0;
+        } else {
+                $message=&Apache::lonhtmlcommon::confirm_success(
+                             &mt('Error clearing messages'),1)
+                        .'<br />'.&mt('Error: [_1]',$rc);
+        }
+    }
+
+    if ($message) {    
+        $message=&Apache::loncommon::confirmwrapper($message);
+        $r->print($message);
+    }
+
+    my $cancelurl=$uri;
+    $cancelurl=~s/^\Q$domain\E/\/priv\/$domain/;
+
+    if ($showbuttons) {
+        $r->print(
+            '<form method="post" action="">'.
+            '<input type="submit" name="clearbombs" value="'.
+                &mt('Clear all Messages in Subdirectory').'" />'.
+            ' <a href="'.$cancelurl.'">'.
+                &mt('Back to Source Directory').'</a>'.
+            '</form><hr />'
+        );
+        # Display all bombs of subdirectory
         my %brokenurls = 
             &Apache::lonmsg::all_url_author_res_msg($author,$domain);
         foreach my $key (sort(keys(%brokenurls))) {
@@ -882,7 +927,12 @@ ENDCLEAR
             }
         }
     } else {
-        $r->print(&mt('Not authorized'));
+            my $functions=&Apache::lonhtmlcommon::start_funclist('Actions');
+            $functions.=&Apache::lonhtmlcommon::add_item_funclist(
+                            '<a href="'.$cancelurl.'">'.
+                            &mt('Back to Source Directory').'</a>');
+            $functions .= &Apache::lonhtmlcommon::end_funclist();
+            $r->print('<p>'.$functions.'</p>');
     }
     return;
 }
@@ -919,12 +969,11 @@ sub present_uneditable_metadata {
 		 $currentversion   :
 		 &mt('information not available')).')';
 	} else {
-	    $versiondisplay='Version: '.$currentversion;
+	    $versiondisplay=&mt('Version: [_1]',$currentversion);
 	}
     }
-    # crumbify displayed URL               uri     target prefix form  size
-    $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef,'+1');
-    $disuri =~ s:<br />::g;
+    # crumbify displayed URL               uri     target prefix form 
+    $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef);
     # obsolete
     my $obsolete=$content{'obsolete'};
     my $obsoletewarning='';
@@ -938,7 +987,7 @@ sub present_uneditable_metadata {
     my $table='';
     my $title = $content{'title'};
     if (! defined($title)) {
-        $title = 'Untitled Resource';
+        $title = &mt('Untitled Resource');
     }
     my @fields;
     if ($uploaded) {
@@ -1037,7 +1086,7 @@ sub print_dynamic_metadata {
     }
     #
     # Assessment statistics
-    if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) {
+    if ($uri=~/$LONCAPA::assess_re/) {
         if (exists($dynmeta{'stdno'}) ||
             exists($dynmeta{'avetries'}) ||
             exists($dynmeta{'difficulty'}) ||
@@ -1073,9 +1122,11 @@ sub print_dynamic_metadata {
         if (exists($dynmeta{'stats'})) {
             my $table=&Apache::loncommon::start_data_table()
                      .&Apache::loncommon::start_data_table_header_row()
+		     .'<th>'.&mt('Domain').'</th>'
                      .'<th>'.&mt('Course').'</th>'
                      .'<th>'.&mt('Section(s)').'</th>'
                      .'<th>'.&mt('Num Students').'</th>'
+                     .'<th>'.&mt('Part').'</th>'
                      .'<th>'.&mt('Mean Tries').'</th>'
                      .'<th>'.&mt('Degree of Difficulty').'</th>'
                      .'<th>'.&mt('Degree of Discrimination').'</th>'
@@ -1092,12 +1143,16 @@ sub print_dynamic_metadata {
                     next;
                 }
                 $table .= &Apache::loncommon::start_data_table_row();
+		$table .=
+		    '<td><span class="LC_nobreak">'.$courseinfo{'domain'}.'</span></td>';
                 $table .= 
                     '<td><span class="LC_nobreak">'.$courseinfo{'description'}.'</span></td>';
                 $table .= 
                     '<td align="right">'.$data->{'sections'}.'</td>';
                 $table .=
                     '<td align="right">'.$data->{'stdno'}.'</td>';
+                $table .=
+                    '<td align="right">'.$data->{'part'}.'</td>';
                 foreach my $item ('avetries','difficulty','disc') {
                     $table .= '<td align="right">';
                     if (exists($data->{$item})) {
@@ -1126,7 +1181,6 @@ sub print_dynamic_metadata {
           &mt('No Assessment Statistical Data is available for this resource').
                   '</h4>');
     }
-
     #
     # Evaluation Data
     $r->print('<h4>'.&mt('Evaluation Data').'</h4>');
@@ -1174,7 +1228,7 @@ sub print_dynamic_metadata {
         my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri);
         if (defined($bombs) && $bombs ne '') {
             $r->print('<a name="bombs" />'
-                     .'<h4 class="LC_error">'.&mt('Error Messages').'</h4>'
+                     .'<h4 class="LC_warning">'.&mt('Error Messages').'</h4>'
                      .'<div>('
                      .&mt('visible to author and co-authors only')
                      .')</div>'
@@ -1241,7 +1295,7 @@ sub print_dynamic_metadata {
 #####################################################
 sub present_editable_metadata {
     my ($r,$uri,$file_type) = @_;
-    # Construction Space Call
+    # Authoring Space Call
     # Header
     my $disuri=$uri;
     my $fn=&Apache::lonnet::filelocation('',$uri);
@@ -1257,48 +1311,74 @@ sub present_editable_metadata {
     $target=~s/\.meta$//;
     my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);
     if ($bombs) {
-        my $showdel=1;
+        # Display Bombs, not Metadata
+        $r->print(
+            '<h2>'.&mt('Error Messages').'</h2>'
+           .'<p>'.&mt('Folder: [_1]',
+                      '<span class="LC_filename">'.$disuri.'</span>')
+           .'</p>'
+        );
+        my $showbuttons=1;
+        my $message='';
+        my $rc='';
         if ($env{'form.delmsg'}) {
-            if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {
-                $bombs=&mt('Messages deleted.');
-		$showdel=0;
+            $rc=&Apache::lonmsg::del_url_author_res_msg($target);
+            if ($rc eq 'ok') {
+                $message=&Apache::lonhtmlcommon::confirm_success(
+                             &mt('Messages deleted.'));
+		$showbuttons=0;
             } else {
-                $bombs=&mt('Error deleting messages');
+                $message=&Apache::lonhtmlcommon::confirm_success(
+                             &mt('Error deleting messages'), 1)
+                        .'<br />'.&mt('Error: [_1]',$rc);
             }
         }
         if ($env{'form.clearmsg'}) {
 	    my $cleardir=$target;
-	    $cleardir=~s/\/[^\/]+$/\//;
-            if (&Apache::lonmsg::clear_author_res_msg($cleardir) eq 'ok') {
-                $bombs=&mt('Messages cleared.');
-		$showdel=0;
+	    $cleardir=~s/\/[^\/]+$/\//; # Extract dir: keep path, remove filename
+            $rc=&Apache::lonmsg::clear_author_res_msg($cleardir);
+            if ($rc eq 'ok') {
+                $message=&Apache::lonhtmlcommon::confirm_success(
+                    &mt('Messages cleared.'));
+		$showbuttons=0;
             } else {
-                $bombs=&mt('Error clearing messages');
+                $message=&Apache::lonhtmlcommon::confirm_success(
+                             &mt('Error clearing messages'),1)
+                        .'<br />'.&mt('Error: [_1]',$rc);
             }
         }
-        my $del=&mt('Delete Messages for this Resource');
-	my $clear=&mt('Clear all Messages in Subdirectory');
-	my $goback=&mt('Back to Source File');
-        $r->print(<<ENDBOMBS);
-<h1>$disuri</h1>
-<form method="post" action="" name="defaultmeta">
-ENDBOMBS
-        if ($showdel) {
-	    $r->print(<<ENDDEL);
-<input type="submit" name="delmsg" value="$del" />
-<input type="submit" name="clearmsg" value="$clear" />
-ENDDEL
+        if ($message) {
+            $message=&Apache::loncommon::confirmwrapper($message);
+            $r->print($message);
+        }
+
+        $r->print('<form method="post" action="" name="defaultmeta">');
+        if ($showbuttons) {
+            $r->print(
+                '<input type="submit" name="delmsg" value="'.
+                &mt('Delete Messages for this Resource').'" />'.
+                '<input type="submit" name="clearmsg" value="'.
+                &mt('Clear all Messages in Subdirectory').'" />'
+               .'<br />'.$bombs
+            );
         } else {
-            $r->print('<p><a href="'.$disuri.'">'.$goback.'</a></p>');
-	    if ($env{'form.clearmsg'}) {
-		my ($diruri) = ($disuri =~ m{(.*/)[^/]*});
-		$r->print('<p><a href="'.$diruri.'">'.
-			  &mt('Back To Directory').'</a></p>');
-	    }
-	}
-	$r->print('<br />'.$bombs);
+            my $functions=&Apache::lonhtmlcommon::start_funclist('Actions');
+            $functions.=&Apache::lonhtmlcommon::add_item_funclist(
+                            '<a href="'.$disuri.'">'.
+                            &mt('Back to Source File').'</a>');
+            my ($diruri) = ($disuri =~ m{(.*/)[^/]*});
+            $functions.=&Apache::lonhtmlcommon::add_item_funclist(
+                            '<a href="'.$diruri.'">'.
+                            &mt('Back to Source Directory').'</a>');
+            $functions .= &Apache::lonhtmlcommon::end_funclist();
+            $r->print('<p>'.$functions.'</p>');
+        }
     } else {
-        my $displayfile=&mt('Metadata for [_1]',$disuri);
+
+        # Display Metadata, not Bombs
+        my $displayfile =
+            &mt('Metadata for [_1]'
+               ,'<span class="LC_filename">'.$disuri.'</span>');
         if ($disuri=~/\/default$/) {
             my $dir=$disuri;
             $dir=~s/default$//;
@@ -1309,7 +1389,11 @@ ENDDEL
         %Apache::lonpublisher::metadatakeys=();
         my $result=&Apache::lonnet::getfile($fn);
         if ($result == -1){
-	    $r->print(&mt('Creating new file [_1]'),$meta_uri);
+            my $message = &Apache::lonhtmlcommon::confirm_success(
+                &mt('Creating new file [_1]'
+                   ,'<span class="LC_filename"'.$meta_uri.'</span>'));
+            $message = &Apache::loncommon::confirmwrapper($message);
+            $r->print($message);
         } else {
             &Apache::lonpublisher::metaeval($result);
         }
@@ -1330,7 +1414,7 @@ ENDDEL
             }
         }
         $r->print(<<ENDEDIT);
-<p>$displayfile</p>
+<h2>$displayfile</h2>
 <form method="post" action="" name="defaultmeta">
 ENDEDIT
         my %lt=&fieldnames($file_type);
@@ -1356,7 +1440,7 @@ ENDEDIT
 	        @fields = (split(/,/,$env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'}));
 	    } else {
 	        # no saved field list, use default list
-	        @fields =  ('author','title','subject','keywords','abstract',
+	        @fields =  ('title','author','subject','keywords','abstract',
 			    'notes','lowestgradelevel',
 	                    'highestgradelevel','standards');
                 if ($Apache::lonpublisher::metadatafields{'courserestricted'} =~ /^course\.($match_domain\_$match_courseid)$/) {
@@ -1369,7 +1453,7 @@ ENDEDIT
                 }
 	    }
 	} else {
-	    @fields = ('author','title','subject','keywords','abstract','notes',
+	    @fields = ('title','author','subject','keywords','abstract','notes',
 		       'copyright','customdistributionfile','language',
 		       'standards',
 		       'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',
@@ -1396,21 +1480,29 @@ ENDEDIT
 	    if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none') {
 
                 if ($file_type eq 'portfolio') {
-		    $r->print(&mt('Associated with course [_1]',
-		        '<strong><a href="'.$uri.'?changecourse=true">'.
-		        $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.
-		        ".description"}.
-			      '</a></strong>').'<br />');
+                    $r->print(
+                        &mt('Associated with course [_1]'
+                           ,'<strong>'
+                           .$env{$Apache::lonpublisher::metadatafields{'courserestricted'}
+                           .".description"}.'</strong>')
+                       .' <a href="'.$uri.'?changecourse=true">'
+                       .&mt('Change')
+                       .'</a>'.'<br />'
+                    );
+
                 } else {
                     $r->print(&mt('Associated with course [_1]',
                         '<strong>'.
   $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.
                         ".description"}.'</strong>').'<br />');
                 }
-	    } else {
-		$r->print('<a href="'.$uri.'?changecourse=true">'.&mt('This resource is not associated with a course.').'</a><br />');
-	    }
-	}
+            } else {
+                $r->print(
+                    &mt('This resource is not associated with a course.')
+                  .' <a href="'.$uri.'?changecourse=true">'.&mt('Change').'</a><br />'
+                );
+            }
+        }
 	if (@added_order) {
 	    foreach my $field_name (@added_order) {
                 push(@fields,$field_name);