[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm lonmenu.pm lonsyllabus.pm lontemplate.pm /lonnet/perl lonnet.pm

raeburn raeburn at source.lon-capa.org
Tue Apr 23 22:44:06 EDT 2013


raeburn		Wed Apr 24 02:44:06 2013 EDT

  Modified files:              
    /loncom/interface	lonsyllabus.pm lonmenu.pm loncommon.pm 
                     	lontemplate.pm 
    /loncom/lonnet/perl	lonnet.pm 
  Log:
  - Syllabus can use template, uploaded file, or point at external web page.
  - Uploaded file stored in course's portfolio; can be a web page -- uploader
    will be prompted to upload any dependencies.
  - When using template, new fieldset included at top of page, so boxes to
    display in editing screen can be chosen.
  
  
-------------- next part --------------
Index: loncom/interface/lonsyllabus.pm
diff -u loncom/interface/lonsyllabus.pm:1.116 loncom/interface/lonsyllabus.pm:1.117
--- loncom/interface/lonsyllabus.pm:1.116	Fri Dec  7 17:15:56 2012
+++ loncom/interface/lonsyllabus.pm	Wed Apr 24 02:43:59 2013
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Syllabus
 #
-# $Id: lonsyllabus.pm,v 1.116 2012/12/07 17:15:56 raeburn Exp $
+# $Id: lonsyllabus.pm,v 1.117 2013/04/24 02:43:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -77,12 +77,70 @@
     if ($target eq 'tex') {
         $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}));
     }
+
+# --------------------------------------------------------------- Force Student
+    my ($forceedit,$forcestudent);
+    if ($env{'form.forceedit'}) { $forceedit=1; }
+    if (!$forceedit) {
+        $forcestudent=1;
+    }
+
+# --------------------------------------------------------------- Check Privileges
+    my $allowed = 0;
+    if ($env{'user.environment'}) {
+# does this user have privileges to post, etc?
+        if ($env{'request.course.id'}
+        && $cdom eq $env{'course.'.$env{'request.course.id'}.'.domain'}
+        && $cnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) {
+            $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+            if ($forcestudent or $target eq 'tex') { $allowed=0; }
+        }
+    }
+
 # -------------------------------------------------- Let's see who handles this
-    my $externalsyllabus=$courseenv{'externalsyllabus'};
+    my $external=$courseenv{'externalsyllabus'};
+    my $uploaded=$courseenv{'uploadedsyllabus'};
 
-    if ($externalsyllabus=~/\w/) {
-        $r->print( Apache::lonwrapper::wrapper($externalsyllabus) );
-        return OK;
+    if ($uploaded =~/\w/) {
+        if ($external =~ m{\Q$uploaded\E$}) {
+            undef($external);
+        }
+        unless ($allowed && $forceedit) {
+            my $file=&Apache::lonnet::filelocation("",$uploaded);
+            if ($file =~ /\.(sty|css|js|txt|tex|html?)$/) {  
+                my $filetype;
+                if ($file =~ /\.(sty|css|js|txt|tex)$/) {
+                    $filetype=$1;
+                } else {
+                    $filetype='html';
+                }
+                my $result = '';
+                my $filecontents=&Apache::lonnet::getfile($file);
+                if ($filecontents eq -1) {
+                    $r->print(&mt('Syllabus file unavailable'));
+                } elsif ($filetype eq 'html') {
+                    my %mystyle;
+                    &Apache::structuretags::reset_problem_globals();
+                    my $oldfile = $env{'request.filename'};
+                    $env{'request.filename'} = $uploaded;
+                    $result = &Apache::lonxml::xmlparse($r,'web',$filecontents,
+                                                        '',%mystyle);
+                    &Apache::structuretags::reset_problem_globals();
+                    &Apache::lonhomework::finished_parsing();
+                    $env{'request.filename'} = $oldfile;
+                    &Apache::lonxml::add_messages(\$result);
+                    $r->print($result);
+                }
+            } else {
+                $r->print(&Apache::lonwrapper::wrapper($uploaded));
+            }
+            return OK;
+        }
+    } elsif ($external=~/\w/) {
+        unless ($allowed && $forceedit) {
+            $r->print(&Apache::lonwrapper::wrapper($external));
+            return OK;
+        }
     }
 
 # ------------------------------ The buck stops here: internal syllabus display
@@ -103,12 +161,6 @@
        'jjj_weblinks'       => 'Web Links',
        'kkk_textbook'       => 'Textbook',
        'lll_includeurl'     => 'URLs To Include in Syllabus');
-# --------------------------------------------------------------- Force Student
-    my ($forceedit,$forcestudent);
-    if ($env{'form.forceedit'}) { $forceedit=1; }
-    if (!$forceedit) {
-        $forcestudent=1;
-    }
 # ----------------------------------------------------------------- Make header
     if ($target ne 'tex') {
         my $rss_link = &Apache::lonrss::rss_link($cnum,$cdom);
@@ -117,6 +169,8 @@
             $js .= <<"ENDSCRIPT";
 
 <script type="text/javascript">
+// <![CDATA[
+
 function ToCatalog(caller) {
     numidx = getIndexByName('coursenum');
         if (numidx > -1) {
@@ -136,6 +190,81 @@
     return -1;
 }
 
+// ]]>
+</script>
+
+ENDSCRIPT
+        }
+        if ($allowed && $forceedit) {
+            my $check_uncheck = &Apache::loncommon::check_uncheck_jscript();
+            my $invurl = &mt('Invalid URL');
+            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
+
+            $js .= <<"ENDSCRIPT";
+
+<script type="text/javascript">
+// <![CDATA[
+
+function toggleEditor(pick) {
+    var choices = new Array('template','url','file','templatebox');
+    for (var i=0; i<choices.length; i++) {
+        if (((choices[i] == 'templatebox') && (pick == 'template')) ||
+            (choices[i] == pick)) {
+            document.getElementById(choices[i]).style.display='block';
+        } else { 
+            document.getElementById(choices[i]).style.display='none';
+        }
+    }
+    return;
+}
+
+var regexp = $urlregexp;
+
+function extUrlPreview(caller) {
+    if (document.getElementById(caller)) {
+        var url = document.getElementById(caller).value;
+        if (regexp.test(url)) {
+            openMyModal(url,500,400,'yes');
+        } else {
+            alert("$invurl");
+        }
+    }
+}
+
+function toggleBox(name,caller) {
+    if (name == 'all') {
+        if (document.syllabus.showfield.length > 0) {
+            for (var i=0; i<document.syllabus.showfield.length; i++) {
+                if (document.syllabus.showfield[i].checked) {
+                    if (document.getElementById('box_'+document.syllabus.showfield[i].value)) {
+                        document.getElementById('box_'+document.syllabus.showfield[i].value).style.display='block';
+                    }   
+                } else {
+                    if (document.getElementById('box_'+document.syllabus.showfield[i].value)) {
+                        document.getElementById('box_'+document.syllabus.showfield[i].value).style.display='none';
+                    }
+                }
+            }
+        }
+    } else { 
+        if (caller.checked) {
+            if (document.getElementById('box_'+caller.value)) {
+                document.getElementById('box_'+caller.value).style.display='block';
+            }
+        } else {
+            if (document.getElementById('box_'+caller.value)) {
+                document.getElementById('box_'+caller.value).style.display='none';
+            }
+        }
+    }
+    return;
+}
+
+$check_uncheck
+
+// ]]>
 </script>
 
 ENDSCRIPT
@@ -180,20 +309,13 @@
     }
 # ---------------------------------------------------------- Load syllabus info
     my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum);
