--- loncom/xml/lonxml.pm	2012/05/08 15:13:58	1.531
+++ loncom/xml/lonxml.pm	2013/03/18 00:04:27	1.531.2.6
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.531 2012/05/08 15:13:58 bisitz Exp $
+# $Id: lonxml.pm,v 1.531.2.6 2013/03/18 00:04:27 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -228,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) {
@@ -649,9 +743,9 @@ sub setup_globals {
 
 sub init_safespace {
   my ($target,$safeeval,$safehole,$safeinit) = @_;
-  $safeeval->reval('use Math::Complex;');
   $safeeval->reval('use LaTeX::Table;');
   $safeeval->deny_only(':dangerous');
+  $safeeval->reval('use Math::Complex;');
   $safeeval->permit_only(":default");
   $safeeval->permit("entereval");
   $safeeval->permit(":base_math");
@@ -1510,7 +1604,7 @@ sub renderingoptions {
 }
 
 sub inserteditinfo {
-      my ($filecontents,$filetype,$filename,$symb,$itemtitle) = @_;
+      my ($filecontents,$filetype,$filename,$symb,$itemtitle,$folderpath,$uri) = @_;
       $filecontents = &HTML::Entities::encode($filecontents,'<>&"');
       my $xml_help = '';
       my $initialize='';
@@ -1536,10 +1630,11 @@ sub inserteditinfo {
 </script>
 FULLPAGE
       if ($filetype eq 'html') {
-          if ($symb) {
+          if ($symb || $folderpath) {
               $deps_button = &Apache::lonhtmlcommon::dependencies_button()."\n";
               $initialize .= 
-                  &Apache::lonhtmlcommon::dependencycheck_js($symb,$itemtitle)."\n";
+                  &Apache::lonhtmlcommon::dependencycheck_js($symb,$itemtitle,
+                                                             undef,$folderpath,$uri)."\n";
           }
           $dragmath_button = '<span id="math_filecont">'.&Apache::lonhtmlcommon::dragmath_button('filecont',1).'</span>';
           $initialize .= "\n".&Apache::lonhtmlcommon::dragmath_js('EditMathPopup');
@@ -1669,6 +1764,11 @@ sub handler {
     } else {
 	$filetype='html';
     }
+    unless ($env{'request.uri'}) {
+        $env{'request.uri'}=$request->uri;
+        &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                                ['todocs']);
+    }
     if ($filetype eq 'sty') {
         $breadcrumbtext = 'Style File Editor';
     } elsif ($filetype eq 'js') {
@@ -1797,14 +1897,25 @@ ENDNOTFOUND
             my ($displayfile,$url,$symb,$itemtitle);
 	    $displayfile=$request->uri;
             if ($request->uri =~ m{^/uploaded/}) {
+                if ($env{'request.course.id'}) {
+                    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+                    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+                    if ($request->uri =~ m{^\Q/uploaded/$cdom/$cnum/\Esupplemental/}) {
+                        &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                                                ['folderpath','title']);
+                    }
+                }
+
                 ($symb,$itemtitle,$displayfile) = 
-                    &get_courseupload_hierarchy($request->uri);
+                    &get_courseupload_hierarchy($request->uri,
+                                                $env{'form.folderpath'},$env{'form.title'});
             } else {
 	        $displayfile=~s/^\/[^\/]*//;
             }
 
 	    my ($edit_info, $add_to_onload, $add_to_onresize)=
-		&inserteditinfo($filecontents,$filetype,$displayfile,$symb,$itemtitle);
+		&inserteditinfo($filecontents,$filetype,$displayfile,$symb,
+                                $itemtitle,$env{'form.folderpath'},$request->uri);
 
 	    my %options = 
 		('add_entries' =>
@@ -1855,20 +1966,35 @@ sub display_title {
 }
 
 sub get_courseupload_hierarchy {
-    my ($url) = @_;
+    my ($url,$folderpath,$title) = @_;
     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);
+        if ($folderpath =~ /^supplemental/) {
+            my @folders = split(/\&/,$folderpath);
+            my @pathitems;
+            while (@folders) {
+                my $folder=shift(@folders);
+                my $foldername=shift(@folders);
+                $foldername =~ s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//;
+                push(@pathitems,&unescape($foldername));
+            }
+            if ($title) {
+                push(@pathitems,&unescape($title));
+            }
+            $displaypath = join(' &raquo; ',@pathitems);
+        } else {
+            $symb = &Apache::lonnet::symbread($url);
+            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);
+                }
             }
         }
     }
@@ -2025,13 +2151,18 @@ sub add_messages {
 }
 
 sub get_param {
-    my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_;
+    my ($param,$parstack,$safeeval,$context,$case_insensitive, $noelide) = @_;
     if ( ! $context ) { $context = -1; }
     my $args ='';
     if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
     if ( ! $Apache::lonxml::usestyle ) {
 	$args=$Apache::lonxml::style_values.$args;
     }
+
+    if ($noelide) {
+        $args =~ s/'\$/'\\\$/g;
+    }
+
     if ( ! $args ) { return undef; }
     if ( $case_insensitive ) {
 	if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) {