Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.112 and 1.154

version 1.112, 2005/10/04 19:59:15 version 1.154, 2006/11/09 20:43:07
Line 60  use Time::Local; Line 60  use Time::Local;
 use Time::HiRes;  use Time::HiRes;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 ##############################################  ##############################################
 ##############################################  ##############################################
Line 93  sub authorbombs { Line 95  sub authorbombs {
   
 sub recent_filename {  sub recent_filename {
     my $area=shift;      my $area=shift;
     return 'nohist_recent_'.&Apache::lonnet::escape($area);      return 'nohist_recent_'.&escape($area);
 }  }
   
 sub store_recent {  sub store_recent {
     my ($area,$name,$value)=@_;      my ($area,$name,$value,$freeze)=@_;
     my $file=&recent_filename($area);      my $file=&recent_filename($area);
     my %recent=&Apache::lonnet::dump($file);      my %recent=&Apache::lonnet::dump($file);
     if (scalar(keys(%recent))>20) {      if (scalar(keys(%recent))>20) {
 # remove oldest value  # remove oldest value
  my $oldest=time;   my $oldest=time();
  my $delkey='';   my $delkey='';
  foreach (keys %recent) {   foreach my $item (keys(%recent)) {
     my $thistime=(split(/\&/,$recent{$_}))[0];      my $thistime=(split(/\&/,$recent{$item}))[0];
     if ($thistime<$oldest) {      if (($thistime ne "always_include") && ($thistime<$oldest)) {
  $oldest=$thistime;   $oldest=$thistime;
  $delkey=$_;   $delkey=$item;
     }      }
  }   }
  &Apache::lonnet::del($file,[$delkey]);   &Apache::lonnet::del($file,[$delkey]);
     }      }
 # store new value  # store new value
       my $timestamp;
       if ($freeze) {
           $timestamp = "always_include";
       } else {
           $timestamp = time();
       }   
     &Apache::lonnet::put($file,{ $name =>       &Apache::lonnet::put($file,{ $name => 
  time.'&'.&Apache::lonnet::escape($value) });   $timestamp.'&'.&escape($value) });
 }  }
   
 sub remove_recent {  sub remove_recent {
Line 130  sub select_recent { Line 138  sub select_recent {
     my $return="\n<select name='$fieldname'".      my $return="\n<select name='$fieldname'".
  ($event?" onchange='$event'":'').   ($event?" onchange='$event'":'').
  ">\n<option value=''>--- ".&mt('Recent')." ---</option>";   ">\n<option value=''>--- ".&mt('Recent')." ---</option>";
     foreach (sort keys %recent) {      foreach my $value (sort(keys(%recent))) {
  unless ($_=~/^error\:/) {   unless ($value =~/^error\:/) {
     my $escaped = &Apache::loncommon::escape_url($_);      my $escaped = &Apache::loncommon::escape_url($value);
     $return.="\n<option value='$escaped'>".      $return.="\n<option value='$escaped'>".
  &Apache::lonnet::unescape((split(/\&/,$recent{$_}))[1]).   &unescape((split(/\&/,$recent{$value}))[1]).
  '</option>';   '</option>';
  }   }
     }      }
Line 147  sub get_recent { Line 155  sub get_recent {
     my %recent=&Apache::lonnet::dump(&recent_filename($area));      my %recent=&Apache::lonnet::dump(&recent_filename($area));
   
 # Create hash with key as time and recent as value  # Create hash with key as time and recent as value
   # Begin filling return_hash with any 'always_include' option
     my %time_hash = ();      my %time_hash = ();
     foreach (keys %recent) {      my %return_hash = ();
         my $thistime=(split(/\&/,$recent{$_}))[0];      foreach my $item (keys %recent) {
         $time_hash{$thistime} = $_;          my ($thistime,$thisvalue)=(split(/\&/,$recent{$item}));
           if ($thistime eq 'always_include') {
               $return_hash{$item} = &unescape($thisvalue);
               $n--;
           } else {
               $time_hash{$thistime} = $item;
           }
     }      }
   
 # Sort by decreasing time and return key value pairs  # Sort by decreasing time and return key value pairs
     my %return_hash = ();  
     my $idx = 1;      my $idx = 1;
     foreach (reverse sort keys %time_hash) {      foreach my $item (reverse(sort(keys(%time_hash)))) {
        $return_hash{$time_hash{$_}} =         $return_hash{$time_hash{$item}} =
                   &Apache::lonnet::unescape((split(/\&/,$recent{$_}))[1]);                    &unescape((split(/\&/,$recent{$time_hash{$item}}))[1]);
        if ($n && ($idx++ >= $n)) {last;}         if ($n && ($idx++ >= $n)) {last;}
     }      }
   
     return %return_hash;      return %return_hash;
 }  }
   
   sub get_recent_frozen {
       my ($area) = @_;
       my %recent=&Apache::lonnet::dump(&recent_filename($area));
   
   # Create hash with all 'frozen' items
       my %return_hash = ();
       foreach my $item (keys(%recent)) {
           my ($thistime,$thisvalue)=(split(/\&/,$recent{$item}));
           if ($thistime eq 'always_include') {
               $return_hash{$item} = &unescape($thisvalue);
           }
       }
       return %return_hash;
   }
   
   
   
 =pod  =pod
Line 178  sub get_recent { Line 207  sub get_recent {
 sub textbox {  sub textbox {
     my ($name,$value,$size,$special) = @_;      my ($name,$value,$size,$special) = @_;
     $size = 40 if (! defined($size));      $size = 40 if (! defined($size));
       $value = &HTML::Entities::encode($value,'<>&"');
     my $Str = '<input type="text" name="'.$name.'" size="'.$size.'" '.      my $Str = '<input type="text" name="'.$name.'" size="'.$size.'" '.
         'value="'.$value.'" '.$special.' />';          'value="'.$value.'" '.$special.' />';
     return $Str;      return $Str;
Line 207  sub checkbox { Line 237  sub checkbox {
     return $Str;      return $Str;
 }  }
   
   
   =pod
   
   =item radiobutton
   
   =cut
   
   ##############################################
   ##############################################
   sub radio {
       my ($name,$checked,$value) = @_;
       my $Str = '<input type="radio" name="'.$name.'" ';
       if (defined($value)) {
           $Str .= 'value="'.$value.'"';
       } 
       if ($checked eq $value) {
           $Str .= ' checked="1"';
       }
       $Str .= ' />';
       return $Str;
   }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 258  The method used to restrict user input w Line 310  The method used to restrict user input w
 ##############################################  ##############################################
 sub date_setter {  sub date_setter {
     my ($formname,$dname,$currentvalue,$special,$includeempty,$state,      my ($formname,$dname,$currentvalue,$special,$includeempty,$state,
         $no_hh_mm_ss,$defhour,$defmin,$defsec) = @_;          $no_hh_mm_ss,$defhour,$defmin,$defsec,$nolink) = @_;
     my $wasdefined=1;      my $wasdefined=1;
     if (! defined($state) || $state ne 'disabled') {      if (! defined($state) || $state ne 'disabled') {
         $state = '';          $state = '';
Line 300  sub date_setter { Line 352  sub date_setter {
     }      }
     my $result = "\n<!-- $dname date setting form -->\n";      my $result = "\n<!-- $dname date setting form -->\n";
     $result .= <<ENDJS;      $result .= <<ENDJS;
 <script language="Javascript">  <script type="text/javascript">
     function $dname\_checkday() {      function $dname\_checkday() {
         var day   = document.$formname.$dname\_day.value;          var day   = document.$formname.$dname\_day.value;
         var month = document.$formname.$dname\_month.value;          var month = document.$formname.$dname\_month.value;
Line 363  document.$formname.$dname\_year.value, Line 415  document.$formname.$dname\_year.value,
     }      }
 </script>  </script>
 ENDJS  ENDJS
     $result .= '  <nobr>';      $result .= '  <span style="white-space: nowrap;">';
     my $monthselector = qq{<select name="$dname\_month" $special $state onchange="javascript:$dname\_checkday()" >};      my $monthselector = qq{<select name="$dname\_month" $special $state onchange="javascript:$dname\_checkday()" >};
     # Month      # Month
     my @Months = qw/January February  March     April   May      June       my @Months = qw/January February  March     April   May      June 
Line 406  ENDJS Line 458  ENDJS
     $hourselector .= "  </select>\n";      $hourselector .= "  </select>\n";
     my $minuteselector = qq{<input type="text" name="$dname\_minute" $special $state value="$min" size="3" />};      my $minuteselector = qq{<input type="text" name="$dname\_minute" $special $state value="$min" size="3" />};
     my $secondselector= qq{<input type="text" name="$dname\_second" $special $state value="$sec" size="3" />};      my $secondselector= qq{<input type="text" name="$dname\_second" $special $state value="$sec" size="3" />};
     my $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};      my $cal_link;
       if (!$nolink) {
           $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};
       }
     #      #
     if ($no_hh_mm_ss) {      if ($no_hh_mm_ss) {
         $result .= &mt('[_1] [_2] [_3] [_4]Select Date[_5]',          $result .= &mt('[_1] [_2] [_3] ',
                        $monthselector,$dayselector,$yearselector,                         $monthselector,$dayselector,$yearselector);
                        $cal_link,'</a>');          if (!$nolink) {
               $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');
           }
     } else {      } else {
         $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s [_7]Select Date[_8]',          $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ',
                        $monthselector,$dayselector,$yearselector,                        $monthselector,$dayselector,$yearselector,
                        $hourselector,$minuteselector,$secondselector,                        $hourselector,$minuteselector,$secondselector);
                        $cal_link,'</a>');          if (!$nolink) {
               $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');
           }
     }      }
     $result .= "</nobr>\n<!-- end $dname date setting form -->\n";      $result .= "</span>\n<!-- end $dname date setting form -->\n";
     return $result;      return $result;
 }  }
   
Line 502  sub get_date_from_form { Line 561  sub get_date_from_form {
     if (($year<70) || ($year>137)) { return undef; }      if (($year<70) || ($year>137)) { return undef; }
     if (defined($sec) && defined($min)   && defined($hour) &&      if (defined($sec) && defined($min)   && defined($hour) &&
         defined($day) && defined($month) && defined($year) &&          defined($day) && defined($month) && defined($year) &&
         eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {          eval('&timelocal($sec,$min,$hour,$day,$month,$year)')) {
         return &timelocal($sec,$min,$hour,$day,$month,$year);          return &timelocal($sec,$min,$hour,$day,$month,$year);
     } else {      } else {
         return undef;          return undef;
Line 630  sub StatusOptions { Line 689  sub StatusOptions {
         $status = $env{'form.Status'} if (exists($env{'form.Status'}));          $status = $env{'form.Status'} if (exists($env{'form.Status'}));
     }      }
   
     my $OpSel1 = '';  
     my $OpSel2 = '';  
     my $OpSel3 = '';  
   
     if($status eq 'Any')         { $OpSel3 = ' selected'; }  
     elsif($status eq 'Expired' ) { $OpSel2 = ' selected'; }  
     else                         { $OpSel1 = ' selected'; }  
   
     my $Str = '';      my $Str = '';
     $Str .= '<select name="Status"';      $Str .= '<select name="Status"';
     if(defined($formName) && $formName ne '' && ! defined($onchange)) {      if(defined($formName) && $formName ne '' && ! defined($onchange)) {
Line 648  sub StatusOptions { Line 699  sub StatusOptions {
     }      }
     $Str .= ' size="'.$size.'" ';      $Str .= ' size="'.$size.'" ';
     $Str .= '>'."\n";      $Str .= '>'."\n";
     $Str .= '<option value="Active" '.$OpSel1.'>'.      foreach my $type (['Active',  &mt('Currently Has Access')],
         &mt('Currently Enrolled').'</option>'."\n";        ['Future',  &mt('Will Have Future Access')],
     $Str .= '<option value="Expired" '.$OpSel2.'>'.        ['Expired', &mt('Previously Had Access')],
         &mt('Previously Enrolled').'</option>'."\n";        ['Any',     &mt('Any Access Status')]) {
     $Str .= '<option value="Any" '.$OpSel3.'>'.   my ($name,$label) = @$type;
         &mt('Any Enrollment Status').'</option>'."\n";   $Str .= '<option value="'.$name.'" ';
    if ($status eq $name) {
       $Str .= 'selected="selected" ';
    }
    $Str .= '>'.$label.'</option>'."\n";
       }
   
     $Str .= '</select>'."\n";      $Str .= '</select>'."\n";
 }  }
   
Line 781  sub Create_PrgWin { Line 838  sub Create_PrgWin {
     $prog_state{'type'}=$type;      $prog_state{'type'}=$type;
     if ($type eq 'popup') {      if ($type eq 'popup') {
  $prog_state{'window'}='popwin';   $prog_state{'window'}='popwin';
  my $html=&Apache::lonxml::xmlbegin();   my $start_page =
       &Apache::loncommon::start_page($title,undef,
      {'only_body' => 1,
       'bgcolor'   => '#88DDFF',
       'js_ready'  => 1});
    my $end_page = &Apache::loncommon::end_page({'js_ready'  => 1});
   
  #the whole function called through timeout is due to issues   #the whole function called through timeout is due to issues
  #in mozilla Read BUG #2665 if you want to know the whole story   #in mozilla Read BUG #2665 if you want to know the whole story
  &r_print($r,'<script>'.   &r_print($r,'<script type="text/javascript">'.
         "var popwin;          "var popwin;
          function openpopwin () {           function openpopwin () {
          popwin=open(\'\',\'popwin\',\'width=400,height=100\');".           popwin=open(\'\',\'popwin\',\'width=400,height=100\');".
         "popwin.document.writeln(\'".$html."<head><title>$title</title></head>".          "popwin.document.writeln(\'".$start_page.
       "<body bgcolor=\"#88DDFF\">".                "<h4>$heading<\/h4>".
               "<h4>$heading</h4>".                "<form name=\"popremain\" method=\"post\">".
               "<form name=popremain>".  
               '<input type="text" size="'.$width.'" name="remaining" value="'.                '<input type="text" size="'.$width.'" name="remaining" value="'.
       &mt('Starting').'"></form>'.        &mt('Starting').'" /><\\/form>'.$end_page.
               "</body></html>\');".                "\');".
         "popwin.document.close();}".          "popwin.document.close();}".
         "\nwindow.setTimeout(openpopwin,0)</script>");          "\nwindow.setTimeout(openpopwin,0)</script>");
  $prog_state{'formname'}='popremain';   $prog_state{'formname'}='popremain';
Line 918  sub r_print { Line 980  sub r_print {
 # ------------------------------------------------------- Puts directory header  # ------------------------------------------------------- Puts directory header
   
 sub crumbs {  sub crumbs {
     my ($uri,$target,$prefix,$form,$size,$noformat)=@_;      my ($uri,$target,$prefix,$form,$size,$noformat,$skiplast)=@_;
     if (! defined($size)) {      if (! defined($size)) {
         $size = '+2';          $size = '+2';
     }      }
Line 934  sub crumbs { Line 996  sub crumbs {
  foreach my $dir (split('/',$uri)) {   foreach my $dir (split('/',$uri)) {
             if (! $dir) { next; }              if (! $dir) { next; }
             $path .= $dir;              $path .= $dir;
     unless ($path eq $uri) { $path.='/'; }      if ($path eq $uri) {
    if ($skiplast) {
       $output.=$dir;
                       last;
    } 
       } else {
    $path.='/'; 
       }
             my $linkpath = &Apache::loncommon::escape_single($path);              my $linkpath = &Apache::loncommon::escape_single($path);
             if ($form) {              if ($form) {
  $linkpath=   $linkpath=
Line 943  sub crumbs { Line 1012  sub crumbs {
     $output.=qq{<a href="$linkpath" $target>$dir</a>/};      $output.=qq{<a href="$linkpath" $target>$dir</a>/};
  }   }
     } else {      } else {
  $output.=$uri;   foreach my $dir (split('/',$uri)) {
               if (! $dir) { next; }
       $output.=$dir.'/';
    }
     }      }
     unless ($uri=~/\/$/) { $output=~s/\/$//; }      if ($uri !~ m|/$|) { $output=~s|/$||; }
     return $output.'</font>'.($noformat?'':'</b></tt><br />');      return $output.'</font>'.($noformat?'':'</b></tt><br />');
 }  }
   
 # --------------------- A function that generates a window for the spellchecker  # --------------------- A function that generates a window for the spellchecker
   
 sub spellheader {  sub spellheader {
     my $html=&Apache::lonxml::xmlbegin();      my $start_page=
    &Apache::loncommon::start_page('Speller Suggestions',undef,
          {'only_body'   => 1,
    'js_ready'    => 1,
    'bgcolor'     => '#DDDDDD',
           'add_entries' => {
       'onload' => 
                                                  'document.forms.spellcheckform.submit()',
                                                }
           });
       my $end_page=
    &Apache::loncommon::end_page({'js_ready'  => 1}); 
   
     my $nothing=&javascript_nothing();      my $nothing=&javascript_nothing();
     return (<<ENDCHECK);      return (<<ENDCHECK);
 <script type="text/javascript">   <script type="text/javascript"> 
 //<!-- BEGIN LON-CAPA Internal  //<!-- BEGIN LON-CAPA Internal
 var checkwin;  var checkwin;
   
 function spellcheckerwindow() {  function spellcheckerwindow(string) {
       var esc_string = string.replace(/\"/g,'&quot;');
     checkwin=window.open($nothing,'spellcheckwin','height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');      checkwin=window.open($nothing,'spellcheckwin','height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
     checkwin.document.writeln('$html<head></head><body bgcolor="#DDDDDD"><form name="spellcheckform" action="/adm/spellcheck" method="post"><input type="hidden" name="text" value="" /></form></body></html>');      checkwin.document.writeln('$start_page<form name="spellcheckform" action="/adm/spellcheck" method="post"><input type="hidden" name="text" value="'+esc_string+'" /><\\/form>$end_page');
     checkwin.document.close();      checkwin.document.close();
 }  }
 // END LON-CAPA Internal -->  // END LON-CAPA Internal -->
Line 975  sub spelllink { Line 1060  sub spelllink {
     my ($form,$field)=@_;      my ($form,$field)=@_;
     my $linktext=&mt('Check Spelling');      my $linktext=&mt('Check Spelling');
     return (<<ENDLINK);      return (<<ENDLINK);
 <a href="javascript:if (typeof(document.$form.onsubmit)!='undefined') { if (document.$form.onsubmit!=null) { document.$form.onsubmit();}};spellcheckerwindow();checkwin.document.forms.spellcheckform.text.value=this.document.forms.$form.$field.value;checkwin.document.forms.spellcheckform.submit();">$linktext</a>  <a href="javascript:if (typeof(document.$form.onsubmit)!='undefined') { if (document.$form.onsubmit!=null) { document.$form.onsubmit();}};spellcheckerwindow(this.document.forms.$form.$field.value);">$linktext</a>
 ENDLINK  ENDLINK
 }  }
   
 # ------------------------------------------------- Output headers for HTMLArea  # ------------------------------------------------- Output headers for HTMLArea
   
   {
       my @htmlareafields;
       sub init_htmlareafields {
    undef(@htmlareafields);
       }
       
       sub add_htmlareafields {
    my (@newfields) = @_;
    push(@htmlareafields,@newfields);
       }
   
       sub get_htmlareafields {
    return @htmlareafields;
       }
   }
   
 sub htmlareaheaders {  sub htmlareaheaders {
     if (&htmlareablocked()) { return ''; }      if (&htmlareablocked()) { return ''; }
     unless (&htmlareabrowser()) { return ''; }      unless (&htmlareabrowser()) { return ''; }
Line 994  _editor_url='/htmlarea/'; Line 1095  _editor_url='/htmlarea/';
 _editor_lang='$lang';  _editor_lang='$lang';
 </script>  </script>
 <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>  <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>
   <link rel="stylesheet" type="text/css" href="/htmlarea/htmlarea.css" />
 ENDHEADERS  ENDHEADERS
 }  }
   
Line 1028  sub disablelink { Line 1130  sub disablelink {
     if (defined($#fields)) {      if (defined($#fields)) {
  unless ($#fields>=0) { return ''; }   unless ($#fields>=0) { return ''; }
     }      }
     return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=off&returnurl=','<>&"').&Apache::lonnet::escape($ENV{'REQUEST_URI'}).'">'.&mt('Disable WYSIWYG Editor').'</a>';      return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=off&returnurl=','<>&"').&escape($ENV{'REQUEST_URI'}).'">'.&mt('Disable WYSIWYG Editor').'</a>';
 }  }
   
 sub enablelink {  sub enablelink {
Line 1036  sub enablelink { Line 1138  sub enablelink {
     if (defined($#fields)) {      if (defined($#fields)) {
  unless ($#fields>=0) { return ''; }   unless ($#fields>=0) { return ''; }
     }      }
     return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=on&returnurl=','<>&"').&Apache::lonnet::escape($ENV{'REQUEST_URI'}).'">'.&mt('Enable WYSIWYG Editor').'</a>';      return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=on&returnurl=','<>&"').&escape($ENV{'REQUEST_URI'}).'">'.&mt('Enable WYSIWYG Editor').'</a>';
 }  }
   
 # ----------------------------------------- Script to activate only some fields  # ----------------------------------------- Script to activate only some fields
Line 1084  A link to help for the component will be Line 1186  A link to help for the component will be
   
 All inputs can be undef without problems.  All inputs can be undef without problems.
   
 Inputs: $color (the background color of the table returned),  Inputs: $component (the large text on the right side of the table),
         $component (the large text on the right side of the table),  
         $component_help          $component_help
         $function (role to get colors from)  
         $domain   (domian of role)  
         $menulink (boolean, controls whether to include a link to /adm/menu)          $menulink (boolean, controls whether to include a link to /adm/menu)
           $helplink (if 'nohelp' don't include the orange help link)
           $css_class (optional name for the class to apply to the table for CSS)
 Returns a string containing breadcrumbs for the current page.  Returns a string containing breadcrumbs for the current page.
   
 =item clear_breadcrumbs  =item clear_breadcrumbs
Line 1115  returns: nothing Line 1215  returns: nothing
     my @Crumbs;      my @Crumbs;
           
     sub breadcrumbs {      sub breadcrumbs {
         my ($color,$component,$component_help,$function,$domain,$menulink,          my ($component,$component_help,$menulink,$helplink,$css_class) = @_;
     $helplink) = @_;  
         if (! defined($color)) {  
             if (! defined($function)) {  
                 $function = &Apache::loncommon::get_users_function();  
             }  
             $color = &Apache::loncommon::designparm($function.'.tabbg',  
                                                     $domain);  
         }  
         #          #
         my $Str = "\n".   $css_class ||= 'LC_breadcrumbs';
             '<table width="100%" border="0" cellpadding="0" cellspacing="0">'.          my $Str = "\n".'<table class="'.$css_class.'"><tr><td>';
             '<tr><td bgcolor="'.$color.'">'.  
             '<font size="-1">';  
         #          #
         # Make the faq and bug data cascade          # Make the faq and bug data cascade
         my $faq = '';          my $faq = '';
Line 1182  returns: nothing Line 1272  returns: nothing
 #        if ($bug ne '') {  #        if ($bug ne '') {
 #            $icons .= &Apache::loncommon::help_open_bug($bug);  #            $icons .= &Apache::loncommon::help_open_bug($bug);
 #        }  #        }
  if ($helplink ne 'nohelp') {   if ($faq ne '' || $component_help ne '' || $bug ne '') {
     $icons .= &Apache::loncommon::help_open_menu($color,$component,$component_help,$function,$faq,$bug);      $icons .= &Apache::loncommon::help_open_menu($component,
    $component_help,
    $faq,$bug);
  }   }
         if ($icons ne '') {  
             $Str .= $icons.'&nbsp;';  
         }  
         #          #
         $Str .= $links.'</font></td>';          $Str .= $links.'</td>';
         #          #
         if (defined($component)) {          if (defined($component)) {
             $Str .= '<td align="right" bgcolor="'.$color.'">'.              $Str .= '<td class="'.$css_class.'_component">'.
                 '<font size="+1">'.&mt($component).'</font></td>';                  &mt($component);
       if ($icons ne '') {
    $Str .= '&nbsp;'.$icons;
       }
       $Str .= '</td>';
         }          }
         $Str .= '</tr></table>'."\n";          $Str .= '</tr></table>'."\n";
         #          #
Line 1246  returns: nothing Line 1339  returns: nothing
 #  #
 # In general a &submit_row() call should proceed the call to &end_pick_box(),  # In general a &submit_row() call should proceed the call to &end_pick_box(),
 # as this routine adds a button for form submission.  # as this routine adds a button for form submission.
 # &submit_row(0 does not require a &row_closure after it.  # &submit_row() does not require a &row_closure after it.
 #    #  
 # &start_pick_box() creates a bounding table with 1-pixel wide black border.  # &start_pick_box() creates a bounding table with 1-pixel wide black border.
 # rows should be placed between calls to &start_pick_box() and &end_pick_box.  # rows should be placed between calls to &start_pick_box() and &end_pick_box.
Line 1271  returns: nothing Line 1364  returns: nothing
 # needs that are not accommodated by the *_select_row() routines.      # needs that are not accommodated by the *_select_row() routines.    
   
 sub start_pick_box {  sub start_pick_box {
     my ($table_width) = @_;      my ($css_class) = @_;
       if (defined($css_class)) {
    $css_class = 'class="'.$css_class.'"';
       } else {
    $css_class= 'class="LC_pick_box"';
       }
     my $output = <<"END";      my $output = <<"END";
  <table width="$table_width" border="0" cellpadding="0" cellspacing="1" bgcolor="#000000">   <table $css_class>
   <tr>  
       <td>  
        <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">  
         <tr>  
          <td>  
           <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#ffffff">  
 END  END
     return $output;      return $output;
 }  }
Line 1287  END Line 1379  END
 sub end_pick_box {  sub end_pick_box {
     my $output = <<"END";      my $output = <<"END";
        </table>         </table>
       </td>  
      </tr>  
     </table>  
    </td>  
   </tr>  
  </table>  
 END  END
     return $output;      return $output;
 }  }
   
 sub row_title {  sub row_title {
     my ($col_width,$tablecolor,$title) = @_;      my ($title,$css_title_class,$css_value_class) = @_;
       $css_title_class ||= 'LC_pick_box_title';
       $css_title_class = 'class="'.$css_title_class.'"';
   
       $css_value_class ||= 'LC_pick_box_value';
       $css_value_class = 'class="'.$css_value_class.'"';
   
     my $output = <<"ENDONE";      my $output = <<"ENDONE";
            <tr>             <tr class="LC_pick_box_row">
             <td width="$col_width" bgcolor="$tablecolor">              <td $css_title_class>
              <table width="$col_width" border="0" cellpadding="8" cellspacing="0">         $title:
               <tr>  
                <td align="right"><b>$title:</b>  
                </td>  
               </tr>  
              </table>  
             </td>              </td>
             <td width="100%" valign="top">              <td $css_value_class>
              <table width="100%" border="0" cellpadding="8" cellspacing="0">  
               <tr>  
 ENDONE  ENDONE
     return $output;      return $output;
 }  }
   
 sub row_closure {  sub row_closure {
     my $output .= <<"ENDTWO";      my ($no_separator) =@_;
               </tr>      my $output = <<"ENDTWO";
              </table>  
             </td>              </td>
            </tr>             </tr>
   ENDTWO
       if (!$no_separator) {
           $output .= <<"ENDTWO";
            <tr>             <tr>
             <td width="100%" colspan="2" bgcolor="#000000">              <td colspan="2" class="LC_pick_box_separator">
              <img src="/adm/lonMisc/blackdot.gif" /><br />  
             </td>              </td>
            </tr>             </tr>
 ENDTWO  ENDTWO
       }
     return $output;      return $output;
 }  }
   
 sub role_select_row {  sub role_select_row {
     my ($roles,$col_width,$tablecolor,$title) = @_;      my ($roles,$title,$css_class,$show_separate_custom,$cdom,$cnum) = @_;
     my $output = &row_title($col_width,$tablecolor,$title);      my $output;
     $output .= qq|               <td>      if (defined($title)) {
           $output = &row_title($title,$css_class);
       }
       $output .= qq|
                                   <select name="roles" multiple >\n|;                                    <select name="roles" multiple >\n|;
     foreach (@$roles) {      foreach my $role (@$roles) {
         my $plrole=&Apache::lonnet::plaintext($_);          my $plrole;
         $output .= '  <option value="'.$_.'">'.$plrole.'</option>';          if ($role eq 'ow') {
               $plrole = &mt('Course Owner');
           } elsif ($role eq 'cr') {
               if ($show_separate_custom) {
                   if ($cdom ne '' && $cnum ne '') {
                       my %course_customroles = &course_custom_roles($cdom,$cnum);
                       foreach my $crrole (sort(keys(%course_customroles))) {
                           my ($plcrrole) = ($crrole =~ m|^cr/[^/]+/[^/]+/(.+)$|);
                           $output .= '  <option value="'.$crrole.'">'.$plcrrole.
                                      '</option>';
                       }
                   }
               } else {
                   $plrole = &mt('Custom Role');
               }
           } else {
               $plrole=&Apache::lonnet::plaintext($role);
           }
           if (($role ne 'cr') || (!$show_separate_custom)) {
               $output .= '  <option value="'.$role.'">'.$plrole.'</option>';
           }
       }
       $output .= qq|                </select>\n|;
       if (defined($title)) {
           $output .= &row_closure();
     }      }
     $output .= qq|                </select>  
                                  </td>\n|;  
     $output .= &row_closure();  
     return $output;      return $output;
 }  }
   
 sub course_select_row {  sub course_select_row {
     my ($col_width,$tablecolor,$title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles) = @_;      my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles,
     my $output = &row_title($col_width,$tablecolor,$title);   $css_class) = @_;
     $output .= "          <td>\n";      my $output = &row_title($title,$css_class);
     $output .= qq|      $output .= qq|
 <script type="text/javascript" language="Javascript" >  <script type="text/javascript">
     function coursePick (formname) {      function coursePick (formname) {
         for  (var i=0; i<formname.coursepick.length; i++) {          for  (var i=0; i<formname.coursepick.length; i++) {
               if (formname.coursepick[i].value == 'category') {
                   courseSet('');
               }
             if (!formname.coursepick[i].checked) {              if (!formname.coursepick[i].checked) {
                 if (formname.coursepick[i].value == 'category') {  
                     courseSet('');  
                 }  
                 if (formname.coursepick[i].value == 'specific') {                  if (formname.coursepick[i].value == 'specific') {
                     formname.coursetotal.value = 0;                      formname.coursetotal.value = 0;
                     formname.courselist = '';                      formname.courselist = '';
Line 1365  sub course_select_row { Line 1476  sub course_select_row {
             }              }
         }          }
     }      }
       function setPick (formname) {
           for  (var i=0; i<formname.coursepick.length; i++) {
               if (formname.coursepick[i].value == 'category') {
                   formname.coursepick[i].checked = true;
               }
               formname.coursetotal.value = 0;
               formname.courselist = '';
           }
       }
 </script>  </script>
     |;      |;
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
                      ($formname,'pickcourse','pickdomain','coursedesc').'</b>';                       ($formname,'pickcourse','pickdomain','coursedesc','',1).'</b>';
           $output .= '<input type="radio" name="coursepick" value="all" onclick="coursePick(this.form)" />'.&mt('All courses').'<br />';
     if ($totcodes > 0) {      if ($totcodes > 0) {
         $output .= '<input type="radio" name="coursepick" value="all" onclick="coursePick(this.form)" />'.&mt('All courses');  
         my $numtitles = @$codetitles;          my $numtitles = @$codetitles;
         if ($numtitles > 0) {          if ($numtitles > 0) {
             $output .= '<br /><input type="radio" name="coursepick" value="category" onclick="coursePick(this.form);alert('."'".&mt('Choose categories, from left to right')."'".')" />'.&mt('Pick courses by category:').' <br />';              $output .= '<input type="radio" name="coursepick" value="category" onclick="coursePick(this.form);alert('."'".&mt('Choose categories, from left to right')."'".')" />'.&mt('Pick courses by category:').' <br />';
             $output .= '<table><tr><td>'.$$codetitles[0].'<br />'."\n".              $output .= '<table><tr><td>'.$$codetitles[0].'<br />'."\n".
                '<select name="'.$$codetitles[0].                 '<select name="'.$$codetitles[0].
                '" onChange="courseSet('."'$$codetitles[0]'".')">'."\n".                 '" onChange="setPick(this.form);courseSet('."'$$codetitles[0]'".')">'."\n".
                ' <option value="-1" />Select'."\n";                 ' <option value="-1" />Select'."\n";
             my @items = ();              my @items = ();
             my @longitems = ();              my @longitems = ();
             if ($$idlist{$$codetitles[0]} =~ /","/) {              if ($$idlist{$$codetitles[0]} =~ /","/) {
                 @items = split/","/,$$idlist{$$codetitles[0]};                  @items = split(/","/,$$idlist{$$codetitles[0]});
             } else {              } else {
                 $items[0] = $$idlist{$$codetitles[0]};                  $items[0] = $$idlist{$$codetitles[0]};
             }              }
             if (defined($$idlist_titles{$$codetitles[0]})) {              if (defined($$idlist_titles{$$codetitles[0]})) {
                 if ($$idlist_titles{$$codetitles[0]} =~ /","/) {                  if ($$idlist_titles{$$codetitles[0]} =~ /","/) {
                     @longitems = split/","/,$$idlist_titles{$$codetitles[0]};                      @longitems = split(/","/,$$idlist_titles{$$codetitles[0]});
                 } else {                  } else {
                     $longitems[0] = $$idlist_titles{$$codetitles[0]};                      $longitems[0] = $$idlist_titles{$$codetitles[0]};
                 }                  }
Line 1414  sub course_select_row { Line 1534  sub course_select_row {
             $output .= '</tr></table><br />';              $output .= '</tr></table><br />';
         }          }
     }      }
     $output .= '<input type="radio" name="coursepick" value="specific" onclick="coursePick(this.form);opencrsbrowser('."'".'rolefilter'."'".','."'".'dccourse'."'".','."'".'dcdomain'."'".','."'".'coursedesc'."',''".')" />'.&mt('Pick specific course(s):').' '.$courseform.'&nbsp;&nbsp;<input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br /></td>'."\n";      $output .= '<input type="radio" name="coursepick" value="specific" onclick="coursePick(this.form);opencrsbrowser('."'".$formname."'".','."'".'dccourse'."'".','."'".'dcdomain'."'".','."'".'coursedesc'."','','1'".')" />'.&mt('Pick specific course(s):').' '.$courseform.'&nbsp;&nbsp;<input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br />'."\n";
     $output .= &row_closure();      $output .= &row_closure();
     return $output;      return $output;
 }  }
   
 sub status_select_row {  sub status_select_row {
     my ($types,$col_width,$tablecolor,$title) = @_;      my ($types,$title,$css_class) = @_;
     my $output = &row_title($col_width,$tablecolor,$title);      my $output; 
     $output .= qq|              <td>      if (defined($title)) {
           $output = &row_title($title,$css_class,'LC_pick_box_select');
       }
       $output .= qq|
                                     <select name="types" multiple>\n|;                                      <select name="types" multiple>\n|;
     foreach my $status_type (sort keys (%{$types})) {      foreach my $status_type (sort(keys(%{$types}))) {
         $output .= '  <option value="'.$status_type.'">'.$$types{$status_type}.'</option>';          $output .= '  <option value="'.$status_type.'">'.$$types{$status_type}.'</option>';
     }      }
     $output .= qq|                   </select>      $output .= qq|                   </select>\n|; 
                                     </td>\n|;       if (defined($title)) {
     $output .= &row_closure();          $output .= &row_closure();
       }
     return $output;      return $output;
 }  }
   
 sub email_default_row {  sub email_default_row {
     my ($authtypes,$col_width,$tablecolor,$title,$descrip) = @_;      my ($authtypes,$title,$descrip,$css_class) = @_;
     my $output = &row_title($col_width,$tablecolor,$title);      my $output = &row_title($title,$css_class);
     my @rowcols = ('#eeeeee','#dddddd');      my @rowcols = ('#eeeeee','#dddddd');
     $output .= '              <td>'.$descrip.'      $output .= $descrip.
                                <table>   &Apache::loncommon::start_data_table().
                                 <tr>   &Apache::loncommon::start_data_table_header_row().
                                  <td><b>'.&mt('Authentication Method').'</b></td><td>&nbsp;&nbsp;&nbsp;</td><td>&nbsp;&nbsp;&nbsp;</td><td><b>'.&mt('Username -> e-mail conversion').'</b></td>   '<th>'.&mt('Authentication Method').'</th>'.
                                 </tr>'."\n";   '<th align="right">'.&mt('Username -> e-mail conversion').'</th>'."\n".
    &Apache::loncommon::end_data_table_header_row();
     my $rownum = 0;      my $rownum = 0;
     foreach my $auth (sort keys (%{$authtypes})) {      foreach my $auth (sort(keys(%{$authtypes}))) {
         my ($userentry,$size);          my ($userentry,$size);
         my $rowiter = $rownum%2;  
         if ($auth =~ /^krb/) {          if ($auth =~ /^krb/) {
             $userentry = '';              $userentry = '';
             $size = 25;              $size = 25;
Line 1453  sub email_default_row { Line 1577  sub email_default_row {
             $userentry = 'username@';              $userentry = 'username@';
             $size = 15;              $size = 15;
         }          }
         $output .= '<tr rowcolor="'.$rowcols[$rowiter].'"><td>  '.$$authtypes{$auth}.'</td><td>&nbsp;&nbsp;&nbsp;</td><td align="right">'.$userentry.'</td><td><input type="text" name="'.$auth.'" size="'.$size.'" /></td></tr>';          $output .= &Apache::loncommon::start_data_table_row().
         $rownum ++;      '<td>  '.$$authtypes{$auth}.'</td>'.
       '<td align="right">'.$userentry.
       '<input type="text" name="'.$auth.'" size="'.$size.'" /></td>'.
       &Apache::loncommon::end_data_table_row();
     }      }
     $output .= "                   </table>      $output .= &Apache::loncommon::end_data_table();
                                   </td>\n";  
     $output .= &row_closure();      $output .= &row_closure();
     return $output;      return $output;
 }  }
   
   
 sub submit_row {  sub submit_row {
     my ($col_width,$tablecolor,$title,$cmd,$submit_text) = @_;      my ($title,$cmd,$submit_text,$css_class) = @_;
     my $output .= &row_title($col_width,$tablecolor,$title);      my $output = &row_title($title,$css_class,'LC_pick_box_submit');
     $output .= qq|      $output .= qq|
             <td width="100%" valign="top" align="right">  
              <br />               <br />
              <input type="hidden" name="command" value="$cmd" />               <input type="hidden" name="command" value="$cmd" />
              <input type="submit" value="$submit_text"/> &nbsp;               <input type="submit" value="$submit_text"/> &nbsp;
              <br /><br />               <br /><br />
             </td>\n|;              \n|;
       return $output;
   }
   
   sub course_custom_roles {
       my ($cdom,$cnum) = @_;
       my %returnhash=();
       my %coursepersonnel=&Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
       foreach my $person (sort(keys(%coursepersonnel))) {
           my ($role) = ($person =~ /^([^:]+):/);
           my ($end,$start) = split(/:/,$coursepersonnel{$person});
           if ($end == -1 && $start == -1) {
               next;
           }
           if ($role =~ m|^cr/[^/]+/[^/]+/[^/]|) {
               $returnhash{$role} ++;
           }
       }
       return %returnhash;
   }
   
   
   ##############################################
   ##############################################
                                                                                
   # echo_form_input
   #
   # Generates html markup to add form elements from the referrer page
   # as hidden form elements (values encoded) in the new page.
   #
   # Intended to support two types of use 
   # (a) to allow backing up to earlier pages in a multi-page 
   # form submission process using a breadcrumb trail.
   #
   # (b) to allow the current page to be reloaded with form elements
   # set on previous page to remain unchanged.  An example would
   # be where the a page containing a dynamically-built table of data is 
   # is to be redisplayed, with only the sort order of the data changed. 
   #  
   # Inputs:
   # 1. Reference to array of form elements in the submitted form on 
   # the referrer page which are to be excluded from the echoed elements.
   #
   # 2. Reference to array of regular expressions, which if matched in the  
   # name of the form element n the referrer page will be omitted from echo. 
   #
   # Outputs: A scalar containing the html markup for the echoed form
   # elements (all as hidden elements, with values encoded). 
   
   
   sub echo_form_input {
       my ($excluded,$regexps) = @_;
       my $output = '';
       foreach my $key (keys(%env)) {
           if ($key =~ /^form\.(.+)$/) {
               my $name = $1;
               my $match = 0;
               if ((!@{$excluded}) || (!grep/^$name$/,@{$excluded})) {
                   if (defined($regexps)) {
                       if (@{$regexps} > 0) {
                           foreach my $regexp (@{$regexps}) {
                               if ($name =~ /\Q$regexp\E/) {
                                   $match = 1;
                                   last;
                               }
                           }
                       }
                   }
                   if (!$match) {
                       if (ref($env{$key})) {
                           foreach my $value (@{$env{$key}}) {
                               $value = &HTML::Entities::encode($value,'<>&"');
                               $output .= '<input type="hidden" name="'.$name.
                                                '" value="'.$value.'" />'."\n";
                           }
                       } else {
                           my $value = &HTML::Entities::encode($env{$key},'<>&"');
                           $output .= '<input type="hidden" name="'.$name.
                                                '" value="'.$value.'" />'."\n";
                       }
                   }
               }
           }
       }
       return $output;
   }
   
   ##############################################
   ##############################################
                                                                                
   # set_form_elements
   #
   # Generates javascript to set form elements to values based on
   # corresponding values for the same form elements when the page was
   # previously submitted.
   #     
   # Last submission values are read from hidden form elements in referring 
   # page which have the same name, i.e., generated by &echo_form_input(). 
   #
   # Intended to be called by onload event.
   #
   # Inputs:
   # (a) Reference to hash of echoed form elements to be set.
   #
   # In the hash, keys are the form element names, and the values are the
   # element type (selectbox, radio, checkbox or text -for textbox, textarea or
   # hidden).
   #
   # (b) Optional reference to hash of stored elements to be set.
   #
   # If the page being displayed is a page which permits modification of
   # previously stored data, e.g., the first page in a multi-page submission,
   # then if stored is supplied, form elements will be set to the last stored
   # values.  If user supplied values are also available for the same elements
   # these will replace the stored values. 
   #        
   # Output:
   #  
   # javascript function - set_form_elements() which sets form elements,
   # expects an argument: formname - the name of the form according to 
   # the DOM, e.g., document.compose
   
   sub set_form_elements {
       my ($elements,$stored) = @_;
       my %values;
       my $output .= 'function setFormElements(courseForm) {
   ';
       if (defined($stored)) {
           foreach my $name (keys(%{$stored})) {
               if (exists($$elements{$name})) {
                   if (ref($$stored{$name}) eq 'ARRAY') {
                       $values{$name} = $$stored{$name};
                   } else {
                       @{$values{$name}} = ($$stored{$name});
                   }
               }
           }
       }
   
       foreach my $key (keys(%env)) {
           if ($key =~ /^form\.(.+)$/) {
               my $name = $1;
               if (exists($$elements{$name})) {
                   @{$values{$name}} = &Apache::loncommon::get_env_multiple($key);
               }
           }
       }
   
       foreach my $name (keys(%values)) {
           for (my $i=0; $i<@{$values{$name}}; $i++) {
               $values{$name}[$i] = &HTML::Entities::decode($values{$name}[$i],'<>&"');
               $values{$name}[$i] =~ s/([\r\n\f]+)/\\n/g;
               $values{$name}[$i] =~ s/"/\\"/g;
           }
           if ($$elements{$name} eq 'text') {
               my $numvalues = @{$values{$name}};
               if ($numvalues > 1) {
                   my $valuestring = join('","',@{$values{$name}});
                   $output .= qq|
     var textvalues = new Array ("$valuestring");
     var total = courseForm.elements['$name'].length;
     if (total > $numvalues) {
         total = $numvalues;
     }    
     for (var i=0; i<total; i++) {
         courseForm.elements['$name']\[i].value = textvalues[i];
     }
   |;
               } else {
                   $output .= qq|
     courseForm.elements['$name'].value = "$values{$name}[0]";
   |;
               }
           } else {
               $output .=  qq|
     var elementLength = courseForm.elements['$name'].length;
     if (elementLength==undefined) {
   |;
               foreach my $value (@{$values{$name}}) {
                   if ($$elements{$name} eq 'selectbox') {
                       $output .=  qq|
         if (courseForm.elements['$name'].options[0].value == "$value") {
             courseForm.elements['$name'].options[0].selected = true;
         }|;
                   } elsif (($$elements{$name} eq 'radio') ||
                            ($$elements{$name} eq 'checkbox')) {
                       $output .= qq|
         if (courseForm.elements['$name'].value == "$value") {
             courseForm.elements['$name'].checked = true;
         }|;
                   }
               }
               $output .= qq|
     }
     else {
         for (var i=0; i<courseForm.elements['$name'].length; i++) {
   |;
               if ($$elements{$name} eq 'selectbox') {
                   $output .=  qq|
             courseForm.elements['$name'].options[i].selected = false;|;
               } elsif (($$elements{$name} eq 'radio') || 
                        ($$elements{$name} eq 'checkbox')) {
                   $output .= qq|
             courseForm.elements['$name']\[i].checked = false;|; 
               }
               $output .= qq|
         }
         for (var j=0; j<courseForm.elements['$name'].length; j++) {
   |;
               foreach my $value (@{$values{$name}}) {
                   if ($$elements{$name} eq 'selectbox') {
                       $output .=  qq|
             if (courseForm.elements['$name'].options[j].value == "$value") {
                 courseForm.elements['$name'].options[j].selected = true;
             }|;
                   } elsif (($$elements{$name} eq 'radio') ||
                            ($$elements{$name} eq 'checkbox')) { 
                         $output .= qq|
             if (courseForm.elements['$name']\[j].value == "$value") {
                 courseForm.elements['$name']\[j].checked = true;
             }|;
                   }
               }
               $output .= qq|
         }
     }
   |;
           }
       }
       $output .= "
   }\n";
     return $output;      return $output;
 }  }
   

Removed from v.1.112  
changed lines
  Added in v.1.154


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