Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.133 and 1.211

version 1.133, 2006/06/14 18:34:46 version 1.211, 2009/05/05 16:01:50
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;  use LONCAPA;
   
 ##############################################  ##############################################
Line 68  use LONCAPA; Line 67  use LONCAPA;
   
 =pod  =pod
   
   =item confirm_success
   
   Successful completion of an operation message
   
   =cut
   
   sub confirm_success {
      my ($message,$failure)=@_;
      if ($failure) {
         return '<span class="LC_error">'."\n"
               .'<img src="/adm/lonIcons/navmap.wrong.gif" /> '."\n"
               .$message."\n"
               .'</span>'."\n";
      } else {
         return '<span class="LC_success">'."\n"
               .'<img src="/adm/lonIcons/navmap.correct.gif" /> '."\n"
               .$message."\n"
               .'</span>'."\n";
      }
   }
   
   ##############################################
   ##############################################
   
   =pod
   
   =item dragmath_button
   
   Creates a button that launches a dragmath popup-window, in which an 
   expression can be edited and pasted as LaTeX into a specified textarea. 
   
     textarea - Name of the textarea to edit.
     helpicon - If true, show a help icon to the right of the button.
   
   =cut
   
   sub dragmath_button {
       my ($textarea,$helpicon) = @_;
       my $help_text; 
       if ($helpicon) {
           $help_text = &Apache::loncommon::help_open_topic('Authoring_Math_Editor');
       }
       my $buttontext=&mt('Edit Math');
       return <<ENDDRAGMATH;
                   <input type="button" value="$buttontext", onclick="javascript:mathedit('$textarea',document)" />$help_text
   ENDDRAGMATH
   }
   
   ##############################################
   
   =pod
   
   =item dragmath_js
   
   Javascript used to open pop-up window containing dragmath applet which 
   can be used to paste LaTeX into a textarea.
    
   =cut
   
   sub dragmath_js {
       my ($popup) = @_;
       return <<ENDDRAGMATHJS;
                   <script type="text/javascript">
                     function mathedit(textarea, doc) {
                        targetEntry = textarea;
                        targetDoc   = doc;
                        newwin  = window.open("/adm/dragmath/applet/$popup.html","","width=565,height=500,resizable");
                     }
                   </script>
   
   ENDDRAGMATHJS
   }
   
   
   ##############################################
   ##############################################
   
   =pod
   
 =item authorbombs  =item authorbombs
   
 =cut  =cut
Line 78  use LONCAPA; Line 156  use LONCAPA;
 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 99  sub recent_filename { Line 177  sub recent_filename {
 }  }
   
 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.'&'.&escape($value) });   $timestamp.'&'.&escape($value) });
 }  }
   
 sub remove_recent {  sub remove_recent {
Line 132  sub select_recent { Line 216  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'>".
  &unescape((split(/\&/,$recent{$_}))[1]).   &unescape((split(/\&/,$recent{$value}))[1]).
  '</option>';   '</option>';
  }   }
     }      }
