--- loncom/interface/lonpreferences.pm	2010/03/10 21:25:50	1.185
+++ loncom/interface/lonpreferences.pm	2010/03/16 19:55:49	1.187
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.185 2010/03/10 21:25:50 droeschl Exp $
+# $Id: lonpreferences.pm,v 1.187 2010/03/16 19:55:49 droeschl Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -589,60 +589,6 @@ sub verify_and_change_screenname {
 }
 
 ################################################################
-#                     Icon Subroutines                         #
-################################################################
-sub iconchanger {
-    my $r = shift;
-    &Apache::lonhtmlcommon::add_breadcrumb(
-	    {	href => '/adm/preferences?action=changeicons',
-                text => 'Change Main Menu'});
-    $r->print(Apache::loncommon::start_page('Page Display Settings'));
-    $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Main Menu'));
-
-    my $user       = $env{'user.name'};
-    my $domain     = $env{'user.domain'};
-    my %userenv = &Apache::lonnet::get
-        ('environment',['icons']);
-    my $iconic='checked="checked"';
-    my $classic='';
-    my $onlyicon='';
-    if ($userenv{'icons'} eq 'classic') {
-       $classic='checked="checked"';
-       $iconic='';
-    }
-    if ($userenv{'icons'} eq 'iconsonly') {
-       $onlyicon='checked="checked"';
-       $iconic='';
-    }
-    my $useicons=&mt('Use icons and text');
-    my $usebuttons=&mt('Use buttons and text');
-    my $useicononly=&mt('Use icons only');
-    my $change=&mt('Save');
-    $r->print(<<ENDSCREEN);
-<form name="prefs" action="/adm/preferences" method="post">
-<input type="hidden" name="action" value="verify_and_change_icons" />
-<label><input type="radio" name="menumode" value="iconic" $iconic /> $useicons</label><br />
-<label><input type="radio" name="menumode" value="classic" $classic /> $usebuttons</label><br />
-<label><input type="radio" name="menumode" value="iconsonly" $onlyicon /> $useicononly</label><br />
-<input type="submit" value="$change" />
-</form>
-ENDSCREEN
-}
-
-sub verify_and_change_icons {
-    my $r = shift;
-    my $user       = $env{'user.name'};
-    my $domain     = $env{'user.domain'};
-    my $newicons   = $env{'form.menumode'};
-
-    &Apache::lonnet::put('environment',{'icons' => $newicons});
-    &Apache::lonnet::appenv({'environment.icons' => $newicons});
-    my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Menu Display').'</i>','<tt>'.$newicons.'</tt>'));
-    $message=&Apache::loncommon::confirmwrapper($message);
-    &print_main_menu($r, $message);
-}
-
-################################################################
 #                     Clicker Subroutines                      #
 ################################################################
 
@@ -1842,6 +1788,93 @@ sub verify_and_change_coursepage {
     &print_main_menu($r,$message);
 }
 
+sub lockednameschanger {
+    my $r = shift;
+    &Apache::lonhtmlcommon::add_breadcrumb(
+            {   href => '/adm/preferences?action=changelockednames',
+                text => 'Automatic name changes'});
+    $r->print(Apache::loncommon::start_page('Automatic name changes'));
+    $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates'));
+    my %userenv = &Apache::lonnet::get('environment',['lockedname']);
+    my $lockedname='';
+    if (&can_toggle_namelocking()) {
+        if ($userenv{'lockedname'}) {
+            $lockedname = ' checked="checked"';
+        }
+        my %updateable;
+        my %domconfig =
+            &Apache::lonnet::get_dom('configuration',['autoupdate'],$env{'user.domain'});
+        if (ref($domconfig{'autoupdate'}) eq 'HASH') {
+            if ($domconfig{'autoupdate'}{'run'}) {
+                my @inststatuses = split(':',$env{'environment.inststatus'});
+                unless (@inststatuses) {
+                    @inststatuses = ('default');
+                }
+                %updateable = &updateable_userinfo($domconfig{'autoupdate'},\@inststatuses);
+            }
+        }
+        if (keys(%updateable)) {
+            my %longnames = &Apache::lonlocal::texthash (
+                                firstname  => 'First Name',
+                                middlename => 'Middle Name',
+                                lastname   => 'Last Name',
+                            );
+            my $text=&mt('By default, based on your institutional affiliation, your LON-CAPA account can be automatically updated nightly based on directory information from your institution.').'<br />'.&mt('The following may be updated, unless you disallow updates:').
+                     '<ul>';
+           foreach my $item ('firstname','middlename','lastname') {
+               if ($updateable{$item}) {
+                   $text .= '<li>'.$longnames{$item}.'</li>';
+               }
+           }
+           $text .= '</ul>'; 
+           my $locking=&mt('Disallow automatic updates to name information for your LON-CAPA account');
+           my $change=&mt('Save');
+           $r->print(<<ENDSCREEN);
+<form name="prefs" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="verify_and_change_lockednames" />
+$text<br />
+<label><input type="checkbox" value="1" name="lockednames"$lockedname />$locking</label><br />
+<input type="submit" value="$change" />
+</form>
+ENDSCREEN
+        } else {
+            my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');
+            &print_main_menu($r,$message);
+        }
+    } else {
+        my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.');
+        &print_main_menu($r,$message);
+    }
+}
+
+sub verify_and_change_lockednames {
+    my $r = shift;
+    my $message;
+    if (&can_toggle_namelocking()) {
+        my $newlockedname = $env{'form.lockednames'};
+        $newlockedname =~ s/\D//g;
+        my $currlockedname = $env{'environment.lockedname'};
+        if ($newlockedname ne $currlockedname) {
+            if ($newlockedname) {
+                if (&Apache::lonnet::put('environment',{lockedname => $newlockedname}) eq 'ok') {
+                    &Apache::lonnet::appenv({'environment.lockedname' => $newlockedname});
+                }
+            } elsif (&Apache::lonnet::del('environment',['lockedname']) eq 'ok') {
+                &Apache::lonnet::delenv('environment.lockedname');
+            }
+        }
+        my $status='';
+        if ($newlockedname) {
+            $status=&mt('disallowed');
+        } else {
+            $status=&mt('allowed');
+        }
+        $message=&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]','<i>'.&mt('Automatic update of first, middle and last names if institutional directory information indicates changes').'</i>','<tt>'.$status.'</tt>'));
+        $message=&Apache::loncommon::confirmwrapper($message);
+    }
+    &print_main_menu($r,$message);
+}
+
 sub print_main_menu {
     my ($r, $message) = @_;
     # Determine current authentication method
@@ -1909,14 +1942,6 @@ my @menu=
 		icon => 'preferences-desktop-theme.png',
 		linktitle => 'Change LON-CAPA default colors.'
 	    },
