--- loncom/interface/lonmenu.pm	2012/05/28 22:22:20	1.369.2.11
+++ loncom/interface/lonmenu.pm	2012/08/27 15:53:40	1.369.2.22
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines to control the menu
 #
-# $Id: lonmenu.pm,v 1.369.2.11 2012/05/28 22:22:20 raeburn Exp $
+# $Id: lonmenu.pm,v 1.369.2.22 2012/08/27 15:53:40 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -131,6 +131,26 @@ Inputs: 4 - (a) link and (b) target for
 
 This gets called in order to register a URL in the body of the document
 
+=item loadevents()
+
+=item unloadevents()
+
+=item startupremote()
+
+=item setflags()
+
+=item maincall()
+
+=item load_remote_msg()
+
+=item get_menu_name()
+
+=item reopenmenu()
+
+=item open()
+
+Open the menu
+
 =item clear()
 
 =item switch()
@@ -247,9 +267,7 @@ sub primary_menu {
             my @primsub;
             if (ref($primary_submenu{$title}) eq 'ARRAY') {
                 foreach my $item (@{$primary_submenu{$title}}) {
-                    next if (($item->[2] eq 'wishlist') && 
-                             ((!&Apache::lonnet::allowed('bre',"/res/$env{'user.domain'}/")) &&
-                              (!&Apache::lonnet::allowed('bro',"/res/$env{'user.domain'}/"))));
+                    next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'})); 
                     next if (($item->[2] eq 'reqcrs') && (!&check_for_rcrs()));
                     next if ((($item->[2] eq 'portfolio') || 
                              ($item->[2] eq 'blog')) && 
@@ -425,8 +443,10 @@ sub secondary_menu {
     }
     $menu =~ s/\[uname\]/$$author{user}/g;
     $menu =~ s/\[udom\]/$$author{dom}/g;
-
-    return "<ul id=\"LC_secondary_menu\">$menu</ul>";
+    if ($menu) {
+        $menu = "<ul id=\"LC_secondary_menu\">$menu</ul>";
+    }
+    return $menu;
 }
 
 sub create_submenu {
@@ -460,6 +480,34 @@ sub create_submenu {
     return $menu;
 }
 
+sub registerurl {
+    my ($forcereg) = @_;
+    my $result = '';
+    if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
+    my $force_title='';
+    if ($env{'request.state'} eq 'construct') {
+        $force_title=&Apache::lonxml::display_title();
+    }
+    if (($env{'environment.remote'} eq 'off') ||
+        ((($env{'request.publicaccess'}) ||
+         (!&Apache::lonnet::is_on_map(
+           &unescape($env{'request.noversionuri'})))) &&
+        (!$forcereg))) {
+        return
+        $result
+       .'<script type="text/javascript">'."\n"
+       .'// <![CDATA['."\n"
+       .'function LONCAPAreg(){;} function LONCAPAstale(){}'."\n"
+       .'// ]]>'."\n"
+       .'</script>'
+       .$force_title;
+    }
+# Graphical display after login only
+    if ($env{'request.registered'} && !$forcereg) { return ''; }
+    $result.=&innerregister($forcereg);
+    return $result.$force_title;
+}
+
 sub innerregister {
     my ($forcereg,$bread_crumbs) = @_;
     my $const_space = ($env{'request.state'} eq 'construct');
@@ -469,8 +517,19 @@ sub innerregister {
 
     $env{'request.registered'} = 1;
 
+    my $noremote = ($env{'environment.remote'} eq 'off');
+
     undef(@inlineremote);
 
+    my $reopen=&Apache::lonmenu::reopenmenu();
+
+    my $newmail='';
+
+    if (&Apache::lonmsg::newmail() && !$noremote) {
+        # We have new mail and remote is up
+        $newmail= 'swmenu.setstatus("you have","messages");';
+    }
+
     my $resurl; 
     if ( $env{'request.symb'} && $env{'request.course.id'} ) {
 
@@ -509,11 +568,11 @@ sub innerregister {
         &Apache::lonhtmlcommon::clear_breadcrumbs();
         &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
     }
+    my $timesync   = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' );
 # =============================================================================
 # ============================ This is for URLs that actually can be registered
-    return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) 
-                       || $forcereg );
-
+    if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/})
+                       || ($forcereg)) {
 # -- This applies to homework problems for users with grading privileges
 	my $crs='/'.$env{'request.course.id'};
 	if ($env{'request.course.sec'}) {
@@ -521,30 +580,38 @@ sub innerregister {
 	}
 	$crs=~s/\_/\//g;
 
+        my %swtext;
+        if ($noremote) {
+            %swtext = &get_inline_text();
+        } else {
+            %swtext = &get_rc_text();
+        } 
         my $hwkadd='';
         if ($env{'request.symb'} ne '' &&
 	    $env{'request.filename'}=~/$LONCAPA::assess_re/) {
 	    if (&Apache::lonnet::allowed('mgr',$crs)) {
-		$hwkadd.=&switch('','',7,2,'pgrd.png','Content Grades','grades[_4]',
+		$hwkadd.=&switch('','',7,2,'pgrd.png',$swtext{'pgrd'},'grades[_4]',
                        "gocmd('/adm/grades','gradingmenu')",
                        'Content Grades');
             } elsif (&Apache::lonnet::allowed('vgr',$crs)) {
-		$hwkadd.=&switch('','',7,2,'subm.png','Content Submissions','missions[_1]',
+		$hwkadd.=&switch('','',7,2,'subm.png',$swtext{'subm'},'missions[_1]',
                        "gocmd('/adm/grades','submission')",
 		       'Content Submissions');
             }
 	}
 	if ($env{'request.symb'} ne '' &&
 	    &Apache::lonnet::allowed('opa',$crs)) {
-	    $hwkadd.=&switch('','',7,3,'pparm.png','Content Settings','parms[_2]',
+	    $hwkadd.=&switch('','',7,3,'pparm.png',$swtext{'pparm'},'parms[_2]',
 			     "gocmd('/adm/parmset','set')",
 			     'Content Settings');
 	}
-        if ($env{'request.symb'}=~/^uploaded/ &&
-            &Apache::lonnet::allowed('mdc',$crs)) {
-            $hwkadd.=&switch('','',7,4,'docs.png','Folder/Page Content','parms[_2]',
-                             "gocmd('/adm/coursedocs','direct')",
-                             'Folder/Page Content');
+        if ($noremote) {  
+            if ($env{'request.symb'}=~/^uploaded/ &&
+                &Apache::lonnet::allowed('mdc',$crs)) {
+                $hwkadd.=&switch('','',7,4,'docs.png',$swtext{'docs'},'parms[_2]',
+                                 "gocmd('/adm/coursedocs','direct')",
+                                 'Folder/Page Content');
+            }
         }
 # -- End Homework
         ###
@@ -587,7 +654,7 @@ sub innerregister {
 		my @ids=&Apache::lonnet::current_machine_ids();
 		foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
 		if (!$allowed) {
-		    $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);
+		    $editbutton=&switch('','',6,1,,$top,$bottom,$action,$desc);
                     $noeditbutton = 0;
                 }
             }
@@ -654,7 +721,7 @@ sub innerregister {
                         }
                     }
                     $editbutton=&switch
-                       ('','',6,1,'pcstr.png','Edit','resource[_2]',
+                       ('','',6,1,'pcstr.png',$swtext{'pcstr'},'resource[_2]',
                         $bot,"Edit this resource");
                     $noeditbutton = 0;
                 }
@@ -670,7 +737,7 @@ sub innerregister {
                         my $cfile = &edit_course_upload($file,$cnum,$cdom);
                         if ($cfile) {
                             $editbutton=&switch
-                                        ('','',6,1,'pcstr.png','Edit',
+                                        ('','',6,1,'pcstr.png',$swtext{'pcstr'},
                                          'resource[_2]',"go('".$cfile."');",
                                          'Edit this resource');
                         }
@@ -682,7 +749,7 @@ sub innerregister {
             if ($resurl eq "public/$cdom/$cnum/syllabus") {
                 if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) {
                     if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
-                        $editbutton=&switch('','',6,1,'pcstr.png','Edit',
+                        $editbutton=&switch('','',6,1,'pcstr.png',$swtext{'pcstr'},
                                             'resource[_2]',
                                             "go('/adm/courseprefs?phase=display&actions=courseinfo')",
                                             'Edit this resource');
@@ -693,7 +760,7 @@ sub innerregister {
         ###
         ###
 # Prepare the rest of the buttons
-        my $menuitems;
+        my ($menuitems,$got_prt,$got_wishlist,$cstritems);
         if ($const_space) {
 #
 # We are in construction space
@@ -719,6 +786,10 @@ s&6&3&pub.png&Publish&resource[_3]&gocst
 s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource
 s&7&2&prt.png&Print&printout[_1]&gocstr('/adm/printout','/priv/$udom/$uname/$cleandisfn')&Prepare a printable document
 ENDMENUITEMS
+                unless ($noremote) {
+                    $cstritems = $menuitems;
+                    undef($menuitems);
+                }
             }
                 if (ref($bread_crumbs) eq 'ARRAY') {
                     &Apache::lonhtmlcommon::clear_breadcrumbs();
@@ -729,24 +800,28 @@ ENDMENUITEMS
         } elsif ( defined($env{'request.course.id'}) && 
 		 $env{'request.symb'} ne '' ) {
 #
-# We are in a course and looking at a registred URL
+# We are in a course and looking at a registered URL
 # Should probably be in mydesk.tab
 #
+
 	    $menuitems=(<<ENDMENUITEMS);
 c&3&1
-s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1
-s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3
+s&2&1&back.png&$swtext{'back'}&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1
+s&2&3&forw.png&$swtext{'forw'}&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3
 c&6&3
 c&8&1
 c&8&2
-s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
+s&8&3&prt.png&$swtext{'prt'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 ENDMENUITEMS
-            if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F' && $env{'request.uri'} =~ /^\/res/) {
+            $got_prt = 1;
+            if (($env{'user.adv'}) && ($env{'request.uri'} =~ /^\/res/)
+                && (!$env{'request.enc'})) {
                 # wishlist is only available for users with access to resource-pool
                 # and links can only be set for resources within the resource-pool
                 $menuitems .= (<<ENDMENUITEMS);
-s&9&1&wishlist-link.png&Stored Links&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
+s&9&1&alnk.png&$swtext{'alnk'}&linkstor[_1]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
 ENDMENUITEMS
+                $got_wishlist = 1;
             }
 
 my $currentURL = &Apache::loncommon::get_symb();
@@ -758,32 +833,52 @@ if(length($annotation) > 0){
 }else{
 	$menuitems.="anot.png";
 }
-$menuitems.="&Notes&&annotate()&";
+$menuitems.="&$swtext{'anot'}&tations[_1]&annotate()&";
 $menuitems.="Make notes and annotations about this resource&&1\n";
 
             unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {
-		if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) {
+		if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/}) && ($env{'request.noversionuri'} !~ m{^/uploaded/$match_domain/$match_courseid/docs/})) {
 		    $menuitems.=(<<ENDREALRES);
-s&6&3&catalog.png&Info&info[_1]&catalog_info()&Show Metadata
+s&6&3&catalog.png&$swtext{'catalog'}&info[_1]&catalog_info()&Show Metadata
 ENDREALRES
                 }
-	        $menuitems.=(<<ENDREALRES);
-s&8&1&eval.png&Evaluate&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
-s&8&2&fdbk.png&Communicate&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource
+                unless ($env{'request.noversionuri'} =~ m{^/uploaded/$match_domain/$match_courseid/docs/}) {
+	            $menuitems.=(<<ENDREALRES);
+s&8&1&eval.png&$swtext{'eval'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
+ENDREALRES
+                }
+                $menuitems.=(<<ENDREALRES);
+s&8&2&fdbk.png&$swtext{'fdbk'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource
 ENDREALRES
 	    }
         }
 	if ($env{'request.uri'} =~ /^\/res/) {
-	    $menuitems .= (<<ENDMENUITEMS);
-s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
+            unless ($got_prt) {
+	        $menuitems .= (<<ENDMENUITEMS);
+s&8&3&prt.png&$swtext{'prt'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 ENDMENUITEMS
-            if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F') {
-                # wishlist is only available for users with access to resource-pool
-                $menuitems .= (<<ENDMENUITEMS);
-s&9&1&wishlist-link.png&Stored Links&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
+                $got_prt = 1;
+            }
+            unless ($got_wishlist) {
+                if (($env{'user.adv'}) && (!$env{'request.enc'})) {
+                    # wishlist is only available for users with access to resource-pool
+                    $menuitems .= (<<ENDMENUITEMS);
+s&9&1&alnk.png&$swtext{'alnk'}&linkstor[_1]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
 ENDMENUITEMS
+                    $got_wishlist = 1;
+                }
             }
 	}
+        unless ($got_prt) {
+            $menuitems .= (<<ENDMENUITEMS);
+c&8&3
+ENDMENUITEMS
+        }
+        unless ($got_wishlist) {
+            $menuitems .= (<<ENDMENUITEMS);
+c&9&1
+ENDMENUITEMS
+        }
         my $buttons='';
         foreach (split(/\n/,$menuitems)) {
 	    my ($command,@rest)=split(/\&/,$_);
@@ -802,48 +897,188 @@ ENDMENUITEMS
                 }
             }
         }
-
+        if ($noremote) {
 	    my $addremote=0;
 	    foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }
-    if ($addremote) {
+            if ($addremote) {
 
-        &Apache::lonhtmlcommon::clear_breadcrumb_tools();
+                &Apache::lonhtmlcommon::clear_breadcrumb_tools();
 
-            &Apache::lonhtmlcommon::add_breadcrumb_tool(
-                'navigation', @inlineremote[21,23]);
+                &Apache::lonhtmlcommon::add_breadcrumb_tool(
+                    'navigation', @inlineremote[21,23]);
 
-        my $countdown = &countdown_timer();
-        if (&hidden_button_check() eq 'yes') {
-            if ($countdown) {
-                &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown);
+                my $countdown = &countdown_timer();
+                if (&hidden_button_check() eq 'yes') {
+                    if ($countdown) {
+                        &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown);
+                    }
+                } else {
+                    my @tools = @inlineremote[93,91,81,82,83];
+                    if ($countdown) {
+                        unshift(@tools,$countdown);
+                    }
+                    &Apache::lonhtmlcommon::add_breadcrumb_tool(
+                        'tools',@tools);
+
+                    #publish button in construction space
+                    if ($env{'request.state'} eq 'construct'){
+                        &Apache::lonhtmlcommon::add_breadcrumb_tool(
+                            'advtools', $inlineremote[63]);
+                    } else {
+                        &Apache::lonhtmlcommon::add_breadcrumb_tool(
+                            'tools', $inlineremote[63]);
+                    }
+                    unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {
+                        &Apache::lonhtmlcommon::add_breadcrumb_tool(
+                            'advtools', @inlineremote[61,71,72,73,74,92]);
+                    }
+                }
             }
+            return   &Apache::lonhtmlcommon::scripttag('', 'start')
+                   . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
+                   . &Apache::lonhtmlcommon::scripttag('', 'end');
+
         } else {
-            my @tools = @inlineremote[93,91,81,82,83];
-            if ($countdown) {
-                unshift(@tools,$countdown);
-            }
-            &Apache::lonhtmlcommon::add_breadcrumb_tool(
-                'tools',@tools);
+            my $cstrcrumbs;
+            if ($const_space) {
+                foreach (split(/\n/,$cstritems)) {
+                    my ($command,@rest)=split(/\&/,$_);
+                    my $idx=10*$rest[0]+$rest[1];
+                    &switch('','',@rest);
+                }
+                &Apache::lonhtmlcommon::add_breadcrumb_tool('advtools',
+                                                            @inlineremote[63,61,71,72]);
+
+                $cstrcrumbs = &Apache::lonhtmlcommon::scripttag('', 'start')
+                             .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
+                             .&Apache::lonhtmlcommon::scripttag('', 'end');
+            }
+            my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
+            $requri=&Apache::lonenc::check_encrypt(&unescape($requri));
+            my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
+            my $navstatus=&get_nav_status();
+            my $clearcstr;
 
-            #publish button in construction space
-            if ($env{'request.state'} eq 'construct'){
-                &Apache::lonhtmlcommon::add_breadcrumb_tool(
-                     'advtools', $inlineremote[63]);
-            } else {
-                &Apache::lonhtmlcommon::add_breadcrumb_tool(
-                     'tools', $inlineremote[63]);
-            }
-            
-            unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {
-                &Apache::lonhtmlcommon::add_breadcrumb_tool(
-                    'advtools', @inlineremote[61,71,72,73,74,92]);
-            }
+            if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; }
+            return <<ENDREGTHIS;
+
+<script type="text/javascript">
+// <![CDATA[
+// BEGIN LON-CAPA Internal
+var swmenu=null;
+
+    function LONCAPAreg() {
+          swmenu=$reopen;
+          swmenu.clearTimeout(swmenu.menucltim);
+          $timesync
+          $newmail
+          $buttons
+          swmenu.currentURL="$requri";
+          swmenu.reloadURL=swmenu.currentURL+window.location.search;
+          swmenu.currentSymb="$cursymb";
+          swmenu.reloadSymb="$cursymb";
+          swmenu.currentStale=0;
+          $navstatus
+          $hwkadd
+          $editbutton
+    }
+
+    function LONCAPAstale() {
+          swmenu=$reopen
+          swmenu.currentStale=1;
+          if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) {
+             swmenu.switchbutton
+             (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
+          }
+          swmenu.clearbut(7,2);
+          swmenu.clearbut(7,3);
+          swmenu.menucltim=swmenu.setTimeout(
+ 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
+ 'clearbut(9,1);clearbut(9,3);clearbut(6,3);$clearcstr',
+                          2000);
+      }
+
+// END LON-CAPA Internal
+// ]]>
+</script>
+
+$cstrcrumbs
+ENDREGTHIS
         }
+    } else {
+       unless ($noremote) {
+# Not registered, graphical
+           return (<<ENDDONOTREGTHIS);
+
+<script type="text/javascript">
+// <![CDATA[
+// BEGIN LON-CAPA Internal
+var swmenu=null;
+
+    function LONCAPAreg() {
+          swmenu=$reopen
+          $timesync
+          swmenu.currentStale=1;
+          swmenu.clearbut(2,1);
+          swmenu.clearbut(2,3);
+          swmenu.clearbut(8,1);
+          swmenu.clearbut(8,2);
+          swmenu.clearbut(8,3);
+          swmenu.clearbut(9,1);
+          if (swmenu.currentURL) {
+             swmenu.switchbutton
+              (3,1,'reload.gif','return','location','go(currentURL)');
+          } else {
+              swmenu.clearbut(3,1);
+          }
     }
 
-    return   &Apache::lonhtmlcommon::scripttag('', 'start')
-           . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
-           . &Apache::lonhtmlcommon::scripttag('', 'end');
+    function LONCAPAstale() {
+    }
+
+// END LON-CAPA Internal
+// ]]>
+</script>
+ENDDONOTREGTHIS
+
+        }
+        return '';
+    }
+}
+
+sub get_inline_text {
+    my %text = (
+                 pgrd     => 'Content Grades',
+                 subm     => 'Content Submissions',
+                 pparm    => 'Content Settings',
+                 docs     => 'Folder/Page Content',
+                 pcstr    => 'Edit',
+                 prt      => 'Print',
+                 alnk     => 'Stored Links',
+                 anot     => 'Notes',
+                 catalog  => 'Info',
+                 eval     => 'Evaluate',
+                 fdbk     => 'Feedback',
+    );
+    return %text;
+}
+
+sub get_rc_text {
+    my %text = (
+                   pgrd    => 'problem[_1]',
+                   subm    => 'view sub-[_1]',
+                   pparm   => 'problem[_2]',
+                   pcstr   => 'edit[_1]',
+                   prt     => 'prepare[_1]',
+                   back    => 'backward[_1]',
+                   forw    => 'forward[_1]',
+                   alnk    => 'add to[_1]',
+                   anot    => 'anno-[_1]',
+                   catalog => 'catalog[_2]',
+                   eval    => 'evaluate[_1]',
+                   fdbk    => 'feedback[_1]',
+    );
+    return %text;
 }
 
 sub is_course_upload {
@@ -882,10 +1117,22 @@ sub edit_course_upload {
     return $cfile;
 }
 
+sub loadevents() {
+    if ($env{'request.state'} eq 'construct' ||
+        $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
+    return 'LONCAPAreg();';
+}
+
+sub unloadevents() {
+    if ($env{'request.state'} eq 'construct' ||
+        $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
+    return 'LONCAPAstale();';
+}
+
 sub startupremote {
     my ($lowerurl)=@_;
-    if ($env{'environment.remote'} eq 'off') {
-     return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');
+    unless ($env{'environment.remote'} eq 'on') {
+        return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');
     }
 #
 # The Remote actually gets launched!
@@ -963,7 +1210,7 @@ ENDSETFLAGS
 }
 
 sub maincall() {
-    if ($env{'environment.remote'} eq 'off') { return ''; }
+    unless ($env{'environment.remote'} eq 'on') { return ''; }
     return(<<ENDMAINCALL);
 <script type="text/javascript">
 // <![CDATA[
@@ -976,7 +1223,7 @@ ENDMAINCALL
 sub load_remote_msg {
     my ($lowerurl)=@_;
 
-    if ($env{'environment.remote'} eq 'off') { return ''; }
+    unless ($env{'environment.remote'} eq 'on') { return ''; }
 
     my $esclowerurl=&escape($lowerurl);
     my $link=&mt('[_1]Continue[_2] on in Inline Menu mode'
@@ -1000,7 +1247,7 @@ sub get_menu_name {
 
 
 sub reopenmenu {
-   if ($env{'environment.remote'} eq 'off') { return ''; }
+   unless ($env{'environment.remote'} eq 'on') { return ''; }
    my $menuname = &get_menu_name();
    my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
    return('window.open('.$nothing.',"'.$menuname.'","",false);');
@@ -1009,7 +1256,7 @@ sub reopenmenu {
 
 sub open {
     my $returnval='';
-    if ($env{'environment.remote'} eq 'off') {
+    unless ($env{'environment.remote'} eq 'on') {
         return
         '<script type="text/javascript">'."\n"
        .'// <![CDATA['."\n"
@@ -1044,8 +1291,13 @@ ENDOPEN
 
 sub clear {
     my ($row,$col)=@_;
-    $inlineremote[10*$row+$col]='';
-    return ''; 
+    if ($env{'environment.remote'} eq 'on') {
+       if (($row<1) || ($row>13)) { return ''; }
+       return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););
+    } else {
+        $inlineremote[10*$row+$col]='';
+        return '';
+    }
 }
 
 # ============================================ Switch a button or create a link
@@ -1062,6 +1314,24 @@ sub switch {
     my $idx=10*$row+$col;
     $category_members{$cat}.=':'.$idx;
 
+    if ($env{'environment.remote'} eq 'on') {
+        if (($row<1) || ($row>13)) { return ''; }
+        if ($env{'request.state'} eq 'construct') {
+            my $text = $top.' '.$bot;
+            $text=~s/\s*\-\s*//gs;
+            my $pic = '<img alt="'.$text.'" src="'.
+                      &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
+                      '" align="'.($nobreak==3?'right':'left').'" class="LC_icon" />';
+           $inlineremote[$idx] =
+               '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.
+               $pic.'<span class="LC_menubuttons_inline_text">'.$top.'&nbsp;</span></a>';
+        }
+# Remote
+        $img=~s/\.png$/\.gif/;
+        return "\n".
+ qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););
+    }
+
 # Inline Menu
     if ($nobreak==2) { return ''; }
     my $text=$top.' '.$bot;
@@ -1123,6 +1393,13 @@ sub secondlevel {
     return $output;
 }
 
+sub openmenu {
+    my $menuname = &get_menu_name();
+    unless ($env{'environment.remote'} eq 'on') { return ''; }
+    my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
+    return "window.open(".$nothing.",'".$menuname."');";
+}
+
 sub inlinemenu {
     undef(@inlineremote);
     undef(%category_members);
@@ -1165,7 +1442,13 @@ sub rawconfig {
 #
     my $textualoverride=shift;
     my $output='';
-    return '' unless $textualoverride;
+    if ($env{'environment.remote'} eq 'on') {
+       $output.=
+ "window.status='Opening Remote Control';var swmenu=".&openmenu().
+"\nwindow.status='Configuring Remote Control ';";
+    } else {
+        unless ($textualoverride) { return ''; }
+    }
     my $uname=$env{'user.name'};
     my $udom=$env{'user.domain'};
     my $adv=$env{'user.adv'};
@@ -1340,6 +1623,12 @@ sub rawconfig {
           $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
         }
     }
+    if ($env{'environment.remote'} eq 'on') {
+        $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';";
+        if (&Apache::lonmsg::newmail()) {
+            $output.='swmenu.setstatus("you have","messages");';
+        }
+    }
     return $output;
 }
 
@@ -1368,7 +1657,7 @@ sub check_for_rcrs {
 # ======================================================================= Close
 
 sub close {
-    if ($env{'environment.remote'} eq 'off') { return ''; }
+    unless ($env{'environment.remote'} eq 'on') { return ''; }
     my $menuname = &get_menu_name();
     return(<<ENDCLOSE);
 <script type="text/javascript">
@@ -1653,6 +1942,16 @@ sub constspaceform {
 ENDCONSTSPACEFORM
 }
 
+sub get_nav_status {
+    my $navstatus="swmenu.w_loncapanav_flag=";
+    if ($env{'environment.remotenavmap'} eq 'on') {
+        $navstatus.="1";
+    } else {
+        $navstatus.="-1";
+    }
+    return $navstatus;
+}
+
 sub hidden_button_check {
     if ( $env{'request.course.id'} eq ''
          || $env{'request.role.adv'} ) {
@@ -2024,10 +2323,20 @@ sub countdown_timer {
         ($env{'request.filename'}=~/$LONCAPA::assess_re/) &&
         ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
         my $duedate = &Apache::lonnet::EXT("resource.0.duedate");
-        if ($duedate && $duedate > time) {
+        my @interval=&Apache::lonnet::EXT("resource.0.interval");
+        my $hastimeleft;
+        if (@interval > 1) {
+            my $first_access=&Apache::lonnet::get_first_access($interval[1]);
+            if ($first_access > 0) {
+                if ($first_access+$interval[0] > time) {
+                    $hastimeleft = 1;
+                }
+            }
+        }
+        if (($duedate && $duedate > time) ||
+            (!$duedate && $hastimeleft)) {
             my ($collapse,$expand,$alttxt,$title,$currdisp);
-            my @interval=&Apache::lonnet::EXT("resource.0.interval");
-            if (@interval > 1) {
+            if (@interval > 1 && $hastimeleft) {
                 $currdisp = 'inline';
                 $collapse = '&#9658;&nbsp;';
             } else {