--- loncom/interface/lonmenu.pm	2008/02/03 05:07:58	1.234
+++ loncom/interface/lonmenu.pm	2008/12/13 15:55:40	1.239.4.2
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines to control the menu
 #
-# $Id: lonmenu.pm,v 1.234 2008/02/03 05:07:58 raeburn Exp $
+# $Id: lonmenu.pm,v 1.239.4.2 2008/12/13 15:55:40 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -74,6 +74,7 @@ sub initlittle {
 				       'main' => 'Main Menu',
                                        'roles' => (&show_course()?
                                                     'Courses':'Roles'),
+                                       'other' => 'Other Roles',
                                        'docs' => 'Edit Course',
                                        'exit' => 'Exit',
                                        'login' => 'Log In',
@@ -101,7 +102,10 @@ sub menubuttons {
     my $reloadlink='';
     my $docs='';
     my $groups='';
+    my $roles='<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';
+    my $role_selector;
     my $showgroups=0;
+    my ($cnum,$cdom);
     my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));
     my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));
 
@@ -117,15 +121,21 @@ sub menubuttons {
         }
     }
     if ($env{'request.course.id'}) {
+        $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+        $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my %coursegroups;
         my $viewgrps_permission =
 	    &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
         if (!$viewgrps_permission) {
-            %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
+            %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum);
 	}
         if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {
             $showgroups = 1;
         }
+        $role_selector = &roles_selector($cdom,$cnum);
+        if ($role_selector) {
+            $roles = '<span class="LC_nobreak">'.$role_selector.'&nbsp;&nbsp;<a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></span>';
+        }
     }
 
     if ($env{'browser.interface'} eq 'textual') {
@@ -160,8 +170,7 @@ $utility
 </script>
 <div id="LC_top_nav">
 <a href="/adm/menu" target="_top">$lt{'main'}</a>
-$reloadlink $navmaps $docs $groups
-<a href="/adm/roles" target="_top">$lt{'roles'}</a>
+$reloadlink $navmaps $docs $groups $roles
 <a href="/adm/logout" target="_top">$lt{'exit'}</a>
 </div>
 <br />
@@ -197,6 +206,7 @@ ENDMAINMENU
 </font>
 ENDINLINEMENU
         }
+        $roles = '<td><a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a></td>';
 # Do we have a NAV link?
         if ($env{'request.course.id'}) {
 	    my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.
@@ -225,6 +235,9 @@ ENDGROUPS
 <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
 ENDRELOAD
             }
+            if ($role_selector) {
+                $roles = '<td>'.$role_selector.'</td><td><a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></td>';
+            }
         }
 	if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {
 	    my $escreload=&escape('return:');
@@ -238,10 +251,6 @@ ENDCRELOAD
         }
         my $form=&serverform();
 	my $utility=&utilityfunctions();
-	my $remote;
-	if ($env{'user.adv'}) {
-	    $remote = '<td><a href="/adm/remote?action=launch&amp;url='.$escurl.'" target="_top">'.$lt{'launch'}.'</a></td>'
-	}
 
         my $helplink=&Apache::loncommon::top_nav_help('Help');
 	return (<<ENDINLINEMENU);
@@ -259,8 +268,7 @@ $reloadlink
 $navmaps
 $docs
 $groups
-$remote
-<td><a href="/adm/roles" target="_top">$lt{'roles'}</a></td>
+$roles
 <td class="LC_top_nav_help">$helplink</td>
 <td class="LC_top_nav_exit"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td>
 </tr>
@@ -421,7 +429,7 @@ sub innerregister {
                 my $action = "go('/priv/".$env{'user.name'}."');";
                 my $cadom  = $env{'request.role.domain'};
                 my $caname = $env{'user.name'};
-                my $desc = "Enter my resource construction space";
+                my $desc = "Enter my construction space";
                 # Set defaults for co-authors
                 if ($env{'request.role'} =~ /^ca/) { 
                     ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);
@@ -885,8 +893,9 @@ sub switch {
     $top=&mt($top);
     $bot=&mt($bot);
     $desc=&mt($desc);
-    $img=&mt($img);
-
+    if (($env{'environment.remote'} ne 'off') || ($env{'environment.icons'} eq 'classic')) {
+       $img=&mt($img);
+    }
     my $idx=10*$row+$col;
     $category_members{$cat}.=':'.$idx;
 
@@ -1112,6 +1121,18 @@ sub rawconfig {
                     }
                 }
             }
