--- loncom/interface/lonhtmlcommon.pm	2015/05/28 12:20:16	1.365
+++ loncom/interface/lonhtmlcommon.pm	2016/10/31 19:49:00	1.376
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common html routines
 #
-# $Id: lonhtmlcommon.pm,v 1.365 2015/05/28 12:20:16 raeburn Exp $
+# $Id: lonhtmlcommon.pm,v 1.376 2016/10/31 19:49:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -538,6 +538,8 @@ sub date_setter {
 
     if (! defined($state) || $state ne 'disabled') {
         $state = '';
+    } else {
+        $state = 'disabled="disabled"';
     }
     if (! defined($no_hh_mm_ss)) {
         $no_hh_mm_ss = 0;
@@ -673,7 +675,7 @@ ENDJS
     my $minuteselector = qq{<input type="text" name="$dname\_minute" $special $state value="$min" size="3" />};
     my $secondselector= qq{<input type="text" name="$dname\_second" $special $state value="$sec" size="3" />};
     my $cal_link;
-    if (!$nolink) {
+    unless (($nolink) || ($state eq 'disabled')) {
         $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};
     }
     #
@@ -700,7 +702,7 @@ ENDJS
                       $hourselector,$minuteselector,$secondselector).
                    $tzone;
     }
-    if (!$nolink) {
+    unless (($nolink) || ($state eq 'disabled')) {
         $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');
     }
     $result .= "</span>\n<!-- end $dname date setting form -->\n";
@@ -1194,7 +1196,7 @@ sub Close_PrgWin {
 # ------------------------------------------------------- Puts directory header
 
 sub crumbs {
-    my ($uri,$target,$prefix,$form,$skiplast)=@_;
+    my ($uri,$target,$prefix,$form,$skiplast,$onclick)=@_;
 # You cannot crumbnify uploaded or adm resources
     if ($uri=~/^\/*(uploaded|adm)\//) { return &mt('(Internal Course/Group Content)'); }
     if ($target) {
@@ -1220,9 +1222,9 @@ sub crumbs {
             &Apache::loncommon::inhibit_menu_check(\$href_path);
             if ($form) {
                 my $href = 'javascript:'.$form.".action='".$href_path."';".$form.'.submit();';
-                $output.=qq{<a href="$href"$target>$dir</a>/};
+                $output.=qq{<a href="$href"$onclick$target>$dir</a>/};
             } else {
-                $output.=qq{<a href="$href_path"$target>$dir</a>/};
+                $output.=qq{<a href="$href_path"$onclick$target>$dir</a>/};
             }
         }
     } else {
@@ -1293,9 +1295,9 @@ sub htmlareaheaders {
 ENDEDITOR
 	}
     $s.=(<<ENDJQUERY);
-<script type="text/javascript" src="/adm/jQuery/js/jquery-1.6.2.min.js"></script>
-<script type="text/javascript" src="/adm/jQuery/js/jquery-ui-1.8.16.custom.min.js"></script>
-<link rel="stylesheet" type="text/css" href="/adm/jQuery/css/smoothness/jquery-ui-1.8.16.custom.css" />
+<script type="text/javascript" src="/adm/jQuery/js/jquery-1.11.3.min.js"></script>
+<script type="text/javascript" src="/adm/jQuery/js/jquery-ui-1.11.4.custom.min.js"></script>
+<link rel="stylesheet" type="text/css" href="/adm/jQuery/css/smoothness/jquery-ui-1.11.4.custom.css" />
 <script type="text/javascript" src="/adm/jpicker/js/jpicker-1.1.6.min.js" >
 </script>
 <link rel="stylesheet" type="text/css" href="/adm/jpicker/css/jPicker-1.1.6.min.css" />
@@ -1704,7 +1706,8 @@ sub show_return_link {
     if ($env{'request.noversionuri'}=~m{^/priv/} ||
         $env{'request.uri'}=~m{^/priv/}) { return 1; }
     return if ($env{'request.noversionuri'} eq '/adm/supplemental');
-
+    return if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
+               (!$env{'request.role.adv'}));
     if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
         || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
 
@@ -1718,7 +1721,7 @@ sub show_return_link {
             (($env{'request.noversionuri'}=~/^\/adm\//) &&
              ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
              ($env{'request.noversionuri'}!~
-              m{^/adm/.*/(smppg|bulletinboard)($|\?)})
+              m{^/adm/.*/(smppg|bulletinboard|exttools?)($|\?)})
            ));
 }
 