-    my $allowed=0;
+    my %displayfields;
 
 # This handler might be called anonymously ...
 # ----------------------------------------------------- Only if not public call
-    if ($env{'user.environment'}) {
-# does this user have privileges to post, etc?
-        if ($env{'request.course.id'}
-        && $cdom eq $env{'course.'.$env{'request.course.id'}.'.domain'}
-        && $cnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) {
-            $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
-            if ($forcestudent or $target eq 'tex') { $allowed=0; }
-        }
-#store what the user typed in
-        if (($allowed) && ($env{'form.storesyl'})) {
+    if ($allowed) {
+#store what the user typed in to the template
+        if ($env{'form.storesyl'}) {
             foreach my $syl_field (keys(%syllabusfields)) {
                 my $field=$env{'form.'.$syl_field};
                 chomp($field);
@@ -238,6 +360,160 @@
             $syllabus{'uploaded.name'}=$env{'user.name'};
             $syllabus{'uploaded.lastmodified'}=time;
             &Apache::lonnet::put('syllabus',\%syllabus,$cdom,$cnum);
+            my %storehash;
+            if ($courseenv{'uploadedsyllabus'}) {
+                &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.uploadedsyllabus');
+                $storehash{'uploadedsyllabus'} = '';
+            }
+            if ($courseenv{'externalsyllabus'}) {
+                &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus');
+                $storehash{'externalsyllabus'} = '';
+            }
+            if ($courseenv{'externalsyllabus'} || $courseenv{'uploadedsyllabus'}) {
+                &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum);
+                undef($uploaded);
+                undef($external);
+            }
+        } elsif ($env{'form.storeurl'}) {
+            if ($env{'form.externalsyllabus'} =~ m{^https?://}) {
+                if ($env{'form.externalsyllabus'} eq $external) {
+                    $r->print('<div class="LC_info">'.
+                              &mt('External URL unchanged.').
+                              '</div>');
+                    if ($uploaded) {
+                        my $prefix;
+                        my $home=&Apache::lonnet::homeserver($cnum,$cdom);
+                        if ($home ne 'no_host') {
+                            my $protocol = $Apache::lonnet::protocol{$home};
+                            $protocol = 'http' if ($protocol ne 'https');
+                            $prefix = $protocol.'://'.&Apache::lonnet::hostname($home);
+                        }
+                        unless ($external =~ m{^\Q$prefix/uploaded/$cdom/$cnum/portfolio/syllabus\E}) {
+                            &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.uploadedsyllabus');
+                            &Apache::lonnet::put('environment',{uploadedsyllabus => ''},
+                                                 $cdom,$cnum);
+                            undef($uploaded);
+                        }
+                    }
+                } else {
+                    $external=$env{'form.externalsyllabus'};
+                    $external =~ s/(`)//g;
+                    my $putres =
+                        &Apache::lonnet::put('environment',{externalsyllabus=>$external},
+                                             $cdom,$cnum);
+                    if ($putres eq 'ok') {
+                        &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.externalsyllabus' => $external});
+                        $r->print('<div>'.
+                                  &Apache::lonhtmlcommon::confirm_success(&mt('External URL saved.')).
+                                  '</div>');
+                        if ($uploaded) {
+                            my $prefix;
+                            my $home=&Apache::lonnet::homeserver($cnum,$cdom);
+                            if ($home ne 'no_host') {
+                                my $protocol = $Apache::lonnet::protocol{$home};
+                                $protocol = 'http' if ($protocol ne 'https');
+                                $prefix = $protocol.'://'.&Apache::lonnet::hostname($home);
+                            }
+                            unless ($external =~ m{^\Q$prefix/uploaded/$cdom/$cnum/portfolio/syllabus\E}) {
+                                &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.uploadedsyllabus');
+                                &Apache::lonnet::put('environment',{uploadedsyllabus => ''},
+                                                     $cdom,$cnum);
+                                undef($uploaded);
+                            }
+                        }
+                    } else {
+                        $r->print('<div class="LC_error">'.
+                                  &mt('An error occurred storing the external URL: [_1]',$putres).
+                                  '</div>');
+                    }
+                }
+            } else {
+                $r->print('<div class="LC_error">'.
+                          &mt('External URL not saved -- invalid URL.').
+                          '</div>');
+            }
+        } elsif ($env{'form.storefile'}) {
+            # Process file upload - phase one - upload and parse primary file.
+            my %allfiles = ();
+            my %codebase = ();
+            my ($upload_result,$upload_output,$uploadphase);
+            if ($env{'form.syllabusfile.filename'}) {
+                my ($url,$needlink) = &process_upload(\$upload_output,$cnum,$cdom,
+                                                      \%allfiles,\%codebase);
+                $r->print($upload_output);
+                if ($url =~ m{^/uploaded/\Q$cdom\E/\Q$cnum\E.*/[^/]+$}) {
+                    my $exturl;
+                    my $home=&Apache::lonnet::homeserver($cnum,$cdom);
+                    if ($home ne 'no_host') {
+                        my $protocol = $Apache::lonnet::protocol{$home};
+                        $protocol = 'http' if ($protocol ne 'https');
+                        $exturl = $protocol.'://'.&Apache::lonnet::hostname($home).$url;
+                    }
+                    my %storehash = (
+                                       uploadedsyllabus => $url,
+                                    );
+                    if ($exturl) {
+                        $storehash{'externalsyllabus'} = $exturl;
+                        if ($exturl =~ /\.(html?|txt|js|css)$/) {
+                            $exturl .= '?inhibitmenu=yes';
+                        }
+                    } else {
+                        $storehash{'externalsyllabus'} = '',
+                    }
+                    my $putres =
+                        &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum);
+                    if ($putres eq 'ok') {
+                        &Apache::lonnet::make_public_indefinitely($url);
+                        foreach my $key (keys(%storehash)) {
+                            &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash{$key}});
+                        }
+                        $uploaded = $url;
+                        if ($needlink) {
+                            $r->print(&return_to_editor($cdom,$cnum).
+                                      &Apache::loncommon::end_page());
+                            return OK;
+                        }
+                    }
+                }
+            }
+        } elsif ($env{'form.phase'} eq 'upload_embedded') {
+            # Process file upload - phase two - upload embedded objects
+            my $uploadphase = 'check_embedded';
+            my $primaryurl = &HTML::Entities::encode($env{'form.primaryurl'},'<>&"');   
+            my $state = &embedded_form_elems($uploadphase,$primaryurl);
+            my $url_root = '/uploaded/'.$cdom.'/'.$cnum;
+            my $actionurl = "/public/$cdom/$cnum/syllabus";
+            my ($result,$flag,$numpathchgs) =
+                &Apache::loncommon::upload_embedded('syllabus','portfolio/syllabus',
+                    $cnum,$cdom,'/userfiles',$url_root,undef,undef,undef,$state,
+                    $actionurl);
+            unless ($numpathchgs) {
+                my $modres =
+                    &Apache::loncommon::modify_html_refs('syllabus','portfolio/syllabus',
+                                                         $cnum,$cdom,
+                                                         '/userfiles',$env{'form.primaryurl'});
+                $result .= $modres;
+            }
+            $r->print($result.&return_to_editor($cdom,$cnum).
+                      &Apache::loncommon::end_page());
+            return OK;
+        } elsif ($env{'form.phase'} eq 'check_embedded') {
+            # Process file upload - phase three - modify references in HTML file
+            my $uploadphase = 'modified_orightml';
+            my $result =
+                &Apache::loncommon::modify_html_refs('syllabus','portfolio/syllabus',
+                                                     $cnum,$cdom,
+                                                     '/userfiles',$env{'form.primaryurl'});
+            $r->print($result.&return_to_editor($cdom,$cnum).
+                      &Apache::loncommon::end_page());
+            return OK;
+        }
+        foreach my $field (keys(%syllabusfields)) {
+            if ($syllabus{$field} ne '') {
+                $displayfields{$field} = ' style="display:block;"';
+            } else {
+                $displayfields{$field} = ' style="display:none;"';
+            }
         }
     }
 
@@ -252,11 +528,9 @@
                           ,'<tt>'.$protocol.'://'.&Apache::lonnet::hostname($homeserver).$r->uri.'</tt>')
                      .' '.&Apache::loncommon::help_open_topic('Syllabus_ExtLink')
                      .'</p>'
-                     .'<p>'
-                     .&mt('Instead of using this template you can specify an external URL as Syllabus in the [_1]Course Configuration[_2].'
-                          ,'<a href="/adm/courseprefs?actions=courseinfo&phase=display">','</a>')
-                     .'</p>'
                      .'</div>');
+            my $lonhost = $r->dir_config('lonHostID');
+            $r->print(&chooser($external,$uploaded,$lonhost,\%syllabusfields,\%syllabus));
         }
     } else {
 #--------------------------------------------- Print last update unless editing
@@ -294,7 +568,11 @@
 
 #-------------------------------------------------------------- Print Headtitle
     if ($target ne 'tex') {
-        $r->print('<div class="LC_Box">'.
+        my $display = 'block';
+        if ($external || $uploaded) {
+            $display = 'none';
+        }
+        $r->print('<div class="LC_Box" id="template" style="display: '.$display.'">'.
                    '<h2 class="LC_hcell">'.$courseenv{'description'}.'</h2>');
         if ($allowed) {
              $r->print('<div style="margin: 0; float:left;">'.
@@ -361,17 +639,25 @@
              &Apache::lonannounce::readcalendar($cdom.'_'.$cnum));
     if ($target ne 'tex') {
         if ($allowed) {
-            &Apache::lontemplate::print_start_template($r,&mt('RSS Feeds and Blogs'),'LC_Box');
+            my $display = ' style="display:block;"';
+            if ($syllabus{'000_showrssfeeds'} eq 'no') {
+                $display = ' style="display:none;"';
+            }
+            &Apache::lontemplate::print_start_template($r,&mt('RSS Feeds and Blogs'),'LC_Box',
+                                                       'box_000_showrssfeeds',$display);
             $r->print(&Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit));
             my $editurl= &Apache::lonnet::absolute_url().'/adm/'.$cdom.'/'.$cnum.'/_rss.html';
             $r->print( '<a href="'.$editurl.'">'.&mt('New RSS Feed or Blog').'</a>');
             &Apache::lontemplate::print_end_template($r);
-        } elsif (&Apache::lonrss::advertisefeeds($cnum,$cdom) ne '') {
-            &Apache::lontemplate::print_start_template($r,&mt('RSS Feeds and Blogs'),'LC_Box');
-            $r->print(&Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit));
-            &Apache::lontemplate::print_end_template($r);
+        } else {
+            unless ($syllabus{'000_showrssfeeds'} eq 'no') {
+                if (&Apache::lonrss::advertisefeeds($cnum,$cdom) ne '') {
+                    &Apache::lontemplate::print_start_template($r,&mt('RSS Feeds and Blogs'),'LC_Box');
+                    $r->print(&Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit));
+                    &Apache::lontemplate::print_end_template($r);
+                }
+            }
         }
-
     } else {
         $r->print(&Apache::lonxml::xmlparse($r,'tex',$day));
     }
@@ -381,8 +667,9 @@
             $r->print('<form method="post" action="">'.
             '<input type="hidden" name="forceedit" value="'.$env{'form.forceedit'}.'" />');
         }
+
 		my $url_include_handler = sub {
-			my ($r, $field, $message, $group, $data_ref, $fields_ref, $target, $allowed) = @_;
+			my ($r, $field, $message, $group, $data_ref, $fields_ref, $target, $allowed, $display) = @_;
 			my %data = %{$data_ref};
 			my %fields = %{$fields_ref};
 			my $urls=$message;
@@ -408,7 +695,8 @@
 			if ($allowed) {
 				 &Apache::lonfeedback::newline_to_br(\$urls);
 				 &Apache::lontemplate::print_start_template($r,$fields{$field}.
-						  &Apache::loncommon::help_open_topic('Syllabus_URLs'),'LC_Box');
+						  &Apache::loncommon::help_open_topic('Syllabus_URLs'),'LC_Box',
+                                                  'box_'.$field,$display);
 				 $r->print($urls);
 				 $r->print("<br /><div>");
 				 &Apache::lontemplate::print_textarea_template($r, $data{$field},
@@ -423,7 +711,8 @@
 		};
 		my %custom_hash = ( 'lll_includeurl' => $url_include_handler );
 		&Apache::lontemplate::print_template_fields($r, \%syllabus, \%syllabusfields, 
-			$target, $allowed, Apache::lontemplate->RICH_TEXT_DETECT_HTML, \%custom_hash);
+			$target, $allowed, Apache::lontemplate->RICH_TEXT_DETECT_HTML, \%custom_hash,
+                        undef,\%displayfields);
         if ($allowed) {
             $r->print('</form>'.
             &Apache::lonhtmlcommon::htmlareaselectactive());
@@ -447,5 +736,229 @@
     return OK;
 }
 
+sub chooser {
+    my ($external,$uploaded,$lonhost,$fields,$values) = @_;
+    my %lt = &Apache::lonlocal::texthash(
+                 'type'          => 'Syllabus Type',
+                 'url'           => 'External URL',
+                 'file'          => 'Uploaded File',
+                 'template'      => 'Syllabus Template',
+                 'templateboxes' => 'Choose template items ... ',
+                 'curr'          => 'Current:',
+                 'rep'           => 'Replace:',
+                 'upl'           => 'Upload:',
+                 'pr'            => 'Preview',
+                 'save'          => 'Save',
+                 'chourl'        => 'Choose external URL',
+                 'chofile'       => 'Uploaded syllabus file',
+                 'parse'         => 'Upload embedded images/multimedia files if HTML file',
+    );
+    my %checked = (
+                    file     => '',
+                    url      => '',
+                    template => '',
+                  );
+    my %display = (
+                    file        => 'none',
+                    url         => 'none',
+                    templatebox => 'none',
+                  );
+    my $check = ' checked="checked" ';
+    if ($uploaded) {
+        $checked{'file'} = $check;
+        $display{'file'} = 'block';
+    } elsif ($external) {
+        $checked{'url'}  = $check;
+        $display{'url'} = 'block';
+    } else {
+        $checked{'template'} = $check;
+        $checked{'templatebox'} = $check;
+        $display{'templatebox'} = 'block';
+    }
+
+    my $output = 
+        '<form name="syllabus" method="post" enctype="multipart/form-data" action="">'."\n".
+        '<input type="hidden" name="forceedit" value="1" />'."\n".
+        '<div class="LC_left_float"><fieldset><legend>'.$lt{'type'}.'</legend>';
+    foreach my $item ('template','url','file') {
+        $output .= '<label><input type="radio" name="choice" value="'.$item.'" '.$checked{$item}.' onclick="toggleEditor('."'$item'".')" />'.
+                   $lt{$item}.'</label><br />';
+    }
+    $output .= '</fieldset></div>'."\n".
+               '<div id="url" class="LC_left_float" style="display: '.$display{'url'}.'">'."\n".
+               '<fieldset><legend>'.$lt{'chourl'}.'</legend><span class="LC_nobreak">'."\n".
+               '<a href="javascript:extUrlPreview('."'syllabusurl'".');">'.$lt{'pr'}.'</a></span> '."\n".
+               '<input type="text" id="syllabusurl" name="externalsyllabus" value="'.$external.'" size="55" />'."\n".
+               ' <input type="submit" name="storeurl" value="'.$lt{'save'}.'" />'."\n".
+               '</fieldset></div>'."\n".
+               '<div id="file" class="LC_left_float" style="display: '.$display{'file'}.'"><fieldset><legend>'.$lt{'file'}.'</legend>';
+    if ($uploaded) {
+        my $protocol = $Apache::lonnet::protocol{$lonhost};
+        $protocol = 'http' if ($protocol ne 'https');
+        my $absurl = $protocol.'://'.&Apache::lonnet::hostname($lonhost).$uploaded;
+        my ($filename) = ($uploaded =~ m{([^/]+)$});
+        $output .= '<span class="LC_nobreak">'.$lt{'curr'}.' '.
+                   '<input type="hidden" name="uploadedfile" value="'.&HTML::Entities::encode($absurl).'?inhibitmenu=yes" id="currfile" />'.
+                   '<a href="javascript:extUrlPreview('."'currfile'".');">'.$filename.'</a></span><br /><br />'.$lt{'rep'};
+    } else {
+        $output .= $lt{'upl'};
+    }
+
+    $output .= '<br />'."\n".
+               '<span class="LC_nobreak">'.
+               '<input type="file" name="syllabusfile" size="55" />'."\n".
+               ' <input type="submit" name="storefile" value="'.$lt{'save'}.'" />'.
+               '</span><br />'.
+               '<label>'.
+               '<input type="checkbox" name="parserflag" checked="checked" />'.
+               $lt{'parse'}.
+               '</label>'.
+               '</fieldset></div>'.
+               '<div id="templatebox" class="LC_left_float" style="display: '.
+               $display{'templatebox'}.';"><fieldset><legend>'.$lt{'templateboxes'}.
+               ' <input type="button" value="'.&mt('check all').'" '.
+               'onclick="javascript:checkAll('."document.syllabus.showfield".');javascript:toggleBox('."'all'".');" />'.
+               (' 'x2).
+               '<input type="button" value="'.&mt('uncheck all').'" '.
+               'onclick="javascript:uncheckAll('."document.syllabus.showfield".');javascript:toggleBox('."'all'".');" />'.
+               '</legend>'.
+               &fields_check_uncheck($fields,$values).
+               '</fieldset>'.
+               '</div>';
+    $output .= '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
+               '</form>';
+    return $output;
+}
+
+sub fields_check_uncheck {
+    my ($fields,$values) = @_;
+    return unless ((ref($fields) eq 'HASH') && (ref($values) eq 'HASH'));
+    my $numinrow = 4;
+    my $table;
+    my @fieldnames = sort(keys(%{$fields}));
+    unshift(@fieldnames,'000_showrssfeeds'); 
+    my $numfields = scalar(@fieldnames);
+    for (my $i=0; $i<$numfields; $i++) {
+        my $checked;
+        my $name = $fields->{$fieldnames[$i]};
+        if ($fieldnames[$i] eq '000_showrssfeeds') {
+            $name = &mt('RSS Feeds and Blogs');
+            unless ($values->{$fieldnames[$i]} eq 'on') {
+                $checked = ' checked="checked"';
+            }
+        } elsif ($values->{$fieldnames[$i]} ne '') {
+            $checked = ' checked="checked"';
+        }
+        my $rem = $i%($numinrow);
+        if ($rem == 0) {
+            if (($i > 0) && ($i < $numfields-1)) {
+                $table .= '</tr>';
+            }
+            if ($i < $numfields-1) {
+                $table .= '<tr>';
+            }
+        }
+        $table .=
+            '<td><label><input type="checkbox" name="showfield" value="'.$fieldnames[$i].'" '.
+            $checked.' id="showfield_'.$i.'" onclick="javascript:toggleBox('."'$fieldnames[$i]',this".');" />'.
+            $name.'</label></td>'."\n";
+    }
+    if ($table ne '') {
+        my $rem = $numfields%($numinrow);
+        my $colsleft = $numinrow - $rem;
+        if ($colsleft > 1 ) {
+            $table .= '<td colspan="'.$colsleft.'"> </td>';
+        } elsif ($colsleft == 1) {
+            $table .= '<td> </td>';
+        }
+        $table = '<table>'.$table.'</tr></table>';
+    }
+    return $table;
+}
+
+sub process_upload {
+    my ($upload_output,$cnum,$cdom,$allfiles,$codebase) = @_;
+    my ($parseaction,$showupload,$mimetype);
+    my $dest = 'portfolio/syllabus';
+    if ($env{'form.parserflag'}) {
+        $parseaction = 'parse';
+    }
+    my $url=&Apache::lonnet::userfileupload('syllabusfile','syllabus',$dest,
+                                            $parseaction,$allfiles,
+                                            $codebase,undef,undef,undef,undef,
+                                            undef,undef,\$mimetype);
+    if ($url =~ m{^/uploaded/\Q$cdom\E/\Q$cnum\E.*/([^/]+)$}) {
+        my $stored = $1;
+        $showupload = '<p>'.&mt('Uploaded [_1]',
+                                '<span class="LC_filename">'.$stored.'</span>').
+                      '</p>';
+    } else {
+        my ($filename) = ($env{'form.syllabusfile.filename'} =~ m{([^/]+)$});
+        $$upload_output = '<div class="LC_error" id="uploadfileresult">'.
+                          &mt('Unable to save file [_1].',
+                              '<span class="LC_filename">'.$filename.'</span>').
+                          '</div>';
+        return (); 
+    }
+    my $needlink;
+    if (($parseaction eq 'parse') && ($mimetype eq 'text/html')) {
+        $$upload_output = $showupload;
+        my $total_embedded = scalar(keys(%{$allfiles}));
+        if ($total_embedded > 0) {
+            my $uploadphase = 'upload_embedded';
+            my $primaryurl = &HTML::Entities::encode($url,'<>&"');
+            my $state = &embedded_form_elems($uploadphase,$primaryurl);
+            my $actionurl = "/public/$cdom/$cnum/syllabus";
+            my ($embedded,$num,$numpathchanges,$existing);
+            ($embedded,$num,$numpathchanges,$existing) =
+                &Apache::loncommon::ask_for_embedded_content($actionurl,$state,
+                                                             $allfiles,$codebase,
+                                                            {'error_on_invalid_names'   => 1,
+                                                             'ignore_remote_references' => 1,});
+            if ($embedded) {
+                $needlink = 1;
+                if ($num) {
+                    $$upload_output .=
+                        '<p>'.&mt('This file contains embedded multimedia objects, which need to be uploaded.').'</p>'.$embedded;
+                } elsif ($numpathchanges) {
+                    $$upload_output .= $embedded;
+                } else {
+                    $$upload_output .= $embedded;
+                    &Apache::loncommon::modify_html_refs('syllabus','portfolio/syllabus',
+                                                         $cnum,$cdom,'/userfiles',$url);
+                }
+            } else {
+                $$upload_output .= &mt('Embedded item(s) already present, so no additional upload(s) required').'<br />';
+                &Apache::loncommon::modify_html_refs('syllabus','portfolio/syllabus',
+                                                     $cnum,$cdom,'/userfiles',$url);
+
+            }
+        } else {
+            $$upload_output .= &mt('No embedded items identified').'<br />';
+        }
+        $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';
+    }
+    return ($url,$needlink);
+}
+
+sub embedded_form_elems {
+    my ($phase,$primaryurl) = @_;
+    return <<STATE;
+    <input type="hidden" name="forceedit" value="1" />
+    <input type="hidden" name="cmd" value="upload_embedded" />
+    <input type="hidden" name="phase" value="$phase" />
+    <input type="hidden" name="primaryurl" value="$primaryurl" />
+STATE
+}
+
+sub return_to_editor {
+    my ($cdom,$cnum) = @_;
+    my $actionurl = "/public/$cdom/$cnum/syllabus";
+    return '<p><form name="backtoeditor" method="post" action="'.$actionurl.'" />'.
+           '<input type="hidden" name="forceedit" value="1" />'."\n".
+           '<a href="javascript:document.backtoeditor.submit();">'.&mt('Return to Editor').
+           '</a></p>';
+}
+
 1;
 __END__
Index: loncom/interface/lonmenu.pm
diff -u loncom/interface/lonmenu.pm:1.410 loncom/interface/lonmenu.pm:1.411
--- loncom/interface/lonmenu.pm:1.410	Tue Mar 19 23:28:57 2013
+++ loncom/interface/lonmenu.pm	Wed Apr 24 02:43:59 2013
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines to control the menu
 #
-# $Id: lonmenu.pm,v 1.410 2013/03/19 23:28:57 raeburn Exp $
+# $Id: lonmenu.pm,v 1.411 2013/04/24 02:43:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -847,23 +847,15 @@
 # This applies in course context
 #
         if (($resurl eq "/public/$cdom/$cnum/syllabus") && ($perms{'mdc'})) {
-            if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) {
-                &switch('','',6,1,'pcstr.png','Edit',
-                        'resource[_2]',
-                        "go('/adm/courseprefs?phase=display&actions=courseinfo')",
-                        'Edit this resource');
-                $editbutton = 1;
+            $cfile = $resurl;
+            $home = &Apache::lonnet::homeserver($cnum,$cdom);
+            if ($env{'form.forceedit'}) {
+                $forceview = 1;
             } else {
-                $cfile = $resurl;
-                $home = &Apache::lonnet::homeserver($cnum,$cdom);
-                if ($env{'form.forceedit'}) {
-                    $forceview = 1;
-                } else {
-                    $forceedit = 1;
-                }
-                $editbutton = &get_editbutton($cfile,$home,$switchserver,
-                                              $forceedit,$forceview,$forcereg);
+                $forceedit = 1;
             }
+            $editbutton = &get_editbutton($cfile,$home,$switchserver,
+                                          $forceedit,$forceview,$forcereg);
         } elsif (($resurl eq '/adm/extresedit') &&
                  (($env{'form.symb'}) || ($env{'form.folderpath'}))) {
             ($cfile,$home,$switchserver,$forceedit,$forceview) =
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1122 loncom/interface/loncommon.pm:1.1123
--- loncom/interface/loncommon.pm:1.1122	Thu Apr 11 16:30:37 2013
+++ loncom/interface/loncommon.pm	Wed Apr 24 02:43:59 2013
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1122 2013/04/11 16:30:37 bisitz Exp $
+# $Id: loncommon.pm,v 1.1123 2013/04/24 02:43:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -7813,9 +7813,11 @@
     $LCcurrentid=$$.'_'.$LCidcnt;
     my $starting=&mt('Starting');
     my $content=(<<ENDPROGBAR);
+<p>
   <div id="progressbar$LCcurrentid">
     <span class="pblabel">$starting</span>
   </div>
+</p>
 ENDPROGBAR
     &r_print($r,$content.&LCprogressbar_script($LCcurrentid));
 }
@@ -9558,18 +9560,23 @@
     my $heading = &mt('Upload embedded files');
     my $buttontext = &mt('Upload');
 
-    my $navmap;
+    my ($navmap,$cdom,$cnum);
     if ($env{'request.course.id'}) {
-        $navmap = Apache::lonnavmaps::navmap->new();
+        if ($actionurl eq '/adm/dependencies') {
+            $navmap = Apache::lonnavmaps::navmap->new();
+        }
+        $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+        $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     }
-    if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) {
+    if (($actionurl eq '/adm/portfolio') || 
+        ($actionurl eq '/adm/coursegrp_portfolio')) {
         my $current_path='/';
         if ($env{'form.currentpath'}) {
             $current_path = $env{'form.currentpath'};
         }
         if ($actionurl eq '/adm/coursegrp_portfolio') {
-            $udom = $env{'course.'.$env{'request.course.id'}.'.domain'};
-            $uname = $env{'course.'.$env{'request.course.id'}.'.num'};
+            $udom = $cdom;
+            $uname = $cnum;
             $url = '/userfiles/groups/'.$env{'form.group'}.'/portfolio';
         } else {
             $udom = $env{'user.domain'};
@@ -9601,8 +9608,6 @@
         }
     } elsif ($actionurl eq '/adm/dependencies')  {
         if ($env{'request.course.id'} ne '') {
-            $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
-            $cnum =  $env{'course.'.$env{'request.course.id'}.'.num'};
             if (ref($args) eq 'HASH') {
                 $url = $args->{'docs_url'};
                 $title = $args->{'docs_title'};
@@ -9616,8 +9621,15 @@
                 $heading = &mt('Status of dependencies in [_1]',"$title ($filename)");
             }
         }
+    } elsif ($actionurl eq "/public/$cdom/$cnum/syllabus") {
+        $udom = $cdom;
+        $uname = $cnum;
+        $url = "/uploaded/$cdom/$cnum/portfolio/syllabus";
+        $toplevel = $url;
+        $path = $url;
+        $fileloc = &Apache::lonnet::filelocation('',$toplevel).'/';
+        $fileloc =~ s{^/}{};
     }
-    my $now = time();
     foreach my $embed_file (keys(%{$allfiles})) {
         my $absolutepath;
         if ($embed_file =~ m{^\w+://}) {
@@ -9656,7 +9668,8 @@
     my $dirptr = 16384;
     foreach my $path (keys(%subdependencies)) {
         $currsubfile{$path} = {};
-        if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { 
+        if (($actionurl eq '/adm/portfolio') || 
+            ($actionurl eq '/adm/coursegrp_portfolio')) {
             my ($sublistref,$listerror) =
                 &Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath);
             if (ref($sublistref) eq 'ARRAY') {
@@ -9672,9 +9685,15 @@
             }
         } elsif (($actionurl eq '/adm/dependencies') ||
                  (($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') &&
-                  ($args->{'context'} eq 'paste'))) {
+                  ($args->{'context'} eq 'paste')) ||
+                 ($actionurl eq "/public/$cdom/$cnum/syllabus")) {
             if ($env{'request.course.id'} ne '') {
-                my ($dir) = ($fileloc =~ m{^(.+/)[^/]+$});
+                my $dir;
+                if ($actionurl eq "/public/$cdom/$cnum/syllabus") {
+                    $dir = $fileloc;
+                } else {
+                    ($dir) = ($fileloc =~ m{^(.+/)[^/]+$});
+                }
                 if ($dir ne '') {
                     my ($sublistref,$listerror) =
                         &Apache::lonnet::dirlist($dir.$path,$cdom,$cnum,$getpropath,undef,'/');
@@ -9722,7 +9741,8 @@
         }
     }
     my %currfile;
-    if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) {
+    if (($actionurl eq '/adm/portfolio') ||
+        ($actionurl eq '/adm/coursegrp_portfolio')) {
         my ($dirlistref,$listerror) =
             &Apache::lonnet::dirlist($url,$udom,$uname,$getpropath);
         if (ref($dirlistref) eq 'ARRAY') {
@@ -9738,7 +9758,8 @@
         }
     } elsif (($actionurl eq '/adm/dependencies') ||
              (($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') &&
-              ($args->{'context'} eq 'paste'))) {
+              ($args->{'context'} eq 'paste')) ||
+             ($actionurl eq "/public/$cdom/$cnum/syllabus")) {
         if ($env{'request.course.id'} ne '') {
             my ($dir) = ($fileloc =~ m{^(.+/)[^/]+$});
             if ($dir ne '') {
@@ -9787,28 +9808,38 @@
         ($args->{'context'} eq 'paste')) {
         $counter = scalar(keys(%existing));
         $numpathchg = scalar(keys(%pathchanges));
-        return ($output,$counter,$numpathchg,\%existing); 
+        return ($output,$counter,$numpathchg,\%existing);
+    } elsif (($actionurl eq "/public/$cdom/$cnum/syllabus") && 
+             (ref($args) eq 'HASH') && ($args->{'context'} eq 'rewrites')) {
+        $counter = scalar(keys(%existing));
+        $numpathchg = scalar(keys(%pathchanges));
+        return ($output,$counter,$numpathchg,\%existing,\%mapping);
     }
     foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) {
         if ($actionurl eq '/adm/dependencies') {
             next if ($embed_file =~ m{^\w+://});
         }
         $upload_output .= &start_data_table_row().
-                          '<td><img src="'.&icon($embed_file).'" /> '.
+                          '<td valign="top"><img src="'.&icon($embed_file).'" /> '.
                           '<span class="LC_filename">'.$embed_file.'</span>';
         unless ($mapping{$embed_file} eq $embed_file) {
-            $upload_output .= '<br /><span class="LC_info" style="font-size:smaller;">'.&mt('changed from: [_1]',$mapping{$embed_file}).'</span>';
+            $upload_output .= '<br /><span class="LC_info" style="font-size:smaller;">'.
+                              &mt('changed from: [_1]',$mapping{$embed_file}).'</span>';
         }
-        $upload_output .= '</td><td>';
+        $upload_output .= '</td>';
         if ($args->{'ignore_remote_references'} && $embed_file =~ m{^\w+://}) { 
-            $upload_output.='<span class="LC_warning">'.&mt("URL points to other server.").'</span>';
+            $upload_output.='<td align="right">'.
+                            '<span class="LC_info LC_fontsize_medium">'.
+                            &mt("URL points to web address").'</span>';
             $numremref++;
         } elsif ($args->{'error_on_invalid_names'}
             && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) {
-            $upload_output.='<span class="LC_warning">'.&mt('Invalid characters').'</span>';
+            $upload_output.='<td align="right"><span class="LC_warning">'.
+                            &mt('Invalid characters').'</span>';
             $numinvalid++;
         } else {
-            $upload_output .= &embedded_file_element('upload_embedded',$counter,
+            $upload_output .= '<td>'.
+                              &embedded_file_element('upload_embedded',$counter,
                                                      $embed_file,\%mapping,
                                                      $allfiles,$codebase,'upload');
             $counter ++;
@@ -9837,8 +9868,9 @@
             $counter ++;
         } else {
             $upload_output .= &start_data_table_row().
-                              '<td><span class="LC_filename">'.$embed_file.'</span></td>';
-                              '<td><span class="LC_warning">'.&mt('Already exists').'</span></td>'.
+                              '<td valign="top"><img src="'.&icon($embed_file).'" /> '.
+                              '<span class="LC_filename">'.$embed_file.'</span></td>'.
+                              '<td align="right"><span class="LC_info LC_fontsize_medium">'.&mt('Already exists').'</span></td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
         }
     }
@@ -9933,7 +9965,7 @@
         $output = '<b>'.&mt('Referenced files').'</b>:<br />';
         if ($applies > 1) {
             $output .=  
-                &mt('No files need to be uploaded, as one of the following applies to each reference:').'<ul>';
+                &mt('No dependencies need to be uploaded, as one of the following applies to each reference:').'<ul>';
             if ($numremref) {
                 $output .= '<li>'.&mt('reference is to a URL which points to another server').'</li>'."\n";
             }
@@ -9989,13 +10021,13 @@
         } elsif ($actionurl eq '/adm/dependencies') {
             $output .= '<input type="hidden" name="action" value="process_changes" />';
         }
-        $output .=  '<input type ="submit" value="'.$buttontext.'" />'."\n".'</form>'."\n";
+        $output .= '<input type ="submit" value="'.$buttontext.'" />'."\n".'</form>'."\n";
     } elsif ($numpathchg) {
         my %pathchange = ();
         $output .= &modify_html_form('pathchange',$actionurl,$state,\%pathchange,$pathchange_output);
         if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) {
             $output .= '<p>'.&mt('or').'</p>'; 
-        } 
+        }
     }
     return ($output,$counter,$numpathchg);
 }
@@ -10135,17 +10167,19 @@
             next;
         }
         $env{'form.embedded_item_'.$i.'.filename'}=$fname;
+        my $subdir = $path;
+        $subdir =~ s{/+$}{};
         if ($context eq 'portfolio') {
             my $result;
             if ($state eq 'existingfile') {
                 $result=
                     &Apache::lonnet::userfileupload('embedded_item_'.$i,'existingfile',
-                                                    $dirpath.$env{'form.currentpath'}.$path);
+                                                    $dirpath.$env{'form.currentpath'}.$subdir);
             } else {
                 $result=
                     &Apache::lonnet::userfileupload('embedded_item_'.$i,'',
                                                     $dirpath.
-                                                    $env{'form.currentpath'}.$path);
+                                                    $env{'form.currentpath'}.$subdir);
                 if ($result !~ m|^/uploaded/|) {
                     $output .= '<span class="LC_error">'
                                .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].'
@@ -10157,10 +10191,10 @@
                                $path.$fname.'</span>').'<br />';     
                 }
             }
-        } elsif ($context eq 'coursedoc') {
+        } elsif (($context eq 'coursedoc') || ($context eq 'syllabus')) {
             my $result =
-                &Apache::lonnet::userfileupload('embedded_item_'.$i,'coursedoc',
-                                                $dirpath.'/'.$path);
+                &Apache::lonnet::userfileupload('embedded_item_'.$i,$context,
+                                                $dirpath.'/'.$subdir);
             if ($result !~ m|^/uploaded/|) {
                 $output .= '<span class="LC_error">'
                            .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].'
@@ -10170,6 +10204,7 @@
             } else {
                 $output .= &mt('Uploaded [_1]','<span class="LC_filename">'.
                            $path.$fname.'</span>').'<br />';
+                &Apache::lonnet::make_public_indefinitely($result);
             }
         } else {
 # Save the file
@@ -10301,7 +10336,7 @@
 }
 
 sub modify_html_refs {
-    my ($context,$dirpath,$uname,$udom,$dir_root) = @_;
+    my ($context,$dirpath,$uname,$udom,$dir_root,$url) = @_;
     my $container;
     if ($context eq 'portfolio') {
         $container = $env{'form.container'};
@@ -10310,6 +10345,8 @@
     } elsif ($context eq 'manage_dependencies') {
         (undef,undef,$container) = &Apache::lonnet::decode_symb($env{'form.symb'});
         $container = "/$container";
+    } elsif ($context eq 'syllabus') {
+        $container = $url;
     } else {
         $container = $Apache::lonnet::perlvar{'lonDocRoot'}.$env{'form.filename'};
     }
@@ -10323,7 +10360,7 @@
         }
     }
     if (($context eq 'portfolio') || ($context eq 'coursedoc') || 
-        ($context eq 'manage_dependencies')) {
+        ($context eq 'manage_dependencies') || ($context eq 'syllabus')) {
         unless ($container =~ m{^/uploaded/\Q$udom\E/\Q$uname\E/}) {
             if (wantarray) {
                 return ('',0,0);
@@ -10379,6 +10416,7 @@
                     if ($content =~ m{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}) {
                         my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi);
                         $count += $numchg;
+                        $allfiles{$newname} = $allfiles{$ref};
                     }
                     if ($env{'form.embedded_codebase_'.$i} ne '') {
                         $codebase = &unescape($env{'form.embedded_codebase_'.$i});
@@ -10387,10 +10425,11 @@
                     }
                 }
             }
+            my $skiprewrites;
             if ($count || $codebasecount) {
                 my $saveresult;
                 if (($context eq 'portfolio') || ($context eq 'coursedoc') || 
-                    ($context eq 'manage_dependencies')) {
+                    ($context eq 'manage_dependencies') || ($context eq 'syllabus')) {
                     my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult);
                     if ($url eq $container) {
                         my ($fname) = ($container =~ m{/([^/]+)$});
@@ -10403,6 +10442,11 @@
                                    '<span class="LC_filename">'.
                                    $container.'</span>').'</p>';
                     }
+                    if ($context eq 'syllabus') {
+                        unless ($saveresult eq 'ok') {
+                            $skiprewrites = 1;
+                        }
+                    }
                 } else {
                     if (open(my $fh,">$container")) {
                         print $fh $content;
@@ -10418,6 +10462,47 @@
                     }
                 }
             }
+            if (($context eq 'syllabus') && (!$skiprewrites)) {
+                my ($actionurl,$state);
+                $actionurl = "/public/$udom/$uname/syllabus";
+                my ($ignore,$num,$numpathchanges,$existing,$mapping) =
+                    &ask_for_embedded_content($actionurl,$state,\%allfiles,
+                                              \%codebase,
+                                              {'context' => 'rewrites',
+                                               'ignore_remote_references' => 1,});
+                if (ref($mapping) eq 'HASH') {
+                    my $rewrites = 0;
+                    foreach my $key (keys(%{$mapping})) {
+                        next if ($key =~ m{^https?://});
+                        my $ref = $mapping->{$key};
+                        my $newname = "/uploaded/$udom/$uname/portfolio/syllabus/$key";
+                        my $attrib;
+                        if (ref($allfiles{$mapping->{$key}}) eq 'ARRAY') {
+                            $attrib = join('|',@{$allfiles{$mapping->{$key}}});
+                        }
+                        if ($content =~ m{($attrib\s*=\s*['"]?)\Q$ref\E(['"]?)}) {
+                            my $numchg = ($content =~ s{($attrib\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi);
+                            $rewrites += $numchg;
+                        }
+                    }
+                    if ($rewrites) {
+                        my $saveresult; 
+                        my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult);
+                        if ($url eq $container) {
+                            my ($fname) = ($container =~ m{/([^/]+)$});
+                            $output .= '<p>'.&mt('Rewrote [quant,_1,link] as [quant,_1,absolute link] in [_2].',
+                                            $count,'<span class="LC_filename">'.
+                                            $fname.'</span>').'</p>';
+                        } else {
+                            $output .= '<p class="LC_error">'.
+                                       &mt('Error: could not update links in [_1].',
+                                       '<span class="LC_filename">'.
+                                       $container.'</span>').'</p>';
+
+                        }
+                    }
+                }
+            }
         } else {
             &logthis('Failed to parse '.$container.
                      ' to modify references: '.$parse_result);
Index: loncom/interface/lontemplate.pm
diff -u loncom/interface/lontemplate.pm:1.46 loncom/interface/lontemplate.pm:1.47
--- loncom/interface/lontemplate.pm:1.46	Tue Dec 18 15:46:34 2012
+++ loncom/interface/lontemplate.pm	Wed Apr 24 02:43:59 2013
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # "Template" Functions to generate html output
 #
-# $Id: lontemplate.pm,v 1.46 2012/12/18 15:46:34 raeburn Exp $
+# $Id: lontemplate.pm,v 1.47 2013/04/24 02:43:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -115,8 +115,12 @@
 }
 
 sub print_start_template {
-	my ($r,$topic,$boxclass) = @_;
-	$r->print('<div class="'.$boxclass.'">');
+	my ($r,$topic,$boxclass,$id,$display) = @_;
+        my $idattrib; 
+        if ($id ne '') {
+            $idattrib = ' id="'.$id.'"';
+        }
+	$r->print('<div class="'.$boxclass.'"'.$idattrib.$display.'>');
 	$r->print('<h4 class="LC_hcell">'.$topic.'</h4>');
 }
 
@@ -146,25 +150,30 @@
 }
 
 sub print_template_fields {
-	my ($r, $data_ref, $fields_ref, $target, $allowed, $default_rich_text, $custom_handlers_ref, $group) = @_;
+	my ($r, $data_ref, $fields_ref, $target, $allowed, $default_rich_text, $custom_handlers_ref, $group,
+            $displayref) = @_;
 	my @html_ids = ();
 	my %data = %{$data_ref};
 	my %fields = %{$fields_ref};
 	my %custom_handlers = %{$custom_handlers_ref};
-
+        my %displays;
+        if (ref($displayref) eq 'HASH') {
+            %displays = %{$displayref};
+        }
 	foreach my $field (sort(keys(%fields))) {
 		my $message = $data{$field} if (($data{$field}=~/\w/) || ($allowed));
 		my $legacy = 1;
+                my $display = $displays{$field};
 		my $gateway = Apache::lonhtmlgateway->new($target);
         $message = &Encode::decode('utf8', $message);		
         $message = $gateway->process_outgoing_html($message, $legacy);
         if ((%custom_handlers) && ($custom_handlers{$field})) {
-			$custom_handlers{$field}->($r, $field, $message, $group, $data_ref, $fields_ref, $target, $allowed);
+			$custom_handlers{$field}->($r, $field, $message, $group, $data_ref, $fields_ref, $target, $allowed, $display);
 		} else {
 			if (($data{$field}=~/\w/) || ($allowed)) {
 				if ($target ne 'tex') {
 					#output of syllabusfields will be generated here. 
-					&Apache::lontemplate::print_start_template($r,$fields{$field},'LC_Box');
+					&Apache::lontemplate::print_start_template($r,$fields{$field},'LC_Box','box_'.$field,$display);
 					$r->print($message);
 					if ($allowed) {
 						$r->print("<br /><div>");
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.1219 loncom/lonnet/perl/lonnet.pm:1.1220
--- loncom/lonnet/perl/lonnet.pm:1.1219	Thu Apr 11 15:30:42 2013
+++ loncom/lonnet/perl/lonnet.pm	Wed Apr 24 02:44:05 2013
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.1219 2013/04/11 15:30:42 raeburn Exp $
+# $Id: lonnet.pm,v 1.1220 2013/04/24 02:44:05 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -3213,7 +3213,7 @@
     } else {
         my $docuname=$env{'user.name'};
         my $docudom=$env{'user.domain'};
-        if (exists($env{'form.group'})) {
+        if ((exists($env{'form.group'})) || ($context eq 'syllabus')) {
             $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
             $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
         }


More information about the LON-CAPA-cvs mailing list