--- loncom/interface/londocs.pm	2012/11/16 23:37:15	1.509
+++ loncom/interface/londocs.pm	2012/11/30 14:46:21	1.512
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.509 2012/11/16 23:37:15 raeburn Exp $
+# $Id: londocs.pm,v 1.512 2012/11/30 14:46:21 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -41,6 +41,7 @@ use Apache::lonclonecourse;
 use Apache::lonnavmaps;
 use Apache::lonnavdisplay();
 use Apache::lonuserstate();
+use Apache::lonextresedit();
 use HTML::Entities;
 use HTML::TokeParser;
 use GDBM_File;
@@ -1693,10 +1694,12 @@ sub editor {
         $supplementalflag,$orderhash,$iconpath,$pathitem)=@_;
     my $container= ($env{'form.pagepath'}) ? 'page'
 		                           : 'sequence';
-
-    my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
-        &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1);
-    $r->print($breadcrumbtrail);
+    my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order);
+    if ($allowed) {
+        (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
+            &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1);
+        $r->print($breadcrumbtrail);
+    }
 
     my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
 
@@ -1864,30 +1867,56 @@ sub editor {
         $shown++;
     }
     &Apache::loncommon::end_data_table_count();
-    
-    if ($shown) {
-        $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
-                  .&Apache::loncommon::start_data_table(undef,'contentlist');
-        if ($allowed) {
-            $to_show .= &Apache::loncommon::start_data_table_header_row()
-                     .'<th colspan="2">'.&mt('Move').'</th>'
-                     .'<th>'.&mt('Actions').'</th>'
-                     .'<th colspan="2">'.&mt('Document').'</th>';
-            if ($folder !~ /^supplemental/) {
-                $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
+
+    if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {
+        if ($shown) {
+            if ($allowed) {
+                $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
+                          .&Apache::loncommon::start_data_table(undef,'contentlist')
+                          .&Apache::loncommon::start_data_table_header_row()
+                          .'<th colspan="2">'.&mt('Move').'</th>'
+                          .'<th>'.&mt('Actions').'</th>'
+                          .'<th colspan="2">'.&mt('Document').'</th>';
+                if ($folder !~ /^supplemental/) {
+                    $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
+                }
+                $to_show .= &Apache::loncommon::end_data_table_header_row()
+                           .$output.' '
+                           .&Apache::loncommon::end_data_table()
+                           .'<br style="line-height:2px;" />'
+                           .&Apache::loncommon::end_scrollbox();
+            } else {
+                $to_show = '<table><tr><td>'.&Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT')
+                           .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'
+                           .'<td align="left"><ul id="LC_toolbar">'
+                           .'<li><a href="/adm/coursedocs?forcesupplement=1" '
+                           .'id="LC_content_toolbar_edittoplevel" '
+                           .'class="LC_toolbarItem" '
+                           .'title="'.&mt('Supplemental Content Editor').'">'
+                           .'</a></li></ul></td></tr></table><br />'
+                           .&Apache::loncommon::start_data_table('LC_tableOfContent')
+                           .$output.' '
+                           .&Apache::loncommon::end_data_table();
             }
-            $to_show .= &Apache::loncommon::end_data_table_header_row();
+        } else {
+            $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
+                       .'<div class="LC_info" id="contentlist">'
+                       .&mt('Currently no documents.')
+                       .'</div>'
+                       .&Apache::loncommon::end_scrollbox();
         }
-        $to_show .= $output.' '
-                 .&Apache::loncommon::end_data_table()
-                 .'<br style="line-height:2px;" />'
-                 .&Apache::loncommon::end_scrollbox();
     } else {
-        $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
-                 .'<div class="LC_info" id="contentlist">'
-                 .&mt('Currently no documents.')
-                 .'</div>'
-                 .&Apache::loncommon::end_scrollbox();
+        if ($shown) {
+            $to_show = '<div>'
+                      .&Apache::loncommon::start_data_table('LC_tableOfContent')
+                      .$output
+                      .&Apache::loncommon::end_data_table()
+                      .'</div>';
+        } else {
+            $to_show = '<div class="LC_info" id="contentlist">'
+                      .&mt('Currently no documents.')
+                      .'</div>'
+        }
     }
     my $tid = 1;
     if ($supplementalflag) {
@@ -1899,19 +1928,6 @@ sub editor {
                                        $readfile));
         &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);
     } else {
-        if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
-            #Function Box for Supplemental Content for users with mdc priv.
-            my $funcname = &mt('Folder Editor');
-            $r->print(
-                &Apache::loncommon::head_subbox(
-                    &Apache::lonhtmlcommon::start_funclist().
-                    &Apache::lonhtmlcommon::add_item_funclist(
-                        '<a href="/adm/coursedocs?command=direct&forcesupplement=1&'.
-                        'supppath='.&HTML::Entities::encode($env{'form.folderpath'}).'">'.
-                        '<img src="/res/adm/pages/docs-22x22.png" alt="'.$funcname.'" class="LC_icon" />'.
-                        '<span class="LC_menubuttons_inline_text">'.$funcname.'</span></a>').
-                          &Apache::lonhtmlcommon::end_funclist()));
-        }
         $r->print($to_show);
     }
     return;
