--- loncom/interface/lonhtmlcommon.pm 2004/01/27 16:35:37 1.42 +++ loncom/interface/lonhtmlcommon.pm 2004/09/10 17:58:01 1.89 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.42 2004/01/27 16:35:37 www Exp $ +# $Id: lonhtmlcommon.pm,v 1.89 2004/09/10 17:58:01 banghart Exp $ # # Copyright Michigan State University Board of Trustees # @@ -56,10 +56,10 @@ html. package Apache::lonhtmlcommon; use Time::Local; +use Time::HiRes; use Apache::lonlocal; use strict; - ############################################## ############################################## @@ -117,6 +117,12 @@ sub store_recent { time.'&'.&Apache::lonnet::escape($value) }); } +sub remove_recent { + my ($area,$names)=@_; + my $file=&recent_filename($area); + return &Apache::lonnet::del($file,$names); +} + sub select_recent { my ($area,$fieldname,$event)=@_; my %recent=&Apache::lonnet::dump(&recent_filename($area)); @@ -163,14 +169,18 @@ sub textbox { ############################################## ############################################## sub checkbox { - my ($name,$value) = @_; - my $Str = ''; + my ($name,$checked,$value) = @_; + my $Str = ' ENDJS $result .= " \n"; - $result .= " \n"; - $result .= " \n"; $result .= "  "; - $result .= " \n"; - $result .= " m\n"; - $result .= " s\n"; + if (! $no_hh_mm_ss) { + # Hours + $result .= " \n"; + $result .= " m\n"; + $result .= " s\n"; + } $result .= "". &mt('Select Date')."\n\n"; return $result; @@ -361,18 +417,26 @@ sub get_date_from_form { if (($tmpsec =~ /^\d+$/) && ($tmpsec >= 0) && ($tmpsec < 60)) { $sec = $tmpsec; } + if (!defined($tmpsec) || $tmpsec eq '') { $sec = 0; } + } else { + $sec = 0; } if (defined($ENV{'form.'.$dname.'_minute'})) { my $tmpmin = $ENV{'form.'.$dname.'_minute'}; if (($tmpmin =~ /^\d+$/) && ($tmpmin >= 0) && ($tmpmin < 60)) { $min = $tmpmin; } + if (!defined($tmpmin) || $tmpmin eq '') { $min = 0; } + } else { + $min = 0; } if (defined($ENV{'form.'.$dname.'_hour'})) { my $tmphour = $ENV{'form.'.$dname.'_hour'}; if (($tmphour =~ /^\d+$/) && ($tmphour >= 0) && ($tmphour < 24)) { $hour = $tmphour; } + } else { + $hour = 0; } if (defined($ENV{'form.'.$dname.'_day'})) { my $tmpday = $ENV{'form.'.$dname.'_day'}; @@ -527,203 +591,6 @@ sub StatusOptions { $Str .= ''."\n"; } - -######################################################## -######################################################## - -=pod - -=item &MultipleSectionSelect() - -Inputs: - -=over 4 - -=item $sections A references to an array containing the names of all the -sections used in a class. - -=item $selectedSections A reference to an array containing the names of the -currently selected sections. - -=back - -Returns: a string containing HTML for a multiple select box for -selecting sections of a course. - -The form element name is 'Section'. @$sections is sorted prior to output. - -=cut - -######################################################## -######################################################## -sub MultipleSectionSelect { - my ($sections,$selectedSections)=@_; - - my $Str = ''; - $Str .= ''."\n"; - - return $Str; -} - -######################################################## -######################################################## - -=pod - -=item &Title() - -Inputs: $pageName a string containing the name of the page to be sent -to &Apache::loncommon::bodytag. - -Returns: string containing being and complete and -as well as a <script> to focus the current window and change its width -and height to 500. Why? I do not know. If you find out, please update -this documentation. - -=cut - -######################################################## -######################################################## -sub Title { - my ($pageName)=@_; - - my $Str = ''; - - $Str .= '<html><head><title>'.$pageName.''."\n"; - $Str .= &Apache::loncommon::bodytag($pageName)."\n"; - $Str .= ''."\n"; - - return $Str; -} - -######################################################## -######################################################## - -=pod - -=item &CreateHeadings() - -This function generates the column headings for the chart. - -=over 4 - -Inputs: $CacheData, $keyID, $headings, $spacePadding - -$CacheData: pointer to a hash tied to the cached data database - -$keyID: a pointer to an array containing the names of the data -held in a column and is used as part of a key into $CacheData - -$headings: The names of the headings for the student information - -$spacePadding: The spaces to go between columns - -Output: $Str - -$Str: A formatted string of the table column headings. - -=back - -=cut - -######################################################## -######################################################## -sub CreateHeadings { - my ($data,$keyID,$headings,$displayString,$format)=@_; - my $Str=''; - my $formatting = ''; - - for(my $index=0; $index<(scalar @$headings); $index++) { - my $currentHeading=$headings->[$index]; - if($format eq 'preformatted') { - my @dataLength=split(//,$currentHeading); - my $length=scalar @dataLength; - $formatting = (' 'x - ($data->{$keyID->[$index].':columnWidth'}-$length)); - } - my $linkdata=$keyID->[$index]; - - my $tempString = $displayString; - $tempString =~ s/LINKDATA/$linkdata/; - $tempString =~ s/DISPLAYDATA/$currentHeading/; - $tempString =~ s/FORMATTING/$formatting/; - - $Str .= $tempString; - } - - return $Str; -} - -######################################################## -######################################################## - -=pod - -=item &FormatStudentInformation() - -This function produces a formatted string of the student\'s information: -username, domain, section, full name, and PID. - -=over 4 - -Input: $cache, $name, $keyID, $spacePadding - -$cache: This is a pointer to a hash that is tied to the cached data - -$name: The name and domain of the current student in name:domain format - -$keyID: A pointer to an array holding the names used to - -remove data from the hash. They represent the name of the data to be removed. - -$spacePadding: Extra spaces that represent the space between columns - -Output: $Str - -$Str: Formatted string. - -=back - -=cut - -######################################################## -######################################################## -sub FormatStudentInformation { - my ($data,$name,$keyID,$displayString,$format)=@_; - my $Str=''; - my $currentColumn; - - for(my $index=0; $index<(scalar @$keyID); $index++) { - $currentColumn=$data->{$name.':'.$keyID->[$index]}; - - if($format eq 'preformatted') { - my @dataLength=split(//,$currentColumn); - my $length=scalar @dataLength; - $currentColumn.= (' 'x - ($data->{$keyID->[$index].':columnWidth'}-$length)); - } - - my $tempString = $displayString; - $tempString =~ s/DISPLAYDATA/$currentColumn/; - - $Str .= $tempString; - } - - return $Str; -} - ######################################################## ######################################################## @@ -755,6 +622,15 @@ Inputs =item $number_to_do The total number of items being processed. +=item $type Either 'popup' or 'inline' (popup is assumed if nothing is + specified) + +=item $width Specify the width in charaters of the input field. + +=item $formname Only useful in the inline case, if a form already exists, this needs to be used and specfiy the name of the form, otherwise the Progress line will be created in a new form of it's own + +=item $inputname Only useful in the inline case, if a form and an input of type text exists, use this to specify the name of the input field + =back Returns a hash containing the progress state data structure. @@ -823,38 +699,75 @@ Returns: none ######################################################## ######################################################## +my $uniq=0; +sub get_uniq_name { + $uniq++; + return 'uniquename'.$uniq; +} + # Create progress sub Create_PrgWin { - my ($r, $title, $heading, $number_to_do)=@_; - $r->print('"); + "popwin.document.close();}". + "\nwindow.setTimeout(openpopwin,0)"); + $prog_state{'formname'}='popremain'; + $prog_state{'inputname'}="remaining"; + } elsif ($type eq 'inline') { + $prog_state{'window'}='window'; + if (!$formname) { + $prog_state{'formname'}=&get_uniq_name(); + &r_print($r,'
'); + } else { + $prog_state{'formname'}=$formname; + } + if (!$inputname) { + $prog_state{'inputname'}=&get_uniq_name(); + &r_print($r,$heading.' '); + } else { + $prog_state{'inputname'}=$inputname; + + } + if (!$formname) { &r_print($r,'
'); } + &Update_PrgWin($r,\%prog_state,&mt('Starting')); + } - my %prog_state; $prog_state{'done'}=0; $prog_state{'firststart'}=&Time::HiRes::time(); $prog_state{'laststart'}=&Time::HiRes::time(); $prog_state{'max'}=$number_to_do; - - $r->rflush(); + return %prog_state; } # update progress sub Update_PrgWin { my ($r,$prog_state,$displayString)=@_; - $r->print(''); + &r_print($r,''); $$prog_state{'laststart'}=&Time::HiRes::time(); - $r->rflush(); } # increment progress state @@ -865,20 +778,22 @@ sub Increment_PrgWin { $$prog_state{'done'} * ($$prog_state{'max'}-$$prog_state{'done'}); $time_est = int($time_est); - if (int ($time_est/60) > 0) { - my $min = int($time_est/60); - my $sec = $time_est % 60; - $time_est = $min.' '.&mt('minutes'); - if ($min < 10) { - if ($sec > 1) { - $time_est.= ', '.$sec.' '.&mt('seconds'); - } elsif ($sec > 0) { - $time_est.= ', '.$sec.' '.&mt('second'); - } - } - } else { - $time_est .= ' '.&mt('seconds'); + # + my $min = int($time_est/60); + my $sec = $time_est % 60; + # + my $str; + if ($min == 1 && $sec > 1) { + $str = '[_2] seconds'; + } elsif ($min == 1 && $sec < 2) { + $str = '1 minute'; + } elsif ($min < 10 && $sec > 1) { + $str = '[_1] minutes, [_2] seconds'; + } elsif ($min >= 10 || $sec < 2) { + $str = '[_1] minutes'; } + $time_est = &mt($str,$min,$sec); + # my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'}; if ($lasttime > 9) { $lasttime = int($lasttime); @@ -902,35 +817,54 @@ sub Increment_PrgWin { if ($user_browser eq 'explorer' && $user_os =~ 'mac') { $lasttime = ''; } - $r->print(''); + &r_print($r,''); $$prog_state{'laststart'}=&Time::HiRes::time(); - $r->rflush(); } # close Progress Line sub Close_PrgWin { my ($r,$prog_state)=@_; - $r->print(''."\n"); + if ($$prog_state{'type'} eq 'popup') { + &r_print($r,''."\n"); + } elsif ($$prog_state{'type'} eq 'inline') { + &Update_PrgWin($r,$prog_state,&mt('Done')); + } undef(%$prog_state); - $r->rflush(); } +sub r_print { + my ($r,$to_print)=@_; + if ($r) { + $r->print($to_print); + $r->rflush(); + } else { + print($to_print); + } +} # ------------------------------------------------------- Puts directory header sub crumbs { - my ($uri,$target,$prefix,$form)=@_; - my $output='
'.$prefix.'/'; + my ($uri,$target,$prefix,$form,$size,$noformat)=@_; + if (! defined($size)) { + $size = '+2'; + } + my $output=''; + unless ($noformat) { $output.='
'; } + $output.=''.$prefix.'/'; if ($ENV{'user.adv'}) { - my $path=$prefix; + my $path=$prefix.'/'; foreach (split('/',$uri)) { unless ($_) { next; } - $path.='/'.$_; + $path.=$_; + unless ($path eq $uri) { $path.='/'; } my $linkpath=$path; if ($form) { - $linkpath="javascript:$form.action='$path/';$form.submit();"; + $linkpath="javascript:$form.action='$path';$form.submit();"; } $output.=''.$_.'/'; } @@ -938,9 +872,272 @@ sub crumbs { $output.=$uri; } unless ($uri=~/\/$/) { $output=~s/\/$//; } - return $output.'
'; + return $output.'
'.($noformat?'':'

'); +} + +# --------------------- A function that generates a window for the spellchecker + +sub spellheader { + my $nothing = &javascript_nothing(); + return (< +// BEGIN LON-CAPA Internal +var checkwin; + +function spellcheckerwindow() { + checkwin=window.open($nothing,'spellcheckwin','height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no'); + checkwin.document.writeln('
'); + checkwin.document.close(); +} +// END LON-CAPA Internal + +ENDCHECK +} + +# ---------------------------------- Generate link to spell checker for a field + +sub spelllink { + my ($form,$field)=@_; + my $linktext=&mt('Check Spelling'); + return (<$linktext +ENDLINK } +# ------------------------------------------------- Output headers for HTMLArea + +sub htmlareaheaders { + if (&htmlareablocked()) { return ''; } + unless (&htmlareabrowser()) { return ''; } + my $lang='en'; + if (&mt('htmlarea_lang') ne 'htmlarea_lang') { + $lang=&mt('htmlarea_lang'); + } + return (< +_editor_url='/htmlarea/'; +_editor_lang='$lang'; + + +ENDHEADERS +} + +# ------------------------------------------------- Activate additional buttons + +sub htmlareaaddbuttons { + if (&htmlareablocked()) { return ''; } + unless (&htmlareabrowser()) { return ''; } + return (<\$','\$ '); + } + ); + config.registerButton('ed_math_eqn','LaTeX Equation', + '/htmlarea/images/ed_math_eqn.gif',false, + function(editor,id) { + editor.surroundHTML( + ' \\n
\\\\[','\\\\]
\\n '); + } + ); + config.toolbar.push(['ed_math','ed_math_eqn']); +ENDADDBUTTON +} + +# ----------------------------------------------------------------- Preferences + +sub disablelink { + my @fields=@_; + if (defined($#fields)) { + unless ($#fields>=0) { return ''; } + } + return ''.&mt('Disable WYSIWYG Editor').''; +} + +sub enablelink { + my @fields=@_; + if (defined($#fields)) { + unless ($#fields>=0) { return ''; } + } + return ''.&mt('Enable WYSIWYG Editor').''; +} + +# ----------------------------------------- Script to activate only some fields + +sub htmlareaselectactive { + my @fields=@_; + unless (&htmlareabrowser()) { return ''; } + if (&htmlareablocked()) { return '
'.&enablelink(@fields); } + my $output='
". + &disablelink(@fields); + return $output; +} + +# --------------------------------------------------------------------- Blocked + +sub htmlareablocked { + unless ($ENV{'environment.wysiwygeditor'} eq 'on') { return 1; } + return 0; +} + +# ---------------------------------------- Browser capable of running HTMLArea? + +sub htmlareabrowser { + return 1; +} + +############################################################ +############################################################ + +=pod + +=item breadcrumbs + +Compiles the previously registered breadcrumbs into an series of links. +FAQ and BUG links will be placed on the left side of the table if they +are defined for the last registered breadcrumb. +Additionally supports a 'component', which will be displayed on the +right side of the table (without a link). +A link to help for the component will be included if one is specified. + +All inputs can be undef without problems. + +Inputs: $color (the background color of the table returned), + $component (the large text on the right side of the table), + $component_help + $function (role to get colors from) + $domain (domian of role) + $menulink (boolean, controls whether to include a link to /adm/menu) + +Returns a string containing breadcrumbs for the current page. + +=item clear_breadcrumbs + +Clears the previously stored breadcrumbs. + +=item add_breadcrumb + +Pushes a breadcrumb on the stack of crumbs. + +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 +links to the FAQ and bug sites. + +returns: nothing + +=cut + +############################################################ +############################################################ +{ + my @Crumbs; + + sub breadcrumbs { + my ($color,$component,$component_help,$function,$domain,$menulink, + $helplink) = @_; + if (! defined($color)) { + if (! defined($function)) { + $function = &Apache::loncommon::get_users_function(); + } + $color = &Apache::loncommon::designparm($function.'.tabbg', + $domain); + } + # + my $Str = "\n". + ''. + ''; + # + if (defined($component)) { + $Str .= ''; + } + $Str .= '
'. + ''; + # + # Make the faq and bug data cascade + my $faq = ''; + my $bug = ''; + # The last breadcrumb does not have a link, so handle it separately. + my $last = pop(@Crumbs); + # + # The first one should be the course or a menu link + if (!defined($menulink)) { $menulink=1; } + if ($menulink) { + my $description = 'Menu'; + if (exists($ENV{'request.course.id'}) && + $ENV{'request.course.id'} ne '') { + $description = + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; + } + unshift(@Crumbs,{ + href =>'/adm/menu', + title =>'Go to main menu', + target =>'_top', + text =>$description, + }); + } + my $links .= + join('->', + map { + $faq = $_->{'faq'} if (exists($_->{'faq'})); + $bug = $_->{'bug'} if (exists($_->{'bug'})); + my $result = '{'target'}) && $_->{'target'} ne '') { + $result .= 'target="'.$_->{'target'}.'" '; + } + $result .='title="'.&mt($_->{'title'}).'">'. + &mt($_->{'text'}).''; + $result; + } @Crumbs + ); + $links .= '->' if ($links ne ''); + $links .= ''.&mt($last->{'text'}).''; + # + my $icons = ''; + $faq = $last->{'faq'} if (exists($last->{'faq'})); + $bug = $last->{'bug'} if (exists($last->{'bug'})); +# if ($faq ne '') { +# $icons .= &Apache::loncommon::help_open_faq($faq); +# } +# if ($bug ne '') { +# $icons .= &Apache::loncommon::help_open_bug($bug); +# } + if ($helplink ne 'nohelp') { + $icons .= &Apache::loncommon::help_open_menu($color,$component,$component_help,$function,$faq,$bug); + } + if ($icons ne '') { + $Str .= $icons.' '; + } + # + $Str .= $links.''. + ''.&mt($component).'
'."\n"; + # + # Return the @Crumbs stack to what we started with + push(@Crumbs,$last); + shift(@Crumbs); + # + return $Str; + } + + sub clear_breadcrumbs { + undef(@Crumbs); + } + + sub add_breadcrumb { + push (@Crumbs,@_); + } + +} # End of scope for @Crumbs + +############################################################ +############################################################ + 1; 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.