--- loncom/interface/londocs.pm	2018/01/12 01:54:56	1.650
+++ loncom/interface/londocs.pm	2020/08/27 16:21:35	1.673
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.650 2018/01/12 01:54:56 raeburn Exp $
+# $Id: londocs.pm,v 1.673 2020/08/27 16:21:35 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -46,6 +46,7 @@ use Apache::lonsimplepage();
 use Apache::lonhomework();
 use Apache::lonpublisher();
 use Apache::lonparmset();
+use Apache::loncourserespicker();
 use HTML::Entities;
 use HTML::TokeParser;
 use GDBM_File;
@@ -1216,13 +1217,19 @@ sub update_paste_buffer {
 # Construct identifiers for current contents of user's paste buffer
     if (@currpaste) {
         foreach my $suffix (@currpaste) {
-             my $cid = $env{'docs.markedcopy_crs_'.$suffix};
-             my $url = $env{'docs.markedcopy_url_'.$suffix};
-             my $mapidx = $env{'docs.markedcopy_map_'.$suffix};
-             if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
-                 ($url ne '')) {
-                 $pasteurls{$cid.'_'.$url.'_'.$mapidx} = 1;
-             }
+            my $cid = $env{'docs.markedcopy_crs_'.$suffix};
+            my $url = $env{'docs.markedcopy_url_'.$suffix};
+            my $mapidx = $env{'docs.markedcopy_map_'.$suffix};
+            if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
+                ($url ne '')) {
+                if ($url eq '/res/lib/templates/simpleproblem.problem') {
+                    $pasteurls{$cid.'_'.$mapidx} = 1;
+                } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {
+                    $pasteurls{$url} = 1;
+                } else {
+                    $pasteurls{$cid.'_'.$url} = 1;
+                }
+            }
         }
     }
 
