Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.322 and 1.357

version 1.322, 2012/09/10 09:51:06 version 1.357, 2014/12/11 01:44:55
Line 61  use Time::HiRes; Line 61  use Time::HiRes;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use HTML::Entities();  use HTML::Entities();
 use LONCAPA;  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 1101  sub Close_PrgWin { Line 1118  sub Close_PrgWin {
     undef(%$prog_state);      undef(%$prog_state);
 }  }
   
   
 # ------------------------------------------------------- Puts directory header  # ------------------------------------------------------- Puts directory header
   
 sub crumbs {  sub crumbs {
Line 1209  ENDEDITOR Line 1227  ENDEDITOR
 <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.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 1230  sub htmlarea_lang { Line 1249  sub htmlarea_lang {
     return $lang;      return $lang;
 }  }
   
   # return javacsript to activate elements of .colorchooser with jpicker:
   # Caller is responsible for enclosing this in <script> tags:
   #
   sub color_picker {
       return '
   $(document).ready(function(){
       $.fn.jPicker.defaults.images.clientPath="/adm/jpicker/images/";
       $(".colorchooser").jPicker({window: { position: {x: "screenCenter", y: "bottom"}}});
   });';
   }
   
 # ----------------------------------------- Script to activate only some fields  # ----------------------------------------- Script to activate only some fields
   
 sub htmlareaselectactive {  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 1259  sub htmlareaselectactive { Line 1290  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 1287  sub htmlareaselectactive { Line 1326  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 1315  sub htmlareaselectactive { Line 1354  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 1334  sub htmlareaselectactive { Line 1373  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);
  });   });
                 $.fn.jPicker.defaults.images.clientPath="/adm/jpicker/images/";  
                 $(".colorchooser").jPicker();  
   
   
  });   });
 ';  ';
       $output .= &color_picker;
   
     # Code to put a due date countdown in 'duedatecountdown' span.      # Code to put a due date countdown in 'duedatecountdown' span.
     # This is currently located in the breadcrumb headers.      # This is currently located in the breadcrumb headers.
     # note that the dueDateLayout is internatinoalized below.      # note that the dueDateLayout is internatinoalized below.
