Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.165 and 1.207

version 1.165, 2007/10/01 18:45:40 version 1.207, 2009/04/07 15:40:38
Line 62  use Apache::lonlocal; Line 62  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use LONCAPA;  use LONCAPA;
   
   
   ##############################################
   ##############################################
   
   =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
   }
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 231  sub checkbox { Line 285  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 253  sub radio { Line 307  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 311  The method used to restrict user input w Line 365  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,$nolink) = @_;          $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 319  sub date_setter { Line 374  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 415  document.$formname.$dname\_year.value, Line 467  document.$formname.$dname\_year.value,
     }      }
 </script>  </script>
 ENDJS  ENDJS
     $result .= '  <span style="white-space: nowrap;">';      $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 463  ENDJS Line 515  ENDJS
         $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};          $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] ',          $result .= &mt('[_1] [_2] [_3] ',
                        $monthselector,$dayselector,$yearselector);                         $monthselector,$dayselector,$yearselector).
                      $tzone;
         if (!$nolink) {          if (!$nolink) {
             $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');              $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');
         }          }
     } else {      } else {
         $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ',          $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ',
                       $monthselector,$dayselector,$yearselector,                        $monthselector,$dayselector,$yearselector,
                       $hourselector,$minuteselector,$secondselector);                        $hourselector,$minuteselector,$secondselector).
                      $tzone;
         if (!$nolink) {          if (!$nolink) {
             $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');              $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>');
         }          }
