--- loncom/xml/lonxml.pm	2011/11/21 21:45:36	1.524
+++ loncom/xml/lonxml.pm	2012/05/25 15:01:31	1.531.2.3
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.524 2011/11/21 21:45:36 www Exp $
+# $Id: lonxml.pm,v 1.531.2.3 2012/05/25 15:01:31 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -113,6 +113,7 @@ use Apache::lonr();
 use Apache::lonlocal;
 use Apache::lonhtmlcommon();
 use Apache::functionplotresponse();
+use Apache::lonnavmaps();
 
 #====================================   Main subroutine: xmlparse  
 
@@ -210,8 +211,12 @@ sub xmlend {
     my $discussion;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
 					   ['LONCAPA_INTERNAL_no_discussion']);
-    if (! exists($env{'form.LONCAPA_INTERNAL_no_discussion'}) ||
-        $env{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true') {
+    if (
+           (   (!exists($env{'form.LONCAPA_INTERNAL_no_discussion'})) 
+            || ($env{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true')
+           ) 
+        && ($env{'form.inhibitmenu'} ne 'yes')
+       ) {
         $discussion=&Apache::lonfeedback::list_discussion($mode,$status);
     }
     if ($target eq 'tex') {
@@ -223,6 +228,100 @@ sub xmlend {
     return $discussion;
 }
 
+sub tokeninputfield {
+    my $defhost=$Apache::lonnet::perlvar{'lonHostID'};
+    $defhost=~tr/a-z/A-Z/;
+    return (<<ENDINPUTFIELD)
+<script type="text/javascript">
+    function updatetoken() {
+        var comp=new Array;
+        var barcode=unescape(document.tokeninput.barcode.value);
+        comp=barcode.split('*');
+        if (typeof(comp[0])!="undefined") {
+            document.tokeninput.codeone.value=comp[0];
+        }
+        if (typeof(comp[1])!="undefined") {
+            document.tokeninput.codetwo.value=comp[1];
+        }
+        if (typeof(comp[2])!="undefined") {
+            comp[2]=comp[2].toUpperCase();
+            document.tokeninput.codethree.value=comp[2];
+        }
+        document.tokeninput.barcode.value='';
+    }
+</script>
+<form method="post" name="tokeninput" action="">
+<table border="2" bgcolor="#FFFFBB">
+<tr><th>DocID Checkin</th></tr>
+<tr><td>
+<table>
+<tr>
+<td>Scan in Barcode</td>
+<td><input type="text" size="22" name="barcode"
+onchange="updatetoken()"/></td>
+</tr>
+<tr><td><i>or</i> Type in DocID</td>
+<td>
+<input type="text" size="5" name="codeone" />
+<b><font size="+2">*</font></b>
+<input type="text" size="5" name="codetwo" />
+<b><font size="+2">*</font></b>
+<input type="text" size="10" name="codethree" value="$defhost"
+onchange="this.value=this.value.toUpperCase()" />
+</td></tr>
+</table>
+</td></tr>
+<tr><td><input type="submit" value="Check in DocID" /></td></tr>
+</table>
+</form>
+ENDINPUTFIELD
+}
+
+sub maketoken {
+    my ($symb,$tuname,$tudom,$tcrsid)=@_;
+    unless ($symb) {
+        $symb=&Apache::lonnet::symbread();
+    }
+    unless ($tuname) {
+        $tuname=$env{'user.name'};
+        $tudom=$env{'user.domain'};
+        $tcrsid=$env{'request.course.id'};
+    }
+    return &Apache::lonnet::checkout($symb,$tuname,$tudom,$tcrsid);
+}
+
+sub printtokenheader {
+    my ($target,$token,$tsymb,$tcrsid,$tudom,$tuname)=@_;
+    unless ($token) { return ''; }
+
+    my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser();
+    unless ($tsymb) {
+        $tsymb=$symb;
+    }
+    unless ($tuname) {
+        $tuname=$name;
+        $tudom=$domain;
+        $tcrsid=$courseid;
+    }
+
+    my $plainname=&Apache::loncommon::plainname($tuname,$tudom);
+
+    if ($target eq 'web') {
+        my %idhash=&Apache::lonnet::idrget($tudom,($tuname));
+        return
+ '<img align="right" src="/cgi-bin/barcode.png?encode='.$token.'" />'.
+               &mt('Checked out for').' '.$plainname.
+               '<br />'.&mt('User').': '.$tuname.' at '.$tudom.
+               '<br />'.&mt('ID').': '.$idhash{$tuname}.
+               '<br />'.&mt('CourseID').': '.$tcrsid.
+               '<br />'.&mt('Course').': '.$env{'course.'.$tcrsid.'.description'}.
+               '<br />'.&mt('DocID').': '.$token.
+               '<br />'.&mt('Time').': '.&Apache::lonlocal::locallocaltime().'<hr />';
+    } else {
+        return $token;
+    }
+}
+
 sub printalltags {
   my $temp;
   foreach $temp (sort keys %Apache::lonxml::alltags) {
@@ -301,7 +400,8 @@ sub xmlparse {
  &clean_safespace($safeeval);
 
  if (@script_var_displays) {
-     $finaloutput .= join('',@script_var_displays);
+     my $scriptoutput = join('',@script_var_displays);
+     $finaloutput=~s{(</body>\s*</html>)\s*$}{$scriptoutput$1}s;
      undef(@script_var_displays);
  }
  &init_state();
@@ -1496,19 +1596,20 @@ sub renderingoptions {
            {&Apache::lonlocal::texthash
                (''        => '',
                 'tth'     => 'tth (TeX to HTML)',
-                'jsMath'  => 'jsMath',
+                'MathJax' => 'MathJax',
+  		'jsMath'  => 'jsMath',
                 'mimetex' => 'mimetex (Convert to Images)')}).
      '</span>';
     return $output;
 }
 
 sub inserteditinfo {
-      my ($filecontents, $filetype, $filename)=@_;
+      my ($filecontents,$filetype,$filename,$symb,$itemtitle) = @_;
       $filecontents = &HTML::Entities::encode($filecontents,'<>&"');
       my $xml_help = '';
       my $initialize='';
       my $textarea_id = 'filecont';
-      my $dragmath_button;
+      my ($dragmath_button,$deps_button);
       my ($add_to_onload, $add_to_onresize);
       $initialize=&Apache::lonhtmlcommon::spellheader();
       if (($filetype eq 'html') && (&Apache::lonhtmlcommon::htmlareabrowser())) {
@@ -1529,6 +1630,11 @@ sub inserteditinfo {
 </script>
 FULLPAGE
       if ($filetype eq 'html') {
+          if ($symb) {
+              $deps_button = &Apache::lonhtmlcommon::dependencies_button()."\n";
+              $initialize .= 
+                  &Apache::lonhtmlcommon::dependencycheck_js($symb,$itemtitle)."\n";
+          }
           $dragmath_button = '<span id="math_filecont">'.&Apache::lonhtmlcommon::dragmath_button('filecont',1).'</span>';
           $initialize .= "\n".&Apache::lonhtmlcommon::dragmath_js('EditMathPopup');
       }
@@ -1573,7 +1679,7 @@ $initialize
     <div class="LC_edit_problem_discards">
       <input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" />
       <input type="submit" name="Undo" accesskey="u" value="$lt{'un'}" />
-      $htmlerror $dragmath_button
+      $htmlerror $deps_button $dragmath_button
     </div>
     <div class="LC_edit_problem_saves">
       <input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" />
@@ -1782,11 +1888,17 @@ ENDNOTFOUND
     unless ($env{'request.state'} eq 'published') {
 	if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'})))
 	{
-	    my $displayfile=$request->uri;
-	    $displayfile=~s/^\/[^\/]*//;
+            my ($displayfile,$url,$symb,$itemtitle);
+	    $displayfile=$request->uri;
+            if ($request->uri =~ m{^/uploaded/}) {
+                ($symb,$itemtitle,$displayfile) = 
+                    &get_courseupload_hierarchy($request->uri);
+            } else {
+	        $displayfile=~s/^\/[^\/]*//;
+            }
 
 	    my ($edit_info, $add_to_onload, $add_to_onresize)=
-		&inserteditinfo($filecontents,$filetype,$displayfile);
+		&inserteditinfo($filecontents,$filetype,$displayfile,$symb,$itemtitle);
 
 	    my %options = 
 		('add_entries' =>
@@ -1836,6 +1948,27 @@ sub display_title {
     return $result;
 }
 
+sub get_courseupload_hierarchy {
+    my ($url) = @_;
+    my ($symb,$itemtitle,$displaypath);
+    if ($env{'request.course.id'}) {
+        $symb = &Apache::lonnet::symbread();
+        my ($map,$id,$res)=&Apache::lonnet::decode_symb($symb);
+        my $navmap=Apache::lonnavmaps::navmap->new;
+        if (ref($navmap)) {
+            my $res = $navmap->getBySymb($symb);
+            if (ref($res)) {
+                my @pathitems =
+                    &Apache::loncommon::get_folder_hierarchy($navmap,$map,1);
+                $itemtitle = $res->compTitle();
+                push(@pathitems,$itemtitle);
+                $displaypath = join(' &raquo; ',@pathitems);
+            }
+        }
+    }
+    return ($symb,$itemtitle,$displaypath);
+}
+
 sub debug {
     if ($Apache::lonxml::debug eq "1") {
 	$|=1;
@@ -1918,7 +2051,7 @@ sub error {
 	    my @userlist;
 	    foreach (keys %users) {
 		my ($user,$domain) = split(/:/, $_);
-		push(@userlist,"$user\@$domain");
+		push(@userlist,"$user:$domain");
 		my $key=$declutter.'_'.$user.'_'.$domain;
 		my %lastnotified=&Apache::lonnet::get('nohist_xmlerrornotifications',
 						      [$key],
@@ -1941,7 +2074,7 @@ sub error {
 		$errormsg=&mt("An error occurred while processing this resource. The instructor has been notified.");
 	    }
 	}
-	push(@Apache::lonxml::error_messages,"<b>$errormsg</b> <br />");
+	push(@Apache::lonxml::error_messages,"<span class=\"LC_warning\">$errormsg</span><br />");
     }
 }
 
@@ -2049,11 +2182,13 @@ sub register_insert_xml {
     while (my $token = $parser->get_token()) {
 	if ($token->[0] eq 'S') {
 	    my $key;
-	    if      ($token->[1] eq 'tag') {
+	    if ($token->[1] eq 'tag') {
 		$tag = $token->[2]{'name'};
-		$insertlist{$tagnum.'.tag'} = $tag;
-		$insertlist{$tag.'.num'}   = $tagnum;
-		push(@alltags,$tag);
+                if (defined($tag)) {
+		    $insertlist{$tagnum.'.tag'} = $tag;
+		    $insertlist{$tag.'.num'}   = $tagnum;
+		    push(@alltags,$tag);
+                }
 	    } elsif ($in_help && $token->[1] eq 'file') {
 		$key = $tag.'.helpfile';
 	    } elsif ($in_help && $token->[1] eq 'description') {