--- loncom/interface/loncommon.pm	2009/01/26 15:55:11	1.735
+++ loncom/interface/loncommon.pm	2009/03/09 05:52:59	1.766
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.735 2009/01/26 15:55:11 bisitz Exp $
+# $Id: loncommon.pm,v 1.766 2009/03/09 05:52:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -923,19 +923,23 @@ sub help_open_topic {
     }
 
     # Add the text
-    if ($text ne "") {
-	$template .= 
-            "<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>".
-            "<td bgcolor='#5555FF'><a target=\"_top\" href=\"$link\"><span style=\"color:#FFFFFF;font-size:10pt;\">$text</span></a>";
+    if ($text ne "") {	
+	$template.='<span class="LC_help_open_topic">'
+                  .'<a target="_top" href="'.$link.'">'
+                  .$text.'</a>';
     }
 
-    # Add the graphic
+    # (Always) Add the graphic
     my $title = &mt('Online Help');
     my $helpicon=&lonhttpdurl("/adm/help/help.png");
-    $template .= <<"ENDTEMPLATE";
- <a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a>
-ENDTEMPLATE
-    if ($text ne '') { $template.='</td></tr></table>' };
+    $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'
+              .'<img src="'.$helpicon.'" border="0"'
+              .' alt="'.&mt('Help: [_1]',$topic).'"'
+              .' title="'.$title.'"'
+              .' /></a>';
+    if ($text ne "") {	
+        $template.='</span>';
+    }
     return $template;
 
 }
@@ -947,25 +951,26 @@ sub helpLatexCheatsheet {
     my $out;
     my $addOther = '';
     if ($topic) {
-	$addOther = &Apache::loncommon::help_open_topic($topic,$text,
-						       undef, undef, 600).
-							   '</td><td>';
-    }
-    $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>';
+	$addOther = '<span>'.&Apache::loncommon::help_open_topic($topic,&mt($text),
+							       undef, undef, 600).
+								   '</span> ';
+    }
+    $out = '<span>' # Start cheatsheet
+	  .$addOther
+          .'<span>'
+	  .&Apache::loncommon::help_open_topic('Greek_Symbols',&mt('Greek Symbols'),
+					       undef,undef,600)
+	  .'</span> <span>'
+	  .&Apache::loncommon::help_open_topic('Other_Symbols',&mt('Other Symbols'),
+					       undef,undef,600)
+	  .'</span>';
     unless ($not_author) {
-        $out .= '<td>'.
-	        &Apache::loncommon::help_open_topic("Authoring_Output_Tags",&mt('Output Tags'),
-	                                            undef,undef,600).
-	        '</td>';
+        $out .= ' <span>'
+	       .&Apache::loncommon::help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),
+	                                            undef,undef,600)
+	       .'</span>';
     }
-    $out .= '</tr></table>';
+    $out .= '</span>'; # End cheatsheet
     return $out;
 }
 
@@ -1746,7 +1751,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.  
@@ -1755,16 +1760,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;
@@ -2804,7 +2815,7 @@ sub aboutmewrapper {
         return;
     }
     return '<a href="/adm/'.$domain.'/'.$username.'/aboutme"'.
-	($target?' target="$target"':'').' title="'.&mt("View this user's personal page").'">'.$link.'</a>';
+	($target?' target="$target"':'').' title="'.&mt("View this user's personal information page").'">'.$link.'</a>';
 }
 
 # ------------------------------------------------------------ Syllabus Wrapper
@@ -3073,6 +3084,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                     ##
 ###############################################################
@@ -3788,7 +3822,7 @@ sub blocking_status {
                              &Apache::lonnet::coursedescription($course);
                         $coursedesc = $courseinfo{'description'};
                     }
-                    $category = "Group files in the course '$coursedesc'";
+                    $category = "Group portfolio in the course '$coursedesc'";
                 } else {
                     $category = 'Portfolio files belonging to ';
                     if ($env{'user.name'} eq 'public' && 
@@ -4217,7 +4251,7 @@ $realm&nbsp;
 </td>
 ENDROLE
 
-    my $titleinfo = '<span class="LC_title_bar_title">'.$title.'</span>';
+    my $titleinfo = '<h1>'.$title.'</h1>';
     if ($customtitle) {
         $titleinfo = $customtitle;
     }
@@ -4496,9 +4530,10 @@ form, .inline { display: inline; }
 
 /* just for tests */
 .LC_300Box { width:300px; }
-.LC_200Box {width:200px; }
+.LC_400Box {width:400px; }
 .LC_500Box {width:500px; }
 .LC_600Box {width:600px; }
+.LC_800Box {width:800px;}
 /* end */
 
 .LC_filename {font-family: $mono; white-space:pre;}
@@ -4583,9 +4618,6 @@ table#LC_title_bar td.LC_title_bar_who {
 span.LC_metadata {
     font-family: $sans;
 }
-span.LC_title_bar_title {
-  font: bold x-large $sans;
-}
 table#LC_title_bar td.LC_title_bar_domain_logo {
   background: $sidebg;
   text-align: right;
@@ -5026,6 +5058,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;
 }
@@ -5267,13 +5300,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;
@@ -5544,12 +5570,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;
@@ -5561,17 +5585,31 @@ h2,h3,h4,h5,h6
         overflow:hidden;
 }
 
