--- loncom/interface/lonhtmlcommon.pm	2004/02/20 17:03:38	1.55
+++ loncom/interface/lonhtmlcommon.pm	2004/06/05 14:46:12	1.75
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common html routines
 #
-# $Id: lonhtmlcommon.pm,v 1.55 2004/02/20 17:03:38 matthew Exp $
+# $Id: lonhtmlcommon.pm,v 1.75 2004/06/05 14:46:12 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -163,9 +163,15 @@ sub textbox {
 ##############################################
 ##############################################
 sub checkbox {
-    my ($name,$value) = @_;
-    my $Str = '<input type="checkbox" name="'.$name.'"'.
-	($value?' checked="1"':'').' />';
+    my ($name,$checked,$value) = @_;
+    my $Str = '<input type="checkbox" name="'.$name.'" ';
+    if (defined($value)) {
+        $Str .= 'value="'.$value.'"';
+    } 
+    if ($checked) {
+        $Str .= ' checked="1"';
+    }
+    $Str .= ' />';
     return $Str;
 }
 
@@ -201,6 +207,13 @@ Also, to be explicit, a value of 'now' a
 Additional html/javascript to be associated with each element in
 the date_setter.  See lonparmset for example usage.
 
+=item $includeempty 
+
+=item $state
+
+Specifies the initial state of the form elements.  Either 'disabled' or empty.
+Defaults to empty, which indiciates the form elements are not disabled. 
+
 =back
 
 Bugs
