Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.358.2.19.2.9 and 1.376

version 1.358.2.19.2.9, 2023/10/06 15:24:21 version 1.376, 2016/10/31 19:49:00
Line 78  sub java_not_enabled { Line 78  sub java_not_enabled {
 sub coursepreflink {  sub coursepreflink {
    my ($text,$category)=@_;     my ($text,$category)=@_;
    if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {     if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {
       my $target =' target="_top"';        return '<a target="_top" href="'.&HTML::Entities::encode("/adm/courseprefs?phase=display&actions=$category",'<>&"').'"><span class="LC_setting">'.$text.'</span></a>';
       if (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) {  
           $target = '';  
       }  
       return '<a'.$target.' href="'.&HTML::Entities::encode("/adm/courseprefs?phase=display&actions=$category",'<>&"').'"><span class="LC_setting">'.$text.'</span></a>';  
    } else {     } else {
       return '';        return '';
    }     }
Line 96  sub raw_href_to_link { Line 92  sub raw_href_to_link {
   
 sub entity_encode {  sub entity_encode {
     my ($text)=@_;      my ($text)=@_;
     return &HTML::Entities::encode($text, '\'<>&"');      return &HTML::Entities::encode($text, '<>&"');
 }  }
   
 sub direct_parm_link {  sub direct_parm_link {
Line 105  sub direct_parm_link { Line 101  sub direct_parm_link {
     $filter=&entity_encode($filter);      $filter=&entity_encode($filter);
     $part=&entity_encode($part);      $part=&entity_encode($part);
     if (($symb) && (&Apache::lonnet::allowed('opa')) && ($target ne 'tex')) {      if (($symb) && (&Apache::lonnet::allowed('opa')) && ($target ne 'tex')) {
         my $target=' target="_top"';         return "<a target='_top' href='/adm/parmset?symb=$symb&amp;filter=$filter&amp;part=$part'><span class='LC_setting'>$linktext</span></a>";
         if (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) {  
             $target = '';  
         }  
        return "<a".$target." href='/adm/parmset?symb=$symb&amp;filter=$filter&amp;part=$part'><span class='LC_setting'>$linktext</span></a>";  
     } else {      } else {
        return $linktext;         return $linktext;
     }      }
Line 415  sub textbox { Line 407  sub textbox {
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub checkbox {  sub checkbox {
     my ($name,$checked,$value,$special) = @_;      my ($name,$checked,$value) = @_;
     my $Str = '<input type="checkbox" name="'.$name.'" ';      my $Str = '<input type="checkbox" name="'.$name.'" ';
     if (defined($value)) {      if (defined($value)) {
         $Str .= 'value="'.$value.'"';          $Str .= 'value="'.$value.'"';
Line 423  sub checkbox { Line 415  sub checkbox {
     if ($checked) {      if ($checked) {
         $Str .= ' checked="checked"';          $Str .= ' checked="checked"';
     }      }
     $Str .= $special.' />';      $Str .= ' />';
     return $Str;      return $Str;
 }  }
   
Line 459  sub radio { Line 451  sub radio {
 &date_setter returns html and javascript for a compact date-setting form.  &date_setter returns html and javascript for a compact date-setting form.
 To retrieve values from it, use &get_date_from_form.  To retrieve values from it, use &get_date_from_form.
   
 Inputs  
   
 =over 4  =over 4
   
   =item Inputs
   
   =over
   
 =item $dname   =item $dname 
   
 The name to prepend to the form elements.    The name to prepend to the form elements.  
Line 523  If true, text boxes for seconds are omit Line 517  If true, text boxes for seconds are omit
   
 =back  =back
   
 Bugs  =item Bugs
   
 The method used to restrict user input will fail in the year 2400.  The method used to restrict user input will fail in the year 2400.
   
   =back
   
 =cut  =cut
   
 ##############################################  ##############################################
Line 693  ENDJS Line 689  ENDJS
                       $monthselector,$dayselector,$yearselector,                        $monthselector,$dayselector,$yearselector,
                       $hourselector).                        $hourselector).
                    $tzone;                     $tzone;
   
     } elsif ($no_ss) {      } elsif ($no_ss) {
         $result .= &mt('[_1] [_2] [_3] [_4] [_5]m',          $result .= &mt('[_1] [_2] [_3] [_4] [_5]m',
                       $monthselector,$dayselector,$yearselector,                        $monthselector,$dayselector,$yearselector,
                       $hourselector,$minuteselector).                        $hourselector,$minuteselector).
                    $tzone;                     $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,
Line 749  sub build_url { Line 747  sub build_url {
   
 get_date_from_form retrieves the date specified in an &date_setter form.  get_date_from_form retrieves the date specified in an &date_setter form.
   
 Inputs:  =over
   
   =item Inputs:
   
 =over 4  =over 4
   
Line 763  The unix time to use as the default in c Line 763  The unix time to use as the default in c
   
 =back  =back
   
   =back
   
 Returns: Unix time represented in the form.  Returns: Unix time represented in the form.
   
 =cut  =cut
Line 856  parameter setting wizard. Line 858  parameter setting wizard.
 ##############################################  ##############################################
 sub pjump_javascript_definition {  sub pjump_javascript_definition {
     my $Str = <<END;      my $Str = <<END;
     function pjump(type,dis,value,marker,ret,call,hour,min,sec,extra) {      function pjump(type,dis,value,marker,ret,call,hour,min,sec) {
         openMyModal("/adm/rat/parameter.html?type="+escape(type)          openMyModal("/adm/rat/parameter.html?type="+escape(type)
                  +"&value="+escape(value)+"&marker="+escape(marker)                   +"&value="+escape(value)+"&marker="+escape(marker)
                  +"&return="+escape(ret)                   +"&return="+escape(ret)
                  +"&call="+escape(call)+"&name="+escape(dis)                   +"&call="+escape(call)+"&name="+escape(dis)
                  +"&defhour="+escape(hour)+"&defmin="+escape(min)                   +"&defhour="+escape(hour)+"&defmin="+escape(min)
                  +"&defsec="+escape(sec)+"&extra="+escape(extra)                   +"&defsec="+escape(sec)+"&modal=1",350,350,'no');
                  +"&modal=1",350,350,'no');  
     }      }
 END  END
     return $Str;      return $Str;
Line 935  sub javascript_docopen { Line 936  sub javascript_docopen {
 Returns html for a selection box which allows the user to choose the  Returns html for a selection box which allows the user to choose the
 enrollment status of students.  The selection box name is 'Status'.  enrollment status of students.  The selection box name is 'Status'.
   
 Inputs:  =over
   
   =item Inputs:
   
 $status: the currently selected status.  If undefined the value of  $status: the currently selected status.  If undefined the value of
 $env{'form.Status'} is taken.  If that is undefined, a value of 'Active'  $env{'form.Status'} is taken.  If that is undefined, a value of 'Active'
Line 949  $size: the size (number of lines) of the Line 952  $size: the size (number of lines) of the
 $onchange: javascript to use when the value is changed.  Enclosed in   $onchange: javascript to use when the value is changed.  Enclosed in 
 double quotes, ""s, not single quotes.  double quotes, ""s, not single quotes.
   
   =back
   
 Returns: a perl string as described.  Returns: a perl string as described.
   
 =cut  =cut
Line 996  sub StatusOptions { Line 1001  sub StatusOptions {
   
 =pod  =pod
   
 =item Progess Window Handling Routines  =item Progress Window Handling Routines
   
 These routines handle the creation, update, increment, and closure of   These routines handle the creation, update, increment, and closure of 
 progress windows.  The progress window reports to the user the number  progress windows.  The progress window reports to the user the number
Line 1010  of items completed and an estimate of th Line 1015  of items completed and an estimate of th
 Writes javascript to the client to open a progress window and returns a  Writes javascript to the client to open a progress window and returns a
 data structure used for bookkeeping.  data structure used for bookkeeping.
   
 Inputs  =over
   
 =over 4  =item Inputs
   
   =over
   
 =item $r Apache request  =item $r Apache request
   
 =item $number_to_do The total number of items being processed.  =item $number_to_do The total number of items being processed.
   
 =item $preamble Optional HTML to display before the progress bar.  =back
   
 =back  =back
   
 Returns a hash containing the progress state data structure.  Returns a hash containing the progress state data structure.
 If $number_to_do is zero or null, an indeterminate progress bar will  
 be used.  
   
 =item &Update_PrgWin()  =item &Update_PrgWin()
   
 Updates the text in the progress indicator.  Does not increment the count.  Updates the text in the progress indicator.  Does not increment the count.
 See &Increment_PrgWin.  See &Increment_PrgWin.
   
 Inputs:  =over
   
   =item Inputs:
   
 =over 4  =over 4
   
Line 1043  Inputs: Line 1050  Inputs:
   
 =back  =back
   
   =back
   
 Returns: none  Returns: none
   
   
 =item Increment_PrgWin()  =item &Increment_PrgWin()
   
 Increment the count of items completed for the progress window by $step or 1 if no step is provided.  Increment the count of items completed for the progress window by $step or 1 if no step is provided.
   
 Inputs:  =over
   
   =item Inputs:
   
 =over 4  =over 4
   
 =item $r Apache request  =item $r 
   
 =item $prog_state Pointer to the data structure returned by Create_PrgWin  Apache request
   
 =item $extraInfo A description of the items being iterated over.  Typically  =item $prog_state
 'student'.  
   
 =item $step (optional) counter step. Will be set to default 1 if ommited. step must be greater than 0 or empty.  Pointer to the data structure returned by Create_PrgWin
   
   =item $extraInfo
   
   A description of the items being iterated over.  Typically 'student'.
   
   =item $step
   
   (optional) counter step. Will be set to default 1 if ommited. step must be greater than 0 or empty.
   
   =back
   
 =back  =back
   
Line 1072  Returns: none Line 1092  Returns: none
   
 Closes the progress window.  Closes the progress window.
   
 Inputs:  =over
   
   =item Inputs:
   
 =over 4   =over 4 
   
Line 1082  Inputs: Line 1104  Inputs:
   
 =back  =back
   
   =back
   
 Returns: none  Returns: none
   
 =back  =back
Line 1094  Returns: none Line 1118  Returns: none
   
 # Create progress  # Create progress
 sub Create_PrgWin {  sub Create_PrgWin {
     my ($r,$number_to_do,$preamble)=@_;      my ($r,$number_to_do)=@_;
     my %prog_state;      my %prog_state;
     $prog_state{'done'}=0;      $prog_state{'done'}=0;
     $prog_state{'firststart'}=&Time::HiRes::time();      $prog_state{'firststart'}=&Time::HiRes::time();
     $prog_state{'laststart'}=&Time::HiRes::time();      $prog_state{'laststart'}=&Time::HiRes::time();
     $prog_state{'max'}=$number_to_do;      $prog_state{'max'}=$number_to_do;
     &Apache::loncommon::LCprogressbar($r,$prog_state{'max'},$preamble);       &Apache::loncommon::LCprogressbar($r); 
     return %prog_state;      return %prog_state;
 }  }
   
 # update progress  # update progress
 sub Update_PrgWin {  sub Update_PrgWin {
     my ($r,$prog_state,$displayString)=@_;      my ($r,$prog_state,$displayString)=@_;
     &Apache::loncommon::LCprogressbarUpdate($r,undef,$displayString,$$prog_state{'max'});      &Apache::loncommon::LCprogressbarUpdate($r,undef,$displayString);
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
 }  }
   
Line 1157  sub Increment_PrgWin { Line 1181  sub Increment_PrgWin {
     if ($$prog_state{'max'}) {      if ($$prog_state{'max'}) {
        $percent=int(100.*$current/$$prog_state{'max'});         $percent=int(100.*$current/$$prog_state{'max'});
     }      }
     &Apache::loncommon::LCprogressbarUpdate($r,$percent,$timeinfo,$$prog_state{'max'});      &Apache::loncommon::LCprogressbarUpdate($r,$percent,$timeinfo);
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
 }  }
   
Line 1174  sub Close_PrgWin { Line 1198  sub Close_PrgWin {
 sub crumbs {  sub crumbs {
     my ($uri,$target,$prefix,$form,$skiplast,$onclick)=@_;      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/Community Content)'); }      if ($uri=~/^\/*(uploaded|adm)\//) { return &mt('(Internal Course/Group Content)'); }
     if ($target) {      if ($target) {
         $target = ' target="'.          $target = ' target="'.
                   &Apache::loncommon::escape_single($target).'"';                    &Apache::loncommon::escape_single($target).'"';
Line 1194  sub crumbs { Line 1218  sub crumbs {
             } else {              } else {
                 $path.='/';                   $path.='/'; 
             }              }
             if ($path eq '/res/') {  
                 unless (&Apache::lonnet::allowed('bre',$path)) {  
                     $output.="$dir/";  
                     next;  
                 }  
             }  
             my $href_path = &HTML::Entities::encode($path,'<>&"');              my $href_path = &HTML::Entities::encode($path,'<>&"');
             &Apache::loncommon::inhibit_menu_check(\$href_path);              &Apache::loncommon::inhibit_menu_check(\$href_path);
             if ($form) {              if ($form) {
Line 1277  sub htmlareaheaders { Line 1295  sub htmlareaheaders {
 ENDEDITOR  ENDEDITOR
  }   }
     $s.=(<<ENDJQUERY);      $s.=(<<ENDJQUERY);
 <script type="text/javascript" src="/adm/jQuery/js/jquery-3.2.1.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.12.1.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.12.1.custom.min.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" />
Line 1687  sub show_return_link { Line 1705  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') &&      return if ($env{'request.noversionuri'} eq '/adm/supplemental');
                ($env{'form.folder'} ne 'supplemental'));      return if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
     return if (($env{'form.folderpath'} ne '') &&                 (!$env{'request.role.adv'}));
                (($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) ||      if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
                 ($env{'request.noversionuri'} =~ m{^/public/$match_domain/$match_courseid/syllabus$})));  
     if (($env{'request.noversionuri'} =~ m{^/adm/viewclasslist($|\?)})  
         || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {          || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
   
         return if ($env{'form.register'});          return if ($env{'form.register'});
     }      }
     if ((($env{'request.symb'} ne '') || ($env{'form.folderpath'} ne '')) &&  
          ($env{'request.noversionuri'} =~m{^/adm/coursedocs/showdoc/uploaded/($match_domain)/($match_courseid)/(docs|supplemental)/})) {  
         my ($cdom,$cnum,$area) =  ($1,$2,$3);  
         if (($env{'course.'.$env{'request.course.id'}.'.domain'} eq $cdom) &&  
             ($env{'course.'.$env{'request.course.id'}.'.num'} eq $cnum)) {  
             if (($env{'request.symb'}) && ($area eq 'docs')) {  
                 my ($map,$resid,$url) = &Apache::lonnet::decode_symb($env{'request.symb'});  
                 return if ($env{'request.noversionuri'} eq '/adm/coursedocs/showdoc/'.$url);  
             } elsif (($env{'form.folderpath'}) && ($area eq 'supplemental')) {  
                 return;  
             }  
         }  
     }  
     return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&      return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
              $env{'request.symb'} eq '')               $env{'request.symb'} eq '')
             ||              ||
Line 1718  sub show_return_link { Line 1721  sub show_return_link {
             (($env{'request.noversionuri'}=~/^\/adm\//) &&              (($env{'request.noversionuri'}=~/^\/adm\//) &&
              ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&               ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
              ($env{'request.noversionuri'}!~               ($env{'request.noversionuri'}!~
               m{^/adm/.*/(smppg|bulletinboard|ext\.tool)($|\?)})                m{^/adm/.*/(smppg|bulletinboard|exttools?)($|\?)})
            ));             ));
 }  }
   
Line 1778  clientTime = (new Date()).getTime(); Line 1781  clientTime = (new Date()).getTime();
 END  END
 }  }
   
 ##  
 # Client-side javascript to convert any dashes in text pasted  
 # into textbox(es) for numericalresponse item(s) to a standard  
 # minus, i.e., - . Calls to dash_to_minus_js() in end_problem()  
 # and in loncommon::endbodytag() for a .page (arg: dashjs => 1)  
 #  
 # Will apply to any input tag with class: LC_numresponse_text.  
 # Currently set in start_textline for numericalresponse items.  
 #  
   
 sub dash_to_minus_js {  
     return <<'ENDJS';  
   
 <script type="text/javascript">  
 //<![CDATA[  
 //<!-- BEGIN LON-CAPA Internal  
 document.addEventListener("DOMContentLoaded", (event) => {  
     const numresp = document.querySelectorAll("input.LC_numresponse_text");  
     if (numresp.length > 0) {  
         numresp.forEach((el) => {  
             el.addEventListener("paste", (e) => {  
                 e.preventDefault();  
                 e.stopPropagation();  
                 let p = (e.clipboardData || window.clipboardData).getData("text");  
                 p.toString();  
                 p = p.replace(/\p{Dash}/gu, '-');  
                 putInText(p);  
             });  
         });  
     }  
     const putInText = (newText, el = document.activeElement) => {  
         const [start, end] = [el.selectionStart, el.selectionEnd];  
         el.setRangeText(newText, start, end, 'end');  
     }  
 });  
 // END LON-CAPA Internal -->  
 //]]>  
 </script>  
   
 ENDJS  
 }  
   
 ############################################################  ############################################################
 ############################################################  ############################################################
   
Line 1834  A link to help for the component will be Line 1795  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),  =over
         $component_help (the help item filename (without .tex extension).  
         $menulink (boolean, controls whether to include a link to /adm/menu)  =item Inputs:
         $helplink (if 'nohelp' don't include the orange help link)  
         $css_class (optional name for the class to apply to the table for CSS)  =over
         $no_mt (optional flag, 1 if &mt() is _not_ to be applied to $component  
            when including the text on the right.  =item $component
         $CourseBreadcrumbs (optional flag, 1 if &breadcrumbs called from &docs_breadcrumbs,  
            because breadcrumbs are being)  the text on the right side of the breadcrumbs trail
         $topic_help (optional help item to be displayed on right side of the breadcrumbs   
            row, using loncommon::help_open_topic() to generate the link.  =item $component_help
         $topic_help_text (text to include in the link in the optional help item   
            on the right side of the breadcrumbs row.  the help item filename (without .tex extension).
         $links_target optionally includes the target (_top, _parent or _self)  
   =item $menulink
   
   boolean, controls whether to include a link to /adm/menu
   
   =item $helplink
   
   if 'nohelp' don't include the orange help link
   
   =item $css_class
   
   optional name for the class to apply to the table for CSS
   
   =item $no_mt 
   
   optional flag, 1 if &mt() is _not_ to be applied to $component when including the text on the right
   
   =item $CourseBreadcrumbs
   
   optional flag, 1 if &breadcrumbs called from &docs_breadcrumbs, because breadcrumbs are being
   used to display hierarchy for current folder shown in the Course Editor. 
   
   =item $topic_help
   
   optional help item to be displayed on right side of the breadcrumbs row, using 
   loncommon::help_open_topic() to generate the link. 
   
   =item $topic_help_text
   
   text to include in the link in the optional help item ($topic_help) on the right
   side of the breadcrumbs row.
   
   =back
   
   =back
   
 Returns a string containing breadcrumbs for the current page.  Returns a string containing breadcrumbs for the current page.
   
Line 1876  returns: nothing Line 1871  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,$topic_help,$topic_help_text,$links_target) = @_;              $CourseBreadcrumbs,$topic_help,$topic_help_text,$crstype) = @_;
         #          #
         $css_class ||= 'LC_breadcrumbs';          $css_class ||= 'LC_breadcrumbs';
   
Line 1891  returns: nothing Line 1886  returns: nothing
         #          #
         # The first one should be the course or a menu link          # The first one should be the course or a menu link
         if (!defined($menulink)) { $menulink=1; }          if (!defined($menulink)) { $menulink=1; }
         if ($menulink) {          if ((($crstype eq 'Placement') || (($env{'request.course.id'}) &&
             if ($env{'request.course.id'}) {              ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement'))) &&
                 my ($menucoll,$deeplinkmenu,$menuref) = &Apache::loncommon::menucoll_in_effect();              (!$env{'request.role.adv'})) {
                 if (($menucoll) && (ref($menuref) eq 'HASH')) {              undef($menulink);
                     if ($menuref->{'main'} eq 'n') {  
                        undef($menulink);  
                     }  
                 }  
             }  
         }          }
         if ($menulink) {          if ($menulink) {
             my $description = 'Menu';              my $description = 'Menu';
Line 1911  returns: nothing Line 1901  returns: nothing
                     $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'} =~                   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';
Line 1919  returns: nothing Line 1909  returns: nothing
                     }                      }
                 }                  }
             }              }
             my $target = '_top';  
             if ($links_target) {  
                 $target = $links_target;  
             } elsif (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) {  
                 $target = '';  
             }  
             $menulink =  {  href   =>'/adm/menu',              $menulink =  {  href   =>'/adm/menu',
                             title  =>'Go to main menu',                              title  =>'Go to main menu',
                             target =>$target,                              target =>'_top',
                             text   =>$description,                              text   =>$description,
                             no_mt  =>$no_mt_descr, };                              no_mt  =>$no_mt_descr, };
             if($last) {              if($last) {
Line 1945  returns: nothing Line 1929  returns: nothing
                             title => &mt('Back to most recent content resource'),                              title => &mt('Back to most recent content resource'),
                             class => 'LC_menubuttons_link',                              class => 'LC_menubuttons_link',
                           };                            };
             if ($links_target) {              if ($env{'request.noversionuri'} eq '/adm/searchcat') {
                 $hashref->{'target'} = $links_target;                  $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" />',
                              $hashref);                               $hashref);
Line 1997  returns: nothing Line 1981  returns: nothing
         if ($faq ne '' || $component_help ne '' || $bug ne '') {          if ($faq ne '' || $component_help ne '' || $bug ne '') {
             $icons .= &Apache::loncommon::help_open_menu($component,              $icons .= &Apache::loncommon::help_open_menu($component,
                                                          $component_help,                                                           $component_help,
                                                          $faq,$bug,'','','','',                                                           $faq,$bug);
                                                          $links_target);  
         }          }
         if ($topic_help && $topic_help_text) {          if ($topic_help && $topic_help_text) {
            $icons .= ' '.&Apache::loncommon::help_open_topic($topic_help,&mt($topic_help_text),'',             $icons .= ' '.&Apache::loncommon::help_open_topic($topic_help,&mt($topic_help_text),'',
                                                              undef,600,'',$links_target);                                                               undef,600);
         }          }
         #          #
   
Line 2071  Adds $html to $category of the breadcrum Line 2054  Adds $html to $category of the breadcrum
 $html is usually a link to a page that invokes a function on the currently   $html is usually a link to a page that invokes a function on the currently 
 displayed data (e.g. print when viewing a problem)  displayed data (e.g. print when viewing a problem)
   
 Currently there are 3 possible values for $category:   =over
   
   =item Currently there are 3 possible values for $category: 
   
 =over   =over 
   
Line 2085  remaining items in right of breadcrumbs Line 2070  remaining items in right of breadcrumbs
 advanced tools shown in a separate box below breadcrumbs line   advanced tools shown in a separate box below breadcrumbs line 
   
 =back  =back
    
   =back
   
 returns: nothing  returns: nothing
   
 =cut  =cut
Line 2134  returns: a hash containing the current b Line 2121  returns: a hash containing the current b
 Creates html for breadcrumb tools (categories navigation and tools) and inserts   Creates html for breadcrumb tools (categories navigation and tools) and inserts 
 \$breadcrumbs at the correct position.  \$breadcrumbs at the correct position.
   
 input: \$breadcrumbs - a reference to the string containing prepared   =over
 breadcrumbs.  
   =item input: 
   
   =over
   
   =item \$breadcrumbs - a reference to the string containing prepared breadcrumbs.
   
   =back
   
   =back
   
 returns: nothing  returns: nothing
   
Line 2161  returns: nothing Line 2157  returns: nothing
 Creates html for advanced tools (category advtools) and inserts \$breadcrumbs   Creates html for advanced tools (category advtools) and inserts \$breadcrumbs 
 at the correct position.  at the correct position.
   
 input: \$breadcrumbs - a reference to the string containing prepared   =over
 breadcrumbs (after render_tools call).  
   =item input:
   
   =over
   
   =item \$breadcrumbs - a reference to the string containing prepared breadcrumbs (after render_tools call).
   
   =back
   
   =back
   
 returns: nothing  returns: nothing
   
Line 2180  returns: nothing Line 2185  returns: nothing
 } # End of scope for @Crumbs  } # End of scope for @Crumbs
   
 sub docs_breadcrumbs {  sub docs_breadcrumbs {
     my ($allowed,$crstype,$contenteditor,$title,$precleared,$checklinkprot)=@_;      my ($allowed,$crstype,$contenteditor,$title,$precleared)=@_;
     my ($folderpath,@folders,$supplementalflag);      my ($folderpath,@folders,$supplementalflag);
     @folders = split('&',$env{'form.folderpath'});      @folders = split('&',$env{'form.folderpath'});
     if ($env{'form.folderpath'} =~ /^supplemental/) {      if ($env{'form.folderpath'} =~ /^supplemental/) {
Line 2195  sub docs_breadcrumbs { Line 2200  sub docs_breadcrumbs {
         my $foldername=shift(@folders);          my $foldername=shift(@folders);
         if ($folderpath) {$folderpath.='&';}          if ($folderpath) {$folderpath.='&';}
         $folderpath.=$folder.'&'.$foldername;          $folderpath.=$folder.'&'.$foldername;
         my $url = $env{'request.use_absolute'};          my $url;
         if ($allowed) {          if ($allowed) {
             $url .= '/adm/coursedocs?folderpath=';              $url = '/adm/coursedocs?folderpath=';
         } else {          } else {
             $url .= '/adm/supplemental?folderpath=';              $url = '/adm/supplemental?folderpath=';
         }          }
         $url .= &escape($folderpath);          $url .= &escape($folderpath);
         my $name=&unescape($foldername);          my $name=&unescape($foldername);
 # each of randompick number, hidden, encrypted, random order, is_page   # each of randompick number, hidden, encrypted, random order, is_page 
 # are appended with ":"s to the foldername  # are appended with ":"s to the foldername
         $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//;          $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//;
         if ($contenteditor) {          unless ($supplementalflag) {
             if ($supplementalflag) {              if ($contenteditor) { 
                 if ($2) { $ishidden=1; }  
             } else {  
                 if ($1 ne '') {                  if ($1 ne '') {
                     $randompick=$1;                      $randompick=$1;
                 } else {                  } else {
Line 2250  sub docs_breadcrumbs { Line 2253  sub docs_breadcrumbs {
             $plain=~s/\&gt\;\s*$//;              $plain=~s/\&gt\;\s*$//;
         }          }
         my $menulink = 0;          my $menulink = 0;
         if (!$allowed && !$contenteditor && !$supplementalflag) {          if (!$allowed && !$contenteditor) {
             $menulink = 1;              $menulink = 1;
         }          }
         if ($checklinkprot) {  
             if ($env{'request.deeplink.login'}) {  
                 my $linkprotout = &Apache::lonmenu::linkprot_exit();  
                 if ($linkprotout) {  
                     &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$linkprotout);  
                 }  
             }  
         }  
         return (&breadcrumbs(undef,undef,$menulink,'nohelp',undef,undef,          return (&breadcrumbs(undef,undef,$menulink,'nohelp',undef,undef,
                              $contenteditor),                               $contenteditor),
                              $randompick,$ishidden,$isencrypted,$plain,                               $randompick,$ishidden,$isencrypted,$plain,
Line 2634  sub course_custom_roles { Line 2629  sub course_custom_roles {
   
   
 sub resource_info_box {  sub resource_info_box {
    my ($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp,$divforres)=@_;     my ($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp)=@_;
    my $return='';     my $return='';
    if (($stuvcurrent ne '') || ($divforres)) {     if ($stuvcurrent ne '') {
        $return = '<div class="LC_left_float">';         $return = '<div class="LC_left_float">';
    }     }
    if ($symb) {     if ($symb) {
Line 2665  sub resource_info_box { Line 2660  sub resource_info_box {
     } else {      } else {
        $return='<p><span class="LC_error">'.&mt('No context provided.').'</span></p>';         $return='<p><span class="LC_error">'.&mt('No context provided.').'</span></p>';
     }      }
     if (($stuvcurrent ne '') || ($divforres)) {      if ($stuvcurrent ne '') {
         $return .= '</div>';          $return .= '</div>';
     }      }
     return $return;      return $return;
Line 3396  PARAMSONE Line 3391  PARAMSONE
         if (itemid != null) {          if (itemid != null) {
             itemh = itemid.offsetHeight;              itemh = itemid.offsetHeight;
         }          }
         var primaryheight = 0;          var primaryheight = document.getElementById('LC_nav_bar').offsetHeight;
         if (document.getElementById('LC_nav_bar') != null) {          var secondaryheight;
             primaryheight = document.getElementById('LC_nav_bar').offsetHeight;  
         }  
         var secondaryheight = 0;  
         if (document.getElementById('LC_secondary_menu') != null) {           if (document.getElementById('LC_secondary_menu') != null) { 
             secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight;              secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight;
         }          }
         var crumbsheight = 0;          var crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight;
         if (document.getElementById('LC_breadcrumbs') != null) {  
             crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight;  
         }  
         var dccidheight = 0;          var dccidheight = 0;
         if (document.getElementById('dccid') != null) {          if (document.getElementById('dccid') != null) {
             dccidheight = document.getElementById('dccid').offsetHeight;              dccidheight = document.getElementById('dccid').offsetHeight;
Line 3480  THIRD Line 3469  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?');
     my $confirm_new_tab = &mt("Editing requires using the resource's home server.")."\n".  
                           &mt('Open a new browser tab?');  
     &js_escape(\$confirm_switch);      &js_escape(\$confirm_switch);
     &js_escape(\$confirm_new_tab);  
     return (<<ENDUTILITY)      return (<<ENDUTILITY)
   
 function go(url) {  function go(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
        currentURL = null;         currentURL = null;
        currentSymb= null;         currentSymb= null;
        var lcHostname = setLCHost();         window.location.href=url;
        if (lcHostname!='' && lcHostname!= null) {  
            var RegExp = /^https?\:/;  
            if (RegExp.test(url)) {  
                window.location.href=url;  
            } else {  
                window.location.href=lcHostname+url;  
            }  
        } else {  
            window.location.href=url;  
        }  
    }     }
 }  }
   
 function need_switchserver(url,target) {  function need_switchserver(url) {
     if (url!='' && url!= null) {      if (url!='' && url!= null) {
         if (target == '_blank') {          if (confirm("$confirm_switch")) {
             if (confirm("$confirm_new_tab")) {  
                 window.open(url,target);  
             }  
         } else if (confirm("$confirm_switch")) {  
             go(url);              go(url);
         }          }
     }      }
Line 3522  ENDUTILITY Line 3494  ENDUTILITY
 }  }
   
 sub jump_to_editres {  sub jump_to_editres {
     my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$shownsymb,      my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$folderpath,
         $folderpath,$title,$hostname,$idx,$suppurl,$todocs,$suppanchor) = @_;          $title,$idx,$suppurl,$todocs,$suppanchor) = @_;
     my ($jscall,$anchor,$usehttp,$usehttps,$is_ext,$target);      my ($jscall,$anchor);
     if ($switchserver) {      if ($switchserver) {
         if ($home) {          if ($home) {
             my $resedit;  
             if ($cfile =~ m{^/priv/($match_domain)/($match_username)/}) {  
                 my ($audom,$auname) = ($1,$2);  
                 unless (&Apache::lonnet::is_course($audom,$auname)) {  
                     if (($symb ne '') && ($env{'request.course.id'}) &&  
                         (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {  
                         unless (&Apache::lonnet::can_switchserver($env{'user.domain'},$home)) {  
                             $target = '_blank';  
                             $resedit = 1;  
                         }  
                     }  
                 }  
             }  
             $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'},'"<>&');
             if ($shownsymb) {              if ($symb) {
                 $cfile .= '&amp;symb='.&HTML::Entities::encode($shownsymb,'"<>&');                  $cfile .= '&amp;symb='.&HTML::Entities::encode($symb,'"<>&');
                 if ($resedit) {  
                     $cfile .= '&amp;edit=1';  
                 }  
             } elsif ($folderpath) {              } elsif ($folderpath) {
                 $cfile .= '&amp;folderpath='.&HTML::Entities::encode($folderpath,'"<>&');                  $cfile .= '&amp;folderpath='.&HTML::Entities::encode($folderpath,'"<>&');
             }              }
Line 3556  sub jump_to_editres { Line 3512  sub jump_to_editres {
             if ($forcereg) {              if ($forcereg) {
                 $cfile .= '&amp;register=1';                  $cfile .= '&amp;register=1';
             }              }
             $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."','$target')";              $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."');";
         }          }
     } else {      } else {
         unless ($cfile =~ m{^/priv/}) {          unless ($cfile =~ m{^/priv/}) {
             if ($cfile =~ m{^(/adm/wrapper/ext/([^#]+))(?:|#([^#]+))$}) {              if ($cfile =~ m{^(/adm/wrapper/ext/[^#]+)#([^#]+)$}) {
                 $cfile = $1;                  $cfile = $1;
                 my $extlink = $2;                  $anchor = $2;
                 $anchor = $3;  
                 $is_ext = 1;  
                 if (($extlink !~ /^https:/) && ($ENV{'SERVER_PORT'} == 443)) {  
                     unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {  
                         $usehttp = 1;  
                     }  
                 } elsif ($env{'request.use_absolute'}) {  
                     if ($env{'request.use_absolute'} =~ m{^https://}) {  
                         $usehttps = 1;  
                     }  
                 }  
             } elsif ($cfile =~ m{^/?public/($match_domain)/($match_courseid)/syllabus}) {  
                 if ($ENV{'SERVER_PORT'} == 443) {  
                     my ($cdom,$cnum) = ($1,$2);  
                     if (($env{'request.course.id'}) &&  
                         ($env{'course.'.$env{'request.course.id'}.'.num'} eq $cnum) &&  
                         ($env{'course.'.$env{'request.course.id'}.'.domain'} eq $cdom)) {  
                         if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) {  
                             unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {  
                                 $usehttp = 1;  
                             }  
                         }  
                     }  
                 } elsif ($env{'request.use_absolute'}) {  
                     if ($env{'request.use_absolute'} =~ m{^https://}) {  
                         $usehttps = 1;  
                     }  
                 }  
             }              }
             if ($symb) {              if ($symb) {
                 if ($anchor ne '') {                  if ($anchor ne '') {
Line 3616  sub jump_to_editres { Line 3544  sub jump_to_editres {
             }              }
             if ($forceedit) {              if ($forceedit) {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').'forceedit=1';                  $cfile .= (($cfile=~/\?/)?'&amp;':'?').'forceedit=1';
                 if ($usehttps) {  
                     $cfile = $env{'request.use_absolute'}.(($cfile =~ /^\//)? '':'/').$cfile;  
                 }  
             } elsif ($usehttp) {  
                 if ($hostname ne '') {  
                     $cfile = 'http://'.$hostname.(($cfile =~ /^\//)? '':'/').$cfile;  
                 }  
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').'usehttp=1';  
             } elsif ($usehttps) {  
                 $cfile = $env{'request.use_absolute'}.(($cfile =~ /^\//)? '':'/').$cfile;  
             }              }
             if ($forcereg) {              if ($forcereg) {
                 $cfile .= (($cfile=~/\?/)?'&amp;':'?').'register=1';                  $cfile .= (($cfile=~/\?/)?'&amp;':'?').'register=1';
Line 3652  sub jump_to_editres { Line 3570  sub jump_to_editres {
 # javascript_valid_email  # javascript_valid_email
 #  #
 # Generates javascript to validate an e-mail address.  # Generates javascript to validate an e-mail address.
 # Returns a javascript function which accepts a form field as argument, and  # Returns a javascript function which accetps a form field as argumnent, and
 # returns false if field.value does not satisfy two regular expression matches  # returns false if field.value does not satisfy two regular expression matches
 # for a valid e-mail address.  Backwards compatible with old browsers without  # for a valid e-mail address.  Backwards compatible with old browsers without
 # support for javascript RegExp (just checks for @ in field.value in this case).   # support for javascript RegExp (just checks for @ in field.value in this case). 
   
 sub javascript_valid_email {  sub javascript_valid_email {
     my $scripttag .= <<'END';      my $scripttag .= <<'END';
 function validmail(field,suffix) {  function validmail(field) {
     var str = field.value;      var str = field.value;
     if (suffix != '' && suffix != undefined) {  
         str += suffix;  
     }  
     if (window.RegExp) {      if (window.RegExp) {
         var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)";          var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)";
         var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"; //"          var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"; //"
Line 3773  sub scripttag { Line 3688  sub scripttag {
   
 Constructs a XHTML list from \@array.  Constructs a XHTML list from \@array.
   
 input:   =over
   
   =item input: 
   
 =over  =over
   
Line 3787  Attributes for <ul> and <li> passed in a Line 3704  Attributes for <ul> and <li> passed in a
 See htmltag() for more details.  See htmltag() for more details.
   
 =back  =back
    
   =back
   
 returns: XHTML list as String.   returns: XHTML list as String. 
   
 =cut     =cut   
Line 3906  should be included in this list. Line 3825  should be included in this list.
   
 If the optional headline text is not provided, a default text will be used.  If the optional headline text is not provided, a default text will be used.
   
   =over
   
   =item Related routines:
   
 Related routines:  
 =over 4  =over 4
 add_item_funclist  
 end_funclist  =item add_item_funclist
   
   =item end_funclist
   
 =back  =back
   
   =back
   
 Inputs: (optional) headline text  Inputs: (optional) headline text
   
Line 3939  sub start_funclist { Line 3864  sub start_funclist {
   
 Adds an item to the list of available functions  Adds an item to the list of available functions
   
 Related routines:  =over
   
   =item Related routines:
   
 =over 4  =over 4
 start_funclist  
 end_funclist  =item start_funclist
   
   =item end_funclist
   
   =back
   
 =back  =back
   
 Inputs: content item with text and link to function  Inputs: content item with text and link to function
Line 3965  sub add_item_funclist { Line 3898  sub add_item_funclist {
   
 End list of available functions  End list of available functions
   
 Related routines:  =over
 =over 4  
 start_funclist  =item Related routines:
 add_item_funclist  
    start_funclist
    add_item_funclist
   
 =back  =back
   
 Inputs: ./.  Inputs: ./.
Line 4001  A string that's used as visually highlig Line 3937  A string that's used as visually highlig
 it's value evaluates to false.  it's value evaluates to false.
   
 =back  =back
    
 returns: XHTML list as string.   returns: XHTML list as string. 
   
 =back  =back
Line 4014  sub funclist_from_array { Line 3950  sub funclist_from_array {
     $args->{legend} ||= mt('Functions');      $args->{legend} ||= mt('Functions');
     return list_from_array( [$args->{legend}, @$items],       return list_from_array( [$args->{legend}, @$items], 
                { listattr => {class => 'LC_funclist'} });                 { listattr => {class => 'LC_funclist'} });
 }     }
   
 =pod  =pod
   
Line 4036  e.g. a file operation in Authoring Space Line 3972  e.g. a file operation in Authoring Space
 A reference to the array containing text. Details: sub funclist_from_array  A reference to the array containing text. Details: sub funclist_from_array
   
 =back  =back
    
 Returns: XHTML div as string.  Returns: XHTML div as string. 
   
 =back  =back
   

Removed from v.1.358.2.19.2.9  
changed lines
  Added in v.1.376


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