--- loncom/interface/loncommon.pm	2010/01/19 19:00:02	1.933
+++ loncom/interface/loncommon.pm	2010/03/29 13:40:03	1.963
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.933 2010/01/19 19:00:02 droeschl Exp $
+# $Id: loncommon.pm,v 1.963 2010/03/29 13:40:03 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1127,7 +1127,7 @@ sub help_open_topic {
     $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'
               .' alt="'.&mt('Help: [_1]',$topic).'"'
-              .' title="'.$title.'"' 
+              .' title="'.$title.'" style="vertical-align:middle;"' 
               .' /></a>';
     if ($text ne "") {	
         $template.='</span>';
@@ -1202,12 +1202,7 @@ ENDOUTPUT
 sub help_open_menu {
     my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) 
 	= @_;    
-    $stayOnPage = 0 if (not defined $stayOnPage);
-    # only use pop-up help (stayOnPage == 0)
-    # if environment.remote is on (using remote control UI)
-    if ($env{'environment.remote'} eq 'off' ) {
-        $stayOnPage=1;
-    }
+    $stayOnPage = 1;
     my $output;
     if ($component_help) {
 	if (!$text) {
@@ -1228,8 +1223,8 @@ sub help_open_menu {
 sub top_nav_help {
     my ($text) = @_;
     $text = &mt($text);
-    my $stay_on_page = 
-	($env{'environment.remote'} eq 'off' );
+    my $stay_on_page = 1;
+
     my $link = ($stay_on_page) ? "javascript:helpMenu('display')"
 	                     : "javascript:helpMenu('open')";
     my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page);
@@ -1244,10 +1239,7 @@ END
 
 sub help_menu_js {
     my ($text) = @_;
-
-    my $stayOnPage = 
-	($env{'environment.remote'} eq 'off' );
-
+    my $stayOnPage = 1;
     my $width = 620;
     my $height = 600;
     my $helptopic=&general_help();
@@ -1304,10 +1296,7 @@ sub help_open_bug {
     unless ($env{'user.adv'}) { return ''; }
     unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; }
     $text = "" if (not defined $text);
-    $stayOnPage = 0 if (not defined $stayOnPage);
-    if ($env{'environment.remote'} eq 'off' ) {
 	$stayOnPage=1;
-    }
     $width = 600 if (not defined $width);
     $height = 600 if (not defined $height);
 
@@ -1348,10 +1337,7 @@ sub help_open_faq {
     unless ($env{'user.adv'}) { return ''; }
     unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; }
     $text = "" if (not defined $text);
-    $stayOnPage = 0 if (not defined $stayOnPage);
-    if ($env{'environment.remote'} eq 'off' ) {
 	$stayOnPage=1;
-    }
     $width = 350 if (not defined $width);
     $height = 400 if (not defined $height);
 
@@ -3412,12 +3398,22 @@ sub get_previous_attempt {
       }
       $prevattempts=&start_data_table().&start_data_table_header_row();
       $prevattempts.='<th>'.&mt('History').'</th>';
+      my %typeparts;
+      my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'});
       foreach my $key (sort(keys(%lasthash))) {
 	my ($ign,@parts) = split(/\./,$key);
 	if ($#parts > 0) {
 	  my $data=$parts[-1];
 	  pop(@parts);
-	  $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.'&nbsp;</th>';
+          if ($data eq 'type') {
+              unless ($showsurv) {
+                  my $id = join(',',@parts);
+                  $typeparts{$ign.'.'.$id} = $lasthash{$key};
+              }
+              delete($lasthash{$key});
+          } else {
+	      $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.'&nbsp;</th>';
+          }
 	} else {
 	  if ($#parts == 0) {
 	    $prevattempts.='<th>'.$parts[0].'</th>';
@@ -3427,23 +3423,98 @@ sub get_previous_attempt {
 	}
       }
       $prevattempts.=&end_data_table_header_row();
+      my %lasthidden;
       if ($getattempt eq '') {
 	for ($version=1;$version<=$returnhash{'version'};$version++) {
-	  $prevattempts.=&start_data_table_row().
-	      '<td>'.&mt('Transaction [_1]',$version).'</td>';
-	    foreach my $key (sort(keys(%lasthash))) {
-		my $value = &format_previous_attempt_value($key,
-							   $returnhash{$version.':'.$key});
-		$prevattempts.='<td>'.$value.'&nbsp;</td>';   
-	    }
-	  $prevattempts.=&end_data_table_row();
+            my @hidden;
+            if (%typeparts) {
+                foreach my $id (keys(%typeparts)) {
+                    if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) {
+                        push(@hidden,$id);
+                        $lasthidden{$id} = 1;
+                    } elsif ($lasthidden{$id}) {
+                        if (exists($returnhash{$version.':'.$id.'.award'})) {
+                            delete($lasthidden{$id});
+                        }
+                    }
+                }
+            }
+            $prevattempts.=&start_data_table_row().
+                           '<td>'.&mt('Transaction [_1]',$version).'</td>';
+            if (@hidden) {
+                foreach my $key (sort(keys(%lasthash))) {
+                    my $hide;
+                    foreach my $id (@hidden) {
+                        if ($key =~ /^\Q$id\E/) {
+                            $hide = 1;
+                            last;
+                        }
+                    }
+                    if ($hide) {
+                        my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/);
+                        if (($data eq 'award') || ($data eq 'awarddetail')) {
+                            my $value = &format_previous_attempt_value($key,
+                                             $returnhash{$version.':'.$key});
+                            $prevattempts.='<td>'.$value.'&nbsp;</td>';
+                        } else {
+                            $prevattempts.='<td>&nbsp;</td>';
+                        }
+                    } else {
+                        if ($key =~ /\./) {
+                            my $value = &format_previous_attempt_value($key,
+                                              $returnhash{$version.':'.$key});
+                            $prevattempts.='<td>'.$value.'&nbsp;</td>';
+                        } else {
+                            $prevattempts.='<td>&nbsp;</td>';
+                        }
+                    }
+                }
+            } else {
+	        foreach my $key (sort(keys(%lasthash))) {
+		    my $value = &format_previous_attempt_value($key,
+			            $returnhash{$version.':'.$key});
+		    $prevattempts.='<td>'.$value.'&nbsp;</td>';
+	        }
+            }
+	    $prevattempts.=&end_data_table_row();
 	 }
       }
+      my @currhidden = keys(%lasthidden);
       $prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>';
       foreach my $key (sort(keys(%lasthash))) {
-	my $value = &format_previous_attempt_value($key,$lasthash{$key});
-	if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}
-	$prevattempts.='<td>'.$value.'&nbsp;</td>';
+          if (%typeparts) {
+              my $hidden;
+              foreach my $id (@currhidden) {
+                  if ($key =~ /^\Q$id\E/) {
+                      $hidden = 1;
+                      last;
+                  }
+              }
+              if ($hidden) {
+                  my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/);
+                  if (($data eq 'award') || ($data eq 'awarddetail')) {
+                      my $value = &format_previous_attempt_value($key,$lasthash{$key});
+                      if ($key =~/$regexp$/ && (defined &$gradesub)) {
+                          $value = &$gradesub($value);
+                      }
+                      $prevattempts.='<td>'.$value.'&nbsp;</td>';
+                  } else {
+                      $prevattempts.='<td>&nbsp;</td>';
+                  }
+              } else {
+                  my $value = &format_previous_attempt_value($key,$lasthash{$key});
+                  if ($key =~/$regexp$/ && (defined &$gradesub)) {
+                      $value = &$gradesub($value);
+                  }
+                  $prevattempts.='<td>'.$value.'&nbsp;</td>';
+              }
+          } else {
+	      my $value = &format_previous_attempt_value($key,$lasthash{$key});
+	      if ($key =~/$regexp$/ && (defined &$gradesub)) {
+                  $value = &$gradesub($value);
+              }
+	      $prevattempts.='<td>'.$value.'&nbsp;</td>';
+          }
       }
       $prevattempts.= &end_data_table_row().&end_data_table();
     } else {
@@ -3616,10 +3687,13 @@ sub submlink {
     }
     if (!$symb) { $symb=&Apache::lonnet::symbread(); }
     $symb=&escape($symb);
-    if ($target) { $target="target=\"$target\""; }
-    return '<a href="/adm/grades?&command=submission&'.
-	'symb='.$symb.'&student='.$uname.
-	'&userdom='.$udom.'" '.$target.'>'.$text.'</a>';
+    if ($target) { $target=" target=\"$target\""; }
+    return
+        '<a href="/adm/grades?command=submission'.
+        '&amp;symb='.$symb.
+        '&amp;student='.$uname.
+        '&amp;userdom='.$udom.'"'.
+        $target.'>'.$text.'</a>';
 }
 ##############################################
 
@@ -4146,16 +4220,39 @@ sub get_domainconf {
     if (defined($cached)) { return %{$result}; }
 
     my %domconfig = &Apache::lonnet::get_dom('configuration',
-					     ['login','rolecolors'],$udom);
+					     ['login','rolecolors','autoenroll'],$udom);
     my (%designhash,%legacy);
     if (keys(%domconfig) > 0) {
         if (ref($domconfig{'login'}) eq 'HASH') {
             if (keys(%{$domconfig{'login'}})) {
                 foreach my $key (keys(%{$domconfig{'login'}})) {
                     if (ref($domconfig{'login'}{$key}) eq 'HASH') {
-                        foreach my $img (keys(%{$domconfig{'login'}{$key}})) {
-                            $designhash{$udom.'.login.'.$key.'_'.$img} = 
-                                $domconfig{'login'}{$key}{$img};
+                        if ($key eq 'loginvia') {
+                            if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') {
+                                my @ids = &Apache::lonnet::current_machine_ids();
+                                foreach my $hostname (@ids) {
+                                    if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') {
+                                        if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) {
+                                            my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'};
+                                            $designhash{$udom.'.login.loginvia'} = $server;
+                                            if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') {
+
+                                                $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'};
+                                            } else {
+                                                 $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'};
+                                            }
+                                            if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) {
+                                                $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'};
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            foreach my $img (keys(%{$domconfig{'login'}{$key}})) {
+                                $designhash{$udom.'.login.'.$key.'_'.$img} = 
+                                    $domconfig{'login'}{$key}{$img};
+                            }
                         }
                     } else {
                         $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};
@@ -4182,6 +4279,11 @@ sub get_domainconf {
         } else {
             $legacy{'rolecolors'} = 1;
         }
+        if (ref($domconfig{'autoenroll'}) eq 'HASH') {
+            if ($domconfig{'autoenroll'}{'co-owners'}) {
+                $designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'};
+            }
+        }
         if (keys(%legacy) > 0) {
             my %legacyhash = &get_legacy_domconf($udom);
             foreach my $item (keys(%legacyhash)) {
@@ -4437,9 +4539,6 @@ Inputs:
 
 =item * $bgcolor, used to override the bgcolor on a webpage to a specific value
 
-=item * $no_inline_link, if true and in remote mode, don't show the 
-         'Switch To Inline Menu' link
-
 =item * $args, optional argument valid values are
             no_auto_mt_title -> prevents &mt()ing the title arg
             inherit_jsmath -> when creating popup window in a page,
@@ -4457,8 +4556,13 @@ other decorations will be returned.
 
 sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,
-        $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;
+        $no_nav_bar,$bgcolor,$args)=@_;
 
+    my $public;
+    if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
+        || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) {
+        $public = 1;
+    }
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
 
     $function = &get_users_function() if (!$function);
@@ -4508,7 +4612,7 @@ sub bodytag {
     } 
 
     my $name = &plainname($env{'user.name'},$env{'user.domain'});
-    if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
+    if ($public) {
 	undef($role);
     } else {
 	$name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'});
@@ -4529,8 +4633,6 @@ sub bodytag {
     $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;
     &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
 
-    if ($env{'environment.remote'} eq 'off') {
-        # No Remote
         if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { 
             return $bodytag; 
         } 
@@ -4567,12 +4669,12 @@ sub bodytag {
         $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;
 
         #don't show menus for public users
-        if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){
+        if (!$public){
             $bodytag .= Apache::lonmenu::secondary_menu();
             $bodytag .= Apache::lonmenu::serverform();
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
             if ($env{'request.state'} eq 'construct') {
-                $bodytag .= &Apache::lonmenu::innerregister($forcereg,'',
+                $bodytag .= &Apache::lonmenu::innerregister($forcereg,
                                 $args->{'bread_crumbs'});
             } elsif ($forcereg) { 
                 $bodytag .= &Apache::lonmenu::innerregister($forcereg);
@@ -4585,40 +4687,6 @@ sub bodytag {
         }
 
         return $bodytag;
-    }
-
-#
-# Top frame rendering, Remote is up
-#
-
-    my $imgsrc = $img;
-    if ($img =~ /^\/adm/) {
-        $imgsrc = &lonhttpdurl($img);
-    }
-    my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />';
-
-    # Explicit link to get inline menu
-    my $menu= ($no_inline_link?''
-	       :'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>');
-
-    if ($dc_info) {
-        $dc_info = qq|<span class="LC_cusr_subheading">($dc_info)</span>|;
-    }
-
-    $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>
-            <ol class="LC_primary_menu LC_right">
-                <li>$menu</li>
-            </ol><div id="LC_realm"> $realm $dc_info</div>| unless $env{'form.inhibitmenu'};
-    return(<<ENDBODY);
-$bodytag
-<table id="LC_title_bar" class="LC_with_remote">
-<tr><td>$upperleft</td>
-    <td>$messages&nbsp;</td>
-</tr>
-<tr><td>$titleinfo $dc_info $menu</td>
-</tr>
-</table>
-ENDBODY
 }
 
 sub dc_courseid_toggle {
@@ -4650,22 +4718,8 @@ sub make_attr_string {
 		delete($attr_ref->{$key});
 	    }
 	}
-	$attr_ref->{'onload'}  =
-	    &Apache::lonmenu::loadevents().  $on_load;
-	$attr_ref->{'onunload'}=
-	    &Apache::lonmenu::unloadevents().$on_unload;
-    }
-
-# Accessibility font enhance
-    if ($env{'browser.fontenhance'} eq 'on') {
-	my $style;
-	foreach my $key (keys(%{$attr_ref})) {
-	    if (lc($key) eq 'style') {
-		$style.=$attr_ref->{$key}.';';
-		delete($attr_ref->{$key});
-	    }
-	}
-	$attr_ref->{'style'}=$style.'; font-size: x-large;';
+	$attr_ref->{'onload'}  = $on_load;
+	$attr_ref->{'onunload'}= $on_unload;
     }
 
     my $attr_string;
@@ -4761,6 +4815,7 @@ sub standard_css {
     my $table_header         = '#DDDDDD';
     my $feedback_link_bg     = '#BBBBBB';
     my $lg_border_color      = '#C8C8C8';
+    my $button_hover         = '#BF2317';
 
     my $border = ($env{'browser.type'} eq 'explorer' ||
       $env{'browser.type'} eq 'safari'     ) ? '0 2px 0 2px'
@@ -4768,6 +4823,14 @@ sub standard_css {
 
 
     return <<END;
+
+/* needed for iframe to allow 100% height in FF */
+body, html { 
+    margin: 0;
+    padding: 0 0.5%;
+    height: 99%; /* to avoid scrollbars */
+}
+
 body {
   font-family: $sans;
   line-height:130%;
@@ -4775,7 +4838,8 @@ body {
   color:$font;
 }
 
-a:focus {
+a:focus,
+a:focus img {
   color: red;
   background: yellow;
 }
@@ -4792,11 +4856,23 @@ form, .inline {
   vertical-align:middle;
 }
 
-/* just for tests */
 .LC_400Box {
   width:400px;
 }
-/* end */
+
+.LC_iframecontainer {
+    width: 98%;
+    margin: 0;
+    position: fixed;
+    top: 8.5em;
+    bottom: 0;
+}
+
+.LC_iframecontainer iframe{
+    border: none;
+    width: 100%;
+    height: 100%;
+}
 
 .LC_filename {
   font-family: $mono;
@@ -4978,11 +5054,6 @@ td.LC_table_cell_checkbox {
   padding: 0;
 }
 
-/* Preliminary fix to hide breadcrumbs inside remote control window */
-#LC_remote #LC_breadcrumbs {
-  display:none;
-}
-
 #LC_head_subbox {
   clear:both;
   background: #F8F8F8; /* $sidebg; */
@@ -5004,6 +5075,14 @@ td.LC_table_cell_checkbox {
   padding-left:3px;
 }
 
+.LC_menubuttons_inline_text img{
+  vertical-align: middle;
+}
+
+li.LC_menubuttons_inline_text img,a {
+  cursor:pointer;
+}
+
 .LC_menubuttons_link {
   text-decoration: none;
 }
@@ -5023,8 +5102,7 @@ td.LC_menubuttons_text {
   background: $tabbg;
 }
 
-table.LC_data_table,
-table.LC_mail_list {
+table.LC_data_table {
   border: 1px solid #000000;
   border-collapse: separate;
   border-spacing: 1px;
@@ -5060,7 +5138,6 @@ table.LC_nested {
 
 table.LC_data_table tr th,
 table.LC_calendar tr th,
-table.LC_mail_list tr th,
 table.LC_prior_tries tr th,
 table.LC_innerpickbox tr th {
   font-weight: bold;
@@ -5113,13 +5190,20 @@ table.LC_data_table tr td.LC_leftcol_hea
 
 table.LC_data_table tr.LC_empty_row td,
 table.LC_nested tr.LC_empty_row td {
-  background-color: #FFFFFF;
   font-weight: bold;
   font-style: italic;
   text-align: center;
   padding: 8px;
 }
 
+table.LC_data_table tr.LC_empty_row td {
+  background-color: $sidebg;
+}
+
+table.LC_nested tr.LC_empty_row td {
+  background-color: #FFFFFF;
+}
+
 table.LC_caption {
 }
 
@@ -5224,37 +5308,43 @@ table.LC_calendar tr td.LC_calendar_day_
   background-color: $data_table_highlight;
 }
 
-table.LC_mail_list tr.LC_mail_new {
+table.LC_data_table tr td.LC_mail_new {
   background-color: $mail_new;
 }
 
-table.LC_mail_list tr.LC_mail_new:hover {
+table.LC_data_table tr.LC_mail_new:hover {
   background-color: $mail_new_hover;
 }
 
-table.LC_mail_list tr.LC_mail_read {
+table.LC_data_table tr td.LC_mail_read {
   background-color: $mail_read;
 }
 
-table.LC_mail_list tr.LC_mail_read:hover {
+/*
+table.LC_data_table tr.LC_mail_read:hover {
   background-color: $mail_read_hover;
 }
+*/
 
-table.LC_mail_list tr.LC_mail_replied {
+table.LC_data_table tr td.LC_mail_replied {
   background-color: $mail_replied;
 }
 
-table.LC_mail_list tr.LC_mail_replied:hover {
+/*
+table.LC_data_table tr.LC_mail_replied:hover {
   background-color: $mail_replied_hover;
 }
+*/
 
-table.LC_mail_list tr.LC_mail_other {
+table.LC_data_table tr td.LC_mail_other {
   background-color: $mail_other;
 }
 
-table.LC_mail_list tr.LC_mail_other:hover {
+/*
+table.LC_data_table tr.LC_mail_other:hover {
   background-color: $mail_other_hover;
 }
+*/
 
 table.LC_data_table tr > td.LC_browser_file,
 table.LC_data_table tr > td.LC_browser_file_published {
@@ -5284,23 +5374,23 @@ table.LC_data_table tr > td.LC_roles_is
 }
 
 table.LC_data_table tr > td.LC_roles_future {
-  background: #FFFF77;
+  border-right: 8px solid #FFFF77;
 }
 
 table.LC_data_table tr > td.LC_roles_will {
-  background: #FFAA77;
+  border-right: 8px solid #FFAA77;
 }
 
 table.LC_data_table tr > td.LC_roles_expired {
-  background: #FF7777;
+  border-right: 8px solid #FF7777;
 }
 
 table.LC_data_table tr > td.LC_roles_will_not {
-  background: #AAFF77;
+  border-right: 8px solid #AAFF77;
 }
 
 table.LC_data_table tr > td.LC_roles_selected {
-  background: #11CC55;
+  border-right: 8px solid #11CC55;
 }
 
 span.LC_current_location {
@@ -5762,56 +5852,41 @@ div.LC_clear_float_footer {
 }
 
 div.LC_grade_show_user {
-  margin-top: 20px;
-  border: 1px solid black;
+/*  border-left: 5px solid $sidebg; */
+  border-top: 5px solid #000000;
+  margin: 50px 0 0 0;
+  padding: 15px 0 5px 10px;
 }
 
-div.LC_grade_user_name {
-  background: #DDDDEE;
-  border-bottom: 1px solid black;
-  font-weight: bold;
-  font-size: large;
+div.LC_grade_show_user_odd_row {
+/*  border-left: 5px solid #000000; */
 }
 
-div.LC_grade_show_user_odd_row div.LC_grade_user_name {
-  background: #DDEEDD;
+div.LC_grade_show_user div.LC_Box {
+  margin-right: 50px;
 }
 
-div.LC_grade_show_problem,
 div.LC_grade_submissions,
 div.LC_grade_message_center,
-div.LC_grade_info_links,
-div.LC_grade_assign {
+div.LC_grade_info_links {
   margin: 5px;
   width: 99%;
   background: #FFFFFF;
 }
 
-div.LC_grade_show_problem_header,
 div.LC_grade_submissions_header,
-div.LC_grade_message_center_header,
-div.LC_grade_assign_header {
+div.LC_grade_message_center_header {
   font-weight: bold;
   font-size: large;
 }
 
-div.LC_grade_show_problem_problem,
 div.LC_grade_submissions_body,
-div.LC_grade_message_center_body,
-div.LC_grade_assign_body {
+div.LC_grade_message_center_body {
   border: 1px solid black;
   width: 99%;
   background: #FFFFFF;
 }
 
-span.LC_grade_check_note {
-  font-weight: normal;
-  font-size: medium;
-  display: inline;
-  position: absolute;
-  right: 1em;
-}
-
 table.LC_scantron_action {
   width: 100%;
 }
@@ -5845,15 +5920,8 @@ div.LC_edit_problem_header_title {
 }
 
 table.LC_edit_problem_header_title {
-  font-size: larger;
-  font-weight:  bold;
   width: 100%;
-  border-color: $pgbg;
-  border-style: solid;
-  border-width: $border;
   background: $tabbg;
-  border-collapse: collapse;
-  padding: 0;
 }
 
 div.LC_edit_problem_discards {
@@ -5886,13 +5954,6 @@ div.LC_createcourse {
   display:none;
 }
 
-/* ---- Remove when done ----
-# The following styles is part of the redesign of LON-CAPA and are
-# subject to change during this project.
-# Don't rely on their current functionality as they might be 
-# changed or removed.
-# --------------------------*/
-
 a:hover,
 ol.LC_primary_menu a:hover,
 ol#LC_MenuBreadcrumbs a:hover,
@@ -5900,7 +5961,7 @@ ol#LC_PathBreadcrumbs a:hover,
 ul#LC_secondary_menu a:hover,
 .LC_FormSectionClearButton input:hover
 ul.LC_TabContent   li:hover a {
-  color:#BF2317;
+  color:$button_hover;
   text-decoration:none;
 }
 
@@ -5967,7 +6028,7 @@ fieldset > legend {
 
 #LC_nav_bar {
   float: left;
-  margin: 0.2em 0 0 0;
+  margin: 0;
 }
 
 #LC_realm {
@@ -5984,12 +6045,7 @@ fieldset > legend {
 
 ol.LC_primary_menu {
   float: right;
-  margin: 0.2em 0 0 0;
-}
-
-span.LC_new_message{
-  font-weight:bold;
-  color: darkred;
+  margin: 0;
 }
 
 ol#LC_PathBreadcrumbs {
@@ -6004,14 +6060,19 @@ ol.LC_primary_menu li {
 
 ol.LC_primary_menu li img {
   vertical-align: bottom;
+  height: 1.1em;
 }
 
 ol.LC_primary_menu a {
-  font-size: 90%;
   color: RGB(80, 80, 80);
   text-decoration: none;
 }
 
+ol.LC_primary_menu a.LC_new_message {
+  font-weight:bold;
+  color: darkred;
+}
+
 ul#LC_secondary_menu {
   clear: both;
   color: $fontmenu;
@@ -6051,14 +6112,15 @@ ul#LC_secondary_menu li a {
 }
 
 ul.LC_TabContent {
-  min-height:1.5em;
+  min-height:20px;
 }
 
 ul.LC_TabContent li {
   vertical-align:middle;
-  padding: 0 10px 0 10px;
+  padding: 0 16px 0 10px;
   background-color:$tabbg;
   border-bottom:solid 1px $lg_border_color;
+  border-right: solid 1px $font;
 }
 
 ul.LC_TabContent .right {
@@ -6071,16 +6133,33 @@ ul.LC_TabContent li {
   text-decoration:none;
   font-size:95%;
   font-weight:bold;
-  padding-right: 16px;
+  min-height:20px;
+}
+
+ul.LC_TabContent li a:hover,
+ul.LC_TabContent li a:focus {
+  color: $button_hover;
+  background:none;
+  outline:none;
+}
+
+ul.LC_TabContent li:hover {
+  color: $button_hover;
+  cursor:pointer;
 }
 
-ul.LC_TabContent li:hover,
 ul.LC_TabContent li.active {
+  color: $font;
   background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;
-  border-bottom:solid 2px #FFFFFF;
-  padding-right: 16px;
+  border-bottom:solid 1px #FFFFFF;
+  cursor: default;
 }
 
+ul.LC_TabContent li.active a {
+  color:$font;
+  background:#FFFFFF;
+  outline: none;
+}
 #maincoursedoc {
   clear:both;
 }
@@ -6099,6 +6178,10 @@ ul.LC_TabContentBigger li {
   color: #737373;
 }
 
+ul.LC_TabContentBigger li.active {
+  position: relative;
+  top: 1px;
+}
 
 ul.LC_TabContentBigger li a {
   background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;
@@ -6107,28 +6190,31 @@ ul.LC_TabContentBigger li a {
   text-align: center;
   display: block;
   text-decoration: none;
+  outline: none;  
 }
 
-ul.LC_TabContentBigger li:hover a,
 ul.LC_TabContentBigger li.active a {
   background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;
   color:$font;
-  text-decoration: underline;
 }
 
-
 ul.LC_TabContentBigger li b {
   background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;
   display: block;
   float: left;
   padding: 0 30px;
+  border-bottom: 1px solid $lg_border_color;
+}
+
+ul.LC_TabContentBigger li:hover b {
+  color:$button_hover;
 }
 
-ul.LC_TabContentBigger li:hover b,
 ul.LC_TabContentBigger li.active b {
   background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;
   color:$font;
-  border-bottom: 1px solid #FFFFFF;
+  border: 0;
+  cursor:default;
 }
 
 
@@ -6338,14 +6424,6 @@ 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);
 }
@@ -6487,8 +6565,8 @@ sub headtag {
     if (!$args->{'frameset'}) {
 	$result .= &Apache::lonhtmlcommon::htmlareaheaders();
     }
-    if ($args->{'force_register'}) {
-	$result .= &Apache::lonmenu::registerurl(1);
+    if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) {
+        $result .= Apache::lonxml::display_title();
     }
     if (!$args->{'no_nav_bar'} 
 	&& !$args->{'only_body'}
@@ -6514,7 +6592,7 @@ ADDMETA
     $result .= '<title> LON-CAPA '.$title.'</title>'
 	.'<link rel="stylesheet" type="text/css" href="'.$url.'" />'
 	.$head_extra;
-    return $result;
+    return $result.'</head>';
 }
 
 =pod
@@ -6571,43 +6649,6 @@ sub xml_begin {
 
 =pod
 
-=item * &endheadtag()
-
-Returns a uniform </head> for LON-CAPA web pages.
-
-Inputs: none
-
-=cut
-
-sub endheadtag {
-    return '</head>';
-}
-
-=pod
-
-=item * &head()
-
-Returns a uniform complete <head>..</head> section for LON-CAPA web pages.
-
-Inputs:
-
-=over 4
-
-$title - optional title for the page
-
-$head_extra - optional extra HTML to put inside the <head>
-
-=back
-
-=cut
-
-sub head {
-    my ($title,$head_extra,$args) = @_;
-    return &headtag($title,$head_extra,$args).&endheadtag();
-}
-
-=pod
-
 =item * &start_page()
 
 Returns a complete <html> .. <body> section for LON-CAPA web pages.
@@ -6645,8 +6686,6 @@ $args - additional optional args support
              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 
-                                    'Switch To Inline Menu' link
              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
@@ -6677,7 +6716,7 @@ sub start_page {
     if (! exists($args->{'skip_phases'}{'head'}) ) {
 	$result.=
 	    &xml_begin().
-	    &headtag($title,$head_extra,\%head_args).&endheadtag();
+        &headtag($title,$head_extra,\%head_args);
     }
     
     if (! exists($args->{'skip_phases'}{'body'}) ) {
@@ -6691,8 +6730,7 @@ sub start_page {
                          $args->{'function'},       $args->{'add_entries'},
                          $args->{'only_body'},      $args->{'domain'},
                          $args->{'force_register'}, $args->{'no_nav_bar'},
-                         $args->{'bgcolor'},        $args->{'no_inline_link'},
-                         $args);
+                         $args->{'bgcolor'},        $args);
         }
     }
 
@@ -6712,7 +6750,8 @@ sub start_page {
     return $result if $args->{'only_body'};
 
     #Breadcrumbs for Construction Space provided by &bodytag. 
-    if (($env{'environment.remote'} eq 'off') && ($env{'request.state'} eq 'construct')) {
+    if (
+        $env{'request.state'} eq 'construct') {
         return $result;
     }
  
@@ -6736,28 +6775,6 @@ sub start_page {
     return $result;
 }
 
-
-=pod
-
-=item * &head()
-
-Returns a complete </body></html> section for LON-CAPA web pages.
-
-Inputs:         $args - additional optional args supported are:
-                 js_ready     -> return a string ready for being used in 
-                                 a javascript writeln
-                 html_encode  -> return a string ready for being used in 
-                                 a html attribute
-                 frameset     -> if true will start with a <frameset>
-                                 rather than <body>
-                 dicsussion   -> if true will get discussion from
-                                  lonxml::xmlend
-                                 (you can pass the target and parser arguments
-                                  through optional 'target' and 'parser' args
-                                  to this routine)
-
-=cut
-
 sub end_page {
     my ($args) = @_;
     $env{'internal.end_page'}++;
@@ -6847,15 +6864,26 @@ sub simple_error_page {
 
 {
     my @row_count;
+
+    sub start_data_table_count {
+        unshift(@row_count, 0);
+        return;
+    }
+
+    sub end_data_table_count {
+        shift(@row_count);
+        return;
+    }
+
     sub start_data_table {
 	my ($add_class) = @_;
 	my $css_class = (join(' ','LC_data_table',$add_class));
-	unshift(@row_count,0);
+	&start_data_table_count();
 	return '<table class="'.$css_class.'">'."\n";
     }
 
     sub end_data_table {
-	shift(@row_count);
+	&end_data_table_count();
 	return '</table>'."\n";;
     }
 
@@ -10009,19 +10037,19 @@ sub check_clone {
     my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
     my $clonemsg;
     my $can_clone = 0;
-    my $lctype = lc($args->{'type'});
+    my $lctype = lc($args->{'crstype'});
     if ($lctype ne 'community') {
         $lctype = 'course';
     }
     if ($clonehome eq 'no_host') {
-        if ($args->{'type'} eq 'Community') {
+        if ($args->{'crstype'} eq 'Community') {
             $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
         } else {
             $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
         }     
     } else {
 	my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
-        if ($args->{'type'} eq 'Community') {
+        if ($args->{'crstype'} eq 'Community') {
             if ($clonedesc{'type'} ne 'Community') {
                  $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
                 return ($can_clone, $clonemsg, $cloneid, $clonehome);
@@ -10040,7 +10068,7 @@ sub check_clone {
                 $can_clone = 1;
             } else {
                 my $ccrole = 'cc';
-                if ($args->{'type'} eq 'Community') {
+                if ($args->{'crstype'} eq 'Community') {
                     $ccrole = 'co';
                 }
 	        my %roleshash =
@@ -10049,9 +10077,11 @@ sub check_clone {
                                          'userroles',['active'],[$ccrole],
 					 [$args->{'clonedomain'}]);
 	        if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
-		    $can_clone = 1;
-	        } else {
-                    if ($args->{'type'} eq 'Community') {
+                    $can_clone = 1;
+                } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) {
+                    $can_clone = 1;
+                } else {
+                    if ($args->{'crstype'} eq 'Community') {
                         $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
                     } else {
                         $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
@@ -10110,11 +10140,19 @@ sub construct_course {
     # if anyone ever decides to not show this, and Utils::Course::new
     # will need to be suitably modified.
     $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed;
+    if ($$courseid =~ /^error:/) {
+        return (0,$outcome);
+    }
+
 #
 # Check if created correctly
 #
     ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);
     my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);
+    if ($crsuhome eq 'no_host') {
+        $outcome .= &mt('Course creation failed, unrecognized course home server.').$linefeed;
+        return (0,$outcome);
+    }
     $outcome .= &mt('Created on').': '.$crsuhome.$linefeed;
 
 #
@@ -10133,6 +10171,10 @@ sub construct_course {
 	$cenv{'url'}=$oldcenv{'url'};
 # Restore title
 	$cenv{'description'}=$oldcenv{'description'};
+# Restore creation date, creator and creation context.
+        $cenv{'internal.created'}=$oldcenv{'internal.created'};
+        $cenv{'internal.creator'}=$oldcenv{'internal.creator'};
+        $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'};
 # Mark as cloned
 	$cenv{'clonedfrom'}=$cloneid;
 # Need to clone grading mode
@@ -10379,7 +10421,7 @@ sub construct_course {
 	    $title=&mt('Syllabus');
             $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus';
         } else {
-            $title=&mt('Navigate Contents');
+            $title=&mt('Table of Contents');
             $url='/adm/navmaps';
         }
 
@@ -10396,6 +10438,8 @@ sub construct_course {
 ############################################################
 ############################################################
 
+#SD
+# only Community and Course, or anything else?
 sub course_type {
     my ($cid) = @_;
     if (!defined($cid)) {
@@ -10561,15 +10605,12 @@ sub init_user_environment {
     my %userenv = &Apache::lonnet::dump('environment',$domain,$username);
     my ($tmp) = keys(%userenv);
     if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
-	# default remote control to off
-	if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; }
     } else {
 	undef(%userenv);
     }
     if (($userenv{'interface'}) && (!$form->{'interface'})) {
 	$form->{'interface'}=$userenv{'interface'};
     }
-    $env{'environment.remote'}=$userenv{'remote'};
     if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; }
 
 # --------------- Do not trust query string to be put directly into environment
@@ -10601,9 +10642,6 @@ sub init_user_environment {
 	    $initial_env{"browser.localres"}   = $form->{'localres'};
         }
 	
-	if ($public) {
-	    $initial_env{"environment.remote"} = "off";
-	}
 	if ($form->{'interface'}) {
 	    $form->{'interface'}=~s/\W//gs;
 	    $initial_env{"browser.interface"} = $form->{'interface'};