@@ -212,7 +225,14 @@ The method used to restrict user input w
 ##############################################
 ##############################################
 sub date_setter {
-    my ($formname,$dname,$currentvalue,$special,$includeempty) = @_;
+    my ($formname,$dname,$currentvalue,$special,$includeempty,$state,
+        $no_hh_mm_ss) = @_;
+    if (! defined($state) || $state ne 'disabled') {
+        $state = '';
+    }
+    if (! defined($no_hh_mm_ss)) {
+        $no_hh_mm_ss = 0;
+    }
     if (! defined($currentvalue) || $currentvalue eq 'now') {
 	unless ($includeempty) {
 	    $currentvalue = time;
@@ -221,7 +241,7 @@ sub date_setter {
 	}
     }
     # other potentially useful values:     wkday,yrday,is_daylight_savings
-    my ($sec,$min,$hour,$mday,$month,$year)=('','','','','','');
+    my ($sec,$min,$hour,$mday,$month,$year)=('','',undef,'','','');
     if ($currentvalue) {
 	($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) = 
 	    localtime($currentvalue);
@@ -261,19 +281,41 @@ sub date_setter {
         }
     }
 
+    function $dname\_disable() {
+        document.$formname.$dname\_month.disabled=true;
+        document.$formname.$dname\_day.disabled=true;
+        document.$formname.$dname\_year.disabled=true;
+        document.$formname.$dname\_hour.disabled=true;
+        document.$formname.$dname\_minute.disabled=true;
+        document.$formname.$dname\_second.disabled=true;
+    }
+
+    function $dname\_enable() {
+        document.$formname.$dname\_month.disabled=false;
+        document.$formname.$dname\_day.disabled=false;
+        document.$formname.$dname\_year.disabled=false;
+        document.$formname.$dname\_hour.disabled=false;
+        document.$formname.$dname\_minute.disabled=false;
+        document.$formname.$dname\_second.disabled=false;        
+    }
+
     function $dname\_opencalendar() {
-       var calwin=window.open(
+        if (! document.$formname.$dname\_month.disabled) {
+            var calwin=window.open(
 "/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+
 document.$formname.$dname\_month.value+"&year="+
 document.$formname.$dname\_year.value,
              "LONCAPAcal",
               "height=350,width=350,scrollbars=yes,resizable=yes,menubar=no");
+        }
 
     }
 </script>
 ENDJS
     $result .= "  <nobr><select name=\"$dname\_month\" ".$special.' '.
+        $state.' '.
         "onChange=\"javascript:$dname\_checkday()\" >\n";
+    # Month
     my @Months = qw/January February  March     April   May      June 
                     July    August    September October November December/;
     # Pad @Months with a bogus value to make indexing easier
@@ -285,37 +327,47 @@ ENDJS
         $result .= "> ".&mt($Months[$m])." </option>\n";
     }
     $result .= "  </select>\n";
-    $result .= "  <input type=\"text\" name=\"$dname\_day\" ".
+    # Day
+    $result .= "  <input type=\"text\" name=\"$dname\_day\" ".$state.' '.
             "value=\"$mday\" size=\"3\" ".$special.' '.
             "onChange=\"javascript:$dname\_checkday()\" />\n";
-    $result .= "  <input type=\"year\" name=\"$dname\_year\" ".
+    # Year
+    $result .= "  <input type=\"year\" name=\"$dname\_year\" ".$state.' '.
             "value=\"$year\" size=\"5\" ".$special.' '.
             "onChange=\"javascript:$dname\_checkday()\" />\n";
     $result .= "&nbsp;&nbsp;";
-    $result .= "  <select name=\"$dname\_hour\" ".$special." >\n";
-    if ($includeempty) { $result.="<option value=''></option>"; }
-    for (my $h = 0;$h<24;$h++) {
-        $result .= "      <option value=\"$h\" ";
-        $result .= "selected " if ($hour == $h);
-        $result .= "> ";
-	my $timest='';
-        if ($h == 0) {
-            $timest .= "12 am";
-        } elsif($h == 12) {
-            $timest .= "12 noon";
-        } elsif($h < 12) {
-            $timest .= "$h am";
-        } else {
-            $timest .= $h-12 ." pm";
-        }
-	$timest=&mt($timest);
-        $result .= $timest." </option>\n";
-    } 
-    $result .= "  </select>\n";
-    $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".$special.' '.
-        "value=\"$min\" size=\"3\" /> m\n";
-    $result .= "  <input type=\"text\" name=\"$dname\_second\" ".$special.' '.
-        "value=\"$sec\" size=\"3\" /> s\n";
+    if (! $no_hh_mm_ss) {
+        # Hours
+        $result .= "  <select name=\"$dname\_hour\" ".$special." ".$state.' '.
+            ">\n";
+        if ($includeempty) { $result.="<option value=''></option>"; }
+        for (my $h = 0;$h<24;$h++) {
+            $result .= "      <option value=\"$h\" ";
+            $result .= "selected " if (defined($hour) && $hour == $h);
+            $result .= "> ";
+            my $timest='';
+            if ($h == 0) {
+                $timest .= "12 am";
+            } elsif($h == 12) {
+                $timest .= "12 noon";
+            } elsif($h < 12) {
+                $timest .= "$h am";
+            } else {
+                $timest .= $h-12 ." pm";
+            }
+            $timest=&mt($timest);
+            $result .= $timest." </option>\n";
+        } 
+        $result .= "  </select>\n";
+        $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".
+            $special.' '.
+            $state.' '.
+            "value=\"$min\" size=\"3\" /> m\n";
+        $result .= "  <input type=\"text\" name=\"$dname\_second\" ".
+            $special.' '.
+            $state.' '.
+            "value=\"$sec\" size=\"3\" /> s\n";
+    }
     $result .= "<a href=\"javascript:$dname\_opencalendar()\">".
     &mt('Select Date')."</a></nobr>\n<!-- end $dname date setting form -->\n";
     return $result;
@@ -359,18 +411,26 @@ sub get_date_from_form {
         if (($tmpsec =~ /^\d+$/) && ($tmpsec >= 0) && ($tmpsec < 60)) {
             $sec = $tmpsec;
         }
+	if (!defined($tmpsec) || $tmpsec eq '') { $sec = 0; }
+    } else {
+        $sec = 0;
     }
     if (defined($ENV{'form.'.$dname.'_minute'})) {
         my $tmpmin = $ENV{'form.'.$dname.'_minute'};
         if (($tmpmin =~ /^\d+$/) && ($tmpmin >= 0) && ($tmpmin < 60)) {
             $min = $tmpmin;
         }
+	if (!defined($tmpmin) || $tmpmin eq '') { $min = 0; }
+    } else {
+        $min = 0;
     }
     if (defined($ENV{'form.'.$dname.'_hour'})) {
         my $tmphour = $ENV{'form.'.$dname.'_hour'};
         if (($tmphour =~ /^\d+$/) && ($tmphour >= 0) && ($tmphour < 24)) {
             $hour = $tmphour;
         }
+    } else {
+        $hour = 0;
     }
     if (defined($ENV{'form.'.$dname.'_day'})) {
         my $tmpday = $ENV{'form.'.$dname.'_day'};
@@ -676,7 +736,7 @@ sub Create_PrgWin {
 	}
 	if (!$inputname) {
 	    $prog_state{'inputname'}=&get_uniq_name();
-	    &r_print($r,'<input type="text" name="'.$prog_state{'inputname'}.
+	    &r_print($r,$heading.' <input type="text" name="'.$prog_state{'inputname'}.
 		     '" size="'.$width.'" />');
 	} else {
 	    $prog_state{'inputname'}=$inputname;
@@ -781,8 +841,11 @@ sub r_print {
 # ------------------------------------------------------- Puts directory header
 
 sub crumbs {
-    my ($uri,$target,$prefix,$form)=@_;
-    my $output='<br /><tt><b><font size="+2">'.$prefix.'/';
+    my ($uri,$target,$prefix,$form,$size)=@_;
+    if (! defined($size)) {
+        $size = '+2';
+    }
+    my $output='<br /><tt><b><font size="'.$size.'">'.$prefix.'/';
     if ($ENV{'user.adv'}) {
 	my $path=$prefix.'/';
 	foreach (split('/',$uri)) {
@@ -805,29 +868,76 @@ sub crumbs {
 # ------------------------------------------------- Output headers for HTMLArea
 
 sub htmlareaheaders {
-    unless (&htmlareabrowser()) { return ''; }
+    if (&htmlareablocked()) { return ''; }
     my $lang='en';
+    if (&mt('htmlarea_lang') ne 'htmlarea_lang') {
+	$lang=&mt('htmlarea_lang');
+    }
     return (<<ENDHEADERS);
+<script type="text/javascript">
+_editor_url='/htmlarea/';
+_editor_lang='$lang';
+</script>
 <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>
-<script type="text/javascript" src="/htmlarea/lang/$lang.js"></script>
-<script type="text/javascript" src="/htmlarea/dialog.js"></script>
-<style type="text/css">
-\@import url(/htmlarea/htmlarea.css);
-</style>
 ENDHEADERS
 }
 
+# ------------------------------------------------- Activate additional buttons
+
+sub htmlareaaddbuttons {
+    if (&htmlareablocked()) { return ''; }
+    return (<<ENDADDBUTTON);
+    var config=new HTMLArea.Config();
+    config.registerButton('ed_math','LaTeX Inline',
+			  '/htmlarea/images/ed_math.gif',false,
+			    function(editor,id) {
+			      editor.surroundHTML('<m>\$','\$</m>');
+			    }
+			  );
+    config.registerButton('ed_math_eqn','LaTeX Equation',
+			  '/htmlarea/images/ed_math_eqn.gif',false,
+			    function(editor,id) {
+			      editor.surroundHTML(
+				     '<center><m>\\\\[','\\\\]</m></center>');
+			    }
+			  );
+    config.toolbar.push(['ed_math','ed_math_eqn']);
+ENDADDBUTTON
+}
 # ---------------------------------------------------------- Script to activate
 
 sub htmlareaactive {
-    unless (&htmlareabrowser()) { return ''; }
+    if (&htmlareablocked()) { return ''; }
+    my $addbuttons=&htmlareaaddbuttons();
     return (<<ENDSCRIPT);
 <script type="text/javascript" defer="1">
-    HTMLArea.replaceAll();
+    $addbuttons
+    HTMLArea.replaceAll(config);
 </script>
 ENDSCRIPT
 }
 
+# ----------------------------------------- Script to activate only some fields
+
+sub htmlareaselectactive {
+    my @fields=@_;
+    if (&htmlareablocked()) { return ''; }
+    my $output='<script type="text/javascript" defer="1">'.
+	&htmlareaaddbuttons();
+    foreach(@fields) {
+	$output.="\nHTMLArea.replace('$_',config);";
+    }
+    $output.="\nwindow.status='Activated Editfields';\n</script>";
+    return $output;
+}
+
+# --------------------------------------------------------------------- Blocked
+
+sub htmlareablocked {
+    unless (&htmlareabrowser()) { return 1; }
+    return 0;
+}
+
 # ---------------------------------------- Browser capable of running HTMLArea?
 
 sub htmlareabrowser {
@@ -853,6 +963,9 @@ All inputs can be undef without problems
 Inputs: $color (the background color of the table returned),
         $component (the large text on the right side of the table),
         $component_help
+        $function (role to get colors from)
+        $domain   (domian of role)
+        $menulink (boolean, controls whether to include a link to /adm/menu)
 
 Returns a string containing breadcrumbs for the current page.
 
@@ -876,9 +989,10 @@ returns: nothing
 ############################################################
 {
     my @Crumbs;
-
+    
     sub breadcrumbs {
-        my ($color,$component,$component_help,$function,$domain) = @_;
+        my ($color,$component,$component_help,$function,$domain,$menulink) =
+	    @_;
         if (! defined($color)) {
             if (! defined($function)) {
                 $function = &Apache::loncommon::get_users_function();
@@ -891,32 +1005,54 @@ returns: nothing
             '<table width="100%" border="0" cellpadding="0" cellspacing="0">'.
             '<tr><td bgcolor="'.$color.'">'.
             '<font size="-1">';
-        # The last breadcrumb does not have a link, so handle it seperately.
+        #
+        # Make the faq and bug data cascade
+        my $faq = '';
+        my $bug = '';
+        # The last breadcrumb does not have a link, so handle it separately.
         my $last = pop(@Crumbs);
-        # The first one should be the course, I guess.
-        if (exists($ENV{'request.course.id'})) {
-            my $cid = $ENV{'request.course.id'};
-            unshift(@Crumbs,{href=>'/adm/menu',
-                             title=>'Go to main menu',
-                             text=>$ENV{'course.'.$cid.'.description'},
-                         });
+        #
+        # The first one should be the course or a menu link
+	if (!defined($menulink)) { $menulink=1; }
+        if ($menulink) {
+            my $description = 'Menu';
+            if (exists($ENV{'request.course.id'}) && 
+                $ENV{'request.course.id'} ne '') {
+                $description = 
+                    $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+            }
+            unshift(@Crumbs,{
+                    href   =>'/adm/menu',
+                    title  =>'Go to main menu',
+                    target =>'_top',
+                    text   =>$description,
+                });
         }
         my $links .= 
             join('-&gt;',
                  map {
-                     '<a href="'.$_->{'href'}.'" title="'.$_->{'title'}.'">'.
-                         $_->{'text'}.'</a>' 
+                     $faq = $_->{'faq'} if (exists($_->{'faq'}));
+                     $bug = $_->{'bug'} if (exists($_->{'bug'}));
+                     my $result = '<a href="'.$_->{'href'}.'" ';
+                     if (defined($_->{'target'}) && $_->{'target'} ne '') {
+                         $result .= 'target="'.$_->{'target'}.'" ';
+                     }
+                     $result .='title="'.&mt($_->{'title'}).'">'.
+                         &mt($_->{'text'}).'</a>';
+                     $result;
                      } @Crumbs
                  );
         $links .= '-&gt;' if ($links ne '');
         $links .= '<b>'.$last->{'text'}.'</b>';
         #
         my $icons = '';
-        if (exists($last->{'faq'})) {
-            $icons .= &Apache::loncommon::help_open_faq($last->{'faq'});
+        $faq = $last->{'faq'} if (exists($last->{'faq'}));
+        $bug = $last->{'bug'} if (exists($last->{'bug'}));
+        if ($faq ne '') {
+            $icons .= &Apache::loncommon::help_open_faq($faq);
         }
-        if (exists($last->{'bug'})) {
-            $icons .= &Apache::loncommon::help_open_bug($last->{'bug'});
+        if ($bug ne '') {
+            $icons .= &Apache::loncommon::help_open_bug($bug);
         }
         if ($icons ne '') {
             $Str .= $icons.'&nbsp;';
@@ -926,7 +1062,7 @@ returns: nothing
         #
         if (defined($component)) {
             $Str .= '<td align="right" bgcolor="'.$color.'">'.
-                '<font size="+1">'.$component.'</font>';
+                '<font size="+1">'.&mt($component).'</font>';
             if (defined($component_help)) {
                 $Str .= 
                     &Apache::loncommon::help_open_topic($component_help);
@@ -950,7 +1086,7 @@ returns: nothing
         push (@Crumbs,@_);
     }
 
-}
+} # End of scope for @Crumbs
 
 ############################################################
 ############################################################