@@ -2111,18 +2127,20 @@ sub entryline {
 	$path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
     }
     my $isexternal;
-    if (!$supplementalflag && $residx) {
+    if ($residx) {
         my $currurl = $url;
         $currurl =~ s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
         if ($currurl =~ m{^/adm/wrapper/ext/}) {
             $isexternal = 1;
         }
-        my $path = 'uploaded/'.
-                   $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
-                   $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
-        $symb = &Apache::lonnet::encode_symb($path.$folder.".$container",
-                                             $residx,
-                                             &Apache::lonnet::declutter($currurl));
+        if (!$supplementalflag) {
+            my $path = 'uploaded/'.
+                       $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
+                       $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
+            $symb = &Apache::lonnet::encode_symb($path.$folder.".$container",
+                                                 $residx,
+                                                 &Apache::lonnet::declutter($currurl));
+        }
     }
     my %lt;
     if ($allowed) {
@@ -2338,7 +2356,7 @@ END
     my $editlink;
     my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
-    my $external = ($url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/});
+    $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
     if (!$supplementalflag && $residx && $symb) {
         if ($container eq 'page') {
             $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
@@ -2359,7 +2377,6 @@ END
 	        }
 	    } elsif ($url=~m|^/ext/|) {
 	        $url='/adm/wrapper'.$url;
-	        $external = 1;
 	    }
             if (&Apache::lonnet::symbverify($symb,$url)) {
 	        $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
@@ -2373,9 +2390,14 @@ END
 	my $foldername=&escape($foldertitle);
 	my $folderpath=$env{'form.folderpath'};
 	if ($folderpath) { $folderpath.='&' };
+        if (!$allowed && $supplementalflag) {
+            $folderpath.=$folderarg.'&'.$foldername;
+            $url.='folderpath='.&escape($folderpath);
+        } else {
 # Append randompick number, hidden, and encrypted with ":" to foldername,
 # so it gets transferred between levels
-	$folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
+	    $folderpath.=$folderarg.'&'.$foldername.
+                                              ':'.(&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randompick'))[0]
                                                .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_hiddenresource'))[0]=~/^yes$/i)
@@ -2383,31 +2405,38 @@ END
                                               'parameter_encrypturl'))[0]=~/^yes$/i)
                                                .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randomorder'))[0]=~/^yes$/i);
-	$url.='folderpath='.&escape($folderpath);
-        my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
-                                                   'parameter_randompick'))[0];
-        my $rpckchk;
-        if ($rpicknum) {
-            $rpckchk = ' checked="checked"';
-        }
-        my $formname = 'edit_rpick_'.$orderidx;
-	$rand_pick_text = 
+	    $url.='folderpath='.&escape($folderpath);
+            my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
+                                                        'parameter_randompick'))[0];
+            my $rpckchk;
+            if ($rpicknum) {
+                $rpckchk = ' checked="checked"';
+            }
+            my $formname = 'edit_rpick_'.$orderidx;
+	    $rand_pick_text = 
 '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
 $form_common."\n".
 '<span class="LC_nobreak"><label><input type="checkbox" name="randpickon_'.$orderidx.'" id="rpick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="randompick_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" />';
-        if ($rpicknum ne '') {
-            $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';
-        }
-        $rand_pick_text .= '</span></form>';
-    	my $ro_set=
-	    ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
-	$rand_order_text = 
+            if ($rpicknum ne '') {
+                $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';
+            }
+            $rand_pick_text .= '</span></form>';
+    	    my $ro_set=
+	        ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
+	    $rand_order_text = 
 $form_start.
 $form_common.'
 <span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onclick="'."this.form.changeparms.value='randomorder';this.form.submit()".'" '.$ro_set.' /> '.&mt('Random Order').' </label></span></form>';
