Diff for /rat/lonwrapper.pm between versions 1.49.2.10 and 1.50

version 1.49.2.10, 2020/03/05 22:05:50 version 1.50, 2016/01/26 14:30:40
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 LONCAPA qw(:DEFAULT :match);;
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub wrapper {  sub wrapper {
     my ($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$title) = @_;      my ($url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$title) = @_;
   
     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',
                                         );                                          );
   
     my ($anchor,$uselink,$linktext);      my $noiframe = &Apache::loncommon::modal_link($url,$lt{'show'},500,400);
     if ($is_ext) {  
         if ($env{'form.symb'}) {  
             (undef,undef,my $res) = &Apache::lonnet::decode_symb($env{'form.symb'});  
             if ($res =~ /(#[^#]+)$/) {  
                 $anchor = $1;  
             }  
         } elsif ($env{'form.anchor'} ne '') {  
             $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 $args = {'bgcolor' => '#FFFFFF'};      my $args = {'bgcolor' => '#FFFFFF'};
     if ($forcereg) {      if ($forcereg) {
         $args->{'force_register'} = $forcereg;          $args->{'force_register'} = $forcereg;
Line 79  sub wrapper { Line 62  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 $headjs;  
   
 #  
 # Where iframe is in use, if window.onload() executes before the custom resize function  
 # has been defined (jQuery), two global javascript vars (LCnotready and LCresizedef)  
 # are used to ensure document.ready() triggers a call to resize, so the iframe contents  
 # do not obscure the Functions menu.  
 #  
   
     unless (($env{'browser.mobile'}) || $uselink) {      my $startpage = &Apache::loncommon::start_page('Menu',undef,$args);
         $headjs = '  
 <script type="text/javascript">  
 // <![CDATA[  
 var LCnotready = 0;  
 var LCresizedef = 0;  
 // ]]>  
 </script>'."\n";  
     }  
   
     my $startpage = &Apache::loncommon::start_page('Menu',$headjs,$args);  
     my $endpage = &Apache::loncommon::end_page();      my $endpage = &Apache::loncommon::end_page();
       
     if (($uselink) && ($title eq '')) {      if (($env{'browser.mobile'}) || ($exttool eq 'window')) {
         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'}) {  
         my $output = $startpage;          my $output = $startpage;
         if ($is_pdf) {          if ($is_pdf) {
             $linktext = &mt('Link to PDF (for mobile devices)');              if ($title eq '') {
             $output .= &create_link($url,$anchor,$title,$linktext);                  $title = $env{'form.title'};
         } else {                  if ($title eq '') {
             if ($uselink) {                      unless ($env{'request.enc'}) {
                 $linktext = &mt('Link to resource');                          ($title) = ($url =~ m{/([^/]+)$});
                 $output .= &create_link($url,$anchor,$title,$linktext);                          $title =~ s/(\?[^\?]+)$//;
             } else {                      }
                 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";  
             }              }
               unless ($title eq '') {
                   $output .= $title.'<br />';
               }
               $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 {
               $output .= '<div style="overflow:scroll; -webkit-overflow-scrolling:touch;">'."\n".
                          '<iframe src="'.$url.'" 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;
                 var offset = $offset;                  var offset = 5;
                 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 161  var LCresizedef = 0; Line 114  var LCresizedef = 0;
                         header = \$('#LC_breadcrumbs');                          header = \$('#LC_breadcrumbs');
                     }                      }
                 }                  }
                 if (header != null && header.length) {                  if (header.length) {
                     height = header.height();                      height = header.height();
                     hdrtop = header.position().top;                      hdrtop = header.position().top;
                 }                  }
                 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)
         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="$url">$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 223  sub handler { Line 144  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);
   
     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+)/exttools?$}) {
           $cdom = $1;
           $cnum = $2;
           my $marker = $3;
           $exttool = 'iframe';
           my %toolhash = &Apache::lonnet::get('exttool_'.$marker,['target'],$cdom,$cnum);
           if ($toolhash{'target'} eq 'window') {
              $exttool = 'window'; 
           }
     }      }
        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']);
         if (($env{'form.forceedit'}) &&          if (($env{'form.forceedit'}) &&
             (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&              (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&
             (($env{'form.folderpath'} =~ /^supplemental/) ||              (($env{'form.folderpath'} =~ /^supplemental/) ||
              ($env{'form.symb'} =~ /^uploaded/))) {               ($env{'form.symb'} =~ /^uploaded/))) {
             if ($env{'form.symb'}) {  
                 (undef,undef,my $res) = &Apache::lonnet::decode_symb($env{'form.symb'});  
                 if ($res =~ /(#[^#]+)$/) {  
                     $url .= $1;  
                 }  
             } elsif ($env{'form.folderpath'} =~ /^supplemental/) {  
                 if ($env{'form.anchor'} ne '') {  
                     $url .= '#'.$env{'form.anchor'};  
                 }  
             }  
             if (($url =~ /^http:/) && ($ENV{'SERVER_PORT'} == 443)) {  
                 $hostname = $r->hostname();  
             }  
             my $type = 'ext';              my $type = 'ext';
               my %ltitools;
               if ($exttool) {
                   $type = 'tool';
                   %ltitools = &Apache::lonnet::get_domain_ltitools($cdom);
               }
             $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,$hostname));                                                         $cnum,\%ltitools));
             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();
             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 287  sub handler { Line 213  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 298  sub handler { Line 224  sub handler {
         }          }
   
         # encrypt url if not external          # encrypt url if not external
         &Apache::lonenc::check_encrypt(\$url) if $url !~ /^https?\:/ ;          unless ($is_ext || $exttool) {
               &Apache::lonenc::check_encrypt(\$url);
           }
   
         $r->print( wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf) );          $r->print( wrapper($url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool) );
   
     } # not just the menu      } # not just the menu
           
Line 327  described at http://www.lon-capa.org. Line 255  described at http://www.lon-capa.org.
   
 =over  =over
   
 =item wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$title))  =item wrapper($url,$brcrum,$absolute,$is_ext,$is_pdf,$title))
   
 =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.49.2.10  
changed lines
  Added in v.1.50


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