1: # The LearningOnline Network
2: # Documents
3: #
4: # $Id: londocs.pm,v 1.43 2002/12/26 16:13:11 www Exp $
5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28:
29: package Apache::londocs;
30:
31: use strict;
32: use Apache::Constants qw(:common :http);
33: use Apache::lonnet;
34: use Apache::loncommon;
35: use Apache::lonratedt;
36: use Apache::lonratsrv;
37: use Apache::lonxml;
38: use HTML::Entities;
39: use GDBM_File;
40:
41: my $iconpath;
42:
43: my %hash;
44:
45: my $hashtied;
46: my %alreadyseen=();
47:
48: my $hadchanges;
49:
50: # Mapread read maps into lonratedt::global arrays
51: # @order and @resources, determines status
52: # sets @order - pointer to resources in right order
53: # sets @resources - array with the resources with correct idx
54: #
55:
56: sub mapread {
57: my ($coursenum,$coursedom,$map)=@_;
58: return
59: &Apache::lonratedt::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
60: $map);
61: }
62:
63: sub storemap {
64: my ($coursenum,$coursedom,$map)=@_;
65: $hadchanges=1;
66: return
67: &Apache::lonratedt::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
68: $map,1);
69: }
70:
71: sub editor {
72: my ($r,$coursenum,$coursedom,$folder,$allowed)=@_;
73: if ($ENV{'form.foldername'}) {
74: $r->print('<h3>Folder: '.$ENV{'form.foldername'}.'</h3>');
75: }
76: my $errtext='';
77: my $fatal=0;
78: ($errtext,$fatal)=
79: &mapread($coursenum,$coursedom,$folder.'.sequence');
80: if ($#Apache::lonratedt::order<1) {
81: $Apache::lonratedt::order[0]=1;
82: $Apache::lonratedt::resources[1]='';
83: }
84: if ($fatal) {
85: $r->print('<p><font color="red">'.$errtext.'</font></p>');
86: } else {
87: # ------------------------------------------------------------ Process commands
88: # ---------------- if they are for this folder and user allowed to make changes
89: if (($allowed) && ($ENV{'form.folder'} eq $folder)) {
90: # upload a file, if present
91: if (($ENV{'form.uploaddoc.filename'}) &&
92: ($ENV{'form.cmd'}=~/^upload_(\w+)/)) {
93: if ($folder=~/^$1/) {
94: # this is for a course, not a user, so set coursedoc flag
95: # probably the only place in the system where this should be "1"
96: my $url=&Apache::lonnet::userfileupload('uploaddoc',1);
97: my $ext='false';
98: if ($url=~/^http\:\/\//) { $ext='true'; }
99: $url=~s/\:/\:/g;
100: my $comment=$ENV{'form.comment'};
101: $comment=~s/\</\<\;/g;
102: $comment=~s/\>/\>\;/g;
103: $comment=~s/\:/\:/g;
104: if ($folder=~/^supplemental/) {
105: $comment=time.'___&&&___'.$ENV{'user.name'}.'___&&&___'.
106: $ENV{'user.domain'}.'___&&&___'.$comment;
107: }
108: my $newidx=$#Apache::lonratedt::resources+1;
109: $Apache::lonratedt::resources[$newidx]=
110: $comment.':'.$url.':'.$ext.':normal:res';
111: $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=
112: $newidx;
113: &storemap($coursenum,$coursedom,$folder.'.sequence');
114: }
115: }
116: if ($ENV{'form.cmd'}) {
117: my ($cmd,$idx)=split(/\_/,$ENV{'form.cmd'});
118: if ($cmd eq 'del') {
119: for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
120: $Apache::lonratedt::order[$i]=
121: $Apache::lonratedt::order[$i+1];
122: }
123: $#Apache::lonratedt::order--;
124: } elsif ($cmd eq 'up') {
125: if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) {
126: my $i=$Apache::lonratedt::order[$idx-1];
127: $Apache::lonratedt::order[$idx-1]=
128: $Apache::lonratedt::order[$idx];
129: $Apache::lonratedt::order[$idx]=$i;
130: }
131: } elsif ($cmd eq 'down') {
132: if (defined($Apache::lonratedt::order[$idx+1])) {
133: my $i=$Apache::lonratedt::order[$idx+1];
134: $Apache::lonratedt::order[$idx+1]=
135: $Apache::lonratedt::order[$idx];
136: $Apache::lonratedt::order[$idx]=$i;
137: }
138: } elsif ($cmd eq 'rename') {
139: my ($rtitle,@rrest)=split(/\:/,
140: $Apache::lonratedt::resources[
141: $Apache::lonratedt::order[$idx]]);
142: my $comment=
143: &HTML::Entities::decode($ENV{'form.title'});
144: $comment=~s/\</\<\;/g;
145: $comment=~s/\>/\>\;/g;
146: $comment=~s/\:/\:/g;
147: $Apache::lonratedt::resources[
148: $Apache::lonratedt::order[$idx]]=
149: $comment.':'.join(':',@rrest);
150:
151: }
152: # Store the changed version
153: &storemap($coursenum,$coursedom,$folder.'.sequence');
154: }
155: # Group import/search
156: if ($ENV{'form.importdetail'}) {
157: foreach (split(/\&/,$ENV{'form.importdetail'})) {
158: if (defined($_)) {
159: my ($name,$url)=split(/\=/,$_);
160: $name=&Apache::lonnet::unescape($name);
161: $url=&Apache::lonnet::unescape($url);
162: if ($url) {
163: my $idx=$#Apache::lonratedt::resources+1;
164: $Apache::lonratedt::order
165: [$#Apache::lonratedt::order+1]=$idx;
166: my $ext='false';
167: if ($url=~/^http\:\/\//) { $ext='true'; }
168: $url=~s/\:/\:/g;
169: $Apache::lonratedt::resources[$idx]=
170: $name.':'.$url.':'.$ext.':normal:res';
171: }
172: }
173: }
174: # Store the changed version
175: &storemap($coursenum,$coursedom,$folder.'.sequence');
176: }
177: }
178: # ---------------------------------------------------------------- End commands
179: # ---------------------------------------------------------------- Print screen
180: my $idx=0;
181: $r->print('<table>');
182: foreach (@Apache::lonratedt::order) {
183: my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);
184: unless ($name) { $name=(split(/\//,$url))[-1]; }
185: unless ($name) { $name='NO RESOURCE'; $url='/adm/notfound.html'; }
186: $r->print(&entryline($idx,$name,$url,$folder,$allowed));
187: $idx++;
188: }
189: $r->print('</table>');
190: }
191: }
192:
193: # --------------------------------------------------------------- An entry line
194:
195: sub entryline {
196: my ($index,$title,$url,$folder,$allowed)=@_;
197: $title=~s/\&colon\;/\:/g;
198: $title=&HTML::Entities::encode(&HTML::Entities::decode(
199: &Apache::lonnet::unescape($title)),'\"\<\>\&\'');
200: my $renametitle=$title;
201: my $foldertitle=$title;
202: if ($title=~
203: /^(\d+)\_\_\_\&\;\&\;\&\;\_\_\_(\w+)\_\_\_\&\;\&\;\&\;\_\_\_(\w+)\_\_\_\&\;\&\;\&\;\_\_\_(.*)$/
204: ) {
205: $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
206: $renametitle=$4;
207: $title='<i>'.localtime($1).'</i> '.
208: &Apache::loncommon::plainname($2,$3).': <br>'.
209: $foldertitle;
210: }
211: $renametitle=~s/\"\;/\\\"/g;
212: my $line='<tr>';
213: # Edit commands
214: if ($allowed) {
215: $line.=(<<END);
216: <td><table border='0' cellspacing='0' cellpadding='0'>
217: <tr><td><a href='/adm/coursedocs?folder=$folder&cmd=up_$index'>
218: <img src="${iconpath}move_up.gif" alt='UP' border='0' /></a></td></tr>
219: <tr><td><a href='/adm/coursedocs?folder=$folder&cmd=down_$index'>
220: <img src="${iconpath}move_down.gif" alt='DOWN' border='0' /></a></td></tr>
221: </table></td><td>
222: <a href='/adm/coursedocs?folder=$folder&cmd=del_$index'>
223: <font size="-2">Remove</font></a>
224: <a href='javascript:changename("$folder","$index","$renametitle");'>
225: <font size="-2">Rename</font></a></td>
226: END
227: }
228: # Figure out what kind of a resource this is
229: my ($extension)=($url=~/\.(\w+)$/);
230: my $uploaded=($url=~/^\/*uploaded\//);
231: my $icon='unknown';
232: if (-e "/home/httpd/html/adm/lonIcons/$extension.gif") {
233: $icon=$extension;
234: }
235: my $isfolder=0;
236: if ($uploaded) {
237: if ($extension eq 'sequence') {
238: $icon='folder_closed';
239: $url=~/\/(\w+)\.sequence/;
240: $url='/adm/coursedocs?folder='.$1;
241: $isfolder=1;
242: } else {
243: $url=&Apache::lonnet::tokenwrapper($url);
244: }
245: }
246: $url=~s/^http\&colon\;\/\//\/adm\/wrapper\/ext\//;
247: if ($isfolder) { $url.='&foldername='.$foldertitle; }
248: $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'" target="cat_'.$folder.
249: '"><img src="/adm/lonIcons/'.
250: $icon.'.gif" border="0"></a></td>'.
251: "<td bgcolor='#FFFFBB'><a href='$url' target='cat_$folder'>$title</a></td></tr>";
252: return $line;
253: }
254:
255: # ---------------------------------------------------------------- tie the hash
256:
257: sub tiehash {
258: $hashtied=0;
259: if ($ENV{'request.course.fn'}) {
260: if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db",
261: &GDBM_READER(),0640)) {
262: $hashtied=1;
263: }
264: }
265: }
266:
267: sub untiehash {
268: if ($hashtied) { untie %hash; }
269: $hashtied=0;
270: }
271:
272: # --------------------------------------------------------------- check on this
273:
274: sub checkonthis {
275: my ($r,$url,$level,$title)=@_;
276: $alreadyseen{$url}=1;
277: $r->rflush();
278: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
279: $r->print('<br />');
280: for (my $i=0;$i<=$level*5;$i++) {
281: $r->print(' ');
282: }
283: $r->print('<a href="'.$url.'" target="cat">'.
284: ($title?$title:$url).'</a> ');
285: if ($url=~/^\/res\//) {
286: my $result=&Apache::lonnet::repcopy(
287: &Apache::lonnet::filelocation('',$url));
288: if ($result==OK) {
289: $r->print('<font color="green">ok</font>');
290: $r->rflush();
291: &Apache::lonnet::countacc($url);
292: $url=~/\.(\w+)$/;
293: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
294: $r->print('<br />');
295: $r->rflush();
296: for (my $i=0;$i<=$level*5;$i++) {
297: $r->print(' ');
298: }
299: $r->print('- Rendering: ');
300: &Apache::lonxml::xmlparse($r,'web',
301: &Apache::lonnet::getfile(
302: &Apache::lonnet::filelocation('',$url)));
303: if (($Apache::lonxml::errorcount) ||
304: ($Apache::lonxml::warningcount)) {
305: if ($Apache::lonxml::errorcount) {
306: $r->print('<font color="red"><b>'.
307: $Apache::lonxml::errorcount.' error(s)</b></font> ');
308: }
309: if ($Apache::lonxml::warningcount) {
310: $r->print('<font color="blue">'.
311: $Apache::lonxml::warningcount.' warning(s)</font>');
312: }
313: } else {
314: $r->print('<font color="green">ok</font>');
315: }
316: $r->rflush();
317: }
318: my $dependencies=
319: &Apache::lonnet::metadata($url,'dependencies');
320: foreach (split(/\,/,$dependencies)) {
321: if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
322: &checkonthis($r,$_,$level+1);
323: }
324: }
325: } elsif ($result==HTTP_SERVICE_UNAVAILABLE) {
326: $r->print('<font color="red"><b>connection down</b></font>');
327: } elsif ($result==HTTP_NOT_FOUND) {
328: $r->print('<font color="red"><b>not found</b></font>');
329: } else {
330: $r->print('<font color="red"><b>access denied</b></font>');
331: }
332: }
333: }
334: }
335:
336: # ================================================================ Main Handler
337: sub handler {
338: my $r = shift;
339: $r->content_type('text/html');
340: $r->send_http_header;
341: return OK if $r->header_only;
342:
343:
344: if ($ENV{'form.verify'}) {
345:
346: my $loaderror=&Apache::lonnet::overloaderror($r);
347: if ($loaderror) { return $loaderror; }
348:
349: $r->print('<html><head><title>Verify Content</title></head>'.
350: &Apache::loncommon::bodytag('Verify Course Documents'));
351: $hashtied=0;
352: undef %alreadyseen;
353: %alreadyseen=();
354: &tiehash();
355: foreach (keys %hash) {
356: if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) {
357: &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
358: }
359: }
360: &untiehash();
361: } elsif ($ENV{'form.versions'}) {
362: $r->print('<html><head><title>Check Versions</title></head>'.
363: &Apache::loncommon::bodytag('Check Course Document Versions'));
364: $hashtied=0;
365: &tiehash();
366: my %changes=&Apache::lonnet::dump
367: ('versionupdate',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
368: $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
369: my $firstkey=(keys %changes)[0];
370: unless ($firstkey=~/^error\:/) {
371: unless ($ENV{'form.timerange'}) {
372: $ENV{'form.timerange'}=604800;
373: }
374: my $seltext='during the last '.$ENV{'form.timerange'}.' seconds';
375: my $startsel='';
376: my $monthsel='';
377: my $weeksel='';
378: my $daysel='';
379: if ($ENV{'form.timerange'}==-1) {
380: $seltext='since start of course';
381: $startsel='selected';
382: $ENV{'form.timerange'}=time;
383: }
384: my $starttime=time-$ENV{'form.timerange'};
385: if ($ENV{'form.timerange'}==2592000) {
386: $seltext='during the last month ('.localtime($starttime).')';
387: $monthsel='selected';
388: } elsif ($ENV{'form.timerange'}==604800) {
389: $seltext='during the last week ('.localtime($starttime).')';
390: $weeksel='selected';
391: } elsif ($ENV{'form.timerange'}==86400) {
392: $seltext='since yesterday ('.localtime($starttime).')';
393: $daysel='selected';
394: }
395:
396: $r->print(<<ENDHEADERS);
397: <form action="/adm/coursedocs" method="post">
398: <select name="timerange">
399: <option value="-1" $startsel>Since Start of Course</option>
400: <option value="2592000" $monthsel>Last Month</option>
401: <option value="604800" $weeksel>Last Week</option>
402: <option value="86400" $daysel>Since Yesterday</option>
403: </select>
404: <input type="submit" name="versions" value="Display" />
405: </form>
406: <h3>Content changed $seltext</h3>
407: <table border="2">
408: <tr>
409: <th>File</th><th>Modification Date</th>
410: <th>Version</th><th>Differences</th></tr>
411: ENDHEADERS
412: foreach (keys %changes) {
413: if ($changes{$_}>$starttime) {
414: my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
415: my $currentversion=&Apache::lonnet::getversion($_);
416: my $linkurl=&Apache::lonnet::clutter($_);
417: $r->print(
418: '<tr><td><a href="'.$linkurl.'" target="cat">'.$linkurl.
419: '</a></td><td>'.
420: localtime($changes{$_}).'</td><td>'.$currentversion.'</td>'.
421: '<td>');
422: my $lastold=1;
423: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
424: my $url=$root.'.'.$prevvers.'.'.$extension;
425: if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
426: $starttime) {
427: $lastold=$prevvers;
428: }
429: }
430: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
431: my $url=$root.'.'.$prevvers.'.'.$extension;
432: $r->print('<a href="'.&Apache::lonnet::clutter($url).
433: '">Version '.$prevvers.' ('.
434: localtime(&Apache::lonnet::metadata($url,'lastrevisiondate')).
435: ')</a>');
436: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
437: $r->print(' <a href="/adm/diff?filename='.
438: &Apache::lonnet::clutter($root.'.'.$extension).
439: '&versionone='.$prevvers.
440: '">Diffs</a>');
441: }
442: $r->print('<br />');
443: }
444: $r->print('</td></tr>');
445: }
446: }
447: $r->print('</table>');
448: } else {
449: $r->print('<p>No content modifications yet.</p>');
450: }
451: &untiehash();
452: } else {
453: # is this a standard course?
454:
455: my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//);
456: my $forcestandard;
457: my $forcesupplement;
458: my $script='';
459: my $allowed;
460: my $events='';
461: my $showdoc=0;
462: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
463: ['folder','foldername']);
464: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
465: $showdoc=$1;
466: }
467: unless ($showdoc) { # got called from remote
468: $forcestandard=($ENV{'form.folder'}=~/^default_/);
469: $forcesupplement=($ENV{'form.folder'}=~/^supplemental_/);
470:
471: # does this user have privileges to post, etc?
472: $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'});
473: if ($allowed) {
474: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
475: $script=&Apache::lonratedt::editscript('simple');
476: }
477: } else { # got called in sequence from course
478: $allowed=0;
479: $script='</script>'.&Apache::lonxml::registerurl(1,undef).'<script>';
480: $events='onLoad="'.&Apache::lonxml::loadevents.
481: '" onUnload="'.&Apache::lonxml::unloadevents.'"';
482: }
483:
484: # get course data
485: my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
486: my $coursedom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
487:
488: # get personal data
489:
490: my $uname=$ENV{'user.name'};
491: my $udom=$ENV{'user.domain'};
492: my $plainname=&Apache::lonnet::escape(
493: &Apache::loncommon::plainname($uname,$udom));
494:
495: # graphics settings
496:
497: $iconpath = $r->dir_config('lonIconsURL') . "/";
498:
499: my $now=time;
500:
501: # print screen
502: $r->print(<<ENDDOCUMENT);
503: <html>
504: <head>
505: <title>The LearningOnline Network with CAPA</title>
506: <script>
507: $script
508: </script>
509: ENDDOCUMENT
510: if ($allowed) {
511: $r->print(<<ENDNEWSCRIPT);
512: <script>
513: function makenewfolder(targetform,folderseq) {
514: var foldername=prompt('Name of New Folder','New Folder');
515: if (foldername) {
516: targetform.importdetail.value=foldername+"="+folderseq;
517: targetform.submit();
518: }
519: }
520:
521: function makenewext(targetname) {
522: this.document.forms.extimport.useform.value=targetname;
523: window.open('/adm/rat/extpickframe.html');
524: }
525:
526: function makesmppage() {
527: var title=prompt('Listed Title for the Page');
528: if (title) {
529: this.document.forms.newsmppg.importdetail.value=
530: title+'=/adm/$udom/$uname/$now/smppg';
531: this.document.forms.newsmppg.submit();
532: }
533: }
534:
535: function makebulboard() {
536: var title=prompt('Listed Title for the Bulletin Board');
537: if (title) {
538: this.document.forms.newbul.importdetail.value=
539: title+'=/adm/$udom/$uname/$now/bulletinboard';
540: this.document.forms.newbul.submit();
541: }
542: }
543:
544: function finishpick() {
545: var title=this.document.forms.extimport.title.value;
546: var url=this.document.forms.extimport.url.value;
547: var form=this.document.forms.extimport.useform.value;
548: eval
549: ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
550: '";this.document.forms.'+form+'.submit();');
551: }
552:
553: function changename(folder,index,oldtitle) {
554: var title=prompt('New Title',oldtitle);
555: if (title) {
556: this.document.forms.renameform.title.value=title;
557: this.document.forms.renameform.cmd.value='rename_'+index;
558: this.document.forms.renameform.folder.value=folder;
559: this.document.forms.renameform.submit();
560: }
561: }
562: </script>
563:
564: ENDNEWSCRIPT
565: }
566: # -------------------------------------------------------------------- Body tag
567: $r->print('</head>'.
568: &Apache::loncommon::bodytag('Course Documents','',$events));
569: unless ($showdoc) {
570: if ($allowed) {
571: $r->print(<<ENDCOURSEVERIFY);
572: <form name="renameform" method="post" action="/adm/coursedocs">
573: <input type="hidden" name="title" />
574: <input type="hidden" name="cmd" />
575: <input type="hidden" name="folder" />
576: </form>
577: <form name="simpleedit" method="post" action="/adm/coursedocs">
578: <input type=hidden name="importdetail" value="">
579: <input type="hidden" name="folder" />
580: </form>
581: <form action="/adm/coursedocs" method="post" name="courseverify">
582: <input type="submit" name="verify" value="Verify Content" />
583: <input type="submit" name="versions" value="Check Resource Versions" />
584: </form>
585: ENDCOURSEVERIFY
586: }
587: # --------------------------------------------------------- Standard documents
588: $r->print('<table border=2 cellspacing=4 cellpadding=4>');
589: if (($standard) && ($allowed) && (!$forcesupplement)) {
590: $r->print('<tr><td bgcolor="#BBBBBB"><h2>Main Course Documents</h2>');
591: my $folder=$ENV{'form.folder'};
592: unless ($folder=~/^default/) { $folder='default'; }
593: $hadchanges=0;
594: &editor($r,$coursenum,$coursedom,$folder,$allowed);
595: if ($hadchanges) {
596: $r->print('<h3><font color="red">Changes will become active after <a href="/adm/roles">re-initializing course</a> or at next login.</font></h3>');
597: }
598: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
599: '.sequence';
600: $r->print(<<ENDFORM);
601: <table cellspacing=4 cellpadding=4><tr>
602: <th bgcolor="#DDDDDD">Upload a new main course document</th>
603: <th bgcolor="#DDDDDD">Import a published document</th>
604: <th bgcolor="#DDDDDD">Special documents</th>
605: </tr>
606: <tr><td bgcolor="#DDDDDD">
607: File:<br />
608: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
609: <input type="file" name="uploaddoc" size="50">
610: <br />
611: Title:<br />
612: <input type="text" size="50" name="comment">
613: <input type="hidden" name="folder" value="$folder">
614: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
615: <input type="hidden" name="cmd" value="upload_default">
616: <input type="submit" value="Upload Document">
617: </form>
618: </td>
619: <td bgcolor="#DDDDDD">
620: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
621: <input type=button onClick=
622: "javascript:document.forms.simpleedit.folder.value='$folder';groupsearch()" value="Search">
623: <input type=button onClick=
624: "javascript:document.forms.simpleedit.folder.value='$folder';groupimport();" value="Import">
625: </form>
626: </td><td bgcolor="#DDDDDD">
627: <form action="/adm/coursedocs" method="post" name="newfolder">
628: <input type="hidden" name="folder" value="$folder">
629: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
630: <input type=hidden name="importdetail" value="">
631: <input name="newfolder" type="button"
632: onClick="javascript:makenewfolder(this.form,'$folderseq');"
633: value="New Folder" />
634: </form>
635: <form action="/adm/coursedocs" method="post" name="newext">
636: <input type="hidden" name="folder" value="$folder">
637: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
638: <input type=hidden name="importdetail" value="">
639: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
640: value="External Resource" />
641: </form>
642: <form action="/adm/coursedocs" method="post" name="newsyl">
643: <input type="hidden" name="folder" value="$folder">
644: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
645: <input type=hidden name="importdetail"
646: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
647: <input name="newsyl" type="submit" value="Syllabus" />
648: </form>
649: <form action="/adm/coursedocs" method="post" name="newnav">
650: <input type="hidden" name="folder" value="$folder">
651: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
652: <input type=hidden name="importdetail"
653: value="Navigate Content=/adm/navmaps">
654: <input name="newnav" type="submit" value="Navigate Content" />
655: </form>
656: <form action="/adm/coursedocs" method="post" name="newsmppg">
657: <input type="hidden" name="folder" value="$folder">
658: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
659: <input type=hidden name="importdetail" value="">
660: <input name="newsmppg" type="button" value="Simple Page"
661: onClick="javascript:makesmppage();" />
662: </form>
663: <form action="/adm/coursedocs" method="post" name="newbul">
664: <input type="hidden" name="folder" value="$folder">
665: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
666: <input type=hidden name="importdetail" value="">
667: <input name="newbulletin" type="button" value="Bulletin Board"
668: onClick="javascript:makebulboard();" />
669: </form>
670: <form action="/adm/coursedocs" method="post" name="newaboutme">
671: <input type="hidden" name="folder" value="$folder">
672: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
673: <input type=hidden name="importdetail"
674: value="$plainname=/adm/$udom/$uname/aboutme">
675: <input name="newaboutme" type="submit" value="My Personal Info" />
676: </form>
677: </td></tr>
678: </table>
679: ENDFORM
680: $r->print('</td></tr>');
681: }
682: # ----------------------------------------------------- Supplemental documents
683: if (!$forcestandard) {
684: $r->print(
685: '<tr><td bgcolor="#BBBBBB"><h2>Supplemental Course Documents</h2>');
686: my $folder=$ENV{'form.folder'};
687: unless ($folder=~/supplemental/) { $folder='supplemental'; }
688: &editor($r,$coursenum,$coursedom,$folder,$allowed);
689: if ($allowed) {
690: my $folderseq=
691: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
692: '.sequence';
693:
694: $r->print(<<ENDSUPFORM);
695: <table cellspacing=4 cellpadding=4><tr>
696: <th bgcolor="#DDDDDD">Upload a new supplemental course document</th>
697: <th bgcolor="#DDDDDD">Import a published document</th>
698: <th bgcolor="#DDDDDD">Special documents</th>
699: </tr>
700: <tr><td bgcolor="#DDDDDD">
701: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
702: <input type="file" name="uploaddoc" size="50">
703: <br />Comment:<br />
704: <textarea cols=50 rows=4 name='comment'>
705: </textarea>
706: <input type="hidden" name="folder" value="$folder">
707: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
708: <input type="hidden" name="cmd" value="upload_supplemental">
709: <input type="submit" value="Upload Document">
710: </form>
711: </td>
712: <td bgcolor="#DDDDDD">
713: <form action="/adm/coursedocs" method="post" name="simpleeditsupplement">
714: <input type=hidden name="importdetail" value="">
715: <input type=button onClick=
716: "javascript:document.forms.simpleedit.folder.value='$folder';groupsearch()" value="Search">
717: <input type=button onClick=
718: "javascript:document.forms.simpleedit.folder.value='$folder';groupimport();" value="Import">
719: </form>
720: </td><td bgcolor="#DDDDDD">
721: <form action="/adm/coursedocs" method="post" name="supnewfolder">
722: <input type="hidden" name="folder" value="$folder">
723: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
724: <input type=hidden name="importdetail" value="">
725: <input name="newfolder" type="button"
726: onClick="javascript:makenewfolder(this.form,'$folderseq');"
727: value="New Folder" />
728: </form>
729: <form action="/adm/coursedocs" method="post" name="supnewext">
730: <input type="hidden" name="folder" value="$folder">
731: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
732: <input type=hidden name="importdetail" value="">
733: <input name="newext" type="button"
734: onClick="javascript:makenewext('supnewext');"
735: value="External Resource" />
736: </form>
737: <form action="/adm/coursedocs" method="post" name="supnewsyl">
738: <input type="hidden" name="folder" value="$folder">
739: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
740: <input type=hidden name="importdetail"
741: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
742: <input name="newsyl" type="submit" value="Syllabus" />
743: </form>
744: <form action="/adm/coursedocs" method="post" name="subnewaboutme">
745: <input type="hidden" name="folder" value="$folder">
746: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
747: <input type=hidden name="importdetail"
748: value="$plainname=/adm/$udom/$uname/aboutme">
749: <input name="newaboutme" type="submit" value="My Personal Info" />
750: </form>
751: </td></tr>
752: </table></td></tr>
753: ENDSUPFORM
754: }
755: }
756: if ($allowed) {
757: $r->print('<form name="extimport"><input type="hidden" name="title"><input type="hidden" name="url"><input type="hidden" name="useform"></form>');
758: }
759: $r->print('</table>');
760: } else {
761: # -------------------------------------------------------- This is showdoc mode
762: $r->print("<h1>Uploaded Document</h1><p>It is recommended that you use an up-to-date virus scanner before handling this file.</p><p><table>".
763: &entryline(0,"Click to download or use your browser's Save Link function",$showdoc).'</table></p>');
764: }
765: }
766: $r->print('</body></html>');
767: return OK;
768: }
769:
770: 1;
771: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>