--- loncom/interface/loncommon.pm	2008/12/15 11:44:41	1.717
+++ loncom/interface/loncommon.pm	2009/01/30 12:47:54	1.739
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.717 2008/12/15 11:44:41 tempelho Exp $
+# $Id: loncommon.pm,v 1.739 2009/01/30 12:47:54 ehlerst 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};
@@ -2717,6 +2723,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
@@ -3168,7 +3211,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) ||
@@ -4443,12 +4486,21 @@ table.thinborder tr td {
 }
 
 form, .inline { display: inline; }
-.center { text-align: center; }
-.left { text-align:left; }
-.right {text-align:right;}
-.middle {vertical-align:middle;}
-.top {vertical-align:top;}
-.bottom {vertical-align:bottom;}
+
+.LC_center { text-align: center; }
+.LC_left { text-align:left; }
+.LC_right {text-align:right;}
+.LC_middle {vertical-align:middle;}
+.LC_top {vertical-align:top;}
+.LC_bottom {vertical-align:bottom;}
+
+/* just for tests */
+.LC_300Box { width:300px; }
+.LC_200Box {width:200px; }
+.LC_500Box {width:500px; }
+.LC_600Box {width:600px; }
+/* end */
+
 .LC_filename {font-family: $mono; white-space:pre;}
 .LC_error {
   color: red;
@@ -4482,7 +4534,7 @@ form, .inline { display: inline; }
 }
 
 .LC_internal_info {
-  color: #999;
+  color: #999999;
 }
 
 table.LC_pastsubmission {
@@ -4704,7 +4756,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;
 }
@@ -4752,7 +4804,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;
@@ -4762,7 +4814,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,
@@ -4773,7 +4825,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 {
@@ -4784,7 +4836,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;
 }
