--- loncom/interface/loncommon.pm 2008/12/18 08:33:11 1.723 +++ loncom/interface/loncommon.pm 2009/02/13 17:26:55 1.746 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.723 2008/12/18 08:33:11 riegler Exp $ +# $Id: loncommon.pm,v 1.746 2009/02/13 17:26:55 neumanie Exp $ # # Copyright Michigan State University Board of Trustees # @@ -943,24 +943,30 @@ ENDTEMPLATE # This is a quicky function for Latex cheatsheet editing, since it # appears in at least four places sub helpLatexCheatsheet { - my $other = shift; + my ($topic,$text,$not_author) = @_; + my $out; my $addOther = ''; - if ($other) { - $addOther = Apache::loncommon::help_open_topic($other, shift, - undef, undef, 600) . + if ($topic) { + $addOther = &Apache::loncommon::help_open_topic($topic,$text, + undef, undef, 600). '</td><td>'; } - return '<table><tr><td>'. - $addOther . - &Apache::loncommon::help_open_topic("Greek_Symbols",&mt('Greek Symbols'), - undef,undef,600) - .'</td><td>'. - &Apache::loncommon::help_open_topic("Other_Symbols",&mt('Other Symbols'), - undef,undef,600) - .'</td><td>'. - &Apache::loncommon::help_open_topic("Authoring_Output_Tags",&mt('Output Tags'), - undef,undef,600) - .'</td></tr></table>'; + $out = '<table><tr><td>'. + $addOther . + &Apache::loncommon::help_open_topic("Greek_Symbols",&mt('Greek Symbols'), + undef,undef,600). + '</td><td>'. + &Apache::loncommon::help_open_topic("Other_Symbols",&mt('Other Symbols'), + undef,undef,600). + '</td>'; + unless ($not_author) { + $out .= '<td>'. + &Apache::loncommon::help_open_topic("Authoring_Output_Tags",&mt('Output Tags'), + undef,undef,600). + '</td>'; + } + $out .= '</tr></table>'; + return $out; } sub general_help { @@ -1629,7 +1635,7 @@ sub multiple_select_form { $size = scalar(keys(%$hash)); } } - $output.="\n<select name='$name' size='$size' multiple='1'>"; + $output.="\n".'<select name="'.$name.'" size="'.$size.'" multiple="multiple">'; my @order; if (ref($order) eq 'ARRAY') { @order = @{$order}; @@ -1740,7 +1746,7 @@ sub select_level_form { =pod -=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc) +=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$autosubmit) Returns a string containing a <select name='$name' size='1'> form to allow a user to select the domain to preform an operation in. @@ -1749,16 +1755,22 @@ See loncreateuser.pm for an example invo If the $includeempty flag is set, it also includes an empty choice ("no domain selected"); -If the $showdomdesc flag is set, the domain name is followed by the domain description. +If the $showdomdesc flag is set, the domain name is followed by the domain description. + +If the $autosubmit flag is set, the form containing the domain selector will be auto-submitted by an onchange action. =cut #------------------------------------------- sub select_dom_form { - my ($defdom,$name,$includeempty,$showdomdesc) = @_; + my ($defdom,$name,$includeempty,$showdomdesc,$autosubmit) = @_; + my $onchange; + if ($autosubmit) { + $onchange = ' onchange="this.form.submit()"'; + } my @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); if ($includeempty) { @domains=('',@domains); } - my $selectdomain = "<select name=\"$name\" size=\"1\">\n"; + my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n"; foreach my $dom (@domains) { $selectdomain.="<option value=\"$dom\" ". ($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom; @@ -2717,6 +2729,43 @@ sub flush_email_cache { &Apache::lonnet::devalidate_cache_new('emailscache',$id); } +# -------------------------------------------------------------------- getlangs + +=pod + +=item * &getlangs($uname,$udom) + +Gets a user's language preference and returns it as a hash with key: +language. + +=cut + + +sub getlangs { + my ($uname,$udom) = @_; + if (!$udom) { $udom =$env{'user.domain'}; } + if (!$uname) { $uname=$env{'user.name'}; } + my $id=$uname.':'.$udom; + my ($langs,$cached)=&Apache::lonnet::is_cached_new('userlangs',$id); + if ($cached) { + return %{$langs}; + } else { + my %loadlangs=&Apache::lonnet::get('environment',['languages'], + $udom,$uname); + &Apache::lonnet::do_cache_new('userlangs',$id,\%loadlangs); + return %loadlangs; + } +} + +sub flush_langs_cache { + my ($uname,$udom)=@_; + if (!$udom) { $udom =$env{'user.domain'}; } + if (!$uname) { $uname=$env{'user.name'}; } + return if ($udom eq 'public' && $uname eq 'public'); + my $id=$uname.':'.$udom; + &Apache::lonnet::devalidate_cache_new('userlangs',$id); +} + # ------------------------------------------------------------------ Screenname =pod @@ -3030,6 +3079,29 @@ sub languages { return $preferred_possibilities[0]; } +sub user_lang { + my ($touname,$toudom,$fromcid) = @_; + my @userlangs; + if (($fromcid ne '') && ($env{'course.'.$fromcid.'.languages'} ne '')) { + @userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/, + $env{'course.'.$fromcid.'.languages'})); + } else { + my %langhash = &getlangs($touname,$toudom); + if ($langhash{'languages'} ne '') { + @userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'}); + } else { + my %domdefs = &Apache::lonnet::get_domain_defaults($toudom); + if ($domdefs{'lang_def'} ne '') { + @userlangs = ($domdefs{'lang_def'}); + } + } + } + my @languages=&Apache::lonlocal::get_genlanguages(@userlangs); + my $user_lh = Apache::localize->get_handle(@languages); + return $user_lh; +} + + ############################################################### ## Student Answer Attempts ## ############################################################### @@ -3168,7 +3240,7 @@ sub relative_to_absolute { } $thisdir=~s-/[^/]*$--; foreach my $link (@rlinks) { - unless (($link=~/^http:\/\//i) || + unless (($link=~/^https?\:\/\//i) || ($link=~/^\//) || ($link=~/^javascript:/i) || ($link=~/^mailto:/i) || @@ -4456,6 +4528,7 @@ form, .inline { display: inline; } .LC_200Box {width:200px; } .LC_500Box {width:500px; } .LC_600Box {width:600px; } +.LC_800Box {width:800px;} /* end */ .LC_filename {font-family: $mono; white-space:pre;} @@ -4465,7 +4538,7 @@ form, .inline { display: inline; } } .LC_warning, .LC_diff_removed { - + color: red; } .LC_info, @@ -4491,7 +4564,7 @@ form, .inline { display: inline; } } .LC_internal_info { - color: #999; + color: #999999; } table.LC_pastsubmission { @@ -4713,7 +4786,7 @@ table.LC_prior_tries tr th { font-size:90%; } table.LC_data_table tr.LC_info_row > td { - background-color: #CCC; + background-color: #CCCCCC; font-weight: bold; text-align: left; } @@ -4761,7 +4834,7 @@ table.LC_nested_outer tr td.LC_subheader text-align: right; } table.LC_nested tr.LC_info_row td { - background-color: #CCC; + background-color: #CCCCCC; font-weight: bold; font-size: small; text-align: center; @@ -4771,7 +4844,7 @@ table.LC_nested_outer tr th.LC_left_item text-align: left; } table.LC_nested td { - background-color: #FFF; + background-color: #FFFFFF; font-size: small; } table.LC_nested_outer tr th.LC_right_item, @@ -4782,7 +4855,7 @@ table.LC_nested tr td.LC_right_item { } table.LC_nested tr.LC_odd_row td { - background-color: #EEE; + background-color: #EEEEEE; } table.LC_createuser { @@ -4793,7 +4866,7 @@ table.LC_createuser tr.LC_section_row td } table.LC_createuser tr.LC_info_row td { - background-color: #CCC; + background-color: #CCCCCC; font-weight: bold; text-align: center; } @@ -4983,6 +5056,7 @@ table.LC_pick_box td.LC_pick_box_title { background: $tabbg; font-weight: bold; text-align: right; + vertical-align: top; width: 184px; padding: 8px; } @@ -5224,13 +5298,6 @@ table.LC_docs_documents td.LC_docs_docum padding: 4px; } -.LC_docs_course_commands div { - float: left; - border: 4px solid #AAAAAA; - padding: 4px; - background: #DDDDCC; -} - .LC_docs_entry_move { border: 0px; border-collapse: collapse; @@ -5501,12 +5568,10 @@ h2,h3,h4,h5,h6 } .LC_bgLightGrey{ - background:URL(/adm/lonIcons/lightGreyBG.png) repeat-x left top; -} -.LC_bgLightGreyYellow { - background-color:#EFECE0; + background:URL(/adm/lonIcons/lightGreyBG.png) repeat-x left bottom; } + /* Main Header with discription of Person, Course, etc. */ .LC_HeadRight { text-align: right; @@ -5523,7 +5588,7 @@ p, .LC_ContentBox { } .LC_FormSectionClearButton input { - + background-color:transparent; border:0px; cursor:pointer; text-decoration:underline; @@ -5553,24 +5618,29 @@ ol.LC_smallMenu a { color: RGB(80, 80, 80); text-decoration: none; } - -ol#LC_TabMainMenuContent { +ol#LC_TabMainMenueContent, ul.LC_TabContent , +ul.LC_TabContentBigger { display:block; list-style:none; - margin: 0px 0px 10px 0px; + margin: 0px; padding: 0px; } -ol#LC_TabMainMenuContent li { +ol#LC_TabMainMenuContent li, ul.LC_TabContent li, +ul.LC_TabContentBigger li{ display: inline; + border-right: solid 1px $lg_border_color; + float:left; + line-height:140%; + white-space:nowrap; +} +ol#LC_TabMainMenuContent li{ vertical-align: bottom; border-bottom: solid 1px RGB(175, 175, 175); - border-right: solid 1px RGB(175, 175, 175); padding: 5px 10px 5px 10px; - margin-right:3px; - line-height: 140%; + margin-right:5px; + margin-bottom:3px; font-weight: bold; - white-space:nowrap; background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; } @@ -5579,28 +5649,44 @@ ol#LC_TabMainMenuContent li a{ text-decoration: none; } ul.LC_TabContent { - margin:0px; - padding:0px; - display:block; - list-style:none; - min-height:1.5em; + min-height:1.6em; } ul.LC_TabContent li{ - display:inline; - vertical-align:top; + vertical-align:middle; + padding:0px 10px 0px 10px; + background-color:$tabbg; border-bottom:solid 1px $lg_border_color; - border-right:solid 1px $lg_border_color; - padding:5px 10px 5px 10px; - margin-right:2px; - background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; } -ul.LC_TabContent li a, ul.LC_TabContent li{ +ul.LC_TabContent li a, ul.LC_TabContent li{ color:rgb(47,47,47); text-decoration:none; font-size:95%; font-weight:bold; - white-space:nowrap; } +ul.LC_TabContent li:hover, ul.LC_TabContent li.active{ + background-color:#FFFFFF; + border-bottom:solid 1px #FFFFFF; +} +ul.LC_TabContentBigger li{ + vertical-align:bottom; + border-top:solid 1px $lg_border_color; + border-left:solid 1px $lg_border_color; + padding:5px 10px 5px 10px; + margin-left:2px; + background:url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; +} +ul.LC_TabContentBigger li:hover, ul.LC_TabContentBigger li.active{ + background:url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom; +} +ul.LC_TabContentBigger li, ul.LC_TabContentBigger li a{ + font-size:110%; + font-weight:bold; +} +#LC_CourseDocuments, #LC_SupplementalCourseDocuments +{ + margin:0px; +} + .LC_hideThis { display:none; @@ -5619,7 +5705,9 @@ ol#LC_MenuBreadcrumbs, ol#LC_PathBreadcr } ol#LC_MenuBreadcrumbs li, ol#LC_PathBreadcrumbs li { +/* background: url(/adm/lonIcons/arrow_white.png) no-repeat left center; +*/ display: inline; padding: 0px 0px 0px 10px; vertical-align: bottom; @@ -5638,19 +5726,14 @@ ol#LC_PathBreadcrumbs li a{ .LC_ContentBoxSpecial { border: solid 1px $lg_border_color; + max-width:70%; + min-width:70%; } -.LC_PopUp +.LC_ContentBoxSpecialContactInfo { - padding:10px; - border-left:solid 1px $lg_border_color; - border-top:solid 1px $lg_border_color; - border-bottom:outset 1px $lg_border_color; - border-right:outset 1px $lg_border_color; - display:none; - position:absolute; - right:0; - background-color:white; - z-index:5; + border: solid 1px $lg_border_color; + max-width:25%; + min-width:25%; } dl.LC_ListStyleClean dt { @@ -5738,7 +5821,7 @@ div.LC_columnSection > .LC_ContentBoxSpe .ContentBoxSpecialTemplate { - border: solid 1px $lg_border_color; + border: solid 1px $lg_border_color; } .ContentBoxTemplate { padding:10px; @@ -5804,19 +5887,6 @@ div.LC_columnSection > .ContentBoxSpecia border-bottom: 1px solid #CCCCCC; } -.LC_loginpage_fieldset{ - border: 1px solid #CCCCCC; - margin: 0 auto; -} - -.LC_loginpage_legend{ - padding: 2px; - margin: 0px; - font-size:14px; - font-weight:bold; -} - - END } @@ -7943,7 +8013,7 @@ sub upfile_select_html { # xml => &mt('HTML/XML'), ); my $Str = '<input type="file" name="upfile" size="50" />'. - '<br />Type: <select name="upfiletype">'; + '<br />'.&mt('Type').': <select name="upfiletype">'; foreach my $type (sort(keys(%Types))) { $Str .= '<option value="'.$type.'" >'.$Types{$type}."</option>\n"; } @@ -8031,7 +8101,7 @@ sub csv_print_select_table { &end_data_table_header_row()."\n"); foreach my $array_ref (@$d) { my ($value,$display,$defaultcol)=@{ $array_ref }; - $r->print(&start_data_table_row().'<tr><td>'.$display.'</td>'); + $r->print(&start_data_table_row().'<td>'.$display.'</td>'); $r->print('<td><select name=f'.$i. ' onchange="javascript:flip(this.form,'.$i.');">'); @@ -9367,7 +9437,9 @@ sub construct_course { 'policy.email', 'comment.email', 'pch.users.denied', - 'plc.users.denied'], + 'plc.users.denied', + 'hidefromcat', + 'categories'], $$crsudom,$$crsunum); } @@ -9825,6 +9897,11 @@ sub init_user_environment { } } + foreach my $tool ('aboutme','blog','portfolio') { + $userenv{'availabletools.'.$tool} = + &Apache::lonnet::usertools_access($username,$domain,$tool,'reload'); + } + $env{'user.environment'} = "$lonids/$cookie.id"; if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", @@ -9863,7 +9940,7 @@ sub _add_to_env { # --- Get the symbolic name of a problem and the url sub get_symb { my ($request,$silent) = @_; - (my $url=$env{'form.url'}) =~ s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; + (my $url=$env{'form.url'}) =~ s-^https?\://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; my $symb=($env{'form.symb'} ne '' ? $env{'form.symb'} : (&Apache::lonnet::symbread($url))); if ($symb eq '') { if (!$silent) { @@ -9890,11 +9967,13 @@ sub get_annotation { } sub clean_symb { - my ($symb) = @_; + my ($symb,$delete_enc) = @_; &Apache::lonenc::check_decrypt(\$symb); my $enc = $env{'request.enc'}; - delete($env{'request.enc'}); + if ($delete_enc) { + delete($env{'request.enc'}); + } return ($symb,$enc); }