+        }
     } elsif ($supplementalflag && !$allowed) {
-        $url .= ($url =~ /\?/) ? 'amp;':'?';
+        $url .= ($url =~ /\?/) ? '&amp;':'?';
         $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');
+        if ($title) {
+            $url .= '&amp;title='.&HTML::Entities::encode($renametitle,'<>&"');
+        }
+        if ($isexternal && $orderidx) {
+            $url .= '&amp;idx='.$orderidx;
+        }
     }
     if ($ispage) {
         my $pagename=&escape($pagetitle);
@@ -2421,47 +2450,20 @@ $form_common.'
     if ($allowed) {
         my $fileloc = 
             &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));
-
-        if ($external) {
-	    $editlink = <<"EXTLNK";
-            &nbsp;
-            <a class="LC_docs_ext_edit" href="javascript:editext('$residx');">
-            $lt{'ed'}</a>
-            <form action="/adm/coursedocs" method="post" name="editext_$residx">
-            <fieldset id="uploadext$residx" style="display: none;" />
-            <input type="hidden" name="active" value="aa" />
-            <span class="LC_nobreak">
-            <span class="LC_docs_ext_edit">$lt{'ul'}&nbsp;</span>
-            <input type="text" size="40" name="exturl" id="exturl_$residx" value="$orig_url" />&nbsp;
-            <a class="LC_docs_ext_edit" href="javascript:extUrlPreview('exturl_$residx');">$lt{'pr'}</a></span>
-            </span><br />
-            <span class="LC_nobreak">
-            <span class="LC_docs_ext_edit">$lt{'ti'}&nbsp;</span>
-            <input type="text" size="40" name="exttitle" value="$title" />
-            $pathitem
-            <input type="hidden" name="importdetail" value="" />
-            <input type="button" value="$lt{'sv'}" onclick="javascript:setExternal(this.form,'$residx')" />
-            </span>
-            </fieldset>
-            </form>
-EXTLNK
-        } else {
+        if ($isexternal) {
+            $editlink = '&nbsp;'.
+                &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem);
+        } elsif (!$isfolder && !$ispage) {
             my ($cfile,$home,$switchserver,$forceedit,$forceview) = 
                 &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);
-            my $geteditlink;
-            if ($supplementalflag) {
-                if ($orig_url eq "/adm/$env{'user.domain'}/$env{'user.name'}/aboutme") {
-                    $geteditlink = 1;
-                }
-            } elsif (($cfile ne '') && ($symb ne '')) {
-                $geteditlink = 1;
-            }
-            if ($geteditlink) {
+            if (($cfile ne '') && ($symb ne '' || $supplementalflag)) {
                 my $jscall = 
                     &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,
                                                             $switchserver,
                                                             $forceedit,
-                                                            undef,$symb);
+                                                            undef,$symb,
+                                                            &escape($env{'form.folderpath'}),
+                                                            $renametitle);
                 if ($jscall) {
                     $editlink = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:'.
                                 $jscall.'" >'.&mt('Edit').'</a>';
@@ -3215,7 +3217,7 @@ sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['folderpath','pagepath',
                                              'pagesymb','forcesupplement','forcestandard',
-                                             'tools','symb','command']);
+                                             'tools','symb','command','supppath']);
 
 # standard=1: this is a "new-style" course with an uploaded map as top level
 # standard=2: this is a "old-style" course, and there is nothing we can do
@@ -3285,21 +3287,31 @@ sub handler {
                        }
                    }
                }
-               $path .= '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
-                    &Apache::lonhtmlcommon::entity_encode($mapresobj->title()).
+               $path =~ s/^\&//;
+               my $maptitle = $mapresobj->title();
+               if ($mapurl eq 'default') {
+                   $maptitle = 'Main Course Documents';
+               }
+               $path .= (($path ne '')? '&' : '').
+                    &Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
+                    &Apache::lonhtmlcommon::entity_encode($maptitle).
                     ':'.$mapresobj->randompick().
                     ':'.$mapresobj->randomout().
                     ':'.$mapresobj->encrypted().
                     ':'.$mapresobj->randomorder();
            } else {
                my $maptitle = &Apache::lonnet::gettitle($mapurl);
-               $path = '&default&...::::'.
-                   '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
-                   &Apache::lonhtmlcommon::entity_encode($maptitle).'::::';
+               if ($mapurl eq 'default') {
+                   $maptitle = 'Main Course Documents';
+               }
+               $path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
+                       &Apache::lonhtmlcommon::entity_encode($maptitle).'::::';
+           }
+           unless ($mapurl eq 'default') {
+               $path = 'default&'.
+                       &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
+                       '::::&'.$path;
            }
