--- loncom/interface/londocs.pm	2009/10/22 22:25:36	1.401
+++ loncom/interface/londocs.pm	2010/12/05 16:40:11	1.411.2.7
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.401 2009/10/22 22:25:36 raeburn Exp $
+# $Id: londocs.pm,v 1.411.2.7 2010/12/05 16:40:11 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -41,6 +41,7 @@ use Apache::lonratedt();
 use Apache::lonxml;
 use Apache::lonclonecourse;
 use Apache::lonnavmaps;
+use Apache::londocsgci;
 use HTML::Entities;
 use GDBM_File;
 use Apache::lonlocal;
@@ -117,15 +118,15 @@ sub authorhosts {
 
 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) {
-	my $link = "<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"dumpcourse\", \"".&mt('Dump '.$type.' DOCS to Construction Space')."\")'>".&mt('Dump '.$type.' DOCS to Construction Space')."</a>";
+	my $link = "<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"dumpcourse\", \"".&mt('Dump '.$crstype.' DOCS to Construction Space')."\")'>".&mt('Dump '.$crstype.' DOCS to Construction Space')."</a>";
 	return $link.' '.
 	    &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs').'<br />';
     } else {
 	return '<div>'.
-     &mt('Dump '.$type.
+     &mt('Dump '.$crstype.
 	 ' DOCS to Construction Space: available on other servers').
 	 '</div>';
     }
@@ -141,10 +142,10 @@ sub clean {
 
 sub dumpcourse {
     my ($r) = @_;
-    my $type = &Apache::loncommon::course_type();
-    $r->print(&Apache::loncommon::start_page('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 '.$type.' DOCS to Construction Space'));
+    $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'};
@@ -255,14 +256,14 @@ sub dumpcourse {
 	$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>');
     }
 }
 
 
 
 sub exportbutton {
-    my $type = &Apache::loncommon::course_type();
+    my $crstype = &Apache::loncommon::course_type();
     return "<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"exportcourse\", \"".&mt('IMS Export')."\")'>".&mt('IMS Export')."</a>".
     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'<br />';
 }
@@ -271,18 +272,28 @@ sub exportbutton {
 
 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 $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {
-        $r->print(&Apache::loncommon::start_page('Export '.$type.' to IMS Package').
+        $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package').
                   '<h2>'.&mt('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'});
+                  '<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);
@@ -353,7 +364,7 @@ sub exportcourse {
                           .'</a></p>';
             }
         }
-        $r->print(&Apache::loncommon::start_page('Export '.$type.' to IMS 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());
@@ -361,7 +372,7 @@ sub exportcourse {
         my $display;
         $display = '<form name="exportdoc" action="" method="post">'."\n";
         $display .= '<p>'
-                   .&mt('Choose which items you wish to export from your '.$type.'.')
+                   .&mt('Choose which items you wish to export from your '.$crstype.'.')
                    .'</p>';
         $display .= '<div class="LC_columnSection"><fieldset>'.
                     '<legend>'.&mt('Content items').'</legend>'.
@@ -507,7 +518,7 @@ function containerCheck(item) {
 // ]]>
 </script>
         |;
-	$r->print(&Apache::loncommon::start_page('Export '.$type.' to IMS Package',
+	$r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package',
 						 $scripttag));
 	$r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export'));
 	$r->print($display.
@@ -998,7 +1009,7 @@ sub group_import {
 }
 
 sub breadcrumbs {
-    my ($allowed,$type)=@_;
+    my ($allowed,$crstype)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     my (@folders);
     if ($env{'form.pagepath'}) {
@@ -1041,7 +1052,7 @@ sub breadcrumbs {
             if ($3) { $isencrypted=1; }
 	    if ($4 ne '') { $is_random_order = 1; }
             if ($folder eq 'supplemental') {
-                $name = &mt('Supplemental '.$type.' Documents');
+                $name = &mt('Supplemental '.$crstype.' Documents');
             }
 	    &Apache::lonhtmlcommon::add_breadcrumb(
 		      {'href'=>$url.$cpinfo,
@@ -1497,7 +1508,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';
 
@@ -1515,7 +1526,7 @@ sub editor {
     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order);
     if ($allowed) {
         ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
-	    &breadcrumbs($allowed,$type);
+	    &breadcrumbs($allowed,$crstype);
         $r->print($breadcrumbtrail);
     } else {
         $randompick = -1;
@@ -1636,7 +1647,7 @@ sub editor {
         unless ($name) {  $name=(split(/\//,$url))[-1]; }
         unless ($name) { $idx++; next; }
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
-                              $coursenum);
+                              $coursenum,$crstype);
         $idx++;
         $shown++;
     }
@@ -1804,7 +1815,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)) {
 	($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);
@@ -2067,12 +2078,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>
     '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'
   </td>
   <td>
-    '.($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(
@@ -2220,7 +2237,7 @@ List Symbs
 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();
@@ -2229,7 +2246,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()) {
@@ -2243,11 +2260,11 @@ sub list_symbs {
 
 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=();
@@ -2256,7 +2273,7 @@ sub verifycontent {
        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.': ').
+			 &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 />'));
 	   }
@@ -2279,9 +2296,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='';
@@ -2342,7 +2359,7 @@ 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 my $key (keys(%hash)) {
 	    if ($key=~/^ids\_(\/res\/.+)$/) {
@@ -2387,7 +2404,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',
@@ -2396,9 +2413,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');
@@ -2445,7 +2462,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};
@@ -2462,7 +2479,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;
@@ -2582,7 +2599,7 @@ 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'});
@@ -2600,8 +2617,17 @@ sub handler {
     &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();
 
+    my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
+    if ($coursedom =~ /^\w+citest$/) {
+        my $coursenum = $env{'course.'.$env{'request.course.id'}.'.num'};
+        my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+        if ($allowed) {
+            &concept_test_builder($r,$coursedom,$coursenum);
+            return OK;
+        }
+    }
 
 # --------------------------------------------- Initialize help topics for this
     foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
@@ -2666,7 +2692,12 @@ sub handler {
         &Apache::loncommon::restore_course_settings('docs_folderpath',
                                               {'folderpath' => 'scalar'});
     }
-    if (!$env{'form.folderpath'}) {
+    if (!$allowed) {
+        unless($env{'form.folderpath'} =~ /^supplemental/) {
+            $env{'form.folderpath'} = '';
+        }
+    }
+    if (!$env{'form.folderpath'} && $allowed) {
         &Apache::loncommon::restore_course_settings('docs_folderpath',
                                               {'pagepath' => 'scalar'});
     }
@@ -2675,7 +2706,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',
@@ -2698,7 +2729,9 @@ sub handler {
     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
        $showdoc='/'.$1;
     }
-    unless ($showdoc) { # got called from remote
+    if ($showdoc) { # got called in sequence from course
+	$allowed=0; 
+    } else {
        if (($env{'form.folder'}=~/^(?:group|default)_/) ||
           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
            $forcestandard = 1;
@@ -2709,8 +2742,6 @@ sub handler {
          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
          $script=&Apache::lonratedt::editscript('simple');
        }
-    } else { # got called in sequence from course
-       $allowed=0;
     }
 
 # subroutine to list form elements
@@ -2760,22 +2791,25 @@ sub create_form_ul {
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($allowed) {
         &Apache::lonhtmlcommon::add_breadcrumb({
-            href=>"/adm/coursedocs",text=>"$type Editor"});
+            href=>"/adm/coursedocs",text=>"$crstype Editor"});
 
-        $r->print(&Apache::loncommon::start_page("$type Editor", $script,
+        $r->print(&Apache::loncommon::start_page("$crstype Editor", $script,
                                                  {'force_register' => $showdoc,})
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')
                  .&Apache::lonhtmlcommon::breadcrumbs(
-                     'Editing the Table of Contents for your '.$type,
+                     'Editing the Table of Contents for your '.$crstype,
                      'Docs_Adding_Course_Doc')
         );
+    } elsif ($showdoc) {
+        $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
+                                                {'force_register' => $showdoc,}));
     } else {
         my $folder=$env{'form.folder'};
         if ($folder eq '' || $folder eq 'supplemental') {
             $env{'form.folderpath'} = 'supplemental&'.
-                                      &escape(&mt('Supplemental '.$type.' Documents'));
+                                      &escape(&mt('Supplemental '.$crstype.' Documents'));
         }
-        my ($breadcrumbtrail) = &breadcrumbs($allowed,$type);
+        my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype);
         $r->print(&Apache::loncommon::start_page("Supplemental documents").
                   $breadcrumbtrail);
     }
@@ -2870,8 +2904,8 @@ sub create_form_ul {
   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',
 		'copm' => 'All documents out of a published map into this folder',
                 'upld' => 'Upload Document',
@@ -2948,9 +2982,9 @@ FUFORM
 	<input type="hidden" name="active" value="bb" />
 SEDFFORM
 	my @simpleeditdefaultforma = ( 
-	{ '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/src.png" alt="pic03" />' => "$uploadtag<a onclick='javascript:groupsearch()'>$lt{'srch'}</a>" },
-	{ '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/res.png" alt="pic04" />' => "<a onclick='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
-	{ '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/vbkm.png" alt="pic05" />' => "<a onclick='javascript:groupopen(0,1,1);'>$lt{'book'}</a>" },
+	{ '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/src.png" alt="'.&mt('Search').'" />' => "$uploadtag<a onclick='javascript:groupsearch()'>$lt{'srch'}</a>" },
+	{ '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/res.png" alt="'.&mt('Import').'" />' => "<a onclick='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
+	{ '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/vbkm.png" alt="'.&mt('Import Bookmarks').'" />' => "<a onclick='javascript:groupopen(0,1,1);'>$lt{'book'}</a>" },
 	);
 	$simpleeditdefaultform .= create_form_ul(create_list_elements(@simpleeditdefaultforma));
 	$simpleeditdefaultform .=(<<SEDFFORM);
@@ -2988,7 +3022,7 @@ ERFORM
 	   if ($env{'form.folder'} eq '' ||
 	       $env{'form.folder'} eq 'supplemental') {
 	       $folderpath='default&'.
-		   &escape(&mt('Main '.$type.' Documents'));
+		   &escape(&mt('Main '.$crstype.' Documents'));
 	   }
        }
        unless ($env{'form.pagepath'}) {
@@ -3013,7 +3047,16 @@ HIDDENFORM
  
     my $activeClass = 1;
     my $active = '';
-
+    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) {
         $r->print('<ul class="LC_TabContentBigger" id="mainnav">');
         if (($standard) && ($allowed) && (!$forcesupplement) && (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'}eq"" || ($env{'form.pagepath'}))) {
@@ -3022,14 +3065,14 @@ HIDDENFORM
 	        $activeClass = 0;
 	    }
         }
-        $r->print('<li '.$active.' onclick="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.&mt('Main Course Documents').'</b></a></li>');
+        $r->print('<li '.$active.' onclick="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'main'}{$crstype}.'</b></a></li>');
         $active = '';
         if (!$forcestandard || ($env{'form.folderpath'}=~/^supplemental/)) {
             if($activeClass == 1){
                 $active = 'class="active"';
             }
         }
-        $r->print('<li '.$active.' onclick="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.&mt('Supplemental Course Documents').'</b></a></li>');
+        $r->print('<li '.$active.' onclick="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'supplemental'}{$crstype}.'</b></a></li>');
         $r->print('</ul>');
     } else {
         $r->print('<br />');
@@ -3048,7 +3091,7 @@ HIDDENFORM
        if ($folder eq '' || $folder=~/^supplemental/) {
            $folder='default';
 	   $savefolderpath = $env{'form.folderpath'};
-	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
+	   $env{'form.folderpath'}='default&'.&escape($tabtitles{'main'}{$crstype});
            $uploadtag = '<input type="hidden" name="folderpath" value="'.
 	       &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }
@@ -3231,37 +3274,37 @@ NSYLFORM
 	</form>
 NGFFORM
 	@specialdocumentsforma=(
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/page.png" alt="pic06" />'=>$newpageform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/syllabus.png" alt="pic07" />'=>$newsylform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/groupportfolio.png" alt="pic08" />'=>$newgroupfileform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/page.png" alt="'.&mt('New Composite Page').'" />'=>$newpageform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/syllabus.png" alt="'.&mt('Syllabus').'" />'=>$newsylform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/groupportfolio.png" alt="'.&mt('Group Portfolio').'" />'=>$newgroupfileform},
 	); 
 	
       }
-	push @specialdocumentsforma, ({'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/navigation.png" alt="pic09" />'=>$newnavform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simple.png" alt="pic10" />'=>$newsmppageform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simpprob.png" alt="pic11" />'=>$newsmpproblemform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/dropbox.png" alt="pic12" />'=>$newdropboxform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/scoreupfrm.png" alt="pic13" />'=>$newexuploadform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/bchat.png" alt="pic14" />'=>$newbulform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/myaboutme.png" alt="pic15" />'=>$newaboutmeform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/aboutme.png" alt="pic16" />'=>$newaboutsomeoneform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/chrt.png" alt="pic17" />'=>$newrosterform},);
+	push @specialdocumentsforma, ({'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/navigation.png" alt="'.&mt('Navigate Contents').'" />'=>$newnavform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simple.png" alt="'.&mt('Simple Course Page').'" />'=>$newsmppageform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simpprob.png" alt="'.&mt('Simple Problem').'" />'=>$newsmpproblemform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/dropbox.png" alt="'.&mt('Drop Box').'" />'=>$newdropboxform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" />'=>$newexuploadform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/bchat.png" alt="'.&mt('Discussion Board').'" />'=>$newbulform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/myaboutme.png" alt="'.&mt('My Personal Information Page').'" />'=>$newaboutmeform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/aboutme.png" alt="'.&mt('Personal Information Page for a User').'" />'=>$newaboutsomeoneform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/chrt.png" alt="'.&mt('Course Roster').'" />'=>$newrosterform},);
 
 	$specialdocumentsform = create_form_ul(create_list_elements(@specialdocumentsforma));
 
 if($env{'form.pagepath'}) {
 	
 	@specialdocumentsforma=(
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simpprob.png" alt="pic32" />'=>$newsmpproblemform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/scoreupfrm.png" alt="pic33" />'=>$newexuploadform}
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simpprob.png" alt="'.&mt('Simple Problem').'" />'=>$newsmpproblemform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" />'=>$newexuploadform}
 	);
 	$specialdocumentsform= create_form_ul(create_list_elements(@specialdocumentsforma));
 }
 
 my @tools = (
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="pic18" />'=>$extresourcesform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="pic19" />'=>$imspform},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/recover.png" alt="pic20" />'=>$recoverform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.&mt('External Resource').'" />'=>$extresourcesform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="'.&mt('IMS Import').'" />'=>$imspform},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/recover.png" alt="'.&mt('Recover Deleted Resources').'" />'=>$recoverform},
 	);
 
 my %orderhash = (
@@ -3272,9 +3315,8 @@ my %orderhash = (
 		'dd' => ['Tools', create_form_ul(create_list_elements(@tools)).&generate_admin_options($containertag,$uploadtag,\%help,\%env)],
                 );
 my $tid='1';
-my $varcd = 'Main Course Documents';
  $hadchanges=0;
-        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>');
        }
@@ -3283,7 +3325,7 @@ my $varcd = 'Main Course Documents';
        }
 
        &changewarning($r,'');
-$r->print(&generate_edit_table($tid,$varcd,\%orderhash));
+$r->print(&generate_edit_table($tid,\%orderhash));
 
 $r->print('</div>');
 	}
@@ -3302,7 +3344,7 @@ $r->print('</div>');
        if ($folder =~ /^supplemental$/ &&
 	   (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
           $env{'form.folderpath'} = 'supplemental&'.
-                                    &escape(&mt('Supplemental '.$type.' Documents'));
+                                    &escape(&mt('Supplemental '.$crstype.' Documents'));
        } elsif ($allowed) {
 	  $env{'form.folderpath'} = $savefolderpath;
        }
@@ -3377,9 +3419,9 @@ SNAMFORM
 
 
 my @specialdocs = (
-		{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="pic29" />'=>$supnewextform},
-		{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/syllabus.png" alt="pic30" />'=>$supnewsylform},
-		{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/myaboutme.png" alt="pic31" />'=>$supnewaboutmeform},
+		{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.&mt('External Resource').'" />'=>$supnewextform},
+		{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/syllabus.png" alt="'.&mt('Syllabus').'" />'=>$supnewsylform},
+		{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/myaboutme.png" alt="'.&mt('My Personal Information Page').'" />'=>$supnewaboutmeform},
 		);
 my %suporderhash = (
 		'00' => ['Supnewfolder', $supnewfolderform],
@@ -3387,15 +3429,14 @@ my %suporderhash = (
                 'ff' => ['Special Documents',create_form_ul(create_list_elements(@specialdocs))]
                 );
 
-        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>');
         }
         my $tid='2';
-        my $varscd = 'Supplemental Course Documents';
-        $r->print(&generate_edit_table($tid,$varscd,\%suporderhash));
+        $r->print(&generate_edit_table($tid,\%suporderhash));
     } else {
-        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>');
         }
@@ -3442,15 +3483,15 @@ sub generate_admin_options {
   my $dumpbut=&dumpbutton();
   my $exportbut=&exportbutton();
   my @list = (
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/verify.png" alt="pic21" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/resversion.png" alt="pic22" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/verify.png" alt="'.&mt('Verify Content').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/resversion.png" alt="'.&mt('Check/Set Resource Versions').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"},
 	);
   if($dumpbut ne ''){
-  push @list, {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/dump.png" alt="pic23" />'=>$dumpbut};
+  push @list, {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/dump.png" alt="'.&mt('Dump Course DOCS to Construction Space: available on other servers').'" />'=>$dumpbut};
   }
-  push @list, ({'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/imsexport.png" alt="pic24" />'=>$exportbut},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/symbs.png" alt="pic25" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"listsymbs\", \"$lt{'ls'}\")'>$lt{'ls'}</a><input type='hidden' name='folder' value='$env{'form.folder'}' />"},
-	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/log.png" alt="pic26" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"},
+  push @list, ({'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/imsexport.png" alt="'.&mt('IMS Export').'" />'=>$exportbut},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/symbs.png" alt="'.&mt('List Symbs').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"listsymbs\", \"$lt{'ls'}\")'>$lt{'ls'}</a><input type='hidden' name='folder' value='$env{'form.folder'}' />"},
+	{'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/log.png" alt="'.&mt('Show Log').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"},
 	);
   return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.create_form_ul(create_list_elements(@list)).'</form>';
 
@@ -3458,7 +3499,8 @@ sub generate_admin_options {
 
 
 sub generate_edit_table {
-    my ($tid,$varcd,$orderhash_ref) = @_;
+    my ($tid,$orderhash_ref) = @_;
+    return unless(ref($orderhash_ref) eq 'HASH');
     my %orderhash = %{$orderhash_ref};
     my $form;
     my $activetab;
@@ -3500,6 +3542,74 @@ sub generate_edit_table {
     return $form;
 }
 
+sub concept_test_builder {
+    my ($r,$cdom,$cnum) = @_;
+    &Apache::londocsgci::setdefaults($cdom);
+    if ($env{'form.context'} eq 'requestcrs') {
+        if ($env{'form.phase'} eq 'storemap') {
+            &Apache::londocsgci::evaluate();
+            my $error = &Apache::londocsgci::store('requestcrs',$cdom,$cnum);
+            my $output = '<p>';
+            if ($error) {
+                $output .= '<span class="LC_error">'.
+                           &mt('An error occurred saving your concept test: [_1].',$error).
+                           '</span>';
+            } else {
+                &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+                $output .= &mt('Your concept test has been saved.');
+            }
+            $output .= '</p>';
+            if (&Apache::lonrequestcourse::generate_page($r,'new','chooseitems')) {
+                my $formname = 'requestcrs';
+                $r->print('<br /><form name="'.$formname.'" method="post" action="/adm/requestcourse">');
+                my $title = &mt('Concept Test Created'); 
+                &Apache::lonrequestcourse::roster_upload_form($r,$output,$formname,$title);
+            }
+            $r->print(&Apache::loncommon::end_page());
+            return;
+        }
+    }
+    my $js = '
+<script type="text/javascript">
+// <![CDATA[
+'.
+&Apache::londocsgci::builder_javascript($cdom).
+'
+// ]]>
+</script>
+';
+    $r->print(&Apache::loncommon::start_page('Assemble Test',$js));
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>'/adm/coursedocs',
+              text=>"Assemble Test"});
+    if ($env{'form.phase'} eq 'storemap') {
+        &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>'/adm/coursedocs?phase=storemap',
+              text=>"Validate Test"});
+        &Apache::londocsgci::evaluate();
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs
+                  ('Build Concept Test','Concept_Test_Assembly'));
+        $r->print(&Apache::londocsgci::store('edit',$cdom,$cnum));
+    } elsif ($env{'form.phase'} eq 'storeparms') {
+        &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>'/adm/coursedocs?phase=storeparms',
+              text=>"Set Availability"});
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs
+                  ('Build Concept Test','Concept_Test_Assembly'));
+        $r->print(&Apache::londocsgci::store_dates_parms($cdom,$cnum));
+        $r->print(&Apache::loncommon::end_page());
+        return;
+    } else {
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs
+                  ('Build Concept Test','Concept_Test_Assembly'));
+    }
+    &Apache::londocsgci::load($cdom);
+    &Apache::londocsgci::listresources($r,'edit',$cdom,$cnum);
+    $r->print(&Apache::loncommon::end_page());
+    return;
+}
+
 sub editing_js {
     my ($udom,$uname) = @_;
     my $now = time();