@@ -1231,7 +1238,7 @@ sub update_paste_buffer {
 
     my @pathitems = split(/\&/,$env{'form.folderpath'});
     my @folderconf = split(/\:/,$pathitems[-1]);
-    my $ispage = $folderconf[4];
+    my $ispage = $folderconf[5];
 
     foreach my $item (@possibles) {
         my ($orderidx,$cmd) = split(/:/,$item);
@@ -1244,7 +1251,13 @@ sub update_paste_buffer {
                                           $env{'form.folderpath'},\%curr_groups);
         next if ($denied{'copy'});
         $url=~s{http(:|:)//https(:|:)//}{https$2//};
-        next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));
+        if ($url eq '/res/lib/templates/simpleproblem.problem') {
+            next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));
+        } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {
+            next if (exists($pasteurls{$url}));
+        } else {
+            next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));
+        }
         my ($suffix,$errortxt,$locknotfreed) =
             &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');
         if ($suffix ne '') {
@@ -1789,7 +1802,7 @@ sub do_paste_from_buffer {
     %msgs = &Apache::lonlocal::texthash (
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
-                notindom  => 'Paste failed: Item is an external tool from a course in a different donain.', 
+                notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
             );
 
@@ -1818,14 +1831,7 @@ sub do_paste_from_buffer {
 # Retrieve information about all course maps in main content area 
 
     my $allmaps = {};
-    if ($folder =~ /^default/) {
-        $allmaps =
-            &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
-                                                 $env{"course.$env{'request.course.id'}.home"},
-                                                 $env{'request.course.id'});
-    }
-
-    my (@toclear,%mapurls,%lockerrs,%msgerrs,%results);
+    my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk);
 
 # Loop over the items to paste
     foreach my $suffix (@dopaste) {
@@ -1843,6 +1849,13 @@ sub do_paste_from_buffer {
         if ($is_map{$suffix}) {
 # If pasting a map, check if map contains other maps
             my (%hierarchy,%titles);
+            if (($folder =~ /^default/) && (!$donechk)) {
+                $allmaps =
+                    &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
+                                                         $env{"course.$env{'request.course.id'}.home"},
+                                                         $env{'request.course.id'});
+                $donechk = 1;
+            }
             &contained_map_check($url,$folder,$coursenum,$coursedom,
                                  \%removefrommap,\%removeparam,\%addedmaps,
                                  \%hierarchy,\%titles,$allmaps);
@@ -1908,7 +1921,7 @@ sub do_paste_from_buffer {
                          cnum => $coursenum,
                        );
             if ($prefix eq 'ext.tool') {
-                if ($prefixchg{$suffix} eq 'docstosupp') { 
+                if ($prefixchg{$suffix} eq 'docstosupp') {
                     $info{'delgradable'} = 1;
                 }
             }
@@ -2004,7 +2017,7 @@ sub do_paste_from_buffer {
                                           $coursedom,$coursenum,$template,$newidx,"$folder.$container");
                 }
             } elsif ($url =~ /ext\.tool$/) {
-                if (($newidx) && ($folder=~/^default/)) { 
+                if (($newidx) && ($folder=~/^default/)) {
                     my $marker = (split(m{/},$url))[4];
                     my %toolsettings = &Apache::lonnet::dump('exttool_'.$marker,$coursedom,$coursenum);
                     my $val = 'no';
@@ -2328,7 +2341,9 @@ sub copy_templated_files {
         my @simpleprobqtypes = qw(radio option string essay numerical);
         my $qtype=$srcparms{$srcprefix.'questiontype'};
         if (grep(/^\Q$qtype\E$/,@simpleprobqtypes)) {
-            my %newdata;
+            my %newdata = (
+                $newprefix.'questiontype' => $qtype,
+            );
             foreach my $type (@simpleprobqtypes) {
                 if ($type eq $qtype) {
                     $newdata{"$weightprefix.$type.weight"}=1;
@@ -2557,7 +2572,7 @@ sub url_paste_fixups {
                 my $rem = $3;
                 my ($is_exttool,$exttoolchg);
                 if ($rem =~ m{\d+/ext\.tool$}) {
-                    $is_exttool = 1;     
+                    $is_exttool = 1;
                 }
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$id} = $ressrc;
@@ -2802,9 +2817,7 @@ sub apply_fixups {
                 }
             }
             if (ref($resdatacopy{$key}) eq 'HASH') {
-                if ($newsubdir{$key}) {
-
-                }
+                my ($gotnewmapname,$newmapname,$srcfolder,$srccontainer);
                 foreach my $idx (keys(%{$resdatacopy{$key}})) {
                     if (ref($resdatacopy{$key}{$idx}) eq 'HASH') {
                         my $srcurl = $resdatacopy{$key}{$idx}{'src'};
@@ -2814,15 +2827,18 @@ sub apply_fixups {
                                 ($resdatacopy{$key}{$idx}{'cnum'} =~ /^$match_courseid$/)) {
                                 my $srcdom = $resdatacopy{$key}{$idx}{'cdom'};
                                 my $srcnum = $resdatacopy{$key}{$idx}{'cnum'};
-                                my ($newmapname) = ($key =~ m{/([^/]+)$});
-                                my ($srcfolder,$srccontainer) = split(/\./,$newmapname);
+                                unless ($gotnewmapname) {
+                                    ($newmapname) = ($key =~ m{/([^/]+)$});
+                                    ($srcfolder,$srccontainer) = split(/\./,$newmapname);
+                                    if ($newsubdir{$key}) {
+                                        $newmapname =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
+                                    }
+                                    $gotnewmapname = 1;
+                                }
                                 my $srcmapinfo = $srcfolder.':'.$idx;
                                 if ($srccontainer eq 'page') {
                                     $srcmapinfo .= ':1';
                                 }
-                                if ($newsubdir{$key}) {
-                                    $newmapname =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
-                                }
                                 &copy_templated_files($srcurl,$srcdom,$srcnum,$srcmapinfo,$cdom,
                                                       $cnum,$template,$idx,$newmapname);
                             }
@@ -4141,11 +4157,19 @@ END
     my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);
     my $orig_url = $url;
     $orig_url=~s{http(:|:)//https(:|:)//}{https$2//};
-    $url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/};
+    if ($container eq 'page') {
+        $url=~s{^http(|s)(:|:)//}{/ext/};
+    } else {
+        $url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/};
+    }
     if (!$supplementalflag && $residx && $symb) {
         if ((!$isfolder) && (!$ispage)) {
 	    (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
-	    $url=&Apache::lonnet::clutter($url);
+            if (($url =~ m{^ext/}) && ($container eq 'page')) {
+                $url=&Apache::lonnet::clutter_with_no_wrapper($url);
+            } else {
+                $url=&Apache::lonnet::clutter($url);
+            } 
 	    if ($url=~/^\/*uploaded\//) {
 	        $url=~/\.(\w+)$/;
 	        my $embstyle=&Apache::loncommon::fileembstyle($1);
@@ -4159,7 +4183,7 @@ END
 	    } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {
                 my $wrapped = $1;
                 my $exturl = $2;
-                if ($wrapped eq '') {
+                if (($wrapped eq '') && ($container ne 'page')) { 
                     $url='/adm/wrapper'.$url;
                 }
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {
@@ -4170,19 +4194,18 @@ END
             } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {
                 if (($ENV{'SERVER_PORT'} == 443) &&
                     ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
-                    $url .= '?usehttp=1';
+                    unless (&Apache::lonnet::uses_sts()) {
+                        $url .= '?usehttp=1';
+                    }
                     $nomodal = 1;
                 }
             }
             if (&Apache::lonnet::symbverify($symb,$url)) {
                 my $shownsymb = $symb;
                 if ($isexternal) {
-                    if ($url =~ /^([^#]+)#([^#]+)$/) {
-                        $url = $1;
-                        $anchor = $2;
-                        if ($symb =~ m{^([^#]+)\Q#$anchor\E$}) {
-                            $shownsymb = $1.&escape('#').$anchor;
-                        }
+                    $url =~ s/\#[^#]+$//;
+                    if ($container eq 'page') {
+                        $url = &Apache::lonnet::clutter($url);
                     }
                 }
                 unless ($env{'request.role.adv'}) {
@@ -4236,8 +4259,11 @@ END
                 $url = $1;
                 $anchor = $2;
                 if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {
-                    if ($hostname ne '') {
-                        $url = 'http://'.$hostname.$url;
+                    unless (&Apache::lonnet::uses_sts()) {
+                        if ($hostname ne '') {
+                            $url = 'http://'.$hostname.$url;
+                        }
+                        $url .= (($url =~ /\?/) ? '&':'?').'usehttp=1';
                     }
                     $nomodal = 1;
                 }
@@ -4245,10 +4271,12 @@ END
         } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {
             if (($ENV{'SERVER_PORT'} == 443) &&
                 ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
-                if ($hostname ne '') {
-                    $url = 'http://'.$hostname.$url;
+                unless (&Apache::lonnet::uses_sts()) {
+                    if ($hostname ne '') {
+                        $url = 'http://'.$hostname.$url;
+                    }
+                    $url .= (($url =~ /\?/) ? '&':'?').'usehttp=1';
                 }
-                $url .= (($url =~ /\?/) ? '&':'?').'usehttp=1';
                 $nomodal = 1;
             }
         }
@@ -4429,8 +4457,7 @@ $form_end;
        } else {
            $link = $url;
        }
-       $link = &js_escape($link.(($url=~/\?/)?'&':'?').'inhibitmenu=yes'.
-                                               (($anchor ne '')?$anchor:''));
+       $link = &js_escape($link.(($url=~/\?/)?'&':'?').'inhibitmenu=yes'.$anchor);
        if ($nomodal) {
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.
                   '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>';
@@ -4812,6 +4839,48 @@ sub list_symbs {
     $r->print(&endContentScreen());
 }
 
+sub short_urls {
+    my ($r,$canedit) = @_;
+    my $crstype = &Apache::loncommon::course_type();
+    my $formname = 'shortenurl';
+    $r->print(&Apache::loncommon::start_page('Display/Set Shortened URLs'));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Shortened URLs'));
+    $r->print(&startContentScreen('tools'));
+    my ($navmap,$errormsg) =
+        &Apache::loncourserespicker::get_navmap_object($crstype,'shorturls');
+    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+    my (%maps,%resources,%titles);
+    if (!ref($navmap)) {
+        $r->print($errormsg.
+                  &endContentScreen());
+        return '';
+    } else {
+        $r->print('<h4 class="LC_info">'.&mt('Tiny URLs for deep-linking into course').'</h4>'."\n");
+        $r->rflush();
+        my $readonly;
+        if ($canedit) {
+            my ($numnew,$errors) = &Apache::loncommon::get_requested_shorturls($cdom,$cnum,$navmap);
+            if ($numnew) {
+                $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');
+            }
+            if ((ref($errors) eq 'ARRAY') && (@{$errors} > 0)) {
+                $r->print(&mt('The following errors occurred when processing your request to create shortened URLs:').'<br /><ul>');
+                foreach my $error (@{$errors}) {
+                    $r->print('<li>'.$error.'</li>');
+                }
+                $r->print('</ul><br />');
+            }
+        } else {
+            $readonly = 1;
+        }
+        my %currtiny = &Apache::lonnet::dump('tiny',$cdom,$cnum);
+        $r->print(&Apache::loncourserespicker::create_picker($navmap,'shorturls',$formname,$crstype,undef,
+                                                             undef,undef,undef,undef,undef,\%currtiny,$readonly));
+    }
+    $r->print(&endContentScreen());
+}
+
 sub contentverifyform {
     my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();
@@ -5182,13 +5251,17 @@ sub changewarning {
     if (!defined($message)) {
 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
     }
+    my $windowname = 'loncapaclient';
+    if ($env{'request.lti.login'}) {
+        $windowname .= 'lti';
+    }
     $r->print("\n\n".
 '<script type="text/javascript">'."\n".
 '// <![CDATA['."\n".
 'function reinit(tf) { tf.submit();'.$postexec.' }'."\n".
 '// ]]>'."\n".
 '</script>'."\n".
-'<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
+'<form name="reinitform" method="post" action="/adm/roles" target="'.$windowname.'">'.
 '<input type="hidden" name="orgurl" value="'.$url.
 '" /><input type="hidden" name="selectrole" value="1" /><p class="LC_warning">'.
 &mt($message,' <input type="hidden" name="'.
@@ -5347,6 +5420,9 @@ sub handler {
   } elsif ($allowed && $env{'form.listsymbs'}) {
       &init_breadcrumbs('listsymbs','List Content IDs');
       &list_symbs($r);
+  } elsif ($allowed && $env{'form.shorturls'}) {
+      &init_breadcrumbs('shorturls','Set/Display Shortened URLs','Docs_Short_URLs');
+      &short_urls($r,$canedit);
   } elsif ($allowed && $env{'form.docslog'}) {
       &init_breadcrumbs('docslog','Show Log');
       my $folder = $env{'form.folder'};
@@ -5410,6 +5486,8 @@ sub handler {
                       $r->internal_redirect($redirect);
                       return OK;
                   }
+              } else {
+                  $r->internal_redirect($redirect);
               }
           }
       }
@@ -5577,7 +5655,7 @@ sub handler {
             undef($env{'form.folderpath'});
         } else {
             $folderurl = "uploaded/$coursedom/$coursenum/$folder";
-            if ((split(/\:/,$pathitems[-1]))[4]) {
+            if ((split(/\:/,$pathitems[-1]))[5]) {
                 $folderurl .= '.page';
             } else {
                 $folderurl .= '.sequence';
@@ -5671,7 +5749,7 @@ sub handler {
             my $tid = 1;
             my @tabids;
             if ($supplementalflag) {
-                @tabids = ('002','ee2','ff2');
+                @tabids = ('002','dd2','ee2','ff2');
                 $tid = 2;
             } else {
                 @tabids = ('aa1','bb1','cc1','ff1');
@@ -5910,8 +5988,8 @@ sub handler {
 	my $fileupload=(<<FIUP);
         $quotainfo
 	$lt{'file'}:<br />
-	<input type="file" name="uploaddoc" class="flUpload" size="40" $disabled />
-        <input type="hidden" id="free_space" value="$free_space" />
+	<input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled />
+        <input type="hidden" id="LC_free_space" value="$free_space" />
 FIUP
 
 	my $checkbox=(<<CHBO);
@@ -6107,9 +6185,13 @@ HIDDENFORM
        }
        my $postexec='';
        if ($folder eq 'default') {
+           my $windowname = 'loncapaclient';
+           if ($env{'request.lti.login'}) {
+               $windowname .= 'lti';
+           }
            $r->print('<script type="text/javascript">'."\n"
                     .'// <![CDATA['."\n"
-                    .'this.window.name="loncapaclient";'."\n"
+                    .'this.window.name="'.$windowname.'";'."\n"
                     .'// ]]>'."\n"
                     .'</script>'."\n"
        );
@@ -6122,7 +6204,7 @@ HIDDENFORM
 
 	my $newnavform=(<<NNFORM);
 	<form action="/adm/coursedocs" method="post" name="newnav">
-	<input type="hidden" name="active" value="ee" />
+	<input type="hidden" name="active" value="ff" />
 	$pathitem
 	<input type="hidden" name="importdetail" 
 	value="$lt{'navc'}=/adm/navmaps" />
@@ -6132,7 +6214,7 @@ HIDDENFORM
 NNFORM
 	my $newsmppageform=(<<NSPFORM);
 	<form action="/adm/coursedocs" method="post" name="newsmppg">
-	<input type="hidden" name="active" value="ee" />
+	<input type="hidden" name="active" value="ff" />
 	$pathitem
 	<input type="hidden" name="importdetail" value="" />
 	<a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>
@@ -6142,7 +6224,7 @@ NSPFORM
 
 	my $newsmpproblemform=(<<NSPROBFORM);
 	<form action="/adm/coursedocs" method="post" name="newsmpproblem">
-	<input type="hidden" name="active" value="cc" />
+	<input type="hidden" name="active" value="dd" />
 	$pathitem
 	<input type="hidden" name="importdetail" value="" />
 	<a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a>
@@ -6153,7 +6235,7 @@ NSPROBFORM
 
 	my $newdropboxform=(<<NDBFORM);
 	<form action="/adm/coursedocs" method="post" name="newdropbox">
-	<input type="hidden" name="active" value="cc" />
+	<input type="hidden" name="active" value="dd" />
 	$pathitem
 	<input type="hidden" name="importdetail" value="" />
 	<a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a>
@@ -6163,7 +6245,7 @@ NDBFORM
 
 	my $newexuploadform=(<<NEXUFORM);
 	<form action="/adm/coursedocs" method="post" name="newexamupload">
-	<input type="hidden" name="active" value="cc" />
+	<input type="hidden" name="active" value="dd" />
 	$pathitem
 	<input type="hidden" name="importdetail" value="" />
 	<a class="LC_menubuttons_link" href="javascript:makeexamupload();">$lt{'scuf'}</a>
@@ -6173,7 +6255,7 @@ NEXUFORM
 
 	my $newbulform=(<<NBFORM);
 	<form action="/adm/coursedocs" method="post" name="newbul">
-	<input type="hidden" name="active" value="dd" />
+	<input type="hidden" name="active" value="ee" />
 	$pathitem
 	<input type="hidden" name="importdetail" value="" />
 	<a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>
@@ -6183,7 +6265,7 @@ NBFORM
 
 	my $newaboutmeform=(<<NAMFORM);
 	<form action="/adm/coursedocs" method="post" name="newaboutme">
-	<input type="hidden" name="active" value="dd" />
+	<input type="hidden" name="active" value="ee" />
 	$pathitem
 	<input type="hidden" name="importdetail" 
 	value="$plainname=/adm/$udom/$uname/aboutme" />
@@ -6194,7 +6276,7 @@ NAMFORM
 
 	my $newaboutsomeoneform=(<<NASOFORM);
 	<form action="/adm/coursedocs" method="post" name="newaboutsomeone">
-	<input type="hidden" name="active" value="dd" />
+	<input type="hidden" name="active" value="ee" />
 	$pathitem
 	<input type="hidden" name="importdetail" value="" />
 	<a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>
@@ -6203,7 +6285,7 @@ NASOFORM
 
 	my $newrosterform=(<<NROSTFORM);
 	<form action="/adm/coursedocs" method="post" name="newroster">
-	<input type="hidden" name="active" value="dd" />
+	<input type="hidden" name="active" value="ee" />
 	$pathitem
 	<input type="hidden" name="importdetail" 
 	value="$lt{'rost'}=/adm/viewclasslist" />
@@ -6224,7 +6306,7 @@ NROSTFORM
         }
         my $newwebpageform =(<<NWEBFORM);
         <form action="/adm/coursedocs" method="post" name="newwebpage">
-        <input type="hidden" name="active" value="ee" />
+        <input type="hidden" name="active" value="ff" />
         $pathitem
         <input type="hidden" name="importdetail" value="$newwebpage" />
         <a class="LC_menubuttons_link" href="javascript:makewebpage();">$lt{'webp'}</a>
@@ -6407,7 +6489,7 @@ NWEBFORM
         <form action="/adm/coursedocs" method="post" name="courseresform">
         <fieldset id="crsresform" style="display:none;">
         <legend>$lt{'stpr'}</legend>
-        <input type="hidden" name="active" value="ee" />
+        <input type="hidden" name="active" value="bb" />
         <p>
         $pickdir
         <span class="LC_nobreak">$lt{'news'}?&nbsp;
@@ -6495,7 +6577,7 @@ NSYLFORM
 
 	my $newgroupfileform=(<<NGFFORM);
 	<form action="/adm/coursedocs" method="post" name="newgroupfiles">
-	<input type="hidden" name="active" value="dd" />
+	<input type="hidden" name="active" value="ee" />
 	$pathitem
 	<input type="hidden" name="importdetail"
 	value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
@@ -6503,24 +6585,32 @@ NSYLFORM
 	$help{'Group Portfolio'}
 	</form>
 NGFFORM
-	@specialdocumentsforma=(
+        if ($container eq 'page') {
+            @specialdocumentsforma=(
+        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
+            );
+        } else {
+	    @specialdocumentsforma=(
 	{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},
 	{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},
 	{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
-        );
+            );
+        }
         $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
 
-
-        my @importdoc = (
-        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform}
+        my @external = (
+        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleExternal(\'ext\');" />'=>$extresourcesform}
         );
         if (keys(%ltitools)) {
-            push(@importdoc,
-                {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleUpload(\'tool\');" />'=>$exttoolform},
-        );
+            push(@external,
+                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleExternal(\'tool\');" />'=>$exttoolform},
+            );
         }
+        my $externalform = &create_form_ul(&create_list_elements(@external));
+
+        my @importdoc = ();
         unless ($container eq 'page') {
             push(@importdoc,
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform}
@@ -6551,12 +6641,13 @@ NGFFORM
 my %orderhash = (
                 'aa' => ['Upload',$fileuploadform],
                 'bb' => ['Import',$importpubform],
-                'cc' => ['Grading',$gradingform],
+                'cc' => ['External',$externalform],
+                'dd' => ['Grading',$gradingform],
+                'ff' => ['Other',$specialdocumentsform],
                 );
 unless ($container eq 'page') {
     $orderhash{'00'} = ['Newfolder',$newfolderform];
-    $orderhash{'dd'} = ['Collaboration',$communityform];
-    $orderhash{'ee'} = ['Other',$specialdocumentsform];
+    $orderhash{'ee'} = ['Collaboration',$communityform];
 }
 
  $hadchanges=0;
@@ -6692,15 +6783,15 @@ my @specialdocs = (
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage('."'supp'".');" />'=>$supwebpageform},
 
 		);
-my @supimportdoc = (
-		{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'
-            =>$supextform});
+        my @supexternal = (
+            {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleExternal(\'suppext\')" />'
+             =>$supextform});
         if (keys(%ltitools)) {
-            push(@supimportdoc,
-                {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleUpload(\'supptool\')" />'
+            push(@supexternal,
+                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleExternal(\'supptool\')" />'
             =>$supexttoolform});
         }
-        push(@supimportdoc, 
+        my @supimportdoc = (
             {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'suppdoc\');" />'
             =>$supupdocform},
         );
@@ -6708,7 +6799,8 @@ my @supimportdoc = (
 $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));
 my %suporderhash = (
 		'00' => ['Supnewfolder', $supnewfolderform],
-                'ee' => ['Upload',$supupdocform],
+                'dd' => ['Upload',$supupdocform],
+                'ee' => ['External',&create_form_ul(&create_list_elements(@supexternal))],
                 'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]
                 );
         if ($supplementalflag) {
@@ -6936,6 +7028,7 @@ sub generate_admin_menu {
                                          'vc'   => 'Verify Content',
                                          'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',
+                                         'ct'   => 'Display/Set Shortened URLs for Deep-linking',
                                          'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Copy $crstype Content to Authoring Space",
             );
@@ -6986,6 +7079,13 @@ sub generate_admin_menu {
                     icon       => 'symbs.png',
                     linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"
                 },
+                {   linktext   => $lt{'ct'},
+                    url        => "javascript:injectData(document.courseverify,'dummy','shorturls','$lt{'ct'}')",
+                    permission => 'F',
+                    help       => 'Docs_Short_URLs',
+                    icon       => 'shorturls.png',
+                    linktitle  => "Set shortened URLs for a resource or folder in your $lc_crstype for use in deep-linking"
+                },
                 ]
         });
     if ($canedit) {
@@ -7204,14 +7304,21 @@ sub editing_js {
                 if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {
                     if (($ENV{'SERVER_PORT'} == 443) &&
                         ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
-                        if ($hostname ne '') {
-                            $backtourl = 'http://'.$hostname.$backtourl;
+                        unless (&Apache::lonnet::uses_sts()) {
+                            if ($hostname ne '') {
+                                $backtourl = 'http://'.$hostname.$backtourl;
+                            }
+                            $backtourl .= (($backtourl =~ /\?/) ? '&amp;':'?').'usehttp=1';
                         }
-                        $backtourl .= (($backtourl =~ /\?/) ? '&amp;':'?').'usehttp=1';
                     }
                 } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) {
                     if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) {
-                        $backtourl = 'http://'.$hostname.$backtourl;
+                        unless (&Apache::lonnet::uses_sts()) {
+                            if ($hostname ne '') {
+                                $backtourl = 'http://'.$hostname.$backtourl;
+                            }
+                            $backtourl .= (($backtourl =~ /\?/) ? '&amp;':'?').'usehttp=1';
+                        }
                     }
                 }
                 if ($anchor ne '') {
@@ -7230,20 +7337,22 @@ sub editing_js {
         $backtourl = '/adm/navmaps';
     }
 
-    my $fieldsets = "'ext','doc'";
-    if ($posslti) {
-        $fieldsets .= ",'tool'";
-    }
+    my $fieldsets = "'doc'";
     unless ($main_container_page) {
         $fieldsets .=",'ims'";
     }
+    my $extfieldsets = "'ext'";
+    if ($posslti) {
+        $extfieldsets .= ",'tool'";
+    }
     if ($supplementalflag) {
-        $fieldsets = "'suppext','suppdoc'";
+        $fieldsets = "'suppdoc'";
+        $extfieldsets = "'suppext'";
         if ($posslti) {
-            $fieldsets .= ",'supptool'";
+            $extfieldsets .= ",'supptool'";
         }
     }
-    
+
     my $jsmakefunctions;
     if ($canedit) {
         $jsmakefunctions = <<ENDNEWSCRIPT;
@@ -7464,16 +7573,32 @@ function toggleUpload(caller) {
             }
         }
         document.getElementById('upload'+blocks[i]+'form').style.display=disp;
+    }
+    resize_scrollbox('contentscroll','1','1');
+    return;
+}
+
+function toggleExternal(caller) {
+    var blocks = Array($extfieldsets);
+    for (var i=0; i<blocks.length; i++) {
+        var disp = 'none';
+        if (caller == blocks[i]) {
+            var curr = document.getElementById('external'+caller+'form').style.display;
+            if (curr == 'none') {
+                disp='block';
+            }
+        }
+        document.getElementById('external'+blocks[i]+'form').style.display=disp;
         if ((caller == 'tool') || (caller == 'supptool')) {
             if (disp == 'block') {
-                if (document.getElementById('LC_exttoolid')) { 
-                    var toolselector = document.getElementById('LC_exttoolid'); 
+                if (document.getElementById('LC_exttoolid')) {
+                    var toolselector = document.getElementById('LC_exttoolid');
                     var suppflag = 0;
                     if (caller == 'supptool') {
                         suppflag = 1;
                     }
                     currForm = document.getElementById('new'+caller);
-                    updateExttool(toolselector,currForm,suppflag); 
+                    updateExttool(toolselector,currForm,suppflag);
                 }
             }
         }
@@ -8030,6 +8155,7 @@ function showPage(current, pageId, nav,
                 current.className = 'right';
             }
             activeTab = ''; 
+            toggleExternal();
             toggleUpload();
             toggleMap();
             toggleCrsRes();
@@ -8042,6 +8168,7 @@ function showPage(current, pageId, nav,
 	currentData = document.getElementById(pageId);
 	currentData.style.display = 'block';
         activeTab = pageId;
+        toggleExternal();
         toggleUpload();
         toggleMap();
         toggleCrsRes();
@@ -8575,7 +8702,7 @@ sub makenewproblem {
         if ($env{'form.newsubdir'}) {
             if ($env{'form.newsubdirname'} ne '') {
                 $newsubdir = $env{'form.newsubdirname'};
-            }    
+            }
         }
         if ($env{'form.newresourcename'}) {
             $filename = $env{'form.newresourcename'};
@@ -8658,61 +8785,34 @@ END
 <subject></subject>
 <title></title>
 END
-                                        close($fh);
-                                }
-                                if ((-e $sourcerights) && (-e "$sourcerights.meta")) {
-                                    if (!-e "$docroot/res/$coursedom") {
-                                        mkdir("$docroot/res/$coursedom",0755);
-                                    }
-                                    if (!-e "$docroot/res/$coursedom/$coursenum") {
-                                        mkdir("$docroot/res/$coursedom/$coursenum",0755);
-                                    }
-                                    if ((-e "$docroot/res/$coursedom/$coursenum") && (!-e $targetrights)) {
-                                        my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
-                                        my $output = &Apache::lonpublisher::batchpublish($r,$sourcerights,$targetrights,$nokeyref,1);
-                                    }
+                                    close($fh);
                                 }
                             }
-                            if ($env{'form.newresourceadd'}) {
-                                my $template = $env{'form.template'};
-                                my $source = $docroot.$redirect;
-                                my $target = $redirect;
-                                $target =~ s{^/priv/}{/res/};
-                                $target = $docroot.$target;
-                                if (!-e $source) {
-                                    my $copyfrom; 
-                                    if ($template) {
-                                        my %templates;
-                                        my @files = &Apache::lonhomework::get_template_list('problem');
-                                        foreach my $poss (@files) {
-                                            if (ref($poss) eq 'ARRAY') {
-                                                if ($template eq $poss->[0]) {
-                                                    $templates{$template} = 1;
-                                                    last;
-                                                }
-                                            }
-                                        }
-                                        if ($templates{$template}) {
-                                            $copyfrom = $template;
-                                        }
-                                    }
-                                    unless ($copyfrom) {
-                                        $copyfrom = $r->dir_config('lonIncludes').'/templates/blank.problem';
-                                    }
-                                    &File::Copy::copy($copyfrom,$source);
+                            if ((-e $sourcerights) && (-e "$sourcerights.meta")) {
+                                if (!-e "$docroot/res/$coursedom") {
+                                    mkdir("$docroot/res/$coursedom",0755);
                                 }
-                                if (!-e "$source.meta") {
-                                    my $cid = $coursedom.'_'.$coursenum;
-                                    my $now = time;
-                                    if (open(my $fh,">$source.meta")) {
-                                        my $author=$env{'environment.firstname'}.' '.
-                                                   $env{'environment.middlename'}.' '.
-                                                   $env{'environment.lastname'}.' '.
-                                                   $env{'environment.generation'};
-                                        $author =~ s/\s+$//;
-                                        my $title = $env{'form.newresourcetitle'};
-                                        $title =~ s/^\s+|\s+$//g;
-                                        print $fh <<END;
+                                if (!-e "$docroot/res/$coursedom/$coursenum") {
+                                    mkdir("$docroot/res/$coursedom/$coursenum",0755);
+                                }
+                                if ((-e "$docroot/res/$coursedom/$coursenum") && (!-e $targetrights)) {
+                                    my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
+                                    my $output = &Apache::lonpublisher::batchpublish($r,$sourcerights,$targetrights,$nokeyref,1);
+                                }
+                            }
+                            my $source = $docroot.$redirect;
+                            if (!-e "$source.meta") {
+                                my $cid = $coursedom.'_'.$coursenum;
+                                my $now = time;
+                                if (open(my $fh,">$source.meta")) {
+                                    my $author=$env{'environment.firstname'}.' '.
+                                               $env{'environment.middlename'}.' '.
+                                               $env{'environment.lastname'}.' '.
+                                               $env{'environment.generation'};
+                                    $author =~ s/\s+$//;
+                                    my $title = $env{'form.newresourcetitle'};
+                                    $title =~ s/^\s+|\s+$//g;
+                                    print $fh <<END;
 
 <abstract></abstract>
 <author>$author</author>
@@ -8738,8 +8838,7 @@ END
 <subject></subject>
 <title>$title</title>
 END
-                                        close($fh);
-                                    }
+                                    close($fh);
                                 }
                             }
                         }
@@ -8767,7 +8866,7 @@ END
 }
 
 sub finishnewprob {
-    my ($url,$path,$subdir,$newsubdir,$filename) = @_;
+    my ($url,$path,$subdir,$newsubdir,$filename,$context) = @_;
     unless (-d $path) {
         unless (mkdir($path,02770)) {
             return;
@@ -8810,6 +8909,31 @@ sub finishnewprob {
             $redirect = "$url/$filename";
         }
     }
+    if ((!-e $dest) && ($context ne 'upload')) {
+        my $template = $env{'form.template'};
+        my $copyfrom;
+        if ($template ne '') {
+            my %templates;
+            my @files = &Apache::lonhomework::get_template_list('problem');
+            foreach my $poss (@files) {
+                if (ref($poss) eq 'ARRAY') {
+                    if ($template eq $poss->[0]) {
+                        $templates{$template} = 1;
+                        last;
+                    }
+                }
+            }
+            if ($templates{$template}) {
+                $copyfrom = $template;
+            }
+        }
+        if ($filename =~ /\.problem$/) {
+            unless ($copyfrom) {
+                $copyfrom = $Apache::lonnet::perlvar{'lonIncludes'}.'/templates/blank.problem';
+            }
+            &File::Copy::copy($copyfrom,$dest);
+        }
+    }
     return $redirect;
 }