+        } elsif ($pro eq 'tools') {
+            my @tools = ('aboutme','blog','portfolio');
+            if (grep(/^\Q$prt\E$/,@tools)) {
+                if (!&Apache::lonnet::usertools_access($env{'user.name'},
+                                                       $env{'user.domain'},$prt)) {
+                    $output.=&clear($row,$col);
+                    next;
+                }
+            }
+            $prt='any';
+            $output.=&secondlevel(
+          $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
         }
     }
     unless (($env{'browser.interface'} eq 'textual') ||
@@ -1410,6 +1431,221 @@ sub hidden_button_check {
     return $buttonshide; 
 }
 
+sub roles_selector {
+    my ($cdom,$cnum) = @_;
+    my $now = time;
+    my (%courseroles,%seccount,%gotnosection);
+    my $is_cc;
+    my $role_selector;
+    if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) {
+        my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum});
+        
+        if ((($start) && ($start<0)) || 
+            (($end) && ($end<$now))  ||
+            (($start) && ($now<$start))) {
+            $is_cc = 0;
+        } else {
+            $is_cc = 1;
+        }
+    }
+    if ($is_cc) {
+        my %adv_roles =
+             &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);
+        foreach my $role (keys(%adv_roles)) {
+            my ($urole,$usec) = split(/:/,$role);
+            if (!$gotnosection{$urole}) {
+                $seccount{$urole} ++;
+                $gotnosection{$urole} = 1;
+            }
+            if (ref($courseroles{$urole}) eq 'ARRAY') {
+                if ($usec ne '') {
+                    if (!grep(/^Q$usec\E$/,@{$courseroles{$urole}})) {
+                        push(@{$courseroles{$urole}},$usec);
+                        $seccount{$urole} ++;
+                    }
+                }
+            } else {
+                @{$courseroles{$urole}} = ();
+                if ($usec ne '') {
+                    $seccount{$urole} ++;
+                    push(@{$courseroles{$urole}},$usec);
+                }
+            }
+        }
+        my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
+        @{$courseroles{'st'}} = ();
+        if (keys(%sections_count) > 0) {
+            push(@{$courseroles{'st'}},keys(%sections_count));
+        }
+    } else {
+        foreach my $item (keys(%env)) {
+            if ($item =~ m-^user\.role\.([^.]+)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) {
+                my $role = $1;
+                my $sec = $2;
+                next if ($role eq 'gr');
+                my ($start,$end) = split(/\./,$env{$item});
+                next if (($start && $start > $now) || ($end && $end < $now));
+                if ($sec eq '') {
+                    if (!$gotnosection{$role}) {
+                        $seccount{$role} ++;
+                        $gotnosection{$role} = 1;
+                    }
+                }
+                if (ref($courseroles{$role}) eq 'ARRAY') {
+                    if ($sec ne '') {
+                        if (!grep(/^Q$sec\E$/,@{$courseroles{$role}})) {
+                            push(@{$courseroles{$role}},$sec);
+                            $seccount{$role} ++;
+                        }
+                    }
+                } else {
+                    @{$courseroles{$role}} = ();
+                    if ($sec ne '') {
+                        $seccount{$role} ++;
+                        push(@{$courseroles{$role}},$sec);
+                    }
+                }
+            }
+        }
+    }
+    my @roles_order = ('cc','in','ta','ep','ad','st');
+    if (keys(%courseroles) > 1) {
+        $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);
+        $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">
+                          <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';
+        $role_selector .= '<option value="">'.&mt('Switch course role to...').'</option>';
+        foreach my $role (@roles_order) {
+            if (defined($courseroles{$role})) {
+                $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; 
+            }
+        }
+        foreach my $role (sort(keys(%courseroles))) {
+            if ($role =~ /^cr/) {
+                $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; 
+            }
+        }
+        $role_selector .= '</select>'."\n".
+               '<input type="hidden" name="destinationurl" value="'.
+               $ENV{'REQUEST_URI'}.'" />'."\n".
+               '<input type="hidden" name="gotorole" value="1" />'."\n".
+               '<input type="hidden" name="selectrole" value="" />'."\n".
+               '<input type="hidden" name="switch" value="1" />'."\n".
+               '</form>';
+    }
+    return $role_selector;
+}
+
+sub jump_to_role {
+    my ($cdom,$cnum,$seccount,$courseroles) = @_;
+    my %lt = &Apache::lonlocal::texthash(
+                this => 'This role has section(s) associated with it.',
+                ente => 'Enter a specific section.',
+                orlb => 'Enter a specific section, or leave blank for no section.',
+                avai => 'Available sections are:',
+                youe => 'You entered an invalid section choice:',
+                plst => 'Please try again',
+    );
+    my $js;
+    if (ref($courseroles) eq 'HASH') {
+        $js = '    var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n". 
+              '    var numsec = new Array();'."\n".
+              '    var rolesections = new Array();'."\n".
+              '    var rolenames = new Array();'."\n".
+              '    var roleseclist = new Array();'."\n";
+        my @items = keys(%{$courseroles});
+        for (my $i=0; $i<@items; $i++) {
+            $js .= '    rolenames['.$i.'] = "'.$items[$i].'";'."\n";
+            my ($secs,$secstr);
+            if (ref($courseroles->{$items[$i]}) eq 'ARRAY') {
+                my @sections = sort { $a <=> $b } @{$courseroles->{$items[$i]}};
+                $secs = join('","',@sections);
+                $secstr = join(', ',@sections);
+            }
+            $js .= '    rolesections['.$i.'] = new Array("'.$secs.'");'."\n".
+                   '    roleseclist['.$i.'] = "'.$secstr.'";'."\n".
+                   '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";
+        }
+    }
+    my $output = <<"END";
+<script type="text/javascript">
+function adhocRole(roleitem) {
+    $js
+    var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;
+    if (newrole == '') {
+        return; 
+    } 
+    var fullrole = newrole+'./$cdom/$cnum';
+    var selidx = '';
+    for (var i=0; i<rolenames.length; i++) {
+        if (rolenames[i] == newrole) {
+            selidx = i;
+        }
+    }
+    var secok = 1;
+    var secchoice = '';
+    if (selidx >= 0) {
+        if (numsec[selidx] > 1) {
+            secok = 0;
+            var numrolesec = rolesections[selidx].length;
+            var msgidx = numsec[selidx] - numrolesec;
+            secchoice = prompt("$lt{'this'}\\n"+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],"");
+            if (secchoice == '') {
+                if (msgidx > 0) {
+                    secok = 1;
+                }
+            } else {
+                for (var j=0; j<rolesections[selidx].length; j++) {
+                    if (rolesections[selidx][j] == secchoice) {
+                        secok = 1;
+                    }
+                }
+            }
+        } else {
+            if (rolesections[selidx].length == 1) {
+                secchoice = rolesections[selidx][0];
+            }
+        }
+    }
+    if (secok == 1) {
+        if (secchoice != '') {
+            fullrole += '/'+secchoice;
+        }
+    } else {
+        document.rolechooser.elements[roleitem].selectedIndex = 0;
+        if (secchoice != null) {
+            alert("$lt{'youe'} \\""+secchoice+"\\".\\n $lt{'plst'}");
+        }
+        return;
+    }
+    if (fullrole == "$env{'request.role'}") {
+        return;
+    }
+    itemid = retrieveIndex('gotorole');
+    if (itemid != -1) {
+        document.rolechooser.elements[itemid].name = fullrole;
+    }
+    document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value = fullrole;
+    document.rolechooser.selectrole.value = '1';
+    document.rolechooser.submit();
+    return;
+}
+
+function retrieveIndex(item) {
+    for (var i=0;i<document.rolechooser.elements.length;i++) {
+        if (document.rolechooser.elements[i].name == item) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+
+</script>
+END
+    return $output;
+}
+
+
 # ================================================================ Main Program
 
 BEGIN {