--- loncom/interface/lonhtmlcommon.pm 2007/03/12 18:09:36 1.157 +++ loncom/interface/lonhtmlcommon.pm 2008/05/29 00:19:30 1.174 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.157 2007/03/12 18:09:36 albertel Exp $ +# $Id: lonhtmlcommon.pm,v 1.174 2008/05/29 00:19:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -140,6 +140,7 @@ sub select_recent { foreach my $value (sort(keys(%recent))) { unless ($value =~/^error\:/) { my $escaped = &Apache::loncommon::escape_url($value); + &Apache::loncommon::inhibit_menu_check(\$escaped); $return.="\n<option value='$escaped'>". &unescape((split(/\&/,$recent{$value}))[1]). '</option>'; @@ -462,16 +463,21 @@ ENDJS $cal_link = qq{<a href="javascript:$dname\_opencalendar()">}; } # + my $dt = DateTime->from_epoch(epoch => $currentvalue) + ->set_time_zone(&Apache::lonlocal::gettimezone()); + my $tzone = ' '.$dt->time_zone_short_name().' '; if ($no_hh_mm_ss) { $result .= &mt('[_1] [_2] [_3] ', - $monthselector,$dayselector,$yearselector); + $monthselector,$dayselector,$yearselector). + $tzone; if (!$nolink) { $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>'); } } else { $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ', $monthselector,$dayselector,$yearselector, - $hourselector,$minuteselector,$secondselector); + $hourselector,$minuteselector,$secondselector). + $tzone; if (!$nolink) { $result .= &mt('[_1]Select Date[_2]',$cal_link,'</a>'); } @@ -480,6 +486,19 @@ ENDJS return $result; } + +sub build_url { + my ($base, $fields)=@_; + my $url; + $url = $base.'?'; + foreach my $key (keys(%$fields)) { + $url.=&escape($key).'='.&escape($$fields{$key}).'&'; + } + $url =~ s/&$//; + return $url; +} + + ############################################## ############################################## @@ -631,6 +650,8 @@ sub javascript_nothing { ############################################## ############################################## sub javascript_docopen { + my ($mimetype) = @_; + $mimetype ||= 'text/html'; # safari does not understand document.open() and loads "text/html" my $nothing = "''"; my $user_browser; @@ -644,7 +665,7 @@ sub javascript_docopen { if ($user_browser eq 'safari' && $user_os =~ 'mac') { $nothing = "document.clear()"; } else { - $nothing = "document.open('text/html','replace')"; + $nothing = "document.open('$mimetype','replace')"; } return $nothing; } @@ -681,7 +702,7 @@ Returns: a perl string as described. ############################################## ############################################## sub StatusOptions { - my ($status, $formName,$size,$onchange)=@_; + my ($status, $formName,$size,$onchange,$mult)=@_; $size = 1 if (!defined($size)); if (! defined($status)) { $status = 'Active'; @@ -690,6 +711,9 @@ sub StatusOptions { my $Str = ''; $Str .= '<select name="Status"'; + if (defined($mult)){ + $Str .= ' multiple="multiple" '; + } if(defined($formName) && $formName ne '' && ! defined($onchange)) { $Str .= ' onchange="document.'.$formName.'.submit()"'; } @@ -851,8 +875,8 @@ sub Create_PrgWin { function openpopwin () { popwin=open(\'\',\'popwin\',\'width=400,height=100\');". "popwin.document.writeln(\'".$start_page. - "<h4>$heading<\/h4>". - "<form name=\"popremain\" method=\"post\">". + "<h4>".&mt("$heading")."<\/h4>". + "<form action= \"\" name=\"popremain\" method=\"post\">". '<input type="text" size="'.$width.'" name="remaining" value="'. &mt('Starting').'" /><\\/form>'.$end_page. "\');". @@ -864,14 +888,13 @@ sub Create_PrgWin { $prog_state{'window'}='window'; if (!$formname) { $prog_state{'formname'}=&get_uniq_name(); - &r_print($r,'<form name="'.$prog_state{'formname'}.'">'); + &r_print($r,'<form action="" 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.'" />'); + &r_print($r,&mt("$heading [_1]",' <input type="text" name="'.$prog_state{'inputname'}.'" size="'.$width.'" />')); } else { $prog_state{'inputname'}=$inputname; @@ -891,7 +914,7 @@ sub Create_PrgWin { # update progress sub Update_PrgWin { 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{'inputname'}.'.value="'. $displayString.'";</script>'); @@ -1003,13 +1026,14 @@ sub crumbs { } else { $path.='/'; } - my $linkpath = &Apache::loncommon::escape_single($path); - if ($form) { - $linkpath= - qq{javascript:$form.action='$linkpath';$form.submit();}; - } my $href_path = &HTML::Entities::encode($path,'<>&"'); - $output.=qq{<a href="$path" $target>$dir</a>/}; + &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>/}; + } } } else { foreach my $dir (split('/',$uri)) { @@ -1083,46 +1107,13 @@ ENDLINK } sub htmlareaheaders { - if (&htmlareablocked()) { return ''; } - unless (&htmlareabrowser()) { return ''; } - my $lang='en'; - if (&mt('htmlarea_lang') ne 'htmlarea_lang') { - $lang=&mt('htmlarea_lang'); - } + return if (&htmlareablocked()); + return if (!&htmlareabrowser()); return (<<ENDHEADERS); -<script type="text/javascript"> -_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" /> +<script type="text/javascript" src="/fckeditor/fckeditor.js"></script> 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(' <m>\$','\$</m> '); - } - ); - config.registerButton('ed_math_eqn','LaTeX Equation', - '/htmlarea/images/ed_math_eqn.gif',false, - function(editor,id) { - editor.surroundHTML( - ' \\n<center><m>\\\\[','\\\\]</m></center>\\n '); - } - ); - config.toolbar.push(['ed_math','ed_math_eqn']); -ENDADDBUTTON -} - # ----------------------------------------------------------------- Preferences sub disablelink { @@ -1141,16 +1132,33 @@ 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>'; } +# ------------------------------------------------- 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 sub htmlareaselectactive { my @fields=@_; unless (&htmlareabrowser()) { return ''; } if (&htmlareablocked()) { return '<br />'.&enablelink(@fields); } - my $output='<script type="text/javascript" defer="1">'. - &htmlareaaddbuttons(); - foreach(@fields) { - $output.="\nHTMLArea.replace('$_',config);"; + my $output='<script type="text/javascript" defer="1">'; + my $lang = &htmlarea_lang(); + foreach my $field (@fields) { + $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 />". &disablelink(@fields); @@ -1232,16 +1240,19 @@ returns: nothing if (!defined($menulink)) { $menulink=1; } if ($menulink) { my $description = 'Menu'; + my $no_mt_descr = 0; if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') { $description = $env{'course.'.$env{'request.course.id'}.'.description'}; + $no_mt_descr = 1; } unshift(@Crumbs,{ href =>'/adm/menu', title =>'Go to main menu', target =>'_top', text =>$description, + no_mt =>$no_mt_descr, }); } my $links .= @@ -1331,8 +1342,8 @@ returns: nothing # row1 # row2 # row3 ... etc. -# &submit_row(0 -# &end_pickbox() +# &submit_row() +# &end_pick_box() # # where row1, row 2 etc. are chosen from &role_select_row,&course_select_row, # &status_select_row and &email_default_row @@ -1401,10 +1412,13 @@ sub row_title { $css_value_class ||= 'LC_pick_box_value'; $css_value_class = 'class="'.$css_value_class.'"'; + if ($title ne '') { + $title .= ':'; + } my $output = <<"ENDONE"; <tr class="LC_pick_box_row"> <td $css_title_class> - $title: + $title </td> <td $css_value_class> ENDONE @@ -1471,7 +1485,14 @@ sub course_select_row { my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles, $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"> function coursePick (formname) { for (var i=0; i<formname.coursepick.length; i++) { @@ -1544,8 +1565,7 @@ sub course_select_row { $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.' <input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br />'."\n"; - $output .= &row_closure(); + $output .= '<input type="radio" name="coursepick" value="specific" onclick="coursePick(this.form);opencrsbrowser('."'".$formname."','dccourse','dcdomain','coursedesc','','1'".')" />'.&mt('Pick specific course(s):').' '.$courseform.' <input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br />'."\n"; return $output; } @@ -1570,7 +1590,6 @@ sub status_select_row { sub email_default_row { my ($authtypes,$title,$descrip,$css_class) = @_; my $output = &row_title($title,$css_class); - my @rowcols = ('#eeeeee','#dddddd'); $output .= $descrip. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). @@ -1841,6 +1860,43 @@ sub set_form_elements { 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; +} + 1; __END__