Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.358.2.10 and 1.393

version 1.358.2.10, 2016/11/09 23:14:47 version 1.393, 2018/04/24 13:40:32
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'})) {
       return '<a target="_top" href="'.&HTML::Entities::encode("/adm/courseprefs?phase=display&actions=$category",'<>&"').'"><span class="LC_setting">'.$text.'</span></a>';         my $target =' target="_top"';
          if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
              $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 92  sub raw_href_to_link { Line 96  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 101  sub direct_parm_link { Line 105  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')) {
        return "<a target='_top' href='/adm/parmset?symb=$symb&amp;filter=$filter&amp;part=$part'><span class='LC_setting'>$linktext</span></a>";          my $target=' target="_top"';
           if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
               $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 451  sub radio { Line 459  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 515  If true, text boxes for seconds are omit Line 525  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 671  ENDJS Line 683  ENDJS
     my $minuteselector = qq{<input type="text" name="$dname\_minute" $special $state value="$min" size="3" />};      my $minuteselector = qq{<input type="text" name="$dname\_minute" $special $state value="$min" size="3" />};
     my $secondselector= qq{<input type="text" name="$dname\_second" $special $state value="$sec" size="3" />};      my $secondselector= qq{<input type="text" name="$dname\_second" $special $state value="$sec" size="3" />};
     my $cal_link;      my $cal_link;
     if (!$nolink) {      unless (($nolink) || ($state eq 'disabled')) {
         $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};          $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};
     }      }
     #      #
Line 685  ENDJS Line 697  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,
                       $hourselector,$minuteselector,$secondselector).                        $hourselector,$minuteselector,$secondselector).
                    $tzone;                     $tzone;
     }      }
     if (!$nolink) {      unless (($nolink) || ($state eq 'disabled')) {
         $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');          $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";
Line 741  sub build_url { Line 755  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 755  The unix time to use as the default in c Line 771  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 926  sub javascript_docopen { Line 944  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 940  $size: the size (number of lines) of the Line 960  $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 987  sub StatusOptions { Line 1009  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 1001  of items completed and an estimate of th Line 1023  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
   
   =item Inputs
   
 =over 4  =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
   
 Returns a hash containing the progress state data structure.  =back
   
   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 1031  Inputs: Line 1062  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 $prog_state
   
   Pointer to the data structure returned by Create_PrgWin
   
   =item $extraInfo
   
   A description of the items being iterated over.  Typically 'student'.
   
 =item $extraInfo A description of the items being iterated over.  Typically  =item $step
 'student'.  
   
 =item $step (optional) counter step. Will be set to default 1 if ommited. step must be greater than 0 or empty.  (optional) counter step. Will be set to default 1 if ommited. step must be greater than 0 or empty.
   
   =back
   
 =back  =back
   
Line 1060  Returns: none Line 1104  Returns: none
   
 Closes the progress window.  Closes the progress window.
   
 Inputs:  =over
   
   =item Inputs:
   
 =over 4   =over 4 
   
Line 1070  Inputs: Line 1116  Inputs:
   
 =back  =back
   
   =back
   
 Returns: none  Returns: none
   
 =back  =back
Line 1082  Returns: none Line 1130  Returns: none
   
 # Create progress  # Create progress
 sub Create_PrgWin {  sub Create_PrgWin {
     my ($r,$number_to_do)=@_;      my ($r,$number_to_do,$preamble)=@_;
     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);       &Apache::loncommon::LCprogressbar($r,$prog_state{'max'},$preamble); 
     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);      &Apache::loncommon::LCprogressbarUpdate($r,undef,$displayString,$$prog_state{'max'});
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
 }  }
   
Line 1145  sub Increment_PrgWin { Line 1193  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);      &Apache::loncommon::LCprogressbarUpdate($r,$percent,$timeinfo,$$prog_state{'max'});
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
 }  }
   
Line 1265  sub htmlareaheaders { Line 1313  sub htmlareaheaders {
 ENDEDITOR  ENDEDITOR
  }   }
     $s.=(<<ENDJQUERY);      $s.=(<<ENDJQUERY);
 <script type="text/javascript" src="/adm/jQuery/js/jquery-1.11.3.min.js"></script>  <script type="text/javascript" src="/adm/jQuery/js/jquery-3.2.1.min.js"></script>
 <script type="text/javascript" src="/adm/jQuery/js/jquery-ui-1.11.4.custom.min.js"></script>  <script type="text/javascript" src="/adm/jQuery/js/jquery-ui-1.12.1.custom.min.js"></script>
 <link rel="stylesheet" type="text/css" href="/adm/jQuery/css/smoothness/jquery-ui-1.11.4.custom.css" />  <link rel="stylesheet" type="text/css" href="/adm/jQuery/css/smoothness/jquery-ui-1.12.1.custom.min.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 1304  $(document).ready(function(){ Line 1352  $(document).ready(function(){
 });';  });';
 }  }
   
   sub countdown {
   
       # Code to put a due date countdown in 'duedatecountdown' span.
       # This is currently located in the breadcrumb headers.
       # note that the dueDateLayout is internatinoalized below.
       # Here document is used to support the substitution into the javascript below.
       # ..which unforunately necessitates escaping the $'s in the javascript.
       # There are several times of importance
       #
       # serverDueDate -  The absolute time at which the problem expires.
       # serverTime    -  The server's time when the problem finished computing.
       # clientTime    -  The client's time...as close to serverTime as possible.
       #                  The clientTime will be slightly later due to
       #                  1. The latency between problem computation and
       #                     the first network action.
       #                  2. The time required between the page load-start and the actual
       #                     initial javascript execution that got clientTime.
       # These are used as follows:
       #   The difference between clientTime and serverTime are used to
       #   correct for differences in clock settings between the browser's system and the
       #   server's.
       #
       #   The difference between clientTime and the time at which the ready() method
       #   starts executing is used to estimate latencies for page load and submission.
       #   Since this is an estimate, it is doubled.  The latency estimate + one minute
       #   is used to determine when the countdown timer turns red to warn the user
       #   to think about submitting.
   
   
       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 $pastdue = '- <b>'.&mt('Past Due').'</b>';
       return <<"JAVASCRIPT";
   
       var documentReadyTime;
   
   \$(document).ready(function() {
      if (typeof(dueDate) != "undefined") {
          documentReadyTime = (new Date()).getTime();
         \$("#duedatecountdown").countdown({until: dueDate, compact: true,
            layout: "$dueDateLayout",
            onTick: function (periods) {
               var latencyEstimate = (documentReadyTime - clientTime) * 2;
               if(\$.countdown.periodsToSeconds(periods) < (300 + latencyEstimate)) {
                  \$("#submitearly").html("$early");
                  if (\$.countdown.periodsToSeconds(periods) < 1) {
                       \$("#submitearly").html("$pastdue");
                  }
               }
               if(\$.countdown.periodsToSeconds(periods) < (60 + latencyEstimate)) {
                  \$(this).css("color", "red");   //Highlight last minute.
               }
            }
         });
      }
   });
   
   JAVASCRIPT
   
   }
   
 # ----------------------------------------- Script to activate only some fields  # ----------------------------------------- Script to activate only some fields
   
 sub htmlareaselectactive {  sub htmlareaselectactive {
Line 1527  sub htmlareaselectactive { Line 1637  sub htmlareaselectactive {
   
  });   });
 ';  ';
     $output .= &color_picker;      $output .= &color_picker();
   
     # Code to put a due date countdown in 'duedatecountdown' span.      $output .= &countdown();
     # This is currently located in the breadcrumb headers.  
     # note that the dueDateLayout is internatinoalized below.  
     # Here document is used to support the substitution into the javascript below.  
     # ..which unforunately necessitates escaping the $'s in the javascript.  
     # There are several times of importance  
     #  
     # serverDueDate -  The absolute time at which the problem expires.  
     # serverTime    -  The server's time when the problem finished computing.  
     # clientTime    -  The client's time...as close to serverTime as possible.  
     #                  The clientTime will be slightly later due to  
     #                  1. The latency between problem computation and   
     #                     the first network action.  
     #                  2. The time required between the page load-start and the actual  
     #                     initial javascript execution that got clientTime.  
     # These are used as follows:  
     #   The difference between clientTime and serverTime are used to   
     #   correct for differences in clock settings between the browser's system and the  
     #   server's.  
     #  
     #   The difference between clientTime and the time at which the ready() method  
     #   starts executing is used to estimate latencies for page load and submission.  
     #   Since this is an estimate, it is doubled.  The latency estimate + one minute  
     #   is used to determine when the countdown timer turns red to warn the user  
     #   to think about submitting.  
   
     my $dueDateLayout = &mt('Due in: {dn} {dl} {hnn}{sep}{mnn}{sep}{snn} [_1]',      $output .= <<"JAVASCRIPT";
                             "<span id='submitearly'></span>");  
     my $early = '- <b>'.&mt('Submit Early').'</b>';  
     my $pastdue = '- <b>'.&mt('Past Due').'</b>';  
     $output .= <<JAVASCRIPT;  
   
     var documentReadyTime;  
   
 \$(document).ready(function() {  
    if (typeof(dueDate) != "undefined") {  
        documentReadyTime = (new Date()).getTime();  
       \$("#duedatecountdown").countdown({until: dueDate, compact: true,   
          layout: "$dueDateLayout",  
          onTick: function (periods) {  
     var latencyEstimate = (documentReadyTime - clientTime) * 2;  
             if(\$.countdown.periodsToSeconds(periods) < (300 + latencyEstimate)) {  
                \$("#submitearly").html("$early");  
                if (\$.countdown.periodsToSeconds(periods) < 1) {  
                     \$("#submitearly").html("$pastdue");  
                }  
             }  
             if(\$.countdown.periodsToSeconds(periods) < (60 + latencyEstimate)) {  
                \$(this).css("color", "red");   //Highlight last minute.  
             }  
          }  
       });  
    }  
 });  
   
     /* This code describes the spellcheck options that will be used for      /* This code describes the spellcheck options that will be used for
        items with class 'spellchecked'.  It is necessary for those objects'         items with class 'spellchecked'.  It is necessary for those objects'
Line 1676  sub show_return_link { Line 1735  sub show_return_link {
     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');
       return if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
                  (!$env{'request.role.adv'}));
     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 1690  sub show_return_link { Line 1750  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)($|\?)})                m{^/adm/.*/(smppg|bulletinboard|ext\.tool)($|\?)})
            ));             ));
 }  }
   