@@ -1868,7 +1871,7 @@ returns: nothing
     
     sub breadcrumbs {
         my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, 
-            $CourseBreadcrumbs,$topic_help,$topic_help_text) = @_;
+            $CourseBreadcrumbs,$topic_help,$topic_help_text,$crstype) = @_;
         #
         $css_class ||= 'LC_breadcrumbs';
 
@@ -1883,6 +1886,11 @@ returns: nothing
         #
         # The first one should be the course or a menu link
         if (!defined($menulink)) { $menulink=1; }
+        if ((($crstype eq 'Placement') || (($env{'request.course.id'}) &&
+            ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement'))) &&
+            (!$env{'request.role.adv'})) {
+            undef($menulink);
+        }
         if ($menulink) {
             my $description = 'Menu';
             my $no_mt_descr = 0;
@@ -2098,6 +2106,16 @@ returns: nothing
         undef(%tools);
     }
 
+=item &current_breadcrumb_tools()
+
+returns: a hash containing the current breadcrumb tools.
+
+=cut
+
+    sub current_breadcrumb_tools {
+        return %tools;
+    }
+
 =item &render_tools(\$breadcrumbs)
 
 Creates html for breadcrumb tools (categories navigation and tools) and inserts 
@@ -2478,7 +2496,7 @@ sub course_selection {
     if ($totcodes > 0) {
         my $numtitles = @$codetitles;
         if ($numtitles > 0) {
-            $output .= '<label><input type="radio" name="coursepick" value="category" onclick="coursePick(this.form);alert('."'".&mt('Choose categories, from left to right')."'".')" />'.&mt('Pick courses by category:').'</label><br />';
+            $output .= '<label><input type="radio" name="coursepick" value="category" onclick="coursePick(this.form);alert('."'".&html_escape(&mt('Choose categories, from left to right'))."'".')" />'.&mt('Pick courses by category:').'</label><br />';
             $output .= '<table><tr><td>'.$$codetitles[0].'<br />'."\n".
                '<select name="'.$standardnames->[0].
                '" onchange="setPick(this.form);courseSet('."'$$codetitles[0]'".')">'."\n".
@@ -2657,9 +2675,9 @@ sub resource_info_box {
 #
 
 sub display_usage {
-    my ($current_disk_usage,$disk_quota) = @_;
-    my $usage = $current_disk_usage/1000;
-    my $quota = $disk_quota/1000;
+    my ($current_disk_usage,$disk_quota,$context) = @_;
+    my $usage = $current_disk_usage/1024;
+    my $quota = $disk_quota/1024;
     my $percent;
     if ($disk_quota == 0) {
         $percent = 100.0;
@@ -2683,9 +2701,13 @@ sub display_usage {
     if ($prog_width > 100) {
         $prog_width = 100;
     }
+    my $display = 'block';
+    if ($context eq 'authoring') {
+        $display = 'inline';
+    }
     return '
-  <div id="meter1" align="left" '.$cssclass.'>'.&mt('Currently using [_1] of the [_2] available.',$usage.' MB <span style="font-weight:bold;">('.$percent.'%)</span>',$quota.' MB')."\n".
-'   <div id="meter2" style="display:block; margin-top:5px; margin-bottom:5px; margin-left:0px; margin-right:0px; width:400px; border:1px solid #000000; height:10px;">'."\n".
+  <div id="meter1" align="left" style="display:'.$display.'" '.$cssclass.'>'.&mt('Currently using [_1] of the [_2] available.',$usage.' MB <span style="font-weight:bold;">('.$percent.'%)</span>',$quota.' MB')."\n".
+'   <div id="meter2" style="display:block; margin-top:3px; margin-bottom:3px; margin-left:0px; margin-right:0px; width:400px; border:1px solid #000000; height:10px;">'."\n".
 '    <div id="meter3" style="display:block; background-color:'.$color.'; width:'.$prog_width.'%; height:10px; color:#000000; margin:0px;"></div>'."\n".
 '   </div>'."\n".
 '  </div>';
@@ -2935,10 +2957,12 @@ sub set_form_elements {
 
 sub file_submissionchk_js {
     my ($turninpaths,$multiples) = @_;
-    my $overwritewarn = &mt('File(s) you uploaded for your submission will overwrite existing file(s) submitted for this item').'\\n'.
+    my $overwritewarn = &mt('File(s) you uploaded for your submission will overwrite existing file(s) submitted for this item')."\n".
                       &mt('Continue submission and overwrite the file(s)?');
-    my $delfilewarn = &mt('You have indicated you wish to remove some files previously included in your submission.').'\\n'.
+    &js_escape(\$overwritewarn);
+    my $delfilewarn = &mt('You have indicated you wish to remove some files previously included in your submission.')."\n".
                       &mt('Continue submission with these files removed?');
+    &js_escape(\$delfilewarn);
     my ($turninpathtext,$multtext,$arrayindexofjs);
     if (ref($turninpaths) eq 'HASH') {
         foreach my $key (sort(keys(%{$turninpaths}))) {
@@ -3443,8 +3467,9 @@ THIRD
 ##############################################
 
 sub javascript_jumpto_resource {
-    my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
+    my $confirm_switch = &mt("Editing requires switching to the resource's home server.")."\n".
                          &mt('Switch server?');
+    &js_escape(\$confirm_switch);
     return (<<ENDUTILITY)
 
 function go(url) {
@@ -3470,8 +3495,8 @@ ENDUTILITY
 
 sub jump_to_editres {
     my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$folderpath,
-        $title,$idx,$suppurl,$todocs) = @_;
-    my $jscall;
+        $title,$idx,$suppurl,$todocs,$suppanchor) = @_;
+    my ($jscall,$anchor);
     if ($switchserver) {
         if ($home) {
             $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.
@@ -3491,7 +3516,16 @@ sub jump_to_editres {
         }
     } else {
         unless ($cfile =~ m{^/priv/}) {
+            if ($cfile =~ m{^(/adm/wrapper/ext/[^#]+)#([^#]+)$}) {
+                $cfile = $1;
+                $anchor = $2;
+            }
             if ($symb) {
+                if ($anchor ne '') {
+                    if ($symb =~ m{^([^#]+)\Q#$anchor\E$}) {
+                        $symb = $1.&escape(&escape('#')).$anchor;
+                    }
+                }
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?')."symb=$symb";
             } elsif ($folderpath) {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').
@@ -3515,9 +3549,16 @@ sub jump_to_editres {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').'register=1';
             }
             if ($todocs) {
-               $cfile .= (($cfile=~/\?/)?'&amp;':'?').'todocs=1';
+                $cfile .= (($cfile=~/\?/)?'&amp;':'?').'todocs=1';
+            }
+            if ($suppanchor ne '') {
+                $cfile .= (($cfile=~/\?/)?'&amp;':'?').'anchor='.
+                          &HTML::Entities::encode($suppanchor,'"<>&');
             }
         }
+        if ($anchor ne '') {
+            $cfile .= '#'.$anchor;
+        }
         $jscall = "go('".&Apache::loncommon::escape_single($cfile)."')";
     }
     return $jscall;