Diff for /rat/lonwrapper.pm between versions 1.49.2.11 and 1.70

version 1.49.2.11, 2021/12/15 00:41:48 version 1.70, 2020/01/14 14:26:39
Line 37  use Apache::lonlocal; Line 37  use Apache::lonlocal;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonextresedit();  use Apache::lonextresedit();
   use Apache::lonexttool();
   use Apache::lonhomework();
   use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities();
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub wrapper {  sub wrapper {
     my ($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$title) = @_;      my ($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation,
           $title,$width,$height) = @_;
   
     my $forcereg;      my $forcereg;
     unless ($env{'form.folderpath'}) {      unless ($env{'form.folderpath'}) {
         $forcereg = 1;          $forcereg = 1;
     }      }
   
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           'noif' => 'No iframe support.',                                            'noif' => 'No iframe support.',
                                           'show' => 'Show content in pop-up window',                                            'show' => 'Show content in pop-up window',
                                         );                                          );
   
     (undef,undef,undef,undef,undef,undef,my $clientmobile) =      my ($anchor,$uselink);
         &Apache::loncommon::decode_user_agent($r);  
   
     my ($anchor,$uselink,$linktext);  
     if ($is_ext) {      if ($is_ext) {
         if ($env{'form.symb'}) {          if ($env{'form.symb'}) {
             (undef,undef,my $res) = &Apache::lonnet::decode_symb($env{'form.symb'});              (undef,undef,my $res) = &Apache::lonnet::decode_symb($env{'form.symb'});
Line 65  sub wrapper { Line 66  sub wrapper {
         } elsif ($env{'form.anchor'} ne '') {          } elsif ($env{'form.anchor'} ne '') {
             $anchor = '#'.$env{'form.anchor'};              $anchor = '#'.$env{'form.anchor'};
         }          }
         unless (($is_pdf) && ($clientmobile)) {          unless (($is_pdf) && ($env{'browser.mobile'})) {
             my $hostname = $r->hostname();              my $hostname = $r->hostname();
             my $lonhost = $r->dir_config('lonHostID');              my $lonhost = $r->dir_config('lonHostID');
             my $ip = &Apache::lonnet::get_host_ip($lonhost);              my $ip = &Apache::lonnet::get_host_ip($lonhost);
Line 88  sub wrapper { Line 89  sub wrapper {
         $args->{'only_body'} = $env{'form.only_body'};          $args->{'only_body'} = $env{'form.only_body'};
     }      }
   
     my $headjs;      my ($countdown,$donemsg);
       if (($exttool) && (&Apache::lonnet::EXT('resource.0.gradable') =~ /^yes$/i)) {
 #          $Apache::lonhomework::browse = &Apache::lonnet::allowed('bre',$url);
 # Where iframe is in use, if window.onload() executes before the custom resize function          if ($env{'form.markaccess'}) {
 # has been defined (jQuery), two global javascript vars (LCnotready and LCresizedef)              my $symb=&Apache::lonnet::symbread($url);
 # are used to ensure document.ready() triggers a call to resize, so the iframe contents              my @interval=&Apache::lonnet::EXT('resource.0.interval',$symb);
 # do not obscure the Functions menu.              my ($timelimit) = split(/_/,$interval[0]);
 #              my $setres = &Apache::lonnet::set_first_access($interval[1],$timelimit);
               if ($setres eq 'ok') {
     unless ($clientmobile || $uselink) {                  delete($env{'form.markaccess'});
         $headjs = '              }
           } elsif ($env{'form.LC_interval_done'} eq 'true') {
               my $symb=&Apache::lonnet::symbread($url);
               if ($symb) {
                   (my $donebuttonresult,$donemsg) = &Apache::lonhomework::zero_timer($symb);
                   undef($env{'form.LC_interval_done'});
                   undef($env{'form.LC_interval_done_proctorpass'});
               }
           }
           my ($status,$result,$resource_due) =
               &Apache::lonexttool::gradabletool_access_check();
           undef($Apache::lonhomework::browse);
           if ($status eq 'CAN_ANSWER') {
               if ($resource_due) {
                   my $time_left = $resource_due - time();
                   if ($resource_due && ($time_left > 0)) {
                       $countdown ='
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA['."\n".
 var LCnotready = 0;                               &Apache::lonhtmlcommon::countdown().'
 var LCresizedef = 0;  
 // ]]>  // ]]>
 </script>'."\n";  </script>'."\n".
                       &Apache::lonhtmlcommon::set_due_date($resource_due);
                   }
               }
           } else {
               if ($status eq 'SHOW_ANSWER') {
                   $result = &Apache::lonexttool::display_score().
                             &Apache::lonfeedback::list_discussion('tool','OPEN');
               }
               return &Apache::loncommon::start_page('Menu',undef,$args).
                      $result.
                      &Apache::loncommon::end_page();
           }
     }      }
   
     my $startpage = &Apache::loncommon::start_page('Menu',$headjs,$args);      my $startpage = &Apache::loncommon::start_page('Menu',undef,$args).$countdown.$donemsg;
     my $endpage = &Apache::loncommon::end_page();      my $endpage = &Apache::loncommon::end_page();
   
     if (($uselink) && ($title eq '')) {      if (($uselink) && ($title eq '')) {
Line 120  var LCresizedef = 0; Line 148  var LCresizedef = 0;
             }              }
         }          }
     }      }
     if ($clientmobile) {      if (($env{'browser.mobile'}) || ($exttool eq 'window') || ($exttool eq 'tab')) {
         my $output = $startpage;          my $output = $startpage;
         if ($is_pdf) {          if ($is_pdf) {
             $linktext = &mt('Link to PDF (for mobile devices)');              $linktext = &mt('Link to PDF (for mobile devices)');
             $output .= &create_link($url,$anchor,$title,$linktext);              $output .= &create_link($url,$anchor,$title,$linktext);
           } elsif (($exttool eq 'window') || ($exttool eq 'tab')) {
               if ($linktext eq '') {
                   $linktext = &mt('Launch External Tool');
               }
               $url = &HTML::Entities::encode($url,'"<>&');
               if ($exttool eq 'tab') {
                   $output .= '<div>'.
                              '<a href="'.$url.'" target="LCExternalToolTab" style="padding:0;clear:both;margin:0;border:0">'.
                              $linktext.'</a>'.
                              '</div>';
               } else {
                   $output .= <<"ENDLINK";
   <script type="text/javascript">
   // <![CDATA[
   var windowObjectReference = null;
   var PreviousUrl;
   
   function openSinglePopup(strUrl) {
       if (windowObjectReference == null || windowObjectReference.closed) {
           windowObjectReference = window.open(strUrl, "LCExternalToolPopUp",
                                               "height=$height,width=$width,scrollbars=yes,resizable=yes,status=yes,menubar=no,location=no'");
       } else if(PreviousUrl != strUrl) {
           windowObjectReference = window.open(strUrl, "LCExternalToolPopUp",
                                               "height=$height,width=$width,scrollbars=yes,resizable=yes,status=yes,menubar=no,location=no'");
           windowObjectReference.focus();
       } else {
           windowObjectReference.focus();
       };
       PreviousUrl = strUrl;
   }
   // ]]>
   </script>
   <div>
   <a href="$url" target="LCExternalToolPopUp" onclick="openSinglePopup(this.href); return false;">
   $linktext</a>
   </div>
   ENDLINK
               }
               if ($explanation ne '') {
                   $output .= '<div>'.$explanation.'</div>';
               }
               if (&Apache::lonnet::EXT('resource.0.gradable')) {
                   $output .= &Apache::lonfeedback::list_discussion('tool','OPEN');
               }
         } else {          } else {
             if ($uselink) {              if ($uselink) {
                 $linktext = &mt('Link to resource');                  $linktext = &mt('Link to resource');
Line 171  var LCresizedef = 0; Line 243  var LCresizedef = 0;
                 var pos = height + hdrtop + offset;                  var pos = height + hdrtop + offset;
                 \$('.LC_iframecontainer').css('top', pos);                  \$('.LC_iframecontainer').css('top', pos);
             });              });
             LCresizedef = 1;  
             if (LCnotready == 1) {  
                 LCnotready = 0;  
                 \$(window).trigger('resize');  
             }  
         });          });
         window.onload = function(){          window.onload = function(){  \$(window).trigger('resize') };
             if (LCresizedef) {  
                 LCnotready = 0;  
                 \$(window).trigger('resize');  
             } else {  
                 LCnotready = 1;  
             }  
         };  
 SCRIPT  SCRIPT
         # javascript will position the iframe if window was resized (or zoomed)          # javascript will position the iframe if window was resized (or zoomed)
           my $dest = &HTML::Entities::encode($url.$anchor,'&<>"');
         return <<ENDFRAME;          return <<ENDFRAME;
         $startpage          $startpage
         $script          $script
         <div class="LC_iframecontainer">          <div class="LC_iframecontainer">
             <iframe src="$url$anchor">$lt{'noif'} $noiframe</iframe>              <iframe src="$dest">$lt{'noif'} $noiframe</iframe>
         </div>          </div>
         $endpage          $endpage
 ENDFRAME  ENDFRAME
Line 226  sub handler { Line 287  sub handler {
     return OK if $r->header_only;      return OK if $r->header_only;
   
     my $url = $r->uri;      my $url = $r->uri;
     my ($is_ext,$brcrum,$absolute,$is_pdf,$cdom,$cnum,$hostname);      my ($is_ext,$brcrum,$absolute,$is_pdf,$exttool,$cdom,$cnum,$hostname,
           $linktext,$explanation,$width,$height);
   
     for ($url){      for ($url){
         s|^/adm/wrapper||;          s|^/adm/wrapper||;
         $is_ext = $_ =~ s|^/ext/|http://|;          $is_ext = $_ =~ s|^/ext/|http://|;         
         s|http://https://|https://| if ($is_ext);          s|http://https://|https://|;
         s|&colon;|:|g;          s|&colon;|:|g;
     }      }
   
     if ($url =~ /\.pdf$/i) {      if ($url =~ /\.pdf$/i) {
         $is_pdf = 1;          $is_pdf = 1;
       } elsif ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
           $cdom = $1;
           $cnum = $2;
           my $marker = $3;
           $exttool = 'iframe';
           my $exttoolremote;
           my %toolhash = &Apache::lonnet::get('exttool_'.$marker,['target','linktext','explanation','id','width','height'],
                                               $cdom,$cnum);
           if ($toolhash{'id'}) {
               my %ltitools = &Apache::lonnet::get_domain_lti($cdom,'consumer');
               if (ref($ltitools{$toolhash{'id'}}) eq 'HASH') {
                   $exttoolremote = $ltitools{$toolhash{'id'}}{'url'};
               }
           }
           if ($toolhash{'target'} eq 'window') {
               $exttool = 'window';
               $width = $toolhash{'width'};
               $height = $toolhash{'height'};
           } elsif ($toolhash{'target'} eq 'tab') {
               $exttool = 'tab';
           }
           if (($exttool eq 'window') || ($exttool eq 'tab')) {
               $linktext = $toolhash{'linktext'};
               $explanation = $toolhash{'explanation'};
           } elsif (($exttoolremote =~ /^http:/) && ($ENV{'SERVER_PORT'} == 443)) {
               $exttool = 'tab';
           }
     }      }
        if (($is_ext) || ($exttool)) {
     if ($is_ext) {  
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
             ['forceedit','register','folderpath','symb','idx','title','anchor']);              ['forceedit','register','folderpath','symb','idx','title','anchor']);
         if (($env{'form.forceedit'}) &&          if (($env{'form.forceedit'}) &&
Line 256  sub handler { Line 344  sub handler {
                     $url .= '#'.$env{'form.anchor'};                      $url .= '#'.$env{'form.anchor'};
                 }                  }
             }              }
             if (($url =~ /^http:/) && ($ENV{'SERVER_PORT'} == 443)) {              my $type = 'ext';
               if ($exttool) {
                   $type = 'tool';
               } elsif (($url =~ /^http:/) && ($ENV{'SERVER_PORT'} == 443)) {
                 $hostname = $r->hostname();                  $hostname = $r->hostname();
             }              }
             my $type = 'ext';  
             $r->print(              $r->print(
                 &Apache::lonextresedit::display_editor($url,$env{'form.folderpath'},                  &Apache::lonextresedit::display_editor($url,$env{'form.folderpath'},
                                                        $env{'form.symb'},                                                         $env{'form.symb'},
Line 270  sub handler { Line 360  sub handler {
             my $crstype = &Apache::loncommon::course_type();              my $crstype = &Apache::loncommon::course_type();
             my $title = $env{'form.title'};              my $title = $env{'form.title'};
             if ($title eq '') {              if ($title eq '') {
                 $title = &mt('External Resource');                  if ($is_ext) {
                       $title = &mt('External Resource');
                   } else {
                       $title = &mt('External Tool');
                   }
             }              }
             $brcrum =              $brcrum =
                 &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);                  &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
Line 280  sub handler { Line 374  sub handler {
 #  #
 # Actual URL  # Actual URL
 #  #
     if ($url=~/$LONCAPA::assess_re/) {      if (($url=~/$LONCAPA::assess_re/) && (!$exttool)) {
 #  #
 # This is uploaded homework  # This is uploaded homework
 #  #
Line 290  sub handler { Line 384  sub handler {
 #  #
 # This is not homework  # This is not homework
 #  #
         if ($is_ext) {          if (($is_ext) || ($exttool)) {
             $absolute = $env{'request.use_absolute'};              $absolute = $env{'request.use_absolute'};
             $ENV{'QUERY_STRING'} =~ s/(^|\&)symb=[^\&]*/$1/;              $ENV{'QUERY_STRING'} =~ s/(^|\&)symb=[^\&]*/$1/;
             $ENV{'QUERY_STRING'} =~ s/\&$//;              $ENV{'QUERY_STRING'} =~ s/\&$//;
Line 301  sub handler { Line 395  sub handler {
         }          }
   
         # encrypt url if not external          # encrypt url if not external
         &Apache::lonenc::check_encrypt(\$url) if $url !~ /^https?\:/ ;          unless ($is_ext) {
               &Apache::lonenc::check_encrypt(\$url);
           }
   
         $r->print( wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf) );          $r->print( wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,
                              $linktext,$explanation,undef,$width,$height) );
   
     } # not just the menu      } # not just the menu
           
Line 330  described at http://www.lon-capa.org. Line 427  described at http://www.lon-capa.org.
   
 =over  =over
   
 =item wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$title))  =item wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$linktext,$explanation,$title,$width,$height)
   
 =over  =over
   
Line 378  true if URL is for a PDF (based on file Line 475  true if URL is for a PDF (based on file
   
 =item $title  =item $title
   
 optional. If wrapped item is a PDF, and $clientmobile is true,  optional. If wrapped item is a PDF, and $env{'browser.mobile'} 
 a link to a PDF is shown. The "title" will be displayed  is true, a link to a PDF is shown. The "title" will be displayed
 above the link, but if not provided as an arg, $env{'form.title'}  above the link, but if not provided as an arg, $env{'form.title'}
 will be used, otherwise, the filename will be displayed (unless  will be used, otherwise, the filename will be displayed (unless
 hidden URL set for the resource).  hidden URL set for the resource).

Removed from v.1.49.2.11  
changed lines
  Added in v.1.70


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