-           $path = 'default&'.
-                   &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
-                   $path;
            if ($type eq 'sequence') {
                $env{'form.folderpath'}=$path;
                $env{'form.pagepath'}='';
@@ -3326,10 +3338,10 @@ sub handler {
        $stored_folderpath='docs_sup_folderpath';
     }
 
-# No folderpath, no pagepath, see if we have something stored
-    if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
+# No folderpath, no pagepath, and in edit mode, see if we have something stored
+    if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'}) && $allowed) {
         &Apache::loncommon::restore_course_settings($stored_folderpath,
-                                              {'folderpath' => 'scalar'});
+                                          {'folderpath' => 'scalar'});
     }
    
 # If we are not allowed to make changes, all we can see are supplemental docs
@@ -3361,9 +3373,11 @@ sub handler {
 
 # Store this
     unless ($toolsflag) {
-        &Apache::loncommon::store_course_settings($stored_folderpath,
-                                                  {'pagepath' => 'scalar',
-                                                   'folderpath' => 'scalar'});
+        if ($allowed) {
+            &Apache::loncommon::store_course_settings($stored_folderpath,
+                                                      {'pagepath' => 'scalar',
+                                                       'folderpath' => 'scalar'});
+        }
         if ($env{'form.folderpath'}) {
 	    my (@folderpath)=split('&',$env{'form.folderpath'});
 	    $env{'form.foldername'}=&unescape(pop(@folderpath));
@@ -3439,7 +3453,8 @@ sub handler {
 	    $script .= &editing_js($udom,$uname,$supplementalflag).
                        &history_tab_js().
                        &inject_data_js().
-                       &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr);
+                       &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr).
+                       &Apache::lonextresedit::extedit_javascript();
             $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
                           };
@@ -3461,22 +3476,26 @@ sub handler {
 
     # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();
-    unless ($showdoc) {
+
+    if ($showdoc) {
+        $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
+                                                {'force_register' => $showdoc,}));
+    } elsif ($r->uri eq '/adm/supplemental') {
+        my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
+        $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
+                                                {'bread_crumbs' => $brcrum,}));
+    } else {
         &Apache::lonhtmlcommon::add_breadcrumb({
             href=>"/adm/coursedocs",text=>"$crstype Contents"});
 
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
-                                                 {'force_register' => $showdoc,
-                                                  'add_entries'    => $addentries,
-                                                 })
+                                                 {'add_entries'    => $addentries}
+                                                )
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')
                  .&Apache::lonhtmlcommon::breadcrumbs(
                      'Editing '.$crstype.' Contents',
                      'Docs_Adding_Course_Doc')
         );
-    } else {
-        $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
-                                                {'force_register' => $showdoc,}));
     }
 
   my %allfiles = ();
@@ -3672,27 +3691,9 @@ SEDFFORM
         { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap();" />' => $importpubform }
 	);
 	$importpubform = &create_form_ul(&create_list_elements(@importpubforma));
-
-      my $extresourcesform=(<<ERFORM);
-      <a class="LC_menubuttons_link" href="javascript:toggleUpload('ext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}
-      <form action="/adm/coursedocs" method="post" name="newext">
-      <fieldset id="uploadextform" style="display: none;" />
-      <legend>$lt{'extr'}</legend>
-      <input type="hidden" name="active" value="aa" />
-      $lt{'url'}:<br />
-      <input type="text" size="60" name="exturl" id="exturl" value="http://" />
-      <input type="button" name="view" value="$lt{'prev'}" onclick="javascript:extUrlPreview('exturl');" /><br />
-      $lt{'title'}:<br />
-      <input type="text" size="60" name="exttitle" value="$lt{'extr'}" />
-      $pathitem
-      <br />
-      <input type="hidden" name="importdetail" value="" />
-      <input type="button" value="$lt{'lnk'}" onclick="javascript:setExternal(this.form,0)" />
-      </fieldset>
-      </form>
-ERFORM
-
-
+        my $extresourcesform =
+            &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,
+                                                 $help{'Adding_External_Resource'});
     if ($allowed) {
         my $folder = $env{'form.folder'};
         if ($folder eq '') {
@@ -3716,11 +3717,16 @@ HIDDENFORM
     }
 
 # Generate the tabs
-    my $mode;
+    my ($mode,$needs_end);
     if (($supplementalflag) && (!$allowed)) {
-        &Apache::lonnavdisplay::startContentScreen($r,'supplemental');
+        my @folders = split('&',$env{'form.folderpath'});
+        unless (@folders > 2) {
+            &Apache::lonnavdisplay::startContentScreen($r,'supplemental');
+            $needs_end = 1;
+        }
     } else {
         $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs')));
+        $needs_end = 1;
     }
 
 #
@@ -4011,24 +4017,9 @@ SUPDOCFORM
 	</form>
 SNFFORM
 	
-        my $supextform=(<<ERFORM);
-        <a class="LC_menubuttons_link" href="javascript:toggleUpload('suppext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}
-        <form action="/adm/coursedocs" method="post" name="newsuppext">
-        <fieldset id="uploadsuppextform" style="display: none;" />
-        <legend>$lt{'extr'}</legend>
-        <input type="hidden" name="active" value="ee" />
-        $lt{'url'}:<br />
-        <input type="text" size="60" name="exturl" id="exturl" value="http://" />
-        <input type="button" name="view" value="$lt{'prev'}" onclick="javascript:extUrlPreview('exturl');" /><br />
-        $lt{'title'}:<br />
-        <input type="text" size="60" name="exttitle" value="$lt{'extr'}" />
-        <br />
-        $pathitem
-        <input type="hidden" name="importdetail" value="" />
-        <input type="button" value="$lt{'lnk'}" onclick="javascript:setExternal(this.form,0)" />
-        </fieldset>
-        </form>
-ERFORM
+        my $supextform =
+            &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,
+                                                 $help{'Adding_External_Resource'});
 
 	my $supnewsylform=(<<SNSFORM);
 	<form action="/adm/coursedocs" method="post" name="supnewsyl">
