--- loncom/interface/lonhtmlcommon.pm 2004/02/16 22:28:55 1.49 +++ loncom/interface/lonhtmlcommon.pm 2005/05/28 00:35:47 1.105 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.49 2004/02/16 22:28:55 albertel Exp $ +# $Id: lonhtmlcommon.pm,v 1.105 2005/05/28 00:35:47 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -55,11 +55,11 @@ html. package Apache::lonhtmlcommon; +use strict; use Time::Local; use Time::HiRes; use Apache::lonlocal; -use strict; - +use Apache::lonnet; ############################################## ############################################## @@ -81,7 +81,7 @@ sub authorbombs { foreach (keys %bombs) { if ($_=~/^$udom\/$uname\//) { return ''. + '">'. &Apache::loncommon::help_open_topic('About_Bombs'); } } @@ -118,15 +118,22 @@ 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)); my $return="\n'; + my ($name,$checked,$value) = @_; + my $Str = ' ENDJS - $result .= " }; + # Month my @Months = qw/January February March April May June July August September October November December/; # Pad @Months with a bogus value to make indexing easier unshift(@Months,'If you can read this an error occurred'); - if ($includeempty) { $result.=""; } + if ($includeempty) { $monthselector.=""; } for(my $m = 1;$m <=$#Months;$m++) { - $result .= " \n\n"; + $timest=&mt($timest); + $hourselector .= $timest." \n"; + } + $hourselector .= " \n"; + my $minuteselector = qq{}; + my $secondselector= qq{}; + my $cal_link = qq{}; + # + if ($no_hh_mm_ss) { + $result .= &mt('[_1] [_2] [_3] [_4]Select Date[_5]', + $monthselector,$dayselector,$yearselector, + $cal_link,''); + } else { + $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s [_7]Select Date[_8]', + $monthselector,$dayselector,$yearselector, + $hourselector,$minuteselector,$secondselector, + $cal_link,''); + } + $result .= "\n\n"; return $result; } @@ -355,38 +436,46 @@ sub get_date_from_form { my ($dname) = @_; my ($sec,$min,$hour,$day,$month,$year); # - if (defined($ENV{'form.'.$dname.'_second'})) { - my $tmpsec = $ENV{'form.'.$dname.'_second'}; + if (defined($env{'form.'.$dname.'_second'})) { + my $tmpsec = $env{'form.'.$dname.'_second'}; 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 (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 (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'}; + if (defined($env{'form.'.$dname.'_day'})) { + my $tmpday = $env{'form.'.$dname.'_day'}; if (($tmpday =~ /^\d+$/) && ($tmpday > 0) && ($tmpday < 32)) { $day = $tmpday; } } - if (defined($ENV{'form.'.$dname.'_month'})) { - my $tmpmonth = $ENV{'form.'.$dname.'_month'}; + if (defined($env{'form.'.$dname.'_month'})) { + my $tmpmonth = $env{'form.'.$dname.'_month'}; if (($tmpmonth =~ /^\d+$/) && ($tmpmonth > 0) && ($tmpmonth < 13)) { $month = $tmpmonth - 1; } } - if (defined($ENV{'form.'.$dname.'_year'})) { - my $tmpyear = $ENV{'form.'.$dname.'_year'}; + if (defined($env{'form.'.$dname.'_year'})) { + my $tmpyear = $env{'form.'.$dname.'_year'}; if (($tmpyear =~ /^\d+$/) && ($tmpyear > 1900)) { $year = $tmpyear - 1900; } @@ -448,8 +537,8 @@ sub javascript_nothing { my $nothing = "''"; my $user_browser; my $user_os; - $user_browser = $ENV{'browser.type'} if (exists($ENV{'browser.type'})); - $user_os = $ENV{'browser.os'} if (exists($ENV{'browser.os'})); + $user_browser = $env{'browser.type'} if (exists($env{'browser.type'})); + $user_os = $env{'browser.os'} if (exists($env{'browser.os'})); if (! defined($user_browser) || ! defined($user_os)) { (undef,$user_browser,undef,undef,undef,$user_os) = &Apache::loncommon::decode_user_agent(); @@ -460,6 +549,27 @@ sub javascript_nothing { return $nothing; } +############################################## +############################################## +sub javascript_docopen { + # safari does not understand document.open() and loads "text/html" + my $nothing = "''"; + my $user_browser; + my $user_os; + $user_browser = $env{'browser.type'} if (exists($env{'browser.type'})); + $user_os = $env{'browser.os'} if (exists($env{'browser.os'})); + if (! defined($user_browser) || ! defined($user_os)) { + (undef,$user_browser,undef,undef,undef,$user_os) = + &Apache::loncommon::decode_user_agent(); + } + if ($user_browser eq 'safari' && $user_os =~ 'mac') { + $nothing = "document.clear()"; + } else { + $nothing = "document.open('text/html','replace')"; + } + return $nothing; +} + ############################################## ############################################## @@ -474,7 +584,7 @@ enrollment status of students. The sele Inputs: $status: the currently selected status. If undefined the value of -$ENV{'form.Status'} is taken. If that is undefined, a value of 'Active' +$env{'form.Status'} is taken. If that is undefined, a value of 'Active' is used. $formname: The name of the form. If defined the onchange attribute of @@ -496,7 +606,7 @@ sub StatusOptions { $size = 1 if (!defined($size)); if (! defined($status)) { $status = 'Active'; - $status = $ENV{'form.Status'} if (exists($ENV{'form.Status'})); + $status = $env{'form.Status'} if (exists($env{'form.Status'})); } my $OpSel1 = ''; @@ -557,6 +667,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. @@ -625,25 +744,34 @@ 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,$type,$formname,$inputname)=@_; + my ($r, $title, $heading, $number_to_do,$type,$width,$formname, + $inputname)=@_; if (!defined($type)) { $type='popup'; } + if (!defined($width)) { $width=55; } my %prog_state; $prog_state{'type'}=$type; if ($type eq 'popup') { $prog_state{'window'}='popwin'; + my $html=&Apache::lonxml::xmlbegin(); #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,' +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;