+.LC_Right {
+        float: right;
+        margin: 0px;
+        padding: 0px;
+}
+
 p, .LC_ContentBox {
 	padding: 10px;
 
 }
 .LC_FormSectionClearButton input {
-    	    
+        background-color:transparent;    	    
         border:0px;
         cursor:pointer;
         text-decoration:underline;
 }
 
+.LC_help_open_topic {
+        color: #FFFFFF;
+        background-color: #EEEEFF;
+        margin: 1px;
+        padding: 4px;
+        border: 1px solid #000033;
+        white-space: nowrap;
+}
 
 dl,ul,div,fieldset {
 	margin: 10px 10px 10px 0px;
@@ -5596,24 +5634,29 @@ ol.LC_smallMenu a {
 	color: RGB(80, 80, 80);
 	text-decoration: none;
 }
-
-ol#LC_TabMainMenuContent {
+ol#LC_TabMainMenuContent, 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;
 }
 
@@ -5622,28 +5665,46 @@ 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;
+	padding-right: 16px;
 }
+ul.LC_TabContent li:hover, ul.LC_TabContent li.active{
+        background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;
+	border-bottom:solid 1px #FFFFFF;
+	padding-right: 16px;
+}
+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;
@@ -5662,7 +5723,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;
@@ -5682,20 +5745,21 @@ ol#LC_PathBreadcrumbs li a{
 {
 	border: solid 1px $lg_border_color;
 }
-.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%;
+}
+.LC_AboutMe_Image
+{
+	float:left;
+	margin-right:10px;
+}
+.LC_Clear_AboutMe_Image
+{
+	clear:left;
 }
-
 dl.LC_ListStyleClean dt {
 	padding-right: 5px;
 	display: table-header-group;
@@ -5771,12 +5835,7 @@ div.LC_columnSection {
 div.LC_columnSection>* {
 	float: left;
 	margin: 10px 20px 10px 0px;
-	overflow:hidden;	
-}
-div.LC_columnSection > .LC_ContentBox,
-div.LC_columnSection > .LC_ContentBoxSpecial
-	{
-	width: 400px;	
+	overflow:hidden;
 }
 
 .ContentBoxSpecialTemplate
@@ -5791,7 +5850,6 @@ div.LC_columnSection > .ContentBoxTempla
 div.LC_columnSection > .ContentBoxSpecialTemplate
         {
         width: 600px;
-
 }
 
 .clear{
@@ -5842,21 +5900,101 @@ div.LC_columnSection > .ContentBoxSpecia
 }
 
 .LC_loginpage_space {
-	clear:both;
-	margin-bottom:20px;
+	clear: both;
+	margin-bottom: 20px;
 	border-bottom: 1px solid #CCCCCC;
 }
 
-.LC_loginpage_fieldset{
-	border: 1px solid #CCCCCC;
-	margin: 0 auto;
+table em{
+	font-weight: bold;
+	font-style: normal;
 }
 
-.LC_loginpage_legend{
-	padding: 2px;
-	margin: 0px;
-	font-size:14px;
-	font-weight:bold;
+table#LC_tableOfContent{
+	border-collapse: collapse;
+	border-spacing: 0;
+	padding: 3px;
+	border: 0;
+	background-color: #FFFFFF;
+	font-size: 90%;
+}
+table#LC_tableOfContent a {
+	text-decoration: none;
+}
+
+table#LC_tableOfContent tr.LC_trOdd{
+	background-color: #EEEEEE;
+}
+
+table#LC_tableOfContent img{
+	border: none;
+	height: 1.3em;
+	vertical-align: text-bottom;
+	margin-right: 0.3em;
+}
+
+a#LC_content_toolbar_firsthomework{
+	background-image:url(/res/adm/pages/open-first-problem.gif);
+}
+
+a#LC_content_toolbar_launchnav{	
+	background-image:url(/res/adm/pages/start-navigation.gif);
+}
+
+a#LC_content_toolbar_closenav{
+	background-image:url(/res/adm/pages/close-navigation.gif);
+}
+
+a#LC_content_toolbar_everything{
+	background-image:url(/res/adm/pages/show-all.gif);
+}
+
+a#LC_content_toolbar_uncompleted{
+	background-image:url(/res/adm/pages/show-incomplete-problems.gif);
+}
+
+#LC_content_toolbar_clearbubbles{
+	background-image:url(/res/adm/pages/mark-discussionentries-read.gif);
+}
+
+a#LC_content_toolbar_changefolder{
+	background : url(/res/adm/pages/close-all-folders.gif) top center ;
+}
+
+a#LC_content_toolbar_changefolder_toggled{
+	background-image:url(/res/adm/pages/open-all-folders.gif);
+}
+
+ul#LC_toolbar li a:hover{
+	background-position: bottom center;
+}
+
+ul#LC_toolbar{
+	padding:0; 
+	margin: 2px;
+	list-style:none;
+	position:relative;
+	background-color:white;
+}
+
+ul#LC_toolbar li{
+	border:1px solid white;
+	padding:0;
+	margin: 0;
+	display:inline-block;
+	vertical-align:middle;
+}
+
+a.LC_toolbarItem{
+	display:inline-block;
+	padding:0;
+	margin:0;
+	height: 32px;
+	width: 32px;
+	color:white; 
+	border:0 none;	
+	background-repeat:no-repeat;
+	background-color:transparent;
 }
 
 