-	    {	linktext => 'Menu Display',
-		url => '/adm/preferences?action=changeicons',
-		permission => 'F',
-		#help => '',
-		icon => 'preferences-system-windows.png',
-		linktitle => 'Change whether the menus are displayed with buttons, icons or icons and text.'
-	    }
-
 		]
     },
     {	categorytitle=>'Messages &amp; Notifications',
@@ -1960,6 +1985,18 @@ push(@{ $menu[0]->{items} }, {
 	linktitle => 'Change your password.',
 	});
     }
+
+    if (&can_toggle_namelocking()) {
+        push(@{ $menu[0]->{items} }, {
+        linktext => 'Automatic name changes',
+        url => '/adm/preferences?action=changelockednames',
+        permission => 'F',
+        #help => '',
+        icon => 'system-lock-screen.png',
+        linktitle => 'Allow/disallow propagation of name changes from institutional directory service',
+        });
+    }
+
     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
     if (keys(%author_roles) > 0) {
 push(@{ $menu[4]->{items} }, {
@@ -1994,7 +2031,7 @@ push(@{ $menu[4]->{items} }, {
 	icon => 'blog.png',
 	linktitle => 'Toggle Debug Messages.',
 	});
-    }   
+    }
 
     $r->print(&Apache::loncommon::start_page('My Space'));
     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Preferences'));
@@ -2065,10 +2102,6 @@ sub handler {
         &texenginechanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
         &verify_and_change_texengine($r);
-    }elsif($env{'form.action'} eq 'changeicons'){
-        &iconchanger($r);
-    }elsif($env{'form.action'} eq 'verify_and_change_icons'){
-        &verify_and_change_icons($r);
     }elsif($env{'form.action'} eq 'changeclicker'){
         &clickerchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
@@ -2090,6 +2123,10 @@ sub handler {
             &toggle_debug();
         }
 	&print_main_menu($r);
+    } elsif ($env{'form.action'} eq 'changelockednames') {
+        &lockednameschanger($r);
+    } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') {
+        &verify_and_change_lockednames($r);
     }
 
     # Properly end the HTML page of all preference pages
@@ -2122,5 +2159,52 @@ sub can_toggle_debug {
     return $can_toggle;
 }
 
+sub can_toggle_namelocking {
+    my $lockablenames;
+    my %domconfig =
+        &Apache::lonnet::get_dom('configuration',['autoupdate'],$env{'user.domain'});
+    if (ref($domconfig{'autoupdate'}) eq 'HASH') {
+        if ($domconfig{'autoupdate'}{'run'}) {
+            my @inststatuses = split(':',$env{'environment.inststatus'});
+            unless (@inststatuses) {
+                @inststatuses = ('default');
+            }
+            my %updateable = &updateable_userinfo($domconfig{'autoupdate'},\@inststatuses);
+            if ($updateable{'lastname'} || $updateable{'firstname'} ||
+                $updateable{'middlename'}) { 
+                if (ref($domconfig{'autoupdate'}{'lockablenames'}) eq 'ARRAY') {
+                    unless (@inststatuses) {
+                        @inststatuses = ('default');
+                    }
+                    foreach my $status (@inststatuses) {
+                        if (grep(/^\Q$status\E$/,@{$domconfig{'autoupdate'}{'lockablenames'}})) {
+                            $lockablenames = 1;
+                            last;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return $lockablenames;
+}
+
+sub updateable_userinfo {
+    my ($autoupdate,$inststatuses) = @_;
+    my %updateable;
+    return %updateable unless ((ref($autoupdate) eq 'HASH') && 
+                               (ref($inststatuses) eq 'ARRAY'));
+    if (ref($autoupdate->{'fields'}) eq 'HASH') {
+        foreach my $status (@{$inststatuses}) {
+            if (ref($autoupdate->{'fields'}{$status}) eq 'ARRAY') {
+                foreach my $field (@{$autoupdate->{'fields'}{$status}}) {
+                    $updateable{$field} = 1;
+                }
+            }
+        }
+    }
+    return %updateable;
+}
+
 1;
 __END__