@@ -4087,7 +4078,9 @@ my %suporderhash = (
         }
     }
 
-    $r->print(&endContentScreen());
+    if ($needs_end) {
+        $r->print(&endContentScreen());
+    }
 
     if ($allowed) {
 	$r->print('
@@ -4465,10 +4458,6 @@ sub editing_js {
         $fieldsets = "'suppext','suppdoc'";
     }
 
-    my $urlregexp = <<'ENDREGEXP';
-/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
-ENDREGEXP
-
     return <<ENDNEWSCRIPT;
 function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
@@ -4486,20 +4475,6 @@ function makenewpage(targetform,folderse
     }
 }
 
-function editext(residx) {
-    if (document.getElementById('uploadext'+residx)) {
-        var curr = document.getElementById('uploadext'+residx).style.display;
-        if (curr == 'none') {
-            disp = 'block';
-        } else {
-            disp = 'none';
-        }
-        document.getElementById('uploadext'+residx).style.display=disp;
-    }
-    resize_scrollbox('contentscroll','1','1');
-    return;
-}
-
 function makeexamupload() {
    var title=prompt('$lt{"p_mxu"}');
    if (title) {
@@ -4582,26 +4557,15 @@ function toggleUpload(caller) {
 
 function toggleMap() {
     var disp = 'none';
-    var curr = document.getElementById('importmapform').style.display;
-    if (curr == 'none') {
-        disp='block';
-    }
-    document.getElementById('importmapform').style.display=disp;
-    resize_scrollbox('contentscroll','1','1');
-    return;
-}
-
-
-function extUrlPreview(caller) {
-    if (document.getElementById(caller)) {
-        var url = document.getElementById(caller).value;
-        var regexp = $urlregexp;
-        if (regexp.test(url)) {
-            openMyModal(url,500,400,'yes');
-        } else {
-            alert("$lt{'invurl'}");
+    if (document.getElementById('importmapform')) {
+        var curr = document.getElementById('importmapform').style.display;
+        if (curr == 'none') {
+            disp='block';
         }
+        document.getElementById('importmapform').style.display=disp;
+        resize_scrollbox('contentscroll','1','1');
     }
+    return;
 }
 
 function makeims(imsform) {
@@ -4617,31 +4581,6 @@ function makeims(imsform) {
     imsform.submit();
 }
 
-function setExternal(extform,residx) {
-    var title=extform.exttitle.value;
-    if (!String.trim) {
-        String.prototype.trim = function() {return this.replace(\/^\\s+|\\s+$\/g, "");};    }
-    var url=extform.exturl.value;
-    var regexp = $urlregexp;
-    if (title == null || title.trim()=="") {
-        alert("$lt{'titbl'}");
-        extform.exttitle.focus();
-        return;
-    }
-    if (regexp.test(url)) {
-        url = escape(url);
-        if (residx > 0) {
-            eval("extform.importdetail.value=title+'='+url+'='+residx;extform.submit();");
-        } else {
-            eval("extform.importdetail.value=title+'='+url;extform.submit();");
-        }
-    } else {
-        alert("$lt{'invurl'}");
-        extform.exturl.focus();
-        return;
-    }
-}
-
 function changename(folderpath,index,oldtitle,container,pagesymb) {
 var title=prompt('$lt{"p_chn"}',oldtitle);
 if (title) {