Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.125 and 1.164

version 1.125, 2006/04/19 22:26:26 version 1.164, 2007/09/27 15:36:23
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 LONCAPA;
   
 ##############################################  ##############################################
 ##############################################  ##############################################
Line 76  use Apache::lonnet; Line 77  use Apache::lonnet;
 sub authorbombs {  sub authorbombs {
     my $url=shift;      my $url=shift;
     $url=&Apache::lonnet::declutter($url);      $url=&Apache::lonnet::declutter($url);
     my ($udom,$uname)=($url=~/^(\w+)\/(\w+)\//);      my ($udom,$uname)=($url=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)/});
     my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);      my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
     foreach (keys %bombs) {      foreach (keys %bombs) {
  if ($_=~/^$udom\/$uname\//) {   if ($_=~/^$udom\/$uname\//) {
Line 93  sub authorbombs { Line 94  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 137  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);
       &Apache::loncommon::inhibit_menu_check(\$escaped);
     $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 280  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 322  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 385  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 428  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 652  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 670  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 817  sub Create_PrgWin { Line 852  sub Create_PrgWin {
          function openpopwin () {           function openpopwin () {
          popwin=open(\'\',\'popwin\',\'width=400,height=100\');".           popwin=open(\'\',\'popwin\',\'width=400,height=100\');".
         "popwin.document.writeln(\'".$start_page.          "popwin.document.writeln(\'".$start_page.
               "<h4>$heading</h4>".                "<h4>$heading<\/h4>".
               "<form name=popremain>".                "<form action= \"\" name=\"popremain\" method=\"post\">".
               '<input type="text" size="'.$width.'" name="remaining" value="'.                '<input type="text" size="'.$width.'" name="remaining" value="'.
       &mt('Starting').'"></form>'.$end_page.        &mt('Starting').'" /><\\/form>'.$end_page.
               "\');".                "\');".
         "popwin.document.close();}".          "popwin.document.close();}".
         "\nwindow.setTimeout(openpopwin,0)</script>");          "\nwindow.setTimeout(openpopwin,0)</script>");
Line 830  sub Create_PrgWin { Line 865  sub Create_PrgWin {
  $prog_state{'window'}='window';   $prog_state{'window'}='window';
  if (!$formname) {   if (!$formname) {
     $prog_state{'formname'}=&get_uniq_name();      $prog_state{'formname'}=&get_uniq_name();
     &r_print($r,'<form name="'.$prog_state{'formname'}.'">');      &r_print($r,'<form action="" name="'.$prog_state{'formname'}.'">');
  } else {   } else {
     $prog_state{'formname'}=$formname;      $prog_state{'formname'}=$formname;
  }   }
Line 857  sub Create_PrgWin { Line 892  sub Create_PrgWin {
 # update progress  # update progress
 sub Update_PrgWin {  sub Update_PrgWin {
     my ($r,$prog_state,$displayString)=@_;      my ($r,$prog_state,$displayString)=@_;
     &r_print($r,'<script>'.$$prog_state{'window'}.'.document.'.      &r_print($r,'<script type="text/javascript">'.$$prog_state{'window'}.'.document.'.
      $$prog_state{'formname'}.'.'.       $$prog_state{'formname'}.'.'.
      $$prog_state{'inputname'}.'.value="'.       $$prog_state{'inputname'}.'.value="'.
      $displayString.'";</script>');       $displayString.'";</script>');
Line 945  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 961  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) {
             my $linkpath = &Apache::loncommon::escape_single($path);   if ($skiplast) {
             if ($form) {      $output.=$dir;
  $linkpath=                      last;
                     qq{javascript:$form.action='$linkpath';$form.submit();};   } 
             }      } else {
     $output.=qq{<a href="$linkpath" $target>$dir</a>/};   $path.='/'; 
       }    
               my $href_path = &HTML::Entities::encode($path,'<>&"');
       &Apache::loncommon::inhibit_menu_check(\$href_path);
       if ($form) {
           my $href = 'javascript:'.$form.".action='".$href_path."';".$form.'.submit();';
           $output.=qq{<a href="$href" $target>$dir</a>/};
       } else {
           $output.=qq{<a href="$href_path" $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 />');
 }  }
   
Line 981  sub crumbs { Line 1028  sub crumbs {
 sub spellheader {  sub spellheader {
     my $start_page=      my $start_page=
  &Apache::loncommon::start_page('Speller Suggestions',undef,   &Apache::loncommon::start_page('Speller Suggestions',undef,
        {'only_body' => 1,         {'only_body'   => 1,
  'js_ready'  => 1,   'js_ready'    => 1,
  'bgcolor'   => '#DDDDDD',});   'bgcolor'     => '#DDDDDD',
           'add_entries' => {
       'onload' => 
                                                  'document.forms.spellcheckform.submit()',
                                                }
           });
     my $end_page=      my $end_page=
  &Apache::loncommon::end_page({'js_ready'  => 1});    &Apache::loncommon::end_page({'js_ready'  => 1}); 
   
Line 993  sub spellheader { Line 1045  sub spellheader {
 //<!-- 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('$start_page<form name="spellcheckform" action="/adm/spellcheck" method="post"><input type="hidden" name="text" value="" /></form>$end_page');      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 1009  sub spelllink { Line 1062  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
 }  }
   
Line 1044  _editor_url='/htmlarea/'; Line 1097  _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 1078  sub disablelink { Line 1132  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 1086  sub enablelink { Line 1140  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 1134  A link to help for the component will be Line 1188  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 1153  Pushes a breadcrumb on the stack of crum Line 1205  Pushes a breadcrumb on the stack of crum
   
 input: $breadcrumb, a hash reference.  The keys 'href','title', and 'text'  input: $breadcrumb, a hash reference.  The keys 'href','title', and 'text'
 are required.  If present the keys 'faq' and 'bug' will be used to provide  are required.  If present the keys 'faq' and 'bug' will be used to provide
 links to the FAQ and bug sites.  links to the FAQ and bug sites. If the key 'no_mt' is present the 'title' 
   and 'text' values won't be sent through &mt()
   
 returns: nothing      returns: nothing    
   
Line 1165  returns: nothing Line 1218  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 1213  returns: nothing Line 1256  returns: nothing
                      if (defined($_->{'target'}) && $_->{'target'} ne '') {                       if (defined($_->{'target'}) && $_->{'target'} ne '') {
                          $result .= 'target="'.$_->{'target'}.'" ';                           $result .= 'target="'.$_->{'target'}.'" ';
                      }                       }
                      $result .='title="'.&mt($_->{'title'}).'">'.       if ($_->{'no_mt'}) {
                          &mt($_->{'text'}).'</a>';   $result .='title="'.$_->{'title'}.'">'.
        $_->{'text'}.'</a>';
        } else {
    $result .='title="'.&mt($_->{'title'}).'">'.
        &mt($_->{'text'}).'</a>';
        }
                      $result;                       $result;
                      } @Crumbs                       } @Crumbs
                  );                   );
         $links .= '-&gt;' if ($links ne '');          $links .= '-&gt;' if ($links ne '');
         $links .= '<b>'.&mt($last->{'text'}).'</b>';   if ($last->{'no_mt'}) {
       $links .= '<b>'.$last->{'text'}.'</b>';
    } else {
       $links .= '<b>'.&mt($last->{'text'}).'</b>';
    }
         #          #
         my $icons = '';          my $icons = '';
         $faq = $last->{'faq'} if (exists($last->{'faq'}));          $faq = $last->{'faq'} if (exists($last->{'faq'}));
Line 1232  returns: nothing Line 1284  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 1279  returns: nothing Line 1334  returns: nothing
 # row2  # row2
 # row3   ... etc.  # row3   ... etc.
 # &submit_row(0  # &submit_row(0
 # &end_pickbox()  # &end_pick_box()
 #  #
 # where row1, row 2 etc. are chosen from &role_select_row,&course_select_row,  # where row1, row 2 etc. are chosen from &role_select_row,&course_select_row,
 # &status_select_row and &email_default_row  # &status_select_row and &email_default_row
Line 1321  returns: nothing Line 1376  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 1337  END Line 1391  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 ($no_separator) =@_;
     my $output = <<"ENDTWO";      my $output = <<"ENDTWO";
               </tr>  
              </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;      my $output;
     if (defined($title)) {      if (defined($title)) {
         $output = &row_title($col_width,$tablecolor,$title);          $output = &row_title($title,$css_class);
     }      }
     $output .= qq|               <td valign="top">      $output .= qq|
                                   <select name="roles" multiple >\n|;                                    <select name="roles" multiple >\n|;
     foreach my $role (@$roles) {      foreach my $role (@$roles) {
         my $plrole;          my $plrole;
         if ($role eq 'ow') {          if ($role eq 'ow') {
             $plrole = &mt('Course Owner');              $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 {          } else {
             $plrole=&Apache::lonnet::plaintext($role);              $plrole=&Apache::lonnet::plaintext($role);
         }          }
         $output .= '  <option value="'.$role.'">'.$plrole.'</option>';          if (($role ne 'cr') || (!$show_separate_custom)) {
               $output .= '  <option value="'.$role.'">'.$plrole.'</option>';
           }
     }      }
     $output .= qq|                </select>      $output .= qq|                </select>\n|;
                                  </td>\n|;  
     if (defined($title)) {      if (defined($title)) {
         $output .= &row_closure();          $output .= &row_closure();
     }      }
Line 1407  sub role_select_row { Line 1470  sub role_select_row {
 }  }
   
 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') {              if (formname.coursepick[i].value == 'category') {
Line 1438  sub course_select_row { Line 1501  sub course_select_row {
     |;      |;
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
                      ($formname,'pickcourse','pickdomain','coursedesc','',1).'</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="setPick(this.form);courseSet('."'$$codetitles[0]'".')">'."\n".                 '" onChange="setPick(this.form);courseSet('."'$$codetitles[0]'".')">'."\n".
Line 1483  sub course_select_row { Line 1546  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('."'".$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 /></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;       my $output; 
     if (defined($title)) {      if (defined($title)) {
         $output = &row_title($col_width,$tablecolor,$title);          $output = &row_title($title,$css_class,'LC_pick_box_select');
     }      }
     $output .= qq|              <td valign="top">      $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)) {      if (defined($title)) {
         $output .= &row_closure();          $output .= &row_closure();
     }      }
Line 1508  sub status_select_row { Line 1570  sub status_select_row {
 }  }
   
 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');      $output .= $descrip.
     $output .= '              <td>'.$descrip;   &Apache::loncommon::start_data_table().
     $output .= &start_pick_box('');    &Apache::loncommon::start_data_table_header_row().
     $output .= '                <tr bgcolor="'.$tablecolor.'">   '<th>'.&mt('Authentication Method').'</th>'.
                                  <td><b>'.&mt('Authentication Method').'</b></td><td align="right"><b>'.&mt('Username -> e-mail conversion').'</b></td>   '<th align="right">'.&mt('Username -> e-mail conversion').'</th>'."\n".
                                 </tr>'."\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 1527  sub email_default_row { Line 1588  sub email_default_row {
             $userentry = 'username@';              $userentry = 'username@';
             $size = 15;              $size = 15;
         }          }
         $output .= '<tr bgcolor="'.$rowcols[$rowiter].'"><td>  '.$$authtypes{$auth}.'</td><td align="right">'.$userentry.'<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 .= &end_pick_box();      $output .= &Apache::loncommon::end_data_table();
     $output .= "                   <br /></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;      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;
   }
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
                                                                                                                                                             
Line 1688  sub set_form_elements { Line 1768  sub set_form_elements {
                 my $valuestring = join('","',@{$values{$name}});                  my $valuestring = join('","',@{$values{$name}});
                 $output .= qq|                  $output .= qq|
   var textvalues = new Array ("$valuestring");    var textvalues = new Array ("$valuestring");
   var total = courseForm.$name.length;    var total = courseForm.elements['$name'].length;
   if (total > $numvalues) {    if (total > $numvalues) {
       total = $numvalues;        total = $numvalues;
   }        }    
   for (var i=0; i<total; i++) {    for (var i=0; i<total; i++) {
       courseForm.$name\[i].value = textvalues[i];        courseForm.elements['$name']\[i].value = textvalues[i];
   }    }
 |;  |;
             } else {              } else {
                 $output .= qq|                  $output .= qq|
   courseForm.$name.value = "$values{$name}[0]";    courseForm.elements['$name'].value = "$values{$name}[0]";
 |;  |;
             }              }
         } else {          } else {
             $output .=  qq|              $output .=  qq|
   var elementLength = courseForm.$name.length;    var elementLength = courseForm.elements['$name'].length;
   if (elementLength==undefined) {    if (elementLength==undefined) {
 |;  |;
             foreach my $value (@{$values{$name}}) {              foreach my $value (@{$values{$name}}) {
                 if ($$elements{$name} eq 'selectbox') {                  if ($$elements{$name} eq 'selectbox') {
                     $output .=  qq|                      $output .=  qq|
       if (courseForm.$name.options[0].value == "$value") {        if (courseForm.elements['$name'].options[0].value == "$value") {
           courseForm.$name.options[0].selected = true;            courseForm.elements['$name'].options[0].selected = true;
       }|;        }|;
                 } elsif (($$elements{$name} eq 'radio') ||                  } elsif (($$elements{$name} eq 'radio') ||
                          ($$elements{$name} eq 'checkbox')) {                           ($$elements{$name} eq 'checkbox')) {
                     $output .= qq|                      $output .= qq|
       if (courseForm.$name.value == "$value") {        if (courseForm.elements['$name'].value == "$value") {
           courseForm.$name.checked = true;            courseForm.elements['$name'].checked = true;
       }|;        }|;
                 }                  }
             }              }
             $output .= qq|              $output .= qq|
   }    }
   else {    else {
       for (var i=0; i<courseForm.$name.length; i++) {        for (var i=0; i<courseForm.elements['$name'].length; i++) {
 |;  |;
             if ($$elements{$name} eq 'selectbox') {              if ($$elements{$name} eq 'selectbox') {
                 $output .=  qq|                  $output .=  qq|
           courseForm.$name.options[i].selected = false;|;            courseForm.elements['$name'].options[i].selected = false;|;
             } elsif (($$elements{$name} eq 'radio') ||               } elsif (($$elements{$name} eq 'radio') || 
                      ($$elements{$name} eq 'checkbox')) {                       ($$elements{$name} eq 'checkbox')) {
                 $output .= qq|                  $output .= qq|
           courseForm.$name\[i].checked = false;|;             courseForm.elements['$name']\[i].checked = false;|; 
             }              }
             $output .= qq|              $output .= qq|
       }        }
       for (var j=0; j<courseForm.$name.length; j++) {        for (var j=0; j<courseForm.elements['$name'].length; j++) {
 |;  |;
             foreach my $value (@{$values{$name}}) {              foreach my $value (@{$values{$name}}) {
                 if ($$elements{$name} eq 'selectbox') {                  if ($$elements{$name} eq 'selectbox') {
                     $output .=  qq|                      $output .=  qq|
           if (courseForm.$name.options[j].value == "$value") {            if (courseForm.elements['$name'].options[j].value == "$value") {
               courseForm.$name.options[j].selected = true;                courseForm.elements['$name'].options[j].selected = true;
           }|;            }|;
                 } elsif (($$elements{$name} eq 'radio') ||                  } elsif (($$elements{$name} eq 'radio') ||
                          ($$elements{$name} eq 'checkbox')) {                            ($$elements{$name} eq 'checkbox')) { 
                       $output .= qq|                        $output .= qq|
           if (courseForm.$name\[j].value == "$value") {            if (courseForm.elements['$name']\[j].value == "$value") {
               courseForm.$name\[j].checked = true;                courseForm.elements['$name']\[j].checked = true;
           }|;            }|;
                 }                  }
             }              }
Line 1762  sub set_form_elements { Line 1842  sub set_form_elements {
     return $output;      return $output;
 }  }
   
   ##############################################
   ##############################################
   
   # javascript_valid_email
   #
   # Generates javascript to validate an e-mail address.
   # Returns a javascript function which accetps a form field as argumnent, and
   # returns false if field.value does not satisfy two regular expression matches
   # for a valid e-mail address.  Backwards compatible with old browsers without
   # support for javascript RegExp (just checks for @ in field.value in this case). 
   
   sub javascript_valid_email {
       my $scripttag .= <<'END';
   function validmail(field) {
       var str = field.value;
       if (window.RegExp) {
           var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)";
           var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"; //"
           var reg1 = new RegExp(reg1str);
           var reg2 = new RegExp(reg2str);
           if (!reg1.test(str) && reg2.test(str)) {
               return true;
           }
           return false;
       }
       else
       {
           if(str.indexOf("@") >= 0) {
               return true;
           }
           return false;
       }
   }
   END
       return $scripttag;
   }
   
 1;  1;
   
 __END__  __END__

Removed from v.1.125  
changed lines
  Added in v.1.164


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