Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.331 and 1.358.2.6

version 1.331, 2012/11/16 23:37:16 version 1.358.2.6, 2016/08/10 03:17:15
Line 64  use HTML::Entities(); Line 64  use HTML::Entities();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub java_not_enabled {  sub java_not_enabled {
    return "\n".'<span class="LC_error">'.      if (($env{'browser.mobile'}) && ($env{'browser.mobile'} =~ /^ipad|ipod|iphone$/i)) {
           &mt('The required Java applet could not be started. Please make sure to have Java installed and active in your browser.').          return "\n".'<span class="LC_error">'.
           "</span>\n";                 &mt('The required Java applet could not be started, because Java is not supported by your mobile device.').
                  "</span>\n";
       } else {
           return "\n".'<span class="LC_error">'.
                  &mt('The required Java applet could not be started. Please make sure to have Java installed and active in your browser.').
                  "</span>\n";
       }
 }  }
   
 sub coursepreflink {  sub coursepreflink {
Line 170  sub dragmath_js { Line 176  sub dragmath_js {
                   function mathedit(textarea, doc) {                    function mathedit(textarea, doc) {
                      targetEntry = textarea;                       targetEntry = textarea;
                      targetDoc   = doc;                       targetDoc   = doc;
                      newwin  = window.open("/adm/dragmath/applet/$popup.html","","width=565,height=500,resizable");                       newwin  = window.open("/adm/dragmath/$popup.html","","width=565,height=500,resizable");
                   }                    }
                 // ]]>                  // ]]>
                 </script>                  </script>
Line 209  dependencies for a web page uploaded dir Line 215  dependencies for a web page uploaded dir
 =cut  =cut
   
 sub dependencycheck_js {  sub dependencycheck_js {
     my ($symb,$title,$url) = @_;      my ($symb,$title,$url,$folderpath,$uri) = @_;
     my $link = '/adm/dependencies?symb='.&HTML::Entities::encode($symb,'<>&"').      my $link;
                '&title='.&HTML::Entities::encode($title,'<>&"').      if ($symb) {
                '&url='.&HTML::Entities::encode($url,'<>&"');          $link = '/adm/dependencies?symb='.&HTML::Entities::encode($symb,'<>&"');
       } elsif ($folderpath) {
           $link = '/adm/dependencies?folderpath='.&HTML::Entities::encode($folderpath,'<>&"');
            $url = $uri;
       } elsif ($uri =~ m{^/public/$match_domain/$match_courseid/syllabus$}) {
           $link = '/adm/dependencies';
       }
       $link .= (($link=~/\?/)?'&amp;':'?').'title='.
                &HTML::Entities::encode($title,'<>&"');
       if ($url) {
           $link .= '&url='.&HTML::Entities::encode($url,'<>&"');
       }
     return <<ENDJS;      return <<ENDJS;
                 <script type="text/javascript">                  <script type="text/javascript">
                 // <![CDATA[                  // <![CDATA[
Line 465  the date/time fields are left empty. Line 482  the date/time fields are left empty.
 =item $state  =item $state
   
 Specifies the initial state of the form elements.  Either 'disabled' or empty.  Specifies the initial state of the form elements.  Either 'disabled' or empty.
 Defaults to empty, which indiciates the form elements are not disabled.   Defaults to empty, which indicates the form elements are not disabled.
   
   =item $no_hh_mm_ss
   
   If true, text boxes for hours, minutes and seconds are omitted.
   
   =item $defhour
   
   Default value for hours (a default of 0 is used otherwise).
   
   =item $defmin
   
   Default value for minutes (a default of 0 is used otherwise).
   
   =item defsec
   
   Default value for seconds (a default of 0 is used otherwise).
   
   =item $nolink
   
   If true, a "Select calendar" link (to pop-up a calendar) is not displayed
   to the right of the items.
   
   =item $no_mm_ss
   
   If true, text boxes for minutes and seconds are omitted.
   
   =item $no_ss
   
   If true, text boxes for seconds are omitted.
   
 =back  =back
   
Line 479  The method used to restrict user input w Line 525  The method used to restrict user input w
 ##############################################  ##############################################
 sub date_setter {  sub date_setter {
     my ($formname,$dname,$currentvalue,$special,$includeempty,$state,      my ($formname,$dname,$currentvalue,$special,$includeempty,$state,
         $no_hh_mm_ss,$defhour,$defmin,$defsec,$nolink) = @_;          $no_hh_mm_ss,$defhour,$defmin,$defsec,$nolink,$no_mm_ss,$no_ss) = @_;
     my $now = time;      my $now = time;
   
     my $tzname;      my $tzname;
Line 632  ENDJS Line 678  ENDJS
         $result .= &mt('[_1] [_2] [_3] ',          $result .= &mt('[_1] [_2] [_3] ',
                        $monthselector,$dayselector,$yearselector).                         $monthselector,$dayselector,$yearselector).
                    $tzone;                     $tzone;
         if (!$nolink) {      } elsif ($no_mm_ss) {
             $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');          $result .= &mt('[_1] [_2] [_3] [_4]',
         }                        $monthselector,$dayselector,$yearselector,
                         $hourselector).
                      $tzone;
       } elsif ($no_ss) {
           $result .= &mt('[_1] [_2] [_3] [_4] [_5]m',
                         $monthselector,$dayselector,$yearselector,
                         $hourselector,$minuteselector).
                      $tzone;
     } else {      } else {
         $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ',          $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ',
                       $monthselector,$dayselector,$yearselector,                        $monthselector,$dayselector,$yearselector,
                       $hourselector,$minuteselector,$secondselector).                        $hourselector,$minuteselector,$secondselector).
                    $tzone;                     $tzone;
         if (!$nolink) {      }
             $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');      if (!$nolink) {
         }          $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');
     }      }
     $result .= "</span>\n<!-- end $dname date setting form -->\n";      $result .= "</span>\n<!-- end $dname date setting form -->\n";
     return $result;      return $result;
Line 1105  sub Close_PrgWin { Line 1158  sub Close_PrgWin {
 # ------------------------------------------------------- Puts directory header  # ------------------------------------------------------- Puts directory header
   
 sub crumbs {  sub crumbs {
     my ($uri,$target,$prefix,$form,$skiplast)=@_;      my ($uri,$target,$prefix,$form,$skiplast,$onclick)=@_;
 # You cannot crumbnify uploaded or adm resources  # You cannot crumbnify uploaded or adm resources
     if ($uri=~/^\/*(uploaded|adm)\//) { return &mt('(Internal Course/Group Content)'); }      if ($uri=~/^\/*(uploaded|adm)\//) { return &mt('(Internal Course/Group Content)'); }
     if ($target) {      if ($target) {
Line 1131  sub crumbs { Line 1184  sub crumbs {
             &Apache::loncommon::inhibit_menu_check(\$href_path);              &Apache::loncommon::inhibit_menu_check(\$href_path);
             if ($form) {              if ($form) {
                 my $href = 'javascript:'.$form.".action='".$href_path."';".$form.'.submit();';                  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 {              } else {
                 $output.=qq{<a href="$href_path"$target>$dir</a>/};                  $output.=qq{<a href="$href_path"$onclick$target>$dir</a>/};
             }              }
         }          }
     } else {      } else {
Line 1204  sub htmlareaheaders { Line 1257  sub htmlareaheaders {
 ENDEDITOR  ENDEDITOR
  }   }
     $s.=(<<ENDJQUERY);      $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-1.11.3.min.js"></script>
 <script type="text/javascript" src="/adm/jQuery/js/jquery-ui-1.8.16.custom.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.8.16.custom.css" />  <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 type="text/javascript" src="/adm/jpicker/js/jpicker-1.1.6.min.js" >
 </script>  </script>
 <link rel="stylesheet" type="text/css" href="/adm/jpicker/css/jPicker-1.1.6.min.css" />  <link rel="stylesheet" type="text/css" href="/adm/jpicker/css/jPicker-1.1.6.min.css" />
 <script type="text/javascript" src="/adm/countdown/js/jquery.countdown.js"></script>  <script type="text/javascript" src="/adm/countdown/js/jquery.countdown.min.js"></script>
 <link rel="stylesheet" type="text/css" href="/adm/countdown/css/jquery.countdown.css" />  <link rel="stylesheet" type="text/css" href="/adm/countdown/css/jquery.countdown.css" />
   
 <script type="text/javascript" src="/adm/spellchecker/js/jquery.spellchecker.min.js"></script>  <script type="text/javascript" src="/adm/spellchecker/js/jquery.spellchecker.min.js"></script>
 <link rel="stylesheet" type="text/css" href="/adm/spellchecker/css/spellchecker.css" />  <link rel="stylesheet" type="text/css" href="/adm/spellchecker/css/spellchecker.css" />
   <script type="text/javascript" src="/adm/nicescroll/jquery.nicescroll.min.js"></script>
   
 ENDJQUERY  ENDJQUERY
  return $s;   return $s;
Line 1248  sub htmlareaselectactive { Line 1302  sub htmlareaselectactive {
     my ($args) = @_;       my ($args) = @_; 
     unless (&htmlareabrowser()) { return ''; }      unless (&htmlareabrowser()) { return ''; }
     my $output='<script type="text/javascript" defer="defer">'."\n"      my $output='<script type="text/javascript" defer="defer">'."\n"
               .'// <![CDATA['."\n";                .'// <![CDATA['."\n"
                 .'//<!-- BEGIN LON-CAPA Internal'."\n";
     my $lang = &htmlarea_lang();      my $lang = &htmlarea_lang();
     my $fullpage = 'false';      my $fullpage = 'false';
     my ($dragmath_prefix,$dragmath_helpicon,$dragmath_whitespace);      my ($dragmath_prefix,$dragmath_helpicon,$dragmath_whitespace);
Line 1271  sub htmlareaselectactive { Line 1326  sub htmlareaselectactive {
             }              }
         }          }
     }      }
   
       my %lt = &Apache::lonlocal::texthash(
                 'plain'       => 'Plain text',
                 'rich'        => 'Rich formatting',
                 'plain_title' => 'Disable rich text formatting and edit in plain text',
                 'rich_title'  => 'Enable rich text formatting (bold, italic, etc.)',
             );
   
     $output.='      $output.='
           
     function containsBlockHtml(id) {      function containsBlockHtml(id) {
Line 1299  sub htmlareaselectactive { Line 1362  sub htmlareaselectactive {
     var rt_enabled  = $(this).hasClass("LC_enable_rt");      var rt_enabled  = $(this).hasClass("LC_enable_rt");
         if (rt_enabled) {          if (rt_enabled) {
     startRichEditor(id);      startRichEditor(id);
  $("#LC_rt_"+id).html("<b>&laquo; Plain text</b>");   $("#LC_rt_"+id).html("<b>&laquo; '.$lt{'plain'}.'</b>");
  $("#LC_rt_"+id).attr("title", "Disable rich text formatting and edit in plain text");   $("#LC_rt_"+id).attr("title", "'.$lt{'plain_title'}.'");
  $("#LC_rt_"+id).addClass("LC_disable_rt");   $("#LC_rt_"+id).addClass("LC_disable_rt");
  $("#LC_rt_"+id).removeClass("LC_enable_rt");   $("#LC_rt_"+id).removeClass("LC_enable_rt");
     } else {      } else {
  destroyRichEditor(id);   destroyRichEditor(id);
  $("#LC_rt_"+id).html("<b>Rich formatting &raquo;</b>");   $("#LC_rt_"+id).html("<b>'.$lt{'rich'}.' &raquo;</b>");
  $("#LC_rt_"+id).attr("title", "Enable rich text formatting (bold, italic, etc.)");   $("#LC_rt_"+id).attr("title", "'.$lt{'rich_title'}.'");
  $("#LC_rt_"+id).addClass("LC_enable_rt");   $("#LC_rt_"+id).addClass("LC_enable_rt");
  $("#LC_rt_"+id).removeClass("LC_disable_rt");   $("#LC_rt_"+id).removeClass("LC_disable_rt");
  }';   }';
Line 1327  sub htmlareaselectactive { Line 1390  sub htmlareaselectactive {
  var id = $(this).attr("id");   var id = $(this).attr("id");
                         var rt_enabled = containsBlockHtml(id);                          var rt_enabled = containsBlockHtml(id);
  if(rt_enabled) {   if(rt_enabled) {
  $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"Disable rich text formatting and edit in plain text\" class=\"LC_disable_rt\"><b>&laquo; Plain text</b></a></div>");   $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"'.$lt{'plain_title'}.'\" class=\"LC_disable_rt\"><b>&laquo; '.$lt{'plain'}.'</b></a></div>");
  startRichEditor(id);   startRichEditor(id);
  $("#LC_rt_"+id).click(editorHandler);   $("#LC_rt_"+id).click(editorHandler);
  }   }
  else {   else {
  $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"Enable rich text formatting (bold, italic, etc.)\" class=\"LC_enable_rt\"><b>Rich formatting &raquo;</b></a></div>");   $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"'.$lt{'rich_title'}.'\" class=\"LC_enable_rt\"><b>'.$lt{'rich'}.' &raquo;</b></a></div>");
  $("#LC_rt_"+id).click(editorHandler);   $("#LC_rt_"+id).click(editorHandler);
  }';   }';
     if ($dragmath_prefix ne '') {      if ($dragmath_prefix ne '') {
Line 1346  sub htmlareaselectactive { Line 1409  sub htmlareaselectactive {
  });   });
  $(".LC_richDefaultOn").each(function() {   $(".LC_richDefaultOn").each(function() {
  var id = $(this).attr("id");   var id = $(this).attr("id");
  $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"Disable rich text formatting and edit in plain text\" class=\"LC_disable_rt\"><b>&laquo; Plain text</b></a></div>");   $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"'.$lt{'plain_title'}.'\" class=\"LC_disable_rt\"><b>&laquo; '.$lt{'plain'}.'</b></a></div>");
  startRichEditor(id);   startRichEditor(id);
  $("#LC_rt_"+id).click(editorHandler);   $("#LC_rt_"+id).click(editorHandler);
  });   });
  $(".LC_richDefaultOff").each(function() {   $(".LC_richDefaultOff").each(function() {
  var id = $(this).attr("id");   var id = $(this).attr("id");
  $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"Enable rich text formatting (bold, italic, etc.)\" class=\"LC_enable_rt\"><b>Rich formatting &raquo;</b></a></div>");   $(this).before("<div><a href=\"#\" id=\"LC_rt_"+id+"\" title=\"'.$lt{'rich_title'}.'\" class=\"LC_enable_rt\"><b>'.$lt{'rich'}.' &raquo;</b></a></div>");
  $("#LC_rt_"+id).click(editorHandler);   $("#LC_rt_"+id).click(editorHandler);
  });   });
   
Line 1387  sub htmlareaselectactive { Line 1450  sub htmlareaselectactive {
     #   is used to determine when the countdown timer turns red to warn the user      #   is used to determine when the countdown timer turns red to warn the user
     #   to think about submitting.      #   to think about submitting.
   
     my $dueDateLayout = &mt('Due in: {dn} {dl} {hnn}{sep}{mnn}{sep}{snn} [_1]',"<span id='submitearly'></span>");      my $dueDateLayout = &mt('Due in: {dn} {dl} {hnn}{sep}{mnn}{sep}{snn} [_1]',
                               "<span id='submitearly'></span>");
     my $early = '- <b>'.&mt('Submit Early').'</b>';      my $early = '- <b>'.&mt('Submit Early').'</b>';
     my $pastdue = '- <b>'.&mt('Past Due').'</b>';      my $pastdue = '- <b>'.&mt('Past Due').'</b>';
     $output .= <<JAVASCRIPT;      $output .= <<JAVASCRIPT;
Line 1478  JAVASCRIPT Line 1542  JAVASCRIPT
   
     }      }
     $output.="\nwindow.status='Activated Editfields';\n"      $output.="\nwindow.status='Activated Editfields';\n"
               .'// END LON-CAPA Internal -->'."\n"
             .'// ]]>'."\n"              .'// ]]>'."\n"
             .'</script>';              .'</script>';
     return $output;      return $output;
Line 1505  sub show_return_link { Line 1570  sub show_return_link {
     unless ($env{'request.course.id'}) { return 0; }      unless ($env{'request.course.id'}) { return 0; }
     if ($env{'request.noversionuri'}=~m{^/priv/} ||      if ($env{'request.noversionuri'}=~m{^/priv/} ||
         $env{'request.uri'}=~m{^/priv/}) { return 1; }          $env{'request.uri'}=~m{^/priv/}) { return 1; }
       return if ($env{'request.noversionuri'} eq '/adm/supplemental');
   
     if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})      if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
         || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {          || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
Line 1594  A link to help for the component will be Line 1660  A link to help for the component will be
 All inputs can be undef without problems.  All inputs can be undef without problems.
   
 Inputs: $component (the text on the right side of the breadcrumbs trail),  Inputs: $component (the text on the right side of the breadcrumbs trail),
         $component_help          $component_help (the help item filename (without .tex extension).
         $menulink (boolean, controls whether to include a link to /adm/menu)          $menulink (boolean, controls whether to include a link to /adm/menu)
         $helplink (if 'nohelp' don't include the orange help link)          $helplink (if 'nohelp' don't include the orange help link)
         $css_class (optional name for the class to apply to the table for CSS)          $css_class (optional name for the class to apply to the table for CSS)
         $no_mt (optional flag, 1 if &mt() is _not_ to be applied to $component          $no_mt (optional flag, 1 if &mt() is _not_ to be applied to $component
            when including the text on the right.             when including the text on the right.
           $CourseBreadcrumbs (optional flag, 1 if &breadcrumbs called from &docs_breadcrumbs,
              because breadcrumbs are being)
           $topic_help (optional help item to be displayed on right side of the breadcrumbs 
              row, using loncommon::help_open_topic() to generate the link.
           $topic_help_text (text to include in the link in the optional help item 
              on the right side of the breadcrumbs row.
   
 Returns a string containing breadcrumbs for the current page.  Returns a string containing breadcrumbs for the current page.
   
 =item &clear_breadcrumbs()  =item &clear_breadcrumbs()
Line 1627  returns: nothing Line 1700  returns: nothing
           
     sub breadcrumbs {      sub breadcrumbs {
         my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt,           my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, 
             $CourseBreadcrumbs) = @_;              $CourseBreadcrumbs,$topic_help,$topic_help_text) = @_;
         #          #
         $css_class ||= 'LC_breadcrumbs';          $css_class ||= 'LC_breadcrumbs';
   
Line 1654  returns: nothing Line 1727  returns: nothing
                 if ($env{'request.noversionuri'} =~                   if ($env{'request.noversionuri'} =~ 
                     m{^/public/($match_domain)/($match_courseid)/syllabus$}) {                      m{^/public/($match_domain)/($match_courseid)/syllabus$}) {
                     unless (($env{'course.'.$env{'request.course.id'}.'.domain'} eq $1) &&                      unless (($env{'course.'.$env{'request.course.id'}.'.domain'} eq $1) &&
                             ($env{'course.'.$env{'request.course.id'}.'.num'} eq $2)) {                               ($env{'course.'.$env{'request.course.id'}.'.num'} eq $2)) {
                         $description = 'Menu';                          $description = 'Menu';
                         $no_mt_descr = 0;                          $no_mt_descr = 0;
                     }                      }
Line 1676  returns: nothing Line 1749  returns: nothing
         my $links;          my $links;
         if ((&show_return_link) && (!$CourseBreadcrumbs) && (ref($last) eq 'HASH')) {          if ((&show_return_link) && (!$CourseBreadcrumbs) && (ref($last) eq 'HASH')) {
             my $alttext = &mt('Go Back');              my $alttext = &mt('Go Back');
               my $hashref = { href => '/adm/flip?postdata=return:',
                               title => &mt('Back to most recent content resource'),
                               class => 'LC_menubuttons_link',
                             };
               if ($env{'request.noversionuri'} eq '/adm/searchcat') {
                   $hashref->{'target'} = '_top'; 
               }
             $links=&htmltag( 'a','<img src="/res/adm/pages/tolastloc.png" alt="'.$alttext.'" class="LC_icon" />',              $links=&htmltag( 'a','<img src="/res/adm/pages/tolastloc.png" alt="'.$alttext.'" class="LC_icon" />',
                             { href => '/adm/flip?postdata=return:',                               $hashref);
                               title => &mt('Back to most recent content resource'),  
                               class => 'LC_menubuttons_link',  
                             });  
             $links=&htmltag('li',$links);              $links=&htmltag('li',$links);
         }          }
         $links.= join "",           $links.= join "", 
Line 1730  returns: nothing Line 1807  returns: nothing
                                                          $component_help,                                                           $component_help,
                                                          $faq,$bug);                                                           $faq,$bug);
         }          }
           if ($topic_help && $topic_help_text) {
              $icons .= ' '.&Apache::loncommon::help_open_topic($topic_help,&mt($topic_help_text),'',
                                                                undef,600);
           }
         #          #
   
   
Line 1742  returns: nothing Line 1823  returns: nothing
         }          }
   
   
         if ($component) {          if (($component) || ($topic_help && $topic_help_text)) {
             $links = &htmltag('span',               $links = &htmltag('span', 
                              ( $no_mt ? $component : mt($component) ).                               ( $no_mt ? $component : mt($component) ).
                              ( $icons ? $icons : '' ),                               ( $icons ? $icons : '' ),
Line 1750  returns: nothing Line 1831  returns: nothing
                              .$links                                .$links 
 ;  ;
         }          }
                   my $nav_and_tools = 0;
         &render_tools(\$links);          foreach my $item ('navigation','tools') {
         $links = &htmltag('div', $links,               if (ref($tools{$item}) eq 'ARRAY') {
                         { id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ;                  $nav_and_tools += scalar(@{$tools{$item}})
         &render_advtools(\$links);              }
           }
           if (($links ne '') || ($nav_and_tools)) {
               &render_tools(\$links);
               $links = &htmltag('div', $links, 
                                 { id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ;
           }
           my $adv_tools = 0;
           if (ref($tools{'advtools'}) eq 'ARRAY') {
               $adv_tools = scalar(@{$tools{'advtools'}});
           }
           if (($links ne '') || ($adv_tools)) {
               &render_advtools(\$links);
           }
   
         # Return the @Crumbs stack to what we started with          # Return the @Crumbs stack to what we started with
         push(@Crumbs,$last);          push(@Crumbs,$last);
Line 1832  returns: nothing Line 1926  returns: nothing
         undef(%tools);          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)  =item &render_tools(\$breadcrumbs)
   
 Creates html for breadcrumb tools (categories navigation and tools) and inserts   Creates html for breadcrumb tools (categories navigation and tools) and inserts 
Line 1883  returns: nothing Line 1987  returns: nothing
 } # End of scope for @Crumbs  } # End of scope for @Crumbs
   
 sub docs_breadcrumbs {  sub docs_breadcrumbs {
     my ($allowed,$crstype,$contenteditor)=@_;      my ($allowed,$crstype,$contenteditor,$title,$precleared)=@_;
     my ($folderpath,@folders);      my ($folderpath,@folders,$supplementalflag);
     if ($env{'form.pagepath'}) {      @folders = split('&',$env{'form.folderpath'});
         @folders = split('&',$env{'form.pagepath'});      if ($env{'form.folderpath'} =~ /^supplemental/) {
     } else {          $supplementalflag = 1;
         @folders=split('&',$env{'form.folderpath'});  
     }      }
     my $plain='';      my $plain='';
       my $container = 'sequence';
     my ($randompick,$isencrypted,$ishidden,$is_random_order) = (-1,0,0,0);      my ($randompick,$isencrypted,$ishidden,$is_random_order) = (-1,0,0,0);
     &clear_breadcrumbs();      my @docs_crumbs;
     while (@folders) {      while (@folders) {
         my $folder=shift(@folders);          my $folder=shift(@folders);
         my $foldername=shift(@folders);          my $foldername=shift(@folders);
Line 1906  sub docs_breadcrumbs { Line 2010  sub docs_breadcrumbs {
         }          }
         $url .= &escape($folderpath);          $url .= &escape($folderpath);
         my $name=&unescape($foldername);          my $name=&unescape($foldername);
 # each of randompick number, hidden, encrypted, random order are   # each of randompick number, hidden, encrypted, random order, is_page 
 # appended with ":"s to the foldername  # are appended with ":"s to the foldername
         $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;          $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//;
         if ($contenteditor) {           unless ($supplementalflag) {
             if ($1 ne '') {              if ($contenteditor) { 
                 $randompick=$1;                  if ($1 ne '') {
             } else {                      $randompick=$1;
                $randompick=-1;                  } else {
                       $randompick=-1;
                   }
                   if ($2) { $ishidden=1; }
                   if ($3) { $isencrypted=1; }
                   if ($4 ne '') { $is_random_order = 1; }
                   if ($5 == 1) {$container = 'page'; }
             }              }
             if ($2) { $ishidden=1; }  
             if ($3) { $isencrypted=1; }  
             if ($4 ne '') { $is_random_order = 1; }  
         }          }
         if ($folder eq 'supplemental') {          if ($folder eq 'supplemental') {
             $name = &mt('Supplemental '.$crstype.' Content');              $name = &mt('Supplemental Content');
         }          }
         if ($contenteditor) {          if ($contenteditor) {
             $plain.=$name.' &gt; ';              $plain.=$name.' &gt; ';
         }          }
         &add_breadcrumb(          push(@docs_crumbs,
                           {'href'  => $url,                            {'href'  => $url,
                            'title' => $name,                             'title' => $name,
                            'text'  => $name,                             'text'  => $name,
                            'no_mt' => 1,                             'no_mt' => 1,
                           });                            });
     }      }
     unless ($contenteditor) {      if ($title) {
         if ($env{'httpref.'.$env{'request.noversionuri'}} ne '') {          push(@docs_crumbs,
             &add_breadcrumb({text => 'View Resource'});                            {'title' => $title,
                              'text'  => $title,
                              'no_mt' => 1,}
                             );
       }
       if (wantarray) {
           unless ($precleared) {
               &clear_breadcrumbs();
         }          }
           &add_breadcrumb(@docs_crumbs);
           if ($contenteditor) {
               $plain=~s/\&gt\;\s*$//;
           }
           my $menulink = 0;
           if (!$allowed && !$contenteditor) {
               $menulink = 1;
           }
           return (&breadcrumbs(undef,undef,$menulink,'nohelp',undef,undef,
                                $contenteditor),
                                $randompick,$ishidden,$isencrypted,$plain,
                                $is_random_order,$container);
     } else {      } else {
         $plain=~s/\&gt\;\s*$//;          return \@docs_crumbs;
     }      }
     return (&breadcrumbs(undef,undef,0,'nohelp',undef,undef,$contenteditor),  
                          $randompick,$ishidden,$isencrypted,$plain,  
                          $is_random_order);  
 }  }
   
 ############################################################  ############################################################
Line 2171  sub course_selection { Line 2294  sub course_selection {
   
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
                      ($formname,'pickcourse','pickdomain','coursedesc','',1,$crstype).'</b>';                       ($formname,'pickcourse','pickdomain','coursedesc','',1,$crstype).'</b>';
         $output .= '<input type="radio" name="coursepick" value="all" onclick="coursePick(this.form)" />'.$allcrs.'<br />';          $output .= '<label><input type="radio" name="coursepick" value="all" onclick="coursePick(this.form)" />'.$allcrs.'</label><br />';
     if ($totcodes > 0) {      if ($totcodes > 0) {
         my $numtitles = @$codetitles;          my $numtitles = @$codetitles;
         if ($numtitles > 0) {          if ($numtitles > 0) {
             $output .= '<input type="radio" name="coursepick" value="category" onclick="coursePick(this.form);alert('."'".&mt('Choose categories, from left to right')."'".')" />'.&mt('Pick courses by category:').' <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".              $output .= '<table><tr><td>'.$$codetitles[0].'<br />'."\n".
                '<select name="'.$standardnames->[0].                 '<select name="'.$standardnames->[0].
                '" onChange="setPick(this.form);courseSet('."'$$codetitles[0]'".')">'."\n".                 '" onchange="setPick(this.form);courseSet('."'$$codetitles[0]'".')">'."\n".
                ' <option value="-1" />Select'."\n";                 ' <option value="-1" />Select'."\n";
             my @items = ();              my @items = ();
             my @longitems = ();              my @longitems = ();
Line 2208  sub course_selection { Line 2331  sub course_selection {
             for (my $i=1; $i<$numtitles; $i++) {              for (my $i=1; $i<$numtitles; $i++) {
                 $output .= '<td>'.$$codetitles[$i].'<br />'."\n".                  $output .= '<td>'.$$codetitles[$i].'<br />'."\n".
                           '<select name="'.$standardnames->[$i].                            '<select name="'.$standardnames->[$i].
                           '" onChange="courseSet('."'$$codetitles[$i]'".')">'."\n".                            '" onchange="courseSet('."'$$codetitles[$i]'".')">'."\n".
                           '<option value="-1">&lt;-Pick '.$$codetitles[$i-1].'</option>'."\n".                            '<option value="-1">&lt;-Pick '.$$codetitles[$i-1].'</option>'."\n".
                           '</select>'."\n".                            '</select>'."\n".
                           '</td>';                            '</td>';
Line 2216  sub course_selection { Line 2339  sub course_selection {
             $output .= '</tr></table><br />';              $output .= '</tr></table><br />';
         }          }
     }      }
     $output .= '<input type="radio" name="coursepick" value="specific" onclick="coursePick(this.form);opencrsbrowser('."'".$formname."','dccourse','dcdomain','coursedesc','','1','$crstype'".')" />'.$pickspec.' '.$courseform.'&nbsp;&nbsp;<input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br />'."\n";      $output .=
           '<label><input type="radio" name="coursepick" value="specific"'
          .' onclick="coursePick(this.form);opencrsbrowser('."'".$formname."','dccourse','dcdomain','coursedesc','','1','$crstype'".')" />'
          .$pickspec.'</label>'
          .' '.$courseform.'&nbsp;&nbsp;'
          .&mt('[_1] selected.',
                   '<input type="text" value="0" size="4" name="coursetotal" readonly="readonly" />'
                  .'<input type="hidden" name="courselist" value="" />')
          .'<br />'."\n";
     return $output;      return $output;
 }  }
   
Line 2337  sub resource_info_box { Line 2468  sub resource_info_box {
     return $return;      return $return;
 }  }
   
   # display_usage
   # 
   # Generates a div containing a block, filled to show percentage of current quota used
   #
   # Quotas available for user portfolios, group portfolios, authoring spaces, and course
   # content stored directly within a course (i.e., excluding published content).
   #
   
   sub display_usage {
       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;
       } else {
           $percent = 100*($current_disk_usage/$disk_quota);
       }
       $usage = sprintf("%.2f",$usage);
       $quota = sprintf("%.2f",$quota);
       $percent = sprintf("%.0f",$percent);
       my ($color,$cssclass);
       if ($percent <= 60) {
           $color = '#00A000';
       } elsif ($percent > 60 && $percent < 90) {
           $color = '#FFD300';
           $cssclass = 'class="LC_warning"';
       } elsif( $percent >= 90) {
           $color = '#FF0000';
           $cssclass = 'class="LC_error"';
       }
       my $prog_width = $percent;
       if ($prog_width > 100) {
           $prog_width = 100;
       }
       my $display = 'block';
       if ($context eq 'authoring') {
           $display = 'inline';
       }
       return '
     <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>';
   }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 2581  sub set_form_elements { Line 2759  sub set_form_elements {
   
 sub file_submissionchk_js {  sub file_submissionchk_js {
     my ($turninpaths,$multiples) = @_;      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)?');                        &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?');                        &mt('Continue submission with these files removed?');
       &js_escape(\$delfilewarn);
     my ($turninpathtext,$multtext,$arrayindexofjs);      my ($turninpathtext,$multtext,$arrayindexofjs);
     if (ref($turninpaths) eq 'HASH') {      if (ref($turninpaths) eq 'HASH') {
         foreach my $key (sort(keys(%{$turninpaths}))) {          foreach my $key (sort(keys(%{$turninpaths}))) {
Line 2825  ENDSCRIPT Line 3005  ENDSCRIPT
 ##############################################  ##############################################
   
 sub resize_scrollbox_js {  sub resize_scrollbox_js {
     my ($context,$tabidstr) = @_;      my ($context,$tabidstr,$tid) = @_;
     my (%names,$paddingwfrac,$offsetwfrac,$offsetv,$minw,$minv);      my (%names,$paddingwfrac,$offsetwfrac,$offsetv,$minw,$minv);
     if ($context eq 'docs') {      if ($context eq 'docs') {
         %names = (          %names = (
Line 2835  sub resize_scrollbox_js { Line 3015  sub resize_scrollbox_js {
                    scroll => 'contentscroll',                     scroll => 'contentscroll',
                    boxh   => 'contenteditor',                     boxh   => 'contenteditor',
                  );                   );
         $paddingwfrac = 0.09;           $paddingwfrac = 0.09;
         $offsetwfrac = 0.015;          $offsetwfrac = 0.015;
         $offsetv = 20;          $offsetv = 20;
         $minw = 250;          $minw = 250;
Line 2861  window.onresize=callResize; Line 3041  window.onresize=callResize;
   
 ';  ';
     if ($context eq 'docs') {      if ($context eq 'docs') {
         $output .= '          if ($env{'form.active'}) {
 var activeTab;              $output .= "\nvar activeTab = '$env{'form.active'}$tid';\n";
 ';          } else {
               $output .= "\nvar activeTab = '';\n";
           }
     }      }
     $output .=  <<"FIRST";      $output .=  <<"FIRST";
   
Line 2874  function resize_scrollbox(scrollboxname, Line 3056  function resize_scrollbox(scrollboxname,
     var scrolltableid = 'table_'+scrollboxname;      var scrolltableid = 'table_'+scrollboxname;
     var scrollbox;      var scrollbox;
     var scrolltable;      var scrolltable;
       var ismobile = '$env{'browser.mobile'}';
   
     if (document.getElementById("$names{'boxw'}") == null) {      if (document.getElementById("$names{'boxw'}") == null) {
         return;          return;
Line 2910  FIRST Line 3093  FIRST
     }      }
     $output .= <<"SECOND";      $output .= <<"SECOND";
     var listwchange;      var listwchange;
       var scrollchange;
     if (chkw == 1) {      if (chkw == 1) {
         var boxw = document.getElementById("$names{'boxw'}").offsetWidth;          var boxw = document.getElementById("$names{'boxw'}").offsetWidth;
         var itemw;          var itemw;
Line 2921  FIRST Line 3105  FIRST
   
         var scrollboxw = scrollbox.offsetWidth;          var scrollboxw = scrollbox.offsetWidth;
         var scrollboxscrollw = scrollbox.scrollWidth;          var scrollboxscrollw = scrollbox.scrollWidth;
           var scrollstart = scrollboxw;
   
         var offsetw = parseInt(vpw * $offsetwfrac);          var offsetw = parseInt(vpw * $offsetwfrac);
         var paddingw = parseInt(vpw * $paddingwfrac);          var paddingw = parseInt(vpw * $paddingwfrac);
Line 2995  PARAMSONE Line 3180  PARAMSONE
             }              }
         }          }
   
           if (newscrollboxw != scrollboxw) {
               scrollchange = 1;
           }
   
         if (itemid.offsetWidth != itemwstart) {          if (itemid.offsetWidth != itemwstart) {
             listwchange = 1;              listwchange = 1;
         }          }
     }      }
     if ((chkh == 1) || (listwchange)) {      if ((chkh == 1) || (listwchange)) {
           var itemid = document.getElementById("$names{'item'}");
           if (itemid != null) {
               itemh = itemid.offsetHeight;
           }
         var primaryheight = document.getElementById('LC_nav_bar').offsetHeight;          var primaryheight = document.getElementById('LC_nav_bar').offsetHeight;
         var secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight;          var secondaryheight;
           if (document.getElementById('LC_secondary_menu') != null) { 
               secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight;
           }
         var crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight;          var crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight;
         var dccidheight = 0;          var dccidheight = 0;
         if (document.getElementById('dccid') != null) {          if (document.getElementById('dccid') != null) {
Line 3017  PARAMSONE Line 3213  PARAMSONE
   
         var scrollboxheight = scrollbox.offsetHeight;          var scrollboxheight = scrollbox.offsetHeight;
         var scrollboxscrollheight = scrollbox.scrollHeight;          var scrollboxscrollheight = scrollbox.scrollHeight;
           var scrollboxh = scrollboxheight;
   
         var minvscrollbox = $minv;          var minvscrollbox = $minv;
         var offsetv = $offsetv;          var offsetv = $offsetv;
Line 3047  PARAMSONE Line 3244  PARAMSONE
                 scrollbox.style.height = newscrollheight+"px";                  scrollbox.style.height = newscrollheight+"px";
             }              }
         }          }
           var newscrollboxh = scrollbox.offsetHeight;
           if (scrollboxh != newscrollboxh) {
               scrollchange = 1;
           }
       }
       if (ismobile && scrollchange) {
           \$("#div_$names{'scroll'}").getNiceScroll().onResize();
     }      }
     return;      return;
 }  }
Line 3065  THIRD Line 3269  THIRD
 ##############################################  ##############################################
   
 sub javascript_jumpto_resource {  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?');                           &mt('Switch server?');
       &js_escape(\$confirm_switch);
     return (<<ENDUTILITY)      return (<<ENDUTILITY)
   
 function go(url) {  function go(url) {
Line 3091  ENDUTILITY Line 3296  ENDUTILITY
 }  }
   
 sub jump_to_editres {  sub jump_to_editres {
     my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb) = @_;      my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$folderpath,
           $title,$idx,$suppurl,$todocs) = @_;
     my $jscall;      my $jscall;
     if ($switchserver) {      if ($switchserver) {
         if ($symb && $home) {          if ($home) {
             $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.              $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.
                      &HTML::Entities::encode($env{'request.role'},'"<>&').                       &HTML::Entities::encode($env{'request.role'},'"<>&');
                     '&amp;symb='.&HTML::Entities::encode($symb,'"<>&');              if ($symb) {
                   $cfile .= '&amp;symb='.&HTML::Entities::encode($symb,'"<>&');
               } elsif ($folderpath) {
                   $cfile .= '&amp;folderpath='.&HTML::Entities::encode($folderpath,'"<>&');
               }
             if ($forceedit) {              if ($forceedit) {
                 $cfile .= '&amp;forceedit=1';                  $cfile .= '&amp;forceedit=1';
             }              }
             if ($forcereg) {              if ($forcereg) {
                 $cfile .= '&amp;register=1';                  $cfile .= '&amp;register=1';
             }              }
             $jscall = "need_switchserver('$cfile');";              $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."');";
         }          }
     } else {      } else {
         unless ($cfile =~ m{^/priv/}) {          unless ($cfile =~ m{^/priv/}) {
             if ($symb) {              if ($symb) {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?')."symb=$symb";                   $cfile .= (($cfile=~/\?/)?'&amp;':'?')."symb=$symb";
               } elsif ($folderpath) {
                   $cfile .= (($cfile=~/\?/)?'&amp;':'?').
                             'folderpath='.&HTML::Entities::encode(&escape($folderpath),'"<>&');
                   if ($title) {
                       $cfile .= (($cfile=~/\?/)?'&amp;':'?').
                                 'title='.&HTML::Entities::encode(&escape($title),'"<>&');
                   }
                   if ($idx) {
                       $cfile .= (($cfile=~/\?/)?'&amp;':'?').'idx='.$idx;
                   }
                   if ($suppurl) {
                       $cfile .= (($cfile=~/\?/)?'&amp;':'?').
                                 'suppurl='.&HTML::Entities::encode(&escape($suppurl));
                   }
             }              }
             if ($forceedit) {              if ($forceedit) {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').'forceedit=1';                  $cfile .= (($cfile=~/\?/)?'&amp;':'?').'forceedit=1';
Line 3117  sub jump_to_editres { Line 3341  sub jump_to_editres {
             if ($forcereg) {              if ($forcereg) {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').'register=1';                  $cfile .= (($cfile=~/\?/)?'&amp;':'?').'register=1';
             }              }
               if ($todocs) {
                  $cfile .= (($cfile=~/\?/)?'&amp;':'?').'todocs=1';
               }
         }          }
         $jscall = "go('$cfile')";          $jscall = "go('".&Apache::loncommon::escape_single($cfile)."')";
     }      }
     return $jscall;      return $jscall;
 }  }
Line 3185  END Line 3412  END
 sub htmltag{  sub htmltag{
     return      return
         qq|<$_[0]|          qq|<$_[0]|
         . join( '', map { qq| $_="${$_[2]}{$_}"| if ${$_[2]}{$_} } keys %{ $_[2] } )          . join( '', map { qq| $_="${$_[2]}{$_}"| if ${$_[2]}{$_} } keys(%{ $_[2] }) )
         . ($_[1] ? qq|>$_[1]</$_[0]>| : qq|/>|). "\n";          . ($_[1] ? qq|>$_[1]</$_[0]>| : qq|/>|). "\n";
 };  };
   
Line 3448  add_item_funclist Line 3675  add_item_funclist
 Inputs: ./.  Inputs: ./.
   
 Returns: HTML code with function list end  Returns: HTML code with function list end
   
 =cut  =cut
   
 sub end_funclist {  sub end_funclist {
Line 3489  sub funclist_from_array { Line 3717  sub funclist_from_array {
                { listattr => {class => 'LC_funclist'} });                 { listattr => {class => 'LC_funclist'} });
 }     }   
   
   =pod
   
   =over
   
   =item &actionbox( \@array )
   
   Constructs a XHTML list from \@array with the first item being visually
   highlighted and set to the value 'Actions'. The list is wrapped in a division.
   
   The actionlist is used to offer contextual actions, mostly at the bottom
   of a page, on which the outcome of an processed action is shown,
   e.g. a file operation in Authoring Space.
   
   =over
   
   =item \@array
   
   A reference to the array containing text. Details: sub funclist_from_array
   
   =back
    
   Returns: XHTML div as string.
   
   =back
   
   =cut  
   
   sub actionbox {
       my ($items) = @_;
       return unless(ref($items) eq 'ARRAY');
       return
           '<div class="LC_actionbox">'
          .&funclist_from_array($items, {legend => &mt('Actions')})
          .'</div>';
   }
   
 1;  1;
   
 __END__  __END__

Removed from v.1.331  
changed lines
  Added in v.1.358.2.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>