1: # The LearningOnline Network
2: # Documents
3: #
4: # $Id: londocs.pm,v 1.46 2003/01/23 19:00:06 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: $name=~s/\:/\:/g;
170: $Apache::lonratedt::resources[$idx]=
171: $name.':'.$url.':'.$ext.':normal:res';
172: }
173: }
174: }
175: # Store the changed version
176: &storemap($coursenum,$coursedom,$folder.'.sequence');
177: }
178: }
179: # ---------------------------------------------------------------- End commands
180: # ---------------------------------------------------------------- Print screen
181: my $idx=0;
182: $r->print('<table>');
183: foreach (@Apache::lonratedt::order) {
184: my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);
185: unless ($name) { $name=(split(/\//,$url))[-1]; }
186: unless ($name) { $name='NO RESOURCE'; $url='/adm/notfound.html'; }
187: $r->print(&entryline($idx,$name,$url,$folder,$allowed));
188: $idx++;
189: }
190: $r->print('</table>');
191: }
192: }
193:
194: # --------------------------------------------------------------- An entry line
195:
196: sub entryline {
197: my ($index,$title,$url,$folder,$allowed)=@_;
198: $title=~s/\&colon\;/\:/g;
199: $title=&HTML::Entities::encode(&HTML::Entities::decode(
200: &Apache::lonnet::unescape($title)),'\"\<\>\&\'');
201: my $renametitle=$title;
202: my $foldertitle=$title;
203: if ($title=~
204: /^(\d+)\_\_\_\&\;\&\;\&\;\_\_\_(\w+)\_\_\_\&\;\&\;\&\;\_\_\_(\w+)\_\_\_\&\;\&\;\&\;\_\_\_(.*)$/
205: ) {
206: $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
207: $renametitle=$4;
208: $title='<i>'.localtime($1).'</i> '.
209: &Apache::loncommon::plainname($2,$3).': <br>'.
210: $foldertitle;
211: }
212: $renametitle=~s/\"\;/\\\"/g;
213: my $line='<tr>';
214: # Edit commands
215: if ($allowed) {
216: $line.=(<<END);
217: <td><table border='0' cellspacing='0' cellpadding='0'>
218: <tr><td><a href='/adm/coursedocs?folder=$folder&cmd=up_$index'>
219: <img src="${iconpath}move_up.gif" alt='UP' border='0' /></a></td></tr>
220: <tr><td><a href='/adm/coursedocs?folder=$folder&cmd=down_$index'>
221: <img src="${iconpath}move_down.gif" alt='DOWN' border='0' /></a></td></tr>
222: </table></td><td>
223: <a href='/adm/coursedocs?folder=$folder&cmd=del_$index'>
224: <font size="-2">Remove</font></a>
225: <a href='javascript:changename("$folder","$index","$renametitle");'>
226: <font size="-2">Rename</font></a></td>
227: END
228: }
229: # Figure out what kind of a resource this is
230: my ($extension)=($url=~/\.(\w+)$/);
231: my $uploaded=($url=~/^\/*uploaded\//);
232: my $icon='unknown';
233: if (-e "/home/httpd/html/adm/lonIcons/$extension.gif") {
234: $icon=$extension;
235: }
236: my $isfolder=0;
237: if ($uploaded) {
238: if ($extension eq 'sequence') {
239: $icon='folder_closed';
240: $url=~/\/(\w+)\.sequence/;
241: $url='/adm/coursedocs?folder='.$1;
242: $isfolder=1;
243: } else {
244: $url=&Apache::lonnet::tokenwrapper($url);
245: }
246: }
247: $url=~s/^http\&colon\;\/\//\/adm\/wrapper\/ext\//;
248: if ($isfolder) { $url.='&foldername='.$foldertitle; }
249: $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'" target="cat_'.$folder.
250: '"><img src="/adm/lonIcons/'.
251: $icon.'.gif" border="0"></a></td>'.
252: "<td bgcolor='#FFFFBB'><a href='$url' target='cat_$folder'>$title</a></td></tr>";
253: return $line;
254: }
255:
256: # ---------------------------------------------------------------- tie the hash
257:
258: sub tiehash {
259: $hashtied=0;
260: if ($ENV{'request.course.fn'}) {
261: if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db",
262: &GDBM_READER(),0640)) {
263: $hashtied=1;
264: }
265: }
266: }
267:
268: sub untiehash {
269: if ($hashtied) { untie %hash; }
270: $hashtied=0;
271: }
272:
273: # --------------------------------------------------------------- check on this
274:
275: sub checkonthis {
276: my ($r,$url,$level,$title)=@_;
277: $alreadyseen{$url}=1;
278: $r->rflush();
279: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
280: $r->print('<br />');
281: for (my $i=0;$i<=$level*5;$i++) {
282: $r->print(' ');
283: }
284: $r->print('<a href="'.$url.'" target="cat">'.
285: ($title?$title:$url).'</a> ');
286: if ($url=~/^\/res\//) {
287: my $result=&Apache::lonnet::repcopy(
288: &Apache::lonnet::filelocation('',$url));
289: if ($result==OK) {
290: $r->print('<font color="green">ok</font>');
291: $r->rflush();
292: &Apache::lonnet::countacc($url);
293: $url=~/\.(\w+)$/;
294: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
295: $r->print('<br />');
296: $r->rflush();
297: for (my $i=0;$i<=$level*5;$i++) {
298: $r->print(' ');
299: }
300: $r->print('- Rendering: ');
301: &Apache::lonxml::xmlparse($r,'web',
302: &Apache::lonnet::getfile(
303: &Apache::lonnet::filelocation('',$url)));
304: if (($Apache::lonxml::errorcount) ||
305: ($Apache::lonxml::warningcount)) {
306: if ($Apache::lonxml::errorcount) {
307: $r->print('<font color="red"><b>'.
308: $Apache::lonxml::errorcount.' error(s)</b></font> ');
309: }
310: if ($Apache::lonxml::warningcount) {
311: $r->print('<font color="blue">'.
312: $Apache::lonxml::warningcount.' warning(s)</font>');
313: }
314: } else {
315: $r->print('<font color="green">ok</font>');
316: }
317: $r->rflush();
318: }
319: my $dependencies=
320: &Apache::lonnet::metadata($url,'dependencies');
321: foreach (split(/\,/,$dependencies)) {
322: if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
323: &checkonthis($r,$_,$level+1);
324: }
325: }
326: } elsif ($result==HTTP_SERVICE_UNAVAILABLE) {
327: $r->print('<font color="red"><b>connection down</b></font>');
328: } elsif ($result==HTTP_NOT_FOUND) {
329: $r->print('<font color="red"><b>not found</b></font>');
330: } else {
331: $r->print('<font color="red"><b>access denied</b></font>');
332: }
333: }
334: }
335: }
336:
337: # ================================================================ Main Handler
338: sub handler {
339: my $r = shift;
340: $r->content_type('text/html');
341: $r->send_http_header;
342: return OK if $r->header_only;
343:
344:
345: if ($ENV{'form.verify'}) {
346:
347: my $loaderror=&Apache::lonnet::overloaderror($r);
348: if ($loaderror) { return $loaderror; }
349:
350: $r->print('<html><head><title>Verify Content</title></head>'.
351: &Apache::loncommon::bodytag('Verify Course Documents'));
352: $hashtied=0;
353: undef %alreadyseen;
354: %alreadyseen=();
355: &tiehash();
356: foreach (keys %hash) {
357: if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) {
358: &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
359: }
360: }
361: &untiehash();
362: } elsif ($ENV{'form.versions'}) {
363: $r->print('<html><head><title>Check Versions</title></head>'.
364: &Apache::loncommon::bodytag('Check Course Document Versions'));
365: $hashtied=0;
366: &tiehash();
367: my %changes=&Apache::lonnet::dump
368: ('versionupdate',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
369: $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
370: my $firstkey=(keys %changes)[0];
371: unless ($firstkey=~/^error\:/) {
372: unless ($ENV{'form.timerange'}) {
373: $ENV{'form.timerange'}=604800;
374: }
375: my $seltext='during the last '.$ENV{'form.timerange'}.' seconds';
376: my $startsel='';
377: my $monthsel='';
378: my $weeksel='';
379: my $daysel='';
380: if ($ENV{'form.timerange'}==-1) {
381: $seltext='since start of course';
382: $startsel='selected';
383: $ENV{'form.timerange'}=time;
384: }
385: my $starttime=time-$ENV{'form.timerange'};
386: if ($ENV{'form.timerange'}==2592000) {
387: $seltext='during the last month ('.localtime($starttime).')';
388: $monthsel='selected';
389: } elsif ($ENV{'form.timerange'}==604800) {
390: $seltext='during the last week ('.localtime($starttime).')';
391: $weeksel='selected';
392: } elsif ($ENV{'form.timerange'}==86400) {
393: $seltext='since yesterday ('.localtime($starttime).')';
394: $daysel='selected';
395: }
396:
397: $r->print(<<ENDHEADERS);
398: <form action="/adm/coursedocs" method="post">
399: <select name="timerange">
400: <option value="-1" $startsel>Since Start of Course</option>
401: <option value="2592000" $monthsel>Last Month</option>
402: <option value="604800" $weeksel>Last Week</option>
403: <option value="86400" $daysel>Since Yesterday</option>
404: </select>
405: <input type="submit" name="versions" value="Display" />
406: </form>
407: <h3>Content changed $seltext</h3>
408: <table border="2">
409: <tr>
410: <th>File</th><th>Modification Date</th>
411: <th>Version</th><th>Differences</th></tr>
412: ENDHEADERS
413: foreach (keys %changes) {
414: if ($changes{$_}>$starttime) {
415: my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
416: my $currentversion=&Apache::lonnet::getversion($_);
417: my $linkurl=&Apache::lonnet::clutter($_);
418: $r->print(
419: '<tr><td><a href="'.$linkurl.'" target="cat">'.$linkurl.
420: '</a></td><td>'.
421: localtime($changes{$_}).'</td><td>'.$currentversion.'</td>'.
422: '<td>');
423: my $lastold=1;
424: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
425: my $url=$root.'.'.$prevvers.'.'.$extension;
426: if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
427: $starttime) {
428: $lastold=$prevvers;
429: }
430: }
431: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
432: my $url=$root.'.'.$prevvers.'.'.$extension;
433: $r->print('<a href="'.&Apache::lonnet::clutter($url).
434: '">Version '.$prevvers.' ('.
435: localtime(&Apache::lonnet::metadata($url,'lastrevisiondate')).
436: ')</a>');
437: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
438: $r->print(' <a href="/adm/diff?filename='.
439: &Apache::lonnet::clutter($root.'.'.$extension).
440: '&versionone='.$prevvers.
441: '">Diffs</a>');
442: }
443: $r->print('<br />');
444: }
445: $r->print('</td></tr>');
446: }
447: }
448: $r->print('</table>');
449: } else {
450: $r->print('<p>No content modifications yet.</p>');
451: }
452: &untiehash();
453: } else {
454: # is this a standard course?
455:
456: my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//);
457: my $forcestandard;
458: my $forcesupplement;
459: my $script='';
460: my $allowed;
461: my $events='';
462: my $showdoc=0;
463: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
464: ['folder','foldername']);
465: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
466: $showdoc=$1;
467: }
468: unless ($showdoc) { # got called from remote
469: $forcestandard=($ENV{'form.folder'}=~/^default_/);
470: $forcesupplement=($ENV{'form.folder'}=~/^supplemental_/);
471:
472: # does this user have privileges to post, etc?
473: $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'});
474: if ($allowed) {
475: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
476: $script=&Apache::lonratedt::editscript('simple');
477: }
478: } else { # got called in sequence from course
479: $allowed=0;
480: $script='</script>'.&Apache::lonxml::registerurl(1,undef).'<script>';
481: $events='onLoad="'.&Apache::lonxml::loadevents.
482: '" onUnload="'.&Apache::lonxml::unloadevents.'"';
483: }
484:
485: # get course data
486: my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
487: my $coursedom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
488:
489: # get personal data
490:
491: my $uname=$ENV{'user.name'};
492: my $udom=$ENV{'user.domain'};
493: my $plainname=&Apache::lonnet::escape(
494: &Apache::loncommon::plainname($uname,$udom));
495:
496: # graphics settings
497:
498: $iconpath = $r->dir_config('lonIconsURL') . "/";
499:
500: my $now=time;
501:
502: # print screen
503: $r->print(<<ENDDOCUMENT);
504: <html>
505: <head>
506: <title>The LearningOnline Network with CAPA</title>
507: <script>
508: $script
509: </script>
510: ENDDOCUMENT
511: if ($allowed) {
512: $r->print(<<ENDNEWSCRIPT);
513: <script>
514: function makenewfolder(targetform,folderseq) {
515: var foldername=prompt('Name of New Folder','New Folder');
516: if (foldername) {
517: targetform.importdetail.value=foldername+"="+folderseq;
518: targetform.submit();
519: }
520: }
521:
522: function makenewext(targetname) {
523: this.document.forms.extimport.useform.value=targetname;
524: window.open('/adm/rat/extpickframe.html');
525: }
526:
527: function makesmppage() {
528: var title=prompt('Listed Title for the Page');
529: if (title) {
530: this.document.forms.newsmppg.importdetail.value=
531: title+'=/adm/$udom/$uname/$now/smppg';
532: this.document.forms.newsmppg.submit();
533: }
534: }
535:
536: function makebulboard() {
537: var title=prompt('Listed Title for the Bulletin Board');
538: if (title) {
539: this.document.forms.newbul.importdetail.value=
540: title+'=/adm/$udom/$uname/$now/bulletinboard';
541: this.document.forms.newbul.submit();
542: }
543: }
544:
545: function finishpick() {
546: var title=this.document.forms.extimport.title.value;
547: var url=this.document.forms.extimport.url.value;
548: var form=this.document.forms.extimport.useform.value;
549: eval
550: ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
551: '";this.document.forms.'+form+'.submit();');
552: }
553:
554: function changename(folder,index,oldtitle) {
555: var title=prompt('New Title',oldtitle);
556: if (title) {
557: this.document.forms.renameform.title.value=title;
558: this.document.forms.renameform.cmd.value='rename_'+index;
559: this.document.forms.renameform.folder.value=folder;
560: this.document.forms.renameform.submit();
561: }
562: }
563: </script>
564:
565: ENDNEWSCRIPT
566: }
567: # -------------------------------------------------------------------- Body tag
568: $r->print('</head>'.
569: &Apache::loncommon::bodytag('Course Documents','',$events));
570: unless ($showdoc) {
571: if ($allowed) {
572: $r->print(<<ENDCOURSEVERIFY);
573: <form name="renameform" method="post" action="/adm/coursedocs">
574: <input type="hidden" name="title" />
575: <input type="hidden" name="cmd" />
576: <input type="hidden" name="folder" />
577: </form>
578: <form name="simpleedit" method="post" action="/adm/coursedocs">
579: <input type=hidden name="importdetail" value="">
580: <input type="hidden" name="folder" />
581: </form>
582: <form action="/adm/coursedocs" method="post" name="courseverify">
583: <input type="submit" name="verify" value="Verify Content" />
584: <input type="submit" name="versions" value="Check Resource Versions" />
585: </form>
586: ENDCOURSEVERIFY
587: }
588: # --------------------------------------------------------- Standard documents
589: $r->print('<table border=2 cellspacing=4 cellpadding=4>');
590: if (($standard) && ($allowed) && (!$forcesupplement)) {
591: $r->print('<tr><td bgcolor="#BBBBBB"><h2>Main Course Documents</h2>');
592: my $folder=$ENV{'form.folder'};
593: unless ($folder=~/^default/) { $folder='default'; }
594: $hadchanges=0;
595: &editor($r,$coursenum,$coursedom,$folder,$allowed);
596: if ($hadchanges) {
597: $r->print('<form method="post" action="/adm/roles">'.
598: '<input type=hidden name=orgurl value="/adm/coursedocs" /><input type=hidden name=selectrole value=1 /><h3><font color="red">Changes will become active for your current session after <input type="submit" name="'.
599: $ENV{'request.role'}.'" value="re-initializing course" />, or the next time you log in.</font></h3></form>');
600: }
601: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
602: '.sequence';
603: $r->print(<<ENDFORM);
604: <table cellspacing=4 cellpadding=4><tr>
605: <th bgcolor="#DDDDDD">Upload a new main course document</th>
606: <th bgcolor="#DDDDDD">Import a published document</th>
607: <th bgcolor="#DDDDDD">Special documents</th>
608: </tr>
609: <tr><td bgcolor="#DDDDDD">
610: File:<br />
611: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
612: <input type="file" name="uploaddoc" size="50">
613: <br />
614: Title:<br />
615: <input type="text" size="50" name="comment">
616: <input type="hidden" name="folder" value="$folder">
617: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
618: <input type="hidden" name="cmd" value="upload_default">
619: <input type="submit" value="Upload Document">
620: </form>
621: </td>
622: <td bgcolor="#DDDDDD">
623: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
624: <input type=button onClick=
625: "javascript:document.forms.simpleedit.folder.value='$folder';groupsearch()" value="Search">
626: <input type=button onClick=
627: "javascript:document.forms.simpleedit.folder.value='$folder';groupimport();" value="Import">
628: </form>
629: </td><td bgcolor="#DDDDDD">
630: <form action="/adm/coursedocs" method="post" name="newfolder">
631: <input type="hidden" name="folder" value="$folder">
632: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
633: <input type=hidden name="importdetail" value="">
634: <input name="newfolder" type="button"
635: onClick="javascript:makenewfolder(this.form,'$folderseq');"
636: value="New Folder" />
637: </form>
638: <form action="/adm/coursedocs" method="post" name="newext">
639: <input type="hidden" name="folder" value="$folder">
640: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
641: <input type=hidden name="importdetail" value="">
642: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
643: value="External Resource" />
644: </form>
645: <form action="/adm/coursedocs" method="post" name="newsyl">
646: <input type="hidden" name="folder" value="$folder">
647: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
648: <input type=hidden name="importdetail"
649: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
650: <input name="newsyl" type="submit" value="Syllabus" />
651: </form>
652: <form action="/adm/coursedocs" method="post" name="newnav">
653: <input type="hidden" name="folder" value="$folder">
654: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
655: <input type=hidden name="importdetail"
656: value="Navigate Content=/adm/navmaps">
657: <input name="newnav" type="submit" value="Navigate Content" />
658: </form>
659: <form action="/adm/coursedocs" method="post" name="newsmppg">
660: <input type="hidden" name="folder" value="$folder">
661: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
662: <input type=hidden name="importdetail" value="">
663: <input name="newsmppg" type="button" value="Simple Page"
664: onClick="javascript:makesmppage();" />
665: </form>
666: <form action="/adm/coursedocs" method="post" name="newbul">
667: <input type="hidden" name="folder" value="$folder">
668: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
669: <input type=hidden name="importdetail" value="">
670: <input name="newbulletin" type="button" value="Bulletin Board"
671: onClick="javascript:makebulboard();" />
672: </form>
673: <form action="/adm/coursedocs" method="post" name="newaboutme">
674: <input type="hidden" name="folder" value="$folder">
675: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
676: <input type=hidden name="importdetail"
677: value="$plainname=/adm/$udom/$uname/aboutme">
678: <input name="newaboutme" type="submit" value="My Personal Info" />
679: </form>
680: </td></tr>
681: </table>
682: ENDFORM
683: $r->print('</td></tr>');
684: }
685: # ----------------------------------------------------- Supplemental documents
686: if (!$forcestandard) {
687: $r->print(
688: '<tr><td bgcolor="#BBBBBB"><h2>Supplemental Course Documents</h2>');
689: my $folder=$ENV{'form.folder'};
690: unless ($folder=~/supplemental/) { $folder='supplemental'; }
691: &editor($r,$coursenum,$coursedom,$folder,$allowed);
692: if ($allowed) {
693: my $folderseq=
694: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
695: '.sequence';
696:
697: $r->print(<<ENDSUPFORM);
698: <table cellspacing=4 cellpadding=4><tr>
699: <th bgcolor="#DDDDDD">Upload a new supplemental course document</th>
700: <th bgcolor="#DDDDDD">Import a published document</th>
701: <th bgcolor="#DDDDDD">Special documents</th>
702: </tr>
703: <tr><td bgcolor="#DDDDDD">
704: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
705: <input type="file" name="uploaddoc" size="50">
706: <br />Comment:<br />
707: <textarea cols=50 rows=4 name='comment'>
708: </textarea>
709: <input type="hidden" name="folder" value="$folder">
710: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
711: <input type="hidden" name="cmd" value="upload_supplemental">
712: <input type="submit" value="Upload Document">
713: </form>
714: </td>
715: <td bgcolor="#DDDDDD">
716: <form action="/adm/coursedocs" method="post" name="simpleeditsupplement">
717: <input type=hidden name="importdetail" value="">
718: <input type=button onClick=
719: "javascript:document.forms.simpleedit.folder.value='$folder';groupsearch()" value="Search">
720: <input type=button onClick=
721: "javascript:document.forms.simpleedit.folder.value='$folder';groupimport();" value="Import">
722: </form>
723: </td><td bgcolor="#DDDDDD">
724: <form action="/adm/coursedocs" method="post" name="supnewfolder">
725: <input type="hidden" name="folder" value="$folder">
726: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
727: <input type=hidden name="importdetail" value="">
728: <input name="newfolder" type="button"
729: onClick="javascript:makenewfolder(this.form,'$folderseq');"
730: value="New Folder" />
731: </form>
732: <form action="/adm/coursedocs" method="post" name="supnewext">
733: <input type="hidden" name="folder" value="$folder">
734: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
735: <input type=hidden name="importdetail" value="">
736: <input name="newext" type="button"
737: onClick="javascript:makenewext('supnewext');"
738: value="External Resource" />
739: </form>
740: <form action="/adm/coursedocs" method="post" name="supnewsyl">
741: <input type="hidden" name="folder" value="$folder">
742: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
743: <input type=hidden name="importdetail"
744: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
745: <input name="newsyl" type="submit" value="Syllabus" />
746: </form>
747: <form action="/adm/coursedocs" method="post" name="subnewaboutme">
748: <input type="hidden" name="folder" value="$folder">
749: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}">
750: <input type=hidden name="importdetail"
751: value="$plainname=/adm/$udom/$uname/aboutme">
752: <input name="newaboutme" type="submit" value="My Personal Info" />
753: </form>
754: </td></tr>
755: </table></td></tr>
756: ENDSUPFORM
757: }
758: }
759: if ($allowed) {
760: $r->print('<form name="extimport"><input type="hidden" name="title"><input type="hidden" name="url"><input type="hidden" name="useform"></form>');
761: }
762: $r->print('</table>');
763: } else {
764: # -------------------------------------------------------- This is showdoc mode
765: $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>".
766: &entryline(0,"Click to download or use your browser's Save Link function",$showdoc).'</table></p>');
767: }
768: }
769: $r->print('</body></html>');
770: return OK;
771: }
772:
773: 1;
774: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>