@@ -6129,16 +6267,23 @@ sub start_page {
 		$result = &html_encode($result);
     }
 
-    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();
-    }
+	#Breadcrumbs
+    if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) {
+		&Apache::lonhtmlcommon::clear_breadcrumbs();
+		#if any br links exists, add them to the breadcrumbs
+		if (exists($args->{'bread_crumbs'}) and ref($args->{'bread_crumbs'}) eq 'ARRAY') {         
+			foreach my $crumb (@{$args->{'bread_crumbs'}}){
+				&Apache::lonhtmlcommon::add_breadcrumb($crumb);
+			}
+		}
 
+		#if bread_crumbs_component exists show it as headline else show only the breadcrumbs
+		if(exists($args->{'bread_crumbs_component'})){
+			$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'});
+		}else{
+			$result .= &Apache::lonhtmlcommon::breadcrumbs();
+		}
+    }
     return $result;
 }
 
@@ -6899,7 +7044,7 @@ sub default_quota {
                                             ['quotas'],$udom);
     if (ref($quotahash{'quotas'}) eq 'HASH') {
         if ($inststatus ne '') {
-            my @statuses = split(/:/,$inststatus);
+            my @statuses = map { &unescape($_); } split(/:/,$inststatus);
             foreach my $item (@statuses) {
                 if (ref($quotahash{'quotas'}{'defaultquota'}) eq 'HASH') {
                     if ($quotahash{'quotas'}{'defaultquota'}{$item} ne '') {
@@ -7365,6 +7510,7 @@ sub personal_data_fieldtitles {
                         middlename => 'Middle Name',
                         generation => 'Generation',
                         gen => 'Generation',
+                        inststatus => 'Affiliation',
                    );
     return %fieldtitles;
 }
@@ -8730,9 +8876,10 @@ sub restore_settings {
 
 =item * &build_recipient_list()
 
-Build recipient lists for three types of e-mail:
-(a) Error Reports, (b) Package Updates, (c) Help requests, generated by
-lonerrorhandler.pm, CHECKRPMS and lonsupportreq.pm respectively.
+Build recipient lists for four types of e-mail:
+(a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors
+(d) Help requests, generated by
+lonerrorhandler.pm, CHECKRPMS, loncron, and lonsupportreq.pm respectively.
 
 Inputs:
 defmail (scalar - email address of default recipient), 
@@ -8756,17 +8903,21 @@ sub build_recipient_list {
     my %domconfig =
          &Apache::lonnet::get_dom('configuration',['contacts'],$defdom);
     if (ref($domconfig{'contacts'}) eq 'HASH') {
-        if (ref($domconfig{'contacts'}{$mailing}) eq 'HASH') {
-            my @contacts = ('adminemail','supportemail');
-            foreach my $item (@contacts) {
-                if ($domconfig{'contacts'}{$mailing}{$item}) {
-                    my $addr = $domconfig{'contacts'}{$item}; 
-                    if (!grep(/^\Q$addr\E$/,@recipients)) {
-                        push(@recipients,$addr);
+        if (exists($domconfig{'contacts'}{$mailing})) {
+            if (ref($domconfig{'contacts'}{$mailing}) eq 'HASH') {
+                my @contacts = ('adminemail','supportemail');
+                foreach my $item (@contacts) {
+                    if ($domconfig{'contacts'}{$mailing}{$item}) {
+                        my $addr = $domconfig{'contacts'}{$item}; 
+                        if (!grep(/^\Q$addr\E$/,@recipients)) {
+                            push(@recipients,$addr);
+                        }
                     }
+                    $otheremails = $domconfig{'contacts'}{$mailing}{'others'};
                 }
-                $otheremails = $domconfig{'contacts'}{$mailing}{'others'};
             }
+        } elsif ($origmail ne '') {
+            push(@recipients,$origmail);
         }
     } elsif ($origmail ne '') {
         push(@recipients,$origmail);
@@ -9875,6 +10026,12 @@ sub init_user_environment {
                 &Apache::lonnet::usertools_access($username,$domain,$tool,'reload');
         }
 
+        foreach my $crstype ('official','unofficial') {
+            $userenv{'canrequest.'.$crstype} =
+                &Apache::lonnet::usertools_access($username,$domain,$crstype,
+                                                  'reload','requestcourses');
+        }
+
 	$env{'user.environment'} = "$lonids/$cookie.id";
 	
 	if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id",