Line 1764  A link to help for the component will be Line 1824  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).
   
   =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 1805  returns: nothing Line 1900  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) = @_;              $CourseBreadcrumbs,$topic_help,$topic_help_text,$crstype) = @_;
         #          #
         $css_class ||= 'LC_breadcrumbs';          $css_class ||= 'LC_breadcrumbs';
   
Line 1830  returns: nothing Line 1925  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 1838  returns: nothing Line 1933  returns: nothing
                     }                      }
                 }                  }
             }              }
               my $target = '_top';
               if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
                   $target='';
               }
             $menulink =  {  href   =>'/adm/menu',              $menulink =  {  href   =>'/adm/menu',
                             title  =>'Go to main menu',                              title  =>'Go to main menu',
                             target =>'_top',                              target =>$target,
                             text   =>$description,                              text   =>$description,
                             no_mt  =>$no_mt_descr, };                              no_mt  =>$no_mt_descr, };
             if($last) {              if($last) {
Line 1859  returns: nothing Line 1958  returns: nothing
                             class => 'LC_menubuttons_link',                              class => 'LC_menubuttons_link',
                           };                            };
             if ($env{'request.noversionuri'} eq '/adm/searchcat') {              if ($env{'request.noversionuri'} eq '/adm/searchcat') {
                 $hashref->{'target'} = '_top';                   $hashref->{'target'} = '_top';
                   if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
                       $hashref->{'target'} = '';
                   }
             }              }
             $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 1983  Adds $html to $category of the breadcrum Line 2085  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 1997  remaining items in right of breadcrumbs Line 2101  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 2046  returns: a hash containing the current b Line 2152  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 2073  returns: nothing Line 2188  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 2107  sub docs_breadcrumbs { Line 2231  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;          my $url = $env{'request.use_absolute'};
         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);