Line 1375  sub htmlareaselectactive { Line 1414  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 1425  sub htmlareaselectactive { Line 1465  sub htmlareaselectactive {
   
  });   });
   
       /* the muli colored editor can generate spellcheck with language 'none'
          to disable spellcheck as well
       */
       function doSpellcheck(element, lang) {
    if (lang != 'none') {
        \$(element).spellchecker('option', {lang: lang});
       \$(element).spellchecker('check');
           }
       }
   
   
 JAVASCRIPT  JAVASCRIPT
     if ($dragmath_prefix ne '') {      if ($dragmath_prefix ne '') {
Line 1456  JAVASCRIPT Line 1506  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 1483  sub show_return_link { Line 1534  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 1629  returns: nothing Line 1681  returns: nothing
                 $description =                   $description = 
                     $env{'course.'.$env{'request.course.id'}.'.description'};                      $env{'course.'.$env{'request.course.id'}.'.description'};
                 $no_mt_descr = 1;                  $no_mt_descr = 1;
                   if ($env{'request.noversionuri'} =~ 
                       m{^/public/($match_domain)/($match_courseid)/syllabus$}) {
                       unless (($env{'course.'.$env{'request.course.id'}.'.domain'} eq $1) &&
                               ($env{'course.'.$env{'request.course.id'}.'.num'} eq $2)) {
                           $description = 'Menu';
                           $no_mt_descr = 0;
                       }
                   }
             }              }
             $menulink =  {  href   =>'/adm/menu',              $menulink =  {  href   =>'/adm/menu',
                             title  =>'Go to main menu',                              title  =>'Go to main menu',
Line 1644  returns: nothing Line 1704  returns: nothing
             }              }
         }          }
         my $links;          my $links;
         if ((&show_return_link) && (!$CourseBreadcrumbs)) {          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 1679  returns: nothing Line 1743  returns: nothing
         # last breadcrumb is the first order heading of a page          # last breadcrumb is the first order heading of a page
         # for course breadcrumbs it's just bold          # for course breadcrumbs it's just bold
   
         $links .= &htmltag( 'li', htmltag($CourseBreadcrumbs ? 'b' : 'h1',          if ($lasttext ne '') {
                 $lasttext), {title => $lasttext});              $links .= &htmltag( 'li', htmltag($CourseBreadcrumbs ? 'b' : 'h1',
                       $lasttext), {title => $lasttext});
           }
   
         my $icons = '';          my $icons = '';
         $faq  = $last->{'faq'}  if (exists($last->{'faq'}));          $faq  = $last->{'faq'}  if (exists($last->{'faq'}));
Line 1701  returns: nothing Line 1767  returns: nothing
         #          #
   
   
           if ($links ne '') {
         unless ($CourseBreadcrumbs) {              unless ($CourseBreadcrumbs) {
             $links = &htmltag('ol',  $links, { id => "LC_MenuBreadcrumbs"   });                  $links = &htmltag('ol',  $links, { id => "LC_MenuBreadcrumbs"   });
         } else {              } else {
             $links = &htmltag('ul',  $links, { class => "LC_CourseBreadcrumbs" });                  $links = &htmltag('ul',  $links, { class => "LC_CourseBreadcrumbs" });
               }
         }          }
   
   
Line 1717  returns: nothing Line 1784  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 1849  returns: nothing Line 1929  returns: nothing
   
 } # End of scope for @Crumbs  } # End of scope for @Crumbs
   
   sub docs_breadcrumbs {
       my ($allowed,$crstype,$contenteditor,$title,$precleared)=@_;
       my ($folderpath,@folders,$supplementalflag);
       @folders = split('&',$env{'form.folderpath'});
       if ($env{'form.folderpath'} =~ /^supplemental/) {
           $supplementalflag = 1;
       }
       my $plain='';
       my $container = 'sequence';
       my ($randompick,$isencrypted,$ishidden,$is_random_order) = (-1,0,0,0);
       my @docs_crumbs;
       while (@folders) {
           my $folder=shift(@folders);
           my $foldername=shift(@folders);
           if ($folderpath) {$folderpath.='&';}
           $folderpath.=$folder.'&'.$foldername;
           my $url;
           if ($allowed) {
               $url = '/adm/coursedocs?folderpath=';
           } else {
               $url = '/adm/supplemental?folderpath=';
           }
           $url .= &escape($folderpath);
           my $name=&unescape($foldername);
   # each of randompick number, hidden, encrypted, random order, is_page 
   # are appended with ":"s to the foldername
           $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//;
           unless ($supplementalflag) {
               if ($contenteditor) { 
                   if ($1 ne '') {
                       $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 ($folder eq 'supplemental') {
               $name = &mt('Supplemental Content');
           }
           if ($contenteditor) {
               $plain.=$name.' &gt; ';
           }
           push(@docs_crumbs,
                             {'href'  => $url,
                              'title' => $name,
                              'text'  => $name,
                              'no_mt' => 1,
                             });
       }
       if ($title) {
           push(@docs_crumbs,
                             {'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 {
           return \@docs_crumbs;
       }
   }
   
 ############################################################  ############################################################
 ############################################################  ############################################################
   
Line 2076  sub course_selection { Line 2237  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('."'".&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 2113  sub course_selection { Line 2274  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 2121  sub course_selection { Line 2282  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 2242  sub resource_info_box { Line 2411  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) = @_;
       my $usage = $current_disk_usage/1000;
       my $quota = $disk_quota/1000;
       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;
       }
       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="meter3" style="display:block; background-color:'.$color.'; width:'.$prog_width.'%; height:10px; color:#000000; margin:0px;"></div>'."\n".
   '   </div>'."\n".
   '  </div>';
   }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 2730  ENDSCRIPT Line 2942  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 2740  sub resize_scrollbox_js { Line 2952  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 2766  window.onresize=callResize; Line 2978  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 2779  function resize_scrollbox(scrollboxname, Line 2993  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 2815  FIRST Line 3030  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 2826  FIRST Line 3042  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 2900  PARAMSONE Line 3117  PARAMSONE
             }              }
         }          }
   
           if (newscrollboxw != scrollboxw) {
               scrollchange = 1;
           }
   
         if (itemid.offsetWidth != itemwstart) {          if (itemid.offsetWidth != itemwstart) {
             listwchange = 1;              listwchange = 1;
         }          }
 THIRD  
     if ($context eq 'docs') {  
         $output .= <<"DOCSTWO";  
         if (activeTab == 'cc1') {  
             if (document.getElementById('cc_hrule') != null) {  
                 document.getElementById('cc_hrule').style.width=actabw+"px";  
             }  
         } else {  
             if (activeTab == 'bb1') {  
                 if (document.getElementById('bb_hrule') != null) {  
                     document.getElementById('bb_hrule').style.width=actabw+"px";  
                 }  
             } else {  
                 if (activeTab == 'ee2') {  
                     if (document.getElementById('ee_hrule') != null) {  
                         document.getElementById('ee_hrule').style.width=actabw+"px";  
                     }  
                 }  
             }  
         }  
 DOCSTWO  
     }  
     $output .= <<"FOURTH";  
     }      }
     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 2945  DOCSTWO Line 3150  DOCSTWO
   
         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 2975  DOCSTWO Line 3181  DOCSTWO
                 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 2985  function callResize() { Line 3198  function callResize() {
     timer=setTimeout('resize_scrollbox("$names{'scroll'}","1","1")',500);      timer=setTimeout('resize_scrollbox("$names{'scroll'}","1","1")',500);
 }  }
   
 FOURTH  THIRD
     return $output;      return $output;
 }  }
   
   ##############################################
   ##############################################
   
   sub javascript_jumpto_resource {
       my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
                            &mt('Switch server?');
       return (<<ENDUTILITY)
   
   function go(url) {
      if (url!='' && url!= null) {
          currentURL = null;
          currentSymb= null;
          window.location.href=url;
      }
   }
   
   function need_switchserver(url) {
       if (url!='' && url!= null) {
           if (confirm("$confirm_switch")) {
               go(url);
           }
       }
       return;
   }
   
   ENDUTILITY
   
   }
   
   sub jump_to_editres {
       my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$folderpath,
           $title,$idx,$suppurl,$todocs) = @_;
       my $jscall;
       if ($switchserver) {
           if ($home) {
               $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.
                        &HTML::Entities::encode($env{'request.role'},'"<>&');
               if ($symb) {
                   $cfile .= '&amp;symb='.&HTML::Entities::encode($symb,'"<>&');
               } elsif ($folderpath) {
                   $cfile .= '&amp;folderpath='.&HTML::Entities::encode($folderpath,'"<>&');
               }
               if ($forceedit) {
                   $cfile .= '&amp;forceedit=1';
               }
               if ($forcereg) {
                   $cfile .= '&amp;register=1';
               }
               $jscall = "need_switchserver('$cfile');";
           }
       } else {
           unless ($cfile =~ m{^/priv/}) {
               if ($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) {
                   $cfile .= (($cfile=~/\?/)?'&amp;':'?').'forceedit=1';
               }
               if ($forcereg) {
                   $cfile .= (($cfile=~/\?/)?'&amp;':'?').'register=1';
               }
               if ($todocs) {
                  $cfile .= (($cfile=~/\?/)?'&amp;':'?').'todocs=1';
               }
           }
           $jscall = "go('$cfile')";
       }
       return $jscall;
   }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
Line 3052  END Line 3348  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 3356  sub funclist_from_array { Line 3652  sub funclist_from_array {
                { listattr => {class => 'LC_funclist'} });                 { listattr => {class => 'LC_funclist'} });
 }     }   
   
   =pod
   
   =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.322  
changed lines
  Added in v.1.357


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