@@ -5215,13 +5267,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;
@@ -5460,41 +5505,46 @@ div.LC_createcourse {
 # --------------------------*/
 
 a:hover,
-ol.smallMenu a:hover,
-ol#MenuBreadcrumbs a:hover,
-ul#TabMainMenuContent a:hover,
-.FormSectionClearButton input:hover{
+ol.LC_smallMenu a:hover,
+ol#LC_MenuBreadcrumbs a:hover,
+ol#LC_PathBreadcrumbs a:hover,
+ul#LC_TabMainMenuContent a:hover,
+.LC_FormSectionClearButton input:hover
+ul.LC_TabContent   li:hover a{
 	color:#BF2317;
         text-decoration:none;
 }
 
 h1 { 
-	padding:5px 10px 5px 0px;
+	padding:5px 10px 5px 20px;
 	line-height:130%;
 }
 
 h2,h3,h4,h5,h6
 {
-margin:5px 0px 5px 0px;
-line-height:130%;
+	margin:5px 0px 5px 0px;
+	padding:0px;
+	line-height:130%;
 }
-.hcell{
+.LC_hcell{
         padding:3px 15px 3px 15px;
         margin:0px;
 	background-color:$tabbg;
 	border-bottom:solid 1px $lg_border_color;       
 }
-.noBorder {
+.LC_noBorder {
         border:0px;
 }
-/*
-.bgLightGrey { background:URL(images/TabMenuBG.png) repeat-x left top; }
-.bgLightGreyYellow {background-color:#EFECE0;}
-*/
 
+.LC_bgLightGrey{
+	background:URL(/adm/lonIcons/lightGreyBG.png) repeat-x left top; 
+}
+.LC_bgLightGreyYellow {
+	background-color:#EFECE0;
+}
 
 /* Main Header with discription of Person, Course, etc. */
-.HeadRight {
+.LC_HeadRight {
 	text-align: right;
 	float: right;
 	margin: 0px;
@@ -5504,12 +5554,12 @@ line-height:130%;
         overflow:hidden;
 }
 
-p {
+p, .LC_ContentBox {
 	padding: 10px;
 
 }
-.FormSectionClearButton input {
-        background-color:transparent;
+.LC_FormSectionClearButton input {
+    	    
         border:0px;
         cursor:pointer;
         text-decoration:underline;
@@ -5520,55 +5570,87 @@ dl,ul,div,fieldset {
 	margin: 10px 10px 10px 0px;
 	overflow:hidden;
 }
-ol.smallMenu {
+ol.LC_smallMenu, ol#LC_PathBreadcrumbs {
 	margin: 0px;
 }
 
-ol.smallMenu li {
+ol.LC_smallMenu li {
 	display: inline;
 	padding: 5px 5px 0px 10px;
 	vertical-align: top;
 }
 
-ol.smallMenu li img {
+ol.LC_smallMenu li img {
 	vertical-align: bottom;
 }
 
-ol.smallMenu a {
+ol.LC_smallMenu a {
 	font-size: 90%;
 	color: RGB(80, 80, 80);
 	text-decoration: none;
 }
 
-ol#TabMainMenuContent {
-	
+ol#LC_TabMainMenuContent {
+	display:block;
+	list-style:none;
 	margin: 0px 0px 10px 0px;
 	padding: 0px;
 }
 
-ol#TabMainMenuContent li {
+ol#LC_TabMainMenuContent li {
 	display: inline;
 	vertical-align: bottom;
 	border-bottom: solid 1px RGB(175, 175, 175);
 	border-right: solid 1px RGB(175, 175, 175);
-	padding: 5px 15px 5px 15px;
-	margin-right:4px;
+	padding: 5px 10px 5px 10px;
+	margin-right:3px;
 	line-height: 140%;
 	font-weight: bold;
-	overflow:hidden;
-/*	background: RGB(211, 206, 205) URL(images/TabMenuBG.png) repeat-x left top;*/
+	white-space:nowrap;
+	background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top;
 }
 
-ol#TabMainMenuContent li a{
+ol#LC_TabMainMenuContent li a{
 	color: RGB(47, 47, 47);
 	text-decoration: none;
 }
+ul.LC_TabContent {
+	margin:0px;
+	padding:0px;
+	display:block;
+	list-style:none;
+	min-height:1.5em;
+}
+ul.LC_TabContent li{
+	display:inline;
+	vertical-align:top;
+	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{
+	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: url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom;
+        color:#BF2317;
+        text-decoration:none;
+}
 
-ol#TabMainMenuContent div.columnSection {
-	margin-bottom: 0px;
+.LC_hideThis
+{
+	display:none;
+	visibility:hidden;
 }
 
-ol#MenuBreadcrumbs, ol#PathBreadcrumbs {
+ol#LC_MenuBreadcrumbs, ol#LC_PathBreadcrumbs {
 	border-top: solid 1px RGB(255, 255, 255);
 	height: 20px;
 	line-height: 20px;
@@ -5576,36 +5658,31 @@ ol#MenuBreadcrumbs, ol#PathBreadcrumbs {
 	margin: 0px 0px 30px 0px;
 	padding-left: 10px;
 	list-style-position: inside;
-/*	background: RGB(211, 206, 205) URL(images/TabMenuBG.png) repeat-x left
-		top;*/
+	background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top;
 }
 
-ol#MenuBreadcrumbs li, ol#PathBreadcrumbs li {
-/*	background: url(images/pfeil_white.png) no-repeat left center;*/
+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;
 	overflow:hidden;
 }
 
-ol#MenuBreadcrumbs li a {
+ol#LC_MenuBreadcrumbs li a {
 	text-decoration: none;
 	font-size:90%;
 }
-ol#PathBreadcrumbs li a{
+ol#LC_PathBreadcrumbs li a{
 	text-decoration:none;
 	font-size:100%;
 	font-weight:bold;
 }
-
-.ContentBoxSpecial
+.LC_ContentBoxSpecial
 {
 	border: solid 1px $lg_border_color;
 }
-.ContentBox {
-	padding:10px;
-}
-.PopUp
+.LC_PopUp
 {
 	padding:10px;
 	border-left:solid 1px $lg_border_color;
@@ -5619,20 +5696,20 @@ ol#PathBreadcrumbs li a{
 	z-index:5;
 }
 
-dl.ListStyleClean dt {
+dl.LC_ListStyleClean dt {
 	padding-right: 5px;
 	display: table-header-group;
 }
 
-dl.ListStyleClean dd {
+dl.LC_ListStyleClean dd {
 	display: table-row;
 }
 
-.ListStyleClean,
-.ListStyleSimple,
-.ListStyleNormal,
-.ListStyleNormal_Border,
-.ListStyleSpecial
+.LC_ListStyleClean,
+.LC_ListStyleSimple,
+.LC_ListStyleNormal,
+.LC_ListStyleNormal_Border,
+.LC_ListStyleSpecial
 	{
 	/*display:block;	*/
 	list-style-position: inside;
@@ -5641,66 +5718,87 @@ dl.ListStyleClean dd {
 	padding: 0px;
 }
 
-.ListStyleSimple li,
-.ListStyleSimple dd,
-.ListStyleNormal li,
-.ListStyleNormal dd,
-.ListStyleSpecial li,
-.ListStyleSpecial dd
+.LC_ListStyleSimple li,
+.LC_ListStyleSimple dd,
+.LC_ListStyleNormal li,
+.LC_ListStyleNormal dd,
+.LC_ListStyleSpecial li,
+.LC_ListStyleSpecial dd
 	{
 	margin: 0px;
 	padding: 5px 5px 5px 10px;
 	clear: both;
 }
 
-.ListStyleClean li,
-.ListStyleClean dd {
+.LC_ListStyleClean li,
+.LC_ListStyleClean dd {
 	padding-top: 0px;
 	padding-bottom: 0px;
 }
 
-.ListStyleSimple dd,
-.ListStyleSimple li{
+.LC_ListStyleSimple dd,
+.LC_ListStyleSimple li{
 	border-bottom: solid 1px $lg_border_color;
 }
 
-.ListStyleSpecial li,
-.ListStyleSpecial dd {
+.LC_ListStyleSpecial li,
+.LC_ListStyleSpecial dd {
 	list-style-type: none;
 	background-color: RGB(220, 220, 220);
 	margin-bottom: 4px;
 }
 
-table.SimpleTable {
+table.LC_SimpleTable {
 	margin:5px;
 	border:solid 1px $lg_border_color;
 	}
 
-table.SimpleTable tr {
+table.LC_SimpleTable tr {
 	padding:0px;
 	border:solid 1px $lg_border_color;
 }
-table.SimpleTable thead{
+table.LC_SimpleTable thead{
 	 background:rgb(220,220,220);
 }
 
-div.columnSection {
+div.LC_columnSection {
 	display: block;
 	clear: both;
 	overflow: hidden;
 	margin:0px;
 }
 
-div.columnSection>* {
+div.LC_columnSection>* {
 	float: left;
 	margin: 10px 20px 10px 0px;
 	overflow:hidden;	
 }
-div.columnSection > .ContentBox,
-div.columnSection > .ContentBoxSpecial
+div.LC_columnSection > .LC_ContentBox,
+div.LC_columnSection > .LC_ContentBoxSpecial
 	{
-	width: 400px;
-	
+	width: 400px;	
+}
+
+.ContentBoxSpecialTemplate
+{
+        border: solid 1px $lg_border_color;
+}
+.ContentBoxTemplate {
+        padding:10px;
+}
+
+div.LC_columnSection > .ContentBoxTemplate,
+div.LC_columnSection > .ContentBoxSpecialTemplate
+        {
+        width: 600px;
+
+}
+
+.clear{
+	clear: both;
+	line-height: 0px;
+	font-size: 0px;
+	height: 0px;
 }
 
 .LC_loginpage_container {
@@ -5749,19 +5847,6 @@ div.columnSection > .ContentBoxSpecial
 	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
 }
 
@@ -6031,13 +6116,14 @@ sub start_page {
 		$result = &html_encode($result);
     }
 
-	if (exists $args->{'bread_crumbs'}) {
-		&Apache::lonhtmlcommon::clear_breadcrumbs();
-		my $temp = $args->{'bread_crumbs'};
-		foreach my $crumb (@$temp){
-			&Apache::lonhtmlcommon::add_breadcrumb($crumb);
-		}
-		$result .= &Apache::lonhtmlcommon::breadcrumbs();
+    if (exists($args->{'bread_crumbs'})) {
+        &Apache::lonhtmlcommon::clear_breadcrumbs();
+        if (ref($args->{'bread_crumbs'}) eq 'ARRAY') {         
+            foreach my $crumb (@{$args->{'bread_crumbs'}}){
+                &Apache::lonhtmlcommon::add_breadcrumb($crumb);
+            }
+        }
+        $result .= &Apache::lonhtmlcommon::breadcrumbs();
     }
 
     return $result;
@@ -7887,7 +7973,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";
     }
@@ -7975,7 +8061,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.');">');
@@ -9311,7 +9397,9 @@ sub construct_course {
                    'policy.email',
                    'comment.email',
                    'pch.users.denied',
-                   'plc.users.denied'],
+                   'plc.users.denied',
+                   'hidefromcat',
+                   'categories'],
                    $$crsudom,$$crsunum);
     }
 
@@ -9769,6 +9857,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",
@@ -9807,7 +9900,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) {
@@ -9834,11 +9927,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);
 }