version 1.46, 2004/02/12 22:23:30
|
version 1.62, 2004/04/06 15:07:41
|
Line 56 html.
|
Line 56 html.
|
package Apache::lonhtmlcommon; |
package Apache::lonhtmlcommon; |
|
|
use Time::Local; |
use Time::Local; |
|
use Time::HiRes; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use strict; |
use strict; |
|
|
|
|
############################################## |
############################################## |
############################################## |
############################################## |
|
|
Line 201 Also, to be explicit, a value of 'now' a
|
Line 201 Also, to be explicit, a value of 'now' a
|
Additional html/javascript to be associated with each element in |
Additional html/javascript to be associated with each element in |
the date_setter. See lonparmset for example usage. |
the date_setter. See lonparmset for example usage. |
|
|
|
=item $includeempty |
|
|
|
=item $state |
|
|
|
Specifies the initial state of the form elements. Either 'disabled' or empty. |
|
Defaults to empty, which indiciates the form elements are not disabled. |
|
|
=back |
=back |
|
|
Bugs |
Bugs |
Line 212 The method used to restrict user input w
|
Line 219 The method used to restrict user input w
|
############################################## |
############################################## |
############################################## |
############################################## |
sub date_setter { |
sub date_setter { |
my ($formname,$dname,$currentvalue,$special,$includeempty) = @_; |
my ($formname,$dname,$currentvalue,$special,$includeempty,$state) = @_; |
|
if (! defined($state) || $state ne 'disabled') { |
|
$state = ''; |
|
} |
if (! defined($currentvalue) || $currentvalue eq 'now') { |
if (! defined($currentvalue) || $currentvalue eq 'now') { |
unless ($includeempty) { |
unless ($includeempty) { |
$currentvalue = time; |
$currentvalue = time; |
Line 261 sub date_setter {
|
Line 271 sub date_setter {
|
} |
} |
} |
} |
|
|
|
function $dname\_disable() { |
|
document.$formname.$dname\_month.disabled=true; |
|
document.$formname.$dname\_day.disabled=true; |
|
document.$formname.$dname\_year.disabled=true; |
|
document.$formname.$dname\_hour.disabled=true; |
|
document.$formname.$dname\_minute.disabled=true; |
|
document.$formname.$dname\_second.disabled=true; |
|
} |
|
|
|
function $dname\_enable() { |
|
document.$formname.$dname\_month.disabled=false; |
|
document.$formname.$dname\_day.disabled=false; |
|
document.$formname.$dname\_year.disabled=false; |
|
document.$formname.$dname\_hour.disabled=false; |
|
document.$formname.$dname\_minute.disabled=false; |
|
document.$formname.$dname\_second.disabled=false; |
|
} |
|
|
function $dname\_opencalendar() { |
function $dname\_opencalendar() { |
var calwin=window.open( |
if (! document.$formname.$dname\_month.disabled) { |
|
var calwin=window.open( |
"/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+ |
"/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+ |
document.$formname.$dname\_month.value+"&year="+ |
document.$formname.$dname\_month.value+"&year="+ |
document.$formname.$dname\_year.value, |
document.$formname.$dname\_year.value, |
"LONCAPAcal", |
"LONCAPAcal", |
"height=350,width=350,scrollbars=yes,resizable=yes,menubar=no"); |
"height=350,width=350,scrollbars=yes,resizable=yes,menubar=no"); |
|
} |
|
|
} |
} |
</script> |
</script> |
ENDJS |
ENDJS |
$result .= " <nobr><select name=\"$dname\_month\" ".$special.' '. |
$result .= " <nobr><select name=\"$dname\_month\" ".$special.' '. |
|
$state.' '. |
"onChange=\"javascript:$dname\_checkday()\" >\n"; |
"onChange=\"javascript:$dname\_checkday()\" >\n"; |
my @Months = qw/January February March April May June |
my @Months = qw/January February March April May June |
July August September October November December/; |
July August September October November December/; |
Line 285 ENDJS
|
Line 316 ENDJS
|
$result .= "> ".&mt($Months[$m])." </option>\n"; |
$result .= "> ".&mt($Months[$m])." </option>\n"; |
} |
} |
$result .= " </select>\n"; |
$result .= " </select>\n"; |
$result .= " <input type=\"text\" name=\"$dname\_day\" ". |
$result .= " <input type=\"text\" name=\"$dname\_day\" ".$state.' '. |
"value=\"$mday\" size=\"3\" ".$special.' '. |
"value=\"$mday\" size=\"3\" ".$special.' '. |
"onChange=\"javascript:$dname\_checkday()\" />\n"; |
"onChange=\"javascript:$dname\_checkday()\" />\n"; |
$result .= " <input type=\"year\" name=\"$dname\_year\" ". |
$result .= " <input type=\"year\" name=\"$dname\_year\" ".$state.' '. |
"value=\"$year\" size=\"5\" ".$special.' '. |
"value=\"$year\" size=\"5\" ".$special.' '. |
"onChange=\"javascript:$dname\_checkday()\" />\n"; |
"onChange=\"javascript:$dname\_checkday()\" />\n"; |
$result .= " "; |
$result .= " "; |
$result .= " <select name=\"$dname\_hour\" ".$special." >\n"; |
$result .= " <select name=\"$dname\_hour\" ".$special." ".$state.' '.">\n"; |
if ($includeempty) { $result.="<option value=''></option>"; } |
if ($includeempty) { $result.="<option value=''></option>"; } |
for (my $h = 0;$h<24;$h++) { |
for (my $h = 0;$h<24;$h++) { |
$result .= " <option value=\"$h\" "; |
$result .= " <option value=\"$h\" "; |
Line 313 ENDJS
|
Line 344 ENDJS
|
} |
} |
$result .= " </select>\n"; |
$result .= " </select>\n"; |
$result .= " <input type=\"text\" name=\"$dname\_minute\" ".$special.' '. |
$result .= " <input type=\"text\" name=\"$dname\_minute\" ".$special.' '. |
|
$state.' '. |
"value=\"$min\" size=\"3\" /> m\n"; |
"value=\"$min\" size=\"3\" /> m\n"; |
$result .= " <input type=\"text\" name=\"$dname\_second\" ".$special.' '. |
$result .= " <input type=\"text\" name=\"$dname\_second\" ".$special.' '. |
|
$state.' '. |
"value=\"$sec\" size=\"3\" /> s\n"; |
"value=\"$sec\" size=\"3\" /> s\n"; |
$result .= "<a href=\"javascript:$dname\_opencalendar()\">". |
$result .= "<a href=\"javascript:$dname\_opencalendar()\">". |
&mt('Select Date')."</a></nobr>\n<!-- end $dname date setting form -->\n"; |
&mt('Select Date')."</a></nobr>\n<!-- end $dname date setting form -->\n"; |
Line 556 Inputs
|
Line 589 Inputs
|
|
|
=item $number_to_do The total number of items being processed. |
=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 |
=back |
|
|
Returns a hash containing the progress state data structure. |
Returns a hash containing the progress state data structure. |
Line 624 Returns: none
|
Line 666 Returns: none
|
######################################################## |
######################################################## |
######################################################## |
######################################################## |
|
|
|
my $uniq=0; |
|
sub get_uniq_name { |
|
$uniq++; |
|
return 'uniquename'.$uniq; |
|
} |
|
|
# Create progress |
# Create progress |
sub Create_PrgWin { |
sub Create_PrgWin { |
my ($r, $title, $heading, $number_to_do)=@_; |
my ($r, $title, $heading, $number_to_do,$type,$width,$formname, |
#the whole function called through timeout is due to issues |
$inputname)=@_; |
#in mozilla Read BUG #2665 if you want to know the whole story |
if (!defined($type)) { $type='popup'; } |
$r->print('<script>'. |
if (!defined($width)) { $width=55; } |
"var popwin; |
my %prog_state; |
function openpopwin () { |
$prog_state{'type'}=$type; |
popwin=open(\'\',\'popwin\',\'width=400,height=100\');". |
if ($type eq 'popup') { |
"popwin.document.writeln(\'<html><head><title>$title</title></head>". |
$prog_state{'window'}='popwin'; |
|
#the whole function called through timeout is due to issues |
|
#in mozilla Read BUG #2665 if you want to know the whole story |
|
&r_print($r,'<script>'. |
|
"var popwin; |
|
function openpopwin () { |
|
popwin=open(\'\',\'popwin\',\'width=400,height=100\');". |
|
"popwin.document.writeln(\'<html><head><title>$title</title></head>". |
"<body bgcolor=\"#88DDFF\">". |
"<body bgcolor=\"#88DDFF\">". |
"<h4>$heading</h4>". |
"<h4>$heading</h4>". |
"<form name=popremain>". |
"<form name=popremain>". |
'<input type="text" size="55" name="remaining" value="'. |
'<input type="text" size="'.$width.'" name="remaining" value="'. |
&mt('Starting').'"></form>'. |
&mt('Starting').'"></form>'. |
"</body></html>\');". |
"</body></html>\');". |
"popwin.document.close();}". |
"popwin.document.close();}". |
"\nwindow.setTimeout(openpopwin,0)</script>"); |
"\nwindow.setTimeout(openpopwin,0)</script>"); |
|
$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,'<form name="'.$prog_state{'formname'}.'">'); |
|
} else { |
|
$prog_state{'formname'}=$formname; |
|
} |
|
if (!$inputname) { |
|
$prog_state{'inputname'}=&get_uniq_name(); |
|
&r_print($r,$heading.' <input type="text" name="'.$prog_state{'inputname'}. |
|
'" size="'.$width.'" />'); |
|
} else { |
|
$prog_state{'inputname'}=$inputname; |
|
|
|
} |
|
if (!$formname) { &r_print($r,'</form>'); } |
|
&Update_PrgWin($r,\%prog_state,&mt('Starting')); |
|
} |
|
|
my %prog_state; |
|
$prog_state{'done'}=0; |
$prog_state{'done'}=0; |
$prog_state{'firststart'}=&Time::HiRes::time(); |
$prog_state{'firststart'}=&Time::HiRes::time(); |
$prog_state{'laststart'}=&Time::HiRes::time(); |
$prog_state{'laststart'}=&Time::HiRes::time(); |
$prog_state{'max'}=$number_to_do; |
$prog_state{'max'}=$number_to_do; |
|
|
$r->rflush(); |
|
return %prog_state; |
return %prog_state; |
} |
} |
|
|
# update progress |
# update progress |
sub Update_PrgWin { |
sub Update_PrgWin { |
my ($r,$prog_state,$displayString)=@_; |
my ($r,$prog_state,$displayString)=@_; |
$r->print('<script>popwin.document.popremain.remaining.value="'. |
&r_print($r,'<script>'.$$prog_state{'window'}.'.document.'. |
$displayString.'";</script>'); |
$$prog_state{'formname'}.'.'. |
|
$$prog_state{'inputname'}.'.value="'. |
|
$displayString.'";</script>'); |
$$prog_state{'laststart'}=&Time::HiRes::time(); |
$$prog_state{'laststart'}=&Time::HiRes::time(); |
$r->rflush(); |
|
} |
} |
|
|
# increment progress state |
# increment progress state |
Line 707 sub Increment_PrgWin {
|
Line 782 sub Increment_PrgWin {
|
if ($user_browser eq 'explorer' && $user_os =~ 'mac') { |
if ($user_browser eq 'explorer' && $user_os =~ 'mac') { |
$lasttime = ''; |
$lasttime = ''; |
} |
} |
$r->print('<script>popwin.document.popremain.remaining.value="'. |
&r_print($r,'<script>'.$$prog_state{'window'}.'.document.'. |
$$prog_state{'done'}.'/'.$$prog_state{'max'}. |
$$prog_state{'formname'}.'.'. |
': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";'.'</script>'); |
$$prog_state{'inputname'}.'.value="'. |
|
$$prog_state{'done'}.'/'.$$prog_state{'max'}. |
|
': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";'.'</script>'); |
$$prog_state{'laststart'}=&Time::HiRes::time(); |
$$prog_state{'laststart'}=&Time::HiRes::time(); |
$r->rflush(); |
|
} |
} |
|
|
# close Progress Line |
# close Progress Line |
sub Close_PrgWin { |
sub Close_PrgWin { |
my ($r,$prog_state)=@_; |
my ($r,$prog_state)=@_; |
$r->print('<script>popwin.close()</script>'."\n"); |
if ($$prog_state{'type'} eq 'popup') { |
|
&r_print($r,'<script>popwin.close()</script>'."\n"); |
|
} elsif ($$prog_state{'type'} eq 'inline') { |
|
&Update_PrgWin($r,$prog_state,&mt('Done')); |
|
} |
undef(%$prog_state); |
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 |
# ------------------------------------------------------- Puts directory header |
|
|
sub crumbs { |
sub crumbs { |
my ($uri,$target,$prefix,$form)=@_; |
my ($uri,$target,$prefix,$form,$size)=@_; |
my $output='<br /><tt><b><font size="+2">'.$prefix.'/'; |
if (! defined($size)) { |
|
$size = '+2'; |
|
} |
|
my $output='<br /><tt><b><font size="'.$size.'">'.$prefix.'/'; |
if ($ENV{'user.adv'}) { |
if ($ENV{'user.adv'}) { |
my $path=$prefix.'/'; |
my $path=$prefix.'/'; |
foreach (split('/',$uri)) { |
foreach (split('/',$uri)) { |
Line 747 sub crumbs {
|
Line 838 sub crumbs {
|
return $output.'</font></b></tt><br />'; |
return $output.'</font></b></tt><br />'; |
} |
} |
|
|
|
# ------------------------------------------------- Output headers for HTMLArea |
|
|
|
sub htmlareaheaders { |
|
unless (&htmlareablocked()) { return ''; } |
|
my $lang='en'; |
|
return (<<ENDHEADERS); |
|
<script type="text/javascript"> |
|
_editor_url="/htmlarea/"; |
|
</script> |
|
<script type="text/javascript" src="/htmlarea/htmlarea.js"></script> |
|
<script type="text/javascript" src="/htmlarea/lang/$lang.js"></script> |
|
<script type="text/javascript" src="/htmlarea/dialog.js"></script> |
|
<style type="text/css"> |
|
\@import url(/htmlarea/htmlarea.css); |
|
</style> |
|
ENDHEADERS |
|
} |
|
|
|
# ---------------------------------------------------------- Script to activate |
|
|
|
sub htmlareaactive { |
|
unless (&htmlareablocked()) { return ''; } |
|
return (<<ENDSCRIPT); |
|
<script type="text/javascript" defer="1"> |
|
HTMLArea.replaceAll(); |
|
</script> |
|
ENDSCRIPT |
|
} |
|
|
|
# --------------------------------------------------------------------- Blocked |
|
|
|
sub htmlareablocked { |
|
unless (&htmlareabrowser()) { return ''; } |
|
return 1; |
|
} |
|
|
|
# ---------------------------------------- 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 |
|
|
|
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) = @_; |
|
if (! defined($color)) { |
|
if (! defined($function)) { |
|
$function = &Apache::loncommon::get_users_function(); |
|
} |
|
$color = &Apache::loncommon::designparm($function.'.tabbg', |
|
$domain); |
|
} |
|
# |
|
my $Str = "\n". |
|
'<table width="100%" border="0" cellpadding="0" cellspacing="0">'. |
|
'<tr><td bgcolor="'.$color.'">'. |
|
'<font size="-1">'; |
|
# |
|
# 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, I guess. |
|
if (exists($ENV{'request.course.id'})) { |
|
my $cid = $ENV{'request.course.id'}; |
|
unshift(@Crumbs,{ |
|
href=>'/adm/menu', |
|
title=>'Go to main menu', |
|
text=>$ENV{'course.'.$cid.'.description'}, |
|
}); |
|
} |
|
my $links .= |
|
join('->', |
|
map { |
|
$faq = $_->{'faq'} if (exists($_->{'faq'})); |
|
$bug = $_->{'bug'} if (exists($_->{'bug'})); |
|
'<a href="'.$_->{'href'}.'" title="'.&mt($_->{'title'}).'">'. |
|
&mt($_->{'text'}).'</a>' |
|
} @Crumbs |
|
); |
|
$links .= '->' if ($links ne ''); |
|
$links .= '<b>'.$last->{'text'}.'</b>'; |
|
# |
|
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 ($icons ne '') { |
|
$Str .= $icons.' '; |
|
} |
|
# |
|
$Str .= $links.'</font></td>'; |
|
# |
|
if (defined($component)) { |
|
$Str .= '<td align="right" bgcolor="'.$color.'">'. |
|
'<font size="+1">'.&mt($component).'</font>'; |
|
if (defined($component_help)) { |
|
$Str .= |
|
&Apache::loncommon::help_open_topic($component_help); |
|
} |
|
$Str.= '</td>'; |
|
} |
|
$Str .= '</tr></table>'."\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; |
1; |
|
|