Line 149  sub get_recent { Line 234  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 = ();
     my $nfrozen = 0;      my %return_hash = ();
     foreach (keys %recent) {      foreach my $item (keys %recent) {
         my ($thistime,$thisvalue)=(split(/\&/,$recent{$_}));          my ($thistime,$thisvalue)=(split(/\&/,$recent{$item}));
         if (($thisvalue eq 'role_frozen') && ($area='roles')) {          if ($thistime eq 'always_include') {
             $thistime=time+$nfrozen;              $return_hash{$item} = &unescape($thisvalue);
             $nfrozen++;              $n--;
           } else {
               $time_hash{$thistime} = $item;
         }          }
         $time_hash{$thistime} = $_;  
     }      }
   
 # 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}} =
                   &unescape((split(/\&/,$recent{$time_hash{$_}}))[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 209  sub checkbox { Line 310  sub checkbox {
         $Str .= 'value="'.$value.'"';          $Str .= 'value="'.$value.'"';
     }       } 
     if ($checked) {      if ($checked) {
         $Str .= ' checked="1"';          $Str .= ' checked="checked"';
     }      }
     $Str .= ' />';      $Str .= ' />';
     return $Str;      return $Str;
Line 231  sub radio { Line 332  sub radio {
         $Str .= 'value="'.$value.'"';          $Str .= 'value="'.$value.'"';
     }       } 
     if ($checked eq $value) {      if ($checked eq $value) {
         $Str .= ' checked="1"';          $Str .= ' checked="checked"';
     }      }
     $Str .= ' />';      $Str .= ' />';
     return $Str;      return $Str;
Line 288  The method used to restrict user input w Line 389  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 $now = time;
     my $wasdefined=1;      my $wasdefined=1;
     if (! defined($state) || $state ne 'disabled') {      if (! defined($state) || $state ne 'disabled') {
         $state = '';          $state = '';
Line 297  sub date_setter { Line 399  sub date_setter {
         $no_hh_mm_ss = 0;          $no_hh_mm_ss = 0;
     }      }
     if ($currentvalue eq 'now') {      if ($currentvalue eq 'now') {
  $currentvalue=time;   $currentvalue = $now;
     }      }
     if ((!defined($currentvalue)) || ($currentvalue eq '')) {      if ((!defined($currentvalue)) || ($currentvalue eq '')) {
  $wasdefined=0;   $wasdefined=0;
  if ($includeempty) {   if ($includeempty) {
     $currentvalue = 0;      $currentvalue = 0;
  } else {   } else {
     $currentvalue = time;      $currentvalue = $now;
  }   }
     }      }
     # other potentially useful values:     wkday,yrday,is_daylight_savings      # other potentially useful values:     wkday,yrday,is_daylight_savings
       my $tzname;
     my ($sec,$min,$hour,$mday,$month,$year)=('','',undef,'','','');      my ($sec,$min,$hour,$mday,$month,$year)=('','',undef,'','','');
     if ($currentvalue) {      if ($currentvalue) {
  ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) =           ($tzname,$sec,$min,$hour,$mday,$month,$year) = &get_timedates($currentvalue); 
     localtime($currentvalue);  
  $year += 1900;  
     }      }
     unless ($wasdefined) {      unless ($wasdefined) {
           ($tzname,$sec,$min,$hour,$mday,$month,$year) = &get_timedates($now);
  if (($defhour) || ($defmin) || ($defsec)) {   if (($defhour) || ($defmin) || ($defsec)) {
     ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) =   
  localtime(time);  
     $year += 1900;  
     $sec=($defsec?$defsec:0);      $sec=($defsec?$defsec:0);
     $min=($defmin?$defmin:0);      $min=($defmin?$defmin:0);
     $hour=($defhour?$defhour:0);      $hour=($defhour?$defhour:0);
Line 330  sub date_setter { Line 429  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 393  document.$formname.$dname\_year.value, Line 492  document.$formname.$dname\_year.value,
     }      }
 </script>  </script>
 ENDJS  ENDJS
     $result .= '  <nobr>';      $result .= '  <span class="LC_nobreak">';
     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 436  ENDJS Line 535  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()">};
       }
     #      #
       my $tzone = ' '.$tzname.' ';
     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>');                     $tzone;
           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>');                     $tzone;
           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;
 }  }
   
   sub get_timedates {
       my ($epoch) = @_;
       my $dt = DateTime->from_epoch(epoch => $epoch)
                        ->set_time_zone(&Apache::lonlocal::gettimezone());
       my $tzname = $dt->time_zone_short_name();
       my $sec = $dt->second;
       my $min = $dt->minute;
       my $hour = $dt->hour;
       my $mday = $dt->day;
       my $month = $dt->month;
       if ($month) {
           $month --;
       }
       my $year = $dt->year;
       return ($tzname,$sec,$min,$hour,$mday,$month,$year);
   }
   
   sub build_url {
       my ($base, $fields)=@_;
       my $url;
       $url = $base.'?';
       foreach my $key (keys(%$fields)) {
           $url.=&escape($key).'='.&escape($$fields{$key}).'&amp;';
       }
       $url =~ s/&amp;$//;
       return $url;
   }
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 520  sub get_date_from_form { Line 658  sub get_date_from_form {
     if (defined($env{'form.'.$dname.'_month'})) {      if (defined($env{'form.'.$dname.'_month'})) {
         my $tmpmonth = $env{'form.'.$dname.'_month'};          my $tmpmonth = $env{'form.'.$dname.'_month'};
         if (($tmpmonth =~ /^\d+$/) && ($tmpmonth > 0) && ($tmpmonth < 13)) {          if (($tmpmonth =~ /^\d+$/) && ($tmpmonth > 0) && ($tmpmonth < 13)) {
             $month = $tmpmonth - 1;              $month = $tmpmonth;
         }          }
     }      }
     if (defined($env{'form.'.$dname.'_year'})) {      if (defined($env{'form.'.$dname.'_year'})) {
         my $tmpyear = $env{'form.'.$dname.'_year'};          my $tmpyear = $env{'form.'.$dname.'_year'};
         if (($tmpyear =~ /^\d+$/) && ($tmpyear > 1900)) {          if (($tmpyear =~ /^\d+$/) && ($tmpyear >= 1970)) {
             $year = $tmpyear - 1900;              $year = $tmpyear;
         }          }
     }      }
     if (($year<70) || ($year>137)) { return undef; }      if (($year<1970) || ($year>2037)) { 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)')) {          my $timezone = &Apache::lonlocal::gettimezone();
         return &timelocal($sec,$min,$hour,$day,$month,$year);          my $dt = DateTime->new( year   => $year,
                                   month  => $month,
                                   day    => $day,
                                   hour   => $hour,
                                   minute => $min,
                                   second => $sec,
                                   time_zone => $timezone,
                                 );
           my $epoch_time  = $dt->epoch;
           if ($epoch_time ne '') {
               return $epoch_time;
           } else {
               return undef;
           }
     } else {      } else {
         return undef;          return undef;
     }      }
Line 603  sub javascript_nothing { Line 754  sub javascript_nothing {
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub javascript_docopen {  sub javascript_docopen {
       my ($mimetype) = @_;
       $mimetype ||= 'text/html';
     # safari does not understand document.open() and loads "text/html"      # safari does not understand document.open() and loads "text/html"
     my $nothing = "''";      my $nothing = "''";
     my $user_browser;      my $user_browser;
Line 616  sub javascript_docopen { Line 769  sub javascript_docopen {
     if ($user_browser eq 'safari' && $user_os =~ 'mac') {      if ($user_browser eq 'safari' && $user_os =~ 'mac') {
         $nothing = "document.clear()";          $nothing = "document.clear()";
     } else {      } else {
  $nothing = "document.open('text/html','replace')";   $nothing = "document.open('$mimetype','replace')";
     }      }
     return $nothing;      return $nothing;
 }  }
Line 653  Returns: a perl string as described. Line 806  Returns: a perl string as described.
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub StatusOptions {  sub StatusOptions {
     my ($status, $formName,$size,$onchange)=@_;      my ($status, $formName,$size,$onchange,$mult)=@_;
     $size = 1 if (!defined($size));      $size = 1 if (!defined($size));
     if (! defined($status)) {      if (! defined($status)) {
         $status = 'Active';          $status = 'Active';
         $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($mult)){
           $Str .= ' multiple="multiple" ';
       }
     if(defined($formName) && $formName ne '' && ! defined($onchange)) {      if(defined($formName) && $formName ne '' && ! defined($onchange)) {
         $Str .= ' onchange="document.'.$formName.'.submit()"';          $Str .= ' onchange="document.'.$formName.'.submit()"';
     }      }
Line 678  sub StatusOptions { Line 826  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 825  sub Create_PrgWin { Line 979  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>".&mt("$heading")."<\/h4>".
               "<form name=\"popremain\" method=\"post\">".                "<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.
               "\');".                "\');".
Line 838  sub Create_PrgWin { Line 992  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;
  }   }
  if (!$inputname) {   if (!$inputname) {
     $prog_state{'inputname'}=&get_uniq_name();      $prog_state{'inputname'}=&get_uniq_name();
     &r_print($r,$heading.' <input type="text" name="'.$prog_state{'inputname'}.      &r_print($r,&mt("$heading [_1]",' <input type="text" name="'.$prog_state{'inputname'}.'" size="'.$width.'" />'));
      '" size="'.$width.'" />');  
  } else {   } else {
     $prog_state{'inputname'}=$inputname;      $prog_state{'inputname'}=$inputname;
           
Line 865  sub Create_PrgWin { Line 1018  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 976  sub crumbs { Line 1129  sub crumbs {
  }    } 
     } else {      } else {
  $path.='/';    $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>/};
     }      }
             my $linkpath = &Apache::loncommon::escape_single($path);  
             if ($form) {  
  $linkpath=  
                     qq{javascript:$form.action='$linkpath';$form.submit();};  
             }  
     $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 />');
 }  }
   
Line 996  sub crumbs { Line 1154  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 1008  sub spellheader { Line 1171  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 1024  sub spelllink { Line 1188  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 1047  ENDLINK Line 1211  ENDLINK
 }  }
   
 sub htmlareaheaders {  sub htmlareaheaders {
     if (&htmlareablocked()) { return ''; }      return if (&htmlareablocked());
     unless (&htmlareabrowser()) { return ''; }      return if (!&htmlareabrowser());
     my $lang='en';  
     if (&mt('htmlarea_lang') ne 'htmlarea_lang') {  
  $lang=&mt('htmlarea_lang');  
     }  
     return (<<ENDHEADERS);      return (<<ENDHEADERS);
 <script type="text/javascript">  <script type="text/javascript" src="/fckeditor/fckeditor.js"></script>
 _editor_url='/htmlarea/';  
 _editor_lang='$lang';  
 </script>  
 <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>  
 ENDHEADERS  ENDHEADERS
 }  }
   
 # ------------------------------------------------- Activate additional buttons  
   
 sub htmlareaaddbuttons {  
     if (&htmlareablocked()) { return ''; }  
     unless (&htmlareabrowser()) { return ''; }  
     return (<<ENDADDBUTTON);  
     var config=new HTMLArea.Config();  
     config.registerButton('ed_math','LaTeX Inline',  
   '/htmlarea/images/ed_math.gif',false,  
     function(editor,id) {  
       editor.surroundHTML('&nbsp;<m>\$','\$</m>&nbsp;');  
     }  
   );  
     config.registerButton('ed_math_eqn','LaTeX Equation',  
   '/htmlarea/images/ed_math_eqn.gif',false,  
     function(editor,id) {  
       editor.surroundHTML(  
      '&nbsp;\\n<center><m>\\\\[','\\\\]</m></center>\\n&nbsp;');  
     }  
   );  
     config.toolbar.push(['ed_math','ed_math_eqn']);  
 ENDADDBUTTON  
 }  
   
 # ----------------------------------------------------------------- Preferences  # ----------------------------------------------------------------- Preferences
   
 sub disablelink {  sub disablelink {
Line 1104  sub enablelink { Line 1236  sub enablelink {
     return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=on&returnurl=','<>&"').&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>';
 }  }
   
   # ------------------------------------------------- lang to use in html editor
   sub htmlarea_lang {
       my $lang='en';
       if (&mt('htmlarea_lang') ne 'htmlarea_lang') {
    $lang=&mt('htmlarea_lang');
       }
       return $lang;
   }
   
 # ----------------------------------------- Script to activate only some fields  # ----------------------------------------- Script to activate only some fields
   
 sub htmlareaselectactive {  sub htmlareaselectactive {
     my @fields=@_;      my @fields=@_;
     unless (&htmlareabrowser()) { return ''; }      unless (&htmlareabrowser()) { return ''; }
     if (&htmlareablocked()) { return '<br />'.&enablelink(@fields); }      if (&htmlareablocked()) { return '<br />'.&enablelink(@fields); }
     my $output='<script type="text/javascript" defer="1">'.      my $output='<script type="text/javascript" defer="1">';
  &htmlareaaddbuttons();      my $lang = &htmlarea_lang();
     foreach(@fields) {      foreach my $field (@fields) {
  $output.="\nHTMLArea.replace('$_',config);";   $output.="
   {
       var oFCKeditor = new FCKeditor('$field');
       oFCKeditor.Config['CustomConfigurationsPath'] = 
    '/fckeditor/loncapaconfig.js';    
       oFCKeditor.ReplaceTextarea();
       oFCKeditor.Config['AutoDetectLanguage'] = false;
       oFCKeditor.Config['DefaultLanguage'] = '$lang';
   }";
     }      }
     $output.="\nwindow.status='Activated Editfields';\n</script><br />".      $output.="\nwindow.status='Activated Editfields';\n</script><br />".
  &disablelink(@fields);   &disablelink(@fields);
Line 1149  A link to help for the component will be Line 1298  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)
           $no_mt (optional flag, 1 if &mt() is _not_ to be applied to $component
              when including the text on the right.
 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 1168  Pushes a breadcrumb on the stack of crum Line 1317  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 1180  returns: nothing Line 1330  returns: nothing
     my @Crumbs;      my @Crumbs;
           
     sub breadcrumbs {      sub breadcrumbs {
         my ($component,$component_help,$menulink,$helplink) = @_;          my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, $no_realBreadcrumb) = @_;
         #          #
         my $Str = "\n".'<table id="LC_breadcrumbs"><tr><td>';   $css_class ||= 'LC_breadcrumbs';
           my $Str1 = '<ol id="LC_MenuBreadcrumbs">';
   
    if($no_realBreadcrumb){
    $Str1 = '<ul class="LC_CourseBreadcrumbs">';
    }
   
           my $Str = '';
         #          #
         # Make the faq and bug data cascade          # Make the faq and bug data cascade
         my $faq = '';          my $faq = '';
         my $bug = '';          my $bug = '';
  my $help='';   my $help='';
    # Crumb Symbol
    my $crumbsymbol = '&raquo;&nbsp;';
         # The last breadcrumb does not have a link, so handle it separately.          # The last breadcrumb does not have a link, so handle it separately.
         my $last = pop(@Crumbs);          my $last = pop(@Crumbs);
         #          #
Line 1195  returns: nothing Line 1354  returns: nothing
  if (!defined($menulink)) { $menulink=1; }   if (!defined($menulink)) { $menulink=1; }
         if ($menulink) {          if ($menulink) {
             my $description = 'Menu';              my $description = 'Menu';
               my $no_mt_descr = 0;
             if (exists($env{'request.course.id'}) &&               if (exists($env{'request.course.id'}) && 
                 $env{'request.course.id'} ne '') {                  $env{'request.course.id'} ne '') {
                 $description =                   $description = 
                     $env{'course.'.$env{'request.course.id'}.'.description'};                      $env{'course.'.$env{'request.course.id'}.'.description'};
                   $no_mt_descr = 1;
             }              }
             unshift(@Crumbs,{              unshift(@Crumbs,{
                     href   =>'/adm/menu',                      href   =>'/adm/menu',
                     title  =>'Go to main menu',                      title  =>'Go to main menu',
                     target =>'_top',                      target =>'_top',
                     text   =>$description,                      text   =>$description,
                       no_mt  =>$no_mt_descr,
                 });                  });
         }          }
         my $links .=           my $links .= '<li>'. 
             join('-&gt;',              join('</li><li>'.$crumbsymbol,
                  map {                   map {
                      $faq = $_->{'faq'} if (exists($_->{'faq'}));                       $faq = $_->{'faq'} if (exists($_->{'faq'}));
                      $bug = $_->{'bug'} if (exists($_->{'bug'}));                       $bug = $_->{'bug'} if (exists($_->{'bug'}));
Line 1217  returns: nothing Line 1379  returns: nothing
                      if (defined($_->{'target'}) && $_->{'target'} ne '') {                       if (defined($_->{'target'}) && $_->{'target'} ne '') {
                          $result .= 'target="'.$_->{'target'}.'" ';                           $result .= 'target="'.$_->{'target'}.'" ';
                      }                       }
                      $result .='title="'.&mt($_->{'title'}).'">'.   # set the possible translation for title 
                          &mt($_->{'text'}).'</a>';       if ($_->{'no_mt'}) {
    $result .='title="'.$_->{'title'}.'">'.
        $_->{'text'}.'</a>';
        } else {
    $result .='title="'.&mt($_->{'title'}).'">'.
        &mt($_->{'text'}).'</a>';
        }
                      $result;                       $result;
                      } @Crumbs                       } @Crumbs
                  );                   ).'</li>';
         $links .= '-&gt;' if ($links ne '');  #Workaround for edit course. 
         $links .= '<b>'.&mt($last->{'text'}).'</b>';   if(@Crumbs == 0 ){
         #   $links .= '<li>' if ($links ne '');
    } else {
    $links .= '<li>'.$crumbsymbol if ($links ne '');
    }
   #should the last Element be translated?
    if ($last->{'no_mt'}) {
       $links .= '<b>'.$last->{'text'}.'</b>';
    } else {
       $links .= '<b>'.&mt($last->{'text'}).'</b>';
    }
    $links .= '</li>';
         my $icons = '';          my $icons = '';
         $faq = $last->{'faq'} if (exists($last->{'faq'}));          $faq = $last->{'faq'} if (exists($last->{'faq'}));
         $bug = $last->{'bug'} if (exists($last->{'bug'}));          $bug = $last->{'bug'} if (exists($last->{'bug'}));
Line 1236  returns: nothing Line 1414  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(undef,$component,      $icons .= &Apache::loncommon::help_open_menu($component,
  $component_help,   $component_help,
  undef,$faq,$bug);   $faq,$bug);
  }   }
         if ($icons ne '') {  
             $Str .= $icons.'&nbsp;';  
         }  
         #          #
         $Str .= $links.'</td>';  
   
    if($no_realBreadcrumb){
           $Str1 .= $links.'</ul>';
    } else {
           $Str1 .= $links.'</ol>';
    }
         #          #
         if (defined($component)) {          if (defined($component)) {
             $Str .= '<td class="LC_breadcrumb_component">'.              $Str .= "\n".'<table class="'.$css_class.'">'
                 &mt($component).'</td>';                     .'<tr><td class="'.$css_class.'_component">';
               if ($no_mt) {
                   $Str .= $component;
               } else {
                   $Str .= &mt($component);
               }
       if ($icons ne '') {
    $Str .= '&nbsp;'.$icons;
       }
       $Str .= '</td></tr></table>'."\n";
         }          }
         $Str .= '</tr></table>'."\n";  
         #          #
         # Return the @Crumbs stack to what we started with          # Return the @Crumbs stack to what we started with
         push(@Crumbs,$last);          push(@Crumbs,$last);
         shift(@Crumbs);          shift(@Crumbs);
         #          # Return a table and after that the breadcrumb's line
         return $Str;          return "$Str\n$Str1";
     }      }
   
     sub clear_breadcrumbs {      sub clear_breadcrumbs {
Line 1284  returns: nothing Line 1473  returns: nothing
 # row1  # row1
 # row2  # row2
 # row3   ... etc.  # row3   ... etc.
 # &submit_row(0  # &submit_row()
 # &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 1326  returns: nothing Line 1515  returns: nothing
 # routines, but can also be called directly to start and end rows which have   # routines, but can also be called directly to start and end rows which have 
 # needs that are not accommodated by the *_select_row() routines.      # needs that are not accommodated by the *_select_row() routines.    
   
   { # Start: row_count block for pick_box
   my @row_count;
   
 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"';
       }
       unshift(@row_count,0);
     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;
 }  }
   
 sub end_pick_box {  sub end_pick_box {
       shift(@row_count);
     my $output = <<"END";      my $output = <<"END";
        </table>         </table>
       </td>  END
      </tr>      return $output;
     </table>  }
    </td>  
   </tr>  sub row_headline {
  </table>      my $output = <<"END";
              <tr><td colspan="2">
 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) = @_;
       $row_count[0]++;
       my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
       $css_title_class ||= 'LC_pick_box_title';
       $css_title_class = 'class="'.$css_title_class.'"';
   
       $css_value_class ||= 'LC_pick_box_value';
   
       if ($title ne '') {
           $title .= ':';
       }
     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 class="$css_value_class $css_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;
 }  }
   
   } # End: row_count block for pick_box
   
   
 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="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 1413  sub role_select_row { Line 1629  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 .= &course_selection($formname,$totcodes,$codetitles,$idlist,$idlist_titles);
 <script type="text/javascript" language="Javascript" >      $output .= &row_closure();
       return $output;
   }
   
   sub course_selection {
       my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles) = @_;
       my $output = qq|
   <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 1489  sub course_select_row { Line 1712  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();  
     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="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 1514  sub status_select_row { Line 1735  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 1533  sub email_default_row { Line 1753  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);      $submit_text = &mt($submit_text);
       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;
   }
   
   
   ##############################################
   ##############################################
   
   # topic_bar
   #
   # Generates a div containing a numbered (static image) followed by a title
   # with a background color defined in the corresponding CSS: LC_topic_bar
   #
   sub topic_bar {
       my ($imgnum,$title) = @_;
       return '
   <div class="LC_topic_bar">
       <img alt="'.&mt('Step [_1]',$imgnum).
                 '"src="/res/adm/pages/bl_step'.$imgnum.'.gif" />&nbsp;
       <span>'.$title.'</span>
   </div>
   ';
   }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
                                                                                                                                                             
Line 1694  sub set_form_elements { Line 1953  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 1768  sub set_form_elements { Line 2027  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;
   }
   
   ##############################################
   ##############################################
   
   # generate_menu
   #
   # Generates html markup for a menu. 
   #
   # Inputs:
   # An array of following structure:
   #   ({ categorytitle => 'Categorytitle',
   # items => [
   #    {
   #           linktext    => 'Text to be displayed',
   # url        => 'URL the link is pointing to, i.e. /adm/site?action=dosomething',
   # permission  => 'Contains permissions as returned from lonnet::allowed(),
   #         must evaluate to true in order to activate the link',
   # icon        =>  'icon filename',
   # alttext    => 'alt text for the icon',
   # help    => 'Name of the corresponding helpfile',
   # linktitle   => 'Description of the link (used for title tag)'
   #    },
   #    ...
   # ]
   #   }, 
   #   ...
   #   )
   #
   # Outputs: A scalar containing the html markup for the menu.
   
   # ---- Remove when done ----
   # This routine is part of the redesign of LON-CAPA and it's 
   # subject to change during this project.
   # Don't rely on its current functionality as it might be 
   # changed or removed.
   # --------------------------
   sub generate_menu {
       my @menu = @_;
   
       # usage: $wrap->(element, content, {attribute => value,...});
       # output: content enclosed in html conform tags
       my $wrap = sub {
           return
               qq|<$_[0]|
             . join( '', map { qq| $_="${$_[2]}{$_}"| } keys %{ $_[2] } )
             . ($_[1] ? qq|>$_[1]</$_[0]>| : qq|/>|). "\n";
       };
       
       # subs for specific html elements
       my $h3  = sub { return $wrap->( "h3",  @_ ) };
       my $div = sub { return $wrap->( "div", @_ ) };
       my $ul  = sub { return $wrap->( "ul",  @_ ) };
       my $li  = sub { return $wrap->( "li",  @_ ) };
       my $a   = sub { return $wrap->( "a",   @_ ) };
       my $img = sub { return $wrap->( "img", @_ ) };
       
       my @categories; # each element represents the entire markup for a category
      
       foreach my $category (@menu) {
           my @links;  # contains the links for the current $category
           foreach my $link (@{$$category{items}}) {
               next unless $$link{permission};
               
               # create the markup for the current $link and push it into @links.
               # each entry consists of an image and a text optionally followed 
               # by a help link.
               push @links, $li->(
                           $a->(
                               $img->("", {
                                   class => "LC_noBorder LC_middle",
                                   src   => "/res/adm/pages/$$link{icon}",
                                   alt   => mt(defined($$link{alttext}) ?
                                   $$link{alttext} : $$link{linktext})
                               }), {
                               href  => $$link{url},
                               title => mt($$link{linktitle})
                               }).
                           $a->(mt($$link{linktext}), {
                               href  => $$link{url},
                               title => mt($$link{linktitle}),
                               class => "LC_menubuttons_link"
                               }).
                            (defined($$link{help}) ? 
                            Apache::loncommon::help_open_topic($$link{help}) : ''),
                            {class => "LC_menubuttons_inline_text"});
           }
   
           # wrap categorytitle in <h3>, concatenate with 
           # joined and in <ul> tags wrapped @links
           # and wrap everything in an enclosing <div> and push it into
           # @categories
           # such that each element looks like:
           # <div><h3>title</h3><ul><li>...</li>...</ul></div>
           # the category won't be added if there aren't any links
           push @categories, 
               $div->($h3->(mt($$category{categorytitle}), {class=>"LC_hcell"}).
               $ul->(join('' ,@links),  {class =>"LC_ListStyleNormal" }),
               {class=>"LC_ContentBoxSpecial LC_400Box"}) if scalar(@links);
       }
   
       # wrap the joined @categories in another <div> (column layout)
       return $div->(join('', @categories), {class => "LC_columnSection"});
   }
   
 1;  1;
   
 __END__  __END__

Removed from v.1.133  
changed lines
  Added in v.1.211


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