--- loncom/interface/loncommon.pm	2003/09/16 19:23:47	1.117
+++ loncom/interface/loncommon.pm	2003/10/13 22:35:05	1.128
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.117 2003/09/16 19:23:47 www Exp $
+# $Id: loncommon.pm,v 1.128 2003/10/13 22:35:05 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -80,6 +80,7 @@ my $readit;
 
 # ----------------------------------------------- Filetypes/Languages/Copyright
 my %language;
+my %supported_language;
 my %cprtag;
 my %fe; my %fd;
 my %category_extensions;
@@ -146,8 +147,11 @@ BEGIN {
 	    while (<$fh>) {
 		next if /^\#/;
 		chomp;
-		my ($key,$two,$country,$three,$enc,$val)=(split(/\t/,$_));
+		my ($key,$two,$country,$three,$enc,$val,$sup)=(split(/\t/,$_));
 		$language{$key}=$val.' - '.$enc;
+		if ($sup) {
+		    $supported_language{$key}=$sup;
+		}
 	    }
 	}
     }
@@ -348,17 +352,18 @@ sub selectstudent_link {
 	   return '';
        }
        return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele.
-        '","'.$udomele.'");'."'>Select User</a>";
+        '","'.$udomele.'");'."'>".&mt('Select User')."</a>";
    }
    if ($ENV{'request.role'}=~/^(au|dc|su)/) {
        return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele.
-        '","'.$udomele.'",1);'."'>Select User</a>";
+        '","'.$udomele.'",1);'."'>".&mt('Select User')."</a>";
    }
    return '';
 }
 
 sub coursebrowser_javascript {
-   return (<<'ENDSTDBRW');
+    my ($domainfilter)=@_;
+   return (<<ENDSTDBRW);
 <script type="text/javascript" language="Javascript" >
     var stdeditbrowser;
     function opencrsbrowser(formname,uname,udom) {
@@ -369,6 +374,12 @@ sub coursebrowser_javascript {
                url += 'filter='+filter+'&';
 	   }
         }
+        var domainfilter='$domainfilter';
+        if (domainfilter != null) {
+           if (domainfilter != '') {
+               url += 'domainfilter='+domainfilter+'&';
+	   }
+        }
         url += 'form=' + formname + '&cnumelement='+uname+
                                     '&cdomelement='+udom;
         var title = 'Course_Browser';
@@ -384,7 +395,7 @@ ENDSTDBRW
 sub selectcourse_link {
    my ($form,$unameele,$udomele)=@_;
     return "<a href='".'javascript:opencrsbrowser("'.$form.'","'.$unameele.
-        '","'.$udomele.'");'."'>Select Course</a>";
+        '","'.$udomele.'");'."'>".&mt('Select Course')."</a>";
 }
 
 =pod
@@ -516,7 +527,7 @@ END
     foreach my $value (sort(keys(%$hashref))) {
         $result.="    <option value=\"$value\" ";
         $result.=" selected=\"true\" " if ($value eq $firstdefault);
-        $result.=">$hashref->{$value}->{'text'}</option>\n";
+        $result.=">".&mt($hashref->{$value}->{'text'})."</option>\n";
     }
     $result .= "</select>\n";
     my %select2 = %{$hashref->{$firstdefault}->{'select2'}};
@@ -526,7 +537,7 @@ END
     foreach my $value (sort(keys(%select2))) {
         $result.="    <option value=\"$value\" ";        
         $result.=" selected=\"true\" " if ($value eq $seconddefault);
-        $result.=">$select2{$value}</option>\n";
+        $result.=">".&mt($select2{$value})."</option>\n";
     }
     $result .= "</select>\n";
     #    return $debug;
@@ -764,10 +775,16 @@ See lonrights.pm for an example invocati
 sub select_form {
     my ($def,$name,%hash) = @_;
     my $selectform = "<select name=\"$name\" size=\"1\">\n";
-    foreach (sort keys %hash) {
+    my @keys;
+    if (exists($hash{'select_form_order'})) {
+	@keys=@{$hash{'select_form_order'}};
+    } else {
+	@keys=sort(keys(%hash));
+    }
+    foreach (@keys) {
         $selectform.="<option value=\"$_\" ".
             ($_ eq $def ? 'selected' : '').
-                ">".$hash{$_}."</option>\n";
+                ">".&mt($hash{$_})."</option>\n";
     }
     $selectform.="</select>";
     return $selectform;
@@ -1505,7 +1522,10 @@ returns description of a specified langu
 =cut
 
 sub languagedescription {
-    return $language{shift(@_)};
+    my $code=shift;
+    return  ($supported_language{$code}?'* ':'').
+            $language{$code}.
+	    ($supported_language{$code}?' ('.&mt('interface available').')':'');
 }
 
 =pod
@@ -1613,16 +1633,8 @@ sub fileextensions {
 
 sub display_languages {
     my %languages=();
-    if ($ENV{'environment.languages'}) {
-	foreach (split(/\s*(\,|\;|\:)\s*/,$ENV{'environment.languages'})) {
-	    $languages{$_}=1;
-        }
-    }
-    if ($ENV{'course.'.$ENV{'request.course.id'}.'.languages'}) {
-	foreach (split(/\s*(\,|\;|\:)\s*/,
-	$ENV{'course.'.$ENV{'request.course.id'}.'.languages'})) {
-	    $languages{$_}=1;
-        }
+    foreach (&preferred_languages()) {
+	$languages{$_}=1;
     }
     &get_unprocessed_cgi($ENV{'QUERY_STRING'},['displaylanguage']);
     if ($ENV{'form.displaylanguage'}) {
@@ -1642,7 +1654,34 @@ sub preferred_languages {
 	@languages=(@languages,split(/\s*(\,|\;|\:)\s*/,
 	         $ENV{'course.'.$ENV{'request.course.id'}.'.languages'}));
     }
-    return (@languages,'en-US');
+    my $browser=(split(/\;/,$ENV{'HTTP_ACCEPT_LANGUAGE'}))[0];
+    if ($browser) {
+	@languages=(@languages,split(/\s*(\,|\;|\:)\s*/,$browser));
+    }
+    if ($Apache::lonnet::domain_lang_def{$ENV{'user.domain'}}) {
+	@languages=(@languages,
+		$Apache::lonnet::domain_lang_def{$ENV{'user.domain'}});
+    }
+    if ($Apache::lonnet::domain_lang_def{$ENV{'request.role.domain'}}) {
+	@languages=(@languages,
+		$Apache::lonnet::domain_lang_def{$ENV{'request.role.domain'}});
+    }
+    if ($Apache::lonnet::domain_lang_def{
+	                          $Apache::lonnet::perlvar{'lonDefDomain'}}) {
+	@languages=(@languages,
+		$Apache::lonnet::domain_lang_def{
+                                  $Apache::lonnet::perlvar{'lonDefDomain'}});
+    }
+# turn "en-ca" into "en-ca,en"
+    my @genlanguages;
+    foreach (@languages) {
+	unless ($_=~/\w/) { next; }
+	push (@genlanguages,$_);
+	if ($_=~/(\-|\_)/) {
+	    push (@genlanguages,(split(/(\-|\_)/,$_))[0]);
+	}
+    }
+    return @genlanguages;
 }
 
 ###############################################################
@@ -2302,6 +2341,14 @@ sub no_cache {
   #$r->header_out("Expires" => $date);
 }
 
+sub content_type {
+  my ($r,$type,$charset) = @_;
+  unless ($charset) {
+      $charset=&Apache::lonlocal::current_encoding;
+  }
+  $r->content_type($type.($charset?'; charset='.$charset:''));
+}
+
 =pod
 
 =item * add_to_env($name,$value) 
@@ -2625,6 +2672,60 @@ sub check_if_partid_hidden {
     return undef;
 }
 
+############################################################
+############################################################
+
+=pod
+
+=item DrawGraph
+
+Returns a link to cgi-bin/graph
+
+=cut
+
+############################################################
+############################################################
+sub DrawGraph {
+    my ($Title,$xlabel,$ylabel,$Max,$values1,$values2)=@_;
+    #
+    my $identifier = time.'_'.int(rand(1000));
+    if (! defined($values1) || ref($values1) ne 'ARRAY') {
+        return '';
+    }
+    #
+    $Title  = '' if (! defined($Title));
+    $xlabel = '' if (! defined($xlabel));
+    $ylabel = '' if (! defined($ylabel));
+    $Title  = &Apache::lonnet::escape($Title);
+    $xlabel = &Apache::lonnet::escape($xlabel);
+    $ylabel = &Apache::lonnet::escape($ylabel);
+    #
+    my $data1 = join(',', @$values1);
+    my $data2;
+    if (defined($values2)) {
+        $data2 = join(',', @$values2);
+    }
+    #
+    my $NumBars = scalar(@$values1);
+    $Max = 1 if ($Max < 1);
+    if ( int($Max) < $Max ) {
+        $Max++;
+        $Max = int($Max);
+    }
+    #
+    &Apache::lonnet::appenv($identifier.'.title'   => $Title,
+                            $identifier.'.xlabel'  => $xlabel,
+                            $identifier.'.ylabel'  => $ylabel,
+                            $identifier.'.Max'     => $Max,
+                            $identifier.'.NumBars' => $NumBars,
+                            $identifier.'.data1'   => $data1,
+                            $identifier.'.data2'   => $data2);
+    return '<IMG src="/cgi-bin/graph.png?'.$identifier.'" border="1" />';
+}
+
+############################################################
+############################################################
+
 =pod
 
 =back