--- loncom/interface/loncommon.pm	2008/02/01 23:03:13	1.639
+++ loncom/interface/loncommon.pm	2008/04/30 23:36:56	1.652
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.639 2008/02/01 23:03:13 raeburn Exp $
+# $Id: loncommon.pm,v 1.652 2008/04/30 23:36:56 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -78,6 +78,76 @@ my $readit;
 ## Global Variables
 ##
 
+
+# ----------------------------------------------- SSI with retries:
+#
+
+=pod
+
+=head1 Server Side include with retries:
+
+=over 4
+
+=item * &ssi_with_retries(resource,retries form)
+
+Performs an ssi with some number of retries.  Retries continue either
+until the result is ok or until the retry count supplied by the
+caller is exhausted.  
+
+Inputs:
+
+=over 4
+
+resource   - Identifies the resource to insert.
+
+retries    - Count of the number of retries allowed.
+
+form       - Hash that identifies the rendering options.
+
+=back
+
+Returns:
+
+=over 4
+
+content    - The content of the response.  If retries were exhausted this is empty.
+
+response   - The response from the last attempt (which may or may not have been successful.
+
+=back
+
+=back
+
+=cut
+
+sub ssi_with_retries {
+    my ($resource, $retries, %form) = @_;
+
+
+    my $ok = 0;			# True if we got a good response.
+    my $content;
+    my $response;
+
+    # Try to get the ssi done. within the retries count:
+
+    do {
+	($content, $response) = &Apache::lonnet::ssi($resource, %form);
+	$ok      = $response->is_success;
+        if (!$ok) {
+            &Apache::lonnet::logthis("Failed ssi_with_retries on $resource: ".$response->is_success.', '.$response->code.', '.$response->message);
+        }
+	$retries--;
+    } while (!$ok && ($retries > 0));
+
+    if (!$ok) {
+	$content = '';		# On error return an empty content.
+    }
+    return ($content, $response);
+
+}
+
+
+
 # ----------------------------------------------- Filetypes/Languages/Copyright
 my %language;
 my %supported_language;
@@ -214,14 +284,14 @@ BEGIN {
 
 =over 4
 
-=item * browser_and_searcher_javascript ()
+=item * &browser_and_searcher_javascript()
 
 X<browsing, javascript>X<searching, javascript>Returns a string
 containing javascript with two functions, C<openbrowser> and
 C<opensearcher>. Returned string does not contain E<lt>scriptE<gt>
 tags.
 
-=item * openbrowser(formname,elementname,only,omit) [javascript]
+=item * &openbrowser(formname,elementname,only,omit) [javascript]
 
 inputs: formname, elementname, only, omit
 
@@ -234,7 +304,7 @@ with the given extension.  Can be a comm
 Specifying 'omit' will restrict the browser to NOT displaying files
 with the given extension.  Can be a comma separated list.
 
-=item * opensearcher(formname, elementname) [javascript]
+=item * &opensearcher(formname,elementname) [javascript]
 
 Inputs: formname, elementname
 
@@ -319,7 +389,7 @@ sub storeresurl {
     unless ($resurl=~/^\/res/) { return 0; }
     $resurl=~s/\/$//;
     &Apache::lonnet::put('environment',{'lastresurl' => $resurl});
-    &Apache::lonnet::appenv('environment.lastresurl' => $resurl);
+    &Apache::lonnet::appenv({'environment.lastresurl' => $resurl});
     return 1;
 }
 
@@ -542,7 +612,7 @@ ENDSCRT
 
 =pod
 
-=item * linked_select_forms(...)
+=item * &linked_select_forms(...)
 
 linked_select_forms returns a string containing a <script></script> block
 and html for two <select> menus.  The select menus will be linked in that
@@ -707,7 +777,7 @@ END
 
 =pod
 
-=item * help_open_topic($topic, $text, $stayOnPage, $width, $height)
+=item * &help_open_topic($topic,$text,$stayOnPage,$width,$height)
 
 Returns a string corresponding to an HTML link to the given help
 $topic, where $topic corresponds to the name of a .tex file in
@@ -761,7 +831,7 @@ sub help_open_topic {
 
     # Add the graphic
     my $title = &mt('Online Help');
-    my $helpicon=&lonhttpdurl("/adm/help/gif/smallHelp.gif");
+    my $helpicon=&lonhttpdurl("/res/adm/pages/help.png");
     $template .= <<"ENDTEMPLATE";
  <a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a>
 ENDTEMPLATE
@@ -1017,7 +1087,7 @@ ENDTEMPLATE
 
 =pod
 
-=item * change_content_javascript():
+=item * &change_content_javascript():
 
 This and the next function allow you to create small sections of an
 otherwise static HTML page that you can update on the fly with
@@ -1072,7 +1142,7 @@ DOMBASED
 
 =pod
 
-=item * changable_area($name, $origContent):
+=item * &changable_area($name,$origContent):
 
 This provides a "changable area" that can be modified on the fly via
 the Javascript code provided in C<change_content_javascript>. $name is
@@ -1096,7 +1166,7 @@ sub changable_area {
 
 =pod
 
-=item * viewport_geometry_js {
+=item * &viewport_geometry_js 
 
 Provides javascript object (Geometry) which can provide information about the viewport geometry for the client browser.
 
@@ -1143,7 +1213,7 @@ GEOMETRY
 
 =pod
 
-=item * viewport_size_js {
+=item * &viewport_size_js()
 
 Provides a javascript function to set values of two form elements - width and height (elements are passed in as arguments to the javascript function) to the dimensions of the user's browser window. 
 
@@ -1167,7 +1237,7 @@ DIMS
 
 =pod
 
-=item * resize_textarea_js
+=item * &resize_textarea_js()
 
 emits the needed javascript to resize a textarea to be as big as possible
 
@@ -1176,6 +1246,7 @@ the id of the element to resize, second
 surrounds everything that comes after the textarea, this routine needs
 to be attached to the <body> for the onload and onresize events.
 
+=back
 
 =cut
 
@@ -1228,8 +1299,6 @@ RESIZE
 
 =pod
 
-=back
- 
 =head1 Excel and CSV file utility routines
 
 =over 4
@@ -1241,7 +1310,7 @@ RESIZE
 
 =pod
 
-=item * csv_translate($text) 
+=item * &csv_translate($text) 
 
 Translate $text to allow it to be output as a 'comma separated values' 
 format.
@@ -1262,7 +1331,7 @@ sub csv_translate {
 
 =pod
 
-=item * define_excel_formats
+=item * &define_excel_formats()
 
 Define some commonly used Excel cell formats.
 
@@ -1318,7 +1387,7 @@ sub define_excel_formats {
 
 =pod
 
-=item * create_workbook
+=item * &create_workbook()
 
 Create an Excel worksheet.  If it fails, output message on the
 request object and return undefs.
@@ -1361,7 +1430,7 @@ sub create_workbook {
 
 =pod
 
-=item * create_text_file
+=item * &create_text_file()
 
 Create a file to write to and eventually make available to the user.
 If file creation fails, outputs an error message on the request object and 
@@ -1429,7 +1498,7 @@ sub domain_select {
 
 =over 4
 
-=item * multiple_select_form($name,$value,$size,$hash,$order)
+=item * &multiple_select_form($name,$value,$size,$hash,$order)
 
 Returns a string containing a <select> element int multiple mode
 
@@ -1479,7 +1548,7 @@ sub multiple_select_form {
 
 =pod
 
-=item * select_form($defdom,$name,%hash)
+=item * &select_form($defdom,$name,%hash)
 
 Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select options from a hash option_name => displayed text.  
@@ -1566,7 +1635,7 @@ sub select_level_form {
 
 =pod
 
-=item * select_dom_form($defdom,$name,$includeempty,$showdomdesc)
+=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc)
 
 Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select the domain to preform an operation in.  
@@ -1606,7 +1675,7 @@ sub select_dom_form {
 
 =pod
 
-=item * home_server_form_item($domain,$name,$defaultflag)
+=item * &home_server_form_item($domain,$name,$defaultflag)
 
 input: 4 arguments (two required, two optional) - 
     $domain - domain of new user
@@ -1766,14 +1835,12 @@ sub decode_user_agent {
 
 =over 4
 
-=item * authform_xxxxxx
+=item * &authform_xxxxxx()
 
 The authform_xxxxxx subroutines provide javascript and html forms which 
 handle some of the conveniences required for authentication forms.  
 This is not an optimal method, but it works.  
 
-See loncreateuser.pm for invocation and use examples.
-
 =over 4
 
 =item * authform_header
@@ -1790,7 +1857,7 @@ See loncreateuser.pm for invocation and
 
 =back
 
-=back 
+See loncreateuser.pm for invocation and use examples.
 
 =cut
 
@@ -2242,42 +2309,6 @@ sub get_assignable_auth {
 }
 
 ###############################################################
-##    Get Authentication Defaults for Domain                 ##
-###############################################################
-
-=pod
-
-=head1 Domains and Authentication
-
-Returns default authentication type and an associated argument as
-listed in file 'domain.tab'.
-
-=over 4
-
-=item * get_auth_defaults
-
-get_auth_defaults($target_domain) returns the default authentication
-type and an associated argument (initial password or a kerberos domain).
-These values are stored in lonTabs/domain.tab
-
-($def_auth, $def_arg) = &get_auth_defaults($target_domain);
-
-If target_domain is not found in domain.tab, returns nothing ('').
-
-=cut
-
-#-------------------------------------------
-sub get_auth_defaults {
-    my $domain=shift;
-    return (&Apache::lonnet::domain($domain,'auth_def'),
-	    &Apache::lonnet::domain($domain,'auth_arg_def'));
-	    
-}
-###############################################################
-##   End Get Authentication Defaults for Domain              ##
-###############################################################
-
-###############################################################
 ##    Get Kerberos Defaults for Domain                 ##
 ###############################################################
 ##
@@ -2289,22 +2320,31 @@ sub get_auth_defaults {
 
 =pod
 
-=item * get_kerberos_defaults
+=item * &get_kerberos_defaults()
 
 get_kerberos_defaults($target_domain) returns the default kerberos
-version and domain. If not found in domain.tabs, it defaults to
-version 4 and the domain of the server.
+version and domain. If not found, it defaults to version 4 and the 
+domain of the server.
+
+=over 4
 
 ($def_version, $def_krb_domain) = &get_kerberos_defaults($target_domain);
 
+=back
+
+=back
+
 =cut
 
 #-------------------------------------------
 sub get_kerberos_defaults {
     my $domain=shift;
-    my ($krbdef,$krbdefdom) =
-        &Apache::loncommon::get_auth_defaults($domain);
-    unless ($krbdef =~/^krb/ && $krbdefdom) {
+    my ($krbdef,$krbdefdom);
+    my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
+    if (($domdefaults{'auth_def'} =~/^krb(4|5)$/) && ($domdefaults{'auth_arg_def'} ne '')) {
+        $krbdef = $domdefaults{'auth_def'};
+        $krbdefdom = $domdefaults{'auth_arg_def'};
+    } else {
         $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
         my $krbdefdom=$1;
         $krbdefdom=~tr/a-z/A-Z/;
@@ -2313,11 +2353,6 @@ sub get_kerberos_defaults {
     return ($krbdef,$krbdefdom);
 }
 
-=pod
-
-=back
-
-=cut
 
 ###############################################################
 ##                Thesaurus Functions                        ##
@@ -2329,7 +2364,7 @@ sub get_kerberos_defaults {
 
 =over 4
 
-=item * initialize_keywords
+=item * &initialize_keywords()
 
 Initializes the package variable %Keywords if it is empty.  Uses the
 package variable $thesaurus_db_file.
@@ -2374,7 +2409,7 @@ sub initialize_keywords {
 
 =pod
 
-=item * keyword($word)
+=item * &keyword($word)
 
 Returns true if $word is a keyword.  A keyword is a word that appears more 
 than the average number of times in the thesaurus database.  Calls 
@@ -2395,7 +2430,7 @@ sub keyword {
 
 =pod 
 
-=item * get_related_words
+=item * &get_related_words()
 
 Look up a word in the thesaurus.  Takes a scalar argument and returns
 an array of words.  If the keyword is not in the thesaurus, an empty array
@@ -2453,7 +2488,7 @@ sub get_related_words {
 
 =over 4
 
-=item * plainname($uname,$udom,$first)
+=item * &plainname($uname,$udom,$first)
 
 Takes a users logon name and returns it as a string in
 "first middle last generation" form 
@@ -2482,7 +2517,7 @@ sub plainname {
 # -------------------------------------------------------------------- Nickname
 =pod
 
-=item * nickname($uname,$udom)
+=item * &nickname($uname,$udom)
 
 Gets a users name and returns it as a string as
 
@@ -2532,18 +2567,21 @@ sub getnames {
 }
 
 # -------------------------------------------------------------------- getemails
+
 =pod
 
-=item * getemails($uname,$udom)
+=item * &getemails($uname,$udom)
 
 Gets a user's email information and returns it as a hash with keys:
 notification, critnotification, permanentemail
 
 For notification and critnotification, values are comma-separated lists 
-of e-mail address(es); for permanentemail, value is a single e-mail address.
+of e-mail addresses; for permanentemail, value is a single e-mail address.
  
+
 =cut
 
+
 sub getemails {
     my ($uname,$udom)=@_;
     if ($udom eq 'public' && $uname eq 'public') {
@@ -2578,7 +2616,7 @@ sub flush_email_cache {
 
 =pod
 
-=item * screenname($uname,$udom)
+=item * &screenname($uname,$udom)
 
 Gets a users screenname and returns it as a string
 
@@ -2674,7 +2712,7 @@ sub student_image_tag {
 
 =over 4
 
-=item * languageids() 
+=item * &languageids() 
 
 returns list of all language ids
 
@@ -2686,7 +2724,7 @@ sub languageids {
 
 =pod
 
-=item * languagedescription() 
+=item * &languagedescription() 
 
 returns description of a specified language id
 
@@ -2711,7 +2749,7 @@ sub supportedlanguagecode {
 
 =pod
 
-=item * copyrightids() 
+=item * &copyrightids() 
 
 returns list of all copyrights
 
@@ -2723,7 +2761,7 @@ sub copyrightids {
 
 =pod
 
-=item * copyrightdescription() 
+=item * &copyrightdescription() 
 
 returns description of a specified copyright id
 
@@ -2735,7 +2773,7 @@ sub copyrightdescription {
 
 =pod
 
-=item * source_copyrightids() 
+=item * &source_copyrightids() 
 
 returns list of all source copyrights
 
@@ -2747,7 +2785,7 @@ sub source_copyrightids {
 
 =pod
 
-=item * source_copyrightdescription() 
+=item * &source_copyrightdescription() 
 
 returns description of a specified source copyright id
 
@@ -2759,7 +2797,7 @@ sub source_copyrightdescription {
 
 =pod
 
-=item * filecategories() 
+=item * &filecategories() 
 
 returns list of all file categories
 
@@ -2771,7 +2809,7 @@ sub filecategories {
 
 =pod
 
-=item * filecategorytypes() 
+=item * &filecategorytypes() 
 
 returns list of file types belonging to a given file
 category
@@ -2785,7 +2823,7 @@ sub filecategorytypes {
 
 =pod
 
-=item * fileembstyle() 
+=item * &fileembstyle() 
 
 returns embedding style for a specified file type
 
@@ -2809,7 +2847,7 @@ sub filecategoryselect {
 
 =pod
 
-=item * filedescription() 
+=item * &filedescription() 
 
 returns description for a specified file type
 
@@ -2823,7 +2861,7 @@ sub filedescription {
 
 =pod
 
-=item * filedescriptionex() 
+=item * &filedescriptionex() 
 
 returns description for a specified file type with
 extra formatting
@@ -2883,21 +2921,15 @@ sub preferred_languages {
 	    map { (split(/\s*;\s*/,$_))[0] } (split(/\s*,\s*/,$browser));
 	push(@languages,@browser);
     }
-    if (&Apache::lonnet::domain($env{'user.domain'},'lang_def')) {
-	@languages=(@languages,
-		    &Apache::lonnet::domain($env{'user.domain'},
-					    'lang_def'));
-    }
-    if (&Apache::lonnet::domain($env{'request.role.domain'},'lang_def')) {
-	@languages=(@languages,
-		    &Apache::lonnet::domain($env{'request.role.domain'},
-					    'lang_def'));
-    }
-    if (&Apache::lonnet::domain($Apache::lonnet::perlvar{'lonDefDomain'},
-				'lang_def')) {
-	@languages=(@languages,
-		    &Apache::lonnet::domain($Apache::lonnet::perlvar{'lonDefDomain'},
-					    'lang_def'));
+
+    foreach my $domtype ($env{'user.domain'},$env{'request.role.domain'},
+                         $Apache::lonnet::perlvar{'lonDefDomain'}) {
+        if ($domtype ne '') {
+            my %domdefs = &Apache::lonnet::get_domain_defaults($domtype);
+            if ($domdefs{'lang_def'} ne '') {
+                push(@languages,$domdefs{'lang_def'});
+            }
+        }
     }
 # turn "en-ca" into "en-ca,en"
     my @genlanguages;
@@ -2947,7 +2979,7 @@ sub languages {
 
 =over 4
 
-=item * get_previous_attempt($symb, $username, $domain, $course,
+=item * &get_previous_attempt($symb, $username, $domain, $course,
     $getattempt, $regexp, $gradesub)
 
 Return string with previous attempt on problem. Arguments:
@@ -3091,7 +3123,7 @@ sub relative_to_absolute {
 
 =pod
 
-=item * get_student_view
+=item * &get_student_view()
 
 show a snapshot of what student was looking at
 
@@ -3110,7 +3142,7 @@ sub get_student_view {
   }
   if (defined($target)) { $form{'grade_target'} = $target; }
   $feedurl=&Apache::lonnet::clutter($feedurl);
-  my $userview=&Apache::lonnet::ssi_body($feedurl,%form);
+  my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form);
   $userview=~s/\<body[^\>]*\>//gi;
   $userview=~s/\<\/body\>//gi;
   $userview=~s/\<html\>//gi;
@@ -3119,12 +3151,44 @@ sub get_student_view {
   $userview=~s/\<\/head\>//gi;
   $userview=~s/action\s*\=/would_be_action\=/gi;
   $userview=&relative_to_absolute($feedurl,$userview);
-  return $userview;
+  if (wantarray) {
+     return ($userview,$response);
+  } else {
+     return $userview;
+  }
+}
+
+sub get_student_view_with_retries {
+  my ($symb,$retries,$username,$domain,$courseid,$target,$moreenv) = @_;
+
+    my $ok = 0;                 # True if we got a good response.
+    my $content;
+    my $response;
+
+    # Try to get the student_view done. within the retries count:
+    
+    do {
+         ($content, $response) = &get_student_view($symb,$username,$domain,$courseid,$target,$moreenv);
+         $ok      = $response->is_success;
+         if (!$ok) {
+            &Apache::lonnet::logthis("Failed get_student_view_with_retries on $symb: ".$response->is_success.', '.$response->code.', '.$response->message);
+         }
+         $retries--;
+    } while (!$ok && ($retries > 0));
+    
+    if (!$ok) {
+       $content = '';          # On error return an empty content.
+    }
+    if (wantarray) {
+       return ($content, $response);
+    } else {
+       return $content;
+    }
 }
 
 =pod
 
-=item * get_student_answers() 
+=item * &get_student_answers() 
 
 show a snapshot of how student was answering problem
 
@@ -3981,7 +4045,7 @@ ENDROLE
         $dc_info = '('.$dc_info.')';
     }
 
-    if ($env{'environment.remote'} eq 'off') {
+    if (($env{'environment.remote'} eq 'off') || ($args->{'suppress_header_logos'})) {
         # No Remote
 	if ($env{'request.state'} eq 'construct') {
 	    $forcereg=1;
@@ -4004,9 +4068,9 @@ ENDROLE
 		$lastitem = $thisdisfn;
 	    }
 	    $titleinfo = 
-		&Apache::loncommon::help_open_menu('','',3,'Authoring').
-		'<b>Construction Space</b>:&nbsp;'. 
-		'<form name="dirs" method="post" action="'.$formaction
+		&Apache::loncommon::help_open_menu('','',3,'Authoring')
+		.'<b>'.&mt('Construction Space').'</b>:&nbsp;'
+		.'<form name="dirs" method="post" action="'.$formaction
 		.'" target="_top"><tt><b>'
 		.&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."<font size=\"+1\">$lastitem</font></b></tt><br />"
 		.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
@@ -4777,6 +4841,14 @@ table.LC_pick_box td.LC_pick_box_title {
   width: 184px;
   padding: 8px;
 }
+table.LC_pick_box td.LC_selfenroll_pick_box_title {
+  background: $tabbg;
+  font-weight: bold;
+  text-align: right;
+  width: 350px;
+  padding: 8px;
+}
+
 table.LC_pick_box td.LC_pick_box_value {
   text-align: left;
   padding: 8px;
@@ -5321,10 +5393,7 @@ Inputs: none
 
 sub font_settings {
     my $headerstring='';
-    if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) { 
-	$headerstring.=
-	    '<meta Content-Type="text/html; charset=x-mac-roman" />';
-    } elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) {
+    if (!$env{'browser.mathml'} && $env{'browser.unicode'}) {
 	$headerstring.=
 	    '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
     }
@@ -5383,8 +5452,15 @@ sub endheadtag {
 
 Returns a uniform complete <head>..</head> section for LON-CAPA web pages.
 
-Inputs: $title - optional title for the page
-        $head_extra - optional extra HTML to put inside the <head>
+Inputs:
+
+=over 4
+
+$title - optional title for the page
+
+$head_extra - optional extra HTML to put inside the <head>
+
+=back
 
 =cut
 
@@ -5399,44 +5475,54 @@ sub head {
 
 Returns a complete <html> .. <body> section for LON-CAPA web pages.
 
-Inputs: $title - optional title for the page
-        $head_extra - optional extra HTML to incude inside the <head>
-        $args - additional optional args supported are:
-                  only_body      -> is true will set &bodytag() onlybodytag
+Inputs:
+
+=over 4
+
+$title - optional title for the page
+
+$head_extra - optional extra HTML to incude inside the <head>
+
+$args - additional optional args supported are:
+
+=over 8
+
+             only_body      -> is true will set &bodytag() onlybodytag
                                     arg on
-                  no_nav_bar     -> is true will set &bodytag() notopbar arg on
-                  add_entries    -> additional attributes to add to the  <body>
-                  domain         -> force to color decorate a page for a 
+             no_nav_bar     -> is true will set &bodytag() notopbar arg on
+             add_entries    -> additional attributes to add to the  <body>
+             domain         -> force to color decorate a page for a 
                                     specific domain
-                  function       -> force usage of a specific rolish color
+             function       -> force usage of a specific rolish color
                                     scheme
-                  redirect       -> see &headtag()
-                  bgcolor        -> override the default page bg color
-                  js_ready       -> return a string ready for being used in 
+             redirect       -> see &headtag()
+             bgcolor        -> override the default page bg color
+             js_ready       -> return a string ready for being used in 
                                     a javascript writeln
-                  html_encode    -> return a string ready for being used in 
+             html_encode    -> return a string ready for being used in 
                                     a html attribute
-                  force_register -> if is true will turn on the &bodytag()
+             force_register -> if is true will turn on the &bodytag()
                                     $forcereg arg
-                  body_title     -> alternate text to use instead of $title
+             body_title     -> alternate text to use instead of $title
                                     in the title box that appears, this text
                                     is not auto translated like the $title is
-                  frameset       -> if true will start with a <frameset>
+             frameset       -> if true will start with a <frameset>
                                     rather than <body>
-                  no_title       -> if true the title bar won't be shown
-                  skip_phases    -> hash ref of 
+             no_title       -> if true the title bar won't be shown
+             skip_phases    -> hash ref of 
                                     head -> skip the <html><head> generation
                                     body -> skip all <body> generation
-
-                  no_inline_link -> if true and in remote mode, don't show the 
+             no_inline_link -> if true and in remote mode, don't show the 
                                     'Switch To Inline Menu' link
-
-                  no_auto_mt_title -> prevent &mt()ing the title arg
-
-                  inherit_jsmath -> when creating popup window in a page,
+             no_auto_mt_title -> prevent &mt()ing the title arg
+             inherit_jsmath -> when creating popup window in a page,
                                     should it have jsmath forced on by the
                                     current page
 
+=back
+
+=back
+
 =cut
 
 sub start_page {
@@ -6692,6 +6778,72 @@ sub personal_data_fieldtitles {
     return %fieldtitles;
 }
 
+sub sorted_inst_types {
+    my ($dom) = @_;
+    my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
+    my $othertitle = &mt('All users');
+    if ($env{'request.course.id'}) {
+        $othertitle  = 'any';
+    }
+    my @types;
+    if (ref($order) eq 'ARRAY') {
+        @types = @{$order};
+    }
+    if (@types == 0) {
+        if (ref($usertypes) eq 'HASH') {
+            @types = sort(keys(%{$usertypes}));
+        }
+    }
+    if (keys(%{$usertypes}) > 0) {
+        $othertitle = &mt('Other users');
+        if ($env{'request.course.id'}) {
+            $othertitle = 'other';
+        }
+    }
+    return ($othertitle,$usertypes,\@types);
+}
+
+sub get_institutional_codes {
+    my ($settings,$allcourses,$LC_code) = @_;
+# Get complete list of course sections to update
+    my @currsections = ();
+    my @currxlists = ();
+    my $coursecode = $$settings{'internal.coursecode'};
+
+    if ($$settings{'internal.sectionnums'} ne '') {
+        @currsections = split(/,/,$$settings{'internal.sectionnums'});
+    }
+
+    if ($$settings{'internal.crosslistings'} ne '') {
+        @currxlists = split(/,/,$$settings{'internal.crosslistings'});
+    }
+
+    if (@currxlists > 0) {
+        foreach (@currxlists) {
+            if (m/^([^:]+):(\w*)$/) {
+                unless (grep/^$1$/,@{$allcourses}) {
+                    push @{$allcourses},$1;
+                    $$LC_code{$1} = $2;
+                }
+            }
+        }
+    }
+ 
+    if (@currsections > 0) {
+        foreach (@currsections) {
+            if (m/^(\w+):(\w*)$/) {
+                my $sec = $coursecode.$1;
+                my $lc_sec = $2;
+                unless (grep/^$sec$/,@{$allcourses}) {
+                    push @{$allcourses},$sec;
+                    $$LC_code{$sec} = $lc_sec;
+                }
+            }
+        }
+    }
+    return;
+}
+
 =pod
 
 =back
@@ -6700,7 +6852,7 @@ sub personal_data_fieldtitles {
 
 =over 4
 
-=item * get_unprocessed_cgi($query,$possible_names)
+=item * &get_unprocessed_cgi($query,$possible_names)
 
 Modify the %env hash to contain unprocessed CGI form parameters held in
 $query.  The parameters listed in $possible_names (an array reference),
@@ -6729,7 +6881,7 @@ sub get_unprocessed_cgi {
 
 =pod
 
-=item * cacheheader() 
+=item * &cacheheader() 
 
 returns cache-controlling header code
 
@@ -6746,7 +6898,7 @@ sub cacheheader {
 
 =pod
 
-=item * no_cache($r) 
+=item * &no_cache($r) 
 
 specifies header code to not have cache
 
@@ -6782,7 +6934,7 @@ sub content_type {
 
 =pod
 
-=item * add_to_env($name,$value) 
+=item * &add_to_env($name,$value) 
 
 adds $name to the %env hash with value
 $value, if $name already exists, the entry is converted to an array
@@ -6809,7 +6961,7 @@ sub add_to_env {
 
 =pod
 
-=item * get_env_multiple($name) 
+=item * &get_env_multiple($name) 
 
 gets $name from the %env hash, it seemlessly handles the cases where multiple
 values may be defined and end up as an array ref.
@@ -6841,7 +6993,7 @@ sub get_env_multiple {
 
 =over 4
 
-=item * upfile_store($r)
+=item * &upfile_store($r)
 
 Store uploaded file, $r should be the HTTP Request object,
 needs $env{'form.upfile'}
@@ -6871,7 +7023,7 @@ sub upfile_store {
 
 =pod
 
-=item * load_tmp_file($r)
+=item * &load_tmp_file($r)
 
 Load uploaded file from tmp, $r should be the HTTP Request object,
 needs $env{'form.datatoken'},
@@ -6895,7 +7047,7 @@ sub load_tmp_file {
 
 =pod
 
-=item * upfile_record_sep()
+=item * &upfile_record_sep()
 
 Separate uploaded file into records
 returns array of records,
@@ -6917,7 +7069,7 @@ sub upfile_record_sep {
 
 =pod
 
-=item * record_sep($record)
+=item * &record_sep($record)
 
 Separate a record into fields $record should be an item from the upfile_record_sep(), needs $env{'form.upfiletype'}
 
@@ -7002,7 +7154,7 @@ sub record_sep {
 
 =pod
 
-=item * upfile_select_html()
+=item * &upfile_select_html()
 
 Return HTML code to select a file from the users machine and specify 
 the file type.
@@ -7049,7 +7201,7 @@ sub get_samples {
 
 =pod
 
-=item * csv_print_samples($r,$records)
+=item * &csv_print_samples($r,$records)
 
 Prints a table of sample values from each column uploaded $r is an
 Apache Request ref, $records is an arrayref from
@@ -7085,7 +7237,7 @@ sub csv_print_samples {
 
 =pod
 
-=item * csv_print_select_table($r,$records,$d)
+=item * &csv_print_select_table($r,$records,$d)
 
 Prints a table to create associations between values and table columns.
 
@@ -7131,7 +7283,7 @@ sub csv_print_select_table {
 
 =pod
 
-=item * csv_samples_select_table($r,$records,$d)
+=item * &csv_samples_select_table($r,$records,$d)
 
 Prints a table of sample values from the upload and can make associate samples to internal names.
 
@@ -7181,7 +7333,7 @@ sub csv_samples_select_table {
 
 =pod
 
-=item clean_excel_name($name)
+=item * &clean_excel_name($name)
 
 Returns a replacement for $name which does not contain any illegal characters.
 
@@ -7200,7 +7352,7 @@ sub clean_excel_name {
 
 =pod
 
-=item * check_if_partid_hidden($id,$symb,$udom,$uname)
+=item * &check_if_partid_hidden($id,$symb,$udom,$uname)
 
 Returns either 1 or undef
 
@@ -7241,7 +7393,7 @@ sub check_if_partid_hidden {
 
 =over 4
 
-=item get_cgi_id
+=item * &get_cgi_id()
 
 Inputs: none
 
@@ -7265,7 +7417,7 @@ sub get_cgi_id {
 
 =pod
 
-=item DrawBarGraph
+=item * &DrawBarGraph()
 
 Facilitates the plotting of data in a (stacked) bar graph.
 Puts plot definition data into the users environment in order for 
@@ -7400,7 +7552,7 @@ sub DrawBarGraph {
         $ValuesHash{$id.'.'.$key} = $value;
     }
     #
-    &Apache::lonnet::appenv(%ValuesHash);
+    &Apache::lonnet::appenv(\%ValuesHash);
     return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />';
 }
 
@@ -7409,7 +7561,7 @@ sub DrawBarGraph {
 
 =pod
 
-=item DrawXYGraph
+=item * &DrawXYGraph()
 
 Facilitates the plotting of data in an XY graph.
 Puts plot definition data into the users environment in order for 
@@ -7490,7 +7642,7 @@ sub DrawXYGraph {
         $ValuesHash{$id.'.'.$key} = $value;
     }
     #
-    &Apache::lonnet::appenv(%ValuesHash);
+    &Apache::lonnet::appenv(\%ValuesHash);
     return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />';
 }
 
@@ -7499,7 +7651,7 @@ sub DrawXYGraph {
 
 =pod
 
-=item DrawXYYGraph
+=item * &DrawXYYGraph()
 
 Facilitates the plotting of data in an XY graph with two Y axes.
 Puts plot definition data into the users environment in order for 
@@ -7592,7 +7744,7 @@ sub DrawXYYGraph {
         $ValuesHash{$id.'.'.$key} = $value;
     }
     #
-    &Apache::lonnet::appenv(%ValuesHash);
+    &Apache::lonnet::appenv(\%ValuesHash);
     return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />';
 }
 
@@ -7609,7 +7761,7 @@ Bad place for them but what the hell.
 
 =over 4
 
-=item &chartlink
+=item * &chartlink()
 
 Returns a link to the chart for a specific student.  
 
@@ -7648,9 +7800,9 @@ sub chartlink {
 
 =over 4
 
-=item &restore_course_settings 
+=item * &restore_course_settings()
 
-=item &store_course_settings
+=item * &store_course_settings()
 
 Restores/Store indicated form parameters from the course environment.
 Will not overwrite existing values of the form parameters.
@@ -7724,7 +7876,7 @@ sub store_settings {
                                  'got error:'.$put_result);
     }
     # Make sure these settings stick around in this session, too
-    &Apache::lonnet::appenv(%AppHash);
+    &Apache::lonnet::appenv(\%AppHash);
     return;
 }
 
@@ -7761,7 +7913,7 @@ sub restore_settings {
 
 =over 4
 
-=item &build_recipient_list
+=item * &build_recipient_list()
 
 Build recipient lists for three types of e-mail:
 (a) Error Reports, (b) Package Updates, (c) Help requests, generated by
@@ -7866,7 +8018,7 @@ sub commit_standardrole {
         $output = &mt('Assigning').' '.$three.' in '.$url.
                ($start?', '.&mt('starting').' '.localtime($start):'').
                ($end?', '.&mt('ending').' '.localtime($end):'').': ';
-        my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start);
+        my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start,'','',$context);
         if ($context eq 'auto') {
             $output .= $result.$linefeed;
         } else {
@@ -7901,7 +8053,7 @@ sub commit_studentrole {
                 }
                 $oldsecurl = $uurl;
                 $expire_role_result = 
-                    &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',$now);
+                    &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',$now,'','',$context);
                 if ($env{'request.course.sec'} ne '') { 
                     if ($expire_role_result eq 'refused') {
                         my @roles = ('st');
@@ -7924,7 +8076,7 @@ sub commit_studentrole {
             }
         }
         if (($expire_role_result eq 'ok') || ($secchange == 0)) {
-            $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid);
+            $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid,'',$context);
             if ($modify_section_result =~ /^ok/) {
                 if ($secchange == 1) {
                     if ($sec eq '') {