Line 481  ENDJS Line 536  ENDJS
     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 549  sub get_date_from_form { Line 633  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 632  sub javascript_nothing { Line 729  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 645  sub javascript_docopen { Line 744  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 855  sub Create_PrgWin { Line 954  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 action= \"\" 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 874  sub Create_PrgWin { Line 973  sub Create_PrgWin {
  }   }
  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 1088  ENDLINK Line 1186  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>  
 <link rel="stylesheet" type="text/css" href="/htmlarea/htmlarea.css" />  
 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 1146  sub enablelink { Line 1211  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 1196  Inputs: $component (the large text on th Line 1278  Inputs: $component (the large text on th
         $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)          $helplink (if 'nohelp' don't include the orange help link)
         $css_class (optional name for the class to apply to the table for CSS)          $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 1221  returns: nothing Line 1305  returns: nothing
     my @Crumbs;      my @Crumbs;
           
     sub breadcrumbs {      sub breadcrumbs {
         my ($component,$component_help,$menulink,$helplink,$css_class) = @_;          my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, $no_realBreadcrumb) = @_;
         #          #
  $css_class ||= 'LC_breadcrumbs';   $css_class ||= 'LC_breadcrumbs';
         my $Str = "\n".'<table class="'.$css_class.'"><tr><td>';          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 1237  returns: nothing Line 1329  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 1259  returns: nothing Line 1354  returns: nothing
                      if (defined($_->{'target'}) && $_->{'target'} ne '') {                       if (defined($_->{'target'}) && $_->{'target'} ne '') {
                          $result .= 'target="'.$_->{'target'}.'" ';                           $result .= 'target="'.$_->{'target'}.'" ';
                      }                       }
    # set the possible translation for title 
      if ($_->{'no_mt'}) {       if ($_->{'no_mt'}) {
  $result .='title="'.$_->{'title'}.'">'.   $result .='title="'.$_->{'title'}.'">'.
      $_->{'text'}.'</a>';       $_->{'text'}.'</a>';
Line 1268  returns: nothing Line 1364  returns: nothing
      }       }
                      $result;                       $result;
                      } @Crumbs                       } @Crumbs
                  );                   ).'</li>';
         $links .= '-&gt;' if ($links ne '');  #Workaround for edit course. 
    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'}) {   if ($last->{'no_mt'}) {
     $links .= '<b>'.$last->{'text'}.'</b>';      $links .= '<b>'.$last->{'text'}.'</b>';
  } else {   } else {
     $links .= '<b>'.&mt($last->{'text'}).'</b>';      $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 1293  returns: nothing Line 1395  returns: nothing
  $faq,$bug);   $faq,$bug);
  }   }
         #          #
         $Str .= $links.'</td>';  
   
    if($no_realBreadcrumb){
           $Str1 .= $links.'</ul>';
    } else {
           $Str1 .= $links.'</ol>';
    }
         #          #
         if (defined($component)) {          if (defined($component)) {
             $Str .= '<td class="'.$css_class.'_component">'.              $Str .= "\n".'<table class="'.$css_class.'">'
                 &mt($component);                     .'<tr><td class="'.$css_class.'_component">';
               if ($no_mt) {
                   $Str .= $component;
               } else {
                   $Str .= &mt($component);
               }
     if ($icons ne '') {      if ($icons ne '') {
  $Str .= '&nbsp;'.$icons;   $Str .= '&nbsp;'.$icons;
     }      }
     $Str .= '</td>';      $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 1336  returns: nothing Line 1448  returns: nothing
 # row1  # row1
 # row2  # row2
 # row3   ... etc.  # row3   ... etc.
 # &submit_row(0  # &submit_row()
 # &end_pick_box()  # &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,
Line 1378  returns: nothing Line 1490  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 ($css_class) = @_;      my ($css_class) = @_;
     if (defined($css_class)) {      if (defined($css_class)) {
Line 1385  sub start_pick_box { Line 1500  sub start_pick_box {
     } else {      } else {
  $css_class= 'class="LC_pick_box"';   $css_class= 'class="LC_pick_box"';
     }      }
       unshift(@row_count,0);
     my $output = <<"END";      my $output = <<"END";
  <table $css_class>   <table $css_class>
 END  END
Line 1392  END Line 1508  END
 }  }
   
 sub end_pick_box {  sub end_pick_box {
       shift(@row_count);
     my $output = <<"END";      my $output = <<"END";
        </table>         </table>
 END  END
     return $output;      return $output;
 }  }
   
   sub row_headline {
       my $output = <<"END";
              <tr><td colspan="2">
   END
       return $output;
   }
   
 sub row_title {  sub row_title {
       $row_count[0]++;
       my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
     my ($title,$css_title_class,$css_value_class) = @_;      my ($title,$css_title_class,$css_value_class) = @_;
     $css_title_class ||= 'LC_pick_box_title';      $css_title_class ||= 'LC_pick_box_title';
     $css_title_class = 'class="'.$css_title_class.'"';      $css_title_class = 'class="'.$css_title_class.'"';
   
     $css_value_class ||= 'LC_pick_box_value';      $css_value_class ||= 'LC_pick_box_value';
     $css_value_class = 'class="'.$css_value_class.'"';  
   
       if ($title ne '') {
           $title .= ':';
       }
     my $output = <<"ENDONE";      my $output = <<"ENDONE";
            <tr class="LC_pick_box_row">             <tr class="LC_pick_box_row">
             <td $css_title_class>              <td $css_title_class>
        $title:         $title
             </td>              </td>
             <td $css_value_class>              <td class="$css_value_class $css_class">
 ENDONE  ENDONE
     return $output;      return $output;
 }  }
Line 1433  ENDTWO Line 1561  ENDTWO
     return $output;      return $output;
 }  }
   
   } # End: row_count block for pick_box
   
   
 sub role_select_row {  sub role_select_row {
     my ($roles,$title,$css_class,$show_separate_custom,$cdom,$cnum) = @_;      my ($roles,$title,$css_class,$show_separate_custom,$cdom,$cnum) = @_;
     my $output;      my $output;
Line 1440  sub role_select_row { Line 1571  sub role_select_row {
         $output = &row_title($title,$css_class);          $output = &row_title($title,$css_class);
     }      }
     $output .= qq|      $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') {
Line 1476  sub course_select_row { Line 1607  sub course_select_row {
     my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles,      my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles,
  $css_class) = @_;   $css_class) = @_;
     my $output = &row_title($title,$css_class);      my $output = &row_title($title,$css_class);
     $output .= qq|      $output .= &course_selection($formname,$totcodes,$codetitles,$idlist,$idlist_titles);
       $output .= &row_closure();
       return $output;
   }
   
   sub course_selection {
       my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles) = @_;
       my $output = qq|
 <script type="text/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++) {
Line 1549  sub course_select_row { Line 1687  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 />'."\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;
 }  }
   
Line 1561  sub status_select_row { Line 1698  sub status_select_row {
         $output = &row_title($title,$css_class,'LC_pick_box_select');          $output = &row_title($title,$css_class,'LC_pick_box_select');
     }      }
     $output .= qq|      $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>';
     }      }
Line 1605  sub email_default_row { Line 1742  sub email_default_row {
   
 sub submit_row {  sub submit_row {
     my ($title,$cmd,$submit_text,$css_class) = @_;      my ($title,$cmd,$submit_text,$css_class) = @_;
       $submit_text = &mt($submit_text);
     my $output = &row_title($title,$css_class,'LC_pick_box_submit');      my $output = &row_title($title,$css_class,'LC_pick_box_submit');
     $output .= qq|      $output .= qq|
              <br />               <br />
Line 1635  sub course_custom_roles { Line 1773  sub course_custom_roles {
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
   # 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>
   ';
   }
   
   ##############################################
   ##############################################
                                                                                                                                                             
 # echo_form_input  # echo_form_input
 #  #
Line 1882  END Line 2039  END
     return $scripttag;      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.165  
changed lines
  Added in v.1.207


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