Line 3383  function go(url) { Line 3507  function go(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
        currentURL = null;         currentURL = null;
        currentSymb= null;         currentSymb= null;
        window.location.href=url;         var lcHostname = setLCHost();
          window.location.href=lcHostname+url;
    }     }
 }  }
   
Line 3402  ENDUTILITY Line 3527  ENDUTILITY
   
 sub jump_to_editres {  sub jump_to_editres {
     my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$folderpath,      my ($cfile,$home,$switchserver,$forceedit,$forcereg,$symb,$folderpath,
         $title,$idx,$suppurl,$todocs,$suppanchor) = @_;          $title,$hostname,$idx,$suppurl,$todocs,$suppanchor) = @_;
     my ($jscall,$anchor);      my ($jscall,$anchor,$usehttp,$usehttps,$is_ext);
     if ($switchserver) {      if ($switchserver) {
         if ($home) {          if ($home) {
             $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.              $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.
Line 3423  sub jump_to_editres { Line 3548  sub jump_to_editres {
         }          }
     } 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;
                 $anchor = $2;                  my $extlink = $2;
                   $anchor = $3;
                   $is_ext = 1;
                   if (($extlink !~ /^https:/) && ($ENV{'SERVER_PORT'} == 443)) {
                       $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://}) {
                               $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 3451  sub jump_to_editres { Line 3600  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;
                   }
                   unless ($is_ext) {
                       $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 3477  sub jump_to_editres { Line 3638  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 accetps a form field as argumnent, and  # Returns a javascript function which accepts a form field as argument, 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) {  function validmail(field,suffix) {
     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 3595  sub scripttag { Line 3759  sub scripttag {
   
 Constructs a XHTML list from \@array.  Constructs a XHTML list from \@array.
   
 input:   =over
   
   =item input: 
   
 =over  =over
   
Line 3609  Attributes for <ul> and <li> passed in a Line 3775  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 3728  should be included in this list. Line 3896  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 3761  sub start_funclist { Line 3935  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 3787  sub add_item_funclist { Line 3969  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 3823  A string that's used as visually highlig Line 4008  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 3836  sub funclist_from_array { Line 4021  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 3858  e.g. a file operation in Authoring Space Line 4043  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.10  
changed lines
  Added in v.1.393


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