--- loncom/interface/loncommon.pm	2002/08/28 14:11:27	1.62
+++ loncom/interface/loncommon.pm	2003/02/13 18:11:26	1.79
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.62 2002/08/28 14:11:27 www Exp $
+# $Id: loncommon.pm,v 1.79 2003/02/13 18:11:26 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -27,9 +27,7 @@
 #
 # YEAR=2001
 # 2/13-12/7 Guy Albertelli
-# 12/11,12/12,12/17 Scott Harrison
 # 12/21 Gerd Kortemeyer
-# 12/21 Scott Harrison
 # 12/25,12/28 Gerd Kortemeyer
 # YEAR=2002
 # 1/4 Gerd Kortemeyer
@@ -98,6 +96,10 @@ my %cprtag;
 my %fe; my %fd;
 my %category_extensions;
 
+# ---------------------------------------------- Designs
+
+my %designhash;
+
 # ---------------------------------------------- Thesaurus variables
 
 =pod
@@ -166,6 +168,30 @@ BEGIN {
 	    }
 	}
     }
+
+# -------------------------------------------------------------- domain designs
+
+    my $filename;
+    my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors';
+    opendir(DIR,$designdir);
+    while ($filename=readdir(DIR)) {
+	my ($domain)=($filename=~/^(\w+)\./);
+    {
+	my $fh=Apache::File->new($designdir.'/'.$filename);
+	if ($fh) {
+	    while (<$fh>) {
+		next if /^\#/;
+		chomp;
+		my ($key,$val)=(split(/\=/,$_));
+		if ($val) { $designhash{$domain.'.'.$key}=$val; }
+	    }
+	}
+    }
+
+    }
+    closedir(DIR);
+
+
 # ------------------------------------------------------------- file categories
     {
 	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
@@ -283,7 +309,44 @@ sub browser_and_searcher_javascript {
 END
 }
 
+sub studentbrowser_javascript {
+   unless ($ENV{'request.course.id'}) { return ''; }  
+   unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
+        return '';
+   }
+   return (<<'ENDSTDBRW');
+<script type="text/javascript" language="Javascript" >
+    var stdeditbrowser;
+    function openstdbrowser(formname,uname,udom) {
+        var url = '/adm/pickstudent?';
+        var filter;
+        eval('filter=document.'+formname+'.'+uname+'.value;');
+        if (filter != null) {
+           if (filter != '') {
+               url += 'filter='+filter+'&';
+	   }
+        }
+        url += 'form=' + formname + '&unameelement='+uname+
+                                    '&udomelement='+udom;
+        var title = 'Student Browser';
+        var options = 'scrollbars=1,resizable=1,menubar=0';
+        options += ',width=700,height=600';
+        stdeditbrowser = open(url,title,options,'1');
+        stdeditbrowser.focus();
+    }
+</script>
+ENDSTDBRW
+}
 
+sub selectstudent_link {
+    my ($form,$unameele,$udomele)=@_;
+   unless ($ENV{'request.course.id'}) { return ''; }  
+   unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
+        return '';
+   }
+    return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele.
+        '","'.$udomele.'");'."'>Select</a>";
+}
 
 ###############################################################
 
@@ -455,6 +518,9 @@ sub help_open_topic {
     my ($topic, $text, $stayOnPage, $width, $height) = @_;
     $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);
+    if ($ENV{'browser.interface'} eq 'textual') {
+	$stayOnPage=1;
+    }
     $width = 350 if (not defined $width);
     $height = 400 if (not defined $height);
     my $filename = $topic;
@@ -465,7 +531,7 @@ sub help_open_topic {
 
     if (!$stayOnPage)
     {
-	$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height'))";
+	$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))";
     }
     else
     {
@@ -475,14 +541,16 @@ sub help_open_topic {
     # Add the text
     if ($text ne "")
     {
-	$template .= "<a href=\"$link\">$text</a> ";
+	$template .= 
+  "<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>".
+  "<td bgcolor='#5555FF'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>";
     }
 
     # Add the graphic
     $template .= <<"ENDTEMPLATE";
-<a href="$link"><image src="/adm/help/gif/smallHelp.gif" border="0" alt="(Help: $topic)" /></a>
+ <a href="$link"><image src="/adm/help/gif/smallHelp.gif" border="0" alt="(Help: $topic)" /></a>
 ENDTEMPLATE
-
+    if ($text ne '') { $template.='</td></tr></table>' };
     return $template;
 
 }
@@ -774,7 +842,7 @@ sub authform_internal{
        onclick="javascript:changed_radio('int',$args{'formname'});" />
 Internally authenticated (with initial password 
 <input type="text" size="10" name="intarg" value=""
-       onchange="javascript:changed_text('int',$args{'formname'});" />
+       onchange="javascript:changed_text('int',$args{'formname'});" />)
 END
     return $result;
 }
@@ -810,7 +878,7 @@ sub authform_filesystem{
        onclick="javascript:changed_radio('fsys',$in{'formname'});" />
 Filesystem authenticated (with initial password 
 <input type="text" size="10" name="fsysarg" value=""
-       onchange="javascript:changed_text('fsys',$in{'formname'});">
+       onchange="javascript:changed_text('fsys',$in{'formname'});">)
 END
     return $result;
 }
@@ -946,6 +1014,26 @@ sub plainname {
     return $name;
 }
 
+# -------------------------------------------------------------------- Nickname
+
+
+sub nickname {
+    my ($uname,$udom)=@_;
+    my %names=&Apache::lonnet::get('environment',
+  ['nickname','firstname','middlename','lastname','generation'],$udom,$uname);
+    my $name=$names{'nickname'};
+    if ($name) {
+       $name='&quot;'.$name.'&quot;'; 
+    } else {
+       $name=$names{'firstname'}.' '.$names{'middlename'}.' '.
+	     $names{'lastname'}.' '.$names{'generation'};
+       $name=~s/\s+$//;
+       $name=~s/\s+/ /g;
+    }
+    return $name;
+}
+
+
 # ------------------------------------------------------------------ Screenname
 
 sub screenname {
@@ -962,18 +1050,26 @@ sub messagewrapper {
     return 
 "<a href='/adm/email?compose=individual&recname=$un&recdom=$do'>$link</a>";
 }
+# --------------------------------------------------------------- Notes Wrapper
+
+sub noteswrapper {
+    my ($link,$un,$do)=@_;
+    return 
+"<a href='/adm/email?recordftf=retrieve&recname=$un&recdom=$do'>$link</a>";
+}
 # ------------------------------------------------------------- Aboutme Wrapper
 
 sub aboutmewrapper {
-    my ($link,$un,$do)=@_;
-    return "<a href='/adm/$do/$un/aboutme'>$link</a>";
+    my ($link,$username,$domain)=@_;
+    return "<a href='/adm/$domain/$username/aboutme'>$link</a>";
 }
 
 # ------------------------------------------------------------ Syllabus Wrapper
 
 
 sub syllabuswrapper {
-    my ($link,$un,$do)=@_;
+    my ($link,$un,$do,$tf)=@_;
+    if ($tf) { $link='<font color="'.$tf.'">'.$link.'</font>'; }
     return "<a href='/public/$do/$un/syllabus'>$link</a>";
 }
 
@@ -1106,7 +1202,7 @@ sub get_previous_attempt {
 }
 
 sub get_student_view {
-  my ($symb,$username,$domain,$courseid) = @_;
+  my ($symb,$username,$domain,$courseid,$target) = @_;
   my ($map,$id,$feedurl) = split(/___/,$symb);
   my (%old,%moreenv);
   my @elements=('symb','courseid','domain','username');
@@ -1114,6 +1210,7 @@ sub get_student_view {
     $old{$element}=$ENV{'form.grade_'.$element};
     $moreenv{'form.grade_'.$element}=eval '$'.$element #'
   }
+  if ($target eq 'tex') {$moreenv{'form.grade_target'} = 'tex';}
   &Apache::lonnet::appenv(%moreenv);
   my $userview=&Apache::lonnet::ssi('/res/'.$feedurl);
   &Apache::lonnet::delenv('form.grade_');
@@ -1173,6 +1270,22 @@ sub maketime {
 }
 
 
+#########################################
+#
+# Retro-fixing of un-backward-compatible time format
+
+sub unsqltime {
+    my $timestamp=shift;
+    if ($timestamp=~/^(\d+)\-(\d+)\-(\d+)\s+(\d+)\:(\d+)\:(\d+)$/) {
+       $timestamp=&maketime(
+	   'year'=>$1,'month'=>$2,'day'=>$3,
+           'hours'=>$4,'minutes'=>$5,'seconds'=>$6);
+    }
+    return $timestamp;
+}
+
+#########################################
+
 sub findallcourses {
     my %courses=();
     my $now=time;
@@ -1197,20 +1310,18 @@ sub findallcourses {
 
 =pod
 
-=item &domainlogo()
+=item &determinedomain()
 
 Inputs: $domain (usually will be undef)
 
-Returns: A link to a domain logo, if the domain logo exists.
-If the domain logo does not exist, a description of the domain.
+Returns: Determines which domain should be used for designs
 
 =cut
 
 ###############################################
-###############################################
-sub domainlogo {
-    my ($domain) = @_;    
-    if (! $domain) {
+sub determinedomain {
+    my $domain=shift;
+   if (! $domain) {
         # Determine domain if we have not been given one
         $domain = $Apache::lonnet::perlvar{'lonDefDomain'};
         if ($ENV{'user.domain'}) { $domain=$ENV{'user.domain'}; }
@@ -1218,15 +1329,53 @@ sub domainlogo {
             $domain=$ENV{'request.role.domain'}; 
         }
     }
-    # See if there is a logo
+    return $domain;
+}
+###############################################
+=pod
+
+=item &domainlogo()
+
+Inputs: $domain (usually will be undef)
+
+Returns: A link to a domain logo, if the domain logo exists.
+If the domain logo does not exist, a description of the domain.
+
+=cut
+###############################################
+sub domainlogo {
+    my $domain = &determinedomain(shift);    
+     # See if there is a logo
     if (-e '/home/httpd/html/adm/lonDomLogos/'.$domain.'.gif') {
-        return '<img src="/adm/lonDomLogos/'.$domain.'.gif" />';
+        return '<img src="http://'.$ENV{'HTTP_HOST'}.':8080/adm/lonDomLogos/'.
+               $domain.'.gif" />';
     } elsif(exists($Apache::lonnet::domaindescription{$domain})) {
         return $Apache::lonnet::domaindescription{$domain};
     } else {
         return '';
     }
 }
+##############################################
+
+=pod
+
+=item &designparm()
+
+Inputs: $which parameter; $domain (usually will be undef)
+
+Returns: value of designparamter $which
+
+=cut
+##############################################
+sub designparm {
+    my ($which,$domain)=@_;
+    $domain=&determinedomain($domain);
+    if ($designhash{$domain.'.'.$which}) {
+	return $designhash{$domain.'.'.$which};
+    } else {
+        return $designhash{'default.'.$which};
+    }
+}
 
 ###############################################
 ###############################################
@@ -1253,6 +1402,8 @@ other decorations will be returned.
 =cut
 
 ###############################################
+
+
 ###############################################
 sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain)=@_;
@@ -1269,43 +1420,16 @@ sub bodytag {
             $function='author';
         }
     }
-    my $img='';
-    my $pgbg='';
-    my $tabbg='';
-    my $font='';
-    my $link='';
-    my $alink='#CC0000';
-    my $vlink='';
-    if ($function eq 'admin') {
-        $img='admin';
-        $pgbg='#FFFFCC';
-        $tabbg='#CCCC99';
-        $font='#772200';
-        $link='#663300';
-        $vlink='#666600';
-    } elsif ($function eq 'coordinator') {
-        $img='coordinator';
-        $pgbg='#CCFFFF';
-        $tabbg='#CCCCFF';
-        $font='#000044';
-        $link='#003333';
-        $vlink='#006633';
-   } elsif ($function eq 'author') {
-        $img='author';
-        $pgbg='#CCFFFF';
-        $tabbg='#CCFFCC';
-        $font='#004400';
-        $link='#003333';
-        $vlink='#006666';
-    } else {
-        $img='student';
-        $pgbg='#FFFFAA';
-        $tabbg='#FF9900';
-        $font='#991100';
-        $link='#993300';
-        $vlink='#996600';
-    }
-# role and realm
+    my $img=&designparm($function.'.img',$domain);
+    my $pgbg=&designparm($function.'.pgbg',$domain);
+    my $tabbg=&designparm($function.'.tabbg',$domain);
+    my $font=&designparm($function.'.font',$domain);
+    my $link=&designparm($function.'.link',$domain);
+    my $alink=&designparm($function.'.alink',$domain);
+    my $vlink=&designparm($function.'.vlink',$domain);
+    my $sidebg=&designparm($function.'.sidebg',$domain);
+
+ # role and realm
     my ($role,$realm)
        =&Apache::lonnet::plaintext((split(/\./,$ENV{'request.role'}))[0]);
 # realm
@@ -1323,13 +1447,16 @@ $addentries>
 END
     if ($bodyonly) {
         return $bodytag;
+    } elsif ($ENV{'browser.interface'} eq 'textual') {
+        return $bodytag.'<h1>LON-CAPA: '.$title.
+         '</h1><a href="/adm/menu">Main Menu</a><hr />';
     } else {
         return(<<ENDBODY);
 $bodytag
 <table width="100%" cellspacing="0" border="0" cellpadding="0">
 <tr><td bgcolor="$font">
-<img src="/adm/lonInterFace/$img.jpg" /></td>
-<td bgcolor="$font"><font color='$pgbg'>$messages</font></td>
+<img src="http://$ENV{'HTTP_HOST'}:8080/$img" /></td>
+<td bgcolor="$font"><font color='$sidebg'>$messages</font></td>
 </tr>
 <tr>
 <td rowspan="3" bgcolor="$tabbg">
@@ -1742,7 +1869,7 @@ will result in $ENV{'form.uname'} and $E
 
 returns cache-controlling header code
 
-=item nocache() 
+=item no_cache($r) 
 
 specifies header code to not have cache