Diff for /loncom/interface/lonextresedit.pm between versions 1.35 and 1.37

version 1.35, 2025/02/03 22:52:36 version 1.37, 2025/06/14 02:50:25
Line 309  sub update_exttool { Line 309  sub update_exttool {
     my ($marker,$cdom,$cnum,$supplementalflag,$args) = @_;      my ($marker,$cdom,$cnum,$supplementalflag,$args) = @_;
     my (%newhash,$changed,$newgradable,@deleted,$errormsg);      my (%newhash,$changed,$newgradable,@deleted,$errormsg);
     ($newhash{'target'},$newhash{'width'},$newhash{'height'},$newhash{'linktext'},$newhash{'explanation'},      ($newhash{'target'},$newhash{'width'},$newhash{'height'},$newhash{'linktext'},$newhash{'explanation'},
      $newhash{'crslabel'},$newhash{'crstitle'},$newhash{'crsappend'},$newhash{'gradable'}) = split(/:/,$args);       $newhash{'crslabel'},$newhash{'crstitle'},$newhash{'crsappend'},$newhash{'gradable'},
     foreach my $item ('linktext','explanation','crslabel','crstitle','crsappend') {       $newhash{'returnurl'},$newhash{'backtourl'},$newhash{'desturl'},$newhash{'delay'}) = split(/:/,$args);
       foreach my $item ('linktext','explanation','crslabel','crstitle','crsappend','backtourl','desturl','delay') {
         $newhash{$item} = &unescape($newhash{$item});          $newhash{$item} = &unescape($newhash{$item});
     }      }
     my %toolhash=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum);      my %toolhash=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum);
     foreach my $item ('target','width','height','linktext','explanation','crslabel','crstitle','crsappend','gradable') {      my ($tooltype,$tool,$ltihash);
       if ($toolhash{'id'} =~/^c(\d+)$/) {
           $tool = $1;
           $tooltype = 'crs';
       } elsif ($toolhash{'id'} =~/^\d+$/) {
           $tooltype = 'dom';
           $tool = $toolhash{'id'};
       }
       if (($tool ne '') && ($tooltype ne '')) {
           my %tools;
           my %tooltypes = &Apache::loncommon::usable_exttools();
           if ($tooltypes{$tooltype}) {
               if ($tooltype eq 'dom') {
                   %tools = &Apache::lonnet::get_domain_lti($cdom,'consumer');
               } elsif ($tooltypes{'crs'}) {
                   %tools = &Apache::lonnet::get_course_lti($cnum,$cdom,'consumer');
               }
               $ltihash = $tools{$tool};
           }
       }
       foreach my $item ('target','width','height','linktext','explanation','crslabel','crstitle','crsappend','gradable','returnurl','backtourl','desturl','delay') {
         $newhash{$item} =~ s/^\s+//;          $newhash{$item} =~ s/^\s+//;
         $newhash{$item} =~ s/\s+$//;          $newhash{$item} =~ s/\s+$//;
         if (($item eq 'width') || ($item eq 'height') || ($item eq 'linktext') || ($item eq 'explanation')) {          if (($item eq 'width') || ($item eq 'height') || ($item eq 'linktext') || ($item eq 'explanation')) {
Line 329  sub update_exttool { Line 350  sub update_exttool {
             unless ($newhash{$item} == 1) {              unless ($newhash{$item} == 1) {
                 $newhash{$item} = '';                  $newhash{$item} = '';
             }              }
           } elsif ($item eq 'backtourl') {
               unless ($newhash{'returnurl'} eq 'custom') {
                   $newhash{$item} = '';
               }
           } elsif ($item eq 'desturl') {
               my $nocrsdest = 1;
               if ((ref($ltihash) eq 'HASH') && (ref($ltihash->{'crsconf'}) eq 'HASH') &&
                   ($ltihash->{'crsconf'}->{'desturl'})) {
                   undef($nocrsdest);
               }
               if ($nocrsdest) {
                   $newhash{$item} = '';
               }
           } elsif ($item eq 'delay') {
               if ($newhash{'desturl'} eq '') {
                   $newhash{$item} = '';
       }
               unless ($newhash{$item} =~ /^(\d+\.?\d*)$/) {
                   $newhash{$item} = '';
               }
         }          }
         if ($toolhash{$item} ne $newhash{$item}) {          if ($toolhash{$item} ne $newhash{$item}) {
             if (($item eq 'gradable') && (!$supplementalflag)) {              if (($item eq 'gradable') && (!$supplementalflag)) {
Line 352  sub update_exttool { Line 393  sub update_exttool {
                 }                  }
             } else {              } else {
                 $toolhash{$item} = $newhash{$item};                  $toolhash{$item} = $newhash{$item};
                 $changed = 1;                   $changed = 1;
             }              }
         }          }
     }      }
Line 395  sub extedit_form { Line 436  sub extedit_form {
         $tabid = 'ee';          $tabid = 'ee';
     }      }
     my ($formname,$formid,$toggle,$fieldsetid,$urlid,$subdivid,$dispdivstyle,$dimendivstyle,      my ($formname,$formid,$toggle,$fieldsetid,$urlid,$subdivid,$dispdivstyle,$dimendivstyle,
         $windivstyle,$linktextstyle,$explanationstyle,$labelstyle,$titlestyle,          $windivstyle,$linktextstyle,$explanationstyle,$labelstyle,$titlestyle,$providerstyle,
         $appendstyle,$gradablestyle,$subdivstyle,$legend,$urlelem,$toolelem,%toolattr);          $appendstyle,$gradablestyle,$returnurlstyle,$subdivstyle,$desturlstyle,
    $desturlinfostyle,$desturlfixedstyle,$legend,$urlelem,$toolelem,%toolattr);
     $formname = 'new'.$type;      $formname = 'new'.$type;
     $toggle = $type;      $toggle = $type;
     $fieldsetid = 'external'.$type.'form';      $fieldsetid = 'external'.$type.'form';
     $urlid = $type.'url';      $urlid = $type.'url';
     map { $toolattr{$_} = $type.$_; } ('dispdiv','dimendiv','dimenwidth','dimenheight',      map { $toolattr{$_} = $type.$_; } ('dispdiv','dimendiv','dimenwidth','dimenheight',
                                        'crstitlediv','crslabeldiv','crsappenddiv',                                         'crstitlediv','crslabeldiv','crsappenddiv',
                                        'gradablediv','crstitle','crslabel','crsappend',                                         'gradablediv','returnurldiv','crstitle','crslabel',
                                        'windiv','linktextdiv','explanationdiv',                                         'crsappend','windiv','linktextdiv','explanationdiv',
                                        'linktext','explanation','providerurl');                                         'linktext','explanation','provider','providerpath','customreturnurl',
                                          'desturl','delay','providerdiv','desturldiv','desturlinfodiv',
                                          'desturlfixeddiv','fixeddest','fixeddelay');
     $dispdivstyle = 'display:none';      $dispdivstyle = 'display:none';
     $dimendivstyle = 'display:none';      $dimendivstyle = 'display:none';
     $windivstyle = 'display:none';      $windivstyle = 'display:none';
Line 413  sub extedit_form { Line 457  sub extedit_form {
     $explanationstyle = 'display:none';      $explanationstyle = 'display:none';
     $labelstyle = 'display:none';      $labelstyle = 'display:none';
     $titlestyle = 'display:none';      $titlestyle = 'display:none';
       $providerstyle = 'display:none';
     $appendstyle = 'display:none';      $appendstyle = 'display:none';
     $gradablestyle = 'display:none';      $gradablestyle = 'display:none';
       $returnurlstyle = 'display:none';
       $desturlstyle = 'display:none';
       $desturlinfostyle = 'display:none';
       $desturlfixedstyle = 'display:none';
     $subdivstyle = 'display:block';      $subdivstyle = 'display:block';
     if ($supplementalflag) {      if ($supplementalflag) {
         $formname = 'newsupp'.$type;          $formname = 'newsupp'.$type;
Line 425  sub extedit_form { Line 474  sub extedit_form {
     }      }
     my ($link,$legend,$active,$srcclass,$extsrc,$preview,$title,$save,$crstitle,$crslabel,      my ($link,$legend,$active,$srcclass,$extsrc,$preview,$title,$save,$crstitle,$crslabel,
         $crsappend,$fieldsetstyle,$action,$hiddenelem,$form,$width,$height,$tooltarget,          $crsappend,$fieldsetstyle,$action,$hiddenelem,$form,$width,$height,$tooltarget,
         $linktext,$explanation,$providerurl,$chkgrd,$chknogrd,%chkstate);          $linktext,$explanation,$path,$returnurl,$chkgrd,$chknogrd,%chkstate,
           $chknoreturn,$chkreturndef,$chkreturncust,$customreturn,$backtourl,$desturl,$delay,
    $chknodest,$chkdest);
     $fieldsetstyle = 'display: none;';      $fieldsetstyle = 'display: none;';
     $action = '/adm/coursedocs';      $action = '/adm/coursedocs';
     my $protocol = ($ENV{'SERVER_PORT'} == 443?'https':'http');      my $protocol = ($ENV{'SERVER_PORT'} == 443?'https':'http');
Line 499  sub extedit_form { Line 550  sub extedit_form {
         $urlelem = '<input type="text" size="'.$size.'" name="exturl" id="'.$urlid.'" value="'.$orig_url.'"'.$disabled.' />';          $urlelem = '<input type="text" size="'.$size.'" name="exturl" id="'.$urlid.'" value="'.$orig_url.'"'.$disabled.' />';
     } else {      } else {
         my $class = 'LC_nobreak';          my $class = 'LC_nobreak';
           my ($nocrsdest,$fixeddest,$fixeddelay,$showprovider,$provider,$scheme);
         if ($residx) {          if ($residx) {
             $class = 'LC_docs_ext_edit LC_nobreak';               $class = 'LC_docs_ext_edit LC_nobreak'; 
             if ($orig_url =~ m{^/adm/$cdom/$cnum/(\d+)/ext\.tool$}) {              if ($orig_url =~ m{^/adm/$cdom/$cnum/(\d+)/ext\.tool$}) {
Line 508  sub extedit_form { Line 560  sub extedit_form {
                 if ($toolhash{'id'} =~/^c(\d+)$/) {                  if ($toolhash{'id'} =~/^c(\d+)$/) {
                     $tool = $1;                      $tool = $1;
                     $tooltype = 'crs';                      $tooltype = 'crs';
                     if (ref($ltitools) eq 'HASH') {  
                         if (ref($ltitools->{'crs'}) eq 'HASH') {  
                             $ltihash = $ltitools->{'crs'}->{$tool};  
                         }  
                     }  
                 } elsif ($toolhash{'id'} =~/^\d+$/) {                  } elsif ($toolhash{'id'} =~/^\d+$/) {
                     $tooltype = 'dom';                      $tooltype = 'dom';
                     $tool = $toolhash{'id'};                      $tool = $toolhash{'id'};
                     if (ref($ltitools) eq 'HASH') {                  }
                         if (ref($ltitools->{'dom'}) eq 'HASH') {                  if (($tool ne '') && ($tooltype ne '') && (ref($ltitools) eq 'HASH')) {
                             $ltihash = $ltitools->{'dom'}->{$tool};                      if (ref($ltitools->{$tooltype}) eq 'HASH') {
                         }                          $ltihash = $ltitools->{$tooltype}->{$tool};
                     }                      }
                 }                  }
                 if (($tool ne '') && (ref($ltihash) eq 'HASH')) {                  if (($tool ne '') && (ref($ltihash) eq 'HASH')) {
Line 529  sub extedit_form { Line 576  sub extedit_form {
                     if ($icon) {                      if ($icon) {
                         $image = '<img src="'.$icon.'" alt="'.$tooltitle.'" />';                          $image = '<img src="'.$icon.'" alt="'.$tooltitle.'" />';
                     }                      }
                     if ($ltihash->{'url'} =~ m{://}) {                      if ($ltihash->{'url'} =~ m{^https?\://}) {
                         (my $prot,my $host,$providerurl) = ($ltihash->{'url'} =~ m{^([^/]+)://([^/]+)(|/.+)$});                          ($scheme,$provider,$path) = ($ltihash->{'url'} =~ m{^(https?\://)([^/]+)(|/.+)$});
                     } else {                      } else {
                         $providerurl = $ltihash->{'url'};                          $path = $ltihash->{'url'};
                     }                      }
                     $tooltarget = $toolhash{'target'};                      $tooltarget = $toolhash{'target'};
                     if ($tooltarget eq 'window') {                      if ($tooltarget eq 'window') {
Line 566  sub extedit_form { Line 613  sub extedit_form {
                         if ($ltihash->{'crsconf'}->{'append'}) {                          if ($ltihash->{'crsconf'}->{'append'}) {
                             $crsappend = $toolhash{'crsappend'};                              $crsappend = $toolhash{'crsappend'};
                             $appendstyle = 'display:inline';                              $appendstyle = 'display:inline';
                               $showprovider = 1;
                         }                          }
                         if ($ltihash->{'crsconf'}->{'target'}) {                          if ($ltihash->{'crsconf'}->{'target'}) {
                             $dispdivstyle = 'display:block';                              $dispdivstyle = 'display:block';
Line 576  sub extedit_form { Line 624  sub extedit_form {
                         if ($ltihash->{'crsconf'}->{'explanation'}) {                          if ($ltihash->{'crsconf'}->{'explanation'}) {
                             $explanationstyle = 'padding:0;display:inline';                              $explanationstyle = 'padding:0;display:inline';
                         }                          }
                           if ($ltihash->{'crsconf'}->{'returnurl'}) {
                               $returnurl = $toolhash{'returnurl'};
                               $returnurlstyle = 'display:inline';
                               $backtourl = $toolhash{'backtourl'};
                               if ($returnurl eq 'none') {
                                   $chknoreturn = ' checked="checked"';
                                   $customreturn = 'hidden';
                               } elsif (($returnurl eq 'custom') && ($backtourl ne '')) {
                                   $chkreturncust = ' checked="checked"';
                                   $customreturn = 'text';
                               } else {
                                   $chkreturndef = ' checked="checked"';
                                   $customreturn = 'hidden';
                               }
                           }
                           if ($ltihash->{'crsconf'}->{'desturl'}) {
                               $desturl = $toolhash{'desturl'};
       $desturlstyle = 'display:inline';
                               $delay = $toolhash{'delay'}; 
                               $showprovider = 1;
       if ($desturl ne '') {
                                   $desturlinfostyle = 'display:inline';
                                   $chkdest = ' checked="checked"';
    $chknodest = ''; 
       } else {
    $desturlinfostyle = 'display:none';
           $chkdest = ''; 
                                   $chknodest = ' checked="checked"';
       } 
    } else {
                               $nocrsdest = 1;
                           }
                     }                      }
                     $toolelem = '<span class="LC_nobreak">'.$image.'&nbsp;'.$tooltitle.'</span><br />';                      $toolelem = '<span class="LC_nobreak">'.$image.'&nbsp;'.$tooltitle.'</span><br />';
                     $gradablestyle = 'display:inline';                      $gradablestyle = 'display:inline';
                       if (($ltihash->{'desturl'}) && ($nocrsdest) && ($ltihash->{'defdest'} =~ m{^(https?\://|/)})) {
                           $fixeddest = $ltihash->{'defdest'};
                           if ($ltihash->{'defdelay'} =~ /^\d+\.?\d*$/) {
                               $fixeddelay = $ltihash->{'defdelay'};
                           }
                           $desturlfixedstyle = 'display:inline-block';
                           $showprovider = 1;
                       }
                       if (($showprovider) && ($provider ne '')) {
                           $providerstyle = 'display:inline-block';
                       }
                 }                  }
             }              }
         } else {          } else {
Line 658  sub extedit_form { Line 749  sub extedit_form {
             $crslabel = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'};              $crslabel = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'};
             $crstitle = $env{'course.'.$cdom.'_'.$cnum.'.description'};              $crstitle = $env{'course.'.$cdom.'_'.$cnum.'.description'};
             $crsappend = '';              $crsappend = '';
               $returnurl = '';
               $backtourl = '';
               $customreturn = 'hidden';
             $chknogrd = ' checked="checked"';              $chknogrd = ' checked="checked"';
         }              $chknoreturn = '';
         $toolelem .= '<div id="'.$toolattr{'dispdiv'}.'" style="'.$dispdivstyle.'">'.              $chkreturndef = ' checked="checked"';
               $chkreturncust = '';
       $chknodest = ' checked="checked"';
       $chkdest = '';
           }
           my $onclickreturl = ' onclick="updateReturnUrl('."this.form,'$toolattr{'customreturnurl'}','$toolattr{'returnurldiv'}','exttoolreturnurl'".');"';
           my $onclickdest = ' onclick="updateDestUrl('."this.form,'$toolattr{'desturlinfodiv'}','$toolattr{'desturldiv'}','exttooldest'".');"';
           $toolelem.= '<div id="'.$toolattr{'providerdiv'}.'" style="'.$providerstyle.'">'.
                       '<span class="'.$class.'">'.&mt('Provider').':&nbsp;<span id="'.$toolattr{'provider'}.'">'.$scheme.$provider.'</span><br />'.
                       '<span class="'.$class.'">'.&mt('Provider path').':&nbsp;<span id="'.$toolattr{'providerpath'}.'">'.$path.'</span>'."\n".
                       '</div>'."\n".
                       '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
                       '<div id="'.$toolattr{'crsappenddiv'}.'" style="'.$appendstyle.'">'.
                       '<span class="'.$class.'">'.&mt('Append to LTI login URL').':</span><br />'.
                       '<input type="text" id="'.$toolattr{'crsappend'}.'" size="30" name="exttoolappend" value="'.$crsappend.'"'.$disabled.' /></span>'.
                       '</div>'."\n".
                       '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
                       '<div id="'.$toolattr{'desturldiv'}.'" style="'.$desturlstyle.'">'.
                       '<span class="'.$class.'">'.&mt('Post-login destination different from path').':&nbsp;'.
                       '<label><input type="radio" name="exttooldest" value="0"'.$chknodest.$disabled.$onclickdest.' />'.
                       &mt('No').'</label>'.('&nbsp;'x2).
                       '<label><input type="radio" name="exttooldest" value="1"'.$chkdest.$disabled.$onclickdest.' />'.
                       &mt('Yes').'</label>'.('&nbsp;'x2).
                       '</span><br />'."\n".
                       '<div id="'.$toolattr{'desturlinfodiv'}.'" style="'.$desturlinfostyle.'">'.
                       '<span class="'.$class.'">'.
                       '<input type="text" size="'.$size.'" name="exttooldesturl" value="'.$desturl.'"'.$disabled.' /></label></span><br />'.
                       '<span class="'.$class.'"><label>'.&mt('Delay between login and redirect').
                       ':<input type="text" size="3" name="exttooldelay" value="'.$delay.'"'.$disabled.' />&nbsp;s'.
                       '</label></span></div></div>'."\n".
                       '<div id="'.$toolattr{'desturlfixeddiv'}.'" style="'.$desturlfixedstyle.'">'.
                       '<span class="'.$class.'">'.&mt('Destination after provider login').':&nbsp;'.
                       '<br /><span id="'.$toolattr{'fixeddest'}.'">'.$fixeddest.'</span></span>'.
                       '<br /><span class="'.$class.'">'.
                       &mt('Post-login delay before redirect to destination').':&nbsp;<span id="'.$toolattr{'fixeddelay'}.'">'.$fixeddelay.'</span>&nbsp;s</span>'."\n".
                       '<br /></div>'.
                       '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
                       '<div id="'.$toolattr{'dispdiv'}.'" style="'.$dispdivstyle.'">'.
                     '<span class="'.$class.'">'.&mt('Display target:').'&nbsp;'.                      '<span class="'.$class.'">'.&mt('Display target:').'&nbsp;'.
                     '<label><input type="radio" name="exttooltarget" value="iframe" '.$chkstate{'iframe'}.'onclick="updateTooldim(this.form,'.                      '<label><input type="radio" name="exttooltarget" value="iframe" '.$chkstate{'iframe'}.'onclick="updateTooldim(this.form,'.
                     "'$toolattr{dimendiv}','$toolattr{windiv}','$toolattr{dimenwidth}','$toolattr{dimenheight}',                      "'$toolattr{dimendiv}','$toolattr{windiv}','$toolattr{dimenwidth}','$toolattr{dimenheight}',
Line 674  sub extedit_form { Line 805  sub extedit_form {
                     '<div id="'.$toolattr{'dimendiv'}.'" style="'.$dimendivstyle.'"><span class="'.$class.'">'.                      '<div id="'.$toolattr{'dimendiv'}.'" style="'.$dimendivstyle.'"><span class="'.$class.'">'.
                     &mt('Width').':&nbsp;<input type="text" size="4" id="'.$toolattr{'dimenwidth'}.'" name="exttoolwidth" value="'.$width.'"'.$disabled.' />'.('&nbsp;'x2).                      &mt('Width').':&nbsp;<input type="text" size="4" id="'.$toolattr{'dimenwidth'}.'" name="exttoolwidth" value="'.$width.'"'.$disabled.' />'.('&nbsp;'x2).
                     &mt('Height').':&nbsp;<input type="text" size="4" id="'.$toolattr{'dimenheight'}.'" name="exttoolheight" value="'.$height.'"'.$disabled.' /></span>'."\n".                      &mt('Height').':&nbsp;<input type="text" size="4" id="'.$toolattr{'dimenheight'}.'" name="exttoolheight" value="'.$height.'"'.$disabled.' /></span>'."\n".
                     '</div></div>';                      '</div></div>'.
         $toolelem .= '<div id="'.$toolattr{'windiv'}.'" style="'.$windivstyle.'">'.                      '<div id="'.$toolattr{'windiv'}.'" style="'.$windivstyle.'">'.
                      '<div id="'.$toolattr{'linktextdiv'}.'" class="LC_left_float" style="'.$linktextstyle.'">'.                      '<div id="'.$toolattr{'linktextdiv'}.'" class="LC_left_float" style="'.$linktextstyle.'">'.
                      '<span class="'.$class.'">'.&mt('Link Text').'</span><br /><input type="text" size="25" id="'.$toolattr{'linktext'}.                      '<span class="'.$class.'">'.&mt('Link Text').'</span><br /><input type="text" size="25" id="'.$toolattr{'linktext'}.
                      '" name="exttoollinktext" value="'.$linktext.'"'.$disabled.' />'.                      '" name="exttoollinktext" value="'.$linktext.'"'.$disabled.' />'.
                      '</div><div id="'.$toolattr{'explanationdiv'}.'" class="LC_left_float" style="'.$explanationstyle.'">'.                      '</div><div id="'.$toolattr{'explanationdiv'}.'" class="LC_left_float" style="'.$explanationstyle.'">'.
                      '<span class="'.$class.'">'.&mt('Explanation').'</span><br />'.                      '<span class="'.$class.'">'.&mt('Explanation').'</span><br />'.
                      '<textarea rows="'.$rows.'" cols="'.$cols.'" id="'.$toolattr{'explanation'}.'" name="exttoolexplanation" '.$disabled.'>'.                      '<textarea rows="'.$rows.'" cols="'.$cols.'" id="'.$toolattr{'explanation'}.'" name="exttoolexplanation" '.$disabled.'>'.
                      $explanation.'</textarea></div><div style="padding:0;clear:both;margin:0;border:0"></div>'.                      $explanation.'</textarea></div><div style="padding:0;clear:both;margin:0;border:0"></div>'.
                      '</div>';                      '</div>'.
         $toolelem .= '<div id="'.$toolattr{'crslabeldiv'}.'" style="'.$labelstyle.'">'.                      '<div id="'.$toolattr{'crslabeldiv'}.'" style="'.$labelstyle.'">'.
                     '<span class="'.$class.'">'.&mt('Course label:').'&nbsp;'.                      '<span class="'.$class.'">'.&mt('Course label:').'&nbsp;'.
                     '<input type="text" id="'.$toolattr{'crslabel'}.'" name="exttoollabel" value="'.$crslabel.'"'.$disabled.' /></span><br />'.                      '<input type="text" id="'.$toolattr{'crslabel'}.'" name="exttoollabel" value="'.$crslabel.'"'.$disabled.' /></span><br />'.
                     '</div>'.                      '</div>'."\n".
                     '<div id="'.$toolattr{'crstitlediv'}.'" style="'.$titlestyle.'">'.                      '<div id="'.$toolattr{'crstitlediv'}.'" style="'.$titlestyle.'">'.
                     '<span class="'.$class.'">'.&mt('Course title:').'&nbsp;'.                      '<span class="'.$class.'">'.&mt('Course title:').'&nbsp;'.
                     '<input type="text" id="'.$toolattr{'crstitle'}.'" name="exttooltitle" value="'.$crstitle.'"'.$disabled.' /></span><br />'.                      '<input type="text" id="'.$toolattr{'crstitle'}.'" name="exttooltitle" value="'.$crstitle.'"'.$disabled.' /></span><br />'.
                     '</div>'.                      '</div>'."\n".
                     '<div id="'.$toolattr{'crsappenddiv'}.'" style="'.$appendstyle.'">'.  
                     '<span class="'.$class.'">'.&mt('Append to URL[_1]',  
                     '<span id="'.$toolattr{'providerurl'}.'">&nbsp;('.$providerurl.')<br /></span>').  
                     '<input type="text" id="'.$toolattr{'crsappend'}.'" size="30" name="exttoolappend" value="'.$crsappend.'"'.$disabled.' /></span><br />'.  
                     '</div>'.  
                     '<div id="'.$toolattr{'gradablediv'}.'" style="'.$gradablestyle.'">'.                      '<div id="'.$toolattr{'gradablediv'}.'" style="'.$gradablestyle.'">'.
                     '<span class="'.$class.'">'.&mt('Gradable').'&nbsp;'.                      '<span class="'.$class.'">'.&mt('Gradable').'&nbsp;'.
                     '<label><input type="radio" name="exttoolgradable" value="1"'.$chkgrd.$disabled.                      '<label><input type="radio" name="exttoolgradable" value="1"'.$chkgrd.$disabled.
                     ' />'.&mt('Yes').'</label>'.('&nbsp;'x2).                      ' />'.&mt('Yes').'</label>'.('&nbsp;'x2).
                     '<label><input type="radio" name="exttoolgradable" value="0"'.$chknogrd.$disabled.                      '<label><input type="radio" name="exttoolgradable" value="0"'.$chknogrd.$disabled.
                     ' />'.&mt('No').'</label></span></div>';                      ' />'.&mt('No').'</label></span><br /></div>'."\n".
                       '<div id="'.$toolattr{'returnurldiv'}.'" style="'.$returnurlstyle.'">'.
                       '<span class="'.$class.'">'.&mt('Include return URL').':&nbsp;'.
                       '<label><input type="radio" name="exttoolreturnurl" value="none"'.$chknoreturn.$disabled.$onclickreturl.' />'.
                       &mt('No').'</label>'.('&nbsp;'x2).
                       '<label><input type="radio" name="exttoolreturnurl" value="default"'.$chkreturndef.$disabled.$onclickreturl.' />'.
                       &mt('Yes, default URL').'</label>'.('&nbsp;'x2).
                       '<label><input type="radio" name="exttoolreturnurl" value="custom"'.$chkreturncust.$disabled.$onclickreturl.' />'.
                       &mt('Yes, specify URL').'</label></span><br />'."\n".
                       '<input type="'.$customreturn.'" id="'.$toolattr{'customreturnurl'}.'" size="35" name="exttoolbacktourl" value="'.$backtourl.'"'.$disabled.' />'.
                       '</div>'."\n";
     }      }
     my $chooser = $toolelem;      my $chooser = $toolelem;
     if ($type eq 'ext') {      if ($type eq 'ext') {
Line 831  sub extedit_javascript { Line 967  sub extedit_javascript {
     my ($toolsjs,$exttoolnums,$exttooloptions);      my ($toolsjs,$exttoolnums,$exttooloptions);
     if (ref($toolsref) eq 'HASH') {      if (ref($toolsref) eq 'HASH') {
         $toolsjs = "        var ltitools = new Array();\n".          $toolsjs = "        var ltitools = new Array();\n".
                    "        var ltitoolsUrl = new Array();\n".             "        var ltitoolsProvider = new Array();\n".
                      "        var ltitoolsPath = new Array();\n".
                    "        var ltitoolsTarget = new Array();\n".                     "        var ltitoolsTarget = new Array();\n".
                    "        var ltitoolsWidth = new Array();\n".                     "        var ltitoolsWidth = new Array();\n".
                    "        var ltitoolsHeight = new Array();\n".                     "        var ltitoolsHeight = new Array();\n".
Line 842  sub extedit_javascript { Line 979  sub extedit_javascript {
                    "        var ltitoolsExplain = new Array();\n".                     "        var ltitoolsExplain = new Array();\n".
                    "        var ltitoolsLabel = new Array();\n".                     "        var ltitoolsLabel = new Array();\n".
                    "        var ltitoolsTitle = new Array();\n".                     "        var ltitoolsTitle = new Array();\n".
                    "        var ltitoolsAppend = new Array();\n";                     "        var ltitoolsAppend = new Array();\n".
                      "        var ltitoolsReturnUrl = new Array();\n".
                      "        var ltitoolsDestUrl = new Array();\n".
                      "        var ltitoolsDefDest = new Array();\n".
                      "        var ltitoolsDefDelay = new Array();\n";
         $exttoolnums = "        var ltitoolsnum = new Array();\n".          $exttoolnums = "        var ltitoolsnum = new Array();\n".
                        "        var tooloptval = new Array();\n".                         "        var tooloptval = new Array();\n".
                        "        var toolopttxt = new Array();\n";                         "        var toolopttxt = new Array();\n";
Line 851  sub extedit_javascript { Line 992  sub extedit_javascript {
             if (ref($toolsref->{$type}) eq 'HASH') {              if (ref($toolsref->{$type}) eq 'HASH') {
                 my $num = scalar(keys(%{$toolsref->{$type}}));                  my $num = scalar(keys(%{$toolsref->{$type}}));
                 $toolsjs .= "        ltitools[$idx] = new Array($num);\n".                  $toolsjs .= "        ltitools[$idx] = new Array($num);\n".
                             "        ltitoolsUrl[$idx] = new Array($num);\n".                              "        ltitoolsProvider[$idx] = new Array($num);\n".
                               "        ltitoolsPath[$idx] = new Array($num);\n".
                             "        ltitoolsTarget[$idx] = new Array($num);\n".                              "        ltitoolsTarget[$idx] = new Array($num);\n".
                             "        ltitoolsWidth[$idx] = new Array($num);\n".                              "        ltitoolsWidth[$idx] = new Array($num);\n".
                             "        ltitoolsHeight[$idx] = new Array($num);\n".                              "        ltitoolsHeight[$idx] = new Array($num);\n".
Line 862  sub extedit_javascript { Line 1004  sub extedit_javascript {
                             "        ltitoolsExplain[$idx] = new Array($num);\n".                              "        ltitoolsExplain[$idx] = new Array($num);\n".
                             "        ltitoolsLabel[$idx] = new Array($num);\n".                              "        ltitoolsLabel[$idx] = new Array($num);\n".
                             "        ltitoolsTitle[$idx] = new Array($num);\n".                              "        ltitoolsTitle[$idx] = new Array($num);\n".
                             "        ltitoolsAppend[$idx] = new Array($num);\n";                              "        ltitoolsAppend[$idx] = new Array($num);\n".
                               "        ltitoolsReturnUrl[$idx] = new Array($num);\n".
                               "        ltitoolsDestUrl[$idx] = new Array($num);\n".
                               "        ltitoolsDefDest[$idx] = new Array($num);\n".
                               "        ltitoolsDefDelay[$idx] = new Array($num);\n";
                 my $i=0;                  my $i=0;
                 foreach my $key (sort { $a <=> $b } keys(%{$toolsref->{$type}})) {                  foreach my $key (sort { $a <=> $b } keys(%{$toolsref->{$type}})) {
                     if (ref($toolsref->{$type}->{$key}) eq 'HASH') {                      if (ref($toolsref->{$type}->{$key}) eq 'HASH') {
Line 872  sub extedit_javascript { Line 1018  sub extedit_javascript {
                             my $height = $toolsref->{$type}->{$key}->{'display'}->{'height'};                              my $height = $toolsref->{$type}->{$key}->{'display'}->{'height'};
                             my $linkdef = $toolsref->{$type}->{$key}->{'display'}->{'linktext'};                              my $linkdef = $toolsref->{$type}->{$key}->{'display'}->{'linktext'};
                             my $explaindef = $toolsref->{$type}->{$key}->{'display'}->{'explanation'};                              my $explaindef = $toolsref->{$type}->{$key}->{'display'}->{'explanation'};
                             my $providerurl;                              my ($scheme,$provider,$path);
                             if ($toolsref->{$type}->{$key}->{'url'} =~ m{://}) {                              if ($toolsref->{$type}->{$key}->{'url'} =~ m{^https?\://}) {
                                 (my $prot,my $host,$providerurl) =                                  ($scheme,$provider,$path) =
                                     ($toolsref->{$type}->{$key}->{'url'} =~ m{^([^/]+)://([^/]+)(|/.+)$});                                      ($toolsref->{$type}->{$key}->{'url'} =~ m{^(https?\://)([^/]+)(|/.+)$});
                             } else {                              } else {
                                 $providerurl = $toolsref->{$type}->{$key}->{'url'};                                  $path = $toolsref->{$type}->{$key}->{'url'};
                             }                              }
                             $providerurl = &LONCAPA::map::qtunescape($providerurl);                              $scheme = &LONCAPA::map::qtunescape($scheme);
                               $provider = &LONCAPA::map::qtunescape($provider);
                               $path = &LONCAPA::map::qtunescape($path);
                             $toolsjs .= "        ltitools[$idx][$i] = '$key';\n".                              $toolsjs .= "        ltitools[$idx][$i] = '$key';\n".
                                         "        ltitoolsTarget[$idx][$i] = '$target';\n".                                          "        ltitoolsTarget[$idx][$i] = '$target';\n".
                                         "        ltitoolsWidth[$idx][$i] = '$width';\n".                                          "        ltitoolsWidth[$idx][$i] = '$width';\n".
                                         "        ltitoolsHeight[$idx][$i] = '$height';\n".                                          "        ltitoolsHeight[$idx][$i] = '$height';\n".
                                         "        ltitoolsLinkDef[$idx][$i] = '$linkdef';\n".                                          "        ltitoolsLinkDef[$idx][$i] = '$linkdef';\n".
                                         "        ltitoolsExplainDef[$idx][$i] = '$explaindef';\n".                                          "        ltitoolsExplainDef[$idx][$i] = '$explaindef';\n".
                                         "        ltitoolsUrl[$idx][$i] = '$providerurl';\n";                                          "        ltitoolsProvider[$idx][$i] = '$scheme$provider';\n".
                                           "        ltitoolsPath[$idx][$i] = '$path';\n";
                         }                          }
                         if (ref($toolsref->{$type}->{$key}->{'crsconf'}) eq 'HASH') {                          if (ref($toolsref->{$type}->{$key}->{'crsconf'}) eq 'HASH') {
                             my $display = $toolsref->{$type}->{$key}->{'crsconf'}->{'target'};                              my $display = $toolsref->{$type}->{$key}->{'crsconf'}->{'target'};
Line 901  sub extedit_javascript { Line 1050  sub extedit_javascript {
                             $toolsjs .= "         ltitoolsTitle[$idx][$i] = '$title';\n";                              $toolsjs .= "         ltitoolsTitle[$idx][$i] = '$title';\n";
                             my $append = $toolsref->{$type}->{$key}->{'crsconf'}->{'append'};                              my $append = $toolsref->{$type}->{$key}->{'crsconf'}->{'append'};
                             $toolsjs .= "         ltitoolsAppend[$idx][$i] = '$append';\n";                              $toolsjs .= "         ltitoolsAppend[$idx][$i] = '$append';\n";
                               my $returnurl = $toolsref->{$type}->{$key}->{'crsconf'}->{'returnurl'};
                               $toolsjs .= "         ltitoolsReturnUrl[$idx][$i] = '$returnurl';\n";
                               my $desturl = $toolsref->{$type}->{$key}->{'crsconf'}->{'desturl'};
                               $toolsjs .= "         ltitoolsDestUrl[$idx][$i] = '$desturl';\n";
                         }                          }
                           my $defdest = $toolsref->{$type}->{$key}->{'defdest'};
                           $toolsjs .= "         ltitoolsDefDest[$idx][$i] = '$defdest';\n";
                           my $defdelay = $toolsref->{$type}->{$key}->{'defdelay'};
                           $toolsjs .= "         ltitoolsDefDelay[$idx][$i] = '$defdelay';\n";
                     }                      }
                     $i++;                      $i++;
                 }                  }
Line 1058  function setExternal(extform,residx,type Line 1215  function setExternal(extform,residx,type
         var labelinput = prefix+'toolcrslabel';          var labelinput = prefix+'toolcrslabel';
         var titleinput = prefix+'toolcrstitle';          var titleinput = prefix+'toolcrstitle';
         var appendinput = prefix+'toolcrsappend';          var appendinput = prefix+'toolcrsappend';
           var customreturnurl = prefix+'customreturnurl';
         if (residx > 0) {          if (residx > 0) {
             labelinput += '_'+residx;              labelinput += '_'+residx;
             titleinput += '_'+residx;              titleinput += '_'+residx;
             appendinput += '_'+residx;              appendinput += '_'+residx;
               customreturnurl += '_'+residx;
         }          }
         if (document.getElementById(labelinput)) {          if (document.getElementById(labelinput)) {
             var crslabel = document.getElementById(labelinput).value;              var crslabel = document.getElementById(labelinput).value;
Line 1110  function setExternal(extform,residx,type Line 1269  function setExternal(extform,residx,type
         } else {          } else {
             info += ':';              info += ':';
         }          }
           var returnurldiv = prefix+'toolreturnurldiv';
           if (residx > 0) {
               returnurldiv += '_'+residx;
           }
           if (document.getElementById(returnurldiv)) {
               if (document.getElementById(returnurldiv).style.display == 'inline') {
                   if (extform.exttoolreturnurl.length) {
                       for (var i=0; i<extform.exttoolreturnurl.length; i++) {
                           if (extform.exttoolreturnurl[i].checked) {
                               if (extform.exttoolreturnurl[i].value == 'custom') {
                                   var backtourl = extform.exttoolbacktourl.value;
                                   backtourl.trim();
                                   info += ':custom:'+escape(backtourl);
                               } else if (extform.exttoolreturnurl[i].value == 'default') {
                                   info += ':default:';
                               } else {
                                   info += ':none:';
                               }
                           }
                       }
                   }
               } else {
                   info += '::';
               }
           } else {
               info += '::';
           }
           var desturldiv = prefix+'tooldesturldiv';
           if (residx > 0) {
               desturldiv += '_'+residx;
           }
           if (document.getElementById(desturldiv)) {
               if (document.getElementById(desturldiv).style.display == 'inline') {
                   if (extform.exttooldest.length) {
                       for (var i=0; i<extform.exttooldest.length; i++) {
                           if (extform.exttooldest[i].checked) {
                               if (extform.exttooldest[i].value == '1') {
                                   var dest = extform.exttooldesturl.value;
                                   dest.trim();
                                   var delay = extform.exttooldelay.value;
                                   info += ':'+escape(dest)+':'+escape(delay);
                               } else {
                                   info += '::';
                               }
                           }
                       }
                   }
               } else {
                   info += '::';
               }
           } else {
               info += '::';
           }
         info=escape(info);          info=escape(info);
         if (residx > 0) {          if (residx > 0) {
             eval("extform.importdetail.value=title+'='+info+'='+residx;extform.submit();");              eval("extform.importdetail.value=title+'='+info+'='+residx;extform.submit();");
Line 1292  function updateExttool(caller,form,suppl Line 1504  function updateExttool(caller,form,suppl
     titlediv = prefix+'toolcrstitlediv';      titlediv = prefix+'toolcrstitlediv';
     appenddiv = prefix+'toolcrsappenddiv';      appenddiv = prefix+'toolcrsappenddiv';
     gradablediv = prefix+'toolgradablediv';      gradablediv = prefix+'toolgradablediv';
     providerurl = prefix+'toolproviderurl';      returnurldiv = prefix+'toolreturnurldiv';
       provider = prefix+'toolprovider';
       providerpath = prefix+'toolproviderpath';
       providerdiv = prefix+'toolproviderdiv';
       desturldiv = prefix+'tooldesturldiv';
       desturlfixeddiv = prefix+'tooldesturlfixeddiv';
       fixeddest = prefix+'toolfixeddest';
       fixeddelay = prefix+'toolfixeddelay';
     labelinput = prefix+'toolcrslabel';      labelinput = prefix+'toolcrslabel';
     titleinput = prefix+'toolcrstitle';      titleinput = prefix+'toolcrstitle';
     appendinput = prefix+'toolcrsappend';      appendinput = prefix+'toolcrsappend';
Line 1305  function updateExttool(caller,form,suppl Line 1524  function updateExttool(caller,form,suppl
         var toolpick = caller.options[caller.selectedIndex].value;          var toolpick = caller.options[caller.selectedIndex].value;
         $toolsjs          $toolsjs
         if (toolpick == '') {          if (toolpick == '') {
               if (document.getElementById(providerdiv)) {
                   document.getElementById(providerdiv).style.display = 'none';
               }
               if (document.getElementById(desturldiv)) {
                   document.getElementById(desturldiv).style.display = 'none';
               }
               if (document.getElementById(desturlfixeddiv)) {
                   document.getElementById(desturlfixeddiv).style.display = 'none';
               }
               if (document.getElementById(fixeddest)) {
                   document.getElementById(fixeddest).innerHTML = '';
               }
               if (document.getElementById(fixeddelay)) {
                   document.getElementById(fixeddelay).innerHTML = '';
               }
             if (document.getElementById(dispdiv)) {              if (document.getElementById(dispdiv)) {
                 document.getElementById(dispdiv).style.display = 'none';                      document.getElementById(dispdiv).style.display = 'none';    
             }              }
Line 1332  function updateExttool(caller,form,suppl Line 1566  function updateExttool(caller,form,suppl
             if (document.getElementById(gradablediv)) {              if (document.getElementById(gradablediv)) {
                 document.getElementById(gradablediv).style.display = 'none';                  document.getElementById(gradablediv).style.display = 'none';
             }              }
               if (document.getElementById(returnurldiv)) {
                   document.getElementById(returnurldiv).style.display = 'none';
               }
         } else {          } else {
             var tooltype = '';              var tooltype = '';
             var typeelem = form.elements[prefix+'exttooltype'];              var typeelem = form.elements[prefix+'exttooltype'];
Line 1350  function updateExttool(caller,form,suppl Line 1587  function updateExttool(caller,form,suppl
                 if (ltitools[i].length > 0) {                  if (ltitools[i].length > 0) {
                     for (var j=0; j<ltitools[i].length; j++) {                      for (var j=0; j<ltitools[i].length; j++) {
                         if (ltitools[i][j] == toolpick) {                          if (ltitools[i][j] == toolpick) {
                               if (document.getElementById(providerdiv)) {
                                   if ((ltitoolsDestUrl[i][j]) || (ltitoolsAppend[i][j]) || (ltitoolsDefDest[i][j])) {
                                       document.getElementById(providerdiv).style.display = 'inline';
                                       if (document.getElementById(provider)) {
                                           if ((ltitoolsProvider[i][j] != '') && (ltitoolsProvider[i][j] != null)) {
                                               document.getElementById(provider).innerHTML = ltitoolsProvider[i][j];
                                           }
                                       }
                                       if (document.getElementById(providerpath)) {
                                           if ((ltitoolsPath[i][j] != '') && (ltitoolsPath[i][j] != null)) {
                                               document.getElementById(providerpath).innerHTML = ltitoolsPath[i][j];
                                           }
                                       }
                                   } else {
                                       document.getElementById(providerdiv).style.display = 'none';
                                       if (document.getElementById(provider)) {
                                           document.getElementById(provider).innerHTML = '';
                                       }
                                       if (document.getElementById(providerpath)) {
                                           document.getElementById(providerpath).innerHTML = '';
                                       }
                                   }
                               }
                               if (document.getElementById(appenddiv)) {
                                   if (ltitoolsAppend[i][j]) {
                                       document.getElementById(appenddiv).style.display = 'inline';
                                   } else {
                                       document.getElementById(appenddiv).style.display = 'none';
                                   }
                               }
                               if (document.getElementById(desturldiv)) {
                                   if (ltitoolsDestUrl[i][j]) {
                                       document.getElementById(desturldiv).style.display = 'inline';
                                   } else {
                                       document.getElementById(desturldiv).style.display = 'none';
                                   }
                               }
                               if (document.getElementById(desturlfixeddiv)) {
                                   if ((!ltitoolsDestUrl[i][j]) && (ltitoolsDefDest[i][j])) {
                                       document.getElementById(desturlfixeddiv).style.display = 'inline';
                                   } else {
                                       document.getElementById(desturlfixeddiv).style.display = 'none';
                                   }
                               }
                               if (document.getElementById(fixeddest)) {
                                   document.getElementById(fixeddest).innerHTML = ltitoolsDefDest[i][j];
                               }
                               if (document.getElementById(fixeddelay)) {
                                   document.getElementById(fixeddelay).innerHTML = ltitoolsDefDelay[i][j];
                               }
                             if (document.getElementById(dispdiv)) {                              if (document.getElementById(dispdiv)) {
                                 if (ltitoolsDisplay[i][j]) {                                  if (ltitoolsDisplay[i][j]) {
                                     document.getElementById(dispdiv).style.display = 'block';                                      document.getElementById(dispdiv).style.display = 'block';
Line 1429  function updateExttool(caller,form,suppl Line 1716  function updateExttool(caller,form,suppl
                                     document.getElementById(titlediv).style.display = 'none';                                      document.getElementById(titlediv).style.display = 'none';
                                 }                                  }
                             }                              }
                             if (document.getElementById(appenddiv)) {  
                                 if (ltitoolsAppend[i][j]) {  
                                     document.getElementById(appenddiv).style.display = 'inline';  
                                     if (document.getElementById(providerurl)) {  
                                         if ((ltitoolsUrl[i][j] != '') && (ltitoolsUrl[i][j] != null)) {  
                                             document.getElementById(providerurl).innerHTML = '&nbsp;('+ltitoolsUrl[i][j]+')<br />';  
                                         }  
                                     }  
                                 } else {  
                                     document.getElementById(appenddiv).style.display = 'none';  
                                     if (document.getElementById(providerurl)) {  
                                         document.getElementById(providerurl).innerHTML = '';  
                                     }  
                                 }  
                             }  
                             if (document.getElementById(gradablediv)) {                              if (document.getElementById(gradablediv)) {
                                 if (supplementalflag != 1) {                                  if (supplementalflag != 1) {
                                     document.getElementById(gradablediv).style.display = 'inline';                                      document.getElementById(gradablediv).style.display = 'inline';
                                 }                                  }
                             }                              }
                               if (document.getElementById(returnurldiv)) {
                                   if (ltitoolsReturnUrl[i][j]) {
                                       document.getElementById(returnurldiv).style.display = 'inline';
                                   } else {
                                       document.getElementById(returnurldiv).style.display = 'none';
                                   }
                               }
                             break;                              break;
                         }                          }
                     }                      }
Line 1458  function updateExttool(caller,form,suppl Line 1737  function updateExttool(caller,form,suppl
     }      }
 }  }
   
   function updateReturnUrl(form,typeid,divid,radioname) {
       if ((document.getElementById(typeid)) &&
          (document.getElementById(divid))) {
           if (document.getElementById(divid).style.display == 'inline') {
               var radelem = form.elements[radioname];
               var inputtype = 'hidden';
               if (radelem.length) {
                   for (var i=0; i<radelem.length; i++) {
                       if (radelem[i].checked) {
                           if (radelem[i].value == 'custom') {
                               inputtype = 'text';
                           } else {
                               inputtype = 'hidden';
                           }
                           break;
                       }
                   }
               }
               document.getElementById(typeid).type = inputtype;
           }
       }
       return;
   }
   
 function updateTooldim(form,dimendiv,windiv,widthinput,heightinput,linkinput,explaininput) {  function updateTooldim(form,dimendiv,windiv,widthinput,heightinput,linkinput,explaininput) {
     if (form.exttooltarget.length) {      if (form.exttooltarget.length) {
         for (var i=0; i<form.exttooltarget.length; i++) {          for (var i=0; i<form.exttooltarget.length; i++) {
Line 1497  function updateTooldim(form,dimendiv,win Line 1800  function updateTooldim(form,dimendiv,win
     }      }
 }  }
   
   function updateDestUrl(form,detailid,divid,radioname) {
       if ((document.getElementById(detailid)) &&
          (document.getElementById(divid))) {
           if (document.getElementById(divid).style.display == 'inline') {
               var radelem = form.elements[radioname];
               var detaildisplay = 'none';
               if (radelem.length) {
                   for (var i=0; i<radelem.length; i++) {
                       if (radelem[i].checked) {
                           if (radelem[i].value == '1') {
                               detaildisplay = 'inline';
                           } else {
                               detaildisplay = 'none';
                           }
                           break;
                       }
                   }
               }
               document.getElementById(detailid).style.display = detaildisplay;
           }
       }
       return;
   }
   
 ENDJS  ENDJS
   
 }  }

Removed from v.1.35  
changed lines
  Added in v.1.37


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