Diff for /rat/lonwrapper.pm between versions 1.54 and 1.69

version 1.54, 2016/11/29 19:53:58 version 1.69, 2019/05/02 02:12:31
Line 38  use Apache::loncommon(); Line 38  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonextresedit();  use Apache::lonextresedit();
 use Apache::lonexttool();  use Apache::lonexttool();
 use LONCAPA qw(:DEFAULT :match);;  use Apache::lonhomework();
   use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities();
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub wrapper {  sub wrapper {
     my ($url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$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'}) {
Line 53  sub wrapper { Line 56  sub wrapper {
                                           'show' => 'Show content in pop-up window',                                            'show' => 'Show content in pop-up window',
                                         );                                          );
   
     my $anchor;      my ($anchor,$uselink);
     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 63  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) && ($env{'browser.mobile'})) {
               my $hostname = $r->hostname();
               my $lonhost = $r->dir_config('lonHostID');
               my $ip = &Apache::lonnet::get_host_ip($lonhost);
               $uselink = &Apache::loncommon::is_nonframeable($url,$absolute,$hostname,$ip);
           }
     }      }
   
     my $noiframe = &Apache::loncommon::modal_link($url.$anchor,$lt{'show'},500,400);      my $noiframe = &Apache::loncommon::modal_link($url.$anchor,$lt{'show'},500,400);
Line 74  sub wrapper { Line 83  sub wrapper {
         $args->{'bread_crumbs'} = $brcrum;          $args->{'bread_crumbs'} = $brcrum;
     }      }
     if ($absolute) {      if ($absolute) {
         $args->{'use_absolute'} = $absolute;           $args->{'use_absolute'} = $absolute;
       }
       if ($env{'form.only_body'}) {
           $args->{'only_body'} = $env{'form.only_body'};
       }
   
       my ($countdown,$donemsg);
       if (($exttool) && (&Apache::lonnet::EXT('resource.0.gradable') =~ /^yes$/i)) {
           $Apache::lonhomework::browse = &Apache::lonnet::allowed('bre',$url);
           if ($env{'form.markaccess'}) {
               my $symb=&Apache::lonnet::symbread($url);
               my @interval=&Apache::lonnet::EXT('resource.0.interval',$symb);
               my ($timelimit) = split(/_/,$interval[0]);
               my $setres = &Apache::lonnet::set_first_access($interval[1],$timelimit);
               if ($setres eq 'ok') {
                   delete($env{'form.markaccess'});
               }
           } 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">
   // <![CDATA['."\n".
                                &Apache::lonhtmlcommon::countdown().'
   // ]]>
   </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',undef,$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 (($env{'browser.mobile'}) || ($exttool eq 'window')) {      if (($uselink) && ($title eq '')) {
           if ($env{'form.symb'}) {
               $title=&Apache::lonnet::gettitle($env{'form.symb'});
           } else {
               my $symb=&Apache::lonnet::symbread($r->uri);
               if ($symb) {
                   $title=&Apache::lonnet::gettitle($symb);
               }
           }
       }
       if (($env{'browser.mobile'}) || ($exttool eq 'window') || ($exttool eq 'tab')) {
         my $output = $startpage;          my $output = $startpage;
         if ($is_pdf) {          if ($is_pdf) {
             if ($title eq '') {              $linktext = &mt('Link to PDF (for mobile devices)');
                 $title = $env{'form.title'};              $output .= &create_link($url,$anchor,$title,$linktext);
                 if ($title eq '') {          } elsif (($exttool eq 'window') || ($exttool eq 'tab')) {
                     unless ($env{'request.enc'}) {              if ($linktext eq '') {
                         ($title) = ($url =~ m{/([^/]+)$});                  $linktext = &mt('Launch External Tool');
                         $title =~ s/(\?[^\?]+)$//;              }
                     }              $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
             }              }
             unless ($title eq '') {              if ($explanation ne '') {
                 $output .= $title.'<br />';                  $output .= '<div>'.$explanation.'</div>';
               }
               if (&Apache::lonnet::EXT('resource.0.gradable')) {
                   $output .= &Apache::lonfeedback::list_discussion('tool','OPEN');
             }              }
             $output .= '<a href="'.$url.'">'.&mt('Link to PDF (for mobile devices)').'</a>';  
         } elsif ($exttool eq 'window') {  
             $output .= '<div>'.  
                        '<a href="'.$url.'" target="LC_LTI" style="padding:0;clear:both;margin:0;border:0">'.  
                        &mt('Launch External Tool').'</a>'.  
                        '</div>';  
         } else {          } else {
             $output .= '<div style="overflow:scroll; -webkit-overflow-scrolling:touch;">'."\n".              if ($uselink) {
                        '<iframe src="'.$url.$anchor.'" height="100%" width="100%" frameborder="0">'."\n".                  $linktext = &mt('Link to resource');
                        "$lt{'noif'} $noiframe\n".                  $output .= &create_link($url,$anchor,$title,$linktext);
                        "</iframe>\n".              } else {
                        "</div>\n";                  my $dest = &HTML::Entities::encode($url.$anchor,'&<>"');
                   $output .= '<div style="overflow:scroll; -webkit-overflow-scrolling:touch;">'."\n".
                              '<iframe src="'.$dest.'" height="100%" width="100%" frameborder="0">'."\n".
                              "$lt{'noif'} $noiframe\n".
                              "</iframe>\n".
                              "</div>\n";
               }
         }          }
         $output .= $endpage;          $output .= $endpage;
         return $output;          return $output;
       } elsif ($uselink) {
           $linktext = &mt('Link to resource');
           return $startpage.&create_link($url,$anchor,$title,$linktext).$endpage;
     } else {      } else {
           my $offset = 5;
           &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);
           if ($env{'form.inhibitmenu'} eq 'yes') {
               $offset = 0;
           }
         my $script = &Apache::lonhtmlcommon::scripttag(<<SCRIPT);          my $script = &Apache::lonhtmlcommon::scripttag(<<SCRIPT);
         \$(document).ready( function() {          \$(document).ready( function() {
             \$(window).unbind('resize').resize(function(){              \$(window).unbind('resize').resize(function(){
                 var header = null;                  var header = null;
                 var offset = 5;                  var offset = $offset;
                 var height = 0;                  var height = 0;
                 var hdrtop = 0;                  var hdrtop = 0;
                 if (\$('div.LC_head_subbox:first').length) {                  if (\$('div.LC_head_subbox:first').length) {
Line 137  sub wrapper { Line 247  sub wrapper {
         window.onload = function(){  \$(window).trigger('resize') };          window.onload = function(){  \$(window).trigger('resize') };
 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
     }      }
 }  }
   
   sub create_link {
       my ($url,$anchor,$title,$linktext) = @_;
       my $shownlink;
       if ($title eq '') {
           $title = $env{'form.title'};
           if ($title eq '') {
               unless ($env{'request.enc'}) {
                   ($title) = ($url =~ m{/([^/]+)$});
                   $title =~ s/(\?[^\?]+)$//;
               }
           }
       }
       unless ($title eq '') {
           $shownlink = '<span style="font-weight:bold;">'.$title.'</span><br />';
       }
       my $dest = &HTML::Entities::encode($url.$anchor,'&<>"');
       $shownlink .= '<a href="'.$dest.'">'.$linktext.'</a>';
       return $shownlink;
   }
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
Line 156  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,$exttool,$cdom,$cnum);      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||;
Line 165  sub handler { Line 297  sub handler {
         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+)/exttools?$}) {      } elsif ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
         $cdom = $1;          $cdom = $1;
         $cnum = $2;          $cnum = $2;
         my $marker = $3;          my $marker = $3;
         $exttool = 'iframe';          $exttool = 'iframe';
         my %toolhash = &Apache::lonnet::get('exttool_'.$marker,['target'],$cdom,$cnum);          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') {          if ($toolhash{'target'} eq 'window') {
            $exttool = '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) || ($exttool)) {
Line 196  sub handler { Line 345  sub handler {
                 }                  }
             }              }
             my $type = 'ext';              my $type = 'ext';
             my %ltitools;  
             if ($exttool) {              if ($exttool) {
                 $type = 'tool';                  $type = 'tool';
                 %ltitools = &Apache::lonnet::get_domain_ltitools($cdom);              } elsif (($url =~ /^http:/) && ($ENV{'SERVER_PORT'} == 443)) {
                   $hostname = $r->hostname();
             }              }
             $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'},
                                                        $env{'form.idx'},$type,$cdom,                                                         $env{'form.idx'},$type,$cdom,
                                                        $cnum,\%ltitools));                                                         $cnum,$hostname));
             return OK;              return OK;
         } elsif ($env{'form.folderpath'} =~ /^supplemental/) {          } elsif ($env{'form.folderpath'} =~ /^supplemental/) {
             my $crstype = &Apache::loncommon::course_type();              my $crstype = &Apache::loncommon::course_type();
Line 225  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 246  sub handler { Line 395  sub handler {
         }          }
   
         # encrypt url if not external          # encrypt url if not external
         unless ($is_ext || $exttool) {          unless ($is_ext) {
             &Apache::lonenc::check_encrypt(\$url);              &Apache::lonenc::check_encrypt(\$url);
         }          }
   
         $r->print( wrapper($url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool) );          $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 277  described at http://www.lon-capa.org. Line 427  described at http://www.lon-capa.org.
   
 =over  =over
   
 =item wrapper($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
   
   =item $r
   
   request object
   
 =item $url  =item $url
   
 url to display by including in an iframe within a  url to display by including in an iframe within a

Removed from v.1.54  
changed